# Auxiliar Contable (Estado de Cuenta)

# 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>

# Parámetros

Al ejecutar el proceso **Auxiliar Contable (Estado de Cuenta)** en la interfaz de PrimApp / iDempiere, se presentan los siguientes parámetros de configuración:

<table id="bkmrk-par%C3%A1metro-nombre-en-" style="width:100%;border-collapse:collapse;margin:12px 0 20px 0;"><thead><tr><th style="border:1px solid #d8dee9;padding:12px;background:#eef2f7;text-align:left;">Parámetro</th><th style="border:1px solid #d8dee9;padding:12px;background:#eef2f7;text-align:left;">Nombre en BD</th><th style="border:1px solid #d8dee9;padding:12px;background:#eef2f7;text-align:left;">Descripción / Uso</th></tr></thead><tbody><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Esquema Contable**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`C_AcctSchema_ID`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">El esquema de cuentas del cual se extraerán las transacciones (parámetro obligatorio).</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Tipo de Asiento**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`PostingType`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Filtro por tipo de registro (A = Real, S = Presupuestado, P = Planificado). Por defecto, 'A'.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Período**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`C_Period_ID`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Define el período contable para deducir fechas en caso de que no se especifique un rango manual.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Fecha Contable**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`DateAcct`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Rango de fechas (desde/hasta) para el análisis auxiliar.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Cuenta Contable**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`Account_ID`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">La cuenta natural a procesar. El proceso soporta la expansión jerárquica si se indica una jerarquía en el árbol.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Socio de Negocio**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`C_BPartner_ID`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Filtro opcional para extraer transacciones correspondientes a un tercero específico.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Jerarquía**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`PA_Hierarchy_ID`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Jerarquía para la resolución estructural del árbol organizativo o de cuentas.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Dimensiones Adicionales**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">*Varios IDs*</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Filtros opcionales para refinar la extracción por Organización (`AD_Org_ID`), Producto, Proyecto, Actividad, Campaña, Región de Ventas, y elementos de dimensiones personalizadas de usuario (`User1_ID`, `User2_ID`, `UserElement1_ID`, `UserElement2_ID`).</td></tr></tbody></table>