""" Desfaz um passo do fluxo da solicitação (da situação atual para trás). Delega a lógica a ``solicitacoes.services.reverter_ultima_acao``. Uso: python manage.py reverter_acao --dry-run python manage.py reverter_acao """ import uuid from django.core.management.base import BaseCommand, CommandError from solicitacoes.models import Solicitacao from solicitacoes.services import ValidacaoError, reverter_ultima_acao class Command(BaseCommand): help = ( "Desfaz a última ação gravada na solicitação (Diretoria → pareceres → Head → envio ao Head)." ) def add_arguments(self, parser): parser.add_argument("solicitacao_id", type=str, help="UUID da solicitação") parser.add_argument( "--dry-run", action="store_true", help="Mostra o que seria feito sem gravar no banco.", ) def handle(self, *args, **options): raw = options["solicitacao_id"].strip() try: sid = uuid.UUID(raw) except ValueError as e: raise CommandError(f"UUID inválido: {raw}") from e dry = options["dry_run"] try: s = Solicitacao.objects.get(pk=sid) except Solicitacao.DoesNotExist as e: raise CommandError(f"Solicitação não encontrada: {sid}") from e self.stdout.write(f"Solicitação: {s.id}") self.stdout.write(f" status atual: {s.status}") self.stdout.write(f" finalizada_em: {s.finalizada_em}") self.stdout.write( f" pareceres: {list(s.pareceres.values_list('etapa', flat=True))}" ) self.stdout.write( f" aprovações: {list(s.aprovacoes.values_list('etapa', 'decisao'))}" ) try: result = reverter_ultima_acao(s, dry_run=dry) except ValidacaoError as e: raise CommandError(str(e)) from e self.stdout.write(self.style.WARNING(f" → {result['detalhe']}")) self.stdout.write(f" (ação: {result['acao']}; novo status: {result.get('novo_status', '—')})") if dry: self.stdout.write(self.style.NOTICE("Dry-run: nenhuma alteração gravada.")) else: self.stdout.write(self.style.SUCCESS("OK: reversão aplicada."))