R-003 — Expiração da assinatura Pro por inelegibilidade no CITRG

TLDR: Toda vez que o fluxo de criação de Pro roda (sign-in do terapeuta via AutoSubscribeJob ou POST /api/v1/subscriptions/pros), a filiação CITRG é revalidada; se estiver expirada ou ausente, a assinatura Pro local é expirada e a assinatura regular de terapeuta é restaurada.

Modelo de negócio

  • Terapeuta regular = possui certificado válido do Apolo (plataforma de aulas), verificado no login via isCertified.
  • Terapeuta Pro = terapeuta regular + filiação CITRG válida, verificada via GET apolo_membership (valid_until_timestamp >= today).

Quando a filiação CITRG vence, o terapeuta precisa ser rebaixado de Pro para regular — o acesso Pro não pode durar mais que a filiação.

Given / When / Then

Dado um usuário com assinatura Pro ativa (não expirada) Quando Subscriptions::Pro::Creation::CreateFlow roda e ValidateEligibility calcula pro_eligible == false (filiação CITRG expirada ou não encontrada) Então Subscriptions::Pro::ExpireWhenIneligible marca a assinatura Pro como status: :inactive com expires_at: Time.current e reativa a assinatura regular de terapeuta (status: :active, expires_at: nil) na mesma transação

Tabela de decisão

pro_eligible Estado da assinatura Pro Resultado
false pending/active, não expirada Pro expirado + plano regular de terapeuta reativado
false nenhuma ou já expirada Plano regular de terapeuta reativado (status: :active, expires_at: nil)
true qualquer Nenhuma mudança aqui; o fluxo continua (Pro existente bloqueia recriação; Pro expirado é reativado com expires_at limpo)

Restrições

  • O rebaixamento só ocorre com resposta autoritativa do CITRG: HTTP 200 com dados de filiação inválidos/expirados, ou HTTP 404 (sem filiação). Qualquer outra falha (5xx, auth mal configurado) marca citrg_unavailable e ExpireWhenIneligible deixa a assinatura intocada — uma indisponibilidade do CITRG nunca deve rebaixar terapeutas Pro pagantes.
  • O fluxo roda a cada sign-in de terapeuta (Subscriptions::Pro::AutoSubscribeJob, pulado em test env) e em POST /api/v1/subscriptions/pros.
  • Creation::CreateSubscription limpa expires_at ao reativar uma assinatura Pro existente, então renovar a filiação repromove o usuário no próximo sign-in.
  • As verificações feitas no login não cobrem usuários cujo token continua se renovando automaticamente sem um novo sign-in — um job recorrente de revalidação é um follow-up conhecido, não coberto por esta regra.
  • A janela de 12 meses do Apolo (Anjo/Tutelado) ainda não é representada neste sistema — também é um follow-up.

Testes vinculados

  • spec/models/subscription_spec.rb
  • spec/requests/citrg/membership_expirations_spec.rb
  • spec/use_cases/subscriptions/pro/expire_when_ineligible_spec.rb
  • spec/use_cases/subscriptions/pro/creation/create_subscription_spec.rb
  • spec/use_cases/subscriptions/pro/creation/create_flow_spec.rb
  • spec/requests/api/v1/subscriptions/pros_expire_when_ineligible_spec.rb