Exemplo n.º 1
0
        /// <summary>
        /// </summary>
        /// <param name="solicitante"> Form que solicita el filtro. </param>
        /// <param name="filtro"> Filtro anterior o preconfigurado a cargar. </param>
        public InventarioFiltroForm(ISolicitudFiltro solicitante, ReporteFiltroModelo filtro = null)
        {
            InitializeComponent();

            this.solicitante = solicitante;

            if (filtro == null)
            {
                return;
            }

            // Cargar filtro anterior o preconfigurado

            if (filtro.FiltroPorProducto && filtro.Producto != null)
            {
                producto = filtro.Producto;
                nombre_producto_tb.Text = filtro.Producto.Nombre;

                filtrar_por_producto_groupbox.Enabled = filtro.FiltroPorProducto;
                filtrar_por_producto_checkbox.Checked = filtro.FiltroPorProducto;
            }

            if (filtro.Categorias != null)
            {
                categoriasSeleccionadas = filtro.Categorias;
                ActualizarCategorias();
            }

            incluir_productos_sin_unidades.Checked = filtro.IncluirProductosSinUnidades;
        }
Exemplo n.º 2
0
        public HistorialVentasFiltroForm(ISolicitudFiltro solicitante, ReporteFiltroModelo filtro = null)
        {
            InitializeComponent();
            this.solicitante = solicitante;

            // Cargar filtro anterior
            if (filtro != null)
            {
                if (filtro.FiltroPorFechas)
                {
                    if (filtro.FechaInicial != null)
                    {
                        fecha_inicial_dtp.Value = filtro.FechaInicial;
                    }
                    if (filtro.FechaFinal != null)
                    {
                        fecha_final_dtp.Value = filtro.FechaFinal;
                    }
                }

                filtrar_por_fechas_groupbox.Enabled = filtro.FiltroPorFechas;
                habilitar_fechas_checkbox.Checked   = filtro.FiltroPorFechas;

                if (filtro.FiltroPorCliente && filtro.Cliente != null)
                {
                    cliente         = filtro.Cliente;
                    cliente_tb.Text = cliente.NombreCompleto;
                }

                filtrar_por_cliente_groupbox.Enabled = filtro.FiltroPorCliente;
                filtrar_por_cliente_checkbox.Checked = filtro.FiltroPorCliente;

                if (filtro.FiltroPorProducto && filtro.Producto != null)
                {
                    producto = filtro.Producto;
                    nombre_producto_tb.Text = filtro.Producto.Nombre;
                }

                filtrar_por_producto_groupbox.Enabled = filtro.FiltroPorProducto;
                filtrar_por_producto_checkbox.Checked = filtro.FiltroPorProducto;

                if (filtro.FiltroPorCategoria && filtro.Categoria != null)
                {
                    categoria = filtro.Categoria;
                    categoria_nombre_tb.Text = filtro.Categoria.Nombre;
                }

                filtrar_por_categoria_groupbox.Enabled = filtro.FiltroPorCategoria;
                filtrar_por_categoria_checkbox.Checked = filtro.FiltroPorCategoria;
            }
        }
Exemplo n.º 3
0
        private void listo_button_Click(object sender, EventArgs e)
        {
            var filtro = new ReporteFiltroModelo();

            filtro.Producto          = producto;
            filtro.FiltroPorProducto = filtrar_por_producto_checkbox.Checked;

            filtro.Categorias = categoriasSeleccionadas;

            filtro.IncluirProductosSinUnidades = incluir_productos_sin_unidades.Checked;

            solicitante.FiltroCreado(filtro);
            MessageBox.Show("Filtro configurado", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
            this.Close();
        }
Exemplo n.º 4
0
        private async void exportar_inventario_button_Click(object sender, EventArgs e)
        {
            var frm = new HistorialLotesFiltroForm(this);

            this.Hide();
            frm.ShowDialog();
            this.Show();


            var destino = GuardarDialogo();

            if (destino == null)
            {
                return;
            }

            Exportando(true);
            CambiarTareaLabel("Exportando...");

            List <ReporteInventarioModelo> reportes;
            int?comienzo = 0;

            try
            {
                do
                {
                    reportes = await Task.Run(() =>
                                              ConfigGlobal.conexion.CargarReporteInventario(reporteFiltro, limiteFilas: LimiteFilas, comienzo: comienzo)
                                              );

                    await Ayudantes.GuardarCsvReporteAsync(reportes, destino);

                    comienzo = reportes.LastOrDefault()?.LoteId;
                } while (reportes.Count > 0);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Exportando(false);
                return;
            }

            MessageBox.Show("Tarea completada", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
            Exportando(false);
            reporteFiltro = null;
        }
Exemplo n.º 5
0
        private void listo_button_Click(object sender, EventArgs e)
        {
            var filtro = new ReporteFiltroModelo();

            filtro.FechaInicial    = fecha_inicial_dtp.Value.Date;
            filtro.FechaFinal      = fecha_final_dtp.Value.Date.AddHours(23).AddMinutes(59).AddSeconds(59);
            filtro.FiltroPorFechas = habilitar_fechas_checkbox.Checked;

            filtro.Producto          = producto;
            filtro.FiltroPorProducto = filtrar_por_producto_checkbox.Checked;

            filtro.Categoria          = categoria;
            filtro.FiltroPorCategoria = filtrar_por_categoria_checkbox.Checked;

            solicitante.FiltroCreado(filtro);
            MessageBox.Show("Filtro configurado", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
            this.Close();
        }
Exemplo n.º 6
0
        public static async Task ExportarReportesPaginacion <T>(FileInfo destino, ReporteFiltroModelo reporteFiltro) where T : IReporte
        {
            List <T> reportes;
            int?     comienzo = null;

            do
            {
                reportes = await Task.Run(() => ConfigGlobal.conexion.CargarReporte <T>
                                          (
                                              filtro: reporteFiltro,
                                              limiteFilas: filasPaginacion,
                                              comienzo: comienzo
                                          ));
                await GuardarCsvReporteAsync(destino, reportes);

                comienzo = reportes.LastOrDefault()?.ReporteId;
            } while (reportes.Count > 0);
        }
Exemplo n.º 7
0
        private async Task ExportarReporte <T>(FileInfo destino, ReporteFiltroModelo filtro) where T : IReporte
        {
            Exportando(true);
            CambiarTareaLabel(mensaje: "Exportando...", visible: true);

            try
            {
                await Exportar.ExportarReportes <T>(destino, reporteFiltro : filtro);

                MessageBox.Show("Tarea completada", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (IOException ex)
            {
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            Exportando(false);
            CambiarTareaLabel(visible: false);
        }
Exemplo n.º 8
0
        private async void exportar_ventas_button_Click(object sender, EventArgs e)
        {
            var frm = new HistorialVentasFiltroForm(this);

            this.Hide();
            frm.ShowDialog();
            this.Show();

            var destino = AbrirDialogoGuardar();

            if (destino == null)
            {
                return;
            }

            await ExportarReporte <ReporteVentaModelo>(destino, reporteFiltro);

            reporteFiltro = null;
        }
Exemplo n.º 9
0
        /// <summary>
        /// Carga una lista de reportes de ventas, lotes, o inventario.
        /// </summary>
        /// <typeparam name="T">Tipo de reporte a cargar. </typeparam>
        /// <param name="filtro">Contiene condiciones para generar el reporte.</param>
        /// <param name="limiteFilas">
        /// Limite de filas a retornar.
        /// Util si la informacion se presenta al usuario o se paginan los resultados.
        /// </param>
        /// <param name="comienzo">Util para paginar los resultados.</param>
        /// <returns>Una lista de reportes de tipo <typeparamref name="T"/>.</returns>
        public List <T> CargarReporte <T>(ReporteFiltroModelo filtro = null, int?limiteFilas = null, int?comienzo = null)
        {
            var parametros = new DynamicParameters();

            var q = ConstruirQueryReporte <T>
                    (
                filtro: filtro,
                parametros: parametros,
                comienzo: comienzo,
                limiteFilas: limiteFilas
                    );

            List <T> reportes;

            using (IDbConnection conexion = new SQLiteConnection(stringConexion))
            {
                reportes = conexion.Query <T>(q, parametros).ToList();
            }

            IReporteProcesador procesador = null;

            if (reportes is List <ReporteLoteModelo> reportesLote)
            {
                procesador = new ReporteLoteProcesador(reportesLote);
            }

            if (reportes is List <ReporteVentaModelo> reportesVenta)
            {
                procesador = new ReporteVentaProcesador(reportesVenta);
            }

            if (reportes is List <ReporteInventarioModelo> reportesInventario)
            {
                procesador = new ReporteInventarioProcesador(reportesInventario);
            }

            procesador.Procesar();

            return(reportes);
        }
Exemplo n.º 10
0
        public InventarioForm()
        {
            InitializeComponent();

            reporteFiltro = new ReporteFiltroModelo();

            // Por defecto, mostrar al usuario solo los productos con unidades disponibles.
            reporteFiltro.IncluirProductosSinUnidades = false;

            resultados_dtgv.AutoGenerateColumns = false;

            // Inicializar columnas

            var nombreProducto = new DataGridViewTextBoxColumn();

            nombreProducto.HeaderText       = "Producto";
            nombreProducto.DataPropertyName = nameof(ReporteInventarioModelo.NombreProducto);

            var descripcionProducto = new DataGridViewTextBoxColumn();

            descripcionProducto.HeaderText       = "Descripción";
            descripcionProducto.DataPropertyName = nameof(ReporteInventarioModelo.DescripcionProducto);

            var unidades = new DataGridViewTextBoxColumn();

            unidades.HeaderText       = "Unidades disponibles";
            unidades.DataPropertyName = nameof(ReporteInventarioModelo.UnidadesProducto);

            var inversionUnidades = new DataGridViewTextBoxColumn();

            inversionUnidades.HeaderText       = "Inversión Unidades";
            inversionUnidades.DataPropertyName = nameof(ReporteInventarioModelo.InversionUnidadesProducto);

            resultados_dtgv.Columns.Add(nombreProducto);
            resultados_dtgv.Columns.Add(descripcionProducto);
            resultados_dtgv.Columns.Add(unidades);
            resultados_dtgv.Columns.Add(inversionUnidades);
        }
Exemplo n.º 11
0
        private async void exportar_inventario_button_Click(object sender, EventArgs e)
        {
            var reporteFiltro = new ReporteFiltroModelo
            {
                IncluirProductosSinUnidades = false
            };

            var frm = new InventarioFiltroForm(this, reporteFiltro);

            this.Hide();
            frm.ShowDialog();
            this.Show();

            var destino = AbrirDialogoGuardar();

            if (destino == null)
            {
                return;
            }

            await ExportarReporte <ReporteInventarioModelo>(destino, reporteFiltro);

            reporteFiltro = null;
        }
Exemplo n.º 12
0
 public void FiltroCreado(ReporteFiltroModelo filtro)
 {
     reporteFiltro = filtro;
 }
Exemplo n.º 13
0
        /// <summary>
        /// Construye el query final para generar un reporte de ventas,
        /// lotes o inventario.
        /// </summary>
        /// <typeparam name="T">Tipo de reporte.</typeparam>
        /// <param name="filtro">
        /// Objeto principal de donde se generan las condiciones.
        /// Contiene condiciones para generar el query.
        /// </param>
        /// <param name="parametros">
        /// Objeto de la biblioteca Dapper que contiene los parametros del query.
        /// </param>
        /// <param name="comienzo">
        /// Util para paginar los resultados.
        /// </param>
        /// <param name="limiteFilas">
        /// Limite de filas a retornar.
        /// Util si los resultados se presentan al usuario.
        /// Util si se paginan los resultados.
        /// </param>
        /// <returns>
        /// El query final para generar el repote de tipo <paramref name="reporteTipo"/>
        /// </returns>
        public string ConstruirQueryReporte <T>(DynamicParameters parametros, ReporteFiltroModelo filtro = null, int?limiteFilas = null, int?comienzo = null)
        {
            string select     = "";
            string ordenacion = "";
            string agrupacion = "";
            string limite     = "limit -1";

            var reporteTipo = typeof(T);

            if (reporteTipo == typeof(ReporteLoteModelo))
            {
                select = @"select productos.Nombre as 'NombreProducto',
                                productos.Descripcion as 'DescripcionProducto',
                                lotes.PrecioVentaUnidad as 'PrecioVentaUnidad',
                                lotes.id as 'LoteId',
                                lotes.UnidadesCompradas as 'UnidadesCompradasLote',
                                lotes.UnidadesDisponibles as 'UnidadesDisponiblesLote',
                                lotes.Inversion as 'InversionLote',
                                datetime(lotes.FechaCreacion, 'unixepoch', 'localtime') as 'FechaAgregado'
                                from Productos
                                join lotes on lotes.ProductoId = productos.Id";

                ordenacion = "order by Lotes.Id desc";
            }
            else if (reporteTipo == typeof(ReporteVentaModelo))
            {
                select = @"select ventas.id as 'VentaId',
                            lotes.id as 'LoteId',
                            productos.nombre as 'NombreProducto',
                            ventas.Unidades as 'UnidadesVendidas',
                            lotes.Inversion 'InversionLote',
                            lotes.UnidadesCompradas as 'UnidadesCompradasLote',
                            ventas.PrecioVentaUnidad as 'PrecioVentaUnidad',
                            datetime(ventas.fecha, 'unixepoch', 'localtime') as 'FechaVenta',
                            clientes.Nombre || ' ' || coalesce(clientes.apellido, '') as 'NombreCliente'
                            from ventas
                            join lotes on lotes.id = ventas.LoteId
                            join productos on productos.id = lotes.ProductoId
                            left join Clientes on clientes.id = ventas.ClienteId";

                ordenacion = "order by Ventas.Id desc";
            }
            else if (reporteTipo == typeof(ReporteInventarioModelo))
            {
                select = @"select productos.id as 'ProductoId',
                        productos.nombre as 'NombreProducto',
                        productos.Descripcion as 'DescripcionProducto',
                        total(lotes.inversion / lotes.UnidadesCompradas * lotes.UnidadesDisponibles) as 'InversionUnidadesProducto',
                        sum(lotes.UnidadesDisponibles) as 'UnidadesProducto'
                        from Productos
                        left join lotes on lotes.ProductoId = productos.Id";

                agrupacion = "group by Productos.Id";
                ordenacion = "order by Productos.Id desc";
            }

            string condiciones = ConstruirCondicionesReporte <T>
                                 (
                filtro: filtro,
                parametros: parametros,
                comienzo: comienzo
                                 );

            if (limiteFilas != null)
            {
                limite = "limit @limiteFilas";
                parametros.Add("@limiteFilas", limiteFilas);
            }

            return($@"
                    { select }
                    { condiciones }
                    { agrupacion }
                    { ordenacion }
                    { limite }");
        }
Exemplo n.º 14
0
        /// <summary>
        ///     Genera y retorna reportes de ventas.
        /// </summary>
        /// <param name="filtro">
        ///     Objeto que contiene condiciones para generar el reporte.
        /// </param>
        /// <param name="limiteFilas">
        ///     Limite de filas a retornar. Util si la informacion se presentara al usuario.
        /// </param>
        /// <returns> Lista de reportes. </returns>
        public List <ReporteVentaModelo> CargarReporteVentas(ReporteFiltroModelo filtro = null, int?limiteFilas = null, int?comienzo = null)
        {
            var parametros = new DynamicParameters();

            var q = @"select lotes.id as 'LoteId', productos.nombre as 'NombreProducto', 
                            ventas.Unidades as 'UnidadesVendidas',
                            lotes.Inversion 'InversionLote',
                            lotes.UnidadesCompradas as 'UnidadesCompradasLote',
                            ventas.PrecioVentaUnidad as 'PrecioVentaUnidad',
                            datetime(ventas.fecha, 'unixepoch', 'localtime') as 'FechaVenta',
                            clientes.Nombre || ' ' || coalesce(clientes.apellido, '') as 'NombreCliente'
                            from ventas
                            join lotes on lotes.id = ventas.LoteId
                            join productos on productos.id = lotes.ProductoId
                            left join Clientes on clientes.id = ventas.ClienteId";

            // Contendran los joins y condiciones necesarios
            // para cumplir con las condiciones del filtro.
            var joins       = new List <string>();
            var condiciones = new List <string>();

            if (filtro != null)
            {
                // Si se filtra por categorias del producto.
                if (filtro.FiltroPorCategoria && filtro.Categoria != null)
                {
                    joins.Add("left join ProductoCategoria on ProductoCategoria.ProductoId = Productos.id");
                    condiciones.Add("ProductoCategoria.CategoriaId = @Id");
                    parametros.Add("@Id", filtro.Categoria.Id);
                }

                // Si se filtra por fecha de venta.
                if (filtro.FechaInicial != null && filtro.FechaFinal != null && filtro.FiltroPorFechas)
                {
                    condiciones.Add("ventas.fecha BETWEEN @F1 AND @F2");
                    parametros.Add("@F1", ((DateTimeOffset)filtro.FechaInicial).ToUnixTimeSeconds());
                    parametros.Add("@F2", ((DateTimeOffset)filtro.FechaFinal).ToUnixTimeSeconds());
                }

                // Si se filtra por tipo de producto.
                if (filtro.FiltroPorProducto && filtro.Producto != null)
                {
                    // Se utiliza case para forzar a sqlite
                    // a buscar los lotes a partir de la columna loteId en la tabla ventas
                    // (utilizando el index unico en la columna id de la tabla lotes)
                    // y luego seleccionar solamente los lotes asociados con el producto especificado.
                    // Sin case, sqlite decide buscar los lotes asociados con el producto especificado,
                    // y luego buscar las ventas a partir de estos lotes.
                    // Sin embargo, esto es ineficiente si hay muchos lotes asociados con el producto especificado.

                    // query plan sin case:
                    // SEARCH TABLE productos USING INTEGER PRIMARY KEY(rowid =?)
                    // SEARCH TABLE lotes USING INDEX idx_Lotes_ProductoId(ProductoId=?)
                    // SEARCH TABLE ventas USING INDEX idx_Ventas_LoteId(LoteId=?)

                    // query plan con case:
                    // SCAN / SEARCH TABLE ventas (search si se especifica un rango de fechas)
                    // SEARCH TABLE lotes USING INTEGER PRIMARY KEY(rowid=?)
                    // SEARCH TABLE productos USING INTEGER PRIMARY KEY(rowid =?)

                    // https://stackoverflow.com/a/49861947

                    condiciones.Add("(case when productos.id = @ProductoId then 1 end) = 1");
                    parametros.Add("@ProductoId", filtro.Producto.Id);
                }

                // Si se filtra por las compras de cierto cliente.
                if (filtro.FiltroPorCliente && filtro.Cliente != null)
                {
                    condiciones.Add("clientes.id = @ClienteId");
                    parametros.Add("@ClienteId", filtro.Cliente.Id);
                }
            }

            // Agregar los diferentes joins al query.
            if (joins.Count > 0)
            {
                q += " " + string.Join(" ", joins);
            }

            if (comienzo != null)
            {
                condiciones.Add("ventas.id > @Comienzo");
                parametros.Add("@Comienzo", comienzo);
            }

            // Agregar las condiciones al query.
            if (condiciones.Count > 0)
            {
                q += " where ";
                q += string.Join(" and ", condiciones);
            }

            q += " order by ventas.id asc";

            // Agregar el limite de filas a retornar.
            if (limiteFilas != null && limiteFilas > -1)
            {
                q += $" limit @Limite";
                parametros.Add("@Limite", limiteFilas);
            }

            // Generar reporte.
            using (IDbConnection conexion = new SQLiteConnection(stringConexion))
            {
                var reportes = conexion.Query <ReporteVentaModelo>(q, parametros).ToList();

                // Convertir representacion interna de la moneda a la representacion original.
                foreach (var reporte in reportes)
                {
                    reporte.InversionLote     = reporte.InversionLote / FactorConversion;
                    reporte.PrecioVentaUnidad = reporte.PrecioVentaUnidad / FactorConversion;
                }
                return(reportes);
            }
        }
Exemplo n.º 15
0
        /// <summary>
        ///     Genera y retorna una lista de reportes de inventario.
        /// </summary>
        /// <param name="filtro">
        ///     Objeto que contiene condiciones para generar los reportes.
        /// </param>
        /// <param name="limiteFilas">
        ///     Limite de filas a retonar.
        /// </param>
        /// <returns> Una lista de reportes. </returns>
        public List <ReporteInventarioModelo> CargarReporteInventario(ReporteFiltroModelo filtro = null, int?limiteFilas = null, int?comienzo = null)
        {
            var parametros = new DynamicParameters();

            var q = @"select productos.Nombre as 'NombreProducto',
                    productos.Descripcion as 'DescripcionProducto',
                    lotes.PrecioVentaUnidad as 'PrecioVentaUnidad',
                    lotes.id as 'LoteId',
                    lotes.UnidadesCompradas as 'UnidadesCompradasLote',
                    lotes.UnidadesDisponibles as 'UnidadesDisponiblesLote',
                    lotes.Inversion as 'InversionLote',
                    datetime(lotes.FechaCreacion, 'unixepoch', 'localtime') as 'FechaAgregado'
                    from Productos
                    join lotes on lotes.ProductoId = productos.Id";

            // Contendran los joins y condiciones necesarios
            // para cumplir con las condiciones del filtro.
            var joins       = new List <string>();
            var condiciones = new List <string>();

            if (filtro != null)
            {
                // Si se filtra por las categorias de los productos en el inventario.
                if (filtro.FiltroPorCategoria && filtro.Categoria != null)
                {
                    joins.Add("left join ProductoCategoria on ProductoCategoria.ProductoId = Productos.id");
                    condiciones.Add("ProductoCategoria.CategoriaId = @Id");
                    parametros.Add("@Id", filtro.Categoria.Id);
                }

                // Si se filtra por fecha de agregado al inventario.
                if (filtro.FechaInicial != null && filtro.FechaFinal != null && filtro.FiltroPorFechas)
                {
                    condiciones.Add("lotes.FechaCreacion BETWEEN @F1 AND @F2");
                    parametros.Add("@F1", ((DateTimeOffset)filtro.FechaInicial).ToUnixTimeSeconds());
                    parametros.Add("@F2", ((DateTimeOffset)filtro.FechaFinal).ToUnixTimeSeconds());
                }

                // Si se filtra por el tipo de producto.
                if (filtro.FiltroPorProducto && filtro.Producto != null)
                {
                    if (filtro.FechaInicial != null && filtro.FechaFinal != null && filtro.FiltroPorFechas)
                    {
                        // Se utiliza case para forzar a sqlite
                        // a que en caso de que se provea un rango de fechas
                        // en la que los lotes fueron creados, sqlite utilize
                        // el index en la columna lotes.FechaCreacion de primero
                        // y luego escoga solo los lotes asociados con el producto especificado.

                        // sin case, sqlite aparenta no utilizar el index de primero.
                        // Asumiendo que se proporciona un rango de fechas, aqui los query plans:

                        // query plan sin case:
                        // SEARCH TABLE Productos USING INTEGER PRIMARY KEY(rowid =?)
                        // SEARCH TABLE lotes USING INDEX idx_Lotes_ProductoId(ProductoId=?)

                        // query plan con case:
                        // SEARCH TABLE lotes USING INDEX idx_Lotes_FechaCreacion(FechaCreacion>? AND FechaCreacion <?)
                        // SEARCH TABLE Productos USING INTEGER PRIMARY KEY(rowid =?)

                        // https://stackoverflow.com/a/49861947
                        condiciones.Add("(case when productos.id = @ProductoId then 1 end) = 1");
                    }
                    else
                    {
                        condiciones.Add("productos.id = @ProductoId");
                    }
                    parametros.Add("@ProductoId", filtro.Producto.Id);
                }
            }

            // Agregar joins necesarios al query.
            if (joins.Count > 0)
            {
                q += " " + string.Join(" ", joins);
            }

            if (comienzo != null)
            {
                condiciones.Add("lotes.id > @Comienzo");
                parametros.Add("@Comienzo", comienzo);
            }

            // Agregar condiciones necesarias al query.
            if (condiciones.Count > 0)
            {
                q += " where ";
                q += string.Join(" and ", condiciones);
            }

            q += " order by lotes.id asc";

            // Agregar el limte de filas a retornar.
            if (limiteFilas != null)
            {
                q += $" limit @Limite";
                parametros.Add("@Limite", limiteFilas);
            }

            using (IDbConnection conexion = new SQLiteConnection(stringConexion))
            {
                conexion.Open();
                var reportes = conexion.Query <ReporteInventarioModelo>(q, parametros).ToList();

                foreach (var reporte in reportes)
                {
                    reporte.InversionLote     = reporte.InversionLote / FactorConversion;
                    reporte.PrecioVentaUnidad = reporte.PrecioVentaUnidad / FactorConversion;
                }

                return(reportes);
            }
        }
Exemplo n.º 16
0
        public async static Task ExportarReportes <T>(FileInfo destino, IEnumerable <T> reportes = null, ReporteFiltroModelo reporteFiltro = null) where T : IReporte
        {
            if (reportes != null)
            {
                await GuardarCsvReporteAsync <T>(destino, reportes);

                return;
            }

            await ExportarReportesPaginacion <T>(destino, reporteFiltro);
        }
Exemplo n.º 17
0
        /// <summary>
        /// Construye las condiciones necesarias de un query
        /// para generar el reporte de tipo <typeparamref name="T"/>
        /// </summary>
        /// <typeparam name="T">Tipo de reporte.</typeparam>
        /// <param name="filtro">
        /// Objeto principal de donde se generan las condiciones.
        /// Contiene condiciones para generar el query.
        /// </param>
        /// <param name="parametros">
        /// Objeto de la biblioteca Dapper que contiene los parametros del query.
        /// </param>
        /// <param name="comienzo">
        /// Util para paginar los resultados.
        /// </param>
        /// <returns>
        /// Una string con el formato "where [condicion1] and [condicion2] and..."
        /// que representa las condiciones necesarias para generar un reporte de tipo <typeparamref name="T"/>.
        /// Si el filtro es null o no tiene condiciones, se retorna String.Empty.
        /// </returns>
        public string ConstruirCondicionesReporte <T>(ReporteFiltroModelo filtro, DynamicParameters parametros, int?comienzo)
        {
            if (filtro == null)
            {
                return(string.Empty);
            }

            var reporteTipo = typeof(T);

            var condiciones = new List <string>();

            // Si se filtra por categorias del producto.
            if (filtro.Categorias != null && filtro.Categorias.Count > 0)
            {
                condiciones.Add(CondicionFiltroCategorias(parametros, filtro.Categorias));
            }


            // Si se filtra por fecha de creacion.

            var filtrarPorFechas = filtro.FiltroPorFechas &&
                                   reporteTipo != typeof(ReporteInventarioModelo);

            if (filtrarPorFechas)
            {
                if (reporteTipo == typeof(ReporteLoteModelo))
                {
                    condiciones.Add("Lotes.FechaCreacion BETWEEN @F1 AND @F2");
                }
                else if (reporteTipo == typeof(ReporteVentaModelo))
                {
                    condiciones.Add("Ventas.Fecha BETWEEN @F1 AND @F2");
                }
                parametros.Add("@F1", ((DateTimeOffset)filtro.FechaInicial).ToUnixTimeSeconds());
                parametros.Add("@F2", ((DateTimeOffset)filtro.FechaFinal).ToUnixTimeSeconds());
            }

            // Si se filtra por el tipo de producto.
            if (filtro.FiltroPorProducto && filtro.Producto != null)
            {
                if (filtrarPorFechas)
                {
                    condiciones.Add("(case when Productos.Id = @ProductoId then 1 end) = 1");
                }
                else
                {
                    condiciones.Add("Productos.Id = @ProductoId");
                }
                parametros.Add("@ProductoId", filtro.Producto.Id);
            }

            // Si solo se incluyen lotes con unidades disponibles en un reporte de lotes.

            var incluirLotesSinUnidades = filtro.IncluirLotesSinUnidades == false &&
                                          reporteTipo == typeof(ReporteLoteModelo);

            if (incluirLotesSinUnidades)
            {
                condiciones.Add("Lotes.UnidadesDisponibles > 0");
            }

            // Si solo se incluyen productos con unidades disponibles en un reporte de inventario.

            var incluirProductosSinUnidades = filtro.IncluirProductosSinUnidades == false &&
                                              reporteTipo == typeof(ReporteInventarioModelo);

            if (incluirProductosSinUnidades)
            {
                condiciones.Add("Lotes.UnidadesDisponibles > 0");
            }

            // Si se filtra por las compras de cierto cliente.

            var filtrarPorCliente = filtro.FiltroPorCliente &&
                                    filtro.Cliente != null &&
                                    reporteTipo == typeof(ReporteVentaModelo);

            if (filtrarPorCliente)
            {
                condiciones.Add("Clientes.Id = @ClienteId");
                parametros.Add("@ClienteId", filtro.Cliente.Id);
            }

            if (comienzo != null)
            {
                if (reporteTipo == typeof(ReporteVentaModelo))
                {
                    condiciones.Add("Ventas.Id < @Comienzo");
                }
                else if (reporteTipo == typeof(ReporteLoteModelo))
                {
                    condiciones.Add("Lotes.Id < @Comienzo");
                }
                else if (reporteTipo == typeof(ReporteInventarioModelo))
                {
                    condiciones.Add("Productos.Id < @Comienzo");
                }
                parametros.Add("@Comienzo", comienzo);
            }

            if (condiciones.Count < 1)
            {
                return(string.Empty);
            }

            return(" where " + string.Join(" and ", condiciones));
        }