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
AutoSubscribeJobouPOST /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_unavailableeExpireWhenIneligibledeixa 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 emPOST /api/v1/subscriptions/pros. Creation::CreateSubscriptionlimpaexpires_atao 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.rbspec/requests/citrg/membership_expirations_spec.rbspec/use_cases/subscriptions/pro/expire_when_ineligible_spec.rbspec/use_cases/subscriptions/pro/creation/create_subscription_spec.rbspec/use_cases/subscriptions/pro/creation/create_flow_spec.rbspec/requests/api/v1/subscriptions/pros_expire_when_ineligible_spec.rb