Direção do saldo
Os saldos têm um campo
direction que define como débitos e créditos afetam o saldo:
Na criação, o Midaz usa um
direction explícito quando ele é informado e, depois, o defaultDirection do tipo de conta. Se nenhum dos dois estiver definido, as contas externas usam debit. Todas as outras contas usam credit.
Você define a direção no momento da criação. Ela é imutável. O saldo companheiro de overdraft (descrito abaixo) sempre usa
direction=debit.Configurações do saldo
O objeto
settings de um saldo controla o comportamento do overdraft:
O objeto
settings também carrega balanceScope. Ele identifica um saldo transacional (o padrão) ou um saldo interno gerenciado pelo sistema, como o companheiro de overdraft. Você pode definir balanceScope: "transactional" ao criar ou atualizar um saldo público. Você não pode definir balanceScope: "internal" pela API pública.Modos de configuração
Sem overdraft (padrão)
O comportamento padrão. O Midaz rejeita qualquer débito que exceda o saldo disponível.Overdraft ilimitado
A posição derivada pode ficar negativa sem teto. O saldoAvailable persistido permanece em 0, enquanto o Midaz registra o déficit em OverdraftUsed. Use isso em contas de liquidação ou contas pool, onde posições negativas são normais e você as concilia por fora.
Overdraft limitado
A posição derivada pode ficar negativa até um limite definido. O saldoAvailable persistido permanece em 0, enquanto o Midaz registra o déficit em OverdraftUsed. Esse é o modo mais comum para produtos de crédito ao consumidor.
Como o overdraft funciona
Divisão da operação
Quando uma transação de débito excede os fundos disponíveis, o Midaz divide a operação automaticamente:- O débito consome todo o Available restante e o limita em 0.
- O Midaz acumula o excedente como OverdraftUsed no saldo principal.
- Se o Midaz encontrar o saldo interno
"overdraft"(descrito abaixo), ele cria uma operação companheira. Essa operação registra o passivo como um débito em partidas dobradas. Se não encontrar esse saldo, o Midaz pula a operação companheira. O saldo principal ainda acumula OverdraftUsed.
A transação é concluída como uma única operação atômica. Quem chama não precisa tratar a divisão. O Midaz faz isso automaticamente.
Se você configurar um limite, o Midaz compara o OverdraftUsed resultante com
overdraftLimit antes de processar a transação. Se o resultado exceder o limite, o Midaz rejeita a transação com o erro 0167 - ErrOverdraftLimitExceeded.Pagamento automático (divisão de reembolso)
Quando chega um crédito eOverdraftUsed > 0, o Midaz prioriza o pagamento:
- O Midaz aplica o crédito primeiro em OverdraftUsed e reduz a dívida.
- Qualquer valor que sobrar depois que OverdraftUsed chega a 0 vai para Available.
- Se o Midaz encontrar o saldo interno
"overdraft", uma operação companheira nele registra o pagamento. Se não encontrar esse saldo, o Midaz pula a operação companheira. O crédito ainda paga OverdraftUsed no saldo principal.
Transações pendentes e overdraft
Uma transaçãoPENDING cria uma retenção. Ela não saca overdraft. Se uma retenção fosse exceder Available, o Midaz rejeita a transação com o erro 0018 - Insufficient Funds Error. A retenção rejeitada não altera Available, OnHold nem OverdraftUsed.
Quando você cancela uma transação pendente, o Midaz libera a retenção dela. Uma transação pendente criada por uma versão anterior do Midaz pode já carregar overdraft. O Midaz ainda desfaz esse estado legado corretamente durante o cancelamento.
Posição
Toda resposta de saldo inclui um bloco
position calculado. Ele dá uma visão em tempo real do estado do saldo:
Saldo companheiro
Quando você atualiza um saldo para definir
allowOverdraft como true pela primeira vez, o Midaz provisiona automaticamente um saldo companheiro na mesma conta. O saldo companheiro registra o lado do passivo das partidas dobradas. O Midaz o cria uma vez por conta e o reutiliza em cada saque e pagamento de overdraft.
Esse saldo é totalmente gerenciado pelo sistema:
- Você não pode criá-lo, modificá-lo nem excluí-lo pela API pública.
- O Midaz reserva a chave
"overdraft". Uma requisição que cria um saldo com essa chave retorna o erro0170 - ErrReservedBalanceKey. - Ele espelha o passivo como um registro correto de partidas dobradas, então o ledger continua equilibrado.
O valor
scope: "internal" bloqueia operações diretas do usuário, seja qual for o valor das flags de permissão acima. O Midaz rejeita qualquer operação direta nesse saldo com o erro 0168 - ErrDirectOperationOnInternalBalance. O companheiro se move apenas pelo enriquecimento de overdraft conduzido pelo sistema.Estado do overdraft nas operações
Cada operação expõe o estado do overdraft nos blocos
balance e balanceAfter. O campo overdraftUsed registra o overdraft consumido antes e depois da operação. Isso dá uma trilha de auditoria completa sem uma consulta de saldo separada.
Para operações que não tocam o overdraft, os dois valores são "0".
As operações companheiras gerenciadas pelo sistema no saldo "overdraft" usam type: "OVERDRAFT" (em maiúsculas). O campo direction carrega o ciclo de vida: "debit" para um saque, "credit" para um pagamento.
overdraftUsed. Elas espelham a transição de overdraft do saldo principal, então o ciclo de vida fica visível por qualquer uma das linhas. A coluna interna snapshot, do tipo JSONB, na tabela operations guarda os mesmos valores para indexação e reconstrução histórica. Essa coluna não faz parte do JSON público. Em vez disso, os valores aparecem em balance.overdraftUsed e balanceAfter.overdraftUsed. O Midaz pode acrescentar ao snapshot contexto futuro gerado pelo sistema sem quebrar o contrato público.
Eventos de overdraft
Em tempo de execução, o Midaz habilita a publicação de eventos de overdraft, a menos que
RABBITMQ_OVERDRAFT_EVENTS_ENABLED seja explicitamente false. O ambiente de exemplo que acompanha o produto define a flag como false. Um deploy que parte desse exemplo não publica nenhum evento de overdraft até você defini-la como true.
Tipos de evento
Exemplo de payload do evento
Casos de uso
Overdraft em conta corrente (cheque especial)
Crédito clássico ao consumidor. A posição derivada da conta corrente pode ficar negativa até um limite pré-aprovado. O saldoAvailable persistido permanece em 0 e o valor em aberto é registrado em OverdraftUsed.
Buy Now, Pay Later (BNPL)
Um provedor de BNPL concede um crédito de compra contra o saldo do cliente. Isso cria uma posição de overdraft imediata que o cliente paga em parcelas.Earned Wage Access / Antecipação salarial
Os funcionários sacam contra ganhos futuros. Os créditos da folha de pagamento zeram a posição de overdraft quando chegam.Antecipação de recebíveis de marketplace
Os vendedores recebem uma antecipação sobre recebíveis futuros. O Midaz paga o overdraft automaticamente conforme chegam as liquidações das vendas.Contas de liquidação / contas pool (modo ilimitado)
Contas de liquidação e contas pool ficam negativas com frequência durante o processamento intradiário. O overdraft ilimitado evita rejeições artificiais enquanto você concilia a posição até o fim do dia.Linhas de crédito rotativo (B2B)
As empresas sacam e pagam a partir de uma linha de crédito rotativo. O limite de overdraft representa a linha de crédito total.Pré-financiamento de seguros
As seguradoras pré-financiam sinistros antes de os ciclos de cobrança de prêmios fecharem. O overdraft cobre a lacuna entre o pagamento e a cobrança.Programas de fidelidade (pontos antecipados)
Os clientes resgatam pontos antes de acumulá-los. O overdraft registra o déficit de pontos e zera conforme os clientes acumulam novos pontos.Regras de proteção
O overdraft traz algumas restrições de imutabilidade e de acesso para manter a integridade do ledger:
- A direção é imutável. Depois que você define o
directionde um saldo na criação, não pode mais alterá-lo. - Saldos internos bloqueiam escritas. Você não pode criar, excluir nem atualizar o saldo companheiro
"overdraft"pela API pública. Um PATCH retorna o erro0175. - Chaves reservadas. O Midaz reserva a chave
"overdraft"para o saldo companheiro gerenciado pelo sistema. - Desabilitar o overdraft preserva a dívida em aberto. Você pode definir
allowOverdraft: falseenquantoOverdraftUsed > 0para bloquear saques futuros, e os créditos recebidos continuam pagando a dívida existente. - O limite não pode ficar abaixo do uso. Se
OverdraftUsed = 200, o Midaz rejeitaoverdraftLimit: "100"com o erro0173, então pague até ficar abaixo do novo teto antes ou defina um limite maior. - Concorrência otimista. As atualizações de saldo usam controle de concorrência por versão, e o Midaz rejeita uma escrita desatualizada com o erro
0174. Tente de novo com a versão mais recente.
Próximos passos
- Conheça os Saldos, a base sobre a qual o overdraft é construído.
- Entenda as Operações para rastrear como as divisões de overdraft aparecem no ledger.
- Configure o Event Publisher para consumir os eventos do ciclo de vida do overdraft.
- Explore as Transações para ver o quadro completo das partidas dobradas no Midaz.

