/// <summary>
 /// Comprueba que los ficheros necesarios para rellenar a la solicitud están.
 /// Asocia esos ficheros como documentos a la solicitud de que se trate.
 /// </summary>
 /// <param name="webRoot">Directorio de subida de ficheros</param>
 /// <param name="tk">Tique de autorización (caso especial "solicitud")</param>
 /// <param name="solProveedor">Solicitud de proveedor a procesar</param>
 /// <param name="ctx">Contexto para acceso a la base de datos (OpenAccess)</param>
 /// <returns></returns>
 public static string ComprobarCargarFicherosProveedor(string webRoot, string tk, SolicitudProveedor solProveedor, PortalProContext ctx)
 {
     string mens = ""; // mensaje que devoveremos, si vacío todo OK
     string[] listaFicheros; // lista de los ficheros contenidos en el directorio de carga
     // lo primero de todo que no ha habido un error en el directorio 
     if (!Directory.Exists(webRoot))
     {
         return "No existe el directorio de carga";
     }
     else
     {
         // cargamos la lista de ficheros del directorio de carga
         listaFicheros = Directory.GetFiles(webRoot);
     }
     // comprobamos si existe el parámetro que define donde esta el repositorio
     string repo = ConfigurationManager.AppSettings["PortalProRepositorio"];
     if (repo == null || repo == "")
     {
         return "No existe o está vació el parámetro de ubicación del repositorio en el Web.config";
     }
     // comprobamos que el directorio físicamente existe (si no lo creamos);
     if (!Directory.Exists(repo))
     {
         Directory.CreateDirectory(repo);
     }
     // por cada tipo de fichero asociado al grupo de proveedores al que pertenecerá este
     // comprbamos que existe el fichero correspondiente en el directorio de carga.
     foreach (TipoDocumentoGrupoProveedor tdgp in solProveedor.GrupoProveedor.TipoDocumentoGrupoProveedors)
     {
         TipoDocumento td = tdgp.TipoDocumento;
         string buscador = String.Format("{0}#{1}#", tk, td.TipoDocumentoId);
         string fichero = (from f in listaFicheros
                           where f.Contains(buscador)
                           select f).FirstOrDefault<string>();
         if (fichero == null)
         {
             return "Faltan ficheros asociados a este proveedor";
         }
         // creamos el documento correspondiente asignando un nuevo nombre que empieza por el NIF
         Documento d = new Documento();
         d.TipoDocumento = td;
         d.SolicitudProveedor = solProveedor;
         int posFich = fichero.LastIndexOf("#");
         int posExten = fichero.LastIndexOf(".");
         d.NomFichero = String.Format("{0}_{1}_{2}", solProveedor.Nif, td.TipoDocumentoId, fichero.Substring(posFich + 1));
         d.Extension = fichero.Substring(posExten + 1);
         // copiamos al repositorio
         File.Copy(fichero, Path.Combine(repo, d.NomFichero));
         ctx.Add(d);
     }
     // si llegamos aquí podemos borrar los ficheros del directorio de carga
     var rs = (from f in listaFicheros
               where f.Contains(String.Format("{0}#", tk))
               select f);
     foreach (string f in rs)
     {
         File.Delete(f);
     }
     return mens;
 }
 /// <summary>
 /// Modificar una 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 de la solicitud </param>
 /// <param name="solProveedor">Solicitud de proveedor con los valores que se desean en sus atributos</param>
 /// <param name="tk"> Tique de autorización (Ver 'Login'). Caso "solicitud"</param>
 /// <returns></returns>
 public virtual SolicitudProveedor Put(int id, SolicitudProveedor solProveedor, string tk)
 {
     using (PortalProContext ctx = new PortalProContext())
     {
         // comprobar el tique
         // se permite si el valor es "solicitud" siempre
         if (!CntWebApiSeguridad.CheckTicket(tk, ctx) && tk != "solicitud")
         {
             throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "Se necesita tique de autorización (Solicitudes proveedores)"));
         }
         // comprobar los formatos
         if (solProveedor == null || id != solProveedor.SolicitudProveedorId)
         {
             throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest));
         }
         // primero buscamos si una solicitud con ese id existe
         SolicitudProveedor solPro = (from sp in ctx.SolicitudProveedors
                                      where sp.SolicitudProveedorId == id
                                      select sp).FirstOrDefault<SolicitudProveedor>();
         // existe?
         if (solPro == null)
         {
             throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotFound, "No hay una solicitud con el id proporcionado (Solicitudes proveedores)"));
         }
         int grupoProveedorId = 0;
         int solicitudStatusId = 0;
         // Controlamos las propiedades que son en realidad objetos.
         if (solProveedor.GrupoProveedor != null)
         {
             grupoProveedorId = solProveedor.GrupoProveedor.GrupoProveedorId;
             solProveedor.GrupoProveedor = null;
         }
         // modificar el objeto
         ctx.AttachCopy<SolicitudProveedor>(solProveedor);
         // volvemos a leer el objecto para que lo maneje este contexto.
         solProveedor = (from sp in ctx.SolicitudProveedors
                         where sp.SolicitudProveedorId == id
                         select sp).FirstOrDefault<SolicitudProveedor>();
         if (grupoProveedorId != 0)
         {
             solProveedor.GrupoProveedor = (from gp in ctx.GrupoProveedors
                                            where gp.GrupoProveedorId == grupoProveedorId
                                            select gp).FirstOrDefault<GrupoProveedor>();
         }
         if (solicitudStatusId != 0)
         {
             solProveedor.SolicitudStatus = (from ss in ctx.SolicitudStatus
                                             where ss.SolicitudStatusId == solicitudStatusId
                                             select ss).FirstOrDefault<SolicitudStatus>();
         }
         ctx.SaveChanges();
         return ctx.CreateDetachedCopy<SolicitudProveedor>(solProveedor, x => x.GrupoProveedor, x => x.SolicitudStatus);
     }
 }
 /// <summary>
 /// Crear un nueva solicitud
 /// </summary>
 /// <param name="Proveedor">Objeto a crear, el atributo SolicitudProveedorId lo genera la aplicación y es devuelto en el objeto incluido en la respuesta.</param>
 /// <param name="tk"> Tique de autorización (se debe obtener con la accion Login). Caso especial "solicitud"</param>
 /// <returns></returns>
 public virtual SolicitudProveedor Post(SolicitudProveedor solProveedor, string tk)
 {
     using (PortalProContext ctx = new PortalProContext())
     {
         // comprobar el tique
         // se permite el que lleva el texto "solicitud" siempre
         if (!CntWebApiSeguridad.CheckTicket(tk, ctx) && tk != "solicitud")
         {
             throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "Se necesita tique de autorización (Solicitudes proveedores)"));
         }
         // comprobar las precondiciones
         if (solProveedor == null)
         {
             throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest));
         }
         int grupoProveedorId = 0;
         int solicitudStatusId = 1; // cuando se crean las solicitudes su estado es pendiente.
         // Controlamos las propiedades que son en realidad objetos.
         if (solProveedor.GrupoProveedor != null)
         {
             grupoProveedorId = solProveedor.GrupoProveedor.GrupoProveedorId;
             solProveedor.GrupoProveedor = null;
         }
         
         // justo antes de darlo de alta le ponemos el sello
         solProveedor.Sello = DateTime.Now;
         // por defecto su estado es pendiente ID=1
         solProveedor.SolicitudStatus = (from ss in ctx.SolicitudStatus
                                         where ss.SolicitudStatusId == 1
                                         select ss).FirstOrDefault<SolicitudStatus>();
         // dar de alta el objeto en la base de datos y devolverlo en el mensaje
         ctx.Add(solProveedor);
         // eliminamos los documentos asociados si los hay
         // los dará de alta otro proceso.
         foreach (Documento d in solProveedor.Documentos)
         {
             PortalProWebUtility.EliminarDocumento(d, ctx);
         }
         if (grupoProveedorId != 0)
         {
             solProveedor.GrupoProveedor = (from gp in ctx.GrupoProveedors
                                            where gp.GrupoProveedorId == grupoProveedorId
                                            select gp).FirstOrDefault<GrupoProveedor>();
         }
         if (solicitudStatusId != 0)
         {
             solProveedor.SolicitudStatus = (from ss in ctx.SolicitudStatus
                                             where ss.SolicitudStatusId == solicitudStatusId
                                             select ss).FirstOrDefault<SolicitudStatus>();
         }
         ctx.SaveChanges();
         // 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 ID=1
         Plantilla plantilla = (from pl in ctx.Plantillas
                                where pl.PlantillaId == 1
                                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);
             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);
         }
         PortalProMailController.SendEmail(solProveedor.Email, asunto, cuerpo);
         return ctx.CreateDetachedCopy<SolicitudProveedor>(solProveedor, x => x.GrupoProveedor);
     }
 }