Formulario Proceso 2.0.N

De FlexiPymeDocs
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.");
            }
        }
    }
}