Repository: interlegis/sapl

Issue:
Cadastro de Sessão Legislativa - numeração e período
Problema análogo ao descrito na issue #2112 está ocorrendo no cadastro da Sessão Legislativa em relação aos períodos e em relação à numeração da Sessão. No caso da Sessão Legislativa deve ser verificada também a exigência do período estar dentro do período da legislatura indicada.


Discussion:
@morale só para fins de confirmação a ideia é fazer a verificação da data de abertura da sessão se a mesma está de acordo com a legislatura e a sessão legislativa, correto?
@sconetto verificação do período e tb da numeração da Sessão Legislativa.
@sconetto, sim em relação ao período da Sessão Legislativa e tb da
Numeração.

2018-08-09 14:33 GMT-03:00 João Pedro Sconetto <notifications@github.com>:

> @morale <https://github.com/morale> só para fins de confirmação a ideia é
> fazer a verificação da data de abertura da sessão se a mesma está de acordo
> com a legislatura e a sessão legislativa, correto?
>
> —
> You are receiving this because you were mentioned.
> Reply to this email directly, view it on GitHub
> <https://github.com/interlegis/sapl/issues/2123#issuecomment-411837074>,
> or mute the thread
> <https://github.com/notifications/unsubscribe-auth/ACAkCVBbTwMXjmBMviXzyueRt4bXI9KIks5uPHKFgaJpZM4V0t2D>
> .
>



-- 
Att,

Claudio Morale
celular: 9965-6139


Resolving patch:
diff --git a/sapl/audiencia/forms.py b/sapl/audiencia/forms.py
--- a/sapl/audiencia/forms.py
+++ b/sapl/audiencia/forms.py
@@ -98,7 +98,7 @@ def clean(self):
         if self.cleaned_data['hora_inicio'] and self.cleaned_data['hora_fim']:
             if (self.cleaned_data['hora_fim'] <
                 self.cleaned_data['hora_inicio']):
-                    msg = _('A hora de fim não pode ser anterior a hora de ínicio')
+                    msg = _('A hora de fim não pode ser anterior a hora de início')
                     raise ValidationError(msg)
 
         return cleaned_data
diff --git a/sapl/base/forms.py b/sapl/base/forms.py
--- a/sapl/base/forms.py
+++ b/sapl/base/forms.py
@@ -10,6 +10,7 @@
 from django.contrib.auth.models import Group, User
 from django.core.exceptions import ValidationError
 from django.db import models, transaction
+from django.db.models import Q
 from django.forms import Form, ModelForm
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import string_concat
@@ -170,6 +171,52 @@ def clean(self):
 
         data_inicio = cleaned_data['data_inicio']
         data_fim = cleaned_data['data_fim']
+        legislatura = cleaned_data['legislatura']
+        numero = cleaned_data['numero']
+        data_inicio_leg = legislatura.data_inicio
+        data_fim_leg = legislatura.data_fim
+        pk = self.initial['id']
+
+        # Querys para verificar se existem Sessões Legislativas no período selecionado no form
+        # Caso onde a data_inicio e data_fim são iguais a de alguma sessão já criada
+        primeiro_caso = Q(data_inicio=data_inicio, data_fim=data_fim)
+        # Caso onde a data_inicio está entre o início e o fim de uma Sessão já existente
+        segundo_caso = Q(data_inicio__lt=data_inicio, data_fim__range=(data_inicio, data_fim))
+        # Caso onde a data_fim está entre o início e o fim de uma Sessão já existente
+        terceiro_caso = Q(data_inicio__range=(data_inicio, data_fim), data_fim__gt=data_fim)
+        sessoes_existentes = SessaoLegislativa.objects.filter(primeiro_caso|segundo_caso|terceiro_caso).\
+            exclude(pk=pk)
+
+        if sessoes_existentes:
+            raise ValidationError('Já existe registrado uma Sessão Legislativa que coincide com a data '
+                                  'inserida, favor verificar as Sessões existentes antes de criar uma '
+                                  'nova Sessão Legislativa')
+
+        sessoes_legislativas = SessaoLegislativa.objects.filter(legislatura=legislatura).exclude(pk=pk)
+
+        if sessoes_legislativas:
+            numeracoes = [n.numero for n in sessoes_legislativas]
+            numeracoes = sorted(numeracoes)
+            ult = max(numeracoes)
+
+        else:
+            ult = SessaoLegislativa.objects.latest('data_fim')
+            ult = ult.numero
+
+        if numero <= ult:
+            raise ValidationError('O número da Sessão Legislativa não pode ser menor ou igual '
+                                  'que o de Sessões Legislativas passadas')
+
+
+        if data_inicio < data_inicio_leg or \
+            data_inicio > data_fim_leg:
+            raise ValidationError('A data de início da Sessão Legislativa deve estar compreendida '
+                                  'entre a data início e fim da Legislatura selecionada')
+
+        if data_fim > data_fim_leg or \
+            data_fim < data_inicio_leg:
+            raise ValidationError('A data de fim da Sessão Legislativa deve estar compreendida '
+                                  'entre a data início e fim da Legislatura selecionada')
 
         if data_inicio > data_fim:
             raise ValidationError('Data início não pode ser superior à data fim')
@@ -182,6 +229,23 @@ def clean(self):
                 raise ValidationError('Data início de intervalo não pode ser '
                                       'superior à data fim de intervalo')
 
+        if data_inicio_intervalo:
+            if data_inicio_intervalo < data_inicio or \
+                    data_inicio_intervalo < data_inicio_leg or \
+                    data_inicio_intervalo > data_fim or \
+                    data_inicio_intervalo > data_inicio_leg:
+                raise ValidationError('A data de início do intervalo deve estar compreendida entre '
+                                      'as datas de início e fim tanto da Legislatura quanto da '
+                                      'própria Sessão Legislativa')
+
+        if data_fim_intervalo:
+            if data_fim_intervalo > data_fim or \
+                    data_fim_intervalo > data_fim_leg or \
+                    data_fim_intervalo < data_inicio or \
+                    data_fim_intervalo < data_inicio_leg:
+                raise ValidationError('A data de fim do intervalo deve estar compreendida entre '
+                                      'as datas de início e fim tanto da Legislatura quanto da '
+                                      'própria Sessão Legislativa')
         return cleaned_data
 
 
diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py
--- a/sapl/sessao/forms.py
+++ b/sapl/sessao/forms.py
@@ -75,6 +75,8 @@ def clean(self):
         sl = self.cleaned_data['sessao_legislativa']
         leg = self.cleaned_data['legislatura']
         tipo = self.cleaned_data['tipo']
+        abertura = self.cleaned_data['data_inicio']
+        encerramento = self.cleaned_data['data_fim']
 
         error = ValidationError(
             "Número de Sessão Plenária já existente "
@@ -96,6 +98,91 @@ def clean(self):
             else:  # create
                 raise error
 
+
+        # Condições da verificação
+        abertura_entre_leg = leg.data_inicio <= abertura <= leg.data_fim
+        abertura_entre_sl = sl.data_inicio <= abertura <= sl.data_fim
+        if encerramento is not None:
+            encerramento_entre_leg = leg.data_inicio < encerramento < leg.data_fim
+            encerramento_entre_sl = sl.data_inicio < encerramento < sl.data_fim
+
+        # Verificação das datas de abertura e encerramento da Sessão
+        # Verificações com a data de encerramento preenchidas
+        if encerramento is not None:
+            # Verifica se a data de encerramento é anterior a data de abertura
+            if encerramento < abertura:
+                raise ValidationError("A data de encerramento não pode ser "
+                                      "anterior a data de abertura.")
+            # Verifica se a data de abertura está entre a data de início e fim da legislatura
+            if abertura_entre_leg and encerramento_entre_leg:
+                if abertura_entre_sl and encerramento_entre_sl:
+                    pass
+                elif abertura_entre_sl and not encerramento_entre_sl:
+                    raise ValidationError("A data de encerramento deve estar entre "
+                                          "as datas de início e fim da Sessão Legislativa.")
+                elif not abertura_entre_sl and encerramento_entre_sl:
+                    raise ValidationError("A data de abertura deve estar entre as "
+                                          "datas de início e fim da Sessão Legislativa.")
+                elif not abertura_entre_sl and not encerramento_entre_sl:
+                    raise ValidationError("A data de abertura e de encerramento devem estar "
+                                          "entre as datas de início e fim da Sessão Legislativa.")
+            elif abertura_entre_leg and not encerramento_entre_leg:
+                if abertura_entre_sl and encerramento_entre_sl:
+                    raise ValidationError("A data de encerramento deve estar entre "
+                                          "as datas de início e fim da Legislatura.")
+                elif abertura_entre_sl and not encerramento_entre_sl:
+                    raise ValidationError("A data de encerramento deve estar entre "
+                                          "as datas de início e fim tanto da "
+                                          "Legislatura quanto da Sessão Legislativa.")
+                elif not abertura_entre_sl and encerramento_entre_sl:
+                    raise ValidationError("As datas de abertura e encerramento devem "
+                                          "estar entre as "
+                                          "datas de início e fim tanto Legislatura "
+                                          "quanto da Sessão Legislativa.")
+                elif not abertura_entre_sl and not encerramento_entre_sl:
+                    raise ValidationError("As datas de abertura e encerramento devem "
+                                          "estar entre as "
+                                          "datas de início e fim tanto Legislatura "
+                                          "quanto da Sessão Legislativa.")
+            elif not abertura_entre_leg and not encerramento_entre_leg:
+                if abertura_entre_sl and encerramento_entre_sl:
+                    raise ValidationError("As datas de abertura e encerramento devem "
+                                          "estar entre as "
+                                          "datas de início e fim da Legislatura.")
+                elif abertura_entre_sl and not encerramento_entre_sl:
+                    raise ValidationError("As datas de abertura e encerramento devem "
+                                          "estar entre as "
+                                          "datas de início e fim tanto Legislatura "
+                                          "quanto da Sessão Legislativa.")
+                elif not abertura_entre_sl and encerramento_entre_sl:
+                    raise ValidationError("As datas de abertura e encerramento devem "
+                                          "estar entre as "
+                                          "datas de início e fim tanto Legislatura "
+                                          "quanto da Sessão Legislativa.")
+                elif not abertura_entre_sl and not encerramento_entre_sl:
+                    raise ValidationError("As datas de abertura e encerramento devem "
+                                          "estar entre as "
+                                          "datas de início e fim tanto Legislatura "
+                                          "quanto da Sessão Legislativa.")
+
+
+        # Verificações com a data de encerramento vazia
+        else:
+            if abertura_entre_leg:
+                if abertura_entre_sl:
+                    pass
+                else:
+                    raise ValidationError("A data de abertura da sessão deve estar "
+                                          "entre a data de início e fim da Sessão Legislativa.")
+            else:
+                if abertura_entre_sl:
+                    raise ValidationError("A data de abertura da sessão deve estar "
+                                          "entre a data de início e fim da Legislatura.")
+                else:
+                    raise ValidationError("A data de abertura da sessão deve estar "
+                                          "entre a data de início e fim tanto da "
+                                          "Legislatura quanto da Sessão Legislativa.")
+
         return self.cleaned_data
 
 


Test patch:
diff --git a/sapl/sessao/tests/test_sessao.py b/sapl/sessao/tests/test_sessao.py
--- a/sapl/sessao/tests/test_sessao.py
+++ b/sapl/sessao/tests/test_sessao.py
@@ -37,7 +37,7 @@ def test_sessao_plenaria_form_valido():
                                           'numero': '1',
                                           'tipo': str(tipo.pk),
                                           'sessao_legislativa': str(sessao.pk),
-                                          'data_inicio': '10/11/2017',
+                                          'data_inicio': str(sessao.data_inicio),
                                           'hora_inicio': '10:10',
                                           'painel_aberto': False
                                           })
diff --git a/sapl/sessao/tests/test_sessao_view.py b/sapl/sessao/tests/test_sessao_view.py
--- a/sapl/sessao/tests/test_sessao_view.py
+++ b/sapl/sessao/tests/test_sessao_view.py
@@ -18,7 +18,7 @@ def test_incluir_sessao_plenaria_submit(admin_client):
                                   'numero': '1',
                                   'tipo': str(tipo.pk),
                                   'sessao_legislativa': str(sessao.pk),
-                                  'data_inicio': '10/11/2017',
+                                  'data_inicio': str(sessao.data_inicio),
                                   'hora_inicio': '10:10'
                                   }, follow=True)