Sweeping Accounts - Máquina de Estados
Visão Geral
O Sweeping Accounts possui duas máquinas de estados independentes que operam em conjunto:
- Máquina de Estados do Consentimento: controla o ciclo de vida da autorização recorrente
- Máquina de Estados do Pagamento: controla o ciclo de vida de cada transação Pix individual
1. Máquina de Estados do Consentimento
O consentimento (payment initiation) representa a autorização recorrente dada pelo usuário para que a ITP execute transferências automáticas dentro dos limites definidos.
Diagrama de Estados
stateDiagram-v2
direction LR
[*] --> AWAITING_AUTHORISATION : Criação da\nPayment Initiation
AWAITING_AUTHORISATION --> AUTHORISED : Usuário aprova\n(callback recebido)
AWAITING_AUTHORISATION --> REJECTED : Usuário rejeita\nou timeout
AWAITING_AUTHORISATION --> REVOKED : Cancelamento\nantes da autorização
AUTHORISED --> CONSUMED : totalAllowedAmount\natingido
AUTHORISED --> EXPIRED : Data de expiração\natingida
AUTHORISED --> REVOKED : Cancelamento via PATCH\n(ITP ou usuário)
REJECTED --> [*]
CONSUMED --> [*]
EXPIRED --> [*]
REVOKED --> [*]
classDef terminal fill:#f5c6c6,stroke:#c0392b,color:#333
classDef active fill:#c6e2f5,stroke:#2980b9,color:#333
classDef initial fill:#d5f5d5,stroke:#27ae60,color:#333
class REJECTED,CONSUMED,EXPIRED,REVOKED terminal
class AUTHORISED active
class AWAITING_AUTHORISATION initial
Descrição dos Estados
| Status | Descrição | Terminal? |
|---|---|---|
AWAITING_AUTHORISATION | Payment initiation criada. Aguardando o usuário autenticar e aprovar o consentimento na detentora | ❌ |
AUTHORISED | Consentimento ativo. Pagamentos podem ser executados dentro dos limites definidos | ❌ |
REJECTED | O usuário rejeitou o consentimento durante a jornada de autorização | ✅ |
CONSUMED | O totalAllowedAmount foi integralmente utilizado. O consentimento encerra-se naturalmente | ✅ |
EXPIRED | A vigência do consentimento expirou (prazo máximo atingido, sem renovação) | ✅ |
REVOKED | O consentimento foi revogado explicitamente pela ITP ou pelo usuário antes do término natural | ✅ |
Transições Válidas
| De | Para | Gatilho |
|---|---|---|
AWAITING_AUTHORISATION | AUTHORISED | Usuário completa a autorização (callback recebido) |
AWAITING_AUTHORISATION | REJECTED | Usuário rejeita na detentora ou timeout da jornada |
AUTHORISED | CONSUMED | totalAllowedAmount totalmente utilizado |
AUTHORISED | EXPIRED | Data de expiração atingida |
AUTHORISED | REVOKED | Solicitação de cancelamento via PATCH |
AWAITING_AUTHORISATION | REVOKED | Cancelamento antes da autorização |
2. Máquina de Estados do Pagamento
Cada transação Pix executada dentro de um consentimento AUTHORISED possui seu próprio ciclo de vida.
Diagrama de Estados
stateDiagram-v2
direction LR
[*] --> PDNG : Pagamento criado
PDNG --> SCHD : Agendamento validado\n(liquidação futura)
PDNG --> ACSP : Enviado ao SPI\n(liquidação imediata)
PDNG --> RJCT : Falha na validação\n(limites, consentimento, dados)
SCHD --> ACSP : Data de liquidação\natingida
SCHD --> CANC : Cancelamento antes\nda liquidação
SCHD --> RJCT : Falha no agendamento
ACSP --> ACSC : Liquidação confirmada\npelo SPI
ACSP --> RJCT : Falha durante\na liquidação
ACSC --> [*]
RJCT --> [*]
CANC --> [*]
classDef terminal fill:#f5c6c6,stroke:#c0392b,color:#333
classDef success fill:#d5f5d5,stroke:#27ae60,color:#333
classDef inprogress fill:#fef9c3,stroke:#f39c12,color:#333
classDef initial fill:#c6e2f5,stroke:#2980b9,color:#333
class RJCT,CANC terminal
class ACSC success
class SCHD,ACSP inprogress
class PDNG initial
Descrição dos Estados
| Status | Sigla OFB | Descrição | Terminal? |
|---|---|---|---|
PDNG | Pending | Pagamento recebido e aguardando processamento | ❌ |
SCHD | Scheduled | Pagamento agendado para liquidação futura | ❌ |
ACSP | Accepted Settlement In Process | Aceito pelo SPI do Banco Central para liquidação | ❌ |
ACSC | Accepted Settlement Completed | Liquidado com sucesso | ✅ |
RJCT | Rejected | Rejeitado (por limite, saldo insuficiente, dados inválidos etc.) | ✅ |
CANC | Cancelled | Cancelado antes da liquidação | ✅ |
Transições Válidas
| De | Para | Gatilho |
|---|---|---|
PDNG | SCHD | Pagamento agendado validado |
PDNG | ACSP | Enviado ao SPI para liquidação imediata |
PDNG | RJCT | Falha na validação (consentimento, limites, dados) |
SCHD | ACSP | Data de liquidação atingida, enviado ao SPI |
SCHD | CANC | Cancelamento solicitado antes da liquidação |
SCHD | RJCT | Falha no agendamento |
ACSP | ACSC | Liquidação confirmada pelo SPI |
ACSP | RJCT | Falha durante liquidação |
Relação entre Consentimento e Pagamentos
flowchart TD
PI["🔓 Payment Initiation\n[AUTHORISED]"]
PI --> P1["✅ Pagamento #1\nACSC"]
PI --> P2["✅ Pagamento #2\nACSD"]
PI --> P3["❌ Pagamento #3\nRJCT"]
PI --> P4["⏳ Pagamento #4\nPDNG"]
P1 -->|"totalUsedAmount += valor"| SUM[("Σ totalUsedAmount\nacumulado")]
P2 -->|"totalUsedAmount += valor"| SUM
P3 -->|"sem alteração"| SUM
SUM -->|"totalUsedAmount\n== totalAllowedAmount"| CONSUMED["🔒 Payment Initiation\n[CONSUMED]"]
style PI fill:#c6e2f5,stroke:#2980b9,color:#333
style CONSUMED fill:#f5c6c6,stroke:#c0392b,color:#333
style P1 fill:#d5f5d5,stroke:#27ae60,color:#333
style P2 fill:#d5f5d5,stroke:#27ae60,color:#333
style P3 fill:#f5c6c6,stroke:#c0392b,color:#333
style P4 fill:#fef9c3,stroke:#f39c12,color:#333
style SUM fill:#f0f0f0,stroke:#888,color:#33
Códigos de Rejeição (RJCT)
RJCT)Quando um pagamento é rejeitado, o campo rejectionReason indica o motivo:
| Código | Descrição | Retriável? |
|---|---|---|
PAGAMENTO_DIVERGENTE_CONSENTIMENTO | Valor ou dados do pagamento divergem do consentimento | ❌ |
SALDO_INSUFICIENTE | Saldo insuficiente na conta devedora | ✅ (nova tentativa) |
LIMITE_PERIODO_VALOR_EXCEDIDO | Limite de valor do período atingido | ❌ (aguardar próximo período) |
LIMITE_PERIODO_QUANTIDADE_EXCEDIDO | Limite de quantidade do período atingido | ❌ (aguardar próximo período) |
CONSENTIMENTO_INVALIDO | Consentimento não está no status AUTHORISED | ❌ |
FALHA_INFRAESTRUTURA | Falha interna na detentora | ✅ (retry após intervalo) |
VALOR_INVALIDO | Formato ou valor do amount inválido | ❌ |
CONTA_NAO_PERMITE_PAGAMENTO | Conta não habilitada para este tipo de pagamento | ❌ |
Erros marcados como retriáveis podem ser tentados novamente respeitando as janelas de retry definidas pelo Open Finance Brasil: Intradia (até 12h do mesmo dia) e Extradia (até 7 dias corridos).
Pontos de Atenção
Estados terminais são irreversíveis: Uma vez que um pagamento ou consentimento atinge um estado terminal (ACSC,RJCT,CANC,CONSUMED,REVOKED,EXPIRED), não há transição de retorno. Para recomeçar, uma nova payment initiation deve ser criada e autorizada.
ConsentimentoCONSUMED≠REVOKED:CONSUMEDindica uso completo do limite (comportamento esperado);REVOKEDindica cancelamento explícito. Comunique de forma diferente ao usuário: o primeiro pode sugerir criação de novo consentimento, o segundo deve confirmar o encerramento intencional.
Pagamentos rejeitados não reduzem ototalUsedAmount: Apenas pagamentos com statusACSCincrementam o total utilizado. PagamentosRJCTnão consomem o limite do consentimento.
Monitoramento: Implemente alertas para consentimentos com altototalUsedAmountrelativo aototalAllowedAmount(ex: ≥ 80%), para que o usuário possa renovar o consentimento antes de ser interrompido.