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