/// <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;
 }