Browse Source

refact: cria método get_proximo_numero

pull/3822/head
LeandroJatai 1 week ago
parent
commit
f6d71249cf
  1. 45
      sapl/materia/forms.py
  2. 68
      sapl/materia/models.py
  3. 48
      sapl/materia/views.py

45
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()

68
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,

48
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
if tipo.sequencia_numeracao:
numeracao = tipo.sequencia_numeracao
ano = request.GET.get('ano', None)
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

Loading…
Cancel
Save