diff --git a/sapl/base/forms.py b/sapl/base/forms.py index 8085e7586..25ec22949 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -1185,7 +1185,8 @@ class ConfiguracoesAppForm(ModelForm): 'mostrar_brasao_painel', 'receber_recibo_proposicao', 'assinatura_ata', - 'estatisticas_acesso_normas'] + 'estatisticas_acesso_normas', + 'escolher_numero_materia_proposicao'] def __init__(self, *args, **kwargs): super(ConfiguracoesAppForm, self).__init__(*args, **kwargs) diff --git a/sapl/base/migrations/0030_appconfig_escolher_numero_materia_proposicao.py b/sapl/base/migrations/0030_appconfig_escolher_numero_materia_proposicao.py new file mode 100644 index 000000000..69bba70bc --- /dev/null +++ b/sapl/base/migrations/0030_appconfig_escolher_numero_materia_proposicao.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-02-19 11:14 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0029_remove_appconfig_relatorios_atos'), + ] + + operations = [ + migrations.AddField( + model_name='appconfig', + name='escolher_numero_materia_proposicao', + field=models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=False, verbose_name='Indicar número da matéria a ser gerada na proposição?'), + ), + ] diff --git a/sapl/base/migrations/0032_merge_20190219_0941.py b/sapl/base/migrations/0032_merge_20190219_0941.py new file mode 100644 index 000000000..0f30001e6 --- /dev/null +++ b/sapl/base/migrations/0032_merge_20190219_0941.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-02-19 12:41 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0031_auto_20190218_1109'), + ('base', '0030_appconfig_escolher_numero_materia_proposicao'), + ] + + operations = [ + ] diff --git a/sapl/base/models.py b/sapl/base/models.py index 2e42ce28e..87e497e84 100644 --- a/sapl/base/models.py +++ b/sapl/base/models.py @@ -164,6 +164,10 @@ class AppConfig(models.Model): verbose_name=_('Informar data e hora de protocolo?'), choices=YES_NO_CHOICES, default=False) + escolher_numero_materia_proposicao = models.BooleanField( + verbose_name=_('Indicar número da matéria a ser gerada na proposição?'), + choices=YES_NO_CHOICES, default=False) + class Meta: verbose_name = _('Configurações da Aplicação') verbose_name_plural = _('Configurações da Aplicação') diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index e67d71fb7..9161f9eb8 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -1368,6 +1368,9 @@ class ProposicaoForm(forms.ModelForm): widget=widgets.HiddenInput(), required=False) + numero_materia_futuro = forms.CharField( + label='Número (Opcional)', required=False) + class Meta: model = Proposicao fields = ['tipo', @@ -1381,7 +1384,8 @@ class ProposicaoForm(forms.ModelForm): 'numero_materia', 'ano_materia', 'tipo_texto', - 'hash_code'] + 'hash_code', + 'numero_materia_futuro'] widgets = { 'descricao': widgets.Textarea(attrs={'rows': 4}), @@ -1414,6 +1418,12 @@ class ProposicaoForm(forms.ModelForm): ] + if sapl.base.models.AppConfig.objects.last().escolher_numero_materia_proposicao: + fields.append(to_column(('numero_materia_futuro', 12)),) + else: + if 'numero_materia_futuro' in self._meta.fields: + self._meta.fields.remove('numero_materia_futuro') + if self.texto_articulado_proposicao: fields.append( to_column((InlineRadios('tipo_texto'), 5)),) @@ -1489,6 +1499,15 @@ class ProposicaoForm(forms.ModelForm): tm, am, nm = (cd.get('tipo_materia', ''), cd.get('ano_materia', ''), cd.get('numero_materia', '')) + + if cd['numero_materia_futuro'] and \ + 'tipo' in cd and \ + MateriaLegislativa.objects.filter(tipo=cd['tipo'].tipo_conteudo_related, + ano=timezone.now().year, + numero=cd['numero_materia_futuro']): + raise ValidationError(_("A matéria {} {}/{} já existe.".format(cd['tipo'].tipo_conteudo_related.descricao, + cd['numero_materia_futuro'], + timezone.now().year))) if tm and am and nm: try: @@ -1654,13 +1673,16 @@ class ConfirmarProposicaoForm(ProposicaoForm): 'descricao', 'observacao', 'gerar_protocolo', - 'numero_de_paginas' + 'numero_de_paginas', + 'numero_materia_futuro' ] widgets = { 'descricao': widgets.Textarea( attrs={'readonly': 'readonly', 'rows': 4}), 'data_envio': widgets.DateTimeInput( attrs={'readonly': 'readonly'}), + 'numero_materia_futuro': widgets.TextInput( + attrs={'readonly': 'readonly', 'rows': 1}), } @@ -1705,9 +1727,10 @@ class ConfirmarProposicaoForm(ProposicaoForm): _('Dados Básicos'), to_row( [ - ('tipo_readonly', 4), + ('tipo_readonly', 3), ('data_envio', 3), - ('autor_readonly', 5), + ('numero_materia_futuro',3), + ('autor_readonly', 3), ('descricao', 12), ('observacao', 12) ] @@ -1767,6 +1790,8 @@ class ConfirmarProposicaoForm(ProposicaoForm): self.fields['tipo_readonly'].initial = self.instance.tipo.descricao self.fields['autor_readonly'].initial = str(self.instance.autor) + if self.instance.numero_materia_futuro: + self.fields['numero_materia_futuro'].initial = self.instance.numero_materia_futuro if self.instance.materia_de_vinculo: self.fields[ @@ -1896,8 +1921,14 @@ class ConfirmarProposicaoForm(ProposicaoForm): if numeracao is None: numero['numero__max'] = 0 - max_numero = numero['numero__max'] + \ - 1 if numero['numero__max'] else 1 + + 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 + # dados básicos materia = MateriaLegislativa() diff --git a/sapl/materia/migrations/0041_proposicao_numero_materia_futuro.py b/sapl/materia/migrations/0041_proposicao_numero_materia_futuro.py new file mode 100644 index 000000000..2fb21a4fb --- /dev/null +++ b/sapl/materia/migrations/0041_proposicao_numero_materia_futuro.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-02-15 11:10 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0040_auto_20190211_1602'), + ] + + operations = [ + migrations.AddField( + model_name='proposicao', + name='numero_materia_futuro', + field=models.PositiveIntegerField(blank=True, null=True, verbose_name='Número Matéria'), + ), + ] diff --git a/sapl/materia/models.py b/sapl/materia/models.py index d2ecb70a3..e4ae436b9 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -687,6 +687,9 @@ class Proposicao(models.Model): numero_proposicao = models.PositiveIntegerField( blank=True, null=True, verbose_name=_('Número')) + numero_materia_futuro = models.PositiveIntegerField( + blank=True, null=True, verbose_name=_('Número Matéria')) + hash_code = models.CharField(verbose_name=_('Código do Documento'), max_length=200, blank=True) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 37d177156..3c7b1df6f 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -812,8 +812,12 @@ class ProposicaoCrud(Crud): self.logger.debug("user=" + username + ". Tentando obter número do objeto MateriaLegislativa com " "atributos tipo={} e ano={}." .format(p.tipo.tipo_conteudo_related, p.ano)) - numero = MateriaLegislativa.objects.filter(tipo=p.tipo.tipo_conteudo_related, - ano=p.ano).last().numero + 1 + + if p.numero_materia_futuro: + numero = p.numero_materia_futuro + else: + numero = MateriaLegislativa.objects.filter(tipo=p.tipo.tipo_conteudo_related, + ano=p.ano).last().numero + 1 messages.success(request, _( '%s : nº %s de %s
Atenção! Este número é apenas um provável ' 'número que pode não corresponder com a realidade' diff --git a/sapl/templates/base/layouts.yaml b/sapl/templates/base/layouts.yaml index d83239e63..c98810b10 100644 --- a/sapl/templates/base/layouts.yaml +++ b/sapl/templates/base/layouts.yaml @@ -18,7 +18,8 @@ AppConfig: - esfera_federacao {% trans 'Proposições e Protocolo' %}: - - sequencia_numeracao proposicao_incorporacao_obrigatoria receber_recibo_proposicao protocolo_manual + - sequencia_numeracao proposicao_incorporacao_obrigatoria receber_recibo_proposicao + - escolher_numero_materia_proposicao protocolo_manual {% trans 'Textos Articulados' %}: - texto_articulado_proposicao texto_articulado_materia texto_articulado_norma