R-002 — Confirmação de pagamento por webhook e ativação de sessões
TLDR: Um pagamento confirmado pelo webhook do gateway só ativa sessões se elas ainda existirem em
pending— um webhook atrasado, após a expiração, deixa o pagamentopaidcom as sessões irrecuperáveis.
Given / When / Then
Dado um pagamento vinculado a uma order com sessões
Quando o webhook da ZeusPay/Asaas dispara um evento de confirmação e o Payments::UpdateStatusFlow o processa
Então se payment.paid? e order.meetings.pending.exists? → as sessões passam a scheduled e as notificações são enviadas; caso contrário nenhuma sessão é alterada
Tabela de decisão
| Status no gateway | Sessões existem? | Estado das sessões | Resultado |
|---|---|---|---|
paid |
sim | pending |
Sessões → scheduled, notificações enviadas |
paid |
sim | canceled ou finished |
Sessões inalteradas |
paid |
não (destruídas) | — | Sessões inalteradas — perda silenciosa de dado |
refunded / canceled / overdue / expired |
sim | qualquer | Sessões → canceled com motivo |
| Igual ao status atual | qualquer | qualquer | Retorno antecipado — nada muda |
Restrições
Orders::ConfirmPaymentsó é chamado quandoorder.meetings.pending.exists?retornatrue- Uma vez destruídas as sessões (por
Meetings::DestroyAllByRelatedPayment), um webhook atrasado não consegue recuperá-las - O handler do webhook não distingue sessões canceladas pelo sistema das canceladas pelo usuário
- O status
RECEIVEDdo gateway (Asaas) mapeia parapaidna plataforma
Restrição relacionada
A destruição das sessões vem de R-001 — as duas regras juntas descrevem a janela de perda registrada em payments_pix_expiration_race_condition.
Teste vinculado
spec/use_cases/payments/update_meetings_by_gateway_status_spec.rb — (sem teste ainda)