/// <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);
     }
 }
Beispiel #2
0
 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;
 }