Repository: interlegis/sapl

Issue:
Votações com parlamentares inativos votantes
<!--- Forneça um resumo geral da _issue_ no título acima -->

## Comportamento Esperado
<!--- Se você está descrevendo um _bug_, conte-nos o que deveria acontecer. -->
<!--- Se você está sugerindo uma mudança/melhoria, conte-nos como deve funcionar. -->
A votação deve ser realizada pelos parlamentares ativos.

## Comportamento Atual
<!--- Se está descrevendo um bug, conte-nos o que acontece em vez do comportamento esperado. -->
<!--- Se está sugerindo uma mudança/melhoria, explique a diferença com o comportamento atual. -->
Em votação simbólica, secreta e simbólica em bloco de matéria do expediente e de matéria da ordem do dia, os parlamentares inativos presentes na sessão e os presentes na ordem do dia são considerados votantes para a matéria do expediente e matéria da ordem do dia, respectivamente.






Discussion:

Resolving patch:
diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py
--- a/sapl/sessao/forms.py
+++ b/sapl/sessao/forms.py
@@ -464,6 +464,9 @@ class VotacaoForm(forms.Form):
     abstencoes = forms.IntegerField(label='Abstenções')
     total_presentes = forms.IntegerField(
         required=False, widget=forms.HiddenInput())
+    total_votantes = forms.IntegerField(
+        required=False, widget=forms.HiddenInput()
+    )
     voto_presidente = forms.IntegerField(
         label='A totalização inclui o voto do Presidente?')
     total_votos = forms.IntegerField(required=False, label='total')
@@ -479,15 +482,16 @@ def clean(self):
         votos_nao = cleaned_data['votos_nao']
         abstencoes = cleaned_data['abstencoes']
         qtde_presentes = cleaned_data['total_presentes']
+        qtde_votantes = cleaned_data['total_votantes']
         qtde_votos = votos_sim + votos_nao + abstencoes
         voto_presidente = cleaned_data['voto_presidente']
 
-        if qtde_presentes and not voto_presidente:
-            qtde_presentes -= 1
+        if qtde_votantes and not voto_presidente:
+            qtde_votantes -= 1
 
-        if qtde_presentes and qtde_votos != qtde_presentes:
+        if qtde_votantes and qtde_votos != qtde_votantes:
             raise ValidationError(
-                'O total de votos não corresponde com a quantidade de presentes!')
+                'O total de votos não corresponde com a quantidade de votantes!')
 
         return cleaned_data
 
diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py
--- a/sapl/sessao/views.py
+++ b/sapl/sessao/views.py
@@ -2068,13 +2068,24 @@ def get(self, request, *args, **kwargs):
 
         ordem_id = kwargs['oid']
         ordem = OrdemDia.objects.get(id=ordem_id)
-        qtde_presentes = PresencaOrdemDia.objects.filter(
-            sessao_plenaria_id=self.object.id).count()
+
+        presentes_id = [
+            presente.parlamentar.id for presente in PresencaOrdemDia.objects.filter(
+                sessao_plenaria_id=self.kwargs['pk']
+            )
+        ]
+        qtde_presentes = len(presentes_id)
+
+        presenca_ativos = Parlamentar.objects.filter(
+            id__in=presentes_id, ativo=True
+        )
+        qtde_ativos = len(presenca_ativos)
 
         materia = {'materia': ordem.materia, 'ementa': ordem.materia.ementa}
         context.update({'votacao_titulo': titulo,
                         'materia': materia,
-                        'total_presentes': qtde_presentes})
+                        'total_presentes': qtde_presentes,
+                        'total_votantes': qtde_ativos})
 
         return self.render_to_response(context)
 
@@ -2094,13 +2105,24 @@ def post(self, request, *args, **kwargs):
 
         ordem_id = kwargs['oid']
         ordem = OrdemDia.objects.get(id=ordem_id)
-        qtde_presentes = PresencaOrdemDia.objects.filter(
-            sessao_plenaria_id=self.object.id).count()
+        
+        presentes_id = [
+            presente.parlamentar.id for presente in PresencaOrdemDia.objects.filter(
+                sessao_plenaria_id=self.kwargs['pk']
+            )
+        ]
+        qtde_presentes = len(presentes_id)
+
+        presenca_ativos = Parlamentar.objects.filter(
+            id__in=presentes_id, ativo=True
+        )
+        qtde_ativos = len(presenca_ativos)
 
         materia = {'materia': ordem.materia, 'ementa': ordem.materia.ementa}
         context.update({'votacao_titulo': titulo,
                         'materia': materia,
-                        'total_presentes': qtde_presentes})
+                        'total_presentes': qtde_presentes,
+                        'total_votantes': qtde_ativos})
         context.update({'form': form})
         # ====================================================
 
@@ -2113,21 +2135,19 @@ def post(self, request, *args, **kwargs):
             materia_id = kwargs['mid']
             ordem_id = kwargs['oid']
 
-            qtde_presentes = PresencaOrdemDia.objects.filter(
-                sessao_plenaria_id=self.object.id).count()
             qtde_votos = (int(request.POST['votos_sim']) +
                           int(request.POST['votos_nao']) +
                           int(request.POST['abstencoes']))
 
             if (int(request.POST['voto_presidente']) == 0):
-                qtde_presentes -= 1
+                qtde_ativos -= 1
 
-            if (qtde_votos > qtde_presentes or qtde_votos < qtde_presentes):
+            if qtde_votos != qtde_ativos:
                 msg = _(
-                    'O total de votos não corresponde com a quantidade de presentes!')
+                    'O total de votos não corresponde com a quantidade de votantes!')
                 messages.add_message(request, messages.ERROR, msg)
                 return self.render_to_response(context)
-            elif (qtde_presentes == qtde_votos):
+            else:
                 try:
                     votacao = RegistroVotacao()
                     votacao.numero_votos_sim = int(request.POST['votos_sim'])
@@ -2772,14 +2792,25 @@ def get(self, request, *args, **kwargs):
 
         expediente_id = kwargs['oid']
         expediente = ExpedienteMateria.objects.get(id=expediente_id)
-        qtde_presentes = SessaoPlenariaPresenca.objects.filter(
-            sessao_plenaria_id=self.object.id).count()
+        
+        presentes_id = [
+            presente.parlamentar.id for presente in SessaoPlenariaPresenca.objects.filter(
+                sessao_plenaria_id=self.kwargs['pk']
+            )
+        ]
+        qtde_presentes = len(presentes_id)
+
+        presentes_ativos = Parlamentar.objects.filter(
+            id__in=presentes_id, ativo=True
+        )
+        qtde_ativos = len(presentes_ativos)
 
         materia = {'materia': expediente.materia,
                    'ementa': expediente.materia.ementa}
         context.update({'votacao_titulo': titulo,
                         'materia': materia,
-                        'total_presentes': qtde_presentes})
+                        'total_presentes': qtde_presentes,
+                        'total_votantes': qtde_ativos})
 
         return self.render_to_response(context)
 
@@ -2799,14 +2830,25 @@ def post(self, request, *args, **kwargs):
 
         expediente_id = kwargs['oid']
         expediente = ExpedienteMateria.objects.get(id=expediente_id)
-        qtde_presentes = SessaoPlenariaPresenca.objects.filter(
-            sessao_plenaria_id=self.object.id).count()
+
+        presentes_id = [
+            presente.parlamentar.id for presente in SessaoPlenariaPresenca.objects.filter(
+                sessao_plenaria_id=self.kwargs['pk']
+            )
+        ]
+        qtde_presentes = len(presentes_id)
+
+        presentes_ativos = Parlamentar.objects.filter(
+            id__in=presentes_id, ativo=True
+        )
+        qtde_ativos = len(presentes_ativos)
 
         materia = {'materia': expediente.materia,
                    'ementa': expediente.materia.ementa}
         context.update({'votacao_titulo': titulo,
                         'materia': materia,
-                        'total_presentes': qtde_presentes})
+                        'total_presentes': qtde_presentes,
+                        'total_votantes': qtde_ativos})
         context.update({'form': form})
         # ====================================================
 
@@ -2819,17 +2861,17 @@ def post(self, request, *args, **kwargs):
             materia_id = kwargs['mid']
             expediente_id = kwargs['oid']
 
-            qtde_presentes = SessaoPlenariaPresenca.objects.filter(
-                sessao_plenaria_id=self.object.id).count()
             qtde_votos = (int(request.POST['votos_sim']) +
                           int(request.POST['votos_nao']) +
                           int(request.POST['abstencoes']))
 
             if (int(request.POST['voto_presidente']) == 0):
-                qtde_presentes -= 1
+                qtde_ativos -= 1
 
-            if qtde_votos != qtde_presentes:
-                form._errors["total_votos"] = ErrorList([u""])
+            if qtde_votos != qtde_ativos:
+                msg = _(
+                    'O total de votos não corresponde com a quantidade de votantes!')
+                messages.add_message(request, messages.ERROR, msg)
                 return self.render_to_response(context)
             else:
                 try:
@@ -3578,17 +3620,41 @@ def post(self, request, *args, **kwargs):
             if request.POST['origem'] == 'ordem':
                 ordens = OrdemDia.objects.filter(
                     id__in=request.POST.getlist('marcadas_1'))
-                qtde_presentes = PresencaOrdemDia.objects.filter(
-                    sessao_plenaria_id=self.kwargs['pk']).count()
+                
+                presentes_id = [
+                    presente.parlamentar.id for presente in PresencaOrdemDia.objects.filter(
+                        sessao_plenaria_id=self.kwargs['pk']
+                    )
+                ]
+                qtde_presentes = len(presentes_id)
+
+                presenca_ativos = Parlamentar.objects.filter(
+                    id__in=presentes_id, ativo=True
+                )
+                qtde_ativos = len(presenca_ativos)
+
                 context.update({'ordens': ordens,
-                                'total_presentes': qtde_presentes})
+                                'total_presentes': qtde_presentes,
+                                'total_votantes': qtde_ativos})
             else:
                 expedientes = ExpedienteMateria.objects.filter(
                     id__in=request.POST.getlist('marcadas_1'))
-                qtde_presentes = SessaoPlenariaPresenca.objects.filter(
-                    sessao_plenaria_id=self.kwargs['pk']).count()
+                
+                presentes_id = [
+                    presente.parlamentar.id for presente in SessaoPlenariaPresenca.objects.filter(
+                        sessao_plenaria_id=self.kwargs['pk']
+                    )
+                ]
+                qtde_presentes = len(presentes_id)
+
+                presenca_ativos = Parlamentar.objects.filter(
+                    id__in=presentes_id, ativo=True
+                )
+                qtde_ativos = len(presenca_ativos)
+
                 context.update({'expedientes': expedientes,
-                                'total_presentes': qtde_presentes})
+                                'total_presentes': qtde_presentes,
+                                'total_votantes': qtde_ativos})
 
         if 'salvar-votacao' in request.POST:
             form = VotacaoForm(request.POST)
@@ -3713,17 +3779,41 @@ def form_invalid(self, form, context):
         if self.request.POST['origem'] == 'ordem':
             ordens = OrdemDia.objects.filter(
                 id__in=self.request.POST.getlist('ordens'))
-            qtde_presentes = PresencaOrdemDia.objects.filter(
-                sessao_plenaria_id=self.kwargs['pk']).count()
+                
+            presentes_id = [
+                presente.parlamentar.id for presente in PresencaOrdemDia.objects.filter(
+                    sessao_plenaria_id=self.kwargs['pk']
+                )
+            ]
+            qtde_presentes = len(presentes_id)
+
+            presenca_ativos = Parlamentar.objects.filter(
+                id__in=presentes_id, ativo=True
+            )
+            qtde_ativos = len(presenca_ativos)
+
             context.update({'ordens': ordens,
-                            'total_presentes': qtde_presentes})
+                            'total_presentes': qtde_presentes, 
+                            'total_votantes': qtde_ativos})
         elif self.request.POST['origem'] == 'expediente':
             expedientes = ExpedienteMateria.objects.filter(
                 id__in=self.request.POST.getlist('expedientes'))
-            qtde_presentes = SessaoPlenariaPresenca.objects.filter(
-                sessao_plenaria_id=self.kwargs['pk']).count()
+                
+            presentes_id = [
+                presente.parlamentar.id for presente in SessaoPlenariaPresenca.objects.filter(
+                    sessao_plenaria_id=self.kwargs['pk']
+                )
+            ]
+            qtde_presentes = len(presentes_id)
+
+            presenca_ativos = Parlamentar.objects.filter(
+                id__in=presentes_id, ativo=True
+            )
+            qtde_ativos = len(presenca_ativos)
+
             context.update({'expedientes': expedientes,
-                            'total_presentes': qtde_presentes})
+                            'total_presentes': qtde_presentes,
+                            'total_votantes': qtde_ativos})
 
         context.update({'resultado_votacao': TipoResultadoVotacao.objects.all(),
                         'form': form,


Test patch: