Repository: interlegis/sapl

Issue:
Cadastro de Legislatura - inconsistência
A numeração das legislaturas devem seguir na ordem crescente das datas relativas aos períodos. Por exemplo: Se o período 2013-2016 corresponder a legislatura de número 10 o próximo período deverá ser formado por um período superior a 2016 e a legislatura ter o número 11. A função não está verificando a ordem crescente e permite o cadastro de qualquer número, no caso do exemplo, inferior a 10.
Cadastro de Legislatura - inconsistência
A numeração das legislaturas devem seguir na ordem crescente das datas relativas aos períodos. Por exemplo: Se o período 2013-2016 corresponder a legislatura de número 10 o próximo período deverá ser formado por um período superior a 2016 e a legislatura ter o número 11. A função não está verificando a ordem crescente e permite o cadastro de qualquer número, no caso do exemplo, inferior a 10.


Discussion:
@morale A correção seria a verificação do número da legislatura?
Pois olhando o código aqui percebi que o sistema está configurado para numerar a criação de legislaturas pegando o número da última e adicionando 1, posso adicionar um código não permitindo colocar números menores do que ao da última legistura se for o caso, se não for isso pode elaborar um pouco melhor do que se trata a correção?
1. em relação aos períodos - não pode haver interseção entre os períodos;
2. em relação a numeração da legislatura - tem que ser crescente considerando os períodos. Ou seja, não pode haver uma legislatura com numeração inferior para um período superior.
exemplos:
legislatura - período
10 -             2013-2016
09 -             2009-2012
03 -             2005-2008 ..........incorreto se a inclusão for posterior a de nr 5
05 -             2001-2004
04 -             2003-2006 .........incorreto se a inclusão for posterior a de nr 5

3. Numa inclusão/atualização deve sempre considerar as legislaturas / períodos já existentes para fins de validação.
@morale por que a issue foi fechada?
@morale A correção seria a verificação do número da legislatura?
Pois olhando o código aqui percebi que o sistema está configurado para numerar a criação de legislaturas pegando o número da última e adicionando 1, posso adicionar um código não permitindo colocar números menores do que ao da última legistura se for o caso, se não for isso pode elaborar um pouco melhor do que se trata a correção?
1. em relação aos períodos - não pode haver interseção entre os períodos;
2. em relação a numeração da legislatura - tem que ser crescente considerando os períodos. Ou seja, não pode haver uma legislatura com numeração inferior para um período superior.
exemplos:
legislatura - período
10 -             2013-2016
09 -             2009-2012
03 -             2005-2008 ..........incorreto se a inclusão for posterior a de nr 5
05 -             2001-2004
04 -             2003-2006 .........incorreto se a inclusão for posterior a de nr 5

3. Numa inclusão/atualização deve sempre considerar as legislaturas / períodos já existentes para fins de validação.
@morale por que a issue foi fechada?

Resolving patch:
diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py
--- a/sapl/parlamentares/forms.py
+++ b/sapl/parlamentares/forms.py
@@ -44,25 +44,25 @@ def validar_datas_legislatura(eleicao, inicio, fim, pk=None):
     # Verifica se data de eleição < inicio < fim
     if inicio >= fim or eleicao >= inicio:
         msg_error = _('A data início deve ser menor que a ' +
-                      'data fim, e a data eleição deve ser ' +
+                      'data fim e a data eleição deve ser ' +
                       'menor que a data início')
-        return [False, msg_error]
+        return (False, msg_error)
 
     # Verifica se há alguma data cadastrada no intervalo de tempo desejado
-    if Legislatura.objects.filter(
-            data_inicio__range=[inicio, fim]).exclude(pk=pk).exists()\
-        or Legislatura.objects.filter(
-            data_fim__range=[inicio, fim]).exclude(pk=pk).exists():
+    intersecao_legislatura = Legislatura.objects.filter(
+        data_inicio__lte=fim, data_fim__gte=inicio
+    ).exclude(pk=pk).exists()
+    if intersecao_legislatura:
         msg_error = _('Já existe uma legislatura neste intervalo de datas')
-        return [False, msg_error]
+        return (False, msg_error)
 
     # Verifica se há alguma outra data de eleição cadastrada
     if Legislatura.objects.filter(
             data_eleicao=eleicao).exclude(pk=pk).exists():
         msg_error = _('Esta data de eleição já foi cadastrada')
-        return [False, msg_error]
+        return (False, msg_error)
 
-    return [True, '']
+    return (True, None)
 
 
 class MandatoForm(ModelForm):
@@ -120,12 +120,28 @@ def clean(self):
         if not self.is_valid():
             return self.cleaned_data
 
+
+        numero = data['numero']
         data_inicio = data['data_inicio']
         data_fim = data['data_fim']
         data_eleicao = data['data_eleicao']
 
         pk = self.instance.pk
 
+
+        ultima_legislatura = Legislatura.objects.filter(data_inicio__lte=data_inicio
+                                                        ).order_by('-data_inicio').first()
+        proxima_legislatura = Legislatura.objects.filter(data_fim__gt=data_fim
+                                                         ).order_by('data_fim').first()
+
+        if ultima_legislatura and ultima_legislatura.numero >= numero:
+            raise ValidationError(_("Número deve ser maior que o da legislatura anterior"))
+        elif proxima_legislatura and proxima_legislatura.numero <= numero:
+            msg_erro = "O Número deve ser menor que {}, pois existe uma " \
+            "legislatura afrente cronologicamente desta que está sendo criada!"
+            msg_erro = msg_erro.format(proxima_legislatura.numero)
+            raise ValidationError(_(msg_erro))
+
         valida_datas = validar_datas_legislatura(data_eleicao,
                                                  data_inicio,
                                                  data_fim,


Test patch:
diff --git a/sapl/parlamentares/tests/test_parlamentares.py b/sapl/parlamentares/tests/test_parlamentares.py
--- a/sapl/parlamentares/tests/test_parlamentares.py
+++ b/sapl/parlamentares/tests/test_parlamentares.py
@@ -233,7 +233,7 @@ def test_legislatura_form_invalido():
 
     assert len(errors) == 4
 
-
+@pytest.mark.django_db(transaction=False)
 def test_legislatura_form_datas_invalidas():
 
     legislatura_form = LegislaturaForm(data={'numero': '1',
@@ -245,7 +245,7 @@ def test_legislatura_form_datas_invalidas():
     assert not legislatura_form.is_valid()
 
     expected = \
-        _("A data início deve ser menor que a data fim, "
+        _("A data início deve ser menor que a data fim "
           "e a data eleição deve ser menor que a data início")
     assert legislatura_form.errors['__all__'] == [expected]