Pular para o conteúdo principal

Tentativas de Pagamento (Payment Retry)

O sistema de retry processa automaticamente tentativas de cobrança para faturas em atraso.

Estados da Tentativa​

StatusDescrição
pendingAguardando processamento
processingSendo processada (reivindicada pelo worker)
succeededPagamento bem-sucedido
failedPagamento recusado, mais tentativas disponíveis
exhaustedMáximo de tentativas atingido

Campos da Tentativa​

CampoDescrição
FaturaFatura associada
PagamentoRegistro de pagamento criado
Número da tentativaSequencial (1, 2, 3...)
Método de pagamentoMétodo utilizado na tentativa
ValorValor a ser cobrado
Código de falhaMotivo da recusa
Mensagem de falhaDescrição detalhada do erro
Agendado paraData/hora da tentativa
Processado emData/hora do processamento
Próximo retry emQuando a próxima tentativa será feita

Worker de Retry​

O worker executa a cada 6 horas e:

  1. Busca tentativas com status=pending e scheduledFor ≤ agora
  2. Reivindica atomicamente cada tentativa (pending → processing) para evitar duplicação
  3. Para cada tentativa:
    • Verifica se a fatura já foi paga (pula)
    • Cria registro de pagamento
    • Processa o pagamento via gateway
  4. Em caso de sucesso:
    • Marca a fatura como paga
    • Cria registro de recuperação
    • Remove a conta da lista de inadimplentes
  5. Em caso de falha:
    • Se há tentativas restantes: agenda a próxima
    • Se esgotou tentativas: marca como exhausted e suspende a conta (se configurado)

Prevenção de Condições de Corrida​

O sistema usa updateMany atômico com verificação de status para garantir que apenas um worker processe cada tentativa:

WHERE id = X AND status = 'pending'
SET status = 'processing'

Se count = 0, outro worker já reivindicou a tentativa.

Retry para Parcelas​

Tentativas também podem ser direcionadas a parcelas específicas:

  • O metadata.installmentId identifica a parcela
  • O valor da tentativa é o da parcela, não o da fatura inteira