Repository: interlegis/sapl

Issue:
Votação Nominal: Salvar um registro prévio com os votos dos Parlamentares
A votação nominal permite duas formas de votar:

1. Votação interativa pelo Parlamentar
2. Marcação do voto do Parlamentar feita manualmente pelo operador

Ao votar, o parlamentar gera um registro em **VotoParlamentar**. Então, quando o operador clica no botão de **Atualizar**, os votos são atualizados na tela de Votação Nominal. Entretanto, os que foram marcados manualmente pelo operador não ficam registrados e voltam ao estado de **Não Votado**.

Minha sugestão é que seja feita uma chamada **ajax** que, ao selecionar o voto de algum Parlamentar, seja criado um registro em **VotoParlamentar**. Sendo assim, ao atualizar a tela as informações inseridas previamente não serão perdidas.

OBS: Lembrar que, caso o voto seja modificado para "Não Votou", deve-se apagar o registro do voto do parlamentar.


Discussion:
Como funcionalidade complementar, a criação desse registro no momento do voto também possibilitaria que o painel sinalizasse de alguma forma que o parlamentar já votou, por exemplo alterando a cor do seu nome. 

Resolving patch:
diff --git a/sapl/painel/views.py b/sapl/painel/views.py
--- a/sapl/painel/views.py
+++ b/sapl/painel/views.py
@@ -531,6 +531,13 @@ def get_votos(response, materia):
                 votos_parlamentares = VotoParlamentar.objects.filter(
                     expediente_id=materia.id).order_by(
                         'parlamentar__nome_parlamentar')
+            
+            if PainelConfig.attr('mostrar_votos_antecedencia'):
+                response['numero_votos_sim'] = votos_parlamentares.filter(voto="Sim").count()
+                response['numero_votos_nao'] = votos_parlamentares.filter(voto="Não").count()
+                response['numero_abstencoes'] = votos_parlamentares.filter(voto="Abstenção").count()
+                response['total_votos'] = response['numero_votos_sim'] + response['numero_votos_nao'] + \
+                                          response['numero_abstencoes']
 
             for i, p in enumerate(response['presentes']):
                 try:
diff --git a/sapl/sessao/urls.py b/sapl/sessao/urls.py
--- a/sapl/sessao/urls.py
+++ b/sapl/sessao/urls.py
@@ -35,7 +35,8 @@
                                VotacaoEmBlocoOrdemDia, VotacaoEmBlocoExpediente,
                                VotacaoEmBlocoSimbolicaView, VotacaoEmBlocoNominalView,
                                resumo_ordenacao,
-                               recuperar_nome_tipo_sessao)
+                               recuperar_nome_tipo_sessao,
+                               voto_nominal_parlamentar)
 
 from .apps import AppConfig
 
@@ -193,4 +194,9 @@
     url(r'^sessao/mudar-ordem-materia-sessao/',
         mudar_ordem_materia_sessao,
         name='mudar_ordem_materia_sessao'),
+
+    url(r'^sessao/votacao-nominal-parlamentar/',
+        voto_nominal_parlamentar,
+        name='votacao_nominal_parlamentar'
+        ),
 ]
diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py
--- a/sapl/sessao/views.py
+++ b/sapl/sessao/views.py
@@ -4339,3 +4339,61 @@ def get_initial(self):
 
     class DeleteView(MasterDetailCrud.DeleteView):
         pass
+
+
+def voto_nominal_parlamentar(request):
+    parlamentar_id = request.GET.get('parlamentar_id')
+    parlamentar_voto = request.GET.get('parlamentar_voto')
+    id_ordem_expediente = request.GET.get('id_ordem_expediente')
+    is_ordemdia = request.GET.get('is_ordemdia') == 'true'
+
+    if is_ordemdia:
+        # Apaga o voto (opção selecionada: Não Votou)
+        if parlamentar_voto == "Não ":
+            VotoParlamentar.objects.filter(ordem_id=id_ordem_expediente, parlamentar_id=parlamentar_id).delete()
+        else:
+            # Salva o voto
+            parlamentar_voto = "Abstenção" if parlamentar_voto == 'Abst'  else parlamentar_voto[:3]
+            try:
+                voto = VotoParlamentar.objects.get(
+                    parlamentar_id=parlamentar_id,
+                    ordem_id=id_ordem_expediente)
+            except ObjectDoesNotExist:
+                voto = VotoParlamentar.objects.create(
+                    parlamentar_id=parlamentar_id,
+                    voto=parlamentar_voto,
+                    user=request.user,
+                    ip=get_client_ip(request),
+                    ordem_id=id_ordem_expediente)
+            else:
+                voto.voto = parlamentar_voto
+                voto.ip = get_client_ip(request)
+                voto.user = request.user
+                voto.save()
+
+    # expediente
+    else:
+        # Apaga o voto (opção selecionada: Não Votou)
+        if parlamentar_voto == "Não ":
+            VotoParlamentar.objects.filter(expediente_id=id_ordem_expediente, parlamentar_id=parlamentar_id).delete()
+        # Salva o voto
+        else:
+            parlamentar_voto = parlamentar_voto[:3]
+            try:
+                voto = VotoParlamentar.objects.get(
+                    parlamentar_id=parlamentar_id,
+                    expediente_id=id_ordem_expediente)
+            except ObjectDoesNotExist:
+                voto = VotoParlamentar.objects.create(
+                    parlamentar_id=parlamentar_id,
+                    voto=parlamentar_voto,
+                    user=request.user,
+                    ip=get_client_ip(request),
+                    expediente_id=id_ordem_expediente)
+            else:
+                voto.voto = parlamentar_voto
+                voto.ip = get_client_ip(request)
+                voto.user = request.user
+                voto.save()
+
+    return JsonResponse({})
\ No newline at end of file


Test patch: