/// <summary> /// Modificar un log de solicitud. En el cuerpo del mensaje se envía en el formato adecuado el objeto con los datos modificados /// </summary> /// <param name="id"> Identificador único del log </param> /// <param name="solog">Log de solicitud con los valores que se desean en sus atributos</param> /// <param name="tk"> Tique de autorización (Ver 'Login')</param> /// <returns></returns> public virtual SolicitudLog Put(int id, SolicitudLog solog, string tk) { using (PortalProContext ctx = new PortalProContext()) { // comprobar el tique if (!CntWebApiSeguridad.CheckTicket(tk, ctx)) { throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "Se necesita tique de autorización (SolicitudLogs)")); } // comprobar los formatos if (solog == null || id != solog.SolicitudLogId) { throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest)); } // primero buscamos si un solog con ese id existe SolicitudLog slg = (from u in ctx.SolicitudLogs where u.SolicitudLogId == id select u).FirstOrDefault<SolicitudLog>(); // existe? if (slg == null) { throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotFound, "No hay un solog con el id proporcionado (SolicitudLogs)")); } // int usuarioId = 0; int solicitudProveedorId = 0; int solStatusFinId = 0; int solStatusInicioId = 0; // Controlamos las propiedades que son en realidad objetos. if (solog.Usuario != null) { usuarioId = solog.Usuario.UsuarioId; solog.Usuario = null; } if (solog.SolicitudProveedor != null) { solicitudProveedorId = solog.SolicitudProveedor.SolicitudProveedorId; solog.SolicitudProveedor = null; } if (solog.SolicitudStatusInicial != null) { solStatusInicioId = solog.SolicitudStatusInicial.SolicitudStatusId; solog.SolicitudStatusInicial = null; } if (solog.SolicitudStatusFinal != null) { solStatusFinId = solog.SolicitudStatusFinal.SolicitudStatusId; solog.SolicitudStatusFinal = null; } // modificar el objeto ctx.AttachCopy<SolicitudLog>(solog); // volvemos a leer el objecto para que lo maneje este contexto. solog = (from s in ctx.SolicitudLogs where s.SolicitudLogId == id select s).FirstOrDefault<SolicitudLog>(); if (usuarioId != 0) { solog.Usuario = (from u in ctx.Usuarios where u.UsuarioId == usuarioId select u).FirstOrDefault<Usuario>(); } if (solicitudProveedorId != 0) { solog.SolicitudProveedor = (from s in ctx.SolicitudProveedors select s).FirstOrDefault<SolicitudProveedor>(); } if (solStatusInicioId != 0) { solog.SolicitudStatusInicial = (from s in ctx.SolicitudStatus select s).FirstOrDefault<SolicitudStatus>(); } if (solStatusFinId != 0) { solog.SolicitudStatusFinal = (from s in ctx.SolicitudStatus select s).FirstOrDefault<SolicitudStatus>(); } ctx.SaveChanges(); return ctx.CreateDetachedCopy<SolicitudLog>(solog, x => x.Usuario, x => x.SolicitudProveedor, x => x.SolicitudStatusInicial, x => x.SolicitudStatusFinal); } }
/// <summary> /// Crear un nuevo solog /// </summary> /// <param name="SolicitudLog">Objeto a crear, el atributo SolicitudLogId lo genera la aplicación y es devuelto en el objeto incluido en la respuesta.</param> /// <param name="tk"> Tique de autorzación (se debe obtener con la accion Login)</param> /// <returns></returns> public virtual SolicitudLog Post(SolicitudLog solog, string tk) { using (PortalProContext ctx = new PortalProContext()) { // comprobar el tique if (!CntWebApiSeguridad.CheckTicket(tk, ctx)) { throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "Se necesita tique de autorización (SolicitudLogs)")); } // comprobar las precondiciones if (solog == null) { throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest)); } int usuarioId = 0; int solicitudProveedorId = 0; int solStatusFinId = 0; int solStatusInicioId = 0; // Controlamos las propiedades que son en realidad objetos. if (solog.Usuario != null) { usuarioId = solog.Usuario.UsuarioId; solog.Usuario = null; } if (solog.SolicitudProveedor != null) { solicitudProveedorId = solog.SolicitudProveedor.SolicitudProveedorId; solog.SolicitudProveedor = null; } if (solog.SolicitudStatusInicial != null) { solStatusInicioId = solog.SolicitudStatusInicial.SolicitudStatusId; solog.SolicitudStatusInicial = null; } if (solog.SolicitudStatusFinal != null) { solStatusFinId = solog.SolicitudStatusFinal.SolicitudStatusId; solog.SolicitudStatusFinal = null; } // dar de alta el objeto en la base de datos y devolverlo en el mensaje ctx.Add(solog); if (usuarioId != 0) { solog.Usuario = (from u in ctx.Usuarios where u.UsuarioId == usuarioId select u).FirstOrDefault<Usuario>(); } if (solicitudProveedorId != 0) { solog.SolicitudProveedor = (from s in ctx.SolicitudProveedors select s).FirstOrDefault<SolicitudProveedor>(); } if (solStatusInicioId != 0) { solog.SolicitudStatusInicial = (from s in ctx.SolicitudStatus select s).FirstOrDefault<SolicitudStatus>(); } if (solStatusFinId != 0) { solog.SolicitudStatusFinal = (from s in ctx.SolicitudStatus select s).FirstOrDefault<SolicitudStatus>(); } ctx.SaveChanges(); return ctx.CreateDetachedCopy<SolicitudLog>(solog, x => x.Usuario, x => x.SolicitudProveedor, x => x.SolicitudStatusInicial, x => x.SolicitudStatusFinal); } }
/// <summary> /// Cambia el estado de una solicitud y realiza la grabación /// correspondiente en el log /// </summary> /// <param name="id">Identificador de la solicitud a procesar</param> /// <param name="tk">Tique de autorización (ver Login)</param> /// <param name="status">Código del estado al que se quiere pasar (2=Aceptada / 3=Rechazada)</param> /// <param name="userId">Identificador del usuario que avala el cambio</param> /// <param name="comentarios">Comentarios adicionales</param> /// <returns></returns> public virtual bool PutStatus(int id, string tk, int status, int userId, string comentarios) { bool res = false; using (PortalProContext ctx = new PortalProContext()) { // Comprobamos la solicitud SolicitudProveedor solProveedor = (from sp in ctx.SolicitudProveedors where sp.SolicitudProveedorId == id select sp).FirstOrDefault<SolicitudProveedor>(); if (solProveedor == null) { throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotFound, "No hay una solicitud con el id proporcionado (Solicitudes proveedores)")); } if (solProveedor.SolicitudStatus == null || solProveedor.SolicitudStatus.SolicitudStatusId != 1) { throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "La solicitud ya ha sido procesada")); } // ya nos hemos asegurado que la soilictud existe ahora creamos el registro de procesamiento. SolicitudStatus st = (from s in ctx.SolicitudStatus where s.SolicitudStatusId == status select s).FirstOrDefault<SolicitudStatus>(); if (st == null) { throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotFound, "No hay una estatus con el id proporcionado (Solicitudes proveedores)")); } // obtención de los usuarios Usuario usu = (from u in ctx.Usuarios where u.UsuarioId == userId select u).FirstOrDefault<Usuario>(); if (usu == null) { throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotFound, "El usuario es incorrecto (Solicitudes proveedores)")); } // y ahora el regsitro de procesamiento SolicitudLog slg = new SolicitudLog(); slg.Sello = DateTime.Now; slg.Comentarios = comentarios; slg.SolicitudProveedor = solProveedor; slg.Usuario = usu; slg.SolicitudStatusInicial = solProveedor.SolicitudStatus; slg.SolicitudStatusFinal = st; ctx.Add(slg); // cambiamos el estado de la solicitud solProveedor.SolicitudStatus = st; // y salvamos todo ctx.SaveChanges(); // una vez hecho esto hay que informar por correo // preparamos y enviamos el correo de confirmación por defecto (por si falla la plantilla). string asunto = "[PortalPro] Recibida solicitud"; string cuerpo = String.Format("Su solicitud con ID:{0} ha sido recibida. No responda este mensaje", solProveedor.SolicitudProveedorId); // El primer paso es obtener la plantilla en este caso su código coincide con el estatus Plantilla plantilla = (from pl in ctx.Plantillas where pl.PlantillaId == status select pl).FirstOrDefault<Plantilla>(); if (plantilla != null) { asunto = String.Format(plantilla.Asunto, solProveedor.SolicitudProveedorId, solProveedor.RazonSocial, solProveedor.Direccion, solProveedor.Localidad, solProveedor.CodPostal, solProveedor.Provincia, solProveedor.Comunidad, solProveedor.Pais, solProveedor.Telefono, solProveedor.Fax, solProveedor.Movil, solProveedor.Email, solProveedor.Url, solProveedor.Nif, comentarios); cuerpo = String.Format(plantilla.Cuerpo, solProveedor.SolicitudProveedorId, solProveedor.RazonSocial, solProveedor.Direccion, solProveedor.Localidad, solProveedor.CodPostal, solProveedor.Provincia, solProveedor.Comunidad, solProveedor.Pais, solProveedor.Telefono, solProveedor.Fax, solProveedor.Movil, solProveedor.Email, solProveedor.Url, solProveedor.Nif, comentarios); } PortalProMailController.SendEmail(solProveedor.Email, asunto, cuerpo); } return res; }