Pular para o conteúdo principal
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


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

Detalhamento do código


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

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

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

        {%- for balance in midaz_transaction.balance %}
        {%- if balance.account_id == account.id %}
        <CurrentBalance>{{ balance.available }}</CurrentBalance>
        {%- endif %}
        {%- endfor %}
{%- 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

       <Currency>{{ account.asset_code }}</Currency>
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

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

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

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


<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>
				<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>Externo para contas 1 e 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>