Repository: interlegis/sapl

Issue:
Pauta das Sessões
<!--- Forneça um resumo geral da _issue_ no título acima -->

Verificando as informações que são apresentadas no menu "Pauta das Sessões" em matérias do expediente e matérias da ordem do dia é mostrada a coluna "situação".

A informação mostrada nessa coluna é sempre da ultima tramitação da matéria.

O que ocorre, é que quando da consulta de sessões anteriores,  onde a matéria já tramitou, a informação apresentada não reflete o que aconteceu naquela pauta da sessão.


## 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. -->

## 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. -->
![image](https://user-images.githubusercontent.com/13314947/80004684-02334a80-8499-11ea-9d49-b40a4efbbe0a.png)


## Possível Solução
<!--- Não é obrigatório, mas sugira uma possível correção/razão para o bug -->
<!--- ou ideias de como implementar a adição/mudança. -->

sugiro que seja tirada essa coluna "situação" da Pauta das Sessões.

## Passos para Reproduzir (para bugs)
<!--- Forneça um link para um exemplo, ou um conjunto de passos inequívocos -->
<!--- para reproduzir esse bug. Inclua código para reproduzir, se relevante. -->
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 reproduçã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_): Release: 3.1.160
* 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:
<img width="954" alt="Screen Shot 2020-06-29 at 10 15 50" src="https://user-images.githubusercontent.com/9326037/86010261-881bc680-b9f1-11ea-8a5c-dbb4d444b235.png">

@DtiLegBG  Tá vendo porque é complicado retirar campos e telas do SAPL? Pra alguma pessoa sempre é importante.
Revertido pelo commit 567ee6371dbf79a9d9ed043f1482ce070cf2da29 a pedido de outros usuários do SAPL.
Entendo, mas não foi uma decisão sem consultar a comunidade.
![image](https://user-images.githubusercontent.com/13314947/86170833-1e371600-baf2-11ea-961a-fc272392b711.png)

Eu tentei convencer a pessoa desta casa a manter do jeito que está, isto é, sem esta coluna. Por mim não tem problema nenhum tirar. O problema é que parte dos usuários age como comunidade -- o que é o correto visto que é software livre -- e outra parcela, que eu suspeito seja maior, age como usuário/cliente com demandas urgentes e as vezes únicas. 

A casa é essa:
  Nome da Cidade: | Carlos Barbosa
  Estado: | Rio Grande do Sul

e a pessoa que abriu o ticket no OSTicket se chama __Wiliam Irani Giacomelli__. Tente conversar com ele, pra ver se convence a deixar sem essa coluna. Eu tentei convencer a pessoa a deixar como está, isto é, sem a coluna, mas não consegui. Em geral, eu consigo convencer a seguir a maioria da comunidade, mas atualmente estou cansado de ter que ficar contra-argumentando. Conseguir mais gente da comunidade pra embasar essa decisão de deixar sem a coluna me ajuda bastante a embasar esse tipo de mudança. 




@edwardoliveira  a meu ver e boa parte dos usuários da câmara onde eu trabalho concordaram não ter essa coluna, a pauta de sessão é sucinta , com informações de matérias do dia , essa coluna "Situação" já se encontra em resumo de sessão plenária e não faz sentido ficar em "Pauta" .... a comunidade deveria entender que existe hoje a opção de resumo de sessão , que nem era usado pelo fato de ter essa informação duplicada na pauta.
Bom, eu posso reverter o revert e pedir pra pessoa entrar na lista do GITEC e discutir isso com vcs lá. Se houver algum consenso eu coloco de novo ou deixo sem. Agora precisa que mais __casas__ se manifestem! 
@edwardoliveira acabei de ver aqui e me confundi , o campo situação não está e sim o resultado da votação, o que poderia ser estudado seria, migrar esse campo situação para o resumo de sessão, que no caso ficaria o resultado da votação mais a situação atual daquela matéria, e deixar a Pauta somente com a matéria e ementa , fica aqui uma ideia
@edwardoliveira , conversei com o pessoal da Câmara de Carlos Barbosa, eles argumentam o seguinte "Queremos comentar que para nós seria importante o acesso a situação da proposição até a data da votação, pois também colocamos na Ordem do Dia, os projetos que baixam para análise das comissões. Assim, sem a situação, quando o munícipe entrar na pauta não saberá, qual proposição será votada e qual apenas foi protocolada e ainda estará em análise.Mas entendo o ponto que você colocou no e-mail em relação às pautas das sessões anteriores, por isso seria bom verificar o que os demais falaram sobre, até mesmo para avaliarmos se a forma como fazemos está correta, para ajustar nosso Regimento e nossa dinâmica caso necessário. " .
Entendo que a informação é necessária, o que acontece é que para sessões anteriores a informação acaba ficando errada. Teria que pensar em uma forma de contornar isso.
Bom, muito bom! Obrigado @DtiLegBG pela iniciativa! 🙏  Assim, se precisar de uma tela/relatório a gente pode fazer e disponibilizar sem problema pra eles. O que acha dessa ideia? Se vc puder ver com ele o que mais teria nesse relatório podemos fazer e disponibilizar já na semana que vem.
@edwardoliveira , pensamos no seguite: Sempre que a sessão estiver com o status "Sessão Finalizada = Não" nos seus dados básicos, a coluna é mostrada, se o status for "Sessão Finalizada = Sim"  então a coluna deixa de ser mostrada. O que acha?

Resolving patch:
diff --git a/sapl/relatorios/urls.py b/sapl/relatorios/urls.py
--- a/sapl/relatorios/urls.py
+++ b/sapl/relatorios/urls.py
@@ -27,8 +27,8 @@
         relatorio_protocolo, name='relatorio_protocolo'),
     url(r'^relatorios/(?P<nro>\d+)/(?P<ano>\d+)/etiqueta-protocolo$',
         relatorio_etiqueta_protocolo, name='relatorio_etiqueta_protocolo'),
-    url(r'^relatorios/pauta-sessao/(?P<pk>\d+)/$',
-        relatorio_pauta_sessao, name='relatorio_pauta_sessao'),
+    # url(r'^relatorios/pauta-sessao/(?P<pk>\d+)/$',
+    #     relatorio_pauta_sessao, name='relatorio_pauta_sessao'),
     url(r'^relatorios/(?P<pk>\d+)/resumo_ata$',
         resumo_ata_pdf, name='resumo_ata_pdf'),
     url(r'^relatorios/(?P<pk>\d+)/sessao-plenaria-pdf$',
diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py
--- a/sapl/relatorios/views.py
+++ b/sapl/relatorios/views.py
@@ -1364,8 +1364,7 @@ def relatorio_normas_por_autor(obj, request, context):
 
 def relatorio_pauta_sessao_weasy(obj, request, context):
     sessao = context['object']
-    info = "Pauta da {} ({} - {}) Legislatura".format(sessao, sessao.legislatura.data_inicio.year,
-                                                      sessao.legislatura.data_fim.year)
+    info = f"Pauta da {sessao} ({sessao.legislatura.data_inicio.year} - {sessao.legislatura.data_fim.year}) Legislatura"
     return cria_relatorio(request, context, 'relatorios/relatorio_pauta_sessao.html', info)
 
 
diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py
--- a/sapl/sessao/views.py
+++ b/sapl/sessao/views.py
@@ -29,7 +29,7 @@
                             PermissionRequiredForAppCrudMixin, make_pagination)
 from sapl.materia.forms import filtra_tramitacao_status
 from sapl.materia.models import (Autoria, TipoMateriaLegislativa,
-                                 Tramitacao, MateriaEmTramitacao)
+                                 Tramitacao, MateriaEmTramitacao, Numeracao)
 from sapl.materia.views import MateriaLegislativaPesquisaView
 from sapl.parlamentares.models import (Filiacao, Legislatura, Mandato,
                                        Parlamentar, SessaoLegislativa)
@@ -3351,38 +3351,21 @@ def get(self, request, *args, **kwargs):
         # =====================================================================
         # Identificação Básica
         abertura = self.object.data_inicio.strftime('%d/%m/%Y')
-        if self.object.data_fim:
-            encerramento = self.object.data_fim.strftime('%d/%m/%Y')
-        else:
-            encerramento = ""
-
+        encerramento = self.object.data_fim.strftime('%d/%m/%Y') if self.object.data_fim else ""
         hora_inicio = self.object.hora_inicio
         hora_fim = self.object.hora_fim
 
-        context.update({'basica': [
-            _('Tipo de Sessão: %(tipo)s') % {'tipo': self.object.tipo},
-            _('Abertura: %(abertura)s - %(hora_inicio)s') % {
-                'abertura': abertura, 'hora_inicio': hora_inicio},
-            _('Encerramento: %(encerramento)s - %(hora_fim)s') % {
-                'encerramento': encerramento, 'hora_fim': hora_fim},
-        ]})
+        context.update({
+            'basica': [
+                _(f'Tipo de Sessão: {self.object.tipo}'),
+                _(f'Abertura: {abertura} - {hora_inicio}'),
+                _(f'Encerramento: {encerramento} - {hora_fim}')
+            ]
+        })
         # =====================================================================
         # Matérias Expediente
-        materias = ExpedienteMateria.objects.filter(
-            sessao_plenaria_id=self.object.id)
-
         materias_expediente = []
-        for m in materias:
-            ementa = m.materia.ementa
-            titulo = m.materia
-            numero = m.numero_ordem
-
-            ultima_tramitacao = m.materia.tramitacao_set.last()
-
-            situacao = ultima_tramitacao.status if ultima_tramitacao else None
-
-            if situacao is None:
-                situacao = _("Não informada")
+        for m in ExpedienteMateria.objects.select_related("materia").filter(sessao_plenaria_id=self.object.id):
             rv = m.registrovotacao_set.all()
             if rv:
                 resultado = rv[0].tipo_resultado_votacao.nome
@@ -3391,60 +3374,45 @@ def get(self, request, *args, **kwargs):
                 resultado = _('Matéria não votada')
                 resultado_observacao = _(' ')
 
-            autoria = Autoria.objects.filter(materia_id=m.materia_id)
-            autor = [str(x.autor) for x in autoria]
-
-            mat = {'id': m.materia_id,
-                   'ementa': ementa,
-                   'observacao': m.observacao,
-                   'titulo': titulo,
-                   'numero': numero,
-                   'resultado': resultado,
-                   'resultado_observacao': resultado_observacao,
-                   'situacao': situacao,
-                   'autor': autor
-                   }
-            materias_expediente.append(mat)
+            ultima_tramitacao = m.materia.tramitacao_set.last()
+            numeracao = Numeracao.objects.filter(materia=m.materia).first()
+
+            materias_expediente.append({
+                'id': m.materia_id,
+                'ementa': m.materia.ementa,
+                'observacao': m.observacao,
+                'titulo': m.materia,
+                'numero': m.numero_ordem,
+                'resultado': resultado,
+                'resultado_observacao': resultado_observacao,
+                'situacao': ultima_tramitacao.status if ultima_tramitacao else _("Não informada"),
+                'processo': f'{str(numeracao.numero_materia)}/{str(numeracao.ano_materia)}' if numeracao else '-',
+                'autor': [str(x.autor) for x in Autoria.objects.select_related("autor").filter(materia_id=m.materia_id)]
+            })
 
         context.update({'materia_expediente': materias_expediente})
         # =====================================================================
         # Expedientes
-        expediente = ExpedienteSessao.objects.filter(
-            sessao_plenaria_id=self.object.id).order_by('tipo__ordenacao')
-
         expedientes = []
-        for e in expediente:
+        for e in ExpedienteSessao.objects.select_related("tipo").filter(sessao_plenaria_id=self.object.id)\
+                                                                .order_by('tipo__ordenacao'):
             conteudo = e.conteudo
             from sapl.relatorios.views import is_empty
             if not is_empty(conteudo):
                 tipo = e.tipo
                 conteudo = sub('&nbsp;', ' ', conteudo)
-                ex = {'tipo': tipo, 'conteudo': conteudo}
-                expedientes.append(ex)
+                expedientes.append({'tipo': tipo, 'conteudo': conteudo})
 
         context.update({'expedientes': expedientes})
         # =====================================================================
         # Orador Expediente
-        oradores = OradorExpediente.objects.filter(
-            sessao_plenaria_id=self.object.id).order_by('numero_ordem')
-        context.update({'oradores': oradores})
+        context.update({
+            'oradores': OradorExpediente.objects.filter(sessao_plenaria_id=self.object.id).order_by('numero_ordem')
+        })
         # =====================================================================
         # Matérias Ordem do Dia
-        ordem = OrdemDia.objects.filter(
-            sessao_plenaria_id=self.object.id)
-
         materias_ordem = []
-        for o in ordem:
-            ementa = o.materia.ementa
-            titulo = o.materia
-            numero = o.numero_ordem
-
-            ultima_tramitacao = o.materia.tramitacao_set.last()
-
-            situacao = ultima_tramitacao.status if ultima_tramitacao else None
-
-            if situacao is None:
-                situacao = _("Não informada")
+        for o in OrdemDia.objects.select_related("materia").filter(sessao_plenaria_id=self.object.id):
             # Verificar resultado
             rv = o.registrovotacao_set.all()
             if rv:
@@ -3454,29 +3422,29 @@ def get(self, request, *args, **kwargs):
                 resultado = _('Matéria não votada')
                 resultado_observacao = _(' ')
 
-            autoria = Autoria.objects.filter(
-                materia_id=o.materia_id)
-            autor = [str(x.autor) for x in autoria]
-
-            mat = {'id': o.materia_id,
-                   'ementa': ementa,
-                   'observacao': o.observacao,
-                   'titulo': titulo,
-                   'numero': numero,
-                   'resultado': resultado,
-                   'resultado_observacao': resultado_observacao,
-                   'situacao': situacao,
-                   'autor': autor
-                   }
-            materias_ordem.append(mat)
-
-        context.update({'materias_ordem': materias_ordem})
-        context.update({'subnav_template_name': 'sessao/pauta_subnav.yaml'})
+            ultima_tramitacao = o.materia.tramitacao_set.last()
+            numeracao = Numeracao.objects.filter(materia=m.materia).first()
+
+            materias_ordem.append({
+                'id': o.materia_id,
+                'ementa': o.materia.ementa,
+                'observacao': o.observacao,
+                'titulo': o.materia,
+                'numero': o.numero_ordem,
+                'resultado': resultado,
+                'resultado_observacao': resultado_observacao,
+                'situacao': ultima_tramitacao.status if ultima_tramitacao else _("Não informada"),
+                'processo': f'{str(numeracao.numero_materia)}/{str(numeracao.ano_materia)}' if numeracao else '-',
+                'autor': [str(x.autor) for x in Autoria.objects.select_related("autor").filter(materia_id=o.materia_id)]
+            })
 
-        is_pdf = True if request.build_absolute_uri().split(
-            '/')[-1] == 'pdf' else False
+        context.update({
+            'materias_ordem': materias_ordem,
+            'subnav_template_name': 'sessao/pauta_subnav.yaml'
+        })
 
-        if is_pdf:
+        # Verifica se é um PDF
+        if request.build_absolute_uri().split('/')[-1] == 'pdf':
             return relatorio_pauta_sessao_weasy(self, request, context)
         else:
             return self.render_to_response(context)


Test patch: