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:

Proceso Clase Java Descripción Funcional y Uso
Motor de Reportes Financieros FinReport.java Generador dinámico de Balance General y Estado de Resultados utilizando cubos de reportes o la tabla Fact_Acct directamente.
Generador de Diarios Contables GLJournalGenerate.java Automatiza la creación de asientos de diario (GL Journals) a partir de reglas, multiplicadores y redondeos de saldos existentes.
Auxiliar Contable (Estado de Cuenta) AccountingLedger.java Genera la información detallada de transacciones auxiliares calculando saldos iniciales y saldos acumulados progresivos.
Antigüedad de Saldos Aging.java Clasifica facturas y cobros/pagos pendientes en rangos de vencimiento (corriente, 30, 60, 90, 120+ días) a una fecha de corte.
Generador Jerárquico de Líneas (DFS) DFSGenerateLines.java 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.

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.

Motor de Reportes Financieros

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.
Motor de Reportes Financieros

Parámetros

Al ejecutar el proceso FinReport en Lirion o iDempiere, se presentan los siguientes parámetros de configuración:

Parámetro Nombre en BD Descripción / Uso
Período C_Period_ID Período contable base sobre el cual generar el reporte. Si está vacío, calcula el período basado en la fecha del sistema.
Jerarquía de Organización PA_Hierarchy_ID Estructura de árbol organizativo para consolidar múltiples sucursales u organizaciones.
Organización Org_ID Filtro opcional para limitar el reporte a una organización específica (y opcionalmente a sus hijas dentro de la jerarquía).
Socio de Negocio C_BPartner_ID Filtro opcional para segmentar los saldos por un tercero específico.
Producto M_Product_ID Filtro opcional para segmentar por un producto.
Cubo de Reportes PA_ReportCube_ID Cubo de datos opcional para acelerar la extracción de saldos pre-agrupados en lugar de la tabla de hechos Fact_Acct.
Detalle de Origen Primero DetailsSourceFirst Determina si las líneas detalladas de origen contable se muestran antes de las líneas de totales correspondientes.

Generador de Notas Contables


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 Notas Contables

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:

Parámetro Nombre en BD Descripción / Uso
Rango de Fechas ProcessingDate Rango de fechas (Desde/Hasta) para filtrar y acumular los montos del diario origen (Fact_Acct).
Fecha de Contabilidad DateAcct Fecha contable del asiento de diario generado. Determina el período contable destino.
Es Simulación IsSimulation 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.
Acción de Documento DocAction La acción de documento contable que se aplicará automáticamente tras crear el diario (Completar, Preparar, etc.).
Nº del Documento DocumentNo Número de documento personalizado opcional para el diario generado. Si está vacío, usa la secuencia predeterminada del tipo de documento.
Socio de Negocio C_BPartner_ID Filtro opcional para extraer los saldos de origen contable pertenecientes a un tercero específico.
Producto M_Product_ID Filtro opcional para extraer los saldos de origen contable pertenecientes a un producto específico.
Jerarquía de Organización PA_Hierarchy_ID Estructura organizativa para consolidar movimientos contables de múltiples subsidiarias o sucursales.

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.

Auxiliar Contable (Estado de Cuenta)

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:

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.

Auxiliar Contable (Estado de Cuenta)

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:

Parámetro Nombre en BD Descripción / Uso
Esquema Contable C_AcctSchema_ID El esquema de cuentas del cual se extraerán las transacciones (parámetro obligatorio).
Tipo de Asiento PostingType Filtro por tipo de registro (A = Real, S = Presupuestado, P = Planificado). Por defecto, 'A'.
Período C_Period_ID Define el período contable para deducir fechas en caso de que no se especifique un rango manual.
Fecha Contable DateAcct Rango de fechas (desde/hasta) para el análisis auxiliar.
Cuenta Contable Account_ID La cuenta natural a procesar. El proceso soporta la expansión jerárquica si se indica una jerarquía en el árbol.
Socio de Negocio C_BPartner_ID Filtro opcional para extraer transacciones correspondientes a un tercero específico.
Jerarquía PA_Hierarchy_ID Jerarquía para la resolución estructural del árbol organizativo o de cuentas.
Dimensiones Adicionales Varios IDs 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).

Antigüedad de Saldos

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:

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.

Antigüedad de Saldos

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:

Parámetro Nombre en BD Descripción / Uso
Fecha de Corte StatementDate Fecha de corte de saldos para calcular los rangos de antigüedad. Si se deja en blanco, asume el día de hoy.
A Fecha Contable DateAcct 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.
Transacción de Ventas IsSOTrx Indica si se procesa la antigüedad de cuentas por cobrar de clientes (Y) o cuentas por pagar de proveedores (N).
Convertir a Moneda ConvertAmountsInCurrency_ID Moneda de presentación de reporte. Realiza conversiones automáticas al ID seleccionado.
Organización AD_Org_ID Filtro opcional para limitar la extracción a una sucursal u organización específica.
Grupo de Terceros C_BP_Group_ID Filtro opcional para evaluar únicamente una categoría específica de socios de negocio.
Socio de Negocio C_BPartner_ID Filtro contable opcional para evaluar un tercero de forma individual.
Listar Facturas IsListInvoices 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.

Generador Jerárquico de Líneas (DFS)

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:

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.

Generador Jerárquico de Líneas (DFS)

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:

Parámetro Nombre en BD Descripción / Uso
Elemento Contable C_Element_ID El catálogo de cuentas (Chart of Accounts) de donde se leerá la estructura jerárquica.
Cuenta Raíz C_ElementValue_ID El nodo de cuenta a partir del cual se elijo iniciar la travesía DFS (por ejemplo, la cuenta de Activo, Pasivo o Ingresos).
Filtrar Solo Cuentas de Resumen IsSummary 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.