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