From f6d71249cfe7a930b7c9e9d0861e50c76c4c8f0a Mon Sep 17 00:00:00 2001 From: LeandroJatai Date: Tue, 27 Jan 2026 15:22:14 -0300 Subject: [PATCH] =?UTF-8?q?refact:=20cria=20m=C3=A9todo=20get=5Fproximo=5F?= =?UTF-8?q?numero?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/materia/forms.py | 45 ++++------------------------ sapl/materia/models.py | 68 ++++++++++++++++++++++++++++++++++++++++++ sapl/materia/views.py | 48 ++++------------------------- 3 files changed, 78 insertions(+), 83 deletions(-) diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index c685109ae..9c39c58df 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -2458,47 +2458,12 @@ class ConfirmarProposicaoForm(ProposicaoForm): if self.instance.tipo.content_type.model_class( ) == TipoMateriaLegislativa: - numeracao = None - try: - self.logger.debug( - "Tentando obter modelo de sequência de numeração.") - numeracao = BaseAppConfig.objects.last( - ).sequencia_numeracao_protocolo - except AttributeError as e: - self.logger.error("Erro ao obter modelo. " + str(e)) - pass - tipo = self.instance.tipo.tipo_conteudo_related - if tipo.sequencia_numeracao: - numeracao = tipo.sequencia_numeracao - ano = timezone.now().year - if numeracao == 'A': - numero = MateriaLegislativa.objects.filter( - ano=ano, tipo=tipo).aggregate(Max('numero')) - elif numeracao == 'L': - legislatura = Legislatura.objects.filter( - data_inicio__year__lte=ano, - data_fim__year__gte=ano).first() - data_inicio = legislatura.data_inicio - data_fim = legislatura.data_fim - numero = MateriaLegislativa.objects.filter( - data_apresentacao__gte=data_inicio, - data_apresentacao__lte=data_fim, - tipo=tipo).aggregate( - Max('numero')) - elif numeracao == 'U': - numero = MateriaLegislativa.objects.filter( - tipo=tipo).aggregate(Max('numero')) - if numeracao is None: - numero['numero__max'] = 0 - - if cd['numero_materia_futuro'] and not MateriaLegislativa.objects.filter(tipo=tipo, - ano=ano, - numero=cd['numero_materia_futuro']): - max_numero = cd['numero_materia_futuro'] - else: - max_numero = numero['numero__max'] + \ - 1 if numero['numero__max'] else 1 + max_numero, ano = MateriaLegislativa.get_proximo_numero( + tipo=tipo, + ano=None, + numero_preferido=cd.get('numero_materia_futuro', None) + ) # dados básicos materia = MateriaLegislativa() diff --git a/sapl/materia/models.py b/sapl/materia/models.py index da2e0ac91..6c4c31cbf 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -382,6 +382,74 @@ class MateriaLegislativa(models.Model): using=using, update_fields=update_fields) + @staticmethod + def get_proximo_numero(tipo, ano=None, numero_preferido=None): + """ + Retorna o próximo número disponível para uma MateriaLegislativa + baseado no tipo e nas configurações de numeração. + + Args: + tipo: TipoMateriaLegislativa - o tipo da matéria + ano: int - o ano da matéria (default: ano atual) + numero_preferido: int - número preferido/desejado (opcional) + + Returns: + int: O próximo número disponível para a matéria + """ + from django.db.models import Max + from sapl.parlamentares.models import Legislatura + import sapl.base.models + + if ano is None: + ano = timezone.now().year + + # Obtém a configuração de numeração + numeracao = None + try: + numeracao = sapl.base.models.AppConfig.objects.last( + ).sequencia_numeracao_protocolo + except AttributeError: + pass + + # O tipo pode sobrescrever a configuração global + if tipo.sequencia_numeracao: + numeracao = tipo.sequencia_numeracao + + # Calcula o próximo número baseado no tipo de numeração + if numeracao == 'A': # Por ano + numero = MateriaLegislativa.objects.filter( + ano=ano, tipo=tipo).aggregate(Max('numero')) + elif numeracao == 'L': # Por legislatura + legislatura = Legislatura.objects.filter( + data_inicio__year__lte=ano, + data_fim__year__gte=ano).first() + if legislatura: + data_inicio = legislatura.data_inicio + data_fim = legislatura.data_fim + numero = MateriaLegislativa.objects.filter( + data_apresentacao__gte=data_inicio, + data_apresentacao__lte=data_fim, + tipo=tipo).aggregate(Max('numero')) + else: + numero = {'numero__max': 0} + elif numeracao == 'U': # Único/Universal + numero = MateriaLegislativa.objects.filter( + tipo=tipo).aggregate(Max('numero')) + else: + numero = {'numero__max': 0} + + # Verifica se o número preferido está disponível + if numero_preferido and not MateriaLegislativa.objects.filter( + tipo=tipo, + ano=ano, + numero=numero_preferido).exists(): + return int(numero_preferido) + + # Retorna o próximo número sequencial + max_numero = numero['numero__max'] + return ((max_numero + 1) if max_numero else 1), ano + + class Autoria(models.Model): autor = models.ForeignKey(Autor, diff --git a/sapl/materia/views.py b/sapl/materia/views.py index fd05d5e2a..e256bd43b 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -340,53 +340,15 @@ class ProposicaoTaView(IntegracaoTaView): @permission_required('materia.detail_materialegislativa') def recuperar_materia(request): - logger = logging.getLogger(__name__) - username = request.user.username tipo = TipoMateriaLegislativa.objects.get(pk=request.GET['tipo']) - ano = request.GET.get('ano', '') - - if not (tipo and ano): - return JsonResponse({'numero': '', 'ano': ''}) - - numeracao = None - try: - logger.debug("user=" + username + - ". Tentando obter numeração da matéria.") - numeracao = sapl.base.models.AppConfig.objects.last( - ).sequencia_numeracao_protocolo - except AttributeError as e: - logger.error("user=" + username + ". " + str(e) + - " Numeracao da matéria definida como None.") - pass + ano = request.GET.get('ano', None) - if tipo.sequencia_numeracao: - numeracao = tipo.sequencia_numeracao - - if numeracao == 'A': - numero = MateriaLegislativa.objects.filter( - ano=ano, tipo=tipo).aggregate(Max('numero')) - elif numeracao == 'L': - legislatura = Legislatura.objects.filter( - data_inicio__year__lte=ano, - data_fim__year__gte=ano).first() - data_inicio = legislatura.data_inicio - data_fim = legislatura.data_fim - numero = MateriaLegislativa.objects.filter( - data_apresentacao__gte=data_inicio, - data_apresentacao__lte=data_fim, - tipo=tipo).aggregate( - Max('numero')) - elif numeracao == 'U': - numero = MateriaLegislativa.objects.filter( - tipo=tipo).aggregate(Max('numero')) - - if numeracao is None: - numero['numero__max'] = 0 - - max_numero = numero['numero__max'] + 1 if numero['numero__max'] else 1 + max_numero, ano = MateriaLegislativa.get_proximo_numero( + tipo=tipo, + ano=int(ano) if ano else None + ) response = JsonResponse({'numero': max_numero, 'ano': ano}) - return response