R-008 — Aprovação de filiação já aprovada não produz efeito

TLDR: AdminMembershipsService#admin_approve_membership sai sem escrever nada quando a filiação já tem admin_approved_at. Aprovar duas vezes a mesma filiação não reanexa a foto, não mexe no card_status e, principalmente, não devolve para a fila de emissão uma carteira que já foi emitida.

Given / When / Then

Dado uma filiação já aprovada — admin_approved_at presente — e com a carteira issued Quando o atendente aprova a documentação do perfil de novo, por exemplo depois de um reenvio de arquivo pela área de membro Então a filiação permanece exatamente como estava: card_status continua issued, admin_approved_at e admin_approved_by_id continuam os originais, e nenhuma nova cópia da foto é anexada

Tabela de decisão

Estado da filiação Efeito de admin_approve_membership
admin_approved_at nulo Anexa card_picture, grava documentation_status: ok, card_status: processing, admin_approved_at: Time.now, admin_approved_by_id = o admin
admin_approved_at presente Nenhum — retorna sem tocar no registro, qualquer que seja o card_status

Restrições

  • O guard é return if membership.approved?, e Membership#approved? é admin_approved_at.present? — só a data conta. admin_approved_by_id preenchido sozinho não caracteriza aprovação.
  • O dano que a regra evita é a regressão de carteira emitida: sem o guard, uma segunda aprovação reescrevia card_status de issued para processing e a carteira voltava para a fila de emissão, gerando reimpressão indevida.
  • O guard vale para o método de serviço. Membership#automatic_approve! e Membership#manual_approve! continuam escrevendo direto quando chamados — quem protege a chamada é Membership::FutureApprove, com o próprio guard.
  • O parâmetro foi renomeado de resource para membership. É o mesmo objeto; o nome antigo escondia que o guard depende do estado da filiação.

Código

app/services/admin_memberships_service.rb

```ruby def admin_approve_membership(membership, user) return if membership.approved?

membership.card_picture.attach(membership.user_profile.membership_picture_file.blob) membership.documentation_status = :ok membership.card_status = :processing membership.admin_approved_at = Time.now membership.admin_approved_by_id = user.id membership.save! end ```

app/models/membership.rb

ruby def approved? admin_approved_at.present? end

Teste vinculado

test/services/admin_memberships_service_test.rb: - “admin_approve_membership does nothing when the membership is already approved” - “admin_approve_membership approves the membership when it has no approval yet”

test/models/membership_test.rb: - “approved? returns true when admin_approved_at is present” - “approved? returns false when admin_approved_at is nil” - “approved? returns false when only admin_approved_by_id is present”

Relacionados