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

# Template XML

> Construa um relatório financeiro analítico em XML com o Reporter — atividade por conta, lógica personalizada como descontos e resumos por conta.

Esta página orienta você por um exemplo completo de um relatório **Analítico Financeiro** em **XML**. O template detalha a atividade no nível de conta, aplica lógica personalizada (como descontos) e inclui resumos claros para apoiar análises e auditorias.

**O que este relatório mostra:**

* **Detalhes da Organização e do Ledger**.
* **Visão geral no nível de conta**: saldo, moeda e alias.
* **Detalhamento de operações**: valor original, desconto, valor final, status, descrição e tipo.
* **Resumos por conta**: total de operações, valor total e média por operação.

## Código do template

***

<CodeGroup>
  ```xml XML expandable theme={null}
  <AnalyticalReport>
      <Organization>{{ midaz_onboarding.legal_name }} - CNPJ: {{ midaz_onboarding.legal_document }}</Organization>
      <GenerationDate>{% date_time "dd/MM/YYYY HH:mm" %}</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>

## Detalhamento do código

***

### Informações da Organização e do Ledger

<CodeGroup>
  ```xml XML theme={null}
  <AnalyticalReport>
      <Organization>{{ midaz_onboarding.legal_name }} - CNPJ: {{ midaz_onboarding.legal_document }}</Organization>
      <GenerationDate>28.04.2025</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>`**

Exibe o nome legal da organização e o *CNPJ* correspondente (Cadastro Nacional da Pessoa Jurídica).

* `{{ midaz_onboarding.organization.legal_name }}`: recupera o nome da organização.
* `{{ midaz_onboarding.legal_document }}`: recupera o *CNPJ*.

**`<GenerationDate>{% date_time "dd/MM/YYYY HH:mm" %}</GenerationDate>`**
Esta função aplica a data e hora em que o template é renderizado, usando o formato `dd/MM/YYYY HH:mm`.

**`{%- with ledger = midaz_onboarding.ledger[0] %}`**

Cria uma variável temporária apontando para o primeiro ledger disponível. Isso mantém o código mais limpo e evita referências repetitivas.

* `-`: remove espaços extras no arquivo renderizado.
* `ledger`: o nome da variável temporária.
* `midaz_onboarding.ledger[0].name`: aponta para o primeiro ledger disponível.

### Iterando pelas contas

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

Itera por todas as contas vinculadas ao usuário. Como a maioria dos usuários possui mais de uma conta, isso permite exibir dados individuais para cada uma.

* `midaz_onboarding.account`: a lista completa de contas do usuário.
* `{%- for account in midaz_onboarding.account %}`: o loop executa uma vez por conta.

**`{%- with balance = filter(midaz_transaction.balance, "account_id", account.id)[0] %}`**

Define uma variável chamada `balance` que contém o saldo da conta atual.

* `filter()`: percorre `midaz_transaction.balance` para encontrar o que corresponde ao `account.id`.
* `[0]`: obtém a primeira correspondência.
* O resultado é armazenado em `balance`.

**`<CurrentBalance> {{ balance.available }}</CurrentBalance>`**

Exibe o saldo disponível da conta (`balance.available`).

### Iterando sem `{%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 %}`**

Itera por todos os saldos para encontrar aquele que corresponde à conta atual. Esta é uma alternativa mais explícita ao `filter()`.

* `midaz_transaction.balance`: a lista de todos os saldos.
* `{%- balance in midaz_transaction.balance %}`: o loop executa uma vez por saldo.

**`{% if balance.account_id == account.id %}`**

Filtra os saldos para exibir apenas aqueles que correspondem à conta sendo processada.

* Se corresponderem, o saldo é exibido.

### Informações de moeda

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

Exibe a moeda da conta (ex.: BRL, USD) para ajudar a compreender o contexto do valor.

* `account.asset_code`: injeta dinamicamente o código da moeda.

### Agrupando operações

<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 a seção onde todas as operações de uma conta são listadas.

* Mantém o relatório estruturado e fácil de analisar.

**`{%- for operation in midaz_transaction.operation %}`**

Itera por todas as operações na transação e exibe as operações que correspondem à conta atual.

* `operation`: representa a operação atual que faz parte da transação corrente.
* `midaz_transaction.operation`: a lista de todas as operações na transação.

**`{%- if operation.account_id == account.id %}`**

Garante que apenas as operações relevantes para a conta atual sejam incluídas.

* Se o `account_id` da operação for igual ao `account.id` atual, o restante do bloco será executado.

**`{%- set original_amount = operation.amount %}`**

Define o valor original e o atribui a uma variável.

* `original_amount`: o nome da variável.

**`{%- set discount_amount = original_amount * 0.03 %}`**

Define uma variável e calcula um desconto de 3% sobre o valor original.

* `discount_amount`: o nome da variável.
* `original_amount * 0.03`: aplica um desconto de 3% sobre o valor original.

**`{%- set final_amount = original_amount - discount_amount %}`**

Subtrai o desconto do valor original para obter o valor final.

* `final_amount`: variável que representa o valor final.
* `original_amount - discount_amount`: a operação de subtração.

### Bloco de operação

<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>` contém informações detalhadas sobre a transação. Esses campos ajudam os usuários a auditar e compreender o que aconteceu.

**`<OperationID>{{ operation.id }}</OperationID>`**

ID único da operação.

**`<Description>{{ operation.description }}</Description>`**

Descrição curta da operação.

**`<Type>{{ operation.type }}</Type>`**

Tipo da operação (ex.: crédito, débito, ajuste).

**`<Route>{{ operation.route }}</Route>`**

Entrada de rota de operação associada.

**`<OriginalAmount>{{ original_amount }}</OriginalAmount>`**

Valor original antes de quaisquer ajustes.

**`<DiscountAmount>{{ discount_amount }}</DiscountAmount>`**

Valor do desconto aplicado.

**`<FinalAmountWithDiscount>{{ final_amount }}</FinalAmountWithDiscount>`**

Valor final após o desconto.

**`<Currency>{{ operation.asset_code }}</Currency>`**

A moeda utilizada na operação.

**`<Status>{{ operation.status }}</Status>`**

Status da operação (ex.: Aprovado, pendente).

### Bloco de resumo da conta

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

Conta o número de operações associadas à sua conta e auxilia na compreensão do volume de transações no período do relatório.

* A função `count_by` percorre `midaz_transaction.operation` e soma quantas operações possuem o mesmo `account_id` da conta atual.

**`{% sum_by midaz_transaction.operation by "amount" if account_id == account.id %}`**

Soma o valor total de todas as operações desta conta e exibe o resultado com duas casas decimais.

* `sum_by` itera pelas transações filtradas por `account_id`.
* Soma os campos `amount`.

**`{% avg_by midaz_transaction.operation by "amount" if account_id == account.id %}`**

Calcula o valor médio das operações desta conta. Útil para identificar padrões de gastos ou valores atípicos.

* `avg_by` aplica o cálculo de média aos valores de amount.
* Considera apenas as operações da conta atual.

## Saída do template

***

<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>Transferência inicial</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>Externo para contas 1 e 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>Externo para contas 1 e 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>
