R-002 — Confirmação de pagamento via webhook e ativação da sessão

TLDR: Um pagamento confirmado via webhook do gateway só ativa as sessões se elas ainda existirem em estado pending — um webhook atrasado após a expiração deixa o pagamento paid mas as sessões irrecuperáveis.

Given / When / Then

Dado um pagamento ligado a uma order com sessões Quando o webhook do ZeusPay/Asaas dispara um evento de confirmação e Payments::UpdateStatusFlow o processa Então se payment.paid? e order.meetings.pending.exists? → as sessões passam a scheduled e notificações são enviadas; caso contrário nenhuma mudança ocorre nas sessões

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 Nenhuma mudança nas sessões
paid não (destruídas) — Nenhuma mudança — perda silenciosa de dados
refunded / canceled / overdue / expired sim qualquer Sessões → canceled com motivo
Igual ao status atual qualquer qualquer Retorno antecipado — nenhuma mudança

Restrições

  • Orders::ConfirmPayment só é chamado quando order.meetings.pending.exists? retorna true
  • Uma vez que as sessões são destruídas (por Meetings::DestroyAllByRelatedPayment), um webhook atrasado não consegue recuperá-las
  • O handler do webhook não distingue entre sessões canceladas pelo sistema vs. por um usuário
  • O status RECEIVED do gateway (Asaas) mapeia para paid na plataforma

Teste vinculado

spec/use_cases/payments/update_meetings_by_gateway_status_spec.rb — (sem teste ainda)