> ## Documentation Index
> Fetch the complete documentation index at: https://docs.lerian.studio/llms.txt
> Use this file to discover all available pages before exploring further.

# Plantilla XML

> Construye un reporte financiero analítico en XML con Reporter — actividad por cuenta, lógica personalizada como descuentos y resúmenes por cuenta.

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**.
* **Resumen 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

***

<CodeGroup>
  ```xml XML expandable theme={null}
  <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>
  ```
</CodeGroup>

## Desglose del código

***

### Información de Organización y Libro Contable

<CodeGroup>
  ```xml XML theme={null}
  <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>
  ```
</CodeGroup>

**`<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

<CodeGroup>
  ```xml XML theme={null}
      {%- 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 %}
  ```
</CodeGroup>

**`{%- 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...%}`

<CodeGroup>
  ```xml XML theme={null}
          {%- for balance in midaz_transaction.balance %}
          {%- if balance.account_id == account.id %}
          <CurrentBalance>{{ balance.available }}</CurrentBalance>
          {%- endif %}
          {%- endfor %}
  ```
</CodeGroup>

**`{%- 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

<CodeGroup>
  ```xml XML theme={null}
         <Currency>{{ account.asset_code }}</Currency>
  ```
</CodeGroup>

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

<CodeGroup>
  ```xml XML theme={null}
          <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 %} 
  ```
</CodeGroup>

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

<CodeGroup>
  ```xml XML theme={null}
          <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>
  ```
</CodeGroup>

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

<CodeGroup>
  ```xml XML theme={null}
  <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>
  ```
</CodeGroup>

**`{% 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

***

<CodeGroup>
  ```xml XML expandable theme={null}
  <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>
  				<Route></Route>
  				<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>
  				<Route></Route>
  				<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>
  ```
</CodeGroup>
