private void CrearInfoReport(string sSqlSelectString, System.DateTime dFechaConsultaDisponibilidad, ref System.DateTime dFechaSaldoAnterior) { // en este Sub agregamos los registros a la tabla 'temporal' en la base de datos para que la // página que sigue los muestre al usuario en un DataGridView if (!User.Identity.IsAuthenticated) { FormsAuthentication.SignOut(); return; } // ----------------------------------------------------------------------------------------------- // lo primero que hacemos es determinar el mes del saldo anterior y el período de movimientos Int16 nAnoSaldoAnterior = (short)dFechaConsultaDisponibilidad.Year; Int16 nMesSaldoAnterior = Convert.ToInt16(dFechaConsultaDisponibilidad.Month - 1); if (nMesSaldoAnterior == 0) { nAnoSaldoAnterior -= 1; nMesSaldoAnterior = 12; } // nótese como obtenemos la fecha que corresponde al último día del mes ... dFechaSaldoAnterior = new DateTime(nAnoSaldoAnterior, nMesSaldoAnterior, DateTime.DaysInMonth(nAnoSaldoAnterior, nMesSaldoAnterior)); System.DateTime dFechaInicialPeriodo = new System.DateTime(dFechaConsultaDisponibilidad.Year, dFechaConsultaDisponibilidad.Month, 1); System.DateTime dFechaFinalPeriodo = dFechaConsultaDisponibilidad; // ---------------------------------------------------------------------------------------- // eliminamos los registros anteriores de la tabla 'temporal' dbBancosDataContext dbBancos = new dbBancosDataContext(); try { dbBancos.ExecuteCommand("Delete From tTempWebReport_DisponibilidadBancos2 Where NombreUsuario = {0}", User.Identity.Name); dbBancos.ExecuteCommand("Delete From tTempWebReport_DisponibilidadBancos Where NombreUsuario = {0}", User.Identity.Name); dbBancos.ExecuteCommand("Delete From Disponibilidad_MontosRestringidos_ConsultaDisponibilidad Where NombreUsuario = {0}", User.Identity.Name); dbBancos.ExecuteCommand("Delete From Disponibilidad_ChequesNoEntregados_ConsultaDisponibilidad Where NombreUsuario = {0}", User.Identity.Name); } catch (Exception ex) { dbBancos.Dispose(); ErrMessage_Span.InnerHtml = "Ha ocurrido un error al intentar ejecutar una operación de acceso a la base de datos. <br /> " + "El mensaje específico de error es: " + ex.Message + "<br /><br />"; ErrMessage_Span.Style["display"] = "block"; return; } // ---------------------------------------------------------------------------------------------- // lo primero que hacemos es leer las cuentas bancarias que cumplan con el criterio de selección Int16 nRecCount = 0; decimal nSaldoAnteriorCuentaBancaria = 0; decimal nMontoDebitos = 0; decimal nMontoCreditos = 0; decimal nSaldoActualCuentaBancaria = 0; Int16 nOrdenRegistroMovimientos = 0; // --------------------------------------------------------------------------------------- // objetos para agregar registros a ambas tablas 'temporales' List <tTempWebReport_DisponibilidadBanco> CuentasBancarias = new List <tTempWebReport_DisponibilidadBanco>(); tTempWebReport_DisponibilidadBanco CuentaBancaria; List <tTempWebReport_DisponibilidadBancos2> CuentasBancarias_Movimientos = new List <tTempWebReport_DisponibilidadBancos2>(); tTempWebReport_DisponibilidadBancos2 CuentasBancarias_Movimiento; // ---------------------------------------------------------------------------------------------- // lo primero que hacemos es leer las cuentas bancarias que cumplan con el criterio de selección // (NOTESE como usamos dynamic linq aquí) // eliminamos las cuentas bancarias no activas del filtro sSqlSelectString += " And Estado = 'AC'"; var query_cb = dbBancos.ExecuteQuery <CuentasBancaria>("Select * From CuentasBancarias Where " + sSqlSelectString); foreach (var cb in query_cb) { // --------------------------------------------------------------------------------- // leemos el saldo anterior de la cuenta int nCuentaInterna = cb.CuentaInterna; int nCiaContab = cb.Cia; var query_sa = from sa in dbBancos.Saldos where sa.CuentaBancaria == nCuentaInterna && sa.Ano == nAnoSaldoAnterior select sa; foreach (var sa in query_sa) { // este query puede o no traer registros; por eso leemos y salimos switch (nMesSaldoAnterior) { case 0: nSaldoAnteriorCuentaBancaria = sa.Inicial.Value; break; case 1: nSaldoAnteriorCuentaBancaria = sa.Mes01.Value; break; case 2: nSaldoAnteriorCuentaBancaria = sa.Mes02.Value; break; case 3: nSaldoAnteriorCuentaBancaria = sa.Mes03.Value; break; case 4: nSaldoAnteriorCuentaBancaria = sa.Mes04.Value; break; case 5: nSaldoAnteriorCuentaBancaria = sa.Mes05.Value; break; case 6: nSaldoAnteriorCuentaBancaria = sa.Mes06.Value; break; case 7: nSaldoAnteriorCuentaBancaria = sa.Mes07.Value; break; case 8: nSaldoAnteriorCuentaBancaria = sa.Mes08.Value; break; case 9: nSaldoAnteriorCuentaBancaria = sa.Mes09.Value; break; case 10: nSaldoAnteriorCuentaBancaria = sa.Mes10.Value; break; case 11: nSaldoAnteriorCuentaBancaria = sa.Mes11.Value; break; case 12: nSaldoAnteriorCuentaBancaria = sa.Mes12.Value; break; } } // ---------------------------------------------------------------------------------------------- // agregamos un 1er. registro a la tabla 'temporal' de movimientos con el saldo inicial // de la cuenta nOrdenRegistroMovimientos = 1; CuentasBancarias_Movimiento = new tTempWebReport_DisponibilidadBancos2(); CuentasBancarias_Movimiento.CuentaInterna = cb.CuentaInterna; CuentasBancarias_Movimiento.Transaccion = 001; CuentasBancarias_Movimiento.Tipo = "IN"; CuentasBancarias_Movimiento.Orden = nOrdenRegistroMovimientos; CuentasBancarias_Movimiento.Fecha = dFechaInicialPeriodo; CuentasBancarias_Movimiento.Concepto = "Saldo inicial del período"; CuentasBancarias_Movimiento.Monto = nSaldoAnteriorCuentaBancaria; CuentasBancarias_Movimiento.CiaContab = cb.Cia; CuentasBancarias_Movimiento.NombreUsuario = User.Identity.Name; CuentasBancarias_Movimientos.Add(CuentasBancarias_Movimiento); // ---------------------------------------------------------------------------------------------- // ahora obtenemos los movimientos del período para grabarlos a otra tabla 'temporal' y para // obtener la sumarización de debitos y créditos y, finalmente, el saldo actual de la cuenta nMontoDebitos = 0; nMontoCreditos = 0; var query = from mb in dbBancos.MovimientosBancarios where mb.Chequera.CuentasBancaria.CuentaInterna == nCuentaInterna && mb.Fecha >= dFechaInicialPeriodo && mb.Fecha <= dFechaFinalPeriodo && mb.Chequera.CuentasBancaria.Compania.Numero == nCiaContab // ésto no es necesario !!!! orderby mb.Fecha select new { mb.Transaccion, mb.Tipo, mb.Fecha, mb.ProvClte, mb.Beneficiario, mb.Concepto, mb.Monto, mb.FechaEntregado, NombreProveedor = mb.Proveedore.Nombre, mb.Conciliacion_FechaEjecucion }; foreach (var mb in query) { if (mb.Monto >= 0) { nMontoDebitos += mb.Monto; } else { nMontoCreditos += mb.Monto; } nOrdenRegistroMovimientos += 1; CuentasBancarias_Movimiento = new tTempWebReport_DisponibilidadBancos2(); CuentasBancarias_Movimiento.CuentaInterna = cb.CuentaInterna; CuentasBancarias_Movimiento.Transaccion = mb.Transaccion; CuentasBancarias_Movimiento.Tipo = mb.Tipo; CuentasBancarias_Movimiento.Orden = nOrdenRegistroMovimientos; CuentasBancarias_Movimiento.Fecha = mb.Fecha; if (!(mb.ProvClte == null)) { CuentasBancarias_Movimiento.ProvClte = mb.ProvClte; } CuentasBancarias_Movimiento.Beneficiario = mb.Beneficiario; CuentasBancarias_Movimiento.NombreProveedorCliente = mb.NombreProveedor; CuentasBancarias_Movimiento.Concepto = mb.Concepto; CuentasBancarias_Movimiento.Monto = mb.Monto; if (!(mb.FechaEntregado == null)) { CuentasBancarias_Movimiento.FechaEntregado = mb.FechaEntregado; } CuentasBancarias_Movimiento.Conciliacion_FechaEjecucion = mb.Conciliacion_FechaEjecucion; CuentasBancarias_Movimiento.CiaContab = cb.Cia; CuentasBancarias_Movimiento.NombreUsuario = User.Identity.Name; CuentasBancarias_Movimientos.Add(CuentasBancarias_Movimiento); } nSaldoActualCuentaBancaria = nSaldoAnteriorCuentaBancaria + nMontoDebitos + nMontoCreditos; // ---------------------------------------------------------------------------------------------- // agregamos un último registro de movimientos a la tabla 'temporal' de movimientos, con el // monto de saldo final (o actual) determinado antes nOrdenRegistroMovimientos += 1; CuentasBancarias_Movimiento = new tTempWebReport_DisponibilidadBancos2(); CuentasBancarias_Movimiento.CuentaInterna = cb.CuentaInterna; CuentasBancarias_Movimiento.Transaccion = 001; CuentasBancarias_Movimiento.Tipo = "SA"; CuentasBancarias_Movimiento.Orden = nOrdenRegistroMovimientos; CuentasBancarias_Movimiento.Fecha = dFechaFinalPeriodo; CuentasBancarias_Movimiento.Concepto = "Saldo actual del período"; CuentasBancarias_Movimiento.Monto = nSaldoActualCuentaBancaria; CuentasBancarias_Movimiento.CiaContab = cb.Cia; CuentasBancarias_Movimiento.NombreUsuario = User.Identity.Name; CuentasBancarias_Movimientos.Add(CuentasBancarias_Movimiento); // ----------------------------------------------------------------------------------------- // nov/08: debemos tomar en cuenta el monto restringido que pueda existir para una cuenta // bancaria var queryMontoRestringido = from mr in dbBancos.Disponibilidad_MontosRestringidos where mr.CuentaBancaria == nCuentaInterna && mr.Fecha <= dFechaFinalPeriodo && mr.SuspendidoFlag == false && (mr.DesactivarEl == null || mr.DesactivarEl > dFechaFinalPeriodo) orderby mr.Fecha select mr; decimal nTotalMontoRestringido = 0; Int16 nRecCountMontoRestringido = 0; // nótese como agregamos un registro a la tabla Disponibilidad_MontosRestringidos_ConsultaDisponibilidad // por cada monto restringido leído para la cuenta bancaria. Disponibilidad_MontosRestringidos_ConsultaDisponibilidad MyRegistroMontosRestringido; List <Disponibilidad_MontosRestringidos_ConsultaDisponibilidad> MyRegistroMontosRestringido_Lista = new List <Disponibilidad_MontosRestringidos_ConsultaDisponibilidad>(); foreach (var MyQueryMontoRestringido in queryMontoRestringido) { // Ok, existe uno (o varios) montos restringidos grabados que aplican a la cuenta bancaria y el // período de la consulta; grabamos dos registros: uno con el monto restringido y uno con el // nuevo saldo nOrdenRegistroMovimientos += 1; nRecCountMontoRestringido += 1; CuentasBancarias_Movimiento = new tTempWebReport_DisponibilidadBancos2(); CuentasBancarias_Movimiento.CuentaInterna = cb.CuentaInterna; CuentasBancarias_Movimiento.Transaccion = nRecCountMontoRestringido; CuentasBancarias_Movimiento.Tipo = "MR"; CuentasBancarias_Movimiento.Orden = nOrdenRegistroMovimientos; CuentasBancarias_Movimiento.Fecha = MyQueryMontoRestringido.Fecha; CuentasBancarias_Movimiento.Concepto = MyQueryMontoRestringido.Comentarios; CuentasBancarias_Movimiento.Monto = MyQueryMontoRestringido.Monto; CuentasBancarias_Movimiento.CiaContab = cb.Cia; CuentasBancarias_Movimiento.NombreUsuario = User.Identity.Name; CuentasBancarias_Movimientos.Add(CuentasBancarias_Movimiento); nTotalMontoRestringido += MyQueryMontoRestringido.Monto; // ------------------------------------------------------------------------------ MyRegistroMontosRestringido = new Disponibilidad_MontosRestringidos_ConsultaDisponibilidad(); MyRegistroMontosRestringido.ID = MyQueryMontoRestringido.ID; MyRegistroMontosRestringido.CiaContab = MyQueryMontoRestringido.CuentasBancaria.Cia; MyRegistroMontosRestringido.Moneda = MyQueryMontoRestringido.CuentasBancaria.Moneda; MyRegistroMontosRestringido.CuentaBancaria = MyQueryMontoRestringido.CuentaBancaria; MyRegistroMontosRestringido.Fecha = MyQueryMontoRestringido.Fecha; MyRegistroMontosRestringido.Monto = MyQueryMontoRestringido.Monto; MyRegistroMontosRestringido.Comentarios = MyQueryMontoRestringido.Comentarios; MyRegistroMontosRestringido.DesactivarEl = MyQueryMontoRestringido.DesactivarEl; MyRegistroMontosRestringido.NombreUsuario = User.Identity.Name; MyRegistroMontosRestringido_Lista.Add(MyRegistroMontosRestringido); } if (nRecCountMontoRestringido > 0) { dbBancos.Disponibilidad_MontosRestringidos_ConsultaDisponibilidads.InsertAllOnSubmit(MyRegistroMontosRestringido_Lista); try { dbBancos.SubmitChanges(); } catch (Exception ex) { dbBancos.Dispose(); ErrMessage_Span.InnerHtml = "Ha ocurrido un error al intentar ejecutar una operación de acceso a la base de datos. <br />" + "El mensaje específico de error es: " + ex.Message + "<br /><br />"; ErrMessage_Span.Style["display"] = "block"; return; } } // si se encontraron registros de monto restringido, agregamos un registro final con el // saldo final de la cuenta if (nRecCountMontoRestringido > 0) { nOrdenRegistroMovimientos += 1; CuentasBancarias_Movimiento = new tTempWebReport_DisponibilidadBancos2(); CuentasBancarias_Movimiento.CuentaInterna = cb.CuentaInterna; CuentasBancarias_Movimiento.Transaccion = 001; CuentasBancarias_Movimiento.Tipo = "TO"; CuentasBancarias_Movimiento.Orden = nOrdenRegistroMovimientos; CuentasBancarias_Movimiento.Fecha = dFechaFinalPeriodo; CuentasBancarias_Movimiento.Concepto = "Saldo disponible del período"; CuentasBancarias_Movimiento.Monto = nSaldoActualCuentaBancaria + nTotalMontoRestringido; CuentasBancarias_Movimiento.CiaContab = cb.Cia; CuentasBancarias_Movimiento.NombreUsuario = User.Identity.Name; CuentasBancarias_Movimientos.Add(CuentasBancarias_Movimiento); } // ----------------------------------------------------------------------------------------- // leemos los cheques no entregados hasta la fecha para agregarlos como movimientos y // mostrar un saldo disponible que incluya este monto var query2 = from mb in dbBancos.MovimientosBancarios where mb.Chequera.CuentasBancaria.CuentaInterna == nCuentaInterna && mb.Fecha <= dFechaFinalPeriodo && mb.Tipo == "CH" && mb.FechaEntregado == null && mb.Monto != 0 && mb.Chequera.CuentasBancaria.Compania.Numero == nCiaContab orderby mb.Fecha select new { mb.Chequera.CuentasBancaria.CuentaInterna, mb.Transaccion, mb.Fecha, mb.ProvClte, mb.Beneficiario, mb.Concepto, mb.Monto }; Disponibilidad_ChequesNoEntregados_ConsultaDisponibilidad MyChequesNoEntregados_ConsultaDisponibilidad; List <Disponibilidad_ChequesNoEntregados_ConsultaDisponibilidad> MyChequesNoEntregados_ConsultaDisponibilidad_Lista = new List <Disponibilidad_ChequesNoEntregados_ConsultaDisponibilidad>(); decimal nMontoChequesNoEntregados = 0; foreach (var MyQuery2 in query2) { MyChequesNoEntregados_ConsultaDisponibilidad = new Disponibilidad_ChequesNoEntregados_ConsultaDisponibilidad(); MyChequesNoEntregados_ConsultaDisponibilidad.CiaContab = cb.Cia; MyChequesNoEntregados_ConsultaDisponibilidad.CuentaBancaria = nCuentaInterna; MyChequesNoEntregados_ConsultaDisponibilidad.Fecha = MyQuery2.Fecha; MyChequesNoEntregados_ConsultaDisponibilidad.Transaccion = MyQuery2.Transaccion; MyChequesNoEntregados_ConsultaDisponibilidad.ProvClte = MyQuery2.ProvClte; MyChequesNoEntregados_ConsultaDisponibilidad.Beneficiario = MyQuery2.Beneficiario; MyChequesNoEntregados_ConsultaDisponibilidad.Concepto = MyQuery2.Concepto; MyChequesNoEntregados_ConsultaDisponibilidad.Monto = MyQuery2.Monto; MyChequesNoEntregados_ConsultaDisponibilidad.NombreUsuario = User.Identity.Name; MyChequesNoEntregados_ConsultaDisponibilidad_Lista.Add(MyChequesNoEntregados_ConsultaDisponibilidad); nMontoChequesNoEntregados += MyQuery2.Monto; } if (query2.Count() > 0) { // agregamos un registro a la tabla de movimientos con un total para los cheques no entregados nOrdenRegistroMovimientos += 1; CuentasBancarias_Movimiento = new tTempWebReport_DisponibilidadBancos2(); CuentasBancarias_Movimiento.CuentaInterna = cb.CuentaInterna; CuentasBancarias_Movimiento.Transaccion = 001; CuentasBancarias_Movimiento.Tipo = "NE"; CuentasBancarias_Movimiento.Orden = nOrdenRegistroMovimientos; CuentasBancarias_Movimiento.Fecha = dFechaFinalPeriodo; CuentasBancarias_Movimiento.Concepto = "Monto total en cheques no entregados"; CuentasBancarias_Movimiento.Monto = (nMontoChequesNoEntregados * -1); CuentasBancarias_Movimiento.CiaContab = cb.Cia; CuentasBancarias_Movimiento.NombreUsuario = User.Identity.Name; CuentasBancarias_Movimientos.Add(CuentasBancarias_Movimiento); // ahora agregamos cada cheque no entregado a una tabla para que el usuario los pueda // consultar en detalle dbBancos.Disponibilidad_ChequesNoEntregados_ConsultaDisponibilidads.InsertAllOnSubmit(MyChequesNoEntregados_ConsultaDisponibilidad_Lista); try { dbBancos.SubmitChanges(); } catch (Exception ex) { dbBancos.Dispose(); ErrMessage_Span.InnerHtml = "Ha ocurrido un error al intentar ejecutar una operación de acceso a la base de datos. <br />" + "El mensaje específico de error es: " + ex.Message + "<br /><br />"; ErrMessage_Span.Style["display"] = "block"; return; } } // si se encontraron cheques no entregados, agregamos un registro final con el // saldo final de la cuenta if (query2.Count() > 0) { nOrdenRegistroMovimientos += 1; CuentasBancarias_Movimiento = new tTempWebReport_DisponibilidadBancos2(); CuentasBancarias_Movimiento.CuentaInterna = cb.CuentaInterna; CuentasBancarias_Movimiento.Transaccion = 001; CuentasBancarias_Movimiento.Tipo = "TC"; CuentasBancarias_Movimiento.Orden = nOrdenRegistroMovimientos; CuentasBancarias_Movimiento.Fecha = dFechaFinalPeriodo; CuentasBancarias_Movimiento.Concepto = "Saldo disponible del período"; // como el monto leído para los cheques no entregados es siempre negativo, lo convertimos a // positivo pues queremos agregarlo al saldo disponible CuentasBancarias_Movimiento.Monto = nSaldoActualCuentaBancaria + nTotalMontoRestringido + (nMontoChequesNoEntregados * -1); CuentasBancarias_Movimiento.CiaContab = cb.Cia; CuentasBancarias_Movimiento.NombreUsuario = User.Identity.Name; CuentasBancarias_Movimientos.Add(CuentasBancarias_Movimiento); } // ---------------------------------------------------------------------------------------------- // agregamos un registro con la cuenta bancaria y su saldo a la 1ra. tabla 'temporal' // NOTESE como agregamos el monto restringido que pudo ser registrado para la cuenta // y el monto en cheques no entregados que pueda existir CuentaBancaria = new tTempWebReport_DisponibilidadBanco(); CuentaBancaria.CuentaInterna = cb.CuentaInterna; CuentaBancaria.CuentaBancaria = cb.CuentaBancaria; CuentaBancaria.NombreCiaContab = cb.Compania.NombreCorto; if (cb.Agencia1.Banco1.NombreCorto != null) { CuentaBancaria.NombreBanco = cb.Agencia1.Banco1.NombreCorto; } else { CuentaBancaria.NombreBanco = "indefinido"; } CuentaBancaria.NombreMoneda = cb.Moneda1.Descripcion; CuentaBancaria.SimboloMoneda = cb.Moneda1.Simbolo; CuentaBancaria.FechaSaldoAnterior = dFechaInicialPeriodo; CuentaBancaria.SaldoAnterior = nSaldoAnteriorCuentaBancaria; CuentaBancaria.Debitos = nMontoDebitos; CuentaBancaria.Creditos = nMontoCreditos; CuentaBancaria.SaldoActual = nSaldoActualCuentaBancaria; CuentaBancaria.MontoRestringido = nTotalMontoRestringido; CuentaBancaria.SaldoActual2 = nSaldoActualCuentaBancaria + nTotalMontoRestringido; CuentaBancaria.MontoChequesNoEntregados = nMontoChequesNoEntregados; CuentaBancaria.SaldoActual3 = nSaldoActualCuentaBancaria + nTotalMontoRestringido + (nMontoChequesNoEntregados * -1); CuentaBancaria.FechaSaldoActual = dFechaFinalPeriodo; CuentaBancaria.CiaContab = cb.Cia; CuentaBancaria.NombreUsuario = User.Identity.Name; CuentasBancarias.Add(CuentaBancaria); nRecCount += 1; } // ---------------------------------------------------------------------------------------------- // agregamos la lista de registros a la tabla en el DataContext y luego hacemos el SubmitChanges dbBancos.tTempWebReport_DisponibilidadBancos2s.InsertAllOnSubmit(CuentasBancarias_Movimientos); dbBancos.tTempWebReport_DisponibilidadBancos.InsertAllOnSubmit(CuentasBancarias); // si el usuario registra alguna fecha de entregado para un cheque en forma errada, la instrucción que sigue fallará // intentamos adelantarnos a esta situación ... DateTime fechaMuyAntigua = new DateTime(1960, 1, 1); DateTime fechaMuyFutura = new DateTime(9000, 1, 1); var queryMovimientosFechaErrada = CuentasBancarias_Movimientos. Where(c => (c.Fecha <fechaMuyAntigua || c.Fecha> fechaMuyFutura) || (c.FechaEntregado <fechaMuyAntigua || c.FechaEntregado> fechaMuyFutura)). FirstOrDefault(); if (queryMovimientosFechaErrada != null) { ErrMessage_Span.InnerHtml = "Error: hemos encontrado que, al menos uno, de los movimientos que corresponden a esta consulta, " + "tiene un valor para la fecha o fecha de entrega, que no es un valor válido.<br />" + "los datos del movimiento mencionado son:<br />" + "Número: " + queryMovimientosFechaErrada.Transaccion + "; " + "Compañía: " + queryMovimientosFechaErrada.NombreProveedorCliente + "; " + "Concepto: " + queryMovimientosFechaErrada.Concepto + "; " + "Monto: " + queryMovimientosFechaErrada.Monto.ToString("N2") + "; " + "Fecha: " + queryMovimientosFechaErrada.Fecha.ToString("dd-MMM-yyyy") + "; " + "Fecha de entrega: " + (queryMovimientosFechaErrada.FechaEntregado != null ? queryMovimientosFechaErrada.FechaEntregado.Value.ToString("dd-MMM-yyyy") : "sin un valor asignado") + "."; ErrMessage_Span.Style["display"] = "block"; return; } try { dbBancos.SubmitChanges(); } catch (Exception ex) { dbBancos.Dispose(); ErrMessage_Span.InnerHtml = "Ha ocurrido un error al intentar ejecutar una operación " + "de acceso a la base de datos. <br /> El mensaje específico de error es: " + ex.Message + "<br /><br />"; ErrMessage_Span.Style["display"] = "block"; return; } // ------------------------------------------------------------------------------------------------ if (nRecCount == 0) { // Gets a reference to a Label control that is not in a // ContentPlaceHolder control HtmlTableCell MyTableCell; MyTableCell = (HtmlTableCell)Master.FindControl("MessageSpace_TableCell"); if (!(MyTableCell == null)) { MyTableCell.InnerHtml = "<br/><p><font color='#FF0000'>" + "* no existen registros que cumplan el criterio de selección que Ud. ha indicado." + "</font></p>"; } return; } SaldosCuentasBancarias_SqlDataSource.SelectParameters["NombreUsuario"].DefaultValue = User.Identity.Name; }
private void RefreshAndBindInfo() { if (!User.Identity.IsAuthenticated) { FormsAuthentication.SignOut(); return; } if (Session["FiltroForma"] == null) { ErrMessage_Span.InnerHtml = "Aparentemente, Ud. no ha indicado un filtro aún.<br />Por favor indique y aplique un filtro antes de intentar mostrar el resultado de la consulta."; ErrMessage_Span.Style["display"] = "block"; return; } // el usuario indica o no si quiere determinar los montos de retención de impuestos (iva/islr) en base a sus fechas de // recepción de planillas; si el usuario deja esta opción en false, las retenciones de impuestos *siempre* son // restadas del monto a pagar de la factura; si el usuario marca esta opción, los montos de retención de impuestos // (iva/islr) son restados del monto a pagar *solo* si sus fechas de recepción son *anteriores o iguales* a la fecha de la consulta ... bool aplicarFechasRecepcionPlanillasRetencionImpuestos = false; if (Session["AplicarFechasRecepcionPlanillasRetencionImpuestos"] != null) { aplicarFechasRecepcionPlanillasRetencionImpuestos = Convert.ToBoolean(Session["AplicarFechasRecepcionPlanillasRetencionImpuestos"]); } // usamos el criterio que indico el usuario para leer las cuentas contables y grabarlas a una tabla // en la base de datos temporal string filtro = Session["FiltroForma"].ToString(); filtro = filtro.Replace("CuotasFactura", "Facturas"); dbBancosDataContext BancosDB = new dbBancosDataContext(); // ---------------------------------------------------------------------------------------------------------------------------------------- // antes de iniciar el proceso, revisamos que no se produzcan varios items con el mismo pk. Estos registros serán grabados a una tabla // en sql server. Si el pk es duplicado, el proceso fallará. Revisamos antes ... string sSqlQueryString = "SELECT Case Facturas.CxCCxPFlag When 1 Then 'CxP' When 2 Then 'CxC' End As CxCCxPFlag_Descripcion, " + "Facturas.Proveedor As Compania, " + "Facturas.NumeroFactura, CuotasFactura.NumeroCuota, Count(*) As UniquePK_Count " + "FROM CuotasFactura " + "Inner Join Facturas On CuotasFactura.ClaveUnicaFactura = Facturas.ClaveUnica " + "Where (Facturas.FechaRecepcion >= {0}) And (Facturas.FechaRecepcion <= {1}) And " + filtro + " And (CuotasFactura.EstadoCuota <> 4) " + "Group By Facturas.CxCCxPFlag, Facturas.Proveedor, Facturas.NumeroFactura, CuotasFactura.NumeroCuota " + "Having Count(*) > 1"; DateTime fechaInicial_consulta = new DateTime(1960, 1, 1); // la fecha de inicio de la consulta puede o no venir if (Session["FechaConsulta_Inicio"] != null) { fechaInicial_consulta = DateTime.Parse(Session["FechaConsulta_Inicio"].ToString()); } var queryDuplicados = BancosDB.ExecuteQuery <FacturaDatosPK_Entity>(sSqlQueryString, fechaInicial_consulta.ToString("yyyy-MM-dd"), DateTime.Parse(Session["FechaConsulta"].ToString()).ToString("yyyy-MM-dd")).ToList(); if (queryDuplicados.Count() > 0) { string errorMessage = "Error: hemos encontrado facturas <b>duplicadas</b> (mismo número de factura) para una <b>misma</b> compañía; " + "por favor resuelva esta situación y regrese a ejecutar esta consulta.<br /><br />"; foreach (var item in queryDuplicados) { var compania = BancosDB.Proveedores.Where(p => p.Proveedor == item.Compania).Select(p => new { p.Nombre }).FirstOrDefault(); errorMessage += $" compañía: {compania.Nombre} - tipo: {item.CxCCxPFlag_Descripcion} - factura: {item.NumeroFactura} - cuota: {item.NumeroCuota}. <br />"; } ErrMessage_Span.InnerHtml = errorMessage; ErrMessage_Span.Style["display"] = "block"; return; } // ahora leemos las cantidades de días que el usuario registro en la tabla PeriodosVencimiento; estos // días nos permitirán determinar la antiguedad de un saldo vencido o por vencer var query0 = from pv in BancosDB.PeriodosVencimientos select pv.CantidadDias; short i = 0; int nCantDias1 = -1, nCantDias2 = -1, nCantDias3 = -1; foreach (int nCantidadDias in query0) { i++; switch (i) { case 1: nCantDias1 = nCantidadDias; break; case 2: nCantDias2 = nCantidadDias; break; case 3: nCantDias3 = nCantidadDias; break; } } // guardamos los valores de la tabla, pues los usaremos al generar el reporte Session["CantDias1"] = nCantDias1; Session["CantDias2"] = nCantDias2; Session["CantDias3"] = nCantDias3; // -------------------------------------------------------------------------------------------- // eliminamos el contenido de la tabla temporal ContabSysNet_TempDBDataContext TempDB = new ContabSysNet_TempDBDataContext(); try { TempDB.ExecuteCommand("Delete From Bancos_VencimientoFacturas Where NombreUsuario = {0}", Membership.GetUser().UserName); } catch (Exception ex) { TempDB.Dispose(); ErrMessage_Span.InnerHtml = "Ha ocurrido un error al intentar ejecutar una operación de acceso a la base de datos. <br /> El mensaje específico de error es: " + ex.Message + "<br />"; ErrMessage_Span.Style["display"] = "block"; return; } sSqlQueryString = "SELECT CuotasFactura.ClaveUnica, Facturas.CxCCxPFlag, " + "Case CxCCxPFlag When 1 Then 'CxP' When 2 Then 'CxC' End As CxCCxPFlag_Descripcion, " + "Facturas.Moneda, Monedas.Descripcion As NombreMoneda, Monedas.Simbolo As SimboloMoneda, " + "Facturas.Cia As CiaContab, Companias.NombreCorto As NombreCiaContab, " + "Facturas.Proveedor As Compania, Proveedores.Nombre As NombreCompania, Proveedores.Abreviatura As NombreCompaniaAbreviatura, " + "Facturas.NumeroFactura, CuotasFactura.NumeroCuota, Facturas.FechaEmision, " + "Facturas.FechaRecepcion, CuotasFactura.FechaVencimiento, CuotasFactura.DiasVencimiento, CuotasFactura.MontoCuota, " + "CuotasFactura.Iva, CuotasFactura.RetencionSobreISLR, Facturas.FRecepcionRetencionISLR, " + "CuotasFactura.RetencionSobreIva, Facturas.FRecepcionRetencionIva, " + "CuotasFactura.Anticipo " + "FROM CuotasFactura " + "Inner Join Facturas On CuotasFactura.ClaveUnicaFactura = Facturas.ClaveUnica " + "Inner Join Companias ON Facturas.Cia = Companias.Numero " + "Inner Join Monedas ON Facturas.Moneda = Monedas.Moneda " + "Inner Join Proveedores ON Facturas.Proveedor = Proveedores.Proveedor " + "Where Facturas.FechaRecepcion >= {0} And Facturas.FechaRecepcion <= {1} And " + filtro + " And " + "CuotasFactura.EstadoCuota <> 4 "; // dejamos de excluir cuotas de factura que tengan pagos y cuyo estado sea Pagada; // leemos los pagos de las cuotas más abajo y excluimos las totalmente pagadas allí // (el proceso será más lento, pero 'transaccional') //"And CuotasFactura.ClaveUnica Not In " + //"(Select ClaveUnicaCuotaFactura From dPagos Inner Join Pagos On " + //"dPagos.ClaveUnicaPago = Pagos.ClaveUnica Inner Join CuotasFactura On " + //"dPagos.ClaveUnicaCuotaFactura = CuotasFactura.ClaveUnica Where Pagos.Fecha <= {0} And EstadoCuota = 3)"; var query = BancosDB.ExecuteQuery <CuotaFactura_Entity>(sSqlQueryString, fechaInicial_consulta.ToString("yyyy-MM-dd"), DateTime.Parse(Session["FechaConsulta"].ToString()).ToString("yyyy-MM-dd")); List <Bancos_VencimientoFactura> MyVencimientosFactura_List = new List <Bancos_VencimientoFactura>(); Bancos_VencimientoFactura MyVencimientosFactura; foreach (CuotaFactura_Entity MyCuotasFacturas_Object in query) { // para cada cuota de factura leída, leemos sus montos pagados, para grabarlos al // registro. Luego, con el monto a pagar y el monto pagado determinaremos el vencimiento, // de acuerdo a los períodos indicados por el usuario en la tabla PeriodosVencimiento var nMontoPagado = (from pagos in BancosDB.dPagos where pagos.ClaveUnicaCuotaFactura == MyCuotasFacturas_Object.ClaveUnica && pagos.Pago.Fecha <= (DateTime)Session["FechaConsulta"] && pagos.Pago.Fecha >= MyCuotasFacturas_Object.FechaRecepcion // excluimos los anticipos; su fecha es siempre *anterior* a la factura select(decimal?) pagos.MontoPagado).Sum(); MyVencimientosFactura = new Bancos_VencimientoFactura(); MyVencimientosFactura.CxCCxPFlag = MyCuotasFacturas_Object.CxCCxPFlag; MyVencimientosFactura.CxCCxPFlag_Descripcion = MyCuotasFacturas_Object.CxCCxPFlag_Descripcion; MyVencimientosFactura.Moneda = MyCuotasFacturas_Object.Moneda; MyVencimientosFactura.NombreMoneda = MyCuotasFacturas_Object.NombreMoneda; MyVencimientosFactura.SimboloMoneda = MyCuotasFacturas_Object.SimboloMoneda; MyVencimientosFactura.CiaContab = MyCuotasFacturas_Object.CiaContab; MyVencimientosFactura.NombreCiaContab = MyCuotasFacturas_Object.NombreCiaContab; MyVencimientosFactura.Compania = MyCuotasFacturas_Object.Compania; MyVencimientosFactura.NombreCompania = MyCuotasFacturas_Object.NombreCompania; MyVencimientosFactura.NombreCompaniaAbreviatura = MyCuotasFacturas_Object.NombreCompaniaAbreviatura; MyVencimientosFactura.NumeroFactura = MyCuotasFacturas_Object.NumeroFactura; MyVencimientosFactura.NumeroCuota = MyCuotasFacturas_Object.NumeroCuota; MyVencimientosFactura.FechaEmision = MyCuotasFacturas_Object.FechaEmision; MyVencimientosFactura.FechaRecepcion = MyCuotasFacturas_Object.FechaRecepcion; MyVencimientosFactura.FechaVencimiento = MyCuotasFacturas_Object.FechaVencimiento; MyVencimientosFactura.DiasVencimiento = MyCuotasFacturas_Object.DiasVencimiento; MyVencimientosFactura.MontoCuota = MyCuotasFacturas_Object.MontoCuota; MyVencimientosFactura.MontoCuota = MyCuotasFacturas_Object.MontoCuota; MyVencimientosFactura.MontoCuotaDespuesIva = MyVencimientosFactura.MontoCuota; if (MyCuotasFacturas_Object.Iva != null) { MyVencimientosFactura.MontoCuotaDespuesIva += MyCuotasFacturas_Object.Iva.Value; MyVencimientosFactura.Iva = MyCuotasFacturas_Object.Iva; } MyVencimientosFactura.TotalAntesAnticipo = MyVencimientosFactura.MontoCuotaDespuesIva; // nótese ahora como calculamos el total de la factura en base a la opción usada por el usuario MyVencimientosFactura.RetencionSobreISLR = MyCuotasFacturas_Object.RetencionSobreISLR; MyVencimientosFactura.RetencionSobreIva = MyCuotasFacturas_Object.RetencionSobreIva; MyVencimientosFactura.FRecepcionRetencionISLR = MyCuotasFacturas_Object.FRecepcionRetencionISLR; MyVencimientosFactura.FRecepcionRetencionIva = MyCuotasFacturas_Object.FRecepcionRetencionIva; if (aplicarFechasRecepcionPlanillasRetencionImpuestos) { // solo consideramos las retenciones de impuesto (islr/iva) si se ha recibido (su planilla) if (MyVencimientosFactura.RetencionSobreISLR != null && MyVencimientosFactura.RetencionSobreISLR != 0 && MyVencimientosFactura.FRecepcionRetencionISLR != null) { if (MyVencimientosFactura.FRecepcionRetencionISLR.Value <= (DateTime)Session["FechaConsulta"]) { // el monto de retención existe y fue recibido ... lo aplicamos MyVencimientosFactura.TotalAntesAnticipo -= MyVencimientosFactura.RetencionSobreISLR.Value; MyVencimientosFactura.RetencionSobreISLRAplica = true; } } if (MyVencimientosFactura.RetencionSobreIva != null && MyVencimientosFactura.RetencionSobreIva != 0 && MyVencimientosFactura.FRecepcionRetencionIva != null) { if (MyVencimientosFactura.FRecepcionRetencionIva.Value <= (DateTime)Session["FechaConsulta"]) { // el monto de retención existe y fue recibido ... lo aplicamos MyVencimientosFactura.TotalAntesAnticipo -= MyVencimientosFactura.RetencionSobreIva.Value; MyVencimientosFactura.RetencionSobreIvaAplica = true; } } } else { // siempre consideramos los montos de retención de impuesto; es decir, siempre se restan del monto a pagar if (MyVencimientosFactura.RetencionSobreISLR != null && MyVencimientosFactura.RetencionSobreISLR != 0) { MyVencimientosFactura.TotalAntesAnticipo -= MyVencimientosFactura.RetencionSobreISLR.Value; MyVencimientosFactura.RetencionSobreISLRAplica = true; } if (MyVencimientosFactura.RetencionSobreIva != null && MyVencimientosFactura.RetencionSobreIva != 0) { MyVencimientosFactura.TotalAntesAnticipo -= MyVencimientosFactura.RetencionSobreIva.Value; MyVencimientosFactura.RetencionSobreIvaAplica = true; } } MyVencimientosFactura.Total = MyVencimientosFactura.TotalAntesAnticipo; MyVencimientosFactura.Anticipo = MyCuotasFacturas_Object.Anticipo; if (MyVencimientosFactura.Anticipo != null) { MyVencimientosFactura.Total -= MyVencimientosFactura.Anticipo.Value; } MyVencimientosFactura.SaldoPendiente = MyVencimientosFactura.Total; if (nMontoPagado != null) { MyVencimientosFactura.MontoPagado = nMontoPagado; MyVencimientosFactura.SaldoPendiente -= nMontoPagado.Value; } if (MyVencimientosFactura.SaldoPendiente == 0) { continue; } // el procediemiento que sigue determina la antiguedad del saldo, en base a la fecha de vencimiento // del saldo, la fecha de la consulta y la cantidad de días que el usuario registro en la tabla // PeriodosVencimiento int nDiasTranscurridos = 0; decimal nSaldoPendiente0 = 0; decimal nSaldoPendiente1 = 0; decimal nSaldoPendiente2 = 0; decimal nSaldoPendiente3 = 0; decimal nSaldoPendiente4 = 0; DeterminarAntiguedadSaldoPendiente((DateTime)(Session["FechaConsulta"]), MyVencimientosFactura.FechaVencimiento, MyVencimientosFactura.SaldoPendiente, nCantDias1, nCantDias2, nCantDias3, out nDiasTranscurridos, out nSaldoPendiente0, out nSaldoPendiente1, out nSaldoPendiente2, out nSaldoPendiente3, out nSaldoPendiente4); MyVencimientosFactura.DiasPorVencerOVencidos = nDiasTranscurridos; MyVencimientosFactura.SaldoPendiente_0 = nSaldoPendiente0; MyVencimientosFactura.SaldoPendiente_1 = nSaldoPendiente1; MyVencimientosFactura.SaldoPendiente_2 = nSaldoPendiente2; MyVencimientosFactura.SaldoPendiente_3 = nSaldoPendiente3; MyVencimientosFactura.SaldoPendiente_4 = nSaldoPendiente4; MyVencimientosFactura.NombreUsuario = Membership.GetUser().UserName; MyVencimientosFactura_List.Add(MyVencimientosFactura); } BancosDB.Dispose(); TempDB.Bancos_VencimientoFacturas.InsertAllOnSubmit(MyVencimientosFactura_List); try { TempDB.SubmitChanges(); } catch (Exception ex) { TempDB.Dispose(); ErrMessage_Span.InnerHtml = "Ha ocurrido un error al intentar ejecutar una operación de acceso a la base de datos. <br /> El mensaje específico de error es: " + ex.Message + "<br /><br />"; ErrMessage_Span.Style["display"] = "block"; return; } TempDB.Dispose(); // ------------------------------------------------------------------------------------------------ // hacemos el databinding de los dos combos CiasContabSeleccionadas_SqlDataSource.SelectParameters["NombreUsuario"].DefaultValue = Membership.GetUser().UserName; MonedasSeleccionadas_SqlDataSource.SelectParameters["NombreUsuario"].DefaultValue = Membership.GetUser().UserName; CxCCxPFlag_SqlDataSource.SelectParameters["NombreUsuario"].DefaultValue = Membership.GetUser().UserName; CompaniasSeleccionadas_DropDownList.DataBind(); MonedasSeleccionadas_DropDownList.DataBind(); CxCCxPFlag_DropDownList.DataBind(); //ComprobantesContables_LinqDataSource.WhereParameters("Moneda").DefaultValue = -999 //ComprobantesContables_LinqDataSource.WhereParameters("CiaContab").DefaultValue = -999 // intentamos usar como parametros del LinqDataSource el primer item en los combos Monedas y CiasContab if (CompaniasSeleccionadas_DropDownList.Items.Count > 0) { CompaniasSeleccionadas_DropDownList.SelectedIndex = 0; VencimientoSaldosFacturas_SqlDataSource.SelectParameters["CiaContab"].DefaultValue = CompaniasSeleccionadas_DropDownList.SelectedValue; } if (MonedasSeleccionadas_DropDownList.Items.Count > 0) { MonedasSeleccionadas_DropDownList.SelectedIndex = 0; VencimientoSaldosFacturas_SqlDataSource.SelectParameters["Moneda"].DefaultValue = MonedasSeleccionadas_DropDownList.SelectedValue; } if (CxCCxPFlag_DropDownList.Items.Count > 0) { CxCCxPFlag_DropDownList.SelectedIndex = 0; VencimientoSaldosFacturas_SqlDataSource.SelectParameters["CxCCxPFlag"].DefaultValue = CxCCxPFlag_DropDownList.SelectedValue; } VencimientoSaldosFacturas_SqlDataSource.SelectParameters["NombreUsuario"].DefaultValue = Membership.GetUser().UserName; this.ListView1.DataBind(); // -------------------------------------------------------------------------------- // para mostrar el período indicado por el usuario como un subtítulo de la página HtmlContainerControl MyHtmlSpan = (HtmlContainerControl)Master.FindControl("PageSubTitle_Span"); if (MyHtmlSpan != null) { switch (short.Parse(Session["TipoConsulta"].ToString())) { case 1: // análisis de montos por vencer { if (fechaInicial_consulta == new DateTime(1960, 1, 1)) { MyHtmlSpan.InnerHtml = "Antiguedad de saldos por vencer al: " + DateTime.Parse(Session["FechaConsulta"].ToString()).ToString("dd-MMM-yy"); } else { MyHtmlSpan.InnerHtml = "Antiguedad de saldos por vencer - " + fechaInicial_consulta.ToString("dd-MMM-yy") + " al " + DateTime.Parse(Session["FechaConsulta"].ToString()).ToString("dd-MMM-yy"); } TipoConsulta_Label.Text = "(Nota: una cantidad de días negativa indica un saldo pendiente ya vencido)"; break; case 2: // análisis de montos vencidos if (fechaInicial_consulta == new DateTime(1960, 1, 1)) { MyHtmlSpan.InnerHtml = "Antiguedad de saldos vencidos al: " + DateTime.Parse(Session["FechaConsulta"].ToString()).ToString("dd-MMM-yy"); } else { MyHtmlSpan.InnerHtml = "Antiguedad de saldos vencidos - " + fechaInicial_consulta.ToString("dd-MMM-yy") + " al " + DateTime.Parse(Session["FechaConsulta"].ToString()).ToString("dd-MMM-yy"); } TipoConsulta_Label.Text = "(Nota: una cantidad de días positiva indica un saldo pendiente por vencerse)"; break; } } }