Saltar al contenido principal
Esta página te guía a través de un ejemplo completo de un reporte Financiero Analítico en XML. La plantilla desglosa la actividad a nivel de cuenta, aplica lógica personalizada (como descuentos) e incluye resúmenes claros para apoyar el análisis y la auditoría. Lo que muestra este reporte:
  • Detalles de Organización y Libro Contable.
  • Descripción general a nivel de cuenta: saldo, moneda y alias.
  • Desgloses de operaciones: monto original, descuento, monto final, estado, descripción y tipo.
  • Resúmenes por cuenta: total de operaciones, valor total y promedio por operación.

Código de plantilla


<AnalyticalReport>
    <Organization>{{ midaz_onboarding.legal_name }} - Tax ID: {{ midaz_onboarding.legal_document }}</Organization>
    <GenerationDate>28.04.2025</GenerationDate>
    {%- with ledger = midaz_onboarding.ledger[0] %}
    <Ledger>{{ ledger.name }}</Ledger>

    {%- for account in midaz_onboarding.account %}
    <Account>
        <AccountID>{{ account.id }}</AccountID>
        <Alias>{{ account.alias }}</Alias>
        {%- with balance = filter(midaz_transaction.balance, "account_id", account.id)[0] %}
        <CurrentBalance> {{ balance.available }}</CurrentBalance>
        {%- endwith %}
        {%- for balance in midaz_transaction.balance %}
        {%- if balance.account_id == account.id %}
        <CurrentBalance>{{ balance.available }}</CurrentBalance>
        {%- endif %}
        {%- endfor %}
        <Currency>{{ account.asset_code }}</Currency>
        <Operations>
        {%- for operation in midaz_transaction.operation %}
        {%- if operation.account_id == account.id %}
            {%- set original_amount = operation.amount %}
            {%- set discount_amount = original_amount * 0.03 %}
            {%- set final_amount = original_amount - discount_amount %} 
        <Operation>
                <OperationID>{{ operation.id }}</OperationID>
                <Description>{{ operation.description }}</Description>
                <Type>{{ operation.type }}</Type>
                <Route>{{ operation.route }}</Route>
                <OriginalAmount>{{ original_amount }}</OriginalAmount>
                <DiscountAmount>{{ discount_amount }}</DiscountAmount>
                <FinalAmountWithDiscount>{{ final_amount }}</FinalAmountWithDiscount>
                <Currency>{{ operation.asset_code }}</Currency>
                <Status>{{ operation.status }}</Status>
            </Operation>
        {%- endif %}
        {%- endfor %}
        </Operations>
        <AccountSummary>
            <TotalOperations>{% count_by midaz_transaction.operation if account_id == account.id %}</TotalOperations>
            <SumOfOperations>{% sum_by midaz_transaction.operation by "amount" if account_id == account.id %}</SumOfOperations>
            <AverageOfOperations>{% avg_by midaz_transaction.operation by "amount" if account_id == account.id %}</AverageOfOperations>
        </AccountSummary>
    </Account>
    {%- endfor %}
</AnalyticalReport>

Desglose del código


Información de Organización y Libro Contable

<AnalyticalReport>
    <Organization>{{ midaz_onboarding.legal_name }} - Tax ID: {{ midaz_onboarding.legal_document }}</Organization>
    <GenerationDate>{% date_time "dd/MM/YYYY HH:mm" %}</GenerationDate>
    {%- with ledger = midaz_onboarding.ledger[0] %}
    <Ledger>{{ ledger.name }}</Ledger>
<Organization>{{ midaz_onboarding.organization.legal_name }} - CNPJ: {{ midaz_onboarding.organization.legal_document }}</Organization> Muestra el nombre legal de la organización y el CNPJ correspondiente (ID fiscal brasileño).
  • {{ midaz_onboarding.organization.legal_name }}: recupera el nombre de la organización.
  • {{ midaz_onboarding.legal_document }}: recupera el CNPJ.
**<GenerationDate>{% date_time "dd/MM/YYYY HH:mm" %}</GenerationDate> Esta función aplica la fecha y hora cuando se renderiza la plantilla, usando el formato dd/MM/YYYY HH:mm. {%- with ledger = midaz_onboarding.ledger[0] %} Crea una variable temporal que apunta al primer libro contable disponible. Esto mantiene el código más limpio y evita referencias repetitivas.
  • -: elimina espacios adicionales en el archivo renderizado.
  • ledger: el nombre de la variable temporal.
  • midaz_onboarding.ledger[0].name: apunta al primer libro contable disponible.

Iterando a través de las cuentas

    {%- for account in midaz_onboarding.account %}
    <Account>
        <AccountID>{{ account.id }}</AccountID>
        <Alias>{{ account.alias }}</Alias>
        {%- with balance = filter(midaz_transaction.balance, "account_id", account.id)[0] %}
        <CurrentBalance> {{ balance.available }}</CurrentBalance>
        {%- endwith %}
{%- for account in midaz_onboarding.account %}{% endfor %} Recorre todas las cuentas vinculadas al usuario. Dado que la mayoría de los usuarios tienen más de una cuenta, esto te permite mostrar datos individuales para cada una.
  • midaz_onboarding.account: la lista completa de cuentas de usuario.
  • {%- for account in midaz_onboarding.account %}: el bucle se ejecuta una vez por cuenta.
{%- with balance = filter(midaz_transaction.balance, "account_id", account.id)[0] %} Define una variable llamada balance que contiene el saldo de la cuenta actual.
  • filter(): escanea a través de midaz_transaction.balance para encontrar el que coincida con el account.id.
  • [0]: toma la primera coincidencia.
  • El resultado se almacena en balance.
<CurrentBalance> {{ balance.available }}</CurrentBalance> Muestra el saldo disponible de la cuenta (balance.available).

Iterando sin {%with...%}

        {%- for balance in midaz_transaction.balance %}
        {%- if balance.account_id == account.id %}
        <CurrentBalance>{{ balance.available }}</CurrentBalance>
        {%- endif %}
        {%- endfor %}
{%- for balance in midaz_transaction.balance %} Recorre todos los saldos para encontrar el que coincide con la cuenta actual. Esta es una alternativa más explícita a filter().
  • midaz_transaction.balance: La lista de todos los saldos.
  • {%- balance in midaz_transaction.balance %}: el bucle se ejecuta una vez por saldo.
{% if balance.account_id == account.id %} Filtra los saldos para mostrar solo aquellos que coinciden con la cuenta actual que se está procesando.
  • Si coinciden, se muestra el saldo.

Información de moneda

       <Currency>{{ account.asset_code }}</Currency>
Muestra la moneda de la cuenta (ej., BRL, USD) para ayudarte a entender el contexto del valor.
  • account.asset_code: inyecta dinámicamente el código de moneda.

Agrupando operaciones

        <Operations>
        {%- for operation in midaz_transaction.operation %}
        {%- if operation.account_id == account.id %}
            {%- set original_amount = operation.amount %}
            {%- set discount_amount = original_amount * 0.03 %}
            {%- set final_amount = original_amount - discount_amount %} 

<Operations>...</Operations>

Define la sección donde se listan todas las operaciones de una cuenta.
  • Mantiene el reporte estructurado y fácil de escanear.
{%- for operation in midaz_transaction.operation %} Recorre todas las operaciones en la transacción y muestra las operaciones que coinciden con la cuenta actual.
  • operation: representa la operación actual que es parte de la transacción actual.
  • midaz_transaction.operation: la lista de todas las operaciones en la transacción.
{%- if operation.account_id == account.id %} Asegura que solo se incluyan las operaciones relevantes para la cuenta actual.
  • Si el account_id de la operación es igual al account.id actual, se ejecutará el resto del bloque.
{%- set original_amount = operation.amount %} Define el monto original y lo establece como una variable.
  • original_amount: el nombre de la variable.
{%- set discount_amount = original_amount * 0.03 %} Define una variable y calcula un descuento del 3% sobre el monto original.
  • discount_amount: el nombre de la variable.
  • original_amount * 0.03: aplica un descuento del 3% sobre el monto original.
{%- set final_amount = original_amount - discount_amount %} Resta el descuento del monto original para obtener el valor final.
  • final_amount: variable que representa el valor final.
  • original_amount - discount_amount: la operación de resta.

Bloque de operación

        <Operation>
                <OperationID>{{ operation.id }}</OperationID>
                <Description>{{ operation.description }}</Description>
                <Type>{{ operation.type }}</Type>
                <Route>{{ operation.route }}</Route>
                <OriginalAmount>{{ original_amount }}</OriginalAmount>
                <DiscountAmount>{{ discount_amount }}</DiscountAmount>
                <FinalAmountWithDiscount>{{ final_amount }}</FinalAmountWithDiscount>
                <Currency>{{ operation.asset_code }}</Currency>
                <Status>{{ operation.status }}</Status>
        </Operation>
Cada <Operation> contiene información detallada sobre la transacción. Estos campos ayudan a los usuarios a auditar y entender qué sucedió. <OperationID>{{ operation.id }}</OperationID> ID único de la operación. <Description>{{ operation.description }}</Description> Descripción breve de la operación. <Type>{{ operation.type }}</Type> Tipo de operación (ej., crédito, débito, ajuste). <Route>{{ operation.route }}</Route> Entrada de ruta de operación asociada. <OriginalAmount>{{ original_amount }}</OriginalAmount> Monto original antes de cualquier ajuste. <DiscountAmount>{{ discount_amount }}</DiscountAmount> Valor del descuento aplicado. <FinalAmountWithDiscount>{{ final_amount }}</FinalAmountWithDiscount> Monto final después del descuento. <Currency>{{ operation.asset_code }}</Currency> La moneda utilizada para la operación. <Status>{{ operation.status }}</Status> Estado de la operación (ej., Aprobado, pendiente).

Bloque de resumen de cuenta

<AccountSummary>
            <TotalOperations>{% count_by midaz_transaction.operation if account_id == account.id %}</TotalOperations>
            <SumOfOperations>{% sum_by midaz_transaction.operation by "amount" if account_id == account.id %}</SumOfOperations>
            <AverageOfOperations>{% avg_by midaz_transaction.operation by "amount" if account_id == account.id %}</AverageOfOperations>
        </AccountSummary>
{% count_by midaz_transaction.operation if account_id == account.id %} Cuenta el número de operaciones asociadas con tu cuenta y ayuda a entender el volumen de transacciones para el período de reporte.
  • La función count_by recorre midaz_transaction.operation y suma cuántas operaciones tienen el mismo account_id que la cuenta actual.
{% sum_by midaz_transaction.operation by "amount" if account_id == account.id %} Suma el valor total de todas las operaciones para esta cuenta, y genera el resultado usando dos decimales.
  • sum_by recorre las transacciones filtradas por account_id.
  • Suma los campos amount.
{% avg_by midaz_transaction.operation by "amount" if account_id == account.id %} Calcula el valor promedio de operación para esta cuenta. Útil para detectar patrones de gasto o valores atípicos.
  • avg_by aplica el cálculo de promedio a los valores de monto.
  • Solo considera operaciones para la cuenta actual.

Salida de la plantilla


<AnalyticalReport>
	<Organization>Ferry, Stiedemann and Jast - CNPJ: 78425230000190</Organization>
	<GenerationDate>28.04.2025</GenerationDate>
	<Ledger>O'Connell, Dietrich and Bernhard</Ledger>
	<Account>
		<AccountID>01965efe-5afd-733d-9a64-3d53f73b13c8</AccountID>
		<Alias>@external/BRL</Alias>
		<CurrentBalance>1000.00</CurrentBalance>
		<CurrentBalance>1000.00</CurrentBalance>
		<Currency>BRL</Currency>
		<Operations>
			<Operation>
				<OperationID>01965f04-7087-73f1-a802-f8fceedb34ec</OperationID>
				<Description>Initial transfer</Description>
				<Type>DEBIT</Type>
				<Route></Route>
				<OriginalAmount>1000.00</OriginalAmount>
				<DiscountAmount>30.00</DiscountAmount>
				<FinalAmountWithDiscount>970.00</FinalAmountWithDiscount>
				<Currency>BRL</Currency>
				<Status></Status>
			</Operation>
		</Operations>
		<AccountSummary>
			<TotalOperations>1</TotalOperations>
			<SumOfOperations>1000.00</SumOfOperations>
			<AverageOfOperations>1000.00</AverageOfOperations>
		</AccountSummary>
	</Account>
	<Account>
		<AccountID>01965eff-0b2d-73cf-bbfe-0dc1ac9032d3</AccountID>
		<Alias>@wallet_46040127</Alias>
		<CurrentBalance> 0</CurrentBalance>
		<CurrentBalance> 0</CurrentBalance>
		<Currency>BRL</Currency>
		<Operations></Operations>
		<AccountSummary>
			<TotalOperations>0</TotalOperations>
			<SumOfOperations>0.00</SumOfOperations>
			<AverageOfOperations>0.00</AverageOfOperations>
		</AccountSummary>
	</Account>
	<Account>
		<AccountID>01965f01-aa72-7254-bb4a-fa9c8c9d4009</AccountID>
		<Alias>@account1</Alias>
		<CurrentBalance>300.00</CurrentBalance>
		<CurrentBalance>300.00</CurrentBalance>
		<Currency>BRL</Currency>
		<Operations>
			<Operation>
				<OperationID>01965f04-7087-73d2-a167-cb5146bee801</OperationID>
				<Description>External to accounts 1 and 2</Description>
				<Type>CREDIT</Type>
				<ChartOfAccounts></ChartOfAccounts>
				<OriginalAmount>300.00</OriginalAmount>
				<DiscountAmount>9.00</DiscountAmount>
				<FinalAmountWithDiscount>291.00</FinalAmountWithDiscount>
				<Currency>BRL</Currency>
				<Status></Status>
			</Operation>
		</Operations>
		<AccountSummary>
			<TotalOperations>1</TotalOperations>
			<SumOfOperations>300.00</SumOfOperations>
			<AverageOfOperations>300.00</AverageOfOperations>
		</AccountSummary>
	</Account>
	<Account>
		<AccountID>01965f01-ff74-712a-9e2c-d987f15a1d14</AccountID>
		<Alias>@account2</Alias>
		<CurrentBalance>700.00</CurrentBalance>
		<CurrentBalance>700.00</CurrentBalance>
		<Currency>BRL</Currency>
		<Operations>
			<Operation>
				<OperationID>01965f04-7087-73b1-aff9-69f59d623d31</OperationID>
				<Description>External to accounts 1 and 2</Description>
				<Type>CREDIT</Type>
				<ChartOfAccounts></ChartOfAccounts>
				<OriginalAmount>700.00</OriginalAmount>
				<DiscountAmount>21.00</DiscountAmount>
				<FinalAmountWithDiscount>679.00</FinalAmountWithDiscount>
				<Currency>BRL</Currency>
				<Status></Status>
			</Operation>
		</Operations>
		<AccountSummary>
			<TotalOperations>1</TotalOperations>
			<SumOfOperations>700.00</SumOfOperations>
			<AverageOfOperations>700.00</AverageOfOperations>
		</AccountSummary>
	</Account>
	<Account>
		<AccountID>01965f02-55fc-7a06-9f95-07e9a9ff4941</AccountID>
		<Alias>@account3</Alias>
		<CurrentBalance> 0</CurrentBalance>
		<CurrentBalance> 0</CurrentBalance>
		<Currency>BRL</Currency>
		<Operations></Operations>
		<AccountSummary>
			<TotalOperations>0</TotalOperations>
			<SumOfOperations>0.00</SumOfOperations>
			<AverageOfOperations>0.00</AverageOfOperations>
		</AccountSummary>
	</Account>
</AnalyticalReport>