/// <summary>
 /// Devueleve lo que queda por facturar de un pedido de suscripción, excluyendo
 /// la factura pasada
 /// </summary>
 /// <param name="pedido">Pedido de suscripción</param>
 /// <param name="factura">Factura de referencia</param>
 /// <param name="ctx">Contexto OpenAccess</param>
 /// <returns>Importe pendiente o cero si no se puede facturar.</returns>
 public static decimal PedidoSuscripcionImporteFacturable(Pedido pedido, CabFactura factura, PortalProContext ctx)
 {
     decimal r = 0;
     DateTime fecha = (DateTime)factura.FechaEmision;
     // si no es un pedido de suscripción no lo tratamos.
     if (pedido.TipoPedido != "SUSCRIPCION")
         return r;
     // si hemos superado la fecha límite, tampoco facturamos
     // solo comprobamos si la fecha no es nula
     if (pedido.FechaLimite != null && (fecha > pedido.FechaLimite))
         return r;
     // calcular el primer y último dia del mes
     DateTime primerDiaDelMes = new DateTime(fecha.Year, fecha.Month, 1);
     DateTime ultimoDiaDelMes = primerDiaDelMes.AddMonths(1).AddDays(-1);
     // comprobar el total facturado contra ese pedido
     // en ese mes
     var rs = from lf in ctx.LinFacturas
              where lf.NumeroPedido == pedido.NumPedido &&
                    (lf.FechaEmision >= primerDiaDelMes && lf.FechaEmision <= ultimoDiaDelMes)
                    && lf.CabFactura.CabFacturaId != factura.CabFacturaId
              select lf;
     decimal totalFacturado = rs.AsEnumerable().Sum(x => x.Importe);
     decimal totalPedido = pedido.TotalPedido;
     // ahora la comprobación devolvemos pendiente
     if (totalFacturado < totalPedido)
         r = (totalPedido - totalFacturado);
     return r;
 }
Beispiel #2
0
        // este método se ejecutará de manera asíncrona.
        public string LaunchPedido(out int threadId)
        {
            threadId = Thread.CurrentThread.ManagedThreadId;
            int numreg = 0;
            int totreg = 0;
            PortalProContext ctx = new PortalProContext();
            EntitiesModel con = new EntitiesModel();
            var rs = (from cp in con.Cau_PortalPro_VCabPedidos
                      select cp);
            totreg = rs.Count();
            foreach (Cau_PortalPro_VCabPedido cp1 in rs)
            {
                numreg++;
                // Buscamos si ese pedido ya existe
                Pedido p2 = (from p in ctx.Pedidos
                             where p.NumPedido == cp1.PURCHID
                             select p).FirstOrDefault<Pedido>();
                if (p2 == null)
                {
                    p2 = new Pedido();
                    p2.NumPedido = cp1.PURCHID;
                    p2.FechaAlta = cp1.CREATEDDATE;
                    // buscamos al proveedor
                    p2.Proveedor = (from pr in ctx.Proveedors
                                    where pr.CodAx == cp1.INVOICEACCOUNT
                                    select pr).FirstOrDefault<Proveedor>();
                    p2.TotalPedido = 0;
                    p2.TotalFacturado = 0;
                    p2.Estado = cp1.ESTADO;
                    p2.DocumentoPdf = null;
                    p2.DocumentoXml = null;
                    p2.TipoPedido = cp1.TIPO;
                    // buscar la empresa
                    p2.Empresa = (from e in ctx.Empresas
                                  where e.CodAx == cp1.DATAAREAID
                                  select e).FirstOrDefault<Empresa>();
                    p2.FechaLimite = cp1.FECHALIMITE;
                    p2.FechaRecepcion = cp1.FECHARECEPCION;
                }
                else
                {

                }
                // Actualizar los registros de proceso
                Progresos progreso = (from p in ctx.Progresos
                                      where p.ProgresoId == 3
                                      select p).FirstOrDefault<Progresos>();
                if (progreso != null)
                {
                    progreso.NumReg = numreg;
                    progreso.TotReg = totreg;
                    ctx.SaveChanges();
                }
            }
            return "";
        }
Beispiel #3
0
 // este método se ejecutará de manera asíncrona.
 public string LaunchPedido(out int threadId)
 {
     threadId = Thread.CurrentThread.ManagedThreadId;
     // abrir conexiones 
     PortalProContext ctx = new PortalProContext();
     // Actualizar los registros de proceso
     Progresos progreso = (from p in ctx.Progresos
                           where p.ProgresoId == 3
                           select p).FirstOrDefault<Progresos>();
     if (progreso != null)
     {
         progreso.NumReg = 0;
         progreso.TotReg = 1;
         ctx.SaveChanges();
     }
     string strConnect = ConfigurationManager.ConnectionStrings["PortalProTestConnection"].ConnectionString;
     SqlConnection con = new SqlConnection(strConnect);
     con.Open();
     string sql = "SELECT COUNT(*) FROM [dbo].[Cau_PortalPro_VCabPedido]";
     SqlCommand cmd = new SqlCommand(sql, con);
     int totreg = (int)cmd.ExecuteScalar();
     int numreg = 0;
     sql = @"SELECT  
                 [PURCHID]
                 ,[INVOICEACCOUNT]
                 ,[DATAAREAID]
                 ,[ESTADO]
                 ,[TIPO]
                 ,[CODCONTACTO]
                 ,[CONTACTO]
                 ,[CREATEDDATE]
                 ,[FECHARECEPCION]
                 ,[FECHALIMITE]
             FROM [dbo].[Cau_PortalPro_VCabPedido]";
     cmd = new SqlCommand(sql, con);
     SqlDataReader dr = cmd.ExecuteReader();
     while (dr.Read())
     {
         numreg++;
         string numpedido = dr.GetString(0);
         // Buscamos si esa empresa existe
         Pedido ped2 = (from p2 in ctx.Pedidos
                         where p2.NumPedido == numpedido
                         select p2).FirstOrDefault<Pedido>();
         if (ped2 == null)
         {
             ped2 = new Pedido();
             ctx.Add(ped2);
         }
         ped2.NumPedido = numpedido;
         ped2.Proveedor = (from pr in ctx.Proveedors
                           where pr.CodAx == dr.GetString(1)
                           select pr).FirstOrDefault<Proveedor>();
         ped2.Empresa = (from e in ctx.Empresas
                             where e.CodAx == dr.GetString(2)
                             select e).FirstOrDefault<Empresa>();
         ped2.Actualizado = DateTime.Now;
         if (!dr.IsDBNull(3))
         {
             switch (dr.GetString(3))
             {
                 case "Facturado":
                     ped2.Estado = "FACTURADO";
                     break;
                 case "Pedido Abierto":
                     ped2.Estado = "ABIERTO";
                     break;
                 case "Recibido":
                     ped2.Estado = "RECIBIDO";
                     break;
                 case "Cancelado":
                     ped2.Estado = "CANCELADO";
                     break;
             }
         }
         if (!dr.IsDBNull(4))
         {
             switch (dr.GetString(4))
             {
                 case "Pedido de Compra":
                     ped2.TipoPedido = "COMPRA";
                     break;
                 case "Suscripción":
                     ped2.TipoPedido = "SUSCRIPCION";
                     break;
                 case "Solicitud de Compra":
                     ped2.TipoPedido = "SOLICITUD";
                     break;
             }
         }
         ped2.Responsable = (from r in ctx.Responsables
                             where r.CodAx == dr.GetString(5)
                             select r).FirstOrDefault<Responsable>();
         ped2.FechaAlta = dr.GetDateTime(7);
         if (!dr.IsDBNull(8)) ped2.FechaRecepcion = dr.GetDateTime(8);
         if (!dr.IsDBNull(9)) 
         { 
             ped2.FechaLimite = dr.GetDateTime(9);
             // hay que controlar le fecha nula AX (01/01/1900)
             if (String.Format("{0:dd/MM/yyyy}", ped2.FechaLimite) == "01/01/1900")
             {
                 ped2.FechaLimite = null;
             }
         }
         //try
         //{
             ctx.SaveChanges();
         //}
         //catch (Exception ex)
         //{
         //}
         // cargar las lineas
         LoadAssociateLines(numpedido);
         // Actualizar los registros de proceso
         progreso = (from p in ctx.Progresos
                               where p.ProgresoId == 3
                               select p).FirstOrDefault<Progresos>();
         if (progreso != null)
         {
             progreso.NumReg = numreg;
             progreso.TotReg = totreg;
             ctx.SaveChanges();
         }
     }
     dr.Close();
     ctx.Dispose();
     con.Close();
     con.Dispose();
     return "";
 }
 public static void CrearLineasFacturaDesdeUnPedido(CabFactura factura, Pedido pedido, PortalProContext ctx)
 {
     // procesamos secuencialmente las lineas de este pedido.
     foreach (LinPedido lp in pedido.LinPedidos)
     {
         // la primera condición es que quede algo que facturar
         if (lp.Facturado < lp.Importe)
         {
             decimal importe = lp.Importe - lp.Facturado;
             LinFactura lf = new LinFactura();
             lf.CabFactura = factura;
             lf.Descripcion = lp.Descripcion;
             lf.Importe = importe;
             lf.NumeroPedido = lp.NumPedido;
             lf.NumLineaPedido = lp.NumLinea;
             factura.TotalFactura += importe;
             ctx.Add(lf);
             ctx.SaveChanges();
         }
     }
 }
 public static IList<LinFactura> GenerarLineasFacturaDesdePedido(Pedido p, PortalProContext ctx)
 {
     IList<LinFactura> llfac = new List<LinFactura>();
     // hay dos casos
     // (1) el pedido no ha sido facturado en absoluto p.TotalFacturado = 0
     // (2) el pedido ya ha sido facturado en parte p.TotalFacturado > 0
     if (p.TotalFacturado == 0)
     {
         // caso (1) es el más sencillo, una factura con tantas líneas como tenga el pedido
         foreach (LinPedido lp in p.LinPedidos)
         {
             llfac.Add(new LinFactura()
             {
                 LinFacturaId = 0,
                 NumeroPedido = p.NumPedido,
                 Importe = lp.Importe,
                 Descripcion = lp.Descripcion,
                 PorcentajeIva = lp.PorcentajeIva
             });
         }
     }
     else
     {
         // caso (2) generaremos una única linea con el resto del pedido
         llfac.Add(new LinFactura()
         {
             LinFacturaId = 0,
             NumeroPedido = p.NumPedido,
             Importe = p.TotalPedido - p.TotalFacturado,
             Descripcion = "Resto de pedido",
             PorcentajeIva = p.LinPedidos[0].PorcentajeIva
         });
     }
     return llfac;
 }
        public static CabFactura GenerarFacturaDesdePedido(Pedido p, PortalProContext ctx)
        {
            CabFactura f = new CabFactura()
            {
                CabFacturaId = 0,
                Proveedor = p.Proveedor,
                FechaAlta = DateTime.Now,
                Empresa = p.Empresa,
                Responsable = p.Responsable,
                Estado = "INCIDENCIA"
            };
            ctx.Add(f);
            ctx.SaveChanges();
            decimal totalF = 0;
            if (p.TotalFacturado == 0)
            {
                // caso (1) es el más sencillo, una factura con tantas líneas como tenga el pedido
                foreach (LinPedido lp in p.LinPedidos)
                {
                    ctx.Add(new LinFactura()
                    {
                        LinFacturaId = 0,
                        NumeroPedido = p.NumPedido,
                        Importe = lp.Importe,
                        Descripcion = lp.Descripcion,
                        PorcentajeIva = 0,
                        CabFactura = f
                    });
                    f.TotalFactura += lp.Importe;
                    p.TotalFacturado += lp.Importe;
                    ctx.SaveChanges();
                }
            }
            else
            {
                // caso (2) generaremos una única linea con el resto del pedido
                ctx.Add(new LinFactura()
                {
                    LinFacturaId = 0,
                    NumeroPedido = p.NumPedido,
                    Importe = p.TotalPedido - p.TotalFacturado,
                    Descripcion = "Resto de pedido",
                    PorcentajeIva = 0,
                    CabFactura = f
                });
                f.TotalFactura = p.TotalPedido - p.TotalFacturado;
                p.TotalFacturado = p.TotalPedido;
                ctx.SaveChanges();
            }

            return f;
        }
 /// <summary>
 /// Modificar una cabecera de pedido. 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 cabecera de factura </param>
 /// <param name="pedido">Cabecera de pedido los valores que se desean en sus atributos</param>
 /// <param name="tk"> Tique de autorización (Ver 'Login')</param>
 /// <returns></returns>
 public virtual Pedido Put(int id, Pedido pedido, 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 (Pedido)"));
         }
         // comprobar los formatos
         if (pedido == null || id != pedido.PedidoId)
         {
             throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest));
         }
         // primero buscamos si un factura con ese id existe
         Pedido ped = (from p in ctx.Pedidos
                       where p.PedidoId == id
                       select p).FirstOrDefault<Pedido>();
         // existe?
         if (ped == null)
         {
             throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotFound, "No hay un pedido con el id proporcionado (Pedido)"));
         }
         // Controlamos las propiedades que son en realidad objetos.
         int proveedorId = 0;
         if (pedido.Proveedor != null)
         {
             proveedorId = pedido.Proveedor.ProveedorId;
             pedido.Proveedor = null;
         }
         int responsableId = 0;
         if (pedido.Responsable != null)
         {
             responsableId = pedido.Responsable.ResponsableId;
             pedido.Responsable = null;
         }
         int empresaId = 0;
         if (pedido.Empresa != null)
         {
             empresaId = pedido.Empresa.EmpresaId;
             pedido.Empresa = null;
         }
         int documentoXmlId = 0;
         if (pedido.DocumentoXml != null)
         {
             documentoXmlId = pedido.DocumentoXml.DocumentoId;
             pedido.DocumentoXml = null;
         }
         int documentoPdfId = 0;
         if (pedido.DocumentoPdf != null)
         {
             documentoPdfId = pedido.DocumentoPdf.DocumentoId;
             pedido.DocumentoPdf = null;
         }
         // modificar el objeto
         ctx.AttachCopy<Pedido>(pedido);
         // volvemos a leer el objecto para que lo maneje este contexto.
         pedido = (from p in ctx.Pedidos
                   where p.PedidoId == id
                   select p).FirstOrDefault<Pedido>();
         if (proveedorId != 0)
         {
             pedido.Proveedor = (from p in ctx.Proveedors
                                 where p.ProveedorId == proveedorId
                                 select p).FirstOrDefault<Proveedor>();
         }
         if (empresaId != 0)
         {
             pedido.Empresa = (from p in ctx.Empresas
                               where p.EmpresaId == empresaId
                               select p).FirstOrDefault<Empresa>();
         }
         if (responsableId != 0)
         {
             pedido.Responsable = (from p in ctx.Responsables
                                   where p.ResponsableId == responsableId
                                   select p).FirstOrDefault<Responsable>();
         }
         if (documentoXmlId != 0)
         {
             pedido.DocumentoXml = (from d in ctx.Documentos
                                    where d.DocumentoId == documentoPdfId
                                    select d).FirstOrDefault<Documento>();
         }
         if (documentoPdfId != 0)
         {
             pedido.DocumentoPdf = (from d in ctx.Documentos
                                    where d.DocumentoId == documentoPdfId
                                    select d).FirstOrDefault<Documento>();
         }
         ctx.SaveChanges();
         return ctx.CreateDetachedCopy<Pedido>(pedido, x => x.Proveedor, x => x.DocumentoPdf, x => x.Empresa);
     }
 }
        public virtual Pedido Put(int id, Pedido pedido, string userId, 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 (Pedido)"));
                }
                // comprobar los formatos
                if (pedido == null || id != pedido.PedidoId)
                {
                    throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest));
                }
                // primero buscamos si un factura con ese id existe
                Pedido ped = (from p in ctx.Pedidos
                              where p.PedidoId == id
                              select p).FirstOrDefault<Pedido>();
                // existe?
                if (ped == null)
                {
                    throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotFound, "No hay una factura con el id proporcionado (Pedido)"));
                }
                // La aplicación ahora depende del comienzo del usuario
                string application = "PortalPro";
                switch (userId.Substring(0, 1))
                {
                    case "U":
                        application = "PortalPro2";
                        break;
                    case "G":
                        application = "PortalPro";
                        break;
                }
                // En la actualización a lo mejor no han cargado ningún archivo
                string fPdf = PortalProWebUtility.BuscarArchivoCargado(application, userId, "Factura", "PDF");
                // Controlamos las propiedades que son en realidad objetos.
                int proveedorId = 0;
                if (pedido.Proveedor != null)
                {
                    proveedorId = pedido.Proveedor.ProveedorId;
                    pedido.Proveedor = null;
                }
                int responsableId = 0;
                if (pedido.Responsable != null)
                {
                    responsableId = pedido.Responsable.ResponsableId;
                    pedido.Responsable = null;
                }
                int empresaId = 0;
                if (pedido.Empresa != null)
                {
                    empresaId = pedido.Empresa.EmpresaId;
                    pedido.Empresa = null;
                }
                int documentoXmlId = 0;
                if (pedido.DocumentoXml != null)
                {
                    documentoXmlId = pedido.DocumentoXml.DocumentoId;
                    pedido.DocumentoXml = null;
                }

                int documentoPdfId = 0;
                if (pedido.DocumentoPdf != null)
                {
                    documentoPdfId = pedido.DocumentoPdf.DocumentoId;
                    pedido.DocumentoPdf = null;
                }
                // modificar el objeto
                ctx.AttachCopy<Pedido>(pedido);
                // volvemos a leer el objecto para que lo maneje este contexto.
                pedido = (from p in ctx.Pedidos
                          where p.PedidoId == id
                          select p).FirstOrDefault<Pedido>();
                if (proveedorId != 0)
                {
                    pedido.Proveedor = (from p in ctx.Proveedors
                                        where p.ProveedorId == proveedorId
                                        select p).FirstOrDefault<Proveedor>();
                }
                if (empresaId != 0)
                {
                    pedido.Empresa = (from p in ctx.Empresas
                                      where p.EmpresaId == empresaId
                                      select p).FirstOrDefault<Empresa>();
                }
                if (responsableId != 0)
                {
                    pedido.Responsable = (from p in ctx.Responsables
                                          where p.ResponsableId == responsableId
                                          select p).FirstOrDefault<Responsable>();
                }
                if (documentoXmlId != 0)
                {
                    pedido.DocumentoXml = (from d in ctx.Documentos
                                           where d.DocumentoId == documentoPdfId
                                           select d).FirstOrDefault<Documento>();
                }
                if (documentoPdfId != 0)
                {
                    pedido.DocumentoPdf = (from d in ctx.Documentos
                                           where d.DocumentoId == documentoPdfId
                                           select d).FirstOrDefault<Documento>();
                }
                Documento doc = null; // para cargar temporalmente documentos
                // si se cumplen estas condiciones es que han cambiado el archivo asociado.
                if (fPdf != "")
                {
                    doc = pedido.DocumentoPdf;
                    pedido.DocumentoPdf = PortalProWebUtility.CrearDocumentoDesdeArchivoCargado(application, fPdf, ctx);
                    PortalProWebUtility.EliminarDocumento(doc, ctx);
                }
                ctx.SaveChanges();
                return ctx.CreateDetachedCopy<Pedido>(pedido, x => x.Proveedor, x => x.DocumentoPdf, x => x.Empresa);
            }
        }
        public virtual Pedido Post(Pedido pedido, string userId, 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 (Pedido)"));
                }
                // comprobar las precondiciones
                if (pedido == null)
                {
                    throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest));
                }
                // La aplicación ahora depende del comienzo del usuario
                string application = "PortalPro";
                switch (userId.Substring(0, 1))
                {
                    case "U":
                        application = "PortalPro2";
                        break;
                    case "G":
                        application = "PortalPro";
                        break;
                }
                // comprobamos si existen los ficheros que necesitamos
                string fPdf = PortalProWebUtility.BuscarArchivoCargado(application, userId, "Pedido", "PDF");
                if (fPdf == "")
                {
                    throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotFound, "Se necesita un fichero PDF asociado a la pedido (Pedido)"));
                }
                // Controlamos las propiedades que son en realidad objetos.
                int proveedorId = 0;
                if (pedido.Proveedor != null)
                {
                    proveedorId = pedido.Proveedor.ProveedorId;
                    pedido.Proveedor = null;
                }
                int responsableId = 0;
                if (pedido.Responsable != null)
                {
                    responsableId = pedido.Responsable.ResponsableId;
                    pedido.Responsable = null;
                }
                int empresaId = 0;
                if (pedido.Empresa != null)
                {
                    empresaId = pedido.Empresa.EmpresaId;
                    pedido.Empresa = null;
                }
                int documentoXmlId = 0;
                if (pedido.DocumentoXml != null)
                {
                    documentoXmlId = pedido.DocumentoXml.DocumentoId;
                    pedido.DocumentoXml = null;
                }

                int documentoPdfId = 0;
                if (pedido.DocumentoPdf != null)
                {
                    documentoPdfId = pedido.DocumentoPdf.DocumentoId;
                    pedido.DocumentoPdf = null;
                }
                // dar de alta el objeto en la base de datos y devolverlo en el mensaje
                ctx.Add(pedido);
                if (proveedorId != 0)
                {
                    pedido.Proveedor = (from p in ctx.Proveedors
                                        where p.ProveedorId == proveedorId
                                        select p).FirstOrDefault<Proveedor>();
                }
                if (empresaId != 0)
                {
                    pedido.Empresa = (from p in ctx.Empresas
                                      where p.EmpresaId == empresaId
                                      select p).FirstOrDefault<Empresa>();
                }
                if (responsableId != 0)
                {
                    pedido.Responsable = (from p in ctx.Responsables
                                          where p.ResponsableId == responsableId
                                          select p).FirstOrDefault<Responsable>();
                }
                if (documentoXmlId != 0)
                {
                    pedido.DocumentoXml = (from d in ctx.Documentos
                                           where d.DocumentoId == documentoPdfId
                                           select d).FirstOrDefault<Documento>();
                }
                if (documentoPdfId != 0)
                {
                    pedido.DocumentoPdf = (from d in ctx.Documentos
                                           where d.DocumentoId == documentoPdfId
                                           select d).FirstOrDefault<Documento>();
                }
                if (fPdf != "")
                {
                    pedido.DocumentoPdf = PortalProWebUtility.CrearDocumentoDesdeArchivoCargado(application, fPdf, ctx);
                }
                pedido.FechaAlta = DateTime.Now;
                ctx.SaveChanges();
                return ctx.CreateDetachedCopy<Pedido>(pedido, x => x.Proveedor, x => x.DocumentoPdf, x => x.Empresa);
            }
        }
        /// <summary>
        /// Crear un nueva cabecera de pedido
        /// </summary>
        /// <param name="Pedido">Objeto a crear, el atributo PedidoId 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)</param>
        /// <returns></returns>
        public virtual Pedido Post(Pedido pedido, 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 (Pedido)"));
                }
                // comprobar las precondiciones
                if (pedido == null)
                {
                    throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest));
                }
                // Controlamos las propiedades que son en realidad objetos.
                int proveedorId = 0;
                if (pedido.Proveedor != null)
                {
                    proveedorId = pedido.Proveedor.ProveedorId;
                    pedido.Proveedor = null;
                }
                int responsableId = 0;
                if (pedido.Responsable != null)
                {
                    responsableId = pedido.Responsable.ResponsableId;
                    pedido.Responsable = null;
                }
                int empresaId = 0;
                if (pedido.Empresa != null)
                {
                    empresaId = pedido.Empresa.EmpresaId;
                    pedido.Empresa = null;
                }
                int documentoXmlId = 0;
                if (pedido.DocumentoXml != null)
                {
                    documentoXmlId = pedido.DocumentoXml.DocumentoId;
                    pedido.DocumentoXml = null;
                }
                int documentoPdfId = 0;
                if (pedido.DocumentoPdf != null)
                {
                    documentoPdfId = pedido.DocumentoPdf.DocumentoId;
                    pedido.DocumentoPdf = null;
                }
                // dar de alta el objeto en la base de datos y devolverlo en el mensaje
                ctx.Add(pedido);
                if (proveedorId != 0)
                {
                    pedido.Proveedor = (from p in ctx.Proveedors
                                        where p.ProveedorId == proveedorId
                                        select p).FirstOrDefault<Proveedor>();
                }
                if (empresaId != 0)
                {
                    pedido.Empresa = (from p in ctx.Empresas
                                      where p.EmpresaId == empresaId
                                      select p).FirstOrDefault<Empresa>();
                }
                if (responsableId != 0)
                {
                    pedido.Responsable = (from p in ctx.Responsables
                                          where p.ResponsableId == responsableId
                                          select p).FirstOrDefault<Responsable>();
                }
                if (documentoXmlId != 0)
                {
                    pedido.DocumentoXml = (from d in ctx.Documentos
                                           where d.DocumentoId == documentoPdfId
                                           select d).FirstOrDefault<Documento>();
                }

                if (documentoPdfId != 0)
                {
                    pedido.DocumentoPdf = (from d in ctx.Documentos
                                           where d.DocumentoId == documentoPdfId
                                           select d).FirstOrDefault<Documento>();
                }
                pedido.FechaAlta = DateTime.Now;
                ctx.SaveChanges();
                return ctx.CreateDetachedCopy<Pedido>(pedido, x => x.Proveedor, x => x.DocumentoPdf, x => x.Empresa);
            }
        }
 /// <summary>
 /// Genera una factura de una sola linea con el importe
 /// pasado y a partir del pedido indicado.
 /// </summary>
 /// <param name="pedido">Pedido para el que se genera la factura</param>
 /// <param name="importe">Importe a facturar</param>
 /// <param name="ctx">Contexto OpenAccess</param>
 /// <returns></returns>
 public static CabFactura PedidoSuscripcionGenerarFactura(Pedido pedido, decimal importe, PortalProContext ctx)
 {
     CabFactura factura = null;
     // evitamos que se cuele un importe a 0
     if (importe == 0) return factura;
     // el pedido debe tener lineas
     if (pedido.LinPedidos.Count < 1) return factura;
     // creamos la factura.
     factura = new CabFactura();
     factura.FechaAlta = DateTime.Now;
     factura.TotalFactura = importe;
     factura.Estado = "RECIBIDA";
     factura.Generada = true;
     factura.Proveedor = pedido.Proveedor;
     factura.Empresa = pedido.Empresa;
     factura.Responsable = pedido.Responsable;
     ctx.Add(factura);
     ctx.SaveChanges();
     // creamos una línea única con el importe
     LinFactura lfactura = new LinFactura();
     lfactura.CabFactura = factura;
     lfactura.NumeroPedido = pedido.NumPedido;
     lfactura.Importe = importe;
     // usamos la primera línea que obtengamos del pedido
     // como modelo
     LinPedido lpedido = pedido.LinPedidos[0];
     lfactura.Descripcion = lpedido.Descripcion;
     lfactura.PorcentajeIva = lpedido.PorcentajeIva;
     lfactura.NumeroPedido = lpedido.NumPedido;
     lfactura.NumLineaPedido = lpedido.NumLinea;
     lpedido.Facturado += importe;
     if (factura.FechaEmision != null)
         lfactura.FechaEmision = (DateTime)factura.FechaEmision;
     ctx.Add(lfactura);
     ctx.SaveChanges();
     return factura;
 }