R-011 — A aprovação vai para a filiação que ainda não concluiu o fluxo
TLDR: quando o admin aprova a documentação de um perfil, a aprovação cai na filiação que ainda tem fluxo pendente — não na que apenas está vigente. Se a vigente já está aprovada e com carteira emitida, a aprovação é redirecionada para a filiação seguinte, e o e-mail de aprovação aponta para ela.
Given / When / Then
Dado um usuário sem carteira definitiva, com uma filiação vigente (A) e uma filiação seguinte (B) paga, sem admin_approved_at e not_issued
Quando o admin aprova a documentação do perfil
Então a aprovação cai em A se A ainda tem fluxo pendente, ou em B se A já está aprovada e com carteira emitida — e o e-mail de aprovação sai com os dados da filiação que foi efetivamente aprovada
Tabela de decisão
| Estado da filiação vigente (A) | Filiação aprovada | A é tocada? | E-mail aponta para |
|---|---|---|---|
sem admin_approved_at, sem carteira emitida |
A | sim — vai para processing |
A |
admin_approved_at preenchido e card_status em issued/auto_issued |
B | não | B |
já aprovada mas ainda em processing (sem carteira) |
nenhuma — A é idempotente (R-008) e B não assume | não | A |
| usuário com carteira definitiva | B por automatic_approve! (R-009) |
não | A (o ramo automático envia o próprio e-mail de renovação) |
Restrições
- O redirecionamento exige as duas condições em A:
approved?(admin_approved_atpresente) ecard_statusdentro deMembership::ISSUED_CARD_STATUSES(issued,auto_issued).processingnão conta — carteira em emissão é fluxo pendente. Membership::FutureApprovesó assume a aprovação quando recebeapprover. Sem responsável, nada é aprovado:manual_approve!(nil)é no-op.AdminMembershipsService#admin_issue_cardnão passaapprover— naquele pontoissued_definitive_cardjá étruee o ramo manual não é alcançado. Ver R-007.- Nenhuma filiação com carteira já emitida volta para a fila de emissão — quem garante isso em A é R-008; esta regra garante que a aprovação não se perde, e sim encontra o destino certo.
- O e-mail de aprovação é enfileirado depois do
Membership::FutureApprove, porque depende do retorno dele para escolher a filiação. Consequência aceita: exceção no caso de uso impede o envio. - O template do e-mail não muda com o redirecionamento —
is_renewal?éuser.memberships.count > 1e vale para A e B. O que muda sãomembership_ideregister_number.
Código
app/models/membership/future_approve.rb
```ruby unless user.issued_definitive_card? if approver && current_membership_approved_and_issued? next_membership.manual_approve!(approver)
return Success(result: { approved_membership: next_membership }) end
return Success() end
def current_membership_approved_and_issued? current_membership.approved? && Membership::ISSUED_CARD_STATUSES.include?(current_membership.card_status.to_sym) end ```
app/services/admin_user_profiles_service.rb
```ruby result = Membership::FutureApprove.call( user: @profile_user, current_membership: @membership, approver: user )
fire_approved_user_profile_email(result[:approved_membership] || @membership) ```
Teste vinculado
test/services/membership_approval_scenarios_test.rb:
- “scenario A directs the approval to membership A, which still holds the pending flow”
- “scenario A sends the approval email for membership A”
- “scenario B directs the approval to membership B, which still holds the pending flow”
- “scenario B leaves membership A untouched because it already finished the flow”
- “scenario B puts membership B in the emission queue and keeps A out of it”
- “scenario B sends the approval email for membership B, not for A”
test/models/membership/future_approve_test.rb:
- “leaves the next membership untouched when the current one has not finished its flow”
- “approves the next membership when the current one is already approved and issued”
- “does not approve the next membership when no approver is given”
- “returns the next membership as the approved one when it takes over the approval”
- “returns no approved membership when the current one still holds the pending flow”
test/models/membership_test.rb:
- “manual_approve! approves the membership and sends the card to the emission queue”
- “manual_approve! attaches the profile picture to the card”
- “manual_approve! does nothing when there is no approver”
Relacionados
- R-007 — A filiação seguinte é re-avaliada na emissão da carteira
- R-008 — Aprovação de filiação já aprovada não produz efeito
- R-009 — A filiação seguinte só é auto-aprovada com carteira definitiva
- R-010 — Fila de emissão prioriza filiações vencendo no mês corrente
- Spec: a aprovação vai para a filiação que ainda não concluiu o fluxo