# Informes Financieros

Este libro técnico detalla el funcionamiento y la arquitectura de los procesos clave incluidos en el plugin . Este módulo amplía las capacidades financieras y contables nativas de Lirion, permitiendo la generación avanzada de estados financieros, automatización de diarios contables, análisis de antigüedad de saldos, generación de auxiliares de contabilidad y automatización de estructuras jerárquicas.

# Introducción y Resumen de Procesos

Este libro técnico detalla el funcionamiento y la arquitectura de los procesos clave incluidos en el plugin `com.cdsoftware.finreport`. Este módulo amplía las capacidades financieras y contables nativas de iDempiere/Lirion, permitiendo la generación avanzada de estados financieros, automatización de diarios contables, análisis de antigüedad de saldos, generación de auxiliares de contabilidad y automatización de estructuras jerárquicas.

> **Propósito del Módulo:** Proporcionar herramientas robustas para la consolidación, análisis y automatización contable directa en el núcleo de iDempiere, optimizando el rendimiento mediante consultas a vistas precalculadas y el uso eficiente de tablas temporales de base de datos.

## Procesos Contenidos en el Plugin

El plugin está estructurado en torno a cinco procesos principales, cada uno diseñado para resolver una necesidad contable o de generación de informes específica:

<table id="bkmrk-proceso-clase-java-d" 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;">Proceso</th><th style="border:1px solid #d8dee9;padding:12px;background:#eef2f7;text-align:left;">Clase Java</th><th style="border:1px solid #d8dee9;padding:12px;background:#eef2f7;text-align:left;">Descripción Funcional y Uso</th></tr></thead><tbody><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">[**Motor de Reportes Financieros**](capitulo_1_fin_report/1_descripcion_general.html)</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`FinReport.java`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Generador dinámico de Balance General y Estado de Resultados utilizando cubos de reportes o la tabla Fact\_Acct directamente.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">[**Generador de Diarios Contables**](capitulo_2_gl_journal_generate/1_descripcion_general.html)</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`GLJournalGenerate.java`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Automatiza la creación de asientos de diario (GL Journals) a partir de reglas, multiplicadores y redondeos de saldos existentes.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">[**Auxiliar Contable (Estado de Cuenta)**](capitulo_3_accounting_ledger/1_descripcion_general.html)</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`AccountingLedger.java`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Genera la información detallada de transacciones auxiliares calculando saldos iniciales y saldos acumulados progresivos.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">[**Antigüedad de Saldos**](capitulo_4_aging/1_descripcion_general.html)</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`Aging.java`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Clasifica facturas y cobros/pagos pendientes en rangos de vencimiento (corriente, 30, 60, 90, 120+ días) a una fecha de corte.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">[**Generador Jerárquico de Líneas (DFS)**](capitulo_5_dfs_generate_lines/1_descripcion_general.html)</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`DFSGenerateLines.java`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Utiliza una búsqueda en profundidad (DFS) sobre el árbol de cuentas para crear de manera automática las líneas y orígenes de reportes.</td></tr></tbody></table>

<p class="callout info">**Nota:** Para desarrolladores e implementadores, cada sección detalla los parámetros de entrada requeridos en iDempiere, las tablas temporales utilizadas y las validaciones de negocio implementadas en el código fuente.</p>

# Motor de Reportes Financieros

# Descripción General

El proceso **FinReport** es el motor principal para la generación de reportes financieros personalizados en iDempiere/Lirion (como el Balance General, Estado de Resultados, etc.). Este proceso lee definiciones dinámicas de filas y columnas, consolida los montos contables desde el diario real y genera la salida lista para impresión o exportación.

> **Funcionamiento del Motor:** A diferencia de los informes contables rígidos, FinReport permite definir estructuras complejas en las ventanas de Configuración de Reportes (PA\_Report), aplicando cálculos matemáticos entre columnas, porcentajes de participación y expansiones jerárquicas dinámicas.

## Flujo de Ejecución Técnico

El proceso sigue los siguientes pasos durante su ejecución en el servidor:

1. **Inicialización:** Carga la definición del reporte (`PA_Report`) utilizando el ID del registro seleccionado y calcula los periodos contables basados en el calendario y offsets definidos.
2. **Limpieza y Preparación:** Inserta filas vacías temporales en la tabla de base de datos `T_Report` correspondientes a la estructura de líneas configurada (`PA_ReportLine`).
3. **Consolidación Contable:** Consulta los registros de transacciones contables acumulando saldos de débito y crédito. Si se especifica un Cubo de Reportes (`PA_ReportCube`), consulta `Fact_Acct_Summary`; de lo contrario, lee directamente de `Fact_Acct`.
4. **Cálculos Dinámicos:** Procesa fórmulas matemáticas definidas para columnas, porcentajes de líneas y cálculos acumulativos.
5. **Formateo y Renderizado:** Crea o actualiza dinámicamente un formato de impresión (`MPrintFormat`) personalizado con los anchos y estilos adecuados para las columnas calculadas, y limpia de la tabla `T_Report` las líneas marcadas como no imprimibles.

# Parámetros

Al ejecutar el proceso **FinReport** en Lirion o 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;">**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;">Período contable base sobre el cual generar el reporte. Si está vacío, calcula el período basado en la fecha del sistema.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Jerarquía de Organización**</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;">Estructura de árbol organizativo para consolidar múltiples sucursales u organizaciones.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Organización**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`Org_ID`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Filtro opcional para limitar el reporte a una organización específica (y opcionalmente a sus hijas dentro de la jerarquía).</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 segmentar los saldos por un tercero específico.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Producto**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`M_Product_ID`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Filtro opcional para segmentar por un producto.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Cubo de Reportes**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`PA_ReportCube_ID`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Cubo de datos opcional para acelerar la extracción de saldos pre-agrupados en lugar de la tabla de hechos Fact\_Acct.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Detalle de Origen Primero**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`DetailsSourceFirst`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Determina si las líneas detalladas de origen contable se muestran antes de las líneas de totales correspondientes.</td></tr></tbody></table>

# Generador de Notas Contables

# Descripción General

El proceso **Generador de Diarios Contables** (`GLJournalGenerate`) automatiza la creación de asientos de diario en PrimApp / iDempiere a partir de los saldos de transacciones acumulados en el diario real (tabla `Fact_Acct`). Este proceso aplica multiplicadores, reglas de agrupamiento de dimensiones contables y factores de redondeo configurados en una plantilla predefinida.

> **Automatización de Cierres Contables:** Este proceso es clave para realizar provisiones contables automáticas, distribución de costos indirectos, reclasificaciones de saldos de fin de mes o amortizaciones sin necesidad de cálculos manuales externos.

## Flujo de Ejecución Técnico

Cuando el proceso se ejecuta, realiza el siguiente flujo de procesamiento en el servidor de aplicaciones:

1. **Carga de la Plantilla Contable:** Instancia la plantilla de configuración del generador (`QSS_JournalGenerator`) utilizando el ID del registro activo.
2. **Definición del Agrupamiento (Dimensiones):** Determina qué dimensiones contables se heredarán en las líneas del diario contable de destino: 
    - Si `CopyAllDimensions` está marcado en la línea del generador, el proceso agrupa y copia dinámicamente todos los elementos del esquema contable (Tercero, Producto, Proyecto, Actividad, Campaña, etc.).
    - Si no está marcado, solo agrupa y copia el Tercero (según la regla `BPDimensionType`) y/o el Producto (si `SameProduct` está activo).
3. **Extracción y Sumarización:** Ejecuta consultas SQL dinámicas sobre `Fact_Acct` agrupadas por las dimensiones resultantes. Filtra las transacciones contables reales (`PostingType = 'A'`) en base a las cuentas contables del árbol definidas en las Fuentes del Generador (`QSS_JournalGeneratorSource`).
4. **Cálculo de Multiplicadores y Redondeo:**
    - Para cada fuente de origen, multiplica el saldo neto (`AmtAcctDr - AmtAcctCr`) por el multiplicador de la fuente (`AmtMultiplier`) y aplica su respectivo redondeo.
    - Suma los montos resultantes y, a nivel de línea de destino, aplica el multiplicador de la línea y el factor de redondeo de destino (`RoundFactor`).
5. **Resolución Dinámica de Terceros:** Si el tipo de dimensión de tercero es `Column`, el proceso inspecciona el registro referenciado en la base de datos (por ejemplo, obteniendo el socio de negocio asignado a un proyecto o activo) para mapearlo dinámicamente como el tercero de la línea del diario.
6. **Balanceo Contable:** Calcula la diferencia neta entre los débitos y créditos resultantes de todo el lote. Si existe una diferencia menor debido a redondeos o porcentajes de distribución, genera automáticamente una línea de ajuste utilizando la cuenta de Ajuste Deudor (`AdjustDR`) o Ajuste Acreedor (`AdjustCR`) definida en el generador.
7. **Generación de Asiento:**
    - Si **Es Simulación** está activo (`IsSimulation = true`), el proceso imprime en pantalla y en la bitácora el detalle de las líneas calculadas sin modificar los datos del sistema.
    - Si no es simulación, crea físicamente la cabecera del diario (`GL_Journal`), genera las combinaciones contables correspondientes (`C_ValidCombination`) para cada línea (`GL_JournalLine`) y ejecuta la acción de documento parametrizada (por ejemplo, Completar el Asiento).

## Estructura de Plantillas de Configuración

El comportamiento contable y el direccionamiento del proceso se gobiernan a través de tres niveles de registros:

- **Generador de Diarios (Cabecera):** Define el Esquema Contable (`C_AcctSchema_ID`), la Organización, el Tipo de Documento, la Categoría de Diario, el Tipo de Registro (Generalmente Real 'A') y las Cuentas de Ajuste por Redondeo.
- **Línea de Generación:** Define las cuentas contables definitivas en las que se registrarán el Débito (`C_ElementValueDR_ID`) y/o el Crédito (`C_ElementValueCR_ID`), así como el tipo de agrupamiento de dimensiones (como el Tipo de Tercero: *Fijo, Mismo Origen, Columna Externa*) y sus multiplicadores finales.
- **Fuente del Generador:** Define qué cuenta contable o árbol contable de origen (`C_ElementValue_ID`) en `Fact_Acct` proporcionará la información de saldo financiero, y qué porcentaje o multiplicador individual se le aplicará.

# Parámetros

Al ejecutar el proceso **Generador de Diarios Contables** desde 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;">**Rango de Fechas**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`ProcessingDate`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Rango de fechas (Desde/Hasta) para filtrar y acumular los montos del diario origen (Fact\_Acct).</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Fecha de Contabilidad**</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;">Fecha contable del asiento de diario generado. Determina el período contable destino.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Es Simulación**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`IsSimulation`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Si se marca como "Sí" (Y), el generador solo muestra una previsualización de los montos resultantes en el registro de log sin crear el asiento real.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Acción de Documento**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`DocAction`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">La acción de documento contable que se aplicará automáticamente tras crear el diario (Completar, Preparar, etc.).</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Nº del Documento**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`DocumentNo`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Número de documento personalizado opcional para el diario generado. Si está vacío, usa la secuencia predeterminada del tipo de documento.</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 los saldos de origen contable pertenecientes a un tercero específico.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Producto**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`M_Product_ID`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Filtro opcional para extraer los saldos de origen contable pertenecientes a un producto específico.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Jerarquía de Organización**</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;">Estructura organizativa para consolidar movimientos contables de múltiples subsidiarias o sucursales.</td></tr></tbody></table>

<p class="callout warning">**Importante:** El proceso requiere que el diario generado contenga al menos una línea válida y sea posible balancearlo. Asegúrese de que las cuentas de ajuste contable de débitos y créditos estén debidamente configuradas en la cabecera del Generador de Diarios para evitar fallas en ejecuciones definitivas.</p>

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

# Antigüedad de Saldos

# Descripción General

El proceso de **Antigüedad de Saldos** (`Aging`) analiza las facturas de venta y de compra pendientes de cobro o pago, junto con los cobros y pagos no aplicados, clasificándolos en rangos de vencimiento (corriente, 1-30, 31-60, 61-90, 91-120, 120+ días) a una fecha de corte específica. El resultado se registra en la tabla temporal `T_Aging` a través del modelo `MAging`.

> **Cálculo Histórico y Conversión de Monedas:** Este proceso destaca por su capacidad de generar reportes de antigüedad retroactivos a cualquier fecha histórica (mediante la vista `RV_OpenItemToDate`) y convertir dinámicamente todos los montos a una moneda de presentación común utilizando las tasas de cambio contables del sistema.

## Flujo de Ejecución Técnico

El proceso sigue las siguientes etapas durante su ejecución en el servidor:

1. **Cálculo del Desfase de Fecha de Corte:** Carga la fecha de corte parametrizada (`StatementDate`). Si está vacía, asume la fecha actual del sistema. Calcula la diferencia en días entre hoy y la fecha de corte (`m_statementOffset`) para ajustar dinámicamente los días de vencimiento (`DaysDue`) obtenidos de la base de datos.
2. **Selección del Origen de Datos (Actual vs. Histórico):**
    - **Modo de Saldos Actuales (DateAcct = Falso):** Consulta la vista estándar de partidas abiertas del sistema (`RV_OpenItem`), reflejando los saldos pendientes a la fecha actual del sistema.
    - **Modo Histórico (DateAcct = Verdadero):** Consulta la vista histórica de partidas abiertas (`RV_OpenItemToDate`) y calcula los importes pagados y abiertos a la fecha de corte del reporte mediante las funciones nativas de base de datos `invoicePaidToDate(...)` y `invoiceOpenToDate(...)`.
3. **Conversión de Moneda Opcional:** Si el usuario especifica una moneda destino en el parámetro `ConvertAmountsInCurrency_ID`, el proceso encapsula las columnas de importes contables en la consulta SQL dentro de la función `currencyConvert(...)` utilizando la moneda de origen de la transacción, el ID de moneda destino, la fecha de contabilidad, el tipo de conversión y los datos de cliente/organización.
4. **Agregación e Inserción en T\_Aging (Modelo MAging):**
    - Ejecuta la consulta generada aplicando filtros por Organización, Grupo de Socios de Negocio o Tercero específico.
    - Para cada fila devuelta, ajusta los días de retraso del pago sumando el desfase: `DaysDue + m_statementOffset`.
    - Si el parámetro **Listar Facturas** (`IsListInvoices`) está activo, genera registros desglosados detallando la factura, la fecha de facturación, el plan de pagos (C\_InvoicePaySchedule\_ID), la actividad, el proyecto y la campaña. Si no está marcado, agrupa la información del saldo consolidado por Socio de Negocio.
    - Inserta los cobros y pagos no aplicados (*cobros a cuenta* o anticipos donde `C_Payment_ID > 0`) como saldos abiertos negativos en el reporte para disminuir el saldo vencido general de forma correcta.
    - Llama a `MAging.add(...)` para mapear los montos en los rangos de mora correspondientes y los persiste en la tabla temporal de base de datos `T_Aging`.

## Estructura de la Tabla Temporal T\_Aging

El proceso interactúa directamente con la tabla de base de datos intermedia `T_Aging`. Los campos y cubetas clave utilizados son:

- `AD_PInstance_ID`: Código numérico único de ejecución de proceso que garantiza el aislamiento de consultas concurrentes.
- `StatementDate`: Fecha de corte a la que fue calculado el análisis contable.
- `C_BPartner_ID`: Identificador del socio de negocio asociado al saldo contable.
- `C_Currency_ID`: Moneda de registro de los importes contables resultantes.
- `DueAmt`: Monto total del saldo abierto contable del tercero o documento.
- `PastDueAmt0` a `PastDueAmt5`: Distribución de montos contables abiertos en las diferentes cubetas de mora contable (por ejemplo, corriente, 1-30, 31-60, 61-90, 91-120 y más de 120 días).

<p class="callout info">**Nota:** Los cobros y pagos que han sido registrados en cuentas pero no han sido aplicados a facturas (cobros y pagos a cuenta) son clasificados de manera automática en la columna de saldo contable *corriente* (PastDueAmt0) para compensar y reflejar el valor neto real de deuda del tercero.</p>

# Parámetros

Al ejecutar el proceso de **Antigüedad de Saldos (Aging)** en Lirion o 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;">**Fecha de Corte**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`StatementDate`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Fecha de corte de saldos para calcular los rangos de antigüedad. Si se deja en blanco, asume el día de hoy.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**A 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;">Si se marca como "Sí" (Y), calcula la antigüedad utilizando los saldos a la fecha histórica indicada (retroactivo). Si es "No" (N), calcula los saldos vigentes actuales.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Transacción de Ventas**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`IsSOTrx`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Indica si se procesa la antigüedad de cuentas por cobrar de clientes (Y) o cuentas por pagar de proveedores (N).</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Convertir a Moneda**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`ConvertAmountsInCurrency_ID`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Moneda de presentación de reporte. Realiza conversiones automáticas al ID seleccionado.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Organización**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`AD_Org_ID`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Filtro opcional para limitar la extracción a una sucursal u organización específica.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Grupo de Terceros**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`C_BP_Group_ID`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Filtro opcional para evaluar únicamente una categoría específica de socios de negocio.</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 contable opcional para evaluar un tercero de forma individual.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Listar Facturas**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`IsListInvoices`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Si se marca como "Sí" (Y), desglose individual de las facturas con sus rangos de vencimiento. Si es "No" (N), muestra los totales acumulados por socio de negocio.</td></tr></tbody></table>

# Generador Jerárquico de Líneas (DFS)

# Descripción General

El proceso **Generador Jerárquico de Líneas (DFS)** (`DFSGenerateLines`) automatiza la creación de la estructura de líneas de reporte (`PA_ReportLine`) y sus correspondientes orígenes (`PA_ReportSource`) en iDempiere/Lirion. Para lograr esto, realiza un recorrido en profundidad (Depth-First Search - DFS) sobre el árbol del catálogo de cuentas, partiendo de un nodo raíz seleccionado.

> **Propósito del Generador DFS:** Evitar la configuración manual de docenas o cientos de líneas contables al estructurar reportes financieros. Al leer jerarquías existentes del catálogo de cuentas, recrea la estructura exacta de manera jerárquica con sus sumatorias automáticas.

## Flujo de Ejecución Técnico

Cuando el proceso se ejecuta, realiza los siguientes pasos en la base de datos y el servidor de aplicaciones:

1. **Secuenciación Inicial:** Identifica el último número de secuencia (`SeqNo`) registrado en el conjunto de líneas activo (`PA_ReportLineSet_ID`) para continuar la numeración incremental desde allí (con saltos de 10 en 10).
2. **Carga del Árbol de Cuentas:** Carga la definición del elemento contable (`C_Element_ID`) y recupera la estructura del árbol jerárquico asociado.
3. **Búsqueda del Nodo Raíz:** Localiza el nodo inicial (`C_ElementValue_ID`) con parent\_id = 0 en el árbol configurado para iniciar el recorrido desde esa posición específica del catálogo.
4. **Recorrido Recursivo DFS:** Recorre recursivamente cada nodo del subárbol: 
    - **Filtro de Resumen (IsSummary):** Valida si el nodo actual debe ser procesado de acuerdo al parámetro configurado.
    - **Creación de Línea:** Si corresponde procesarlo, crea un registro en la tabla `PA_ReportLine` con el nombre y descripción del elemento.
    - **Asignación de Origen (Leaf Nodes):** Si el nodo es una hoja (no tiene hijos), crea un registro en `PA_ReportSource` vinculándolo directamente al elemento contable (cuenta de detalle).
    - **Generación de Totales:** Si el nodo es un nodo de resumen (tiene hijos), tras procesar recursivamente a todos sus descendientes, genera automáticamente una línea de totalización con la descripción "Total \[Código Cuenta\]" y vincula su origen.

## Tablas de iDempiere Utilizadas

El proceso interactúa y modifica las siguientes tablas del diccionario de datos de iDempiere:

- `AD_TreeNode`: Define la relación jerárquica (Padre/Hijo) entre los elementos del árbol contable.
- `C_ElementValue`: Almacena las cuentas contables individuales, su código, nombre y tipo (detalle o resumen).
- `PA_ReportLineSet`: Cabecera del conjunto de líneas activo sobre el cual se ejecuta el proceso (el ID del registro actual de la ventana).
- `PA_ReportLine`: Registros de líneas de reporte que se insertan de forma secuencial durante el recorrido DFS.
- `PA_ReportSource`: Orígenes de datos que asocian cada línea de reporte con su cuenta correspondiente del catálogo.

<p class="callout warning">**Importante:** Este proceso realiza inserciones directas sobre la estructura activa de `PA_ReportLineSet`. Se recomienda realizar una copia de seguridad o ejecutar en un conjunto de prueba, ya que no elimina líneas existentes antes de la inserción y podría duplicar secuencias si se ejecuta múltiples veces en el mismo registro.</p>

# Parámetros

Al ejecutar el proceso **Generador Jerárquico de Líneas (DFS)** en Lirion o 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;">**Elemento Contable**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`C_Element_ID`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">El catálogo de cuentas (Chart of Accounts) de donde se leerá la estructura jerárquica.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Cuenta Raíz**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`C_ElementValue_ID`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">El nodo de cuenta a partir del cual se elijo iniciar la travesía DFS (por ejemplo, la cuenta de Activo, Pasivo o Ingresos).</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Filtrar Solo Cuentas de Resumen**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">`IsSummary`</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Filtro opcional. Si es `Y`, el generador solo creará líneas para las cuentas marcadas como de resumen (isSummary = 'Y') en el catálogo. Si es vacío o `N`, procesará todas las cuentas del subárbol.</td></tr></tbody></table>