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 pagamento paid com 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::ConfirmPayment só é chamado quando order.meetings.pending.exists? retorna true
  • 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 RECEIVED do gateway (Asaas) mapeia para paid na 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)