Fix: falha silenciosa na suspensão de filiação via PAD

TLDR: suspend! usava update em vez de update!, então falhas de validação eram engolidas silenciosamente — o service atualizava o histórico do procedimento e retornava sucesso mesmo quando a filiação nunca chegou a ser suspensa.

Contexto

Quando um admin suspendia uma filiação pelo fluxo de PAD (Procedimento Administrativo), o service chamava procedure.membership.suspend! fora do bloco begin/rescue. suspend! usava update (não update!), que retorna false em falha sem levantar exceção. O service nunca checava esse retorno, então sempre seguia adiante para atualizar o corpo do procedimento e retornar { success: true }.

Resultado: o histórico do procedimento ganhava uma entrada dizendo “X suspendeu a filiação Y”, mas membership.suspended continuava false.

O mesmo problema existia em unsuspend_membership.

Objetivos

  • Garantir que suspend! e unsuspend! levantem em falha em vez de falhar silenciosamente
  • Garantir que o service só atualize o corpo do procedimento e retorne sucesso quando a filiação foi de fato alterada
  • Garantir a mesma correção para unsuspend_membership

Fora de escopo

— (não registrado na spec original)

Mudanças

Arquivo Mudança
app/models/membership.rb suspend! e unsuspend! passam a usar update!
app/services/admin_administrative_procedures_service.rb mover procedure.membership.suspend! e unsuspend! para dentro do bloco begin/rescue
test/services/admin_administrative_procedures_service_test.rb (novo) cobre os caminhos de sucesso e de falha dos dois métodos

Plano de implementação

  1. test: escrever testes falhando para suspend_membership e unsuspend_membership — caminho de sucesso e caminho de falha (quando suspend! levanta). Arquivo: test/services/admin_administrative_procedures_service_test.rb
  2. fix: trocar suspend! e unsuspend! para update!; mover as duas chamadas para dentro do begin/rescue no service. Arquivos: app/models/membership.rb, app/services/admin_administrative_procedures_service.rb

Como verificar

bash make test test=test/services/admin_administrative_procedures_service_test.rb

Manual:

  1. No admin PAD, associar uma filiação a um procedimento e clicar em “Suspender Filiação”
  2. Depois do redirect, checar que membership.suspended é true e membership.suspended_at está preenchido
  3. Clicar em “Reativar Filiação” e confirmar que membership.suspended voltou para false

Documentação