private void ConstruirFiltroBalGenGyP(BalanceGeneral_Parametros parametros, ParametrosContab parametrosContab, dbContab_Contab_Entities dbContab, out string filtroConsulta) { // en esta función leemos usamos el contenido de la tabla ParametrosContab para determinar y seleccionar solo las cuentas // contables del grupo que corresponde, de acuerdo al tipo de consulta indicada. Por ejemplo: // si el usuario quiere GyP, debemos excluir activos, pasivos y capital; justo a la inversa para Balance General filtroConsulta = ""; if (parametros.BalGen_GyP == "BG") { if (parametrosContab.Ingresos1 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Ingresos1).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Ingresos2 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Ingresos2).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Ingresos3 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Ingresos3).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Ingresos4 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Ingresos4).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Ingresos5 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Ingresos5).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Ingresos6 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Ingresos6).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Egresos1 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Egresos1).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Egresos2 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Egresos2).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Egresos3 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Egresos3).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Egresos4 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Egresos4).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Egresos5 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Egresos5).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Egresos6 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Egresos6).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } } else { // para GyP siempre excluimos cuentas reales (activo, pasivo, capital) if (parametrosContab.Activo1 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Activo1).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Activo2 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Activo2).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Activo3 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Activo3).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Activo4 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Activo4).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Activo5 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Activo5).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Activo6 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Activo6).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Pasivo1 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Pasivo1).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Pasivo2 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Pasivo2).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Pasivo3 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Pasivo3).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Pasivo4 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Pasivo4).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Pasivo5 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Pasivo5).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Pasivo6 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Pasivo6).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Capital1 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Capital1).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Capital2 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Capital2).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Capital3 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Capital3).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Capital4 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Capital4).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Capital5 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Capital5).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } if (parametrosContab.Capital6 != null) { string cuenta = dbContab.CuentasContables.Where(c => c.ID == parametrosContab.Capital6).Select(c => c.Cuenta).FirstOrDefault(); if (cuenta != "") { filtroConsulta += " And (it.Cuenta Not Like '" + cuenta + "%')"; } } } if (filtroConsulta == "") { filtroConsulta = " And (1 == 1)"; } }
private void CrearInfoReport(out string errorMessage) { errorMessage = ""; if (!User.Identity.IsAuthenticated) { FormsAuthentication.SignOut(); return; } string usuario = User.Identity.Name; if (Session["BalanceGeneral_Parametros"] == null) { errorMessage = "Aparentemente, Ud. no ha definido un filtro para esta consulta. Por favor defina un filtro para esta consulta antes de continuar."; return; } BalanceGeneral_Parametros parametros = Session["BalanceGeneral_Parametros"] as BalanceGeneral_Parametros; // -------------------------------------------------------------------------------------------------------------------------------- // determinamos si el mes que corresponde al inicio del período está cerrado; debe estarlo para que la información regresada por esta // consulta sea confiable; de no ser así, indicamos pero permitimos continuar ... // nótese como usamos un modelo de datos LinqToSql (no EF), pues el código en la clase AsientosContables lo usa así y fue // escrito hace bastante tiempo ... //ContabSysNet_Web.ModelosDatos.dbContabDataContext contabLinqToSqlContex = new ContabSysNet_Web.ModelosDatos.dbContabDataContext(); dbContab_Contab_Entities dbContab = new dbContab_Contab_Entities(); //FuncionesContab funcionesContab = new FuncionesContab(parametros.CiaContab, parametros.Moneda, contabLinqToSqlContex); FuncionesContab2 funcionesContab2 = new FuncionesContab2(dbContab); bool mesAnteriorCerradoEnContab = true; string popupMessage = ""; short mesFiscal; short anoFiscal; // el mes *anterior* al período de la consulta debe estar cerrado. La función regresa False cuando el mes está cerrado // por eso fallamos si el mes *anterior* no está cerrado; es decir, cuando la función regresa True ... if (funcionesContab2.ValidarMesCerradoEnContab(parametros.Desde.AddMonths(-1), parametros.CiaContab, out mesFiscal, out anoFiscal, out errorMessage)) { // NOTA: el mes *anterior* a la fecha de inicio DEBE estar cerrado (o uno posterior) // la función regresa False si el mes está cerrado // si la función regresa True es que NO está cerrado y eso no debe ocurrir en este contexto popupMessage = "El mes anterior al mes indicado para esta consulta, <b>no</b> está cerrado. <br /> " + "Aunque Ud. puede continuar e intentar obtener esta consulta, las cifras determinadas y " + "mostradas no serán del todo confiables.<br /><br />" + "Aún así, desea continuar con la ejecución de esta consulta?"; mesAnteriorCerradoEnContab = false; } ParametrosContab parametrosContab = dbContab.ParametrosContabs.Where(p => p.Cia == parametros.CiaContab).FirstOrDefault(); if (parametrosContab == null) { errorMessage = "Aparentemente, la tabla de parámetros (Contab) no ha sido inicializada. " + "Por favor inicialize esta tabla con los valores que sean adecuados, para la Cia Contab seleccionada para esta consulta."; return; } // ---------------------------------------------------------------------------------------------------------------------------- // construimos el filtro de las cuentas contables, en base al contenido de la tabla ParametrosContab; en esta tabla el usuario indica // cuales cuentas contables corresponden a: activo, pasivo, capital, etc. Para BG, solo cuentas reales son leídas; para GyP solo cuentas // nominales son leídas ... string filtroBalGen_GyP = ""; ConstruirFiltroBalGenGyP(parametros, parametrosContab, dbContab, out filtroBalGen_GyP); string filtroConsulta = parametros.Filtro + filtroBalGen_GyP; // ---------------------------------------------------------------------------------------------------------------------------- // hacemos una validación: intentamos encontrar cuentas contables de tipo detalle, que tengan movimientos en el período indicado, pero que no tengan // un registro de saldos; estos casos pueden ocurrir para cuentas contables recién agregadas, a la cuales se le han agregado asientos pero que aún // no se ha ejecutado un cierre mensual que agregue un registro de saldos para éstas. Notificamos esta situación al usuario para que ejecute un // cierre mensual que agregue un registro de saldos para estas cuentas ... DateTime fecha1erDiaMes = new DateTime(parametros.Desde.Year, parametros.Desde.Month, 1); // nótese como no aplicamos el filtro específico a esta consulta, pues resulta complicado. Sin embargo, al no hacerlo, validamos // esta situación para todas las cuentas de la compañía, en vez de solo para las que cumplen el filtro ... string commandString = "Select c.Cuenta As CuentaContable, c.Descripcion " + "From CuentasContables c Inner Join dAsientos d On c.ID = d.CuentaContableID " + "Inner Join Asientos a On d.NumeroAutomatico = a.NumeroAutomatico " + "Where c.Cia = {2} And c.TotDet = 'D' And " + "a.Fecha Between {0} And {1} " + "And c.ID Not In (Select s.CuentaContableID From SaldosContables s Where " + "s.Cia = {2})"; CuentaContableItem cuentasTipoDetalleSinRegistroDeSaldos = dbContab.ExecuteStoreQuery <CuentaContableItem>(commandString, fecha1erDiaMes.ToString("yyyy-MM-dd"), parametros.Hasta.ToString("yyyy-MM-dd"), parametros.CiaContab). FirstOrDefault(); if (cuentasTipoDetalleSinRegistroDeSaldos != null) { errorMessage = "Hemos encontrado que existen cuentas contables, por ejemplo <b><en>" + (cuentasTipoDetalleSinRegistroDeSaldos.CuentaContable != null ? cuentasTipoDetalleSinRegistroDeSaldos.CuentaContable.Trim() : "'cuenta contable sin número asignado - número en blanco'") + " - " + (cuentasTipoDetalleSinRegistroDeSaldos.Descripcion != null ? cuentasTipoDetalleSinRegistroDeSaldos.Descripcion.Trim() : "'cuenta contable sin descripción asignada - descripción en blanco'") + "</en></b>, con asientos registrados en el período indicado, pero sin un registro de saldos contables." + "Lo más probable es que estas cuentas sean nuevas y hayan recibido asientos; sin embargo, como el cierre contable (mensual) " + "no se ha corrido, su registro de saldos contables no ha sido creado aún. " + "Por favor ejecute un cierre contable para el mes de la consulta para que se corrija esta situación."; return; } // ---------------------------------------------------------------------------------------------------------------------------- // por último, determinamos si existen cuentas contables de tipo total y que tengan movimientos contables asociados para el período indicado. // esta situación puede ocurrir si el usuario cambia el tipo de una cuenta de detalle a total, para una cuenta que tenga asientos (el registro de // cuentas no debe permitir este cambio!). Notificamos esta situación al usuario y detenemos la ejecución del proceso ... // nótese como buscamos aquí sin usar el filtro que aplica a esta consulta; esto nos permite reportar esta situación tan grave, // independientemente del filtro que haya indicado el usuario ... commandString = "Select c.Cuenta As CuentaContable, c.Descripcion " + "From CuentasContables c Inner Join dAsientos d On c.ID = d.CuentaContableID " + "Inner Join Asientos a On d.NumeroAutomatico = a.NumeroAutomatico " + "Where c.Cia = {0} And c.TotDet = 'T' And a.Fecha Between {1} And {2}"; CuentaContableItem cuentasTipoTotalConMovimientos = dbContab.ExecuteStoreQuery <CuentaContableItem>(commandString, parametros.CiaContab, fecha1erDiaMes.ToString("yyyy-MM-dd"), parametros.Hasta.ToString("yyyy-MM-dd")). FirstOrDefault(); if (cuentasTipoTotalConMovimientos != null) { errorMessage = "Hemos encontrado que existen cuentas contables de tipo total, por ejemplo '<b><en>" + (cuentasTipoTotalConMovimientos.CuentaContable != null ? cuentasTipoTotalConMovimientos.CuentaContable.Trim() : "'cuenta contable sin número asignado - número en blanco'") + " - " + (cuentasTipoTotalConMovimientos.Descripcion != null ? cuentasTipoTotalConMovimientos.Descripcion.Trim() : "'cuenta contable sin descripción asignada - descripción en blanco'") + "</en></b>', con asientos registrados en el período indicado. " + "Una cuenta contable de tipo total no puede recibir asientos contables. " + "Por favor revise y corrija esta situación. Luego regrese a continuar con este proceso."; return; } if (!mesAnteriorCerradoEnContab) { // arriba, se determinó que el mes anterior al mes indicado no esta cerrado en Contab; de ser así, esta consulta no podrá determinar // lo saldos iniciales del período (saldos finales del mes anterior) de una manera confiable; sin embargo, notificamos al usaurio y // permitimos continuar (o no!) ... // nótese que si el usuario decide continuar, el metodo btnOk_Click es ejecutado; si el usuario cancela, simplemente la ejecución del // proceso es detenida en el cliente (browser) ... this.ModalPopupTitle_span.InnerHtml = "El mes contable que corresponde a los saldos iniciales del período indicado no está cerrado"; this.ModalPopupBody_span.InnerHtml = popupMessage; this.btnOk.Visible = true; this.btnCancel.Text = "Cancelar"; this.ModalPopupExtender1.Show(); return; } // las validaciones pasaron; ejecutamos la función que prepara y la consulta ... ConstruirConsulta(out errorMessage); }