Browse Source

Aprimoramentos no dashboard

whois_api
Sesostris Vieira 9 years ago
parent
commit
823fb98edb
  1. 98
      sigi/apps/home/templates/home/sem_convenio.html
  2. 8
      sigi/apps/home/urls.py
  3. 281
      sigi/apps/home/views.py
  4. 12
      sigiStatic/css/base_site.css
  5. 47
      sigiStatic/css/style.css
  6. 63
      sigiStatic/js/dashboard.js
  7. 53
      templates/index.html
  8. 123
      templates/snippets/modules/charts-convenios.html
  9. 60
      templates/snippets/modules/resumo_convenios.html
  10. 38
      templates/snippets/modules/resumo_seit.html

98
sigi/apps/home/templates/home/sem_convenio.html

@ -0,0 +1,98 @@
{% load static from staticfiles %}
{% load i18n %}
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{ titulo }}</title>
<style type="text/css">
h1 {
font-size: 2em;
text-align: center;
}
h2 {
font-size: 1.7em;
}
h3 {
margin-top: 10px;
margin-bottom: 0px;
}
body {
font-family: "Helvetica, Arial, sans-serif";
font-size: 1.3em;
line-height: 1em;
}
#header {
text-align: center;
}
th {
text-align: left;
padding: 2px 5px 2px 2px;
background-color: #f5f5f5;
border-left: 2px solid #ffffff;
}
th, td {
padding: 2px 2px 1px 2px;
vertical-align: bottom;
}
td {
border-bottom: 1px solid #ddd;
}
@page {
size: {{ pagesize|default:"a4" }};
margin: {{ margin|default:"4cm 1cm 1cm 2cm" }};
font-family: "Helvetica, Arial, sans-serif";
font-size: 2em;
@frame header {
-pdf-frame-content: header;
top: 1cm;
}
@frame footer {
-pdf-frame-content: footer;
bottom: 0cm;
margin-left: 9cm;
margin-right: 9cm;
height: 1cm;
}
}
</style>
</head>
<body>
<div id="header">
<p><strong>{% trans 'SENADO FEDERAL' %}</strong></p>
<p><strong>{% trans 'PROGRAMA INTERLEGIS – SIGI' %}</strong></p>
<p><strong>{{ titulo }}</strong></p>
</div>
<table repeat="1">
<tr>
<th>{% trans "Nome da Casa" %}</th>
<th width=30>{% trans "UF" %}</th>
<th>{% trans "Gerente de contas" %}</th>
<th>{% trans "Serviços" %}</th>
</tr>
{% for casa in casas %}
<tr>
<td>{{ casa.nome }}</td>
<td>{{ casa.municipio.uf.sigla }}</td>
<td>{{ casa.gerente_contas.nome_completo }}</td>
<td>
{% for s in casa.servico_set.all %}
{% if s.data_desativacao == None %}
{{ s.tipo_servico.nome }}{% if not forloop.last %}, {% endif %}
{% endif %}
{% endfor %}
</td>
</tr>
{% endfor %}
</table>
<div id="footer">
{%block page_foot%}
{% trans 'Página' %} <pdf:pagenumber>
{%endblock%}
</div>
</body>
</html>

8
sigi/apps/home/urls.py

@ -4,4 +4,12 @@ from django.conf.urls import patterns, url
urlpatterns = patterns('sigi.apps.home.views', urlpatterns = patterns('sigi.apps.home.views',
url(r'^$', 'index', name='sigi_index'), url(r'^$', 'index', name='sigi_index'),
url(r'^home/resumoconvenios/$', 'resumo_convenios', name="home_resumoconvenios"),
url(r'^home/resumoseit/$', 'resumo_seit', name="home_resumoseit"),
url(r'^home/chartseit/$', 'chart_seit', name="home_chartseit"),
url(r'^home/chartconvenios/$', 'chart_convenios', name="home_chartconvenios"),
url(r'^home/chartcarteira/$', 'chart_carteira', name="home_chartcarteira"),
url(r'^home/chartperformance/$', 'chart_performance', name="home_chartperformance"),
url(r'^home/report/semconvenio/$', 'report_sem_convenio', name="home_reportsemconvenio"),
) )

281
sigi/apps/home/views.py

@ -23,7 +23,8 @@
# #
import datetime import datetime
from django.shortcuts import render import calendar
from django.shortcuts import render, get_object_or_404
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from itertools import cycle from itertools import cycle
from sigi.apps.casas.models import CasaLegislativa from sigi.apps.casas.models import CasaLegislativa
@ -31,29 +32,152 @@ from sigi.apps.convenios.models import Convenio, Projeto
from sigi.apps.diagnosticos.models import Diagnostico from sigi.apps.diagnosticos.models import Diagnostico
from sigi.apps.metas.models import Meta from sigi.apps.metas.models import Meta
from sigi.apps.servicos.models import TipoServico from sigi.apps.servicos.models import TipoServico
from sigi.apps.servidores.models import Servidor
from django.views.decorators.cache import never_cache from django.views.decorators.cache import never_cache
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.http.response import JsonResponse
from django.core.urlresolvers import reverse
from django.db.models import Q, Count
from sigi.shortcuts import render_to_pdf
@never_cache @never_cache
@login_required @login_required
def index(request): def index(request):
context = {'gerentes': Servidor.objects.exclude(casas_que_gerencia=None)}
return render(request, 'index.html', context)
@never_cache
@login_required
def resumo_convenios(request):
context = {'tabela_resumo_camara': busca_informacoes_camara() }
return render(request, 'snippets/modules/resumo_convenios.html', context)
@never_cache
@login_required
def resumo_seit(request):
mes = request.GET.get('mes', None)
ano = request.GET.get('ano', None)
try:
mes = datetime.date(year=int(ano), month=int(mes), day=1)
tabela_resumo_seit = busca_informacoes_seit(mes)
except:
tabela_resumo_seit = busca_informacoes_seit()
context = {'tabela_resumo_seit': tabela_resumo_seit}
return render(request, 'snippets/modules/resumo_seit.html', context)
@never_cache
@login_required
def chart_seit(request):
mes = request.GET.get('mes', None)
ano = request.GET.get('ano', None)
try:
mes = datetime.date(year=int(ano), month=int(mes), day=1)
tabela_resumo_seit = busca_informacoes_seit(mes)
except:
tabela_resumo_seit = busca_informacoes_seit()
data = {
'type': 'line',
'prevlink': reverse('home_chartseit') + ('?ano=%s&mes=%s' %
(tabela_resumo_seit['mes_anterior'].year,
tabela_resumo_seit['mes_anterior'].month)),
'nextlink': reverse('home_chartseit') + ('?ano=%s&mes=%s' %
(tabela_resumo_seit['proximo_mes'].year,
tabela_resumo_seit['proximo_mes'].month)),
'options': {'bezierCurve': False, 'datasetFill': False, 'pointDot': False, 'responsive': True},
'data': {
'labels': ['%02d/%s' % (mes.month, mes.year) for mes in reversed(tabela_resumo_seit['meses'])],
'datasets': [
{
'label': servico['nome'],
'strokeColor': servico['cor'],
'data': [mes['total'] for mes in reversed(servico['novos_por_mes'])]
}
for servico in tabela_resumo_seit['servicos']],
}
}
return JsonResponse(data)
@never_cache
@login_required
def chart_convenios(request):
q = request.GET.get('q', 'all')
convenios = Convenio.objects.all() convenios = Convenio.objects.all()
convenios_assinados = convenios.exclude(data_retorno_assinatura=None) if q == 'assinados':
convenios = convenios.exclude(data_retorno_assinatura=None)
data = {
'type': 'pie',
'options': {'responsive': False, 'maintainAspectRatio': False},
'data': grafico_convenio_projeto(convenios),
}
return JsonResponse(data)
tabela_resumo_camara = busca_informacoes_camara() @never_cache
tabela_resumo_seit = busca_informacoes_seit() @login_required
tabela_resumo_diagnostico = busca_informacoes_diagnostico() def chart_carteira(request):
dados_graficos_convenio_projeto = [(1, grafico_convenio_projeto(convenios)), colors, highlights = color_palete()
(2, grafico_convenio_projeto(convenios_assinados))] data = {'type': 'pie',
context = { 'options': {'responsive': True},
'tabela_resumo_camara': tabela_resumo_camara, 'data': [{'value': r['total_casas'],
'tabela_resumo_seit': tabela_resumo_seit, 'color': colors.next(),
'tabela_resumo_diagnostico': tabela_resumo_diagnostico, 'highlight': highlights.next(),
'dados_graficos_convenio_projeto': dados_graficos_convenio_projeto, 'label': Servidor.objects.get(pk=r['gerente_contas']).nome_completo
'metas': Meta.objects.all(), }
for r in CasaLegislativa.objects.all().values('gerente_contas').annotate(total_casas=Count('pk')).order_by('gerente_contas')
]
} }
return render(request, 'index.html', context)
return JsonResponse(data)
@never_cache
@login_required
def chart_performance(request):
servidor = request.GET.get('servidor', None)
if servidor is None:
casas = CasaLegislativa.objects.exclude(gerente_contas=None)
else:
gerente = get_object_or_404(Servidor, pk=servidor)
casas = gerente.casas_que_gerencia
data = {
'type': 'pie',
'options': {'responsive': True},
'data': [
{'label': _(u"Utilizam serviços"), 'value': casas.exclude(servico=None).count(), 'color': '#91e8e1'},
{'label': _(u"Não utilizam serviços"), 'value': casas.filter(servico=None).count(), 'color': '#f7a35c'},
]
}
return JsonResponse(data)
@never_cache
@login_required
def report_sem_convenio(request):
modo = request.GET.get('modo', None)
sc = sem_convenio()
if modo == 'H':
casas = sc['hospedagem']
titulo = _(u"Casas sem convenio que utilizam algum serviço de hospedagem")
elif modo == 'R':
casas = sc['registro']
titulo = _(u"Casas sem convenio que utilizam somente serviço de registro")
else:
casas = sc['total']
titulo = _(u"Casas sem convenio que utilizam algum serviço de registro e/ou hospedagem")
context = {'casas': casas, 'titulo': titulo}
print context
# return render(request, 'home/sem_convenio.html', context)
return render_to_pdf('home/sem_convenio.html', context)
def busca_informacoes_camara(): def busca_informacoes_camara():
""" """
Busca informacoes no banco para montar tabela de resumo de camaras por projeto Busca informacoes no banco para montar tabela de resumo de camaras por projeto
@ -128,49 +252,38 @@ def busca_informacoes_camara():
# Unindo as duas listass para que o cabecalho da esquerda fique junto com sua # Unindo as duas listass para que o cabecalho da esquerda fique junto com sua
# respectiva linha # respectiva linha
lista_zip = zip(cabecalho_esquerda, linhas) lista_zip = zip(cabecalho_esquerda, linhas)
# Retornando listas em forma de dicionario # Retornando listas em forma de dicionario
return { return {
u'cabecalho_topo': cabecalho_topo, 'cabecalho_topo': cabecalho_topo,
u'lista_zip': lista_zip, 'lista_zip': lista_zip,
u'total_camaras': camaras.count(), 'total_camaras': camaras.count(),
u'camaras_sem_processo': camaras_sem_processo.count(), 'camaras_sem_processo': camaras_sem_processo.count(),
'sem_convenio': sem_convenio(),
} }
def grafico_convenio_projeto(convenios): def sem_convenio():
total = CasaLegislativa.objects.exclude(servico=None).filter(servico__data_desativacao=None, convenio=None).order_by('municipio__uf__sigla', 'nome').distinct('municipio__uf__sigla', 'nome')
colors = cycle(['#7cb5ec', hospedagem = CasaLegislativa.objects.exclude(servico=None).filter(servico__data_desativacao=None, servico__tipo_servico__modo='H', convenio=None).order_by('municipio__uf__sigla', 'nome').distinct('municipio__uf__sigla', 'nome')
'#434348', reg_keys = set(total.values_list('pk', flat=True)).difference(set(hospedagem.values_list('pk', flat=True)))
'#90ed7d', registro = CasaLegislativa.objects.filter(pk__in=reg_keys).order_by('municipio__uf__sigla', 'nome')
'#f7a35c', return {
'#8085e9', 'total': total,
'#f15c80', 'hospedagem': hospedagem,
'#e4d354', 'registro': registro,
'#8085e8', }
'#8d4653',
'#91e8e1', ])
highlights = cycle(['#B0D3F4',
'#8E8E91',
'#BCF4B1',
'#FAC89D',
'#B3B6F2',
'#F79DB3',
'#EFE598',
'#B3B6F1',
'#BB9098',
'#BDF1ED', ])
def grafico_convenio_projeto(convenios):
colors, highlights = color_palete()
projetos = Projeto.objects.all() projetos = Projeto.objects.all()
lista_projetos = [{'label': projeto.sigla,
lista_projetos = [(projeto.sigla, 'value': convenios.filter(projeto=projeto).count(),
convenios.filter(projeto=projeto).count(), 'color': colors.next(),
colors.next(), 'highlight': highlights.next()}
highlights.next())
for projeto in projetos] for projeto in projetos]
# remove projetos sem convenio # remove projetos sem convenio
lista_projetos = [x for x in lista_projetos if x[1] > 0] lista_projetos = [x for x in lista_projetos if x['value'] > 0]
# print lista_projetos # print lista_projetos
# total_convenios = "Total: " + str(convenios.count()) # total_convenios = "Total: " + str(convenios.count())
@ -178,27 +291,45 @@ def grafico_convenio_projeto(convenios):
return lista_projetos return lista_projetos
def busca_informacoes_seit(): def busca_informacoes_seit(mes_atual=None):
mes_atual = datetime.date.today().replace(day=1) colors, highlights = color_palete()
if mes_atual is None:
mes_atual = datetime.date.today().replace(day=1)
mes_anterior = mes_atual - datetime.timedelta(days=1) mes_anterior = mes_atual - datetime.timedelta(days=1)
proximo_mes = mes_atual + datetime.timedelta(days=calendar.monthrange(mes_atual.year, mes_atual.month)[1])
result = [{'nome': '',
'total': 'Total de casas atendidas', meses = []
'novos_mes_anterior': 'Novas casas em %s/%s' % (mes_anterior.month, mes_anterior.year), mes = mes_atual
'novos_mes_atual': 'Novas casas em %s/%s' % (mes_atual.month, mes_atual.year)}] for i in range(1, 13):
meses.append(mes)
mes = (mes - datetime.timedelta(days=1)).replace(day=1)
result = {
'mes_atual': mes_atual,
'mes_anterior': mes_anterior,
'proximo_mes': proximo_mes,
'meses': meses,
'titulos': [ '',
'Total de casas atendidas',
'Novas casas em %s/%s' % (mes_anterior.month, mes_anterior.year),
'Novas casas em %s/%s' % (mes_atual.month, mes_atual.year)
],
'servicos': [],
}
for tipo_servico in TipoServico.objects.all(): for tipo_servico in TipoServico.objects.all():
por_mes = [] por_mes = []
for mes in range(1, 13): for mes in meses:
por_mes.append({'mes': '%02d/%s' % (mes, datetime.date.today().year), por_mes.append({'mes': '%02d/%s' % (mes.month, mes.year),
'total': tipo_servico.servico_set.filter(data_desativacao=None, data_ativacao__year=mes_atual.year, data_ativacao__month=mes).count()}) 'total': tipo_servico.servico_set.filter(data_ativacao__year=mes.year, data_ativacao__month=mes.month).count()})
result.append( result['servicos'].append(
{'nome': tipo_servico.nome, {'nome': tipo_servico.nome,
'total': tipo_servico.servico_set.filter(data_desativacao=None).count(), 'total': tipo_servico.servico_set.filter(Q(data_ativacao__lt=proximo_mes)&(Q(data_desativacao=None)|Q(data_desativacao__gt=proximo_mes))).count(),
'novos_mes_anterior': tipo_servico.servico_set.filter(data_desativacao=None, data_ativacao__year=mes_anterior.year, data_ativacao__month=mes_anterior.month).count(), 'novos_mes_anterior': tipo_servico.servico_set.filter(data_ativacao__year=mes_anterior.year, data_ativacao__month=mes_anterior.month).count(),
'novos_mes_atual': tipo_servico.servico_set.filter(data_desativacao=None, data_ativacao__year=mes_atual.year, data_ativacao__month=mes_atual.month).count(), 'novos_mes_atual': tipo_servico.servico_set.filter(data_ativacao__year=mes_atual.year, data_ativacao__month=mes_atual.month).count(),
'novos_por_mes': por_mes, 'novos_por_mes': por_mes,
'cor': colors.next(),
} }
) )
@ -210,3 +341,29 @@ def busca_informacoes_diagnostico():
{'title': _(u'Diagnósticos digitados'), 'count': Diagnostico.objects.count()}, {'title': _(u'Diagnósticos digitados'), 'count': Diagnostico.objects.count()},
{'title': _(u'Diagnósticos publicados'), 'count': Diagnostico.objects.filter(publicado=True).count()}, {'title': _(u'Diagnósticos publicados'), 'count': Diagnostico.objects.filter(publicado=True).count()},
] ]
def color_palete():
colors = cycle(['#7cb5ec',
'#434348',
'#90ed7d',
'#f7a35c',
'#8085e9',
'#f15c80',
'#e4d354',
'#8085e8',
'#8d4653',
'#91e8e1', ])
highlights = cycle(['#B0D3F4',
'#8E8E91',
'#BCF4B1',
'#FAC89D',
'#B3B6F2',
'#F79DB3',
'#EFE598',
'#B3B6F1',
'#BB9098',
'#BDF1ED', ])
return (colors, highlights)

12
sigiStatic/css/base_site.css

@ -124,18 +124,6 @@ div#footer a {
width: 18px; width: 18px;
} }
.titlemapbox {
display: inline-block;
margin-bottom: 0.6em;
width: 100%;
}
.mapbox {
text-align: center;
display: inline-block;
float: right;
}
#branding h1 { #branding h1 {
float: left; float: left;
} }

47
sigiStatic/css/style.css

@ -1,3 +1,8 @@
.chartcontainer {
position: relative;
max-height: 400px;
}
div[id^=canvas] { div[id^=canvas] {
padding: 20px 20px 20px 20px; padding: 20px 20px 20px 20px;
min-height: 180px; min-height: 180px;
@ -33,4 +38,46 @@ div[id^=canvas] {
-moz-transition: background-color 200ms ease-in-out; -moz-transition: background-color 200ms ease-in-out;
-o-transition: background-color 200ms ease-in-out; -o-transition: background-color 200ms ease-in-out;
transition: background-color 200ms ease-in-out; transition: background-color 200ms ease-in-out;
}
.line-legend {
list-style: none;
position: absolute;
right: 50px;
top: 18px;
}
.line-legend li span {
display: block;
position: absolute;
left: 0;
top: 0;
width: 20px;
height: 100%;
border-radius: 5px;
}
.line-legend li {
display: block;
padding-left: 30px;
position: relative;
margin-bottom: 4px;
border-radius: 5px;
padding: 2px 8px 2px 28px;
font-size: 14px;
cursor: default;
-webkit-transition: background-color 200ms ease-in-out;
-moz-transition: background-color 200ms ease-in-out;
-o-transition: background-color 200ms ease-in-out;
transition: background-color 200ms ease-in-out;
}
.numeros td, .numeros th {
text-align: right;
}
.numeros tr :first-child {
text-align: left;
}
.servicos tr :first-child {
width: 40%;
}
.panel-footer dl {
margin-bottom: 5px;
} }

63
sigiStatic/js/dashboard.js

@ -0,0 +1,63 @@
$(document).ready(function () {
setlinks();
$("div[data-source]").each(function(index, container) {
var container = $(container);
var url = container.attr('data-source');
get_content(container, url);
});
$("canvas[data-source]").each(function(index, canvas) {
var canvas = $(canvas)
var url = canvas.attr("data-source");
plot_chart(canvas, url);
});
});
function setlinks() {
$("a[data-target]").off('click').on('click', function(e) {
e.preventDefault();
var $this = $(this);
var target = $("#"+$this.attr('data-target'));
var url = $this.attr('href');
if (target.is("canvas")) {
plot_chart(target, url);
} else if (target.is("div")) {
get_content(target, url);
}
});
}
function get_content(container, url) {
$.get(url, function(data) {
container.html(data);
setlinks();
});
}
function plot_chart(canvas, url) {
$.get(url, function(data) {
var new_canvas = $(canvas.clone()).insertBefore(canvas);
canvas.remove();
canvas = new_canvas;
var ctx = canvas.get(0).getContext("2d");
if (data.type == 'pie') {
var myChart = new Chart(ctx).Pie(data.data, data.options);
} else if (data.type == 'line') {
var myChart = new Chart(ctx).Line(data.data, data.options);
} else if (data.type == 'bar') {
var myChart = new Chart(ctx).Bar(data.data, data.options);
}
if (canvas.is("[data-legend-id]")) {
var legend_container = $("#"+canvas.attr("data-legend-id"));
legend_container.html(myChart.generateLegend());
}
if (canvas.is("[data-prevlink-id]")) {
var prevlink = $("#"+canvas.attr("data-prevlink-id"));
prevlink.attr('href', data.prevlink);
}
if (canvas.is("[data-nextlink-id]")) {
var nextlink = $("#"+canvas.attr("data-nextlink-id"));
nextlink.attr('href', data.nextlink);
}
});
}

53
templates/index.html

@ -12,55 +12,14 @@
<script type="text/javascript" src="{% static 'admin/js/jquery.min.js' %}" ></script> <script type="text/javascript" src="{% static 'admin/js/jquery.min.js' %}" ></script>
<script type="text/javascript" src="{% static 'admin/js/jquery.init.js' %}" ></script> <script type="text/javascript" src="{% static 'admin/js/jquery.init.js' %}" ></script>
<script type="text/javascript" src="{% static 'js/Chart.min.js' %}" ></script> <script type="text/javascript" src="{% static 'js/Chart.min.js' %}" ></script>
<script type="text/javascript"> <script type="text/javascript" src="{% static 'js/dashboard.js' %}"></script>
$(document).ready(function () {
var pieData = {
{% for num, dados in dados_graficos_convenio_projeto %}
{{ num }}: [
{% for label, value, color, highlight in dados %}
{
label: "{{ label }}",
value: {{ value }},
color:"{{ color }}",
highlight: "{{ highlight }}"
},
{% endfor %}
],
{% endfor %}
};
$.each(pieData, function(num, data) {
var canvas = $("#canvas-holder-"+num);
var ctx = $("#chart-area-"+num).get(0).getContext("2d");
var myPie = new Chart(ctx).Pie(data);
canvas.append('<div>'+myPie.generateLegend()+'</div>');
});
});
</script>
<style type="text/css">
.numeros td,
.numeros th {
text-align: right;
}
.numeros tr :first-child {
text-align: left;
}
.servicos tr :first-child {
width: 40%;
}
#dashboard-mapa a img {
width: 80%;
}
.panel-footer dl {
margin-bottom: 5px;
}
</style>
{% endblock %} {% endblock %}
{% block content_title %}<h1>{% trans 'Dashboard' %}</h1>{% endblock %} {% block content_title %}
<h1 class="pull-left">{% trans 'Dashboard' %}</h1>
<div class="pull-right"><a href="/dashboard/mapa/"><img src="{% static 'img/mapicon.png' %}" /> {% trans 'Mapa de atuação do Interlegis' %}</a></div>
{% endblock %}
{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/dashboard.css" %}" />{% endblock %} {% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/dashboard.css" %}" />{% endblock %}
@ -74,4 +33,4 @@
<div id="content-main"> <div id="content-main">
{% include "snippets/modules/charts-convenios.html" %} {% include "snippets/modules/charts-convenios.html" %}
</div> </div>
{% endblock %} {% endblock %}

123
templates/snippets/modules/charts-convenios.html

@ -2,94 +2,75 @@
{% load i18n %} {% load i18n %}
<div class="row row-flex row-flex-wrap"> <div class="row row-flex row-flex-wrap">
<div id="resumoseit" class="col-md-6" data-source="{% url "home_resumoseit" %}"></div>
<div class="col-md-6"> <div class="col-md-6">
<div class="panel panel-primary flex-col"> <div class="panel panel-primary flex-col">
<div class="panel-heading">{% trans 'Resumo de informações' %}</div> <div class="panel-heading">{% trans 'Sazonalidade da hospedagem de serviços' %}</div>
<div class="panel-body table-responsive"> <div class="panel-body">
<dl class="dl-horizontal"> <div class="chartcontainer">
<dt class="pilllabel">{% trans 'Resumo por região' %}:</dt> <canvas id="chart-area-evolucao" data-source="{% url "home_chartseit" %}" data-legend-id="area-evolucao-legend" data-prevlink-id="area-evolucao-previlink" data-nextlink-id="area-evolucao-nextlink"></canvas>
<dd> <div id="area-evolucao-legend"></div>
<ul class="nav nav-pills"> <div>
<li><a href="{% url 'convenios-report_regiao_pdf' 'CO' %}">Centro Oeste</a></li> <a id="area-evolucao-previlink" href="#" aria-label="{% trans "Retroceder um mês" %}" data-target="chart-area-evolucao">
<li><a href="{% url 'convenios-report_regiao_pdf' 'NE' %}">Nordeste</a></li> <span class="glyphicon glyphicon-chevron-left pull-left" aria-hidden="true"></span>
<li><a href="{% url 'convenios-report_regiao_pdf' 'NO' %}">Norte</a></li> </a>
<li><a href="{% url 'convenios-report_regiao_pdf' 'SD' %}">Sudeste</a></li> <a id="area-evolucao-nextlink" href="#" aria-label="{% trans "Avançar um mês" %}" data-target="chart-area-evolucao">
<li><a href="{% url 'convenios-report_regiao_pdf' 'SL' %}">Sul</a></li> <span class="glyphicon glyphicon-chevron-right pull-right" aria-hidden="true"></span>
</ul> </a>
</dd> </div>
</dl> </div>
<table class="table table-condensed numeros">
<tr>
{% for item in tabela_resumo_camara.cabecalho_topo %}
<th>{{item}}</th>
{% endfor %}
</tr>
{% for cabecalho,lista in tabela_resumo_camara.lista_zip %}
<tr>
<th>{{cabecalho}}</th>
{% for item in lista %}
<td>{{item}}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
</div> </div>
<div class="panel-footer"> </div>
<dl class="dl-horizontal"> </div>
<dt>{% trans 'Câmaras sem processo' %}</dt> </div>
<dd>{{tabela_resumo_camara.camaras_sem_processo}}</dd>
</dl> <div class="row row-flex row-flex-wrap">
<dl class="dl-horizontal"> <div id="resumo" class="col-md-6" data-source="{% url "casas-carteira" %}?snippet=resumo&s=sim"></div>
<dt>{% trans 'Total de câmaras' %}</dt> <div class="col-md-6">
<dd>{{tabela_resumo_camara.total_camaras}}</dd> <div class="panel panel-primary flex-col">
</dl> <div class="panel-heading">{% trans 'Performance da gerência de carteiras' %}</div>
<div class="panel-body">
<ul class="nav nav-pills" role="tablist">
<li role="presentation"><a href="{% url "home_chartperformance" %}" data-target="chart-performance">{% trans "Todo o Interlegis" %}</a></li>
{% for g in gerentes %}
<li role="presentation"><a href="{% url "home_chartperformance" %}?servidor={{ g.pk }}" data-target="chart-performance">{{ g.user.first_name }}</a></li>
{% endfor %}
</ul>
<div class="chartcontainer">
<canvas id="chart-performance" data-source="{% url "home_chartperformance" %}" data-legend-id="chart-performance-all-legend"></canvas>
<div id="chart-performance-all-legend"></div>
</div>
</div> </div>
</div> </div>
</div> </div>
</div>
<div class="row row-flex row-flex-wrap">
<div class="col-md-6" data-source="{% url "home_resumoconvenios" %}"></div>
<div class="col-md-6"> <div class="col-md-6">
<div class="panel panel-primary flex-col"> <div class="panel panel-primary flex-col">
<div class="panel-heading">{% trans 'Serviços hospedados no Interlegis (SEIT)' %}</div> <div class="panel-heading">{% trans 'Distribuição de Casas por Gerente' %}</div>
<div class="panel-body"> <div class="panel-body">
<div class="titlemapbox"> <div class="chartcontainer">
<div class="mapbox"><a href="/dashboard/mapa/"><img src="{% static 'img/mapicon.png' %}" /><br/>{% trans 'Ver mapa' %}</a></div> <canvas id="chart-carteira" data-source="{% url "home_chartcarteira" %}" data-legend-id="chart-carteira-legend"></canvas>
<div id="chart-carteira-legend"></div>
</div> </div>
<table class="table table-condensed numeros servicos">
{% for servico in tabela_resumo_seit %}
<tr>
{% if forloop.first %}
<th>{{ servico.nome }}</th>
<th>{{ servico.total }}</th>
<th>{{ servico.novos_mes_anterior }}</th>
<th>{{ servico.novos_mes_atual }}</th>
{% else %}
<th class="dropdown">
<a id="ddm-{{ servico.nome }}" data-toggle="dropdown" href="#">{{ servico.nome }}</a>
<table class="table table-condensed numeros servicos dropdown-menu" role="menu" aria-labelledby="ddm-{{ servico.nome }}">
{% for mes in servico.novos_por_mes %}
<tr><th>{{ mes.mes }}</th><td>{{ mes.total }}</td></tr>
{% endfor %}
</table>
</th>
<td>{{ servico.total }}</td>
<td>{{ servico.novos_mes_anterior }}</td>
<td>{{ servico.novos_mes_atual }}</td>
{% endif %}
</tr>
{% endfor %}
</table>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
{% comment %}
<div class="row row-flex row-flex-wrap"> <div class="row row-flex row-flex-wrap">
<div class="col-md-6"> <div class="col-md-6">
<div class="panel panel-primary flex-col"> <div class="panel panel-primary flex-col">
<div class="panel-heading">{% trans 'Convênios assinados por projeto' %}</div> <div class="panel-heading">{% trans 'Convênios assinados por projeto' %}</div>
<div class="panel-body"> <div class="panel-body">
<div id="canvas-holder-1"> <div class="chartcontainer">
<canvas id="chart-area-1" width="150" height="150" /> <div>
<canvas id="chart-area-convenios" width="400" height="400" data-source="{% url "home_chartconvenios" %}" data-legend-id="area-convenios-legend"></canvas>
</div>
<div id="area-convenios-legend"></div>
</div> </div>
</div> </div>
</div> </div>
@ -99,13 +80,13 @@
<div class="panel panel-primary flex-col"> <div class="panel panel-primary flex-col">
<div class="panel-heading">{% trans 'Processos de convênios por projeto' %}</div> <div class="panel-heading">{% trans 'Processos de convênios por projeto' %}</div>
<div class="panel-body"> <div class="panel-body">
<div id="canvas-holder-2"> <div class="chartcontainer">
<canvas id="chart-area-2" width="150" height="150" /> <canvas id="chart-area-processos" width="150" height="150" data-source="{% url "home_chartconvenios" %}?q=assinados" data-legend-id="area-processos-legend"></canvas>
<div id="area-processos-legend"></div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
{% endcomment %}

60
templates/snippets/modules/resumo_convenios.html

@ -0,0 +1,60 @@
{% load i18n %}
<div class="panel panel-primary flex-col">
<div class="panel-heading">{% trans 'Resumo de informações' %}</div>
<div class="panel-body table-responsive">
<dl class="dl-horizontal">
<dt class="pilllabel">{% trans 'Resumo por região' %}:</dt>
<dd>
<ul class="nav nav-pills">
<li><a href="{% url 'convenios-report_regiao_pdf' 'CO' %}">Centro Oeste</a></li>
<li><a href="{% url 'convenios-report_regiao_pdf' 'NE' %}">Nordeste</a></li>
<li><a href="{% url 'convenios-report_regiao_pdf' 'NO' %}">Norte</a></li>
<li><a href="{% url 'convenios-report_regiao_pdf' 'SD' %}">Sudeste</a></li>
<li><a href="{% url 'convenios-report_regiao_pdf' 'SL' %}">Sul</a></li>
</ul>
</dd>
</dl>
<table class="table table-condensed numeros">
<tr>
{% for item in tabela_resumo_camara.cabecalho_topo %}
<th>{{item}}</th>
{% endfor %}
</tr>
{% for cabecalho,lista in tabela_resumo_camara.lista_zip %}
<tr>
<th>{{cabecalho}}</th>
{% for item in lista %}
<td>{{item}}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
</div>
<div class="panel-footer">
<table class="table table-condensed numeros">
<tr>
<th>{% trans 'Total de câmaras' %}</th>
<td>{{ tabela_resumo_camara.total_camaras }}</td>
</tr>
<tr>
<th>{% trans 'Câmaras sem processo' %}</th>
<td>{{ tabela_resumo_camara.camaras_sem_processo }}</td>
</tr>
<tr>
<th>{% trans 'Casas sem convenio que utilizam algum serviço de hospedagem' %} <a href="{% url "home_reportsemconvenio" %}?modo=H" target="_blank" aria-label="{% trans "Listar casas" %}" title="{% trans "Listar casas" %}"><span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span></a></th>
<td>{{ tabela_resumo_camara.sem_convenio.hospedagem|length }}</td>
</tr>
<tr>
<th>{% trans 'Casas sem convenio que utilizam somente serviço de registro' %} <a href="{% url "home_reportsemconvenio" %}?modo=R" target="_blank" aria-label="{% trans "Listar casas" %}" title="{% trans "Listar casas" %}"><span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span></a></th>
<td>{{ tabela_resumo_camara.sem_convenio.registro|length }}</td>
</tr>
<tr>
<th>{% trans 'Casas sem convenio que utilizam algum serviço de registro e/ou hospedagem' %} <a href="{% url "home_reportsemconvenio" %}" target="_blank" aria-label="{% trans "Listar casas" %}" title="{% trans "Listar casas" %}"><span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span></a></th>
<td>{{ tabela_resumo_camara.sem_convenio.total|length }}</td>
</tr>
</table>
</div>
</div>

38
templates/snippets/modules/resumo_seit.html

@ -0,0 +1,38 @@
{% load static from staticfiles %}
{% load i18n %}
<div class="panel panel-primary flex-col">
<div class="panel-heading">{% trans 'Serviços hospedados no Interlegis (SEIT)' %}</div>
<div class="panel-body">
<table class="table table-condensed numeros servicos">
<tr>
{% for s in tabela_resumo_seit.titulos %}
<th>{{ s }}</th>
{% endfor %}
</tr>
{% for servico in tabela_resumo_seit.servicos %}
<tr>
<th class="dropdown">
<a id="ddm-{{ servico.nome }}" data-toggle="dropdown" href="#">{{ servico.nome }}</a>
<table class="table table-condensed numeros servicos dropdown-menu" role="menu" aria-labelledby="ddm-{{ servico.nome }}">
{% for mes in servico.novos_por_mes %}
<tr><th>{{ mes.mes }}</th><td>{{ mes.total }}</td></tr>
{% endfor %}
</table>
</th>
<td>{{ servico.total }}</td>
<td>{{ servico.novos_mes_anterior }}</td>
<td>{{ servico.novos_mes_atual }}</td>
</tr>
{% endfor %}
</table>
<div>
<a href="{% url "home_resumoseit" %}?ano={{ tabela_resumo_seit.mes_anterior.year|safe }}&mes={{ tabela_resumo_seit.mes_anterior.month|safe }}" aria-label="{% trans "Retroceder um mês" %}" data-target="resumoseit">
<span class="glyphicon glyphicon-chevron-left pull-left" aria-hidden="true"></span>
</a>
<a href="{% url "home_resumoseit" %}?ano={{ tabela_resumo_seit.proximo_mes.year|safe }}&mes={{ tabela_resumo_seit.proximo_mes.month|safe }}" aria-label="{% trans "Avançar um mês" %}" data-target="resumoseit">
<span class="glyphicon glyphicon-chevron-right pull-right" aria-hidden="true"></span>
</a>
</div>
</div>
</div>
Loading…
Cancel
Save