Saltar al contenido principal
Reporter solo está disponible con Midaz v.3.x.x. Para más información, consulta la versión más reciente de la documentación

¿Por qué usar Reporter?

En lugar de escribir consultas complejas, puedes usar marcadores simples para referenciar dominios, tablas y campos directamente. Es una forma rápida y flexible de construir informes que se mantienen actualizados, incluso cuando tu modelo de datos evoluciona.

Qué puede hacer

  • Consultas dinámicas con marcadores: Las plantillas usan marcadores simples para extraer datos directamente de la base de datos; no se requiere SQL.
  • Lógica de bucles y condiciones: Agrega bucles y condiciones para manejar escenarios más complejos sin complicar las cosas.
  • Procesamiento asíncrono: Los informes grandes se procesan de forma asíncrona para que no interfieran con tus cargas de trabajo en vivo.
  • Múltiples formatos de salida: Genera informes en CSV, XML, HTML o TXT — el que mejor se ajuste a tu caso de uso.

Por qué es importante

  • No se requiere código: Crea informes potentes con plantillas simples.
  • Flexible: Tus plantillas se adaptan automáticamente a medida que evoluciona el modelo de datos.
  • Rendimiento optimizado: Se ejecuta en una base de datos de lectura replicada para evitar ralentizaciones.

Modelo de plantillas

Reporter lee archivos de plantilla que siguen la estructura de la salida final, ya sea XML, CSV, HTML o TXT. El informe generado coincidirá exactamente con esta estructura.

Ejemplo

  • Plantilla estructurada en XML = salida XML.
  • Plantilla estructurada en CSV = salida CSV.
  • Plantilla estructurada en HTML = salida HTML.
  • Plantilla estructurada en TXT = salida TXT.
Aunque el contenido del archivo debe seguir el formato de salida, asegúrate de guardarlo con la extensión .tpl. Esto es necesario para que la plantilla funcione correctamente.

Configurando tu entorno

Antes de comenzar, debes renombrar las bases de datos utilizadas como referencias para buscar información mientras se renderizan los informes. Esta configuración debe realizarse en el archivo .env del proyecto. Al definir nombres únicos y claros para cada base de datos, evitamos conflictos, especialmente en casos donde diferentes bases de datos tienen tablas con los mismos nombres, y aseguramos una mejor fluidez en las consultas.

Ejemplo

Si estás utilizando una base de datos llamada onboarding, recomendamos renombrarla a algo más descriptivo, como:
  • midaz_onboarding (PostgreSQL).
  • midaz_onboarding_metadata (MongoDB).

Uso de marcadores

Las plantillas usan marcadores para obtener datos dinámicamente. Un marcador apunta a un campo dentro de una tabla o una colección de documentos, y sigue esta estructura:
{{ base.tabla_o_coleccion.campo_o_documento }}
Este formato funciona para bases de datos SQL (tablas) y MongoDB (colecciones), brindándote total flexibilidad independientemente de tu modelo de datos.

Construcción de plantillas

Puedes mejorar tus plantillas con condicionales, operadores matemáticos y variables temporales, haciéndolas más dinámicas y flexibles.

Bloques comunes

Bucle

Itera a través de un conjunto de datos y renderiza valores dentro del bloque. Aunque puede parecer un condicional, es una estructura de repetición. Ejemplo
{% for <condicion> %}
....
{% endfor %}

Condición simple

Verifica una regla lógica. Si es verdadera, se ejecuta el bloque. Ejemplo
{% if valor_a == valor_b %}
...
{% endif %}

Alcance temporal

Crea una variable temporal dentro del bloque. Esto hace que las plantillas sean más fáciles de leer y evita repetir rutas largas (como acceder al mismo objeto o campo varias veces). Ejemplo
{% with ... %}
...
{% endwith %}

Formato de valores

Te permite mostrar números con un número fijo de decimales, perfecto para mantener los valores financieros claros y consistentes.
  • Agrega un número después de los dos puntos para definir la precisión decimal. Por ejemplo, :2 muestra dos decimales: 123.45.
Ejemplo
{{{marcador}}|floatformat:2}

Bloques condicionales

BloqueDescripciónEjemplo
IfEjecuta un bloque si la condición es verdadera.{% if condicion %}...{% endif %}
If-elseEjecuta un bloque si es verdadero, otro si es falso.{% if condicion %}...{% else %}...{% endif %}
If - else - ifPermite múltiples verificaciones dentro del mismo bloque.{% if a %}...{% elif b %}...{% else %}...{% endif %}
IgualVerifica si dos valores son iguales.{% if a == b %}
No igualVerifica si dos valores son diferentes.{% if a != b %}
Mayor queVerifica si a es mayor que b.{% if a > b %}
Menor queVerifica si a es menor que b.{% if a < b %}
Mayor o igual queVerifica si a es mayor o igual que b.{% if a >= b %}
Menor o igual queVerifica si a es menor o igual que b.{% if a <= b %}
AndDevuelve verdadero si ambas condiciones son verdaderas.{% if a and b %}
OrDevuelve verdadero si al menos una condición es verdadera.{% if a or b %}
NotInvierte el resultado booleano de una condición.{% if not a %}

Operadores y filtros

Puedes combinar condiciones lógicas con operaciones matemáticas para definir reglas, calcular valores y formatear resultados con precisión. Ejemplo: Calculando la suma total con filtro y escala
<Sum>
  {% sum_by transaction.operation by "amount" if account_alias != "@external/BRL" scale 2 %}
</Sum>
Asumiendo los siguientes datos:
"transaction": {
  "operation": [
    { "amount": 1000, "account_alias": "@user/BRL" },
    { "amount": 500, "account_alias": "@external/BRL" },
    { "amount": 2500, "account_alias": "@user/BRL" }
  ]
}
La salida será:
<Sum>35.00</Sum>

Otras funciones

Contar
<Count>
  {% count_by transaction.operation if account_alias != "@external/BRL" %}
</Count>
Promedio
<Average>
  {% avg_by transaction.operation by "amount" if account_alias != "@external/BRL" scale 2 %}
</Average>
Mínimo
<Minimum>
  {% min_by transaction.operation by "amount" if account_alias != "@external/BRL" scale 2 %}
</Minimum>
Máximo
<Maximum>
  {% max_by transaction.operation by "amount" if account_alias != "@external/BRL" scale 2 %}
</Maximum>
Porcentaje Digamos que el usuario está generando un informe de gastos mensuales y quiere mostrar cuánto del total se gastó en “Comida”:
<Percentage>
  {{ category.amount | percent_of: total.expenses }}
</Percentage>
Si:
  • category.amount = 600
  • total.expenses = 2000
Salida:
<Percentage>
  30.00%
</Percentage>
Fecha Aplica la fecha actual al renderizar la plantilla. Puedes formatearla como necesites (ddMMyyyy, yyyyMMdd, y más). El tiempo también puede incluirse, como en el ejemplo siguiente.
El tiempo se genera en UTC (Tiempo Universal Coordinado), sin zonas horarias regionales o ajustes por horario de verano.
Entrada:
{% date_time "ddMMYYYY HH:mm"}
Salida:
13-05-2025 21:15
Contains (Contiene) Usa este filtro para verificar si un valor está parcialmente incluido en otro, incluso si no son idénticos. Es útil cuando tus datos incluyen prefijos o sufijos dinámicos, como en los alias de cuentas.
{% if contains(midaz_transaction.transaction.body.source.from.account_alias, midaz_onboarding.account.alias) %}
Ejemplo:
  • midaz_transaction.transaction.body.source.from.account_alias = 0#@external/BRL
  • midaz_onboarding.account.alias = @external/BRL
Aunque las cadenas no coinciden exactamente, contains devolverá true porque @external/BRL está dentro de 0#@external/BRL.

Operaciones matemáticas

Te permite realizar cálculos en los datos exportados.
Palabra claveDescripción
sum_bySuma valores.
-Resta.
*Multiplica.
/Divide.
avg_byCalcula el promedio.
min_byValor mínimo.
max_byValor máximo.
percent_ofCalcula el porcentaje.
filter(list, "field", value)Filtra listas como si fuera una cláusula WHERE.

¿Necesitas inspiración?

Consulta los Ejemplos de plantillas en la versión más reciente de la documentación para explorar qué puedes hacer y comenzar a dar forma a tu propia plantilla.