public DsReporteTrazabilidad GetGuiasReporteTrazabilidad(bool rendEmitNoRecibidas, bool rendEmitRecibidas, bool rendConfNoRecibidas, bool rendConfRecibidas, bool rendConfControladasNoDigit, int agrupadoPor)
        {
            DsReporteTrazabilidad ds                  = new DsReporteTrazabilidad();
            SqlParameter          pAgencias           = new SqlParameter("@Agencias", Utiles.BaseDatos.StrToSql(this.ListaAgencia)),
                                  pFechasEmision      = new SqlParameter("@FechasEmision", Utiles.BaseDatos.StrToSql(this.listaFechaEmision)),
                                  pFechasConformacion = new SqlParameter("@FechasConformacion", Utiles.BaseDatos.StrToSql(this.listaFechaConformacion)),
                                  pFechasRecepcion    = new SqlParameter("@FechasRecepcion", Utiles.BaseDatos.StrToSql(this.listaFechaRecepcion)),
                                  pFechasControl      = new SqlParameter("@FechasControl", Utiles.BaseDatos.StrToSql(this.listaFechaControl)),
                                  pNroSucursalPlla    = new SqlParameter("@NroSucursalPlla", Utiles.BaseDatos.StrToSql(this.nroSucursalPlla)),
                                  pNroRendicion       = new SqlParameter("@NroRendicion", Utiles.BaseDatos.StrToSql(this.nroRendicion)),
                                  pZonas                      = new SqlParameter("@Zonas", Utiles.BaseDatos.StrToSql(this.listaZona)),
                                  pEjecutivosCuenta           = new SqlParameter("@EjecutivosCuenta", Utiles.BaseDatos.StrToSql(this.listaEjecutivoCuenta)),
                                  pRendEmitNoRecibidas        = new SqlParameter("@RendEmitNoRecibidas", rendEmitNoRecibidas),
                                  pRendEmitRecibidas          = new SqlParameter("@RendEmitRecibidas", rendEmitRecibidas),
                                  pRendConfNoRecibidas        = new SqlParameter("@RendConfNoRecibidas", rendConfNoRecibidas),
                                  pRendConfRecibidas          = new SqlParameter("@RendConfRecibidas", rendConfRecibidas),
                                  pRendConfControladasNoDigit = new SqlParameter("@RendConfControladasNoDigit", rendConfControladasNoDigit),
                                  pAgrupadoPor                = new SqlParameter("@AgrupadoPor", agrupadoPor);

            Config.Conexion.LlenarTypeDataSet(ds.Datos, System.Data.CommandType.StoredProcedure, "ReporteTrazabilidadRendicion", pAgencias, pFechasEmision, pFechasConformacion, pFechasRecepcion, pFechasControl, pNroSucursalPlla, pNroRendicion, pZonas, pEjecutivosCuenta, pRendEmitNoRecibidas, pRendEmitRecibidas, pRendConfNoRecibidas, pRendConfRecibidas, pRendConfControladasNoDigit, pAgrupadoPor);

            return(ds);
        }
        private void BindGrid(int currentPage)
        {
            DataSet ds = new DataSet();

            // Tengo que mostrarlos de forma resumida. Configuro la grilla a mostrar
            SisPackController.AdministrarGrillas.Configurar(this.hgCabecera, "AgenciaID", 20);

            // Cargo los filtros
            IReporteTrazabilidad  reporte   = this.SetFiltros();
            DsReporteTrazabilidad dsGuiasRT = new DsReporteTrazabilidad();

            // Reviso si los datos ya estan en memoria o tengo que cargarlos
            if (Session["dsGuiasRT"] == null)
            {
                // Tengo que cargarlos. Los busco y los cargo en memoria
                dsGuiasRT            = reporte.GetGuiasReporteTrazabilidad(this.chkRendEmitidasNoRecAControlar.Checked, this.chkRendEmitidasRecAControlarNoControladas.Checked, this.chkRendConformadasNoRecAControlar.Checked, this.chkRendConformadasRecAControlarNoControladas.Checked, this.chkRendConformadasControladasNoDig.Checked, this.ddlAgrupadoPor.SelectedIndex);
                Session["dsGuiasRT"] = dsGuiasRT;
            }
            else
            {
                // Los datos estan en memoria. Los cargo en el objeto dsGuiasTDE
                dsGuiasRT = (DsReporteTrazabilidad)Session["dsGuiasRT"];
            }

            // Clono la estructura de la tabla
            ds.Tables.Add(dsGuiasRT.Datos.Clone());
            ds.Tables[0].TableName = "GuiasEmitidas";

            ds.Tables.Add(dsGuiasRT.Datos.Clone());
            ds.Tables[1].TableName = "GuiasConformadas";

            string agenciasEmitidas    = "";
            string agenciasConformadas = "";
            string agencias            = "";

            agenciasEmitidas    = ",";
            agenciasConformadas = ",";
            agencias            = ",";
            foreach (DsReporteTrazabilidad.DatosRow row in dsGuiasRT.Datos.Rows)
            {
                if (row.TipoResultado.Equals("RE"))
                {
                    ds.Tables["GuiasEmitidas"].ImportRow(row);
                }
                else
                {
                    ds.Tables["GuiasConformadas"].ImportRow(row);
                }

                switch (this.ddlAgrupadoPor.SelectedValue)
                {
                case "Agencia":     /* Visualiza emitidas y conformadas */
                    if (row.TipoResultado.Equals("RE"))
                    {
                        if (agenciasEmitidas.IndexOf("," + row["AgenciaOrigenID"] + ",") == -1)
                        {
                            agenciasEmitidas += row["AgenciaOrigenID"] + ",";
                        }

                        if (agencias.IndexOf("," + row["AgenciaOrigenID"] + ",") == -1)
                        {
                            agencias += row["AgenciaOrigenID"] + ",";
                        }
                    }
                    else
                    {
                        if (agenciasConformadas.IndexOf("," + row["AgenciaDestinoID"] + ",") == -1)
                        {
                            agenciasConformadas += row["AgenciaDestinoID"] + ",";
                        }

                        if (agencias.IndexOf("," + row["AgenciaDestinoID"] + ",") == -1)
                        {
                            agencias += row["AgenciaDestinoID"] + ",";
                        }
                    }
                    break;

                case "AgenciaOrigen":     /* Visualiza sólo emitidas */
                    if (row.TipoResultado.Equals("RE"))
                    {
                        if (agencias.IndexOf("," + row["AgenciaOrigenID"] + ",") == -1)
                        {
                            agencias         += row["AgenciaOrigenID"] + ",";
                            agenciasEmitidas += row["AgenciaOrigenID"] + ",";
                        }
                    }
                    break;

                case "AgenciaDestino":     /* Visualiza sólo conformadas */
                    if (row.TipoResultado.Equals("RC"))
                    {
                        if (agencias.IndexOf("," + row["AgenciaDestinoID"] + ",") == -1)
                        {
                            agencias            += row["AgenciaDestinoID"] + ",";
                            agenciasConformadas += row["AgenciaDestinoID"] + ",";
                        }
                    }
                    break;
                }
            }

            if (agenciasEmitidas.Length > 1)
            {
                agenciasEmitidas = agenciasEmitidas.Substring(1);
            }
            else
            {
                agenciasEmitidas = "";
            }

            if (agenciasConformadas.Length > 1)
            {
                agenciasConformadas = agenciasConformadas.Substring(1);
            }
            else
            {
                agenciasConformadas = "";
            }

            if (agencias.Length > 1)
            {
                agencias = agencias.Substring(1);
            }
            else
            {
                agencias = "";
            }

            // Creo en el DataSet ds una tabla para las agencias
            IAgencia agencia = AgenciaFactory.GetAgencia();

            DsAgencias dsAgencias            = new DsAgencias();
            DsAgencias dsAgenciasEmitidas    = new DsAgencias();
            DsAgencias dsAgenciasConformadas = new DsAgencias();

            // Reviso si las agencias a mostrar estan cargadas en memoria
            if (Session["dsAgencias"] == null)
            {
                // No estan cargadas en memoria. Las busco
                dsAgenciasEmitidas    = agencia.GetAgenciasByIdsDataSet(agenciasEmitidas);
                dsAgenciasConformadas = agencia.GetAgenciasByIdsDataSet(agenciasConformadas);
                dsAgencias            = agencia.GetAgenciasByIdsDataSet(agencias);

                // Le agrego al dataset dsAgencias las columnas Promedio Ponderado y CantidadGuias
                dsAgenciasEmitidas.Datos.Columns.Add("ImporteTotalGuiasContado", System.Type.GetType("System.Double"));
                dsAgenciasEmitidas.Datos.Columns.Add("CumpRendicion", System.Type.GetType("System.Double"));
                dsAgenciasEmitidas.Datos.Columns.Add("CumpControl", System.Type.GetType("System.Double"));
                dsAgenciasEmitidas.Datos.Columns.Add("CantidadGuias", System.Type.GetType("System.Int32"));

                // Le agrego al dataset dsAgencias las columnas Promedio Ponderado y CantidadGuias
                dsAgenciasConformadas.Datos.Columns.Add("CumpRendicion", System.Type.GetType("System.Double"));
                dsAgenciasConformadas.Datos.Columns.Add("CumpControl", System.Type.GetType("System.Double"));
                dsAgenciasConformadas.Datos.Columns.Add("CumpDigitalizacion", System.Type.GetType("System.Double"));
                dsAgenciasConformadas.Datos.Columns.Add("CantidadGuias", System.Type.GetType("System.Int32"));

                dsAgencias.Datos.Columns.Add("CumpRendicion", System.Type.GetType("System.Double"));
                dsAgencias.Datos.Columns.Add("CumpControl", System.Type.GetType("System.Double"));
                dsAgencias.Datos.Columns.Add("CantidadGuias", System.Type.GetType("System.Int32"));

                // Guardo en memoria las agencias cargadas
                Session["dsAgenciasEmitidas"]    = dsAgenciasEmitidas;
                Session["dsAgenciasConformadas"] = dsAgenciasConformadas;
                Session["dsAgencias"]            = dsAgencias;
            }
            else
            {
                // Las agencias ya estan cargadas en memoria. Las cargo
                dsAgenciasEmitidas    = (DsAgencias)Session["dsAgenciasEmitidas"];
                dsAgenciasConformadas = (DsAgencias)Session["dsAgenciasConformadas"];
                dsAgencias            = (DsAgencias)Session["dsAgencias"];
            }

            ds.Tables.Add(dsAgenciasEmitidas.Datos.Clone());
            ds.Tables[2].TableName = "CabeceraEmitidas";

            ds.Tables.Add(dsAgenciasConformadas.Datos.Clone());
            ds.Tables[3].TableName = "CabeceraConformadas";

            ds.Tables.Add(dsAgencias.Datos.Clone());
            ds.Tables[4].TableName = "Cabecera";

            double totalGuiasPromedioFinal = 0;

            #region Guias emitidas
            foreach (System.Data.DataRow row in dsAgenciasEmitidas.Datos.Rows)
            {
                // Totales cabecera guías emitidas
                double importeTotalGuiasContado = Utiles.Validaciones.obtieneDouble(Convert.ToString(dsGuiasRT.Datos.Compute("Sum(ImporteTotal)", "TipoResultado='RE' And EsContado = 1 And AgenciaOrigenID = " + row["AgenciaID"].ToString())));
                /*Calculo del Cumplimiento de Rendicion y Control para guias emitidas*/
                //double totalGuiasEmitidasCumplidaRecepcion = Utiles.Validaciones.obtieneEntero(Convert.ToString(dsGuiasRT.Datos.Compute("SUM(CumpRendicion)", "TipoResultado='RE' And FechaRecepcionPlla is not null and FechaRecepcionPlla <> '1900-01-01 00:00:00.000' And AgenciaOrigenID = " + row["AgenciaID"].ToString())));
                double totalGuiasEmitidasCumplidaRecepcion = Utiles.Validaciones.obtieneDouble(Convert.ToString(dsGuiasRT.Datos.Compute("SUM(CumpRendicion)", "TipoResultado='RE' And AgenciaOrigenID = " + row["AgenciaID"].ToString())));
                //double totalGuiasEmitidasCumplidoControl = Utiles.Validaciones.obtieneEntero(Convert.ToString(dsGuiasRT.Datos.Compute("SUM(CumpControl)", "TipoResultado='RE' And FechaControlPlla is not null and FechaControlPlla <> '1900-01-01 00:00:00.000' And AgenciaOrigenID = " + row["AgenciaID"].ToString())));
                double totalGuiasEmitidasCumplidoControl = Utiles.Validaciones.obtieneDouble(Convert.ToString(dsGuiasRT.Datos.Compute("SUM(CumpControl)", "TipoResultado='RE' And AgenciaOrigenID = " + row["AgenciaID"].ToString())));
                double totalGuiasEmitidas = Utiles.Validaciones.obtieneDouble(Convert.ToString(dsGuiasRT.Datos.Compute("Count(GuiaID)", "TipoResultado='RE' And AgenciaOrigenID = " + row["AgenciaID"].ToString())));
                // Cargo los calculos
                if (totalGuiasEmitidas > 0)
                {
                    /* Cargar cálculos cabecera guías emitidas */
                    row["ImporteTotalGuiasContado"] = importeTotalGuiasContado;
                    row["CumpRendicion"]            = (totalGuiasEmitidasCumplidaRecepcion / totalGuiasEmitidas);
                    row["CumpControl"]   = (totalGuiasEmitidasCumplidoControl / totalGuiasEmitidas);
                    row["CantidadGuias"] = totalGuiasEmitidas;
                }
                else
                {
                    row["ImporteTotalGuiasContado"] = 0;
                    row["CumpRendicion"]            = 0;
                    row["CumpControl"]   = 0;
                    row["CantidadGuias"] = 0;
                }

                totalGuiasPromedioFinal += totalGuiasEmitidas;

                // Agrego la fila al listado de agencias en el DataSet ds
                ds.Tables["CabeceraEmitidas"].ImportRow(row);
            }
            #endregion

            #region Guías conformadas
            foreach (System.Data.DataRow row in dsAgenciasConformadas.Datos.Rows)
            {
                // Totales cabecera guías conformadas
                /*Calculo del Cumplimiento de Rendicion, Control y Digitalizacion para guias conformadas*/
                //double totalGuiasConformCumplidaRecepcion = Utiles.Validaciones.obtieneEntero(Convert.ToString(dsGuiasRT.Datos.Compute("SUM(CumpRendicion)", "TipoResultado='RC' And FechaRecepcionPlla is not null and FechaRecepcionPlla <> '1900-01-01 00:00:00.000' And AgenciaDestinoID = " + row["AgenciaID"].ToString())));
                double totalGuiasConformCumplidaRecepcion = Utiles.Validaciones.obtieneDouble(Convert.ToString(dsGuiasRT.Datos.Compute("SUM(CumpRendicion)", "TipoResultado='RC' And AgenciaDestinoID = " + row["AgenciaID"].ToString())));
                //double totalGuiasConformCumplidoControl = Utiles.Validaciones.obtieneEntero(Convert.ToString(dsGuiasRT.Datos.Compute("SUM(CumpControl)", "TipoResultado='RC' And FechaControlPlla is not null and FechaControlPlla <> '1900-01-01 00:00:00.000' And AgenciaDestinoID = " + row["AgenciaID"].ToString())));
                double totalGuiasConformCumplidoControl = Utiles.Validaciones.obtieneDouble(Convert.ToString(dsGuiasRT.Datos.Compute("SUM(CumpControl)", "TipoResultado='RC' And AgenciaDestinoID = " + row["AgenciaID"].ToString())));
                //double totalGuiasConformCumplidaDigit = Utiles.Validaciones.obtieneEntero(Convert.ToString(dsGuiasRT.Datos.Compute("SUM(CumpDigitalizacion)", "TipoResultado='RC' And FechaDigitalizacion is not null and FechaDigitalizacion <> '1900-01-01 00:00:00.000' And AgenciaDestinoID = " + row["AgenciaID"].ToString())));
                double totalGuiasConformCumplidaDigit = Utiles.Validaciones.obtieneDouble(Convert.ToString(dsGuiasRT.Datos.Compute("SUM(CumpDigitalizacion)", "TipoResultado='RC' And AgenciaDestinoID = " + row["AgenciaID"].ToString())));

                double totalGuiasConform = Utiles.Validaciones.obtieneDouble(Convert.ToString(dsGuiasRT.Datos.Compute("Count(GuiaID)", "TipoResultado='RC' And AgenciaDestinoID = " + row["AgenciaID"].ToString())));

                // Cargo los calculos
                if (totalGuiasConform > 0)
                {
                    /* Cargar cálculos cabecera guías conformadas */
                    row["CumpRendicion"]      = (totalGuiasConformCumplidaRecepcion / totalGuiasConform);
                    row["CumpControl"]        = (totalGuiasConformCumplidoControl / totalGuiasConform);
                    row["CumpDigitalizacion"] = (totalGuiasConformCumplidaDigit / totalGuiasConform);
                    row["CantidadGuias"]      = totalGuiasConform;
                }
                else
                {
                    row["CumpRendicion"]      = 0;
                    row["CumpControl"]        = 0;
                    row["CumpDigitalizacion"] = 0;
                    row["CantidadGuias"]      = 0;
                }

                totalGuiasPromedioFinal += totalGuiasConform;

                // Agrego la fila al listado de agencias en el DataSet ds
                ds.Tables["CabeceraConformadas"].ImportRow(row);
            }
            #endregion

            double promedioCumplimientoRendicion = 0;
            double promedioCumplimientoControl   = 0;
            int    totalCantidadGuiasFinal       = 0;

            #region Promedios por agencia
            // Cargo los datos de la agencia, junto con los datos calculados en el DataSet ds
            foreach (System.Data.DataRow row in dsAgencias.Datos.Rows)
            {
                double cumpRendicionEmitidas    = Utiles.Validaciones.obtieneDouble(Convert.ToString(dsAgenciasEmitidas.Datos.Compute("Sum(CumpRendicion)", "AgenciaID = " + row["AgenciaID"].ToString())));
                double cumpRendicionConformadas = Utiles.Validaciones.obtieneDouble(Convert.ToString(dsAgenciasConformadas.Datos.Compute("Sum(CumpRendicion)", "AgenciaID = " + row["AgenciaID"].ToString())));
                //double totalCumpRendicion = (cumpRendicionEmitidas == 0 || cumpRendicionConformadas == 0) ?(cumpRendicionEmitidas + cumpRendicionConformadas):((cumpRendicionEmitidas + cumpRendicionConformadas)/ 2);

                double cumpControlEmitidas    = Utiles.Validaciones.obtieneDouble(Convert.ToString(dsAgenciasEmitidas.Datos.Compute("Sum(CumpControl)", "AgenciaID = " + row["AgenciaID"].ToString())));
                double cumpControlConformadas = Utiles.Validaciones.obtieneDouble(Convert.ToString(dsAgenciasConformadas.Datos.Compute("Sum(CumpControl)", "AgenciaID = " + row["AgenciaID"].ToString())));
                //double totalCumpControl = (cumpControlEmitidas == 0 || cumpControlConformadas == 0) ?(cumpControlEmitidas + cumpControlConformadas):((cumpControlEmitidas + cumpControlConformadas)/ 2);

                int totalCantidadGuias = Utiles.Validaciones.obtieneEntero(Convert.ToString(dsAgenciasEmitidas.Datos.Compute("Sum(CantidadGuias)", "AgenciaID = " + row["AgenciaID"].ToString()))) + Utiles.Validaciones.obtieneEntero(Convert.ToString(dsAgenciasConformadas.Datos.Compute("Sum(CantidadGuias)", "AgenciaID = " + row["AgenciaID"].ToString())));

                totalCantidadGuiasFinal = totalCantidadGuiasFinal + totalCantidadGuias;

                /*SFE: */
                double totalCantidadGuiasEmitidas    = Utiles.Validaciones.obtieneEntero(Convert.ToString(dsAgenciasEmitidas.Datos.Compute("Sum(CantidadGuias)", "AgenciaID = " + row["AgenciaID"].ToString())));
                double totalCantidadGuiasConformadas = Utiles.Validaciones.obtieneEntero(Convert.ToString(dsAgenciasConformadas.Datos.Compute("Sum(CantidadGuias)", "AgenciaID = " + row["AgenciaID"].ToString())));

                promedioCumplimientoRendicion = ((totalCantidadGuiasEmitidas * cumpRendicionEmitidas) / (totalCantidadGuiasEmitidas + totalCantidadGuiasConformadas)) + ((totalCantidadGuiasConformadas * cumpRendicionConformadas) / (totalCantidadGuiasEmitidas + totalCantidadGuiasConformadas));
                promedioCumplimientoControl   = ((totalCantidadGuiasEmitidas * cumpControlEmitidas) / (totalCantidadGuiasEmitidas + totalCantidadGuiasConformadas)) + ((totalCantidadGuiasConformadas * cumpControlConformadas) / (totalCantidadGuiasEmitidas + totalCantidadGuiasConformadas));

                // Cargo los calculos
                if (totalCantidadGuias > 0)
                {
                    /* Cargar cálculos totales */
                    /* Cumpl Rendicion Ponderado de cada Agencia*/
                    row["CumpRendicion"] = (promedioCumplimientoRendicion);

                    /* Cumpl Control Ponderado de cada Agencia*/
                    row["CumpControl"] = (promedioCumplimientoControl);

                    row["CantidadGuias"] = totalCantidadGuias;

                    promedioCumplimientoRendicionTotal += Utiles.Validaciones.obtieneDouble(row["CumpRendicion"].ToString());
                    promedioCumplimientoControlTotal   += Utiles.Validaciones.obtieneDouble(row["CumpControl"].ToString());
                }
                else
                {
                    row["CumpRendicion"] = 0;
                    row["CumpControl"]   = 0;
                    row["CantidadGuias"] = 0;
                }

                // Agrego la fila al listado de agencias en el DataSet ds
                ds.Tables["Cabecera"].ImportRow(row);
            }
            #endregion

            // Realizo la relación entre las tablas Agencias y Guias
            DataColumn dcAgOrigen  = ds.Tables[2].Columns["AgenciaID"];
            DataColumn dcAgDestino = ds.Tables[3].Columns["AgenciaID"];
            DataColumn dcAgencias  = ds.Tables[4].Columns["AgenciaID"];

            DataRelation dr0 = new DataRelation("Agencia_CabeceraOri", dcAgencias, dcAgOrigen, false);
            DataRelation dr1 = new DataRelation("Agencia_CabeceraDes", dcAgencias, dcAgDestino, false);

            ds.Relations.Add(dr0);
            ds.Relations.Add(dr1);

            if (!this.chkResumido.Checked)
            {
                DataColumn   dcGuiasOri = ds.Tables[0].Columns["AgenciaOrigenID"];
                DataColumn   dcGuiasDes = ds.Tables[1].Columns["AgenciaDestinoID"];
                DataRelation dr2        = new DataRelation("Agencia_GuiasOri", dcAgOrigen, dcGuiasOri, false);
                DataRelation dr3        = new DataRelation("Agencia_GuiasDes", dcAgDestino, dcGuiasDes, false);

                ds.Relations.Add(dr2);
                ds.Relations.Add(dr3);
            }

            /*VSA - SFE: : Agregar Totalizador ponderado final.*/
            if (dsAgencias.Datos.Rows.Count > 0)
            {
                DataRow drTotal = ds.Tables[4].NewRow();
                drTotal["AgenciaID"]     = -1;
                drTotal["RazonSocial"]   = "Promedios totales:";
                drTotal["CumpRendicion"] = promedioCumplimientoRendicionTotal / dsAgencias.Datos.Rows.Count;
                drTotal["CumpControl"]   = promedioCumplimientoControlTotal / dsAgencias.Datos.Rows.Count;
                drTotal["CantidadGuias"] = totalCantidadGuiasFinal;
                ds.Tables[4].Rows.Add(drTotal);
            }

            Session["dsGuiasRTExcel"] = ds;

            // Cargo los datos en el dataGrid
            this.hgCabecera.DataSource       = ds;
            this.hgCabecera.DataMember       = "Cabecera";
            this.hgCabecera.CurrentPageIndex = currentPage;
            this.hgCabecera.DataBind();
        }