Repository: interlegis/sapl

Issue:
Separar cadastro de Parlamentar de vinculação a Legislatura
Atualmente, o cadastro de parlamentares é feito mediante a seleção da legislatura e posterior clique no botão Adicionar Parlamentar. Esse tipo de operação induz ao erro pois o operador acaba por cadastrar o parlamentar mais de uma vez, uma para cada legislatura.

## Comportamento Esperado
Evitar a duplicidade de parlamentares cadastrados no SAPL. O cadastro deve ser único com vários mandatos.

## Comportamento Atual
O sistema permite que um mesmo parlamentar seja cadastrado múltiplas vezes no sistema, gerando inconsistência de dados.

## Possível Solução
A função do botão de 'Adicionar Parlamentar' é vincular um Parlamentar previamente cadastrado a uma Legislatura. A ideia é que a tela de cadastro do parlamentar seja movida para Tabelas Auxiliares (sendo chamada de Cadastrar Parlamentar) e uma nova tela (com form) que vincule parlamentares cadastrados a suas legislaturas através da criação de um mandato no botão Adicionar Parlamentar.

## Passos para Reproduzir (para bugs)
1. 
2.
3.
4.

## Contexto
<!--- Como esse problema o afeta? O que você está tentando realizar? -->
<!--- Fornecer o contexto nos ajuda a encontrar uma solução que seja mais útil no mundo real -->

## Imagens do Ocorrido
<!--- Representação visual em vídeo ou imagem do ocorrido -->
<!--- Se está descrevendo um bug poste imagens ou vídeos na repordução do bug citado, caso se aplique -->

## Seu Ambiente
<!--- Inclua detalhes relevantes sobre o ambiente em que você presenciou/experienciou o bug. -->
* Versão usada (_Release_):
* Nome e versão do navegador:
* Nome e versão do Sistema Operacional (desktop ou mobile):
* Link para o seu projeto (Caso de fork deste projeto):



Discussion:
Maravilha!!! 
Isso nos remete a uma separação:
- da tela administrativa do usuário que não precisa haver seleção legislatura para dar manutenção
- da tela anônima que pode inclusive concentrar mesa diretora e parlamento numa interface só. vide: https://www.jatai.go.leg.br/parlamentar

Resolving patch:
diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py
--- a/sapl/parlamentares/forms.py
+++ b/sapl/parlamentares/forms.py
@@ -236,6 +236,18 @@ def __init__(self, *args, **kwargs):
 
 class ParlamentarCreateForm(ParlamentarForm):
 
+    legislatura = forms.ModelChoiceField(
+        label=_('Legislatura'),
+        required=True,
+        queryset=Legislatura.objects.all().order_by('-data_inicio'),
+        empty_label='----------',
+    )
+
+    data_expedicao_diploma = forms.DateField(
+        label=_('Expedição do Diploma'),
+        required=True,
+    )
+
     class Meta(ParlamentarForm.Meta):
         widgets = {
             'fotografia': forms.ClearableFileInput(),
@@ -246,6 +258,13 @@ class Meta(ParlamentarForm.Meta):
     @transaction.atomic
     def save(self, commit=True):
         parlamentar = super(ParlamentarCreateForm, self).save(commit)
+        legislatura = self.cleaned_data['legislatura']
+        Mandato.objects.create(
+            parlamentar=parlamentar,
+            legislatura=legislatura,
+            data_inicio_mandato=legislatura.data_inicio,
+            data_fim_mandato=legislatura.data_fim,
+            data_expedicao_diploma=self.cleaned_data['data_expedicao_diploma'])
         content_type = ContentType.objects.get_for_model(Parlamentar)
         object_id = parlamentar.pk
         tipo = TipoAutor.objects.get(content_type=content_type)
diff --git a/sapl/parlamentares/urls.py b/sapl/parlamentares/urls.py
--- a/sapl/parlamentares/urls.py
+++ b/sapl/parlamentares/urls.py
@@ -18,7 +18,6 @@
                                       insere_parlamentar_composicao,
                                       parlamentares_frente_selected,
                                       remove_parlamentar_composicao,
-                                      lista_parlamentares,
                                       parlamentares_filiados,
                                       PesquisarParlamentarView)
 
@@ -36,11 +35,9 @@
         VotanteView.get_urls()
     )),
 
-    url(r'^parlamentar/lista$', lista_parlamentares, name='lista_parlamentares'),
-  
     url(r'^parlamentar/pesquisar-parlamentar/',
         PesquisarParlamentarView.as_view(), name='pesquisar_parlamentar'),
-  
+
     url(r'^parlamentar/(?P<pk>\d+)/materias$',
         ParlamentarMateriasView.as_view(), name='parlamentar_materias'),
 
diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py
--- a/sapl/parlamentares/views.py
+++ b/sapl/parlamentares/views.py
@@ -674,12 +674,6 @@ def get_context_data(self, **kwargs):
             return context
 
 
-def lista_parlamentares(request):
-    template_name = "parlamentares/lista_parlamentares.html"
-    parlamentares = Parlamentar.objects.select_related().all()
-    return render(request, template_name, {"parlamentares": parlamentares})
-
-
 class ParlamentarMateriasView(FormView):
     template_name = "parlamentares/materias.html"
     success_url = reverse_lazy('sapl.parlamentares:parlamentar_materia')


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
@@ -20,14 +20,21 @@ def test_cadastro_parlamentar(admin_client):
     response = admin_client.post(url, {'nome_completo': 'Teresa Barbosa',
                                        'nome_parlamentar': 'Terezinha',
                                        'sexo': 'F',
-                                       'ativo': 'True'
-                                       },
+                                       'ativo': 'True',
+                                       'legislatura': legislatura.id,
+                                       'data_expedicao_diploma': '2001-01-01'},
                                  follow=True)
 
     [parlamentar] = Parlamentar.objects.all()
     assert parlamentar.nome_parlamentar == 'Terezinha'
     assert parlamentar.sexo == 'F'
     assert parlamentar.ativo is True
+    # o primeiro mandato é criado
+    [mandato] = Mandato.objects.all()
+    assert mandato.parlamentar == parlamentar
+    assert str(mandato.data_expedicao_diploma) == '2001-01-01'
+    assert mandato.legislatura == legislatura
+    assert mandato.data_fim_mandato == legislatura.data_fim
 
 
 @pytest.mark.django_db(transaction=False)
@@ -35,7 +42,9 @@ def test_incluir_parlamentar_errors(admin_client):
     url = reverse('sapl.parlamentares:parlamentar_create')
     response = admin_client.post(url)
     erros_esperados = {campo: ['Este campo é obrigatório.']
-                       for campo in ['nome_parlamentar',
+                       for campo in ['legislatura',
+                                     'data_expedicao_diploma',
+                                     'nome_parlamentar',
                                      'nome_completo',
                                      'sexo',
                                      ]}