Esempio n. 1
0
        private void CargarDatosPorTipo()
        {
            Cargando.Mostrar();

            var oFuenteT = new Font(FontFamily.GenericSansSerif, 9, FontStyle.Bold);

            // Se limpian los datos
            this.dgvDatos.Rows.Clear();
            foreach (var oSerie in this.chrPorSemana.Series)
            {
                oSerie.Points.Clear();
            }

            // Se borran las columnas de semanas
            for (int iCol = (this.dgvDatos.Columns.Count - 1); iCol >= this.iColumnasFijas; iCol--)
            {
                this.dgvDatos.Columns.RemoveAt(iCol);
            }
            // Se llenan las columnas
            string sPrefijo = "";

            switch (this.cmbTipo.Text)
            {
            case "Mensual":
                sPrefijo = "Mes";
                for (int iMes = 1; iMes <= 12; iMes++)
                {
                    this.dgvDatos.Columns.Add((sPrefijo + iMes.ToString()), DateTimeFormatInfo.CurrentInfo.GetAbbreviatedMonthName(iMes).PrimeraMayus());
                }
                break;

            case "Trimestral":
                sPrefijo = "Tri";
                for (int iMes = 1; iMes <= 12; iMes += 3)
                {
                    this.dgvDatos.Columns.Add((sPrefijo + iMes.ToString()), DateTimeFormatInfo.CurrentInfo.GetAbbreviatedMonthName(iMes).PrimeraMayus());
                }
                break;

            case "Semestral":
                sPrefijo = "Sem";
                for (int iMes = 1; iMes <= 12; iMes += 6)
                {
                    this.dgvDatos.Columns.Add((sPrefijo + iMes.ToString()), DateTimeFormatInfo.CurrentInfo.GetAbbreviatedMonthName(iMes).PrimeraMayus());
                }
                break;
            }
            this.FormatoColumnas();

            // Se obtienen los datos para los ingresos
            int      iAnio       = Util.Entero(this.cmbAnio.Text);
            int      iSucursalID = Util.Entero(this.cmbSucursal.SelectedValue);
            DateTime dDesde      = new DateTime(iAnio, 1, 1);
            DateTime dHasta      = new DateTime(iAnio, 12, 31);
            DateTime dHastaMas1  = dHasta.AddDays(1);
            var      oParams     = new Dictionary <string, object>();

            oParams.Add("SucursalID", (iSucursalID == 0 ? null : (int?)iSucursalID));
            oParams.Add("Pagadas", true);
            oParams.Add("Cobradas", false);
            oParams.Add("Solo9500", false);
            oParams.Add("OmitirDomingo", false);
            oParams.Add("Desde", dDesde);
            oParams.Add("Hasta", dHasta);

            var oDatos = Datos.ExecuteProcedure <pauCuadroDeControlGeneralNuevo_Result>("pauCuadroDeControlGeneral", oParams);

            oDatos = oDatos.Where(c => c.Fecha >= dDesde).ToList();

            List <ConsultaEdr> oConsulta = null;

            switch (this.cmbTipo.Text)
            {
            case "Mensual":
                oConsulta = oDatos.GroupBy(c => new { Mes = c.Fecha.Month, c.Sucursal })
                            .Select(c => new ConsultaEdr()
                {
                    Mes            = c.Key.Mes, Sucursal = c.Key.Sucursal
                    , PrecioSinIva = c.Sum(s => s.PrecioSinIvaActual).Valor(), Costo = c.Sum(s => s.CostoDescActual).Valor()
                })
                            .OrderBy(c => c.Sucursal).ThenBy(c => c.Mes).ToList();
                break;

            case "Trimestral":
                oConsulta = oDatos.GroupBy(c => new { Mes = UtilTheos.ObtenerTrimestre(c.Fecha), Sucursal = c.Sucursal })
                            .Select(c => new ConsultaEdr()
                {
                    Mes            = c.Key.Mes, Sucursal = c.Key.Sucursal
                    , PrecioSinIva = c.Sum(s => s.PrecioSinIvaActual).Valor(), Costo = c.Sum(s => s.CostoDescActual).Valor()
                })
                            .OrderBy(c => c.Sucursal).ThenBy(c => c.Mes).ToList();
                break;

            case "Semestral":
                oConsulta = oDatos.GroupBy(c => new { Mes = UtilTheos.ObtenerSemestre(c.Fecha), Sucursal = c.Sucursal })
                            .Select(c => new ConsultaEdr()
                {
                    Mes            = c.Key.Mes, Sucursal = c.Key.Sucursal
                    , PrecioSinIva = c.Sum(s => s.PrecioSinIvaActual).Valor(), Costo = c.Sum(s => s.CostoDescActual).Valor()
                })
                            .OrderBy(c => c.Sucursal).ThenBy(c => c.Mes).ToList();
                break;
            }

            // Se agrega la fila de ingresos
            int iFilaIngresos = this.dgvDatos.Rows.Add("+ Ingresos", oConsulta.Sum(c => c.PrecioSinIva), oConsulta.Average(c => c.PrecioSinIva));

            this.dgvDatos.Rows[iFilaIngresos].DefaultCellStyle.Font = oFuenteT;
            // Se llenan los ingresos
            string sSucursal = "";
            int    iFila     = 0;

            foreach (var oReg in oConsulta)
            {
                if (sSucursal != oReg.Sucursal)
                {
                    sSucursal = oReg.Sucursal;
                    iFila     = this.dgvDatos.Rows.Add(sSucursal, oConsulta.Where(c => c.Sucursal == sSucursal).Sum(c => c.PrecioSinIva)
                                                       , oConsulta.Where(c => c.Sucursal == sSucursal).Average(c => c.PrecioSinIva));
                }

                string sColumna = (sPrefijo + oReg.Mes.ToString());
                this.dgvDatos[sColumna, iFila].Value         = (Util.Decimal(this.dgvDatos[sColumna, iFila].Value) + oReg.PrecioSinIva);
                this.dgvDatos[sColumna, iFilaIngresos].Value = (Util.Decimal(this.dgvDatos[sColumna, iFilaIngresos].Value) + oReg.PrecioSinIva);
            }

            // Se agrega la fila de Costos
            int iFilaCostos = this.dgvDatos.Rows.Add("- Costos", oConsulta.Sum(c => c.Costo), oConsulta.Average(c => c.Costo));

            this.dgvDatos.Rows[iFilaCostos].DefaultCellStyle.Font = oFuenteT;
            // Se llenan los costos
            sSucursal = "";
            foreach (var oReg in oConsulta)
            {
                if (sSucursal != oReg.Sucursal)
                {
                    sSucursal = oReg.Sucursal;
                    iFila     = this.dgvDatos.Rows.Add(sSucursal, oConsulta.Where(c => c.Sucursal == sSucursal).Sum(c => c.Costo)
                                                       , oConsulta.Where(c => c.Sucursal == sSucursal).Average(c => c.Costo));
                }

                string sColumna = (sPrefijo + oReg.Mes.ToString());
                this.dgvDatos[sColumna, iFila].Value       = (Util.Decimal(this.dgvDatos[sColumna, iFila].Value) + oReg.Costo);
                this.dgvDatos[sColumna, iFilaCostos].Value = (Util.Decimal(this.dgvDatos[sColumna, iFilaCostos].Value) + oReg.Costo);
            }

            // Se agrega la fila de margen bruto
            int iFilaMargen = this.dgvDatos.Rows.Add("= Margen Bruto");

            this.dgvDatos.Rows[iFilaMargen].DefaultCellStyle.Font = oFuenteT;
            foreach (DataGridViewColumn oCol in this.dgvDatos.Columns)
            {
                if (oCol.Index == 0)
                {
                    continue;
                }
                this.dgvDatos[oCol.Index, iFilaMargen].Value = (
                    Util.Decimal(this.dgvDatos[oCol.Index, iFilaIngresos].Value)
                    - Util.Decimal(this.dgvDatos[oCol.Index, iFilaCostos].Value)
                    );
            }

            // Se obtienen los datos para los gastos
            oParams.Clear();
            oParams.Add("Desde", dDesde);
            oParams.Add("Hasta", dHasta);
            var oGastos = Datos.GetListOf <ContaEgresosView>(c => c.Fecha >= dDesde && c.Fecha < dHastaMas1);

            oConsulta = null;
            switch (this.cmbTipo.Text)
            {
            case "Mensual":
                oConsulta = oGastos.GroupBy(c => new { Mes = c.Fecha.Month, c.Sucursal })
                            .Select(c => new ConsultaEdr()
                {
                    Mes = c.Key.Mes, Sucursal = c.Key.Sucursal, Importe = c.Sum(s => s.ImporteDev).Valor()
                })
                            .OrderBy(c => c.Sucursal).ThenBy(c => c.Mes).ToList();
                break;

            case "Trimestral":
                oConsulta = oGastos.GroupBy(c => new { Mes = UtilTheos.ObtenerTrimestre(c.Fecha), c.Sucursal })
                            .Select(c => new ConsultaEdr()
                {
                    Mes = c.Key.Mes, Sucursal = c.Key.Sucursal, Importe = c.Sum(s => s.ImporteDev).Valor()
                })
                            .OrderBy(c => c.Sucursal).ThenBy(c => c.Mes).ToList();
                break;

            case "Semestral":
                oConsulta = oGastos.GroupBy(c => new { Mes = UtilTheos.ObtenerSemestre(c.Fecha), c.Sucursal })
                            .Select(c => new ConsultaEdr()
                {
                    Mes = c.Key.Mes, Sucursal = c.Key.Sucursal, Importe = c.Sum(s => s.ImporteDev).Valor()
                })
                            .OrderBy(c => c.Sucursal).ThenBy(c => c.Mes).ToList();
                break;
            }

            // Se agrega la fila de los Gastos
            int iFilaGastos = this.dgvDatos.Rows.Add("- Gastos", oConsulta.Sum(c => c.Importe), oConsulta.Average(c => c.Importe));

            this.dgvDatos.Rows[iFilaGastos].DefaultCellStyle.Font = oFuenteT;
            // Se llenan los gastos
            sSucursal = "";
            foreach (var oReg in oConsulta)
            {
                if (sSucursal != oReg.Sucursal)
                {
                    sSucursal = oReg.Sucursal;
                    iFila     = this.dgvDatos.Rows.Add(sSucursal, oConsulta.Where(c => c.Sucursal == sSucursal).Sum(c => c.Importe)
                                                       , oConsulta.Where(c => c.Sucursal == sSucursal).Average(c => c.Importe));
                }

                string sColumna = (sPrefijo + oReg.Mes.ToString());
                this.dgvDatos[sColumna, iFila].Value       = (Util.Decimal(this.dgvDatos[sColumna, iFila].Value) + oReg.Importe);
                this.dgvDatos[sColumna, iFilaGastos].Value = (Util.Decimal(this.dgvDatos[sColumna, iFilaGastos].Value) + oReg.Importe);
            }

            // Se agrega la fila de utilidad, con cada una de las sucursales
            int iFilaUtilidad = this.dgvDatos.Rows.Add("= Utilidad");

            this.dgvDatos.Rows[iFilaUtilidad].DefaultCellStyle.Font = oFuenteT;
            // Sucursales
            var oSucursales = Datos.GetListOf <Sucursal>(c => c.Estatus).OrderBy(c => c.NombreSucursal).ToList();

            foreach (var oReg in oSucursales)
            {
                this.dgvDatos.Rows.Add(oReg.NombreSucursal);
            }
            // Se llenan los datos
            foreach (DataGridViewColumn oCol in this.dgvDatos.Columns)
            {
                if (oCol.Index == 0)
                {
                    continue;
                }
                // Utilidad total
                this.dgvDatos[oCol.Index, iFilaUtilidad].Value = (
                    Util.Decimal(this.dgvDatos[oCol.Index, iFilaMargen].Value)
                    - Util.Decimal(this.dgvDatos[oCol.Index, iFilaGastos].Value)
                    );
                // Sucursales
                for (int i = 1; i <= oSucursales.Count; i++)
                {
                    this.dgvDatos[oCol.Index, iFilaUtilidad + i].Value = (
                        Util.Decimal(this.dgvDatos[oCol.Index, iFilaIngresos + i].Value)
                        - Util.Decimal(this.dgvDatos[oCol.Index, iFilaCostos + i].Value)
                        - Util.Decimal(this.dgvDatos[oCol.Index, iFilaGastos + i].Value)
                        );
                }
            }

            // Se obtienen los datos de gastos especiales
            var oGastosEsp = Datos.GetListOf <ContaEgresosDevengadoEspecialCuentasView>(c => c.Fecha >= dDesde && c.Fecha < dHastaMas1);

            oConsulta = null;
            switch (this.cmbTipo.Text)
            {
            case "Mensual":
                oConsulta = oGastosEsp.GroupBy(c => new { Mes = c.Fecha.Month, c.Duenio })
                            .Select(c => new ConsultaEdr()
                {
                    Mes = c.Key.Mes, Sucursal = c.Key.Duenio, Importe = c.Sum(s => s.ImporteDev)
                })
                            .OrderBy(c => c.Sucursal).ThenBy(c => c.Mes).ToList();
                break;

            case "Trimestral":
                oConsulta = oGastosEsp.GroupBy(c => new { Mes = UtilTheos.ObtenerTrimestre(c.Fecha), c.Duenio })
                            .Select(c => new ConsultaEdr()
                {
                    Mes = c.Key.Mes, Sucursal = c.Key.Duenio, Importe = c.Sum(s => s.ImporteDev)
                })
                            .OrderBy(c => c.Sucursal).ThenBy(c => c.Mes).ToList();
                break;

            case "Semestral":
                oConsulta = oGastosEsp.GroupBy(c => new { Mes = UtilTheos.ObtenerSemestre(c.Fecha), c.Duenio })
                            .Select(c => new ConsultaEdr()
                {
                    Mes = c.Key.Mes, Sucursal = c.Key.Duenio, Importe = c.Sum(s => s.ImporteDev)
                })
                            .OrderBy(c => c.Sucursal).ThenBy(c => c.Mes).ToList();
                break;
            }

            // Se agrega la fila de Especiales
            bool bHay     = (oConsulta.Count() > 0);
            int  iFilaEsp = this.dgvDatos.Rows.Add("- Especiales", (bHay ? oConsulta.Sum(c => c.Importe) : 0), (bHay ? oConsulta.Average(c => c.Importe) : 0));

            this.dgvDatos.Rows[iFilaEsp].DefaultCellStyle.Font = oFuenteT;
            // Se llenan los gastos
            string sDuenio = "";

            foreach (var oReg in oConsulta)
            {
                if (sDuenio != oReg.Sucursal)
                {
                    sDuenio = oReg.Sucursal;
                    iFila   = this.dgvDatos.Rows.Add(sDuenio, oConsulta.Where(c => c.Sucursal == sDuenio).Sum(c => c.Importe)
                                                     , oConsulta.Where(c => c.Sucursal == sDuenio).Average(c => c.Importe));
                }

                string sColumna = (sPrefijo + oReg.Mes.ToString());
                this.dgvDatos[sColumna, iFila].Value    = (Util.Decimal(this.dgvDatos[sColumna, iFila].Value) + oReg.Importe);
                this.dgvDatos[sColumna, iFilaEsp].Value = (Util.Decimal(this.dgvDatos[sColumna, iFilaEsp].Value) + oReg.Importe);
            }

            // Se agrega la fila de utilidad neta
            int iFilaDividendos = this.dgvDatos.Rows.Add("= Dividendos");

            this.dgvDatos.Rows[iFilaDividendos].DefaultCellStyle.Font = oFuenteT;
            foreach (DataGridViewColumn oCol in this.dgvDatos.Columns)
            {
                if (oCol.Index == 0)
                {
                    continue;
                }
                this.dgvDatos[oCol.Index, iFilaDividendos].Value = (
                    Util.Decimal(this.dgvDatos[oCol.Index, iFilaMargen].Value)
                    - Util.Decimal(this.dgvDatos[oCol.Index, iFilaGastos].Value)
                    - Util.Decimal(this.dgvDatos[oCol.Index, iFilaEsp].Value)
                    );
            }

            // Se obtienen los datos para lo de reinversión
            var oReinversiones = Datos.GetListOf <ContaPolizasDetalleAvanzadoView>(c => c.FechaPoliza >= dDesde && c.FechaPoliza < dHastaMas1 &&
                                                                                   (
                                                                                       c.ContaCuentaDeMayorID == Cat.ContaCuentasDeMayor.CuentasPorPagarLargoPlazo ||
                                                                                       (c.ContaCuentaDeMayorID == Cat.ContaCuentasDeMayor.CuentasPorPagarCortoPlazo && c.ContaCuentaAuxiliarID != Cat.ContaCuentasAuxiliares.TarjetaDeCredito) ||
                                                                                       c.ContaCuentaDeMayorID == Cat.ContaCuentasDeMayor.AcreedoresDiversos ||
                                                                                       (c.ContaSubcuentaID == Cat.ContaSubcuentas.ActivoFijo && c.ContaCuentaDeMayorID != Cat.ContaCuentasDeMayor.Edificios)
                                                                                   ));
            var oDeudas = oReinversiones.Where(c => c.ContaCuentaDeMayorID == Cat.ContaCuentasDeMayor.CuentasPorPagarLargoPlazo ||
                                               c.ContaCuentaDeMayorID == Cat.ContaCuentasDeMayor.CuentasPorPagarCortoPlazo || c.ContaCuentaDeMayorID == Cat.ContaCuentasDeMayor.AcreedoresDiversos);
            var oInversiones = oReinversiones.Where(c => c.ContaSubcuentaID == Cat.ContaSubcuentas.ActivoFijo);

            List <ConsultaEdr> oDeudasGr      = null;
            List <ConsultaEdr> oInversionesGr = null;

            switch (this.cmbTipo.Text)
            {
            case "Mensual":
                oDeudasGr = oDeudas.GroupBy(c => c.FechaPoliza.Valor().Month).Select(c => new ConsultaEdr()
                {
                    Mes = c.Key, Importe = c.Sum(s => s.Cargo)
                }).ToList();
                oInversionesGr = oInversiones.GroupBy(c => c.FechaPoliza.Valor().Month).Select(c => new ConsultaEdr()
                {
                    Mes = c.Key, Importe = c.Sum(s => s.Cargo)
                }).ToList();
                break;

            case "Trimestral":
                oDeudasGr = oDeudas.GroupBy(c => UtilTheos.ObtenerTrimestre(c.FechaPoliza.Valor()))
                            .Select(c => new ConsultaEdr()
                {
                    Mes = c.Key, Importe = c.Sum(s => s.Cargo)
                }).ToList();
                oInversionesGr = oInversiones.GroupBy(c => UtilTheos.ObtenerTrimestre(c.FechaPoliza.Valor()))
                                 .Select(c => new ConsultaEdr()
                {
                    Mes = c.Key, Importe = c.Sum(s => s.Cargo)
                }).ToList();
                break;

            case "Semestral":
                oDeudasGr = oDeudas.GroupBy(c => UtilTheos.ObtenerSemestre(c.FechaPoliza.Valor()))
                            .Select(c => new ConsultaEdr()
                {
                    Mes = c.Key, Importe = c.Sum(s => s.Cargo)
                }).ToList();
                oInversionesGr = oInversiones.GroupBy(c => UtilTheos.ObtenerSemestre(c.FechaPoliza.Valor()))
                                 .Select(c => new ConsultaEdr()
                {
                    Mes = c.Key, Importe = c.Sum(s => s.Cargo)
                }).ToList();
                break;
            }

            // Se agrega la fila de Reinversión
            decimal mDeudas          = (oDeudasGr.Count() > 0 ? oDeudasGr.Sum(c => c.Importe) : 0);
            decimal mDeudasProm      = (oDeudasGr.Count() > 0 ? oDeudasGr.Average(c => c.Importe) : 0);
            decimal mInversiones     = (oInversionesGr.Count() > 0 ? oInversionesGr.Sum(c => c.Importe) : 0);
            decimal mInversionesProm = (oInversionesGr.Count() > 0 ? oInversionesGr.Average(c => c.Importe) : 0);
            int     iFilaReinversion = this.dgvDatos.Rows.Add("- Reinversión", (mDeudas + mInversiones), ((mDeudasProm + mInversionesProm) / 2));

            this.dgvDatos.Rows[iFilaReinversion].DefaultCellStyle.Font = oFuenteT;
            // Se llenan los datos de reinversión
            // Deudas
            iFila = this.dgvDatos.Rows.Add("Deudas", mDeudas, mDeudasProm);
            foreach (var oReg in oDeudasGr)
            {
                string sColumna = (sPrefijo + oReg.Mes.ToString());
                this.dgvDatos[sColumna, iFila].Value            = (Util.Decimal(this.dgvDatos[sColumna, iFila].Value) + oReg.Importe);
                this.dgvDatos[sColumna, iFilaReinversion].Value = (Util.Decimal(this.dgvDatos[sColumna, iFilaReinversion].Value) + oReg.Importe);
            }
            // Inversión
            iFila = this.dgvDatos.Rows.Add("Inversiones", mInversiones, mInversionesProm);
            foreach (var oReg in oInversionesGr)
            {
                string sColumna = (sPrefijo + oReg.Mes.ToString());
                this.dgvDatos[sColumna, iFila].Value            = (Util.Decimal(this.dgvDatos[sColumna, iFila].Value) + oReg.Importe);
                this.dgvDatos[sColumna, iFilaReinversion].Value = (Util.Decimal(this.dgvDatos[sColumna, iFilaReinversion].Value) + oReg.Importe);
            }

            // Se agrega el saldo final
            int iFilaSaldo = this.dgvDatos.Rows.Add("= Saldo final");

            this.dgvDatos.Rows[iFilaSaldo].DefaultCellStyle.Font = oFuenteT;
            foreach (DataGridViewColumn oCol in this.dgvDatos.Columns)
            {
                if (oCol.Index == 0)
                {
                    continue;
                }
                this.dgvDatos[oCol.Index, iFilaSaldo].Value = (
                    Util.Decimal(this.dgvDatos[oCol.Index, iFilaDividendos].Value)
                    - Util.Decimal(this.dgvDatos[oCol.Index, iFilaReinversion].Value)
                    );
            }

            // Se llena la gráfica, en base al grid ya cargado
            for (int iCol = this.iColumnasFijas; iCol < this.dgvDatos.Columns.Count; iCol++)
            {
                this.chrPorSemana.Series["Ingresos"].Points.AddY(Util.Decimal(this.dgvDatos[iCol, iFilaIngresos].Value));
                this.chrPorSemana.Series["Costos"].Points.AddY(Util.Decimal(this.dgvDatos[iCol, iFilaCostos].Value));
                this.chrPorSemana.Series["Margen"].Points.AddY(Util.Decimal(this.dgvDatos[iCol, iFilaMargen].Value));
                this.chrPorSemana.Series["Gastos"].Points.AddY(Util.Decimal(this.dgvDatos[iCol, iFilaGastos].Value));
                this.chrPorSemana.Series["Utilidad"].Points.AddY(Util.Decimal(this.dgvDatos[iCol, iFilaUtilidad].Value));
                this.chrPorSemana.Series["Especiales"].Points.AddY(Util.Decimal(this.dgvDatos[iCol, iFilaEsp].Value));
                this.chrPorSemana.Series["Dividendos"].Points.AddY(Util.Decimal(this.dgvDatos[iCol, iFilaDividendos].Value));
            }

            Cargando.Cerrar();
        }