R-008 — Aprovação de filiação já aprovada não produz efeito
TLDR:
AdminMembershipsService#admin_approve_membershipsai sem escrever nada quando a filiação já temadmin_approved_at. Aprovar duas vezes a mesma filiação não reanexa a foto, não mexe nocard_statuse, 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?, eMembership#approved?éadmin_approved_at.present?— só a data conta.admin_approved_by_idpreenchido 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_statusdeissuedparaprocessinge 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!eMembership#manual_approve!continuam escrevendo direto quando chamados — quem protege a chamada éMembership::FutureApprove, com o próprio guard. - O parâmetro foi renomeado de
resourceparamembership. É 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”