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
Valor (centavos)Valor 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