Browse Source

Convênios: filtros, relatórios, dashboard

pull/159/head
Sesostris Vieira 2 years ago
parent
commit
6cfe9b155a
  1. 38
      sigi/apps/convenios/admin.py
  2. 335
      sigi/apps/convenios/reports.py
  3. 42
      sigi/apps/home/views.py

38
sigi/apps/convenios/admin.py

@ -1,5 +1,7 @@
from django.db.models import Q
from django.contrib import admin
from django.http import HttpResponse, HttpResponseRedirect
from django.utils import timezone
from django.utils.translation import gettext as _
from django.utils.safestring import mark_safe
from django_weasyprint.views import WeasyTemplateResponse
@ -71,15 +73,26 @@ class AnexoAdmin(admin.ModelAdmin):
)
class AcompanhaFilter(admin.filters.RelatedFieldListFilter):
def __init__(self, *args, **kwargs):
super(AcompanhaFilter, self).__init__(*args, **kwargs)
servidores = (
Servidor.objects.filter(convenio__isnull=False)
.order_by("nome_completo")
.distinct()
class ConvenioVigenteFilter(admin.filters.SimpleListFilter):
parameter_name = "vigencia"
title = _("Vigência")
def lookups(self, request, model_admin):
return (
("vigentes", _("Vigentes")),
("vencidos", _("Vencidos")),
)
def queryset(self, request, queryset):
if self.value() == "vigentes":
return queryset.filter(
Q(data_termino_vigencia__gte=timezone.localdate())
| Q(data_termino_vigencia=None)
)
elif self.value() == "vencidos":
return queryset.exclude(data_termino_vigencia=None).filter(
data_termino_vigencia__lt=timezone.localdate()
)
self.lookup_choices = [(x.id, x) for x in servidores]
@admin.register(Projeto)
@ -166,9 +179,8 @@ class ConvenioAdmin(CartExportReportMixin, admin.ModelAdmin):
)
list_filter = (
("data_retorno_assinatura", DateRangeFilter),
("data_sigi", DateRangeFilter),
("data_solicitacao", DateRangeFilter),
("data_sigad", DateRangeFilter),
("data_termino_vigencia", DateRangeFilter),
ConvenioVigenteFilter,
("casa_legislativa__gerentes_interlegis", GerentesInterlegisFilter),
"projeto",
"casa_legislativa__tipo",
@ -257,7 +269,7 @@ class ConvenioAdmin(CartExportReportMixin, admin.ModelAdmin):
def report_convenios_camaras(self, request):
context = {
"convenios": self.get_queryset(request).filter(
casa_legislativa__tipo__legislativo=False
casa_legislativa__tipo__sigla="CM"
),
"title": _("Relatório de convenios de camaras municipais"),
}
@ -276,7 +288,7 @@ class ConvenioAdmin(CartExportReportMixin, admin.ModelAdmin):
def report_convenios_assembleia(self, request):
context = {
"convenios": self.get_queryset(request).filter(
casa_legislativa__tipo__legislativo=True
casa_legislativa__tipo__sigla="AL"
),
"title": _("Relatório de convenios de assembleias legislativas"),
}

335
sigi/apps/convenios/reports.py

@ -1,335 +0,0 @@
from django.utils.translation import gettext as _
from geraldo import (
ReportBand,
ObjectValue,
Label,
ReportGroup,
FIELD_ACTION_SUM,
)
from reportlab.lib.units import cm
from sigi.apps.relatorios.reports import ReportDefault
# from abc import ABCMeta
class CasasAderidasReport(object):
pass
class CasasNaoAderidasReport(object):
pass
class CasasComEquipamentosReport(object):
pass
class SemEquipamentosReport(object):
pass
class ConvenioReport(ReportDefault):
title = _("Relatório de Parcerias")
class band_page_header(ReportDefault.band_page_header):
label_top = ReportDefault.band_page_header.label_top
label_left = [0, 2.5, 6, 8, 10, 12, 14, 16]
elements = list(ReportDefault.band_page_header.elements)
height = 4.7 * cm
elements += [
Label(
text=_("UF"),
left=label_left[0] * cm,
top=label_top + 0.4 * cm,
),
Label(
text=_("Municipio"),
left=label_left[1] * cm,
top=label_top + 0.4 * cm,
),
Label(
text=_("Número do Convênio"),
left=label_left[2] * cm,
top=label_top,
width=2 * cm,
),
Label(
text=_("Projeto"),
left=label_left[3] * cm,
top=label_top + 0.4 * cm,
width=2 * cm,
),
Label(
text=_("Data do Convênio"),
left=label_left[4] * cm,
top=label_top,
width=2 * cm,
),
Label(
text=_("Data de Publicação"),
left=label_left[5] * cm,
top=label_top,
width=2 * cm,
),
Label(
text=_("Orgão"),
left=label_left[6] * cm,
top=label_top + 0.4 * cm,
width=2 * cm,
),
]
class band_page_footer(ReportDefault.band_page_footer):
pass
class band_detail(ReportDefault.band_detail):
label_left = [0, 2.5, 6, 8, 10, 12, 14, 16]
elements = [
ObjectValue(
attribute_name="casa_legislativa.municipio.uf.sigla",
left=label_left[0] * cm,
),
ObjectValue(
attribute_name="casa_legislativa.municipio.nome",
left=label_left[1] * cm,
),
ObjectValue(attribute_name="num_convenio", left=label_left[2] * cm),
ObjectValue(
attribute_name="projeto.sigla", left=label_left[3] * cm
),
ObjectValue(
attribute_name="data_retorno_assinatura",
left=label_left[4] * cm,
get_value=lambda instance: instance.data_retorno_assinatura.strftime(
"%d/%m/%Y"
)
if instance.data_retorno_assinatura is not None
else "-",
),
ObjectValue(
attribute_name="data_pub_diario",
left=label_left[5] * cm,
get_value=lambda instance: instance.data_pub_diario.strftime(
"%d/%m/%Y"
)
if instance.data_pub_diario is not None
else "-",
),
ObjectValue(
attribute_name="casa_legislativa.nome", left=label_left[6] * cm
),
]
# groups = [
# ReportGroup(attribute_name='casa_legislativa.municipio.uf',
# band_header=ReportBand(
# height=0.7 * cm,
# elements=[
# ObjectValue(attribute_name='casa_legislativa.municipio.uf',
# get_Value=lambda instance: '%s: %s' % (_('Casa Legislativa'), instance.casa_legislativa.uf)
# )
# ],
# borders={'top': True},
# )
# )
# ]
class ConvenioReportSemAceite(ConvenioReport):
class band_page_header(ReportDefault.band_page_header):
label_top = ReportDefault.band_page_header.label_top
label_left = [0, 2.5, 6, 8, 10, 12, 14, 16]
elements = list(ReportDefault.band_page_header.elements)
height = 4.7 * cm
elements += [
Label(
text=_("UF"),
left=label_left[0] * cm,
top=label_top + 0.4 * cm,
),
Label(
text=_("Município"),
left=label_left[1] * cm,
top=label_top + 0.4 * cm,
),
Label(
text=_("Número do Convênio"),
left=label_left[2] * cm,
top=label_top,
width=2 * cm,
),
Label(
text=_("Projeto"),
left=label_left[3] * cm,
top=label_top,
width=2 * cm,
),
Label(
text=_("Data do Convênio"),
left=label_left[4] * cm,
top=label_top,
width=2 * cm,
),
Label(
text=_("Orgão"),
left=label_left[5] * cm,
top=label_top + 0.4 * cm,
width=2 * cm,
),
]
class band_detail(ReportDefault.band_detail):
label_left = [0, 2.5, 6, 8, 10, 12, 14, 16]
elements = [
ObjectValue(
attribute_name="casa_legislativa.municipio.uf.sigla",
left=label_left[0] * cm,
),
ObjectValue(
attribute_name="casa_legislativa.municipio.nome",
left=label_left[1] * cm,
),
ObjectValue(attribute_name="num_convenio", left=label_left[2] * cm),
ObjectValue(
attribute_name="projeto.sigla",
left=label_left[3],
),
ObjectValue(
attribute_name="data_retorno_assinatura",
left=label_left[4] * cm,
get_value=lambda instance: instance.data_retorno_assinatura.strftime(
"%d/%m/%Y"
)
if instance.data_retorno_assinatura is not None
else "-",
),
ObjectValue(
attribute_name="casa_legislativa.nome", left=label_left[5] * cm
),
]
float_duas_casas = lambda instance: "%.2f" % (instance)
class ConvenioReportRegiao(ReportDefault):
title = _("Relatório de Parcerias 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=_("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):
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}
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=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}
class ConvenioPorCMReport(ConvenioReport):
title = _("Relatório de Parcerias por Câmara Municipal")
class ConvenioPorALReport(ConvenioReport):
title = _("Relatório de Parcerias por Assembléia Legislativa")
class ConvenioReportSemAceiteCM(ConvenioReportSemAceite):
title = _("Relatório de Parcerias por Câmara Municipal")
class ConvenioReportSemAceiteAL(ConvenioReportSemAceite):
title = _("Relatório de Parcerias por Assembléia Legislativa")

42
sigi/apps/home/views.py

@ -924,6 +924,9 @@ def busca_informacoes_camara():
convenios_com_aceite = convenios.exclude(data_termo_aceite=None)
camaras_projetos_vigentes = camaras.exclude(convenio=None).exclude(
convenio__data_termino_vigencia__lt="2022-10-26"
)
camaras_sem_processo = camaras.filter(convenio=None)
# Criacao das listas para o resumo de camaras por projeto
@ -939,47 +942,33 @@ def busca_informacoes_camara():
lista_convenios_em_andamento = []
lista_camaras_equipadas = []
for projeto in projetos:
conv_sem_adesao_proj = convenios_sem_adesao.filter(projeto=projeto)
conv_com_adesao_proj = convenios_com_adesao.filter(projeto=projeto)
conv_assinados_proj = convenios_assinados.filter(projeto=projeto)
conv_em_andamento_proj = convenios_em_andamento.filter(projeto=projeto)
conv_equipadas_proj = convenios_com_aceite.filter(projeto=projeto)
total = camaras.filter(convenio__projeto=projeto).count()
conv_assinados = camaras.filter(
convenio__in=conv_assinados_proj
).count()
conv_andamento = camaras.filter(
convenio__in=conv_em_andamento_proj
).count()
if (total + conv_assinados + conv_andamento) > 0:
cabecalho_topo.append(projeto.sigla)
lista_total.append(camaras.filter(convenio__projeto=projeto).count())
lista_nao_aderidas.append(
camaras.filter(convenio__in=conv_sem_adesao_proj).count()
)
lista_aderidas.append(
camaras.filter(convenio__in=conv_com_adesao_proj).count()
)
lista_convenios_assinados.append(
camaras.filter(convenio__in=conv_assinados_proj).count()
)
lista_convenios_em_andamento.append(
camaras.filter(convenio__in=conv_em_andamento_proj).count()
)
lista_camaras_equipadas.append(
camaras.filter(convenio__in=conv_equipadas_proj).count()
)
lista_total.append(total)
lista_convenios_assinados.append(conv_assinados)
lista_convenios_em_andamento.append(conv_andamento)
# Cabecalho da esquerda na tabela
cabecalho_esquerda = (
_("Câmaras municipais"),
_("Câmaras municipais não aderidas"),
_("Câmaras municipais aderidas"),
_("Câmaras municipais com convênios assinados"),
_("Câmaras municipais convênios em andamento"),
_("Câmaras municipais equipadas"),
)
linhas = (
lista_total,
lista_nao_aderidas,
lista_aderidas,
lista_convenios_assinados,
lista_convenios_em_andamento,
lista_camaras_equipadas,
)
# Unindo as duas listas para que o cabecalho da esquerda fique junto com sua
@ -991,6 +980,7 @@ def busca_informacoes_camara():
"cabecalho_topo": cabecalho_topo,
"lista_zip": lista_zip,
"total_camaras": camaras.count(),
"total_camaras_projetos_vigentes": camaras_projetos_vigentes.count(),
"camaras_sem_processo": camaras_sem_processo.count(),
"sem_convenio": sem_convenio(),
}

Loading…
Cancel
Save