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