/// <summary> /// Crear una nueva línea de factura /// </summary> /// <param name="LinFactura">Objeto a crear, el atributo LinFacturaId 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 LinFactura Post(LinFactura linea, 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 (LinFactura)")); } // comprobar las precondiciones if (linea == null) { throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest)); } int cabFacturaId = 0; // Controlamos las propiedades que son en realidad objetos. if (linea.CabFactura != null) { cabFacturaId = linea.CabFactura.CabFacturaId; linea.CabFactura = null; } // dar de alta el objeto en la base de datos y devolverlo en el mensaje ctx.Add(linea); if (cabFacturaId != 0) { linea.CabFactura = (from f in ctx.CabFacturas where f.CabFacturaId == cabFacturaId select f).FirstOrDefault<CabFactura>(); } ctx.SaveChanges(); return ctx.CreateDetachedCopy<LinFactura>(linea, x => x.CabFactura); } }
private void LoadAssociateLines(string numFactura, DateTime fechaFactura) { PortalProContext ctx = new PortalProContext(); // buscamos la cabecera de pedido relacionada CabFactura factura = (from f in ctx.CabFacturas where f.NumFactura == numFactura && f.FechaEmision == fechaFactura select f).FirstOrDefault<CabFactura>(); string strConnect = ConfigurationManager.ConnectionStrings["PortalProTestConnection"].ConnectionString; SqlConnection con = new SqlConnection(strConnect); con.Open(); string sqlb = @"SELECT [INVOICEID] ,[INVOICEDATE] ,[LINENUM] ,[PURCHID] ,[LINEAMOUNT] ,[PORIVA] FROM [PortalProTest].[dbo].[Cau_portalpro_VLinFactura] WHERE [INVOICEID] = '{0}' AND [INVOICEDATE] = '{1:yyyMMdd}';"; string sql = String.Format(sqlb, numFactura, fechaFactura); SqlCommand cmd = new SqlCommand(sql, con); SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { int numLinea = (int)(dr.GetDecimal(2)); // -- LinFactura lf = (from l in ctx.LinFacturas where l.NumFactura == numFactura && l.FechaEmision == fechaFactura && l.NumLineaFactura == numLinea select l).FirstOrDefault<LinFactura>(); if (lf == null) { lf = new LinFactura(); ctx.Add(lf); } lf.CabFactura = factura; lf.NumFactura = numFactura; lf.FechaEmision = fechaFactura; lf.NumLineaFactura = numLinea; lf.Descripcion = ""; lf.Importe = dr.GetDecimal(4); lf.PorcentajeIva = dr.GetDecimal(5); ctx.SaveChanges(); } dr.Close(); ctx.Dispose(); con.Close(); con.Dispose(); }
/// <summary> /// Modificar una linea de factura. 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 linea de fcatura</param> /// <param name="linea">Linea de fcatura con los valores que se desean en sus atributos</param> /// <param name="tk"> Tique de autorización (Ver 'Login')</param> /// <returns></returns> public virtual LinFactura Put(int id, LinFactura linea, 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 (LinFactura)")); } // comprobar los formatos if (linea == null || id != linea.LinFacturaId) { throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest)); } // primero buscamos si uan linea con ese id existe LinFactura lin = (from l in ctx.LinFacturas where l.LinFacturaId == id select l).FirstOrDefault<LinFactura>(); // existe? if (lin == null) { throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotFound, "No hay una linea con el id proporcionado (LinFactura)")); } int cabFacturaId = 0; // Controlamos las propiedades que son en realidad objetos. if (lin.CabFactura != null) { cabFacturaId = lin.CabFactura.CabFacturaId; linea.CabFactura = null; } // modificar el objeto ctx.AttachCopy<LinFactura>(linea); // volvemos a leer el objecto para que lo maneje este contexto. linea = (from l in ctx.LinFacturas where l.LinFacturaId == id select l).FirstOrDefault<LinFactura>(); if (cabFacturaId != 0) { linea.CabFactura = (from f in ctx.CabFacturas where f.CabFacturaId == cabFacturaId select f).FirstOrDefault<CabFactura>(); } ctx.SaveChanges(); return ctx.CreateDetachedCopy<LinFactura>(linea, x => x.CabFactura); } }
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 string ComprobarLineaFacturaContraPedido(CabFactura factura, LinFactura l, PortalProContext ctx) { string m = ""; // (1) comprobar que el pedido existe Pedido p = (from ped in ctx.Pedidos where ped.NumPedido == l.NumeroPedido select ped).FirstOrDefault<Pedido>(); if (p == null) { m = String.Format("El pedido {0} no existe.", l.NumeroPedido); return m; } // ahora se compara contra línea, luego hay que buscar la línea correspondiente LinPedido lp = (from linped in ctx.LinPedidos where linped.NumPedido == l.NumeroPedido && linped.NumLinea == l.NumLineaPedido select linped).FirstOrDefault<LinPedido>(); if (lp == null) { m = String.Format("El linea {0} del pedido {1} no existe.",l.NumLineaPedido, l.NumeroPedido); return m; } // Obtener parámetros y datos de proveedor para verificar márgenes Parametro parametro = (from par in ctx.Parametros1 where par.ParametroId == 1 select par).FirstOrDefault<Parametro>(); Proveedor proveedor = p.Proveedor; // bool facAbierto = parametro.FacturaAbierto; facAbierto = proveedor.FacAbierto; int margen = parametro.MargenFactura; if (p.Estado == "FACTURADO" || p.Estado == "CANCELADO") { m = String.Format("El pedido {0} ya ha sido facturado o está cancelado.", l.NumeroPedido); return m; } if (p.Proveedor.ProveedorId != factura.Proveedor.ProveedorId) { m = String.Format("El pedido {0} no corresponde al proveedor {1}", l.NumeroPedido, factura.Proveedor.NombreComercial); return m; } // (2) comprobar que el importe que se va a facturar es menor o igual que el del pedido if (l.Importe > ((lp.Importe - lp.Facturado) + margen)) { m = String.Format("El importe {0:##,###,##0.00} supera el resto por facturar del pedido {1} linea {2}.", l.Importe, l.NumeroPedido, l.NumLineaPedido); return m; } // el estado por defecto de una factura es ACEPTADA, pero si es de un pedido ABIERTO deberá ser RECIBIDA if (lp.Estado == "ABIERTO") { if (facAbierto) { factura.Estado = "RECIBIDA2"; factura.Historial += String.Format("{0:dd/MM/yyyy hh:mm:ss} La factura {1} pasa a estado {3} debido a que el pedido {4} linea {5} no está recibido, se espera a su aceptación manual <br/>", DateTime.Now, factura.NumFactura, factura.TotalFactura, factura.Estado, lp.NumPedido, lp.NumLinea); } else { m = String.Format("El pedido {0} linea {1} no está recibido, no puede emitir la factura contra él", lp.NumPedido, lp.NumLinea); return m; } } // si llega aquí es una linea a dar de alta. lp.Facturado = l.Importe; factura.TotalFactura += l.Importe; p.TotalFacturado += l.Importe; // actualizar empresa y responsables factura.Empresa = p.Empresa; factura.Responsable = p.Responsable; l.CabFactura = factura; ctx.Add(l); ctx.SaveChanges(); return m; }
public static string ComprobarLineaFacturaContraPedidoSuscripcion(CabFactura factura, LinFactura l, PortalProContext ctx) { string m = ""; // (1) comprobar que el pedido existe Pedido p = (from ped in ctx.Pedidos where ped.NumPedido == l.NumeroPedido select ped).FirstOrDefault<Pedido>(); if (p == null) { m = String.Format("El pedido {0} no existe.", l.NumeroPedido); return m; } // ahora se compara contra línea, luego hay que buscar la línea correspondiente LinPedido lp = (from linped in ctx.LinPedidos where linped.NumPedido == l.NumeroPedido && linped.NumLinea == l.NumLineaPedido select linped).FirstOrDefault<LinPedido>(); if (lp == null) { m = String.Format("El linea {0} del pedido {1} no existe.", l.NumLineaPedido, l.NumeroPedido); return m; } // Obtener parámetros y datos de proveedor para verificar márgenes Parametro parametro = (from par in ctx.Parametros1 where par.ParametroId == 1 select par).FirstOrDefault<Parametro>(); Proveedor proveedor = p.Proveedor; // comprobamos las reglas para pedido de suscripcion decimal importeAFacturar = PedidoSuscripcionImporteFacturable(p, factura, ctx); if (importeAFacturar == 0) { m = String.Format("NO se puede facturar con esta fecha e importe contra el pedido de suscripción {0}", p.NumPedido); return m; } l.NumeroPedido = p.NumPedido; l.NumLineaPedido = lp.NumLinea; l.Importe = importeAFacturar; l.Descripcion = lp.Descripcion; l.PorcentajeIva = lp.PorcentajeIva; // actualizar empresa y responsables factura.Empresa = p.Empresa; factura.Responsable = p.Responsable; factura.TotalFactura += l.Importe; l.CabFactura = factura; // antes de salir conmprobamos si el total facturado supera // el margen de control PDF if (factura.TotalFactura > parametro.MaxImportePdf) { factura.Estado = "RECIBIDA2"; factura.Historial += String.Format("{0:dd/MM/yyyy hh:mm:ss} La factura {1} pasa a estado INCIDENCIA debido a que su total {2} supera al margen de control PDF {4} <br/>", DateTime.Now, factura.NumFactura, factura.TotalFactura, factura.Estado, parametro.MaxImportePdf); } ctx.Add(l); ctx.SaveChanges(); return m; }
/// <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; }