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

***

```xml XML expandable theme={null}
<AnalyticalReport>
    <Organization>{{ midaz_onboarding.organization.0.legal_name }} - Tax ID: {{ midaz_onboarding.organization.0.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 %}
    {%- endwith %}
</AnalyticalReport>
```

## Detalhamento do código

***

### Informações da organização e do ledger

```xml XML theme={null}
<AnalyticalReport>
    <Organization>{{ midaz_onboarding.organization.0.legal_name }} - Tax ID: {{ midaz_onboarding.organization.0.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.0.legal_name }} - Tax ID: {{ midaz_onboarding.organization.0.legal_document }}</Organization>`**

Mostra a razão social da organização e o *CNPJ* correspondente (documento fiscal brasileiro).

* `{{ midaz_onboarding.organization.0.legal_name }}`: recupera o nome da organização.
* `{{ midaz_onboarding.organization.0.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

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

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

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

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

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

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

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

### Agrupando operações

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

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

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

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

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

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

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

***

```xml XML expandable theme={null}
<AnalyticalReport>
	<Organization>Ferry, Stiedemann and Jast - Tax ID: 78425230000190</Organization>
	<GenerationDate>28/04/2025 10:30</GenerationDate>
	<Ledger>O'Connell, Dietrich and Bernhard</Ledger>
	<Account>
		<AccountID>01965efe-5afd-733d-9a64-3d53f73b13c8</AccountID>
		<Alias>@external/BRL</Alias>
		<CurrentBalance>1000</CurrentBalance>
		<CurrentBalance>1000</CurrentBalance>
		<Currency>BRL</Currency>
		<Operations>
			<Operation>
				<OperationID>01965f04-7087-73f1-a802-f8fceedb34ec</OperationID>
				<Description>Initial transfer</Description>
				<Type>DEBIT</Type>
				<Route></Route>
				<OriginalAmount>1000</OriginalAmount>
				<DiscountAmount>30</DiscountAmount>
				<FinalAmountWithDiscount>970</FinalAmountWithDiscount>
				<Currency>BRL</Currency>
				<Status></Status>
			</Operation>
		</Operations>
		<AccountSummary>
			<TotalOperations>1</TotalOperations>
			<SumOfOperations>1000</SumOfOperations>
			<AverageOfOperations>1000</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</SumOfOperations>
			<AverageOfOperations>0</AverageOfOperations>
		</AccountSummary>
	</Account>
	<Account>
		<AccountID>01965f01-aa72-7254-bb4a-fa9c8c9d4009</AccountID>
		<Alias>@account1</Alias>
		<CurrentBalance>300</CurrentBalance>
		<CurrentBalance>300</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</OriginalAmount>
				<DiscountAmount>9</DiscountAmount>
				<FinalAmountWithDiscount>291</FinalAmountWithDiscount>
				<Currency>BRL</Currency>
				<Status></Status>
			</Operation>
		</Operations>
		<AccountSummary>
			<TotalOperations>1</TotalOperations>
			<SumOfOperations>300</SumOfOperations>
			<AverageOfOperations>300</AverageOfOperations>
		</AccountSummary>
	</Account>
	<Account>
		<AccountID>01965f01-ff74-712a-9e2c-d987f15a1d14</AccountID>
		<Alias>@account2</Alias>
		<CurrentBalance>700</CurrentBalance>
		<CurrentBalance>700</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</OriginalAmount>
				<DiscountAmount>21</DiscountAmount>
				<FinalAmountWithDiscount>679</FinalAmountWithDiscount>
				<Currency>BRL</Currency>
				<Status></Status>
			</Operation>
		</Operations>
		<AccountSummary>
			<TotalOperations>1</TotalOperations>
			<SumOfOperations>700</SumOfOperations>
			<AverageOfOperations>700</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</SumOfOperations>
			<AverageOfOperations>0</AverageOfOperations>
		</AccountSummary>
	</Account>
</AnalyticalReport>
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.