Se nenhum
balanceKey for fornecido, a transação usa automaticamente o saldo padrão.Contabilidade por partidas dobradas
O sistema de partidas dobradas opera com um princípio simples, mas transformador: para cada transação, existem dois lançamentos correspondentes, um débito e um crédito. Esse framework garante que todas as atividades financeiras sejam registradas de forma holística, fornecendo uma visão completa e balanceada das suas contas. Cada transação impacta duas contas, mantendo o equilíbrio no ecossistema financeiro:
- Débitos refletem o valor recebido ou recursos consumidos.
- Créditos indicam o valor fornecido ou recursos entregues.
Exemplo
Considere este exemplo: você realiza uma transação para transferir R$1.000 de uma conta para outra. Esse processo terá duas operações:- Uma operação para debitar R$1.000,00 da conta de origem.
- Uma operação para creditar R$1.000,00 na conta de destino.
Transações N:N (Muitos-para-Muitos)
Diferente dos sistemas financeiros tradicionais que limitam transações a relacionamentos um-para-um ou um-para-muitos, o Midaz permite transações N:N, possibilitando múltiplas contas de origem e destino dentro de uma única transação.
Exemplos
- Pagamento em marketplace: múltiplos vendedores (várias origens) são pagos a partir de uma única conta escrow, e cada vendedor paga uma taxa da plataforma.
- Peer-to-peer com taxas: uma transação debita o pagador e credita tanto o beneficiário quanto uma conta de taxas.
Atomicidade e integridade
Transações são operações atômicas; ou todas as operações constituintes são bem-sucedidas, ou nenhuma é. Isso garante que eventos financeiros parciais não ocorram. Se qualquer parte de uma transação falhar na validação (por exemplo, fundos insuficientes em uma conta), toda a transação não será aplicada, preservando a integridade do ledger.
Origem da transação
Transações no Midaz podem ser iniciadas a partir de uma ou múltiplas origens.
A soma dos valores na
source deve sempre ser igual ao valor especificado logo após o send e igual à soma dos valores no distribute.Origem única
Em uma transação de origem única, o valor especificado é retirado diretamente de uma conta de origem e, opcionalmente, de um saldo específico.Exemplo
Neste exemplo (Figura 1):- BRL 30,00 é retirado de
@account1(saldocredit). - 100% é enviado para
@destinationAccount1(saldooperational)

Múltiplas origens
Em uma transação com múltiplas origens, os fundos são retirados de múltiplas contas e/ou saldos.Exemplo
Neste exemplo (Figura 2):- BRL 30,00 será enviado para a conta de destino (
@destinationAccount1).- BRL 15,00 de
@account1(saldodefault). - BRL 15,00 de
@account2(saldoinvestment).
- BRL 15,00 de
- A conta de destino receberá 100% do valor enviado.

Destino da transação
Similar às origens, os destinos podem ser únicos ou múltiplos.
Destino único
Em uma transação de destino único, o valor é enviado para apenas uma conta de destino.Exemplo
Neste exemplo (Figura 3):- BRL 30,00 é retirado de uma conta externa (
@external|BRL). - 100% é enviado para a conta de destino (
@destinationAccount1).

Múltiplos destinos
Em transações com múltiplos destinos, o valor da transação é dividido entre múltiplas contas de destino. Os valores podem ser distribuídos por percentuais, valores fixos ou saldo remanescente.Exemplo
Neste exemplo (Figura 4):- BRL 100 é retirado da conta de origem (
@account1). - 38% do valor vai para a conta 2 (
@account2). - 50% vai para a conta 3 (
@account3). - Um valor fixo de BRL 2,00 vai para a conta 4 (
@account4). - O valor remanescente vai para a conta 5 (
@account5).

Múltiplas origens e múltiplos destinos
Essas transações complexas envolvem múltiplas origens e múltiplos destinos. Isso é útil para cenários como uma campanha de financiamento coletivo, onde as contribuições são reunidas e distribuídas entre múltiplos beneficiários.
Exemplo
Neste exemplo (Figura 5):- BRL 4.000,00 serão doados, e o valor será retirado de quatro contas diferentes.
- 25% será retirado da conta 1 (
@account1). - 25% será retirado da conta 2 (
@account2). - 40% será retirado da conta 3 (
@account3) - 10% será retirado da conta 4 (
@account4).
- 25% será retirado da conta 1 (
- As doações serão distribuídas para quatro contas de doação separadas, e cada uma receberá 25% do total.

Fluxo da transação
Quando uma transação é iniciada, o Midaz valida:
- As contas envolvidas.
- Os saldos especificados (
balanceKey, oudefaultse não fornecido). - Permissões (
allowSending,allowReceiving). - Fundos disponíveis suficientes no saldo selecionado.
APPROVED.
Os usuários devem apenas iniciar esse tipo de transação se pretendem confirmá-la no ledger imediatamente.
pending para criar uma Transação em Duas Fases.
Transação em Duas Fases
Nesse cenário, a transação é criada com status
PENDING. Em vez de mover fundos imediatamente, o Midaz reserva o valor especificado no saldo correto (balanceKey, ou default se não fornecido).
- Os fundos reservados são movidos de
availableparaon_hold. - Nenhuma operação (débitos ou créditos) é registrada no ledger ainda.
- Você deve explicitamente fazer
commitpara executar a transferência, oucancelpara liberar os fundos.

Fluxo da Transação em Duas Fases
1. Criar uma Transação em Duas Fases
- Use o endpoint Criar uma Transação usando JSON com
"pending": true.
balanceKey), permissões (allowSending, allowReceiving) e fundos disponíveis. Se válido:
- Os fundos são reservados no saldo correto.
- O status da transação é definido como
PENDING. - Os metadados são armazenados, mas nenhum débito/crédito é registrado ainda.
2. Confirmar ou cancelar a transação pendente
- Confirmar: Finaliza a transação. Os fundos são movidos de on_hold para o saldo de destino, e as operações de débito/crédito são registradas.
- Use o endpoint Confirmar uma Transação Pendente.
- Status:
APPROVED.
- Cancelar: Libera os fundos reservados de volta para available no mesmo saldo.
- Use o endpoint Cancelar uma Transação Pendente.
- Status:
CANCELED.
Transações Passadas
O Midaz também suporta transações passadas, permitindo que instituições importem eventos financeiros legados preservando a precisão histórica.
- Use o campo opcional
createdAtpara definir a data original da transação. - Transações com impacto financeiro recalculam o estado histórico dos saldos como se processadas naquela data.
- Transações criadas via Criar uma Anotação de Transação validam a estrutura, mas não impactam saldos. Elas são úteis para auditorias, conformidade e importações onde os saldos devem permanecer inalterados.
Exemplo
Ao importar dados legados, envie todas as transações passadas antes de iniciar as operações em tempo real. Isso garante que os saldos sejam recalculados de forma consistente em todo o ledger.
Transações sem impacto financeiro
O Midaz suporta a criação de transações que são registradas no ledger, mas não afetam os saldos das contas. Essas transações garantem integridade estrutural enquanto mantêm os saldos inalterados. Esse recurso é útil quando você precisa:
- Importar transações legadas sem alterar saldos.
- Registrar eventos de auditoria ou conformidade.
- Adicionar operações de negócio que devem ser rastreadas no ledger, mas não requerem movimentação de fundos.
Como funciona?
Quando uma transação é criada sem impacto financeiro:- Os campos
balanceebalanceAftersão armazenados como 0 para preservar a validação de partidas dobradas. - O campo
balanceAffected(booleano) foi introduzido em cada operação:- true → a operação afeta o saldo da conta.
- false → a operação é registrada no ledger sem impactar saldos.
Mesmo quando nenhum saldo é atualizado, o Midaz aplica as regras de partidas dobradas. Isso garante consistência em todas as transações no ledger.
Exemplo
Endpoint relacionado
- Criar uma Anotação de Transação — Registre uma transação sem impacto financeiro no ledger.
Publicação de eventos em tempo real
Quer acompanhar o status das suas transações conforme elas acontecem? O Midaz suporta publicação de eventos em tempo real via RabbitMQ. Uma vez habilitado, cada transação gera um evento, como
APPROVED, PENDING ou CANCELED, que sistemas externos podem assinar usando roteamento baseado em tópicos.
Para mais informações sobre como publicar e consumir eventos de transação, confira a página do Publicador de eventos.
Entradas, saídas e contas externas
O Midaz usa um sistema de ledger por partidas dobradas no qual todo valor que entra ou sai do sistema deve passar por uma conta especial: a Conta Externa. Essa conta — representada como
@external/{{assetCode}} — atua como a ponte entre o Midaz e o mundo financeiro externo (bancos, PSPs, trilhos de pagamento, etc.).
Por que isso importa?
Quando o ledger é inicializado, todas as contas — incluindo@external — começam com saldo zero. Para refletir saldos do mundo real (ex.: fundos institucionais mantidos externamente), você deve iniciar uma transação que injeta fundos nas contas do Midaz debitando a conta externa.
Essa é a única forma de trazer fundos para dentro do Midaz.
Entradas – Adicionando valor ao Ledger
Para creditar uma conta interna de fora do ledger:- Origem:
@external/{{assetCode}}(ex.:@external/BRL). - Destino: Uma ou mais contas internas (ex.:
@organization.main).
| Origem | Destino | Valor |
|---|---|---|
| @external/BRL | @accountA | BRL 10.000 |
Saídas – Movendo valor para fora do Ledger
Para simular valor saindo do ledger para um destino externo:- Origem: Uma ou mais contas do Midaz.
- Destino:
@external/{{assetCode}}.
| Origem | Destino | Valor |
|---|---|---|
| @accountA | @external/BRL | BRL 1.000 |
@accountA e credita a conta externa. Na vida real, seu sistema (via SPI ou outras integrações) transferirá os fundos para o destinatário pretendido.
Comportamento e regras de saldo
@external/{{assetCode}}pode ter saldo zero ou negativo, mas nunca positivo.- Seu saldo é sempre o inverso do saldo combinado de todas as contas do Midaz que mantêm aquele ativo.
- Cada entrada aumenta a liquidez interna e reduz o saldo da conta externa (ou seja, simula um depósito).
- Cada saída faz o inverso.
Todas as movimentações de valor entre o mundo externo e o ledger do Midaz devem passar pela conta externa.Nada entra ou sai do sistema sem uma transação formal, garantindo total rastreabilidade, integridade de saldos e conformidade com os princípios de partidas dobradas.
Rotas de Transação
A API de Rotas de Transação permite o processamento estruturado e validado de transações no Midaz. Enquanto a API de Transações lida com a execução de eventos financeiros (débitos e créditos entre contas), as Rotas de Transação definem templates para como esses eventos devem ser estruturados e validados, garantindo consistência e integridade. Pense nisso como a camada de validação que garante que as transações de negócio sigam padrões predefinidos e mantenham a estrutura financeira adequada. Por exemplo, uma transação de taxa, depósito ou pagamento pode exigir diferentes tipos de conta, regras de validação e estruturas. Em vez de lidar com a validação separadamente para cada transação, você configura regras predefinidas que dizem ao Midaz: “Quando o usuário enviar esse tipo de transação, valide-a contra esses requisitos de conta e padrões de estrutura.” Cada Rota de Transação combina múltiplas Rotas de Operação, que definem os componentes individuais de uma transação, especificando requisitos de conta, direções (origem/destino) e regras de validação para cada “perna” do evento financeiro.
Por que isso importa?
Ao usar Rotas de Transação, você:- Garante estrutura consistente de transações em toda a sua aplicação.
- Torna seu ledger mais fácil de manter, previsível e confiável.
- Valida eventos financeiros contra padrões predefinidos.
- Permite a configuração de templates de transação sem alterações de código.
- Mantém a integridade dos dados através de validação estruturada.
Iniciando uma transação
Existem duas formas principais de iniciar uma transação:
Usando DSL
Uma Domain-Specific Language (DSL) simplifica a interação do usuário focando em conceitos específicos do domínio, permitindo que não desenvolvedores realizem tarefas complexas sem habilidades técnicas. DSLs reduzem código boilerplate e incorporam restrições em sua sintaxe, aplicando regras de negócio e minimizando erros. No entanto, seus padrões predefinidos podem limitar a flexibilidade, tornando mais difícil criar parsers customizados ou adaptar-se a novos requisitos. A DSL de Transações no Midaz, chamada Gold, simplifica o processamento de transações com uma sintaxe contábil intuitiva. Ela armazena informações de transação em arquivos.gold, permitindo que equipes de negócio definam transações facilmente e promovendo a colaboração entre fluxos de trabalho técnicos e de negócio.
Para usar a DSL, siga estes passos:
Crie o arquivo
.gold de acordo com a estrutura da DSL de Transações.Envie o arquivo usando o endpoint Criar uma Transação usando DSL.
Usando endpoint JSON
Endpoints JSON fornecem um padrão flexível e amigável para desenvolvedores para intercâmbio de dados, permitindo controle preciso sobre estruturas de requisição adaptadas para fluxos de trabalho customizados e casos de uso específicos. Sua ampla compatibilidade com diversas linguagens de programação facilita a integração e a depuração. No entanto, essa flexibilidade pode resultar em verbosidade e erros do usuário, já que os desenvolvedores precisam lidar com a validação manualmente. Para não desenvolvedores, a complexidade do JSON pode apresentar desafios, tornando-o menos intuitivo do que uma Domain-Specific Language (DSL) para tarefas do dia a dia.- Para criar uma transação usando JSON, use o endpoint Criar uma Transação usando JSON.
Se você precisa reservar fundos antes de completar a transferência, defina o campo
pending como true (fluxo de Transação em Duas Fases).Revertendo uma transação
O Midaz suporta reversão de transações, permitindo que você desfaça transações aprovadas criando uma transação espelho que inverte os débitos e créditos originais. Esse mecanismo mantém trilhas de auditoria completas enquanto efetivamente cancela o impacto financeiro nos saldos das contas.
A reversão cria uma nova transação que compensa a original. A transação original permanece no histórico do ledger para rastreabilidade completa.
Como funciona?
Quando você reverte uma transação, o Midaz automaticamente:-
Inverte as operações:
- Operações de CREDIT se tornam operações de origem (
from). - Operações de DEBIT se tornam operações de destino (
to).
- Operações de CREDIT se tornam operações de origem (
-
Cria uma nova transação com:
- Mesmo valor e código de ativo.
- Mesma descrição e metadados.
- Operações invertidas (destinatários se tornam remetentes, remetentes se tornam destinatários).
- Status inicial:
CREATED(nãoPENDING) → depois avança paraAPPROVED. parentTransactionIDreferenciando a transação original.
- Processa a reversão pelo fluxo padrão de transação, incluindo validação, atualização de saldos e registro no histórico.
Exemplo
Considere este cenário: Transação original:- Conta A (débito -100) → Conta B (crédito +100)
- Conta B (débito -100) → Conta A (crédito +100)
- Conta A retorna ao seu saldo anterior (recebe de volta os -100).
- Conta B retorna ao seu saldo anterior (perde os +100).
- Ambas as transações permanecem no histórico do ledger para fins de auditoria.
- A transação de reversão inclui
parentTransactionIDapontando para a original.
Restrições de reversão
O Midaz aplica regras rígidas para manter a integridade do ledger. As reversões falharão nos seguintes casos:1. A transação já possui uma reversão
- Apenas uma reversão por transação é permitida.
- Previne múltiplas reversões da mesma transação.
2. A transação já é uma reversão
- Não é possível reverter uma transação que já é uma reversão.
- Previne a criação de “reversões de reversões”.
3. O status da transação não é APPROVED
- Apenas transações aprovadas podem ser revertidas.
- Transações com status
PENDING,CREATEDouCANCELEDnão podem ser revertidas.
4. A transação não pode ser revertida
- Ocorre quando a transação não possui operações válidas para inverter.
- Por exemplo, transações sem operações padrão de CREDIT/DEBIT.
Apenas operações de CREDIT e DEBIT são consideradas para reversão. Operações como ON_HOLD e RELEASE não são incluídas no processo de reversão.
Casos de uso
A reversão de transações é essencial para vários cenários operacionais:1. Reversão de pagamento incorreto
Um cliente pagou BRL 500 para o fornecedor errado.- Reverta a transação.
- Os fundos retornam à conta do cliente.
- O cliente pode iniciar um novo pagamento para o fornecedor correto.
2. Cancelamento de compra
Uma loja processou uma venda de BRL 1.000, mas o cliente cancela a compra.- Reverta a transação da venda.
- Os fundos retornam à conta do cliente.
3. Correção de erro operacional
Um operador criou uma transação com o valor errado.- Reverta a transação incorreta.
- Crie uma nova transação com o valor correto.
4. Devolução de produto
Um cliente comprou e pagou BRL 200, mas devolveu o produto.- Reverta a transação de pagamento.
- O cliente recebe o reembolso.
5. Compensação de falha de integração
Uma transação foi aprovada, mas falhou em um sistema externo.- Reverta para desfazer a operação contábil.
- Os saldos retornam ao estado anterior.
Gerenciando transações
Você pode gerenciar suas Transações via API ou através do Lerian Console.
Via API
- Criar uma Transação usando DSL (descontinuado) — Envie um arquivo de transação usando a DSL do Midaz.
- Criar uma Transação usando JSON — Envie uma transação diretamente usando um payload JSON.
- Confirmar uma transação pendente — Finalize uma transação reservada.
- Cancelar uma transação pendente — Libere fundos reservados sem executar.
- Reverter uma Transação — Crie uma transação de reversão para desfazer uma transação aprovada.
- Criar uma Transação de Entrada — Registre fundos recebidos de fontes externas no Ledger.
- Criar uma Transação de Saída — Mova fundos de contas internas para o mundo externo.
- Listar Transações — Visualize todas as Transações no seu workspace.
- Recuperar uma Transação — Obtenha detalhes de uma Transação específica.
- Atualizar uma Transação — Edite os metadados de uma Transação existente.
- Criar uma Anotação de Transação — Registre uma transação sem impacto financeiro no ledger.

