diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py index 16c4f23d6..3738a35bf 100755 --- a/sapl/relatorios/views.py +++ b/sapl/relatorios/views.py @@ -4,7 +4,6 @@ import logging import re import tempfile - from django.core.exceptions import ObjectDoesNotExist from django.http import Http404, HttpResponse from django.utils import timezone @@ -25,7 +24,7 @@ from sapl.sessao.models import (ExpedienteMateria, ExpedienteSessao, Orador, OradorExpediente, OrdemDia, PresencaOrdemDia, SessaoPlenaria, SessaoPlenariaPresenca, OcorrenciaSessao, - RegistroVotacao, VotoParlamentar, OradorOrdemDia, TipoExpediente) + RegistroVotacao, VotoParlamentar, OradorOrdemDia, TipoExpediente, ResumoOrdenacao) from sapl.settings import STATIC_ROOT from sapl.utils import LISTA_DE_UFS, TrocaTag, filiacao_data @@ -58,7 +57,6 @@ def get_kwargs_params(request, fields): def get_cabecalho(casa): - cabecalho = {} cabecalho["nom_casa"] = casa.nome uf_dict = dict(LISTA_DE_UFS) @@ -74,7 +72,6 @@ def get_imagem(casa): def get_rodape(casa): - if len(casa.cep) == 8: cep = casa.cep[:4] + "-" + casa.cep[5:] else: @@ -110,12 +107,11 @@ def get_rodape(casa): def get_materias(mats): - materias = [] for materia in mats: dic = {} dic['titulo'] = materia.tipo.sigla + " " + materia.tipo.descricao \ - + " " + str(materia.numero) + "/" + str(materia.ano) + + " " + str(materia.numero) + "/" + str(materia.ano) dic['txt_ementa'] = materia.ementa dic['nom_autor'] = ', '.join( @@ -250,7 +246,7 @@ def get_capa_processo(prot): for numera in Numeracao.objects.filter(materia=materia_num): # FIXME i18n dic['numeracao'] = 'PROCESSO N° ' + \ - str(numera.numero) + '/' + str(numera.ano) + str(numera.numero) + '/' + str(numera.ano) dic['anulado'] = '' if p.anulado == 1: dic['anulado'] = 'Nulo' @@ -294,7 +290,6 @@ def relatorio_capa_processo(request): def get_ordem_dia(ordem, sessao): - # TODO: fazer implementação de ordem dia pass @@ -361,7 +356,6 @@ def relatorio_documento_administrativo(request): def get_documento_administrativo(docs): - documentos = [] for d in docs: dic = {} @@ -505,7 +499,6 @@ def remove_html_comments(text): def get_sessao_plenaria(sessao, casa): - inf_basicas_dic = {} inf_basicas_dic["num_sessao_plen"] = str(sessao.numero) inf_basicas_dic["nom_sessao"] = sessao.tipo.nome @@ -524,14 +517,14 @@ def get_sessao_plenaria(sessao, casa): if sessao.tipo.nome == 'Solene': inf_basicas_dic["tema_solene"] = sessao.tema_solene - + # Conteudo multimidia cont_mult_dic = {} if sessao.url_audio: cont_mult_dic['multimidia_audio'] = str(sessao.url_audio) else: cont_mult_dic['multimidia_audio'] = 'Indisponível' - + if sessao.url_video: cont_mult_dic['multimidia_video'] = str(sessao.url_video) else: @@ -597,7 +590,7 @@ def get_sessao_plenaria(sessao, casa): # https://github.com/interlegis/sapl/issues/1046 conteudo = re.sub('style=".*?"', '', conteudo) conteudo = re.sub('class=".*?"', '', conteudo) - conteudo = re.sub('align=".*?"', '', conteudo) # OSTicket Ticket #796450 + conteudo = re.sub('align=".*?"', '', conteudo) # OSTicket Ticket #796450 conteudo = re.sub('', '

', conteudo) conteudo = re.sub('', '
', conteudo) # OSTicket Ticket #796450 conteudo = html.unescape(conteudo) @@ -632,8 +625,8 @@ def get_sessao_plenaria(sessao, casa): materia=expediente_materia.materia).first() if numeracao: dic_expediente_materia["des_numeracao"] = ( - str(numeracao.numero_materia) + '/' + str( - numeracao.ano_materia)) + str(numeracao.numero_materia) + '/' + str( + numeracao.ano_materia)) turno, _ = get_turno(materia) @@ -673,20 +666,20 @@ def get_sessao_plenaria(sessao, casa): materias_expediente_votacao_nominal = ExpedienteMateria.objects.filter( sessao_plenaria=sessao, tipo_votacao=2).order_by('-materia') - + for mevn in materias_expediente_votacao_nominal: votos_materia = [] titulo_materia = mevn.materia registro = RegistroVotacao.objects.filter(expediente=mevn) - + if registro: for vp in VotoParlamentar.objects.filter(votacao=registro).order_by('parlamentar'): votos_materia.append(vp) - + dic_expediente_materia_vot_nom = { 'titulo': titulo_materia, 'votos': votos_materia - } + } lst_expediente_materia_vot_nom.append(dic_expediente_materia_vot_nom) # Lista dos oradores do Expediente @@ -734,19 +727,18 @@ def get_sessao_plenaria(sessao, casa): dic_votacao["nom_resultado"] = '' dic_votacao["num_ordem"] = votacao.numero_ordem dic_votacao["id_materia"] = ( - materia.tipo.sigla + ' ' + - materia.tipo.descricao + ' ' + - str(materia.numero) + '/' + - str(materia.ano)) + materia.tipo.sigla + ' ' + + materia.tipo.descricao + ' ' + + str(materia.numero) + '/' + + str(materia.ano)) dic_votacao["des_numeracao"] = ' ' numeracao = materia.numeracao_set.first() if numeracao: - dic_votacao["des_numeracao"] = ( - str(numeracao.numero_materia) + - '/' + - str(numeracao.ano_materia)) + str(numeracao.numero_materia) + + '/' + + str(numeracao.ano_materia)) turno, _ = get_turno(materia) @@ -784,20 +776,20 @@ def get_sessao_plenaria(sessao, casa): materias_ordem_dia_votacao_nominal = OrdemDia.objects.filter( sessao_plenaria=sessao, tipo_votacao=2).order_by('-materia') - + for modvn in materias_ordem_dia_votacao_nominal: votos_materia_od = [] t_materia = modvn.materia registro_od = RegistroVotacao.objects.filter(ordem=modvn) - + if registro_od: for vp_od in VotoParlamentar.objects.filter(votacao=registro_od).order_by('parlamentar'): votos_materia_od.append(vp_od) - + dic_votacao_vot_nom = { 'titulo': t_materia, 'votos': votos_materia_od - } + } lst_votacao_vot_nom.append(dic_votacao_vot_nom) # Lista dos oradores da Ordem do Dia @@ -811,7 +803,7 @@ def get_sessao_plenaria(sessao, casa): parlamentar_orador = Parlamentar.objects.get( id=orador_ordemdia.parlamentar.id ) - + sigla_partido = Filiacao.objects.filter( parlamentar=parlamentar_orador ).first() @@ -820,7 +812,7 @@ def get_sessao_plenaria(sessao, casa): sigla_p = "" else: sigla_p = sigla_partido.partido.sigla - + dic_oradores_ordemdia = { 'num_ordem': orador_ordemdia.numero_ordem, 'nome_parlamentar': parlamentar_orador.nome_parlamentar, @@ -939,7 +931,7 @@ def relatorio_sessao_plenaria(request, pk): lst_presenca_ordem_dia, lst_votacao, lst_votacao_vot_nom, - lst_oradores_ordemdia, + lst_oradores_ordemdia, lst_oradores, lst_ocorrencias) = get_sessao_plenaria(sessao, casa) @@ -973,7 +965,6 @@ def relatorio_sessao_plenaria(request, pk): def get_protocolos(prots): - protocolos = [] for protocolo in prots: dic = {} @@ -983,10 +974,10 @@ def get_protocolos(prots): ts = timezone.localtime(protocolo.timestamp) if protocolo.timestamp: dic['data'] = ts.strftime("%d/%m/%Y") + ' - Horário:' + \ - ts.strftime("%H:%m") + ts.strftime("%H:%m") else: dic['data'] = protocolo.data.strftime("%d/%m/%Y") + ' - Horário:' \ - + protocolo.hora.strftime("%H:%m") + + protocolo.hora.strftime("%H:%m") dic['txt_assunto'] = protocolo.assunto_ementa @@ -1029,7 +1020,7 @@ def relatorio_protocolo(request): response = HttpResponse(content_type='application/pdf') response[ 'Content-Disposition'] = ( - 'inline; filename="relatorio_protocolo.pdf"') + 'inline; filename="relatorio_protocolo.pdf"') casa = CasaLegislativa.objects.first() @@ -1067,7 +1058,7 @@ def relatorio_etiqueta_protocolo(request, nro, ano): response = HttpResponse(content_type='application/pdf') response[ 'Content-Disposition'] = ( - 'inline; filename="relatorio_etiqueta_protocolo.pdf"') + 'inline; filename="relatorio_etiqueta_protocolo.pdf"') casa = CasaLegislativa.objects.first() @@ -1090,7 +1081,6 @@ def relatorio_etiqueta_protocolo(request, nro, ano): def get_etiqueta_protocolos(prots): - protocolos = [] for p in prots: dic = {} @@ -1113,7 +1103,7 @@ def get_etiqueta_protocolos(prots): for materia in MateriaLegislativa.objects.filter( numero_protocolo=p.numero, ano=p.ano): dic['num_materia'] = materia.tipo.sigla + ' ' + \ - str(materia.numero) + '/' + str(materia.ano) + str(materia.numero) + '/' + str(materia.ano) dic['natureza'] = '' if p.tipo_processo == 0: @@ -1125,7 +1115,7 @@ def get_etiqueta_protocolos(prots): for documento in DocumentoAdministrativo.objects.filter( protocolo=p): dic['num_documento'] = documento.tipo.sigla + ' ' + \ - str(documento.numero) + '/' + str(documento.ano) + str(documento.numero) + '/' + str(documento.ano) dic['ident_processo'] = dic['num_materia'] or dic['num_documento'] @@ -1148,7 +1138,7 @@ def relatorio_pauta_sessao(request, pk): response = HttpResponse(content_type='application/pdf') response[ 'Content-Disposition'] = ( - 'inline; filename="relatorio_pauta_sessao.pdf"') + 'inline; filename="relatorio_pauta_sessao.pdf"') casa = CasaLegislativa.objects.first() @@ -1172,7 +1162,6 @@ def relatorio_pauta_sessao(request, pk): def get_pauta_sessao(sessao, casa): - inf_basicas_dic = {} inf_basicas_dic["nom_sessao"] = sessao.tipo.nome inf_basicas_dic["num_sessao_plen"] = sessao.numero @@ -1192,7 +1181,7 @@ def get_pauta_sessao(sessao, casa): dic_expediente_materia = {} dic_expediente_materia["tipo_materia"] = materia.tipo.sigla + \ - ' - ' + materia.tipo.descricao + ' - ' + materia.tipo.descricao dic_expediente_materia["num_ordem"] = str( expediente_materia.numero_ordem) dic_expediente_materia["id_materia"] = str( @@ -1234,7 +1223,7 @@ def get_pauta_sessao(sessao, casa): id=votacao.materia.id).first() dic_votacao = {} dic_votacao["tipo_materia"] = materia.tipo.sigla + \ - ' - ' + materia.tipo.descricao + ' - ' + materia.tipo.descricao dic_votacao["num_ordem"] = votacao.numero_ordem dic_votacao["id_materia"] = str( materia.numero) + "/" + str(materia.ano) @@ -1280,7 +1269,8 @@ def get_pauta_sessao(sessao, casa): inf_basicas_dic, expedientes) -def make_pdf(base_url,main_template,header_template,main_css='',header_css=''): + +def make_pdf(base_url, main_template, header_template, main_css='', header_css=''): html = HTML(base_url=base_url, string=main_template) main_doc = html.render(stylesheets=[]) @@ -1291,7 +1281,7 @@ def make_pdf(base_url,main_template,header_template,main_css='',header_css=''): return get_page_body(box.all_children()) # Template of header - html = HTML(base_url=base_url,string=header_template) + html = HTML(base_url=base_url, string=header_template) header = html.render(stylesheets=[CSS(string='@page {size:A4; margin:1cm;}')]) header_page = header.pages[0] @@ -1301,19 +1291,19 @@ def make_pdf(base_url,main_template,header_template,main_css='',header_css=''): for page in main_doc.pages: page_body = get_page_body(page._page_box.all_children()) page_body.children += header_body.all_children() - + pdf_file = main_doc.write_pdf() return pdf_file -def resumo_ata_pdf(request,pk): +def resumo_ata_pdf(request, pk): base_url = request.build_absolute_uri() casa = CasaLegislativa.objects.first() rodape = ' '.join(get_rodape(casa)) - + sessao_plenaria = SessaoPlenaria.objects.get(pk=pk) - + context = {} context.update(get_identificacao_basica(sessao_plenaria)) context.update(get_mesa_diretora(sessao_plenaria)) @@ -1330,13 +1320,13 @@ def resumo_ata_pdf(request,pk): context.update({'object': sessao_plenaria}) context.update({'data': dt.today().strftime('%d/%m/%Y')}) context.update({'rodape': rodape}) - header_context = {"casa": casa, 'logotipo':casa.logotipo, 'MEDIA_URL': MEDIA_URL} + header_context = {"casa": casa, 'logotipo': casa.logotipo, 'MEDIA_URL': MEDIA_URL} html_template = render_to_string('relatorios/relatorio_ata.html', context) html_header = render_to_string('relatorios/header_ata.html', header_context) - pdf_file = make_pdf(base_url=base_url,main_template=html_template,header_template=html_header) - + pdf_file = make_pdf(base_url=base_url, main_template=html_template, header_template=html_header) + response = HttpResponse(content_type='application/pdf;') response['Content-Disposition'] = 'inline; filename=relatorio.pdf' response['Content-Transfer-Encoding'] = 'binary' @@ -1344,6 +1334,7 @@ def resumo_ata_pdf(request,pk): return response + def cria_relatorio(request, context, html_string, header_info=""): base_url = request.build_absolute_uri() casa = CasaLegislativa.objects.first() @@ -1366,62 +1357,80 @@ def cria_relatorio(request, context, html_string, header_info=""): return response + def relatorio_doc_administrativos(request, context): return cria_relatorio(request, context, 'relatorios/relatorio_doc_administrativos.html') + def relatorio_materia_em_tramitacao(obj, request, context): return cria_relatorio(request, context, 'relatorios/relatorio_materias_em_tramitacao.html') + def relatorio_materia_por_autor(obj, request, context): return cria_relatorio(request, context, 'relatorios/relatorio_materias_por_autor.html') + def relatorio_materia_por_ano_autor(obj, request, context): return cria_relatorio(request, context, 'relatorios/relatorio_materias_por_ano_autor.html') + def relatorio_presenca_sessao(obj, request, context): return cria_relatorio(request, context, 'relatorios/relatorio_presenca_sessao.html') + def relatorio_atas(obj, request, context): return cria_relatorio(request, context, 'relatorios/relatorio_atas.html') + def relatorio_historico_tramitacao(obj, request, context): return cria_relatorio(request, context, 'relatorios/relatorio_historico_tramitacao.html') + def relatorio_fim_prazo_tramitacao(obj, request, context): return cria_relatorio(request, context, 'relatorios/relatorio_fim_prazo_tramitacao.html') + def relatorio_reuniao(obj, request, context): return cria_relatorio(request, context, 'relatorios/relatorio_reuniao.html') + def relatorio_audiencia(obj, request, context): return cria_relatorio(request, context, 'relatorios/relatorio_audiencia.html') + def relatorio_normas_mes(obj, request, context): return cria_relatorio(request, context, 'relatorios/relatorio_normas_mes.html') + def relatorio_normas_vigencia(obj, request, context): return cria_relatorio(request, context, 'relatorios/relatorio_normas_vigencia.html') + def relatorio_historico_tramitacao_adm(obj, request, context): return cria_relatorio(request, context, 'relatorios/relatorio_historico_tramitacao_adm.html') + def relatorio_estatisticas_acesso_normas(obj, request, context): return cria_relatorio(request, context, 'relatorios/relatorio_estatisticas_acesso_normas.html') + def relatorio_documento_acessorio(obj, request, context): return cria_relatorio(request, context, 'relatorios/relatorio_documento_acessorio.html') + def relatorio_normas_por_autor(obj, request, context): return cria_relatorio(request, context, 'relatorios/relatorio_normas_por_autor.html') + 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) - return cria_relatorio(request, context, 'relatorios/relatorio_pauta_sessao.html',info) + info = "Pauta da {} ({} - {}) Legislatura".format(sessao, sessao.legislatura.data_inicio.year, + sessao.legislatura.data_fim.year) + return cria_relatorio(request, context, 'relatorios/relatorio_pauta_sessao.html', info) def relatorio_sessao_plenaria_pdf(request, pk): - base_url=request.build_absolute_uri() + base_url = request.build_absolute_uri() logger = logging.getLogger(__name__) username = request.user.username casa = CasaLegislativa.objects.first() @@ -1441,50 +1450,110 @@ def relatorio_sessao_plenaria_pdf(request, pk): raise Http404('Essa página não existe') (inf_basicas_dic, - cont_mult_dic, - lst_mesa, - lst_presenca_sessao, - lst_ausencia_sessao, - lst_expedientes, - lst_expediente_materia, - lst_expediente_materia_vot_nom, - lst_oradores_expediente, - lst_presenca_ordem_dia, - lst_votacao, - lst_votacao_vot_nom, - lst_oradores_ordemdia, - lst_oradores, - lst_ocorrencias) = get_sessao_plenaria(sessao, casa) - - html_template = render_to_string('relatorios/relatorio_sessao_plenaria.html', - { - "inf_basicas_dic":inf_basicas_dic, - "lst_mesa":lst_mesa, - "lst_presenca_sessao":lst_presenca_sessao, - "lst_ausencia_sessao":lst_ausencia_sessao, - "lst_expedientes":lst_expedientes, - "lst_expediente_materia":lst_expediente_materia, - "lst_oradores_expediente":lst_oradores_expediente, - "lst_presenca_ordem_dia":lst_presenca_ordem_dia, - "lst_votacao":lst_votacao, - "lst_oradores":lst_oradores, - "lst_ocorrencias":lst_ocorrencias, - "rodape":rodape, - "data": dt.today().strftime('%d/%m/%Y') - }) + cont_mult_dic, + lst_mesa, + lst_presenca_sessao, + lst_ausencia_sessao, + lst_expedientes, + lst_expediente_materia, + lst_expediente_materia_vot_nom, + lst_oradores_expediente, + lst_presenca_ordem_dia, + lst_votacao, + lst_votacao_vot_nom, + lst_oradores_ordemdia, + lst_oradores, + lst_ocorrencias) = get_sessao_plenaria(sessao, casa) + + dict_ord_template = { + 'cont_mult': 'conteudo_multimidia.html', + 'exp': 'expedientes.html', + 'id_basica': 'identificacao_basica.html', + 'lista_p': 'lista_presenca_sessao.html', + 'lista_p_o_d': 'lista_presenca_ordemdia.html', + 'mat_exp': 'materias_expediente.html', + 'v_n_mat_exp': 'votos_nominais_expediente.html', + 'mat_o_d': 'materias_ordemdia.html', + 'v_n_mat_o_d': 'votos_nominais_ordemdia.html', + 'mesa_d': 'mesa_diretora.html', + 'oradores_exped': 'oradores_expediente.html', + 'oradores_o_d': 'oradores_ordemdia.html', + 'oradores_expli': 'oradores_explicacoes.html', + 'ocorr_sessao': 'ocorrencias_sessao.html' + } + + context = { + "inf_basicas_dic": inf_basicas_dic, + "cont_mult_dic": cont_mult_dic, + "lst_mesa": lst_mesa, + "lst_expediente_materia_vot_nom": lst_expediente_materia_vot_nom, + "lst_presenca_sessao": lst_presenca_sessao, + "lst_ausencia_sessao": lst_ausencia_sessao, + "lst_expedientes": lst_expedientes, + "lst_expediente_materia": lst_expediente_materia, + "lst_oradores_expediente": lst_oradores_expediente, + "lst_presenca_ordem_dia": lst_presenca_ordem_dia, + "lst_votacao": lst_votacao, + "lst_oradores_ordemdia": lst_oradores_ordemdia, + "lst_votacao_vot_nom": lst_votacao_vot_nom, + "lst_oradores": lst_oradores, + "lst_ocorrencias": lst_ocorrencias, + "rodape": rodape, + "data": dt.today().strftime('%d/%m/%Y') + } + + ordenacao = ResumoOrdenacao.objects.get_or_create()[0] + try: + context.update({ + 'primeiro_ordenacao': dict_ord_template[ordenacao.primeiro], + 'segundo_ordenacao': dict_ord_template[ordenacao.segundo], + 'terceiro_ordenacao': dict_ord_template[ordenacao.terceiro], + 'quarto_ordenacao': dict_ord_template[ordenacao.quarto], + 'quinto_ordenacao': dict_ord_template[ordenacao.quinto], + 'sexto_ordenacao': dict_ord_template[ordenacao.sexto], + 'setimo_ordenacao': dict_ord_template[ordenacao.setimo], + 'oitavo_ordenacao': dict_ord_template[ordenacao.oitavo], + 'nono_ordenacao': dict_ord_template[ordenacao.nono], + 'decimo_ordenacao': dict_ord_template[ordenacao.decimo], + 'decimo_primeiro_ordenacao': dict_ord_template[ordenacao.decimo_primeiro], + 'decimo_segundo_ordenacao': dict_ord_template[ordenacao.decimo_segundo], + 'decimo_terceiro_ordenacao': dict_ord_template[ordenacao.decimo_terceiro], + 'decimo_quarto_ordenacao': dict_ord_template[ordenacao.decimo_quarto] + }) + except KeyError as e: + # self.logger.error("KeyError: " + str(e) + ". Erro ao tentar utilizar " + # "configuração de ordenação. Utilizando ordenação padrão.") + context.update({ + 'primeiro_ordenacao': 'identificacao_basica.html', + 'segundo_ordenacao': 'conteudo_multimidia.html', + 'terceiro_ordenacao': 'mesa_diretora.html', + 'quarto_ordenacao': 'lista_presenca_sessao.html', + 'quinto_ordenacao': 'expedientes.html', + 'sexto_ordenacao': 'materias_expediente.html', + 'setimo_ordenacao': 'votos_nominais_expediente.html', + 'oitavo_ordenacao': 'oradores_expediente.html', + 'nono_ordenacao': 'lista_presenca_ordemdia.html', + 'decimo_ordenacao': 'materias_ordemdia.html', + 'decimo_primeiro_ordenacao': 'votos_nominais_ordemdia.html', + 'decimo_segundo_ordenacao': 'oradores_ordemdia.html', + 'decimo_terceiro_ordenacao': 'oradores_explicacoes.html', + 'decimo_quarto_ordenacao': 'ocorrencias_sessao.html' + }) + + html_template = render_to_string('relatorios/relatorio_sessao_plenaria.html', context) info = "Resumo da {}ª Reunião {} \ da {}ª Sessão Legislativa da {} \ Legislatura".format(inf_basicas_dic['num_sessao_plen'], - inf_basicas_dic['nom_sessao'], - inf_basicas_dic['num_sessao_leg'], - inf_basicas_dic['num_legislatura'] + inf_basicas_dic['nom_sessao'], + inf_basicas_dic['num_sessao_leg'], + inf_basicas_dic['num_legislatura'] ) - html_header = render_to_string('relatorios/header_ata.html',{"casa":casa, - "MEDIA_URL": MEDIA_URL, - "logotipo": casa.logotipo, - "info":info}) + html_header = render_to_string('relatorios/header_ata.html', {"casa": casa, + "MEDIA_URL": MEDIA_URL, + "logotipo": casa.logotipo, + "info": info}) pdf_file = make_pdf(base_url=base_url, main_template=html_template, header_template=html_header) @@ -1494,4 +1563,3 @@ def relatorio_sessao_plenaria_pdf(request, pk): response.write(pdf_file) return response - diff --git a/sapl/static/sapl/css/relatorio.css b/sapl/static/sapl/css/relatorio.css index 6fd166c99..7fdbf1b66 100644 --- a/sapl/static/sapl/css/relatorio.css +++ b/sapl/static/sapl/css/relatorio.css @@ -38,6 +38,7 @@ html body section dl { html body section dt{ width: 50px; + text-align: left; } html body section dd { diff --git a/sapl/templates/relatorios/base_relatorio.html b/sapl/templates/relatorios/base_relatorio.html index a824e3514..542642182 100644 --- a/sapl/templates/relatorios/base_relatorio.html +++ b/sapl/templates/relatorios/base_relatorio.html @@ -8,7 +8,7 @@