diff --git a/sigi/apps/convenios/admin.py b/sigi/apps/convenios/admin.py index 9b8bcdc..36198f4 100644 --- a/sigi/apps/convenios/admin.py +++ b/sigi/apps/convenios/admin.py @@ -65,7 +65,7 @@ class ConvenioAdmin(admin.ModelAdmin): report.generate_by(PDFGenerator, filename=response) return response - relatorio.short_description = 'Gerar relatorio dos convenios selecionados' + relatorio.short_description = u'Exportar convênios selecionados para PDF' class EquipamentoPrevistoAdmin(admin.ModelAdmin): diff --git a/sigi/apps/convenios/reports.py b/sigi/apps/convenios/reports.py index ca711a2..2cb19c5 100644 --- a/sigi/apps/convenios/reports.py +++ b/sigi/apps/convenios/reports.py @@ -4,7 +4,7 @@ from ctypes import alignment from operator import attrgetter from geraldo import Report, ReportBand, ObjectValue, DetailBand, Label, \ landscape,SystemField, BAND_WIDTH,ReportGroup, \ - FIELD_ACTION_SUM, FIELD_ACTION_COUNT + FIELD_ACTION_SUM, FIELD_ACTION_COUNT, FIELD_ACTION_AVG from geraldo.graphics import Image from reportlab.lib.units import cm @@ -26,8 +26,9 @@ class CasasComEquipamentosReport(object): class SemEquipamentosReport(object): pass + class ConvenioReport(ReportDefault): - title = u'Relatório de Convênios' + title = u'Relatório de Convênios' class band_page_header(ReportDefault.band_page_header): @@ -151,62 +152,60 @@ class ConvenioReport(ReportDefault): ) ] - +float_duas_casas = lambda instance: '%.2f' % (instance) class ConvenioReportRegiao(ReportDefault): title = u'Relatório de Convênios por Região' class band_page_header(ReportDefault.band_page_header): label_top = ReportDefault.band_page_header.label_top + label_left = [0.5,6,8,10,12,14] + map(lambda x:x-0.4,label_left) elements = list(ReportDefault.band_page_header.elements) elements += [ - Label( - text="Região", left=0*cm, - top=label_top, - ), - Label( - text="Casas", left=3*cm, - top=label_top, - ), - Label( - text="Conveniadas", left=5*cm, - top=label_top, - ), - Label( - text="%", left=7*cm, - top=label_top - ), - Label( - text="Não Conveniadas", left=9*cm, - top=label_top, - ), + Label(text="UF", left=label_left[0]*cm,top=label_top,), + Label(text="Total", left=label_left[1]*cm,top=label_top,), + Label(text="Aderidas", left=label_left[2]*cm,top=label_top,), + Label(text="%", left=label_left[3]*cm,top=label_top), + Label(text="Ñ Aderidas", left=label_left[4]*cm,top=label_top,), + Label(text="%", left=label_left[5]*cm,top=label_top), ] class band_detail(ReportDefault.band_detail): - elements=[ - ObjectValue(attribute_name='regiao', left=0*cm, ), - ObjectValue(attribute_name='casas', left=3*cm,), - ObjectValue(attribute_name='casas_conveniadas', left=5*cm), - ObjectValue(attribute_name='porc_casas_conveniadas', left=7*cm), - ] - border = {'bottom': True} + label_left = [0.5,6,8,10,12,14] + display_inline = True + float_duas_casas = lambda instance: '%.2f' % (instance.porc_casas_aderidas) + default_style = {'fontName': 'Helvetica', 'fontSize': 11} - class band_summary(ReportBand): + elements=[ + ObjectValue(attribute_name='estado', left=label_left[0]*cm, ), + ObjectValue(attribute_name='quant_casas', left=label_left[1]*cm,), + ObjectValue(attribute_name='quant_casas_aderidas', left=label_left[2]*cm), + ObjectValue(attribute_name='porc_casas_aderidas', left=label_left[3]*cm), + ObjectValue(attribute_name='quant_casas_nao_aderidas', left=label_left[4]*cm), + ObjectValue(attribute_name='porc_casas_nao_aderidas', left=label_left[5]*cm,), + ] + + class band_summary(ReportBand): + label_left = [0.5,6,8,10,12,14] elements = [ - Label(text="Total", top=0.1*cm, left=0), - ObjectValue(attribute_name='casas', action=FIELD_ACTION_SUM, left=3*cm, top=0.1*cm), - ObjectValue(attribute_name='casas_conveniadas', left=6*cm, action=FIELD_ACTION_SUM), + Label(text="Total", top=0.1*cm, left=label_left[0]*cm), + ObjectValue(attribute_name='quant_casas', action=FIELD_ACTION_SUM, left=label_left[1]*cm, ), + ObjectValue(attribute_name='quant_casas_aderidas', action=FIELD_ACTION_SUM, left=label_left[2]*cm), +# ObjectValue(attribute_name='porc_casas_aderidas', action=FIELD_ACTION_AVG, left=label_left[3]*cm, +# #get_value= lambda instance : lambda instance: '%.2f' % (instance.porc_casas_aderidas), +# ), + ObjectValue(attribute_name='quant_casas_nao_aderidas', action=FIELD_ACTION_SUM, left=label_left[4]*cm), +# ObjectValue(attribute_name='porc_casas_nao_aderidas', left=label_left[5]*cm, +# get_value=lambda x: teste(), +# ), ] borders = {'top':True} - #child_bands = [ - # ReportBand( - # height = 0.6*cm, - # elements = [ - # Label(text="Total",), - # ObjectValue(attribute_name='casas', action=FIELD_ACTION_COUNT,) - # ] - # ), - # ] + + + + + class ConvenioPorCMReport(ConvenioReport): title = u'Relatório de Convênios por Câmera Municipal' diff --git a/sigi/apps/convenios/templates/convenios/change_list.html b/sigi/apps/convenios/templates/convenios/change_list.html index 0e0620a..eee44af 100644 --- a/sigi/apps/convenios/templates/convenios/change_list.html +++ b/sigi/apps/convenios/templates/convenios/change_list.html @@ -1,17 +1,63 @@ {% extends "admin/change_list.html" %} {% load i18n reporting_tags %} +{% block extrastyle %} + {{ block.super }} + {% include "jquery/tabs_style.html" %} + +{% endblock %} + {% block object-tools %} {% if has_add_permission %} - + +
+ + + +
+

Escolha uma das opções abaixo para exportar todos os convênios listados. + Caso queira selecionar convênios especificos, utilize a opção "exportar + convênios selecionados" na caixa "Ação".

+ +
+
+

Escolha uma das opções abaixo para obter um resumo de informações do Projeto Interlegis por região. + Outros projetos como PPM e PML não serão incluidos.

+ +
+
+ + {% endif %} {% endblock %} diff --git a/sigi/apps/convenios/templates/convenios/relatorio_por_regiao.html b/sigi/apps/convenios/templates/convenios/relatorio_por_regiao.html new file mode 100644 index 0000000..d5a6247 --- /dev/null +++ b/sigi/apps/convenios/templates/convenios/relatorio_por_regiao.html @@ -0,0 +1,165 @@ + + + Relatório por Região + + + + +
+ + + + + + +
Logo SenadoSENADO FEDERAL
SINTER - Secretaria Especial do Interlegis
Logo Interlegis
+

Resumo por Região

+
+
+ + + + + + + + + + + + + + + + + + {%for r in lista%} + + + + + + + + + + + + + + {%endfor%} + + + + + + + + + + + + + +
{{sumario_regiao.regiao}}
UFTotalNão Aderidas%Aderidas%Não Equipadas%Equipadas%
{{r.estado}}{{r.quant_casas}}{{r.quant_casas_nao_aderidas}}{{r.porc_casas_nao_aderidas}}{{r.quant_casas_aderidas}}{{r.porc_casas_aderidas}}{{r.quant_casas_nao_equipadas}}{{r.porc_casas_nao_equipadas}}{{r.quant_casas_equipadas}}{{r.porc_casas_equipadas}}
Total{{sumario_regiao.total}}{{sumario_regiao.total_casas_nao_aderidas}}{{sumario_regiao.porc_casas_nao_aderidas}}{{sumario_regiao.total_casas_aderidas}}{{sumario_regiao.porc_casas_aderidas}}{{sumario_regiao.total_casas_nao_equipadas }}{{sumario_regiao.porc_casas_nao_equipadas }}{{sumario_regiao.total_casas_equipadas }}{{sumario_regiao.porc_casas_equipadas }}
+
+
+ + + + + +
{{data}} às {{hora}}Página
+
+ + + \ No newline at end of file diff --git a/sigi/apps/convenios/views.py b/sigi/apps/convenios/views.py index 8c1d671..710beb3 100644 --- a/sigi/apps/convenios/views.py +++ b/sigi/apps/convenios/views.py @@ -1,4 +1,5 @@ from django.http import HttpResponse, HttpResponseRedirect +from django.shortcuts import render_to_response, get_list_or_404 from geraldo.generators import PDFGenerator from sigi.apps.convenios.models import Convenio from sigi.apps.convenios.reports import ConvenioReport, \ @@ -6,6 +7,14 @@ from sigi.apps.convenios.reports import ConvenioReport, \ ConvenioPorALReport, \ ConvenioReportRegiao from sigi.apps.casas.models import CasaLegislativa +from sigi.apps.contatos.models import UnidadeFederativa + +import ho.pisa as pisa +from django.template import Context, loader + +import datetime + + def report_por_cm(request, id=None): @@ -54,45 +63,110 @@ def report_por_al(request, id=None): report.generate_by(PDFGenerator, filename=response) return response -class Relatorios(object): - def __init__(self, regiao, casas, casas_conveniadas): - self.regiao = regiao +class RelatorioRegiao(object): + def __init__(self, estado, casas, casas_aderidas, casas_equipadas,casas_nao_equipadas): + self.estado = estado self.quant_casas = casas - self.quant_casas_conveniadas = casas_conveniadas - if(casas_conveniadas!=0): - self.porc_casas_conveniadas = float(casas_conveniadas)/float(casas)*100 + self.quant_casas_aderidas = casas_aderidas + self.quant_casas_nao_aderidas = (casas - casas_aderidas) + self.quant_casas_equipadas = casas_equipadas + self.quant_casas_nao_equipadas = casas_nao_equipadas + if(casas!=0): + self.porc_casas_aderidas = "%.2f" % (float(casas_aderidas)*100/float(casas)) + self.porc_casas_nao_aderidas = "%.2f" % (float(self.quant_casas_nao_aderidas)*100/float(casas)) else: - self.porc_casas_conveniadas = 0 + self.porc_casas_aderidas = 0 + self.porc_casas_nao_aderidas = 0 -def reportRegiao(request): + if(casas_aderidas!=0): + self.porc_casas_equipadas = "%.2f" % (float(casas_equipadas)*100/float(casas_aderidas)) + self.porc_casas_nao_equipadas = "%.2f" % (float(self.quant_casas_nao_equipadas)*100/float(casas_aderidas)) + else: + self.porc_casas_equipadas = 0 + self.porc_casas_nao_equipadas = 0 - REGIAO_CHOICES = ( - ('SL', 'Sul'), - ('SD', 'Sudeste'), - ('CO', 'Centro-Oeste'), - ('NE', 'Nordeste'), - ('NO', 'Norte'), - ) - - convenios = Convenio.object.all() - - regioes = [] - conveniosCO.filter(municipio__uf__regiao='CO') - conveniosNO.filter(municipio__uf__regiao='NO') - conveniosNE.filter(municipio__uf__regiao='NE') - conveniosSD.filter(municipio__uf__regiao='SD') - conveniosSL.filter(municipio__uf__regiao='SL') - - for regiao in REGIAO_CHOICES: +class RelatorioRegiaoTotal: + def __init__(self,regiao,total,total_casas_aderidas,total_casas_equipadas,total_casas_nao_equipadas): + self.regiao = regiao + self.total = total + self.total_casas_aderidas = total_casas_aderidas + self.total_casas_nao_aderidas = (total - total_casas_aderidas) + self.total_casas_equipadas = total_casas_equipadas + self.total_casas_nao_equipadas = total_casas_nao_equipadas + + if(total!=0): + self.porc_casas_aderidas = "%.2f" % (float(self.total_casas_aderidas)*100/float(total)) + self.porc_casas_nao_aderidas = "%.2f" % (float(self.total_casas_nao_aderidas)*100/float(total)) + else: + self.porc_casas_aderidas = 0 + self.porc_casas_nao_aderidas = 0 + + if(total_casas_aderidas!=0): + self.porc_casas_equipadas = "%.2f" % (float(self.total_casas_equipadas)*100/float(total_casas_aderidas)) + self.porc_casas_nao_equipadas = "%.2f" % (float(total_casas_nao_equipadas)*100/float(total_casas_aderidas)) + else: + self.porc_casas_equipadas = 0 + self.porc_casas_nao_equipadas = 0 + +def report_regiao(request,regiao='NE'): + + REGIAO_CHOICES = { + 'SL': 'Sul', + 'SD': 'Sudeste', + 'CO': 'Centro-Oeste', + 'NE': 'Nordeste', + 'NO': 'Norte', + } + + get_list_or_404(UnidadeFederativa,regiao=regiao) - casasSD = CasaLegislativa.objects.filter(municipio__uf__regiao=regiao[0]) - casasConvSD = CasaLegislativa.objects.filter(convenio__casa_legislativa__municipio__uf__regiao=regiao[0]).distinct() + # Contando casas por estado + estados = get_list_or_404(UnidadeFederativa,regiao=regiao) - relatorio.append(Relatorios(casa[1], casasSD.count(), - casasConvSD.count())) + lista = [] + for estado in estados: + + casas = CasaLegislativa.objects.filter(municipio__uf=estado) + casas_aderidas = casas.exclude(convenio=None).distinct() + casas_equipadas = casas_aderidas.exclude(convenio__data_termo_aceite=None).distinct() + casas_nao_equipadas = casas_aderidas.filter(convenio__data_termo_aceite=None).distinct() + + lista.append( + RelatorioRegiao( + estado.sigla,casas.count(), + casas_aderidas.count(), + casas_equipadas.count(), + casas_nao_equipadas.count() + ) + ) + + # Total de casas na regiao + casas = CasaLegislativa.objects.filter(municipio__uf__regiao=regiao) + casas_aderidas = casas.exclude(convenio=None).distinct() + casas_equipadas = casas_aderidas.exclude(convenio__data_termo_aceite=None).distinct() + casas_nao_equipadas = casas_aderidas.filter(convenio__data_termo_aceite=None).distinct() + sumario_regiao = RelatorioRegiaoTotal( + REGIAO_CHOICES[regiao], + casas.count(), + casas_aderidas.count(), + casas_equipadas.count(), + casas_nao_equipadas.count(), + ) + +# response = HttpResponse(mimetype='application/pdf') +# relatorio = ConvenioReportRegiao(queryset=lista) +# relatorio.generate_by(PDFGenerator, filename=response) + data = datetime.datetime.now().strftime('%d/%m/%Y') + hora = datetime.datetime.now().strftime('%H:%M') + pisa.showLogging() response = HttpResponse(mimetype='application/pdf') - relatorio = ConvenioReportRegiao(queryset=relatorio) - relatorio.generate_by(PDFGenerator, filename=response) + response['Content-Disposition'] = 'attachment; filename=RelatorioRegiao_' + regiao + '.pdf' + t = loader.get_template('convenios/relatorio_por_regiao.html') + c = Context({'lista': lista,'sumario_regiao':sumario_regiao,'data':data,'hora':hora}) + pdf = pisa.CreatePDF(t.render(c),response) + if not pdf.err: + pisa.startViewer(response) + return response diff --git a/sigi/urls.py b/sigi/urls.py index 7c3c056..94d59f0 100644 --- a/sigi/urls.py +++ b/sigi/urls.py @@ -27,8 +27,8 @@ urlpatterns = patterns( 'sigi.apps.convenios.views.report_por_cm'), (r'^convenios/convenio/reports_por_al/', 'sigi.apps.convenios.views.report_por_al'), - (r'^convenios/convenio/reportsRegiao/', - 'sigi.apps.convenios.views.reportRegiao'), + (r'^convenios/convenio/reportsRegiao/(?P\w+)', + 'sigi.apps.convenios.views.report_regiao'), # automatic interface based on admin (r'^(.*)', sites.default.root), )