# Descripción General

El proceso **Auxiliar Contable (Estado de Cuenta)** (`AccountingLedger`) compila los movimientos contables detallados y calcula progresivamente el saldo acumulado (débitos, créditos y saldo en marcha) de una o varias cuentas contables dentro de un rango de fechas. La información consolidada se inserta en la tabla temporal `T_ReportStatementCDS` para facilitar su impresión y análisis.

> **Cálculo Eficiente de Saldos Progresivos:** A diferencia de las consultas tradicionales de bases de datos, este proceso aprovecha las funciones analíticas de ventana SQL y el uso de una tabla temporal segmentada por instancia de proceso (`AD_PInstance_ID`) para generar estados de cuenta complejos a gran velocidad.

## Flujo de Ejecución Técnico

El proceso ejecuta las siguientes etapas durante su ejecución en el servidor de aplicaciones:

1. **Inicialización de Rango de Fechas:** Si el usuario define fechas específicas en el parámetro `DateAcct`, se utilizan dichos valores. Si no especifica fechas pero proporciona un `C_Period_ID`, extrae las fechas de inicio y fin de dicho período. Como último recurso, calcula los rangos basados en el mes calendario actual.
2. **Generación de Líneas de Detalle (LevelNo = 1):**
    - Consulta la vista contable diaria `cds_rv_fact_acct_day` aplicando los filtros de cuenta, organización, terceros, proyectos, actividades y dimensiones del usuario.
    - Calcula el balance acumulado de las transacciones usando la función analítica SQL: `SUM(AmtAcctDr - AmtAcctCr) OVER (PARTITION BY e.Value ORDER BY e.Value, a.DateAcct, e.Description ASC ROWS UNBOUNDED PRECEDING)`.
    - Inserta los resultados con `LevelNo = 1` en la tabla temporal.
3. **Cálculo del Saldo Inicial (LevelNo = 0):**
    - Suma los movimientos acumulados anteriores a la fecha de inicio del reporte.
    - **Control Contable de Cuentas de Resultados:** Si la cuenta procesada no es de Balance (sino una cuenta de gastos o ingresos), el proceso restringe la consulta del saldo inicial limitándola a la fecha de inicio del año fiscal en curso (obtenida mediante `MPeriod.getFirstInYear`). Esto evita la acumulación indebida de saldos históricos cerrados en ejercicios anteriores.
    - Inserta la línea de saldo consolidado inicial con la descripción fija `'SALDO INICIAL'` y `LevelNo = 0`.
4. **Actualización Masiva del Balance Acumulado:** Ejecuta un comando SQL de tipo `UPDATE` que recalcula y encadena el saldo acumulado real progresivo sumando el saldo inicial (`LevelNo = 0`) con el histórico detallado de transacciones (`LevelNo = 1`) ordenadas por fecha contable y descripción.

## Estructura de la Tabla Temporal T\_ReportStatementCDS

La tabla intermedia `t_reportstatementcds` consolida los registros antes de que iDempiere invoque al motor de renderizado del reporte. Los campos clave de esta tabla son:

- `AD_PInstance_ID`: Código numérico único asignado a la instancia del proceso ejecutado, permitiendo aislar las consultas concurrentes entre usuarios.
- `LevelNo`: Indica la jerarquía de la línea (`0` = Saldo Inicial; `1` = Detalle Transaccional).
- `DateAcct`: Fecha del movimiento contable.
- `Name` / `Description`: Nombre descriptivo o detalle de la transacción contable.
- `AmtAcctDr` / `AmtAcctCr`: Montos contables de débito y crédito.
- `Balance`: Saldo progresivo consolidado calculado a la fecha.
- `Account_ID` / `Account_Name`: Identificadores de la cuenta contable conteniendo la línea.
- `c_bpartner_id`: Socio de negocio de la transacción (tercero relacionado).

<p class="callout info">**Nota de Rendimiento:** La tabla temporal utiliza índices en su estructura de base de datos para los campos `AD_PInstance_ID`, `Account_ID` y `DateAcct` para garantizar velocidad óptima en grandes volúmenes de transacciones contables diarias.</p>