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

> Crie um relatório financeiro analítico em XML com o Reporter: atividade no nível de conta, lógica personalizada como descontos e resumos por conta.

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

**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 das 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 }} - 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>

      {%- 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 }} - Tax ID: {{ 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 a razão social da organização e o *CNPJ* correspondente (documento fiscal brasileiro).

* `{{ 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 a hora da renderização, no formato `dd/MM/YYYY HH:mm`.

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

Cria uma variável temporária que aponta 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.

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

Faz um loop por todas as contas vinculadas ao usuário. Como a maioria dos usuários tem 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 roda uma vez por conta.

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

Define uma variável chamada `balance` que armazena o saldo da conta atual.

* `filter()`: percorre `midaz_transaction.balance` para encontrar o que corresponde ao `account.id`.
* `[0]`: pega a primeira correspondência.
* `balance` armazena o resultado.

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

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

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

Faz um loop por todos os saldos para encontrar o que corresponde à conta atual. Essa é uma alternativa mais explícita a `filter()`.

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

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

Filtra os saldos para mostrar apenas os que correspondem à conta atual.

* Se corresponderem, o saldo aparece.

### Informações de moeda

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

Mostra a moeda da conta (por exemplo, BRL, USD).

* `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 que lista todas as operações de uma conta.

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

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

Faz um loop por todas as operações da transação e exibe as operações que correspondem à conta atual.

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

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

Inclui apenas as operações relevantes para a conta atual.

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

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

Define o valor original e o define como 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 entender o que aconteceu.

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

ID exclusivo da operação.

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

Descrição curta da operação.

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

Tipo de operação (por exemplo, crédito, débito, ajuste).

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

Entrada de rota de operação associada.

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

Valor original antes de qualquer ajuste.

**`<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 usada na operação.

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

Status da operação (por exemplo, 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.

* A função `count_by` percorre `midaz_transaction.operation` e soma quantas operações têm 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 mostra o resultado com duas casas decimais.

* `sum_by` faz um loop 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 gasto ou valores fora do padrão.

* `avg_by` aplica o cálculo da 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>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>
