From a8dcc36d503c5c4af793ed673a217b76a241b7cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Rodrigues?= Date: Tue, 15 Oct 2019 18:42:21 -0300 Subject: [PATCH] Fix #2987 --- sapl/base/forms.py | 1 + ...39_appconfig_inicio_numeracao_protocolo.py | 20 +++++++++ sapl/base/models.py | 5 +++ sapl/base/views.py | 40 ++++++++++++++++++ sapl/protocoloadm/forms.py | 4 +- sapl/protocoloadm/tests/test_protocoloadm.py | 4 +- sapl/protocoloadm/views.py | 41 +++++++++---------- sapl/templates/base/layouts.yaml | 2 +- 8 files changed, 91 insertions(+), 26 deletions(-) create mode 100644 sapl/base/migrations/0039_appconfig_inicio_numeracao_protocolo.py diff --git a/sapl/base/forms.py b/sapl/base/forms.py index a20cb8b2d..25317d4bc 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -1504,6 +1504,7 @@ class ConfiguracoesAppForm(ModelForm): model = AppConfig fields = ['documentos_administrativos', 'sequencia_numeracao_protocolo', + 'inicio_numeracao_protocolo', 'sequencia_numeracao_proposicao', 'esfera_federacao', # 'painel_aberto', # TODO: a ser implementado na versão 3.2 diff --git a/sapl/base/migrations/0039_appconfig_inicio_numeracao_protocolo.py b/sapl/base/migrations/0039_appconfig_inicio_numeracao_protocolo.py new file mode 100644 index 000000000..6a8e584c8 --- /dev/null +++ b/sapl/base/migrations/0039_appconfig_inicio_numeracao_protocolo.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.23 on 2019-10-15 19:13 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0038_auditlog'), + ] + + operations = [ + migrations.AddField( + model_name='appconfig', + name='inicio_numeracao_protocolo', + field=models.PositiveIntegerField(default=1, verbose_name='Início da numeração de protocolo'), + ), + ] diff --git a/sapl/base/models.py b/sapl/base/models.py index 07f028984..9e694bf0e 100644 --- a/sapl/base/models.py +++ b/sapl/base/models.py @@ -107,6 +107,11 @@ class AppConfig(models.Model): max_length=1, verbose_name=_('Sequência de numeração de protocolos'), choices=SEQUENCIA_NUMERACAO_PROTOCOLO, default='A') + + inicio_numeracao_protocolo = models.PositiveIntegerField( + verbose_name=_('Início da numeração de protocolo'), + default=1 + ) esfera_federacao = models.CharField( max_length=1, diff --git a/sapl/base/views.py b/sapl/base/views.py index edb32e336..d41abbc21 100644 --- a/sapl/base/views.py +++ b/sapl/base/views.py @@ -2041,6 +2041,46 @@ class AppConfigCrud(CrudAux): kwargs={'pk': app_config.pk})) + class UpdateView(CrudAux.UpdateView): + + form_class = ConfiguracoesAppForm + + def form_valid(self, form): + numeracao = AppConfig.objects.last().sequencia_numeracao_protocolo + numeracao_antiga = AppConfig.objects.last().inicio_numeracao_protocolo + + self.object = form.save() + numeracao_nova = self.object.inicio_numeracao_protocolo + + if numeracao_nova != numeracao_antiga: + if numeracao == 'A': + numeros = Protocolo.objects.filter( + ano=timezone.now().year + ) + elif numeracao == 'L': + legislatura = Legislatura.objects.filter( + data_inicio__year__lte=timezone.now().year, + data_fim__year__gte=timezone.now().year + ).first() + + data_inicio = legislatura.data_inicio + data_fim = legislatura.data_fim + + numeros = Protocolo.objects.filter( + data__gte=data_inicio, + data_lte=data_fim + ) + elif numeracao == 'U': + numeros = Protocolo.objects.all() + + if numeros: + msg = "O novo início da numeração de protocolo entrará em vigor na " \ + "próxima sequência, pois já existem protocolos cadastrados na " \ + "atual." + messages.warning(self.request, msg) + + return super().form_valid(form) + class ListView(CrudAux.ListView): def get(self, request, *args, **kwargs): diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py index 4d1b854bc..a732aed65 100644 --- a/sapl/protocoloadm/forms.py +++ b/sapl/protocoloadm/forms.py @@ -343,7 +343,7 @@ class AnularProtocoloAdmForm(ModelForm): *args, **kwargs) -class ProtocoloDocumentForm(ModelForm): +class ProtocoloDocumentoForm(ModelForm): tipo_protocolo = forms.ChoiceField(required=True, label=_('Tipo de Protocolo'), @@ -445,7 +445,7 @@ class ProtocoloDocumentForm(ModelForm): form_actions(label=_('Protocolar Documento')) ) ) - super(ProtocoloDocumentForm, self).__init__( + super(ProtocoloDocumentoForm, self).__init__( *args, **kwargs) if not config.protocolo_manual: diff --git a/sapl/protocoloadm/tests/test_protocoloadm.py b/sapl/protocoloadm/tests/test_protocoloadm.py index 631c56243..e30d550cf 100644 --- a/sapl/protocoloadm/tests/test_protocoloadm.py +++ b/sapl/protocoloadm/tests/test_protocoloadm.py @@ -13,7 +13,7 @@ from sapl.comissoes.models import Comissao, TipoComissao from sapl.materia.models import UnidadeTramitacao from sapl.protocoloadm.forms import (AnularProtocoloAdmForm, DocumentoAdministrativoForm, - MateriaLegislativa, ProtocoloDocumentForm, + MateriaLegislativa, ProtocoloDocumentoForm, ProtocoloMateriaForm, TramitacaoAdmForm, TramitacaoAdmEditForm, compara_tramitacoes_doc, @@ -415,7 +415,7 @@ def test_protocolo_documento_form_invalido(): config = mommy.make(AppConfig) - form = ProtocoloDocumentForm( + form = ProtocoloDocumentoForm( data={}, initial={ 'user_data_hora_manual': '', diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index fa97e6730..ce7bc8041 100755 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -44,23 +44,19 @@ from sapl.utils import (create_barcode, get_base_url, get_client_ip, from django.shortcuts import render -from .forms import (AcompanhamentoDocumentoForm, AnularProtocoloAdmForm, - DocumentoAcessorioAdministrativoForm, - DocumentoAdministrativoFilterSet, - DocumentoAdministrativoForm, FichaPesquisaAdmForm, FichaSelecionaAdmForm, ProtocoloDocumentForm, - ProtocoloFilterSet, ProtocoloMateriaForm, - TramitacaoAdmEditForm, TramitacaoAdmForm, +from .forms import (AcompanhamentoDocumentoForm, AnexadoEmLoteFilterSet, AnexadoForm, + AnularProtocoloAdmForm, compara_tramitacoes_doc, DesvincularDocumentoForm, DesvincularMateriaForm, - filtra_tramitacao_adm_destino_and_status, - filtra_tramitacao_adm_destino, filtra_tramitacao_adm_status, - AnexadoForm, AnexadoEmLoteFilterSet, - PrimeiraTramitacaoEmLoteAdmFilterSet, - TramitacaoEmLoteAdmForm, - TramitacaoEmLoteAdmFilterSet, - compara_tramitacoes_doc) -from .models import (AcompanhamentoDocumento, DocumentoAcessorioAdministrativo, + DocumentoAcessorioAdministrativoForm, DocumentoAdministrativoFilterSet, + DocumentoAdministrativoForm, FichaPesquisaAdmForm, FichaSelecionaAdmForm, + filtra_tramitacao_adm_destino, filtra_tramitacao_adm_destino_and_status, + filtra_tramitacao_adm_status, PrimeiraTramitacaoEmLoteAdmFilterSet, + ProtocoloDocumentoForm, ProtocoloFilterSet, ProtocoloMateriaForm, + TramitacaoAdmEditForm, TramitacaoAdmForm, TramitacaoEmLoteAdmForm, + TramitacaoEmLoteAdmFilterSet) +from .models import (Anexado, AcompanhamentoDocumento, DocumentoAcessorioAdministrativo, DocumentoAdministrativo, StatusTramitacaoAdministrativo, - TipoDocumentoAdministrativo, TramitacaoAdministrativo, Anexado) + TipoDocumentoAdministrativo, TramitacaoAdministrativo) TipoDocumentoAdministrativoCrud = CrudAux.build( @@ -582,7 +578,7 @@ class ProtocoloDocumentoView(PermissionRequiredMixin, logger = logging.getLogger(__name__) template_name = "protocoloadm/protocolar_documento.html" - form_class = ProtocoloDocumentForm + form_class = ProtocoloDocumentoForm form_valid_message = _('Protocolo cadastrado com sucesso!') permission_required = ('protocoloadm.add_protocolo', ) @@ -647,7 +643,10 @@ class ProtocoloDocumentoView(PermissionRequiredMixin, protocolo.tipo_processo = '0' # TODO validar o significado protocolo.anulado = False - protocolo.numero = ( numero['numero__max'] + 1 ) if numero['numero__max'] else 1 + inicio_numeracao = AppConfig.objects.all()[0].inicio_numeracao_protocolo + protocolo.numero = ( + (numero['numero__max'] + 1 ) if numero['numero__max'] else inicio_numeracao + ) protocolo.ano = timezone.now().year protocolo.assunto_ementa = self.request.POST['assunto'] @@ -849,10 +848,10 @@ class ProtocoloMateriaView(PermissionRequiredMixin, CreateView): elif numeracao == 'U': numero = Protocolo.objects.all().aggregate(Max('numero')) - if numeracao is None: - numero['numero__max'] = 0 - - protocolo.numero = (numero['numero__max'] + 1) if numero['numero__max'] else 1 + inicio_numeracao = AppConfig.objects.all()[0].inicio_numeracao_protocolo + protocolo.numero = ( + (numero['numero__max'] + 1 ) if numero['numero__max'] else inicio_numeracao + ) protocolo.ano = timezone.now().year diff --git a/sapl/templates/base/layouts.yaml b/sapl/templates/base/layouts.yaml index b3b0daca0..79d84c4c1 100644 --- a/sapl/templates/base/layouts.yaml +++ b/sapl/templates/base/layouts.yaml @@ -18,7 +18,7 @@ AppConfig: - esfera_federacao {% trans 'Proposições e Protocolo' %}: - - sequencia_numeracao_proposicao sequencia_numeracao_protocolo + - sequencia_numeracao_proposicao sequencia_numeracao_protocolo inicio_numeracao_protocolo - protocolo_manual receber_recibo_proposicao - proposicao_incorporacao_obrigatoria escolher_numero_materia_proposicao