Formulario Proceso 2.0.N
Ir a la navegación
Ir a la búsqueda
Formulario Proceso
Código de Referencia
using FlexiPyme.db;
using FlexiPyme.ui.formularios.especificos.proceso;
using FlexiPymeTest.FlexiPyme.LogicaComun;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace FlexiPymeTest.FlexiPyme.Formularios.Ventas
{
public class frmCrearFacturasAbonosProceso : FlexiProceso
{
public override void InicializarFormulario()
{
this.AgregarAccion("Generar FACTURAS");
this.BuscarAccion("Generar FACTURAS").RequiereConfirmacion = true;
this.BuscarAccion("Generar FACTURAS").MostrarLoading = false;
this.AgregarFiltroTexto("anio", "Año");
this.AgregarFiltroTexto("mes", "Mes");
}
public override void AlEjecutarAccion(string accion)
{
if (accion == "Generar FACTURAS")
{
int anio = this.BuscarFiltro("anio").ValorEntero;
int mes = this.BuscarFiltro("mes").ValorEntero;
string sql = @"select distinct c.id, c.idVendedor, c.email
from Clientes c
inner join Abonos a on a.idCliente = c.id
inner join Productos p on a.idProducto = p.id
where
not exists (
select *
from FacturasItems fi
inner join Facturas f on fi.idFactura = f.id
where
f.idCliente = c.id and fi.idProducto = p.id
and
YEAR(f.fecha) = @anio and MONTH(f.fecha) = @mes
)";
Dictionary pars = new Dictionary();
pars.Add("@anio", anio);
pars.Add("@mes", mes);
FlexiDbTabla ds = FlexiDb.Listar(sql, pars);
int totalFacturas = 0;
// Para cada cliente que tiene abono pendiente de facturar busco todos los abonos pendientes y los cargo en 1 factura
foreach (FlexiDbFila fila in ds.Filas)
{
int idCliente = fila.ObtenerEntero("id");
int idVendedor = fila.ObtenerEntero("idVendedor");
string email = fila.ObtenerCadena("email");
sql = @"select a.id as idAbono, p.id as idProducto, p.precioUnitario as precioProducto, a.precioEspecial, p.nombre as producto
from Clientes c
inner join Abonos a on a.idCliente = c.id
inner join Productos p on a.idProducto = p.id
where
c.id = @idCliente
and
not exists (
select *
from FacturasItems fi
inner join Facturas f on fi.idFactura = f.id
where
f.idCliente = c.id and fi.idProducto = p.id
and
YEAR(f.fecha) = @anio and MONTH(f.fecha) = @mes
)";
pars = new Dictionary();
pars.Add("@anio", anio);
pars.Add("@mes", mes);
pars.Add("@idCliente", idCliente);
FlexiDbTabla dsAb = FlexiDb.Listar(sql, pars);
int idFacturaTipo = LogicaDeFacturas.ObtenerIdFacturaTipoPorCliente(idCliente);
// Creo Factura
sql = @"insert into Facturas (idCliente, idVendedor, email, fecha, idPuntoDeVenta, numero, idFacturaTipo, subtotal105, subtotal21, subtotalNG, iva105, iva21, total, cae)
values (@idCliente, @idVendedor, @email, @fecha, @idPuntoDeVenta, 0, @idFacturaTipo, 0, 0, 0, 0, 0, 0, '')";
pars = new Dictionary();
pars.Add("@idCliente", idCliente);
if (idVendedor > 0)
pars.Add("@idVendedor", idVendedor);
else
pars.Add("@idVendedor", DBNull.Value);
pars.Add("@email", email);
pars.Add("@fecha", new DateTime(anio, mes, 1));
pars.Add("@idPuntoDeVenta", LogicaDeFacturas.ObtenerIdPVPorDefecto());
pars.Add("@idFacturaTipo", idFacturaTipo);
int idFactura = FlexiDb.EjecutarInsert(sql, pars);
totalFacturas++;
int renglon = 1;
decimal subtotal21 = 0;
foreach (FlexiDbFila filaAb in dsAb.Filas)
{
sql = @"insert into FacturasItems (idFactura, idProducto, cantidad, descripcion, precioUnitarioSinIva, descuento, precioUnitarioSinIvaConDesc, precioUnitarioConIva, idTasaIva, renglon, precioTotal)
values (@idFactura, @idProducto, @cantidad, @descripcion, @precioUnitarioSinIva, @descuento, @precioUnitarioSinIvaConDesc, @precioUnitarioConIva, @idTasaIva, @renglon, @precioTotal)";
decimal precioEspecial = filaAb.ObtenerMoneda("precioEspecial");
decimal precioProducto = filaAb.ObtenerMoneda("precioProducto");
decimal precioSinIva = precioEspecial;
if (precioSinIva == 0)
precioSinIva = precioProducto;
decimal precioUnitarioConIva = precioSinIva * 1.21M;
decimal precioTotal = precioSinIva;
if (!LogicaDeFacturas.EsTipoFacturaA(idFacturaTipo))
precioTotal = precioUnitarioConIva;
subtotal21 += precioSinIva;
pars = new Dictionary();
pars.Add("@idFactura", idFactura);
pars.Add("@idProducto", filaAb.ObtenerEntero("idProducto"));
pars.Add("@cantidad", 1);
pars.Add("@descripcion", filaAb.ObtenerCadena("producto"));
pars.Add("@precioUnitarioSinIva", precioSinIva);
pars.Add("@descuento", 0);
pars.Add("@precioUnitarioSinIvaConDesc", precioSinIva);
pars.Add("@precioUnitarioConIva", precioUnitarioConIva);
pars.Add("@idTasaIva", LogicaDeFacturas.ObtenerIdTasaIva21());
pars.Add("@renglon", renglon);
pars.Add("@precioTotal", precioTotal);
FlexiDb.EjecutarInsert(sql, pars);
renglon++;
}
decimal iva = subtotal21 * 0.21M;
decimal total = subtotal21 + iva;
sql = "update Facturas set subtotal21 = @subtotal21, iva21 = @iva, total = @total where id = @idFactura";
pars = new Dictionary();
pars.Add("@idFactura", idFactura);
pars.Add("@subtotal21", subtotal21);
pars.Add("@iva", iva);
pars.Add("@total", total);
FlexiDb.EjecutarUpdate(sql, pars);
}
this.AgregarMensajeResultados("Se crearo " + totalFacturas + " facturas.");
}
}
}
}