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_at presente) e card_status dentro de Membership::ISSUED_CARD_STATUSES (issued, auto_issued). processing não conta — carteira em emissão é fluxo pendente.
  • Membership::FutureApprove só assume a aprovação quando recebe approver. Sem responsável, nada é aprovado: manual_approve!(nil) é no-op.
  • AdminMembershipsService#admin_issue_card não passa approver — naquele ponto issued_definitive_card já é true e 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 > 1 e vale para A e B. O que muda são membership_id e register_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