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