mirror of https://github.com/interlegis/sapl.git
Browse Source
- Substitui carimbo sobreposto na última página por página dedicada de autenticação no final do PDF com blocos de assinatura, código de autenticação (SHA-256 truncado) e QR Code - Remove exposição de CPF do PDF e da interface web - Adiciona campo codigo_autenticacao em MateriaLegislativa e DocumentoAcessorio com migration - Adiciona views públicas de verificação (/materia/<pk>/verificar/ e /materia/documentoacessorio/<pk>/verificar/) sem exigir login - Cria template verificar_assinatura.html com status verde/vermelho - Adiciona botão "Verificar Autenticidade" nos templates de detail - Corrige lookup de cargo do assinante via Autor.operadores - Corrige URL de download para OnlyOffice usando build_onlyoffice_url - Melhora layout dos botões de ação na página de detail da matéria - Adiciona dependência qrcode[pil]==7.4.2pull/3858/head
8 changed files with 835 additions and 514 deletions
@ -0,0 +1,23 @@ |
|||
# Generated by Django 2.2.28 on 2026-02-21 19:46 |
|||
|
|||
from django.db import migrations, models |
|||
|
|||
|
|||
class Migration(migrations.Migration): |
|||
|
|||
dependencies = [ |
|||
('materia', '0090_add_assinatura_digital_documentoacessorio'), |
|||
] |
|||
|
|||
operations = [ |
|||
migrations.AddField( |
|||
model_name='documentoacessorio', |
|||
name='codigo_autenticacao', |
|||
field=models.CharField(blank=True, db_index=True, max_length=16, null=True, verbose_name='Código de Autenticação'), |
|||
), |
|||
migrations.AddField( |
|||
model_name='materialegislativa', |
|||
name='codigo_autenticacao', |
|||
field=models.CharField(blank=True, db_index=True, max_length=16, null=True, verbose_name='Código de Autenticação'), |
|||
), |
|||
] |
|||
File diff suppressed because it is too large
@ -0,0 +1,138 @@ |
|||
{% extends "base.html" %} |
|||
{% load i18n %} |
|||
|
|||
{% block head_title %}{% trans "Verificação de Autenticidade" %} - {{ tipo_documento }}{% endblock %} |
|||
|
|||
{% block base_content %} |
|||
<div class="container mt-4 mb-5"> |
|||
<div class="row justify-content-center"> |
|||
<div class="col-lg-8"> |
|||
|
|||
<h3 class="text-center mb-4"> |
|||
<i class="fa fa-shield"></i> {% trans "Verificação de Autenticidade" %} |
|||
</h3> |
|||
|
|||
{% if valido %} |
|||
{# Status: VÁLIDO #} |
|||
<div class="card border-success mb-4"> |
|||
<div class="card-header bg-success text-white text-center"> |
|||
<h4 class="mb-0"> |
|||
<i class="fa fa-check-circle"></i> {% trans "Documento Autêntico" %} |
|||
</h4> |
|||
</div> |
|||
<div class="card-body"> |
|||
<p class="text-center text-success mb-0"> |
|||
{% trans "O código de autenticação informado é válido. Este documento foi assinado digitalmente e sua integridade está confirmada." %} |
|||
</p> |
|||
</div> |
|||
</div> |
|||
{% elif codigo_informado %} |
|||
{# Status: INVÁLIDO #} |
|||
<div class="card border-danger mb-4"> |
|||
<div class="card-header bg-danger text-white text-center"> |
|||
<h4 class="mb-0"> |
|||
<i class="fa fa-times-circle"></i> {% trans "Código Inválido" %} |
|||
</h4> |
|||
</div> |
|||
<div class="card-body"> |
|||
<p class="text-center text-danger mb-0"> |
|||
{% trans "O código de autenticação informado NÃO corresponde a este documento. O documento pode ter sido alterado ou o código está incorreto." %} |
|||
</p> |
|||
</div> |
|||
</div> |
|||
{% else %} |
|||
{# Sem código informado #} |
|||
<div class="card border-warning mb-4"> |
|||
<div class="card-header bg-warning text-center"> |
|||
<h4 class="mb-0"> |
|||
<i class="fa fa-exclamation-triangle"></i> {% trans "Código não informado" %} |
|||
</h4> |
|||
</div> |
|||
<div class="card-body"> |
|||
<p class="text-center mb-0"> |
|||
{% trans "Nenhum código de autenticação foi informado para verificação." %} |
|||
</p> |
|||
</div> |
|||
</div> |
|||
{% endif %} |
|||
|
|||
{# Dados do Documento #} |
|||
<div class="card mb-4"> |
|||
<div class="card-header"> |
|||
<h5 class="mb-0"><i class="fa fa-file-text"></i> {% trans "Dados do Documento" %}</h5> |
|||
</div> |
|||
<div class="card-body"> |
|||
<table class="table table-sm table-borderless mb-0"> |
|||
<tr> |
|||
<th style="width: 200px;">{% trans "Tipo" %}</th> |
|||
<td>{{ tipo_documento }}</td> |
|||
</tr> |
|||
<tr> |
|||
<th>{% trans "Documento" %}</th> |
|||
<td>{{ descricao_documento }}</td> |
|||
</tr> |
|||
{% if ementa %} |
|||
<tr> |
|||
<th>{% trans "Ementa" %}</th> |
|||
<td>{{ ementa }}</td> |
|||
</tr> |
|||
{% endif %} |
|||
{% if codigo_autenticacao %} |
|||
<tr> |
|||
<th>{% trans "Código de Autenticação" %}</th> |
|||
<td><code>{{ codigo_autenticacao }}</code></td> |
|||
</tr> |
|||
{% endif %} |
|||
</table> |
|||
</div> |
|||
</div> |
|||
|
|||
{# Lista de Assinaturas #} |
|||
{% if assinaturas %} |
|||
<div class="card mb-4"> |
|||
<div class="card-header"> |
|||
<h5 class="mb-0"> |
|||
<i class="fa fa-certificate"></i> {% trans "Assinaturas Digitais" %} |
|||
<span class="badge badge-primary ml-1">{{ assinaturas|length }}</span> |
|||
</h5> |
|||
</div> |
|||
<div class="card-body p-0"> |
|||
<table class="table table-striped mb-0"> |
|||
<thead> |
|||
<tr> |
|||
<th>{% trans "Assinante" %}</th> |
|||
<th>{% trans "Cargo" %}</th> |
|||
<th>{% trans "Data/Hora" %}</th> |
|||
<th>{% trans "Certificado" %}</th> |
|||
</tr> |
|||
</thead> |
|||
<tbody> |
|||
{% for assinatura in assinaturas %} |
|||
<tr> |
|||
<td><strong>{{ assinatura.nome_assinante }}</strong></td> |
|||
<td>{{ assinatura.cargo }}</td> |
|||
<td>{{ assinatura.data_assinatura }}</td> |
|||
<td>{{ assinatura.tipo_certificado_display }}</td> |
|||
</tr> |
|||
{% endfor %} |
|||
</tbody> |
|||
</table> |
|||
</div> |
|||
</div> |
|||
{% endif %} |
|||
|
|||
{# Links úteis #} |
|||
<div class="text-center mt-4"> |
|||
<a href="https://validar.iti.gov.br/" class="btn btn-outline-info" target="_blank"> |
|||
<i class="fa fa-external-link"></i> {% trans "Validar assinatura no ITI (validar.iti.gov.br)" %} |
|||
</a> |
|||
</div> |
|||
|
|||
<p class="text-muted text-center mt-3 small"> |
|||
{% trans "Documento assinado digitalmente nos termos da Medida Provisória nº 2.200-2/2001." %} |
|||
</p> |
|||
|
|||
</div> |
|||
</div> |
|||
</div> |
|||
{% endblock base_content %} |
|||
Loading…
Reference in new issue