Repository: interlegis/sapl

Issue:
Relatórios - Matérias por Ano, Autor e Tipo 
Seria interessante que neste relatório fossem mostrados os totais por autor, além do total geral. Ficando desnecessário mostrar as matérias

No sapl 2.5

![image](https://user-images.githubusercontent.com/13314947/28422498-957d7056-6d3e-11e7-8f96-84bb7731f5bc.png)


No sapl 3.1
![image](https://user-images.githubusercontent.com/13314947/28422881-bc41b246-6d3f-11e7-85a8-22cd974c590f.png)

http://sapl3beta.camarabento.rs.gov.br/sistema/relatorios/materia-por-ano-autor-tipo?ano=2016&salvar=Pesquisar


Discussion:
@DtiLegBG Não entendi. Poderia detalhar um pouco melhor, por favor?
No SAPL 3.1 só é mostrado o quadro de quantidades para o geral, além deste seria interessante manter o que existe no 2.5 que é mostrar as quantidades também por autor. Já exibir uma relação das matérias por autor se faz desnecessário tendo em vista estar contemplada em outro relatório.

http://sapl.camarabento.rs.gov.br/relatorios_administrativos/propositurasAnoAutorTipo/view?ano=2017

http://sapl3beta.camarabento.rs.gov.br/sistema/relatorios/materia-por-ano-autor-tipo?ano=2017&salvar=Pesquisar

Resolving patch:
diff --git a/sapl/base/views.py b/sapl/base/views.py
--- a/sapl/base/views.py
+++ b/sapl/base/views.py
@@ -19,7 +19,8 @@
 from sapl.base.forms import AutorForm, AutorFormForAdmin, TipoAutorForm
 from sapl.base.models import Autor, TipoAutor
 from sapl.crud.base import CrudAux
-from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa
+from sapl.materia.models import (Autoria, MateriaLegislativa,
+                                 TipoMateriaLegislativa)
 from sapl.sessao.models import (PresencaOrdemDia, SessaoPlenaria,
                                 SessaoPlenariaPresenca)
 from sapl.utils import parlamentares_ativos, sapl_logger
@@ -344,6 +345,47 @@ class RelatorioMateriasPorAnoAutorTipoView(FilterView):
     filterset_class = RelatorioMateriasPorAnoAutorTipoFilterSet
     template_name = 'base/RelatorioMateriasPorAnoAutorTipo_filter.html'
 
+    def get_materias_autor_ano(self, ano):
+
+        autorias = Autoria.objects.filter(materia__ano=ano).values(
+            'autor',
+            'materia__tipo__sigla',
+            'materia__tipo__descricao').annotate(
+                total=Count('materia__tipo')).order_by(
+                    'autor',
+                    'materia__tipo')
+
+        autores_ids = set([i['autor'] for i in autorias])
+
+        autores = dict((a.id, a) for a in Autor.objects.filter(
+            id__in=autores_ids))
+
+        relatorio = []
+        visitados = set()
+        curr = None
+
+        for a in autorias:
+            # se mudou autor, salva atual, caso existente, e reinicia `curr`
+            if a['autor'] not in visitados:
+               if curr:
+                  relatorio.append(curr)
+
+               curr = {}
+               curr['autor'] = autores[a['autor']]
+               curr['materia'] = []
+               curr['total'] = 0
+
+               visitados.add(a['autor'])
+
+            # atualiza valores
+            curr['materia'].append((a['materia__tipo__descricao'], a['total']))
+            curr['total'] += a['total']
+        # adiciona o ultimo
+        relatorio.append(curr)
+
+        return relatorio
+
+
     def get_filterset_kwargs(self, filterset_class):
         super(RelatorioMateriasPorAnoAutorTipoView,
               self).get_filterset_kwargs(filterset_class)
@@ -368,6 +410,12 @@ def get_context_data(self, **kwargs):
         qr = self.request.GET.copy()
         context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else ''
 
+        if 'ano' in self.request.GET and self.request.GET['ano']:
+            ano = int(self.request.GET['ano'])
+            context['relatorio'] = self.get_materias_autor_ano(ano)
+        else:
+            context['relatorio'] = []
+
         return context
 
 


Test patch: