From 93af2c4575e02f5c1c95c565e87d56a37b69bd5d Mon Sep 17 00:00:00 2001 From: Kemuel-sepulvida Date: Sat, 22 Aug 2026 15:57:25 -0300 Subject: [PATCH] Feat(Assinatura): receiver do hub grava assinatura_info no shape nativo AB#1473 (#22) A pagina de verificacao le nome_assinante/cargo/data_assinatura/ tipo_certificado_display; o receiver do hub gravava nome/data e omitia cargo, entao a assinatura pelo app aparecia sem nome/cargo/data na verificacao enquanto a nativa aparecia. Alinha as chaves a rotina nativa do SAPL, derivando o cargo do autor. Decisao em ADR-0013. Co-authored-by: Claude Opus 4.8 --- sapl/integracao_hub/views.py | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/sapl/integracao_hub/views.py b/sapl/integracao_hub/views.py index 9debb3794..63836c8ed 100644 --- a/sapl/integracao_hub/views.py +++ b/sapl/integracao_hub/views.py @@ -532,13 +532,36 @@ class RecepcaoAssinaturaView(IntegracaoHubView): nome, ContentFile(conteudo), save=False) # APPEND no formato da sprint — multiassinatura incremental. + # + # As chaves aqui têm que ser as MESMAS que a página pública de + # verificação lê (materia_verificar_documento → + # nome_assinante/cargo/data_assinatura/tipo_certificado_display) + # e que a rotina NATIVA do SAPL grava (views_assinatura, dict + # `nova_assinatura`). Antes gravávamos `nome`/`data` e omitíamos + # `cargo`: a via do app entrava sem nome/cargo/data na tela de + # verificação, enquanto a via nativa aparecia. Isto expande a + # rotina nativa para o receiver do hub (app → amu → micro → hub). + tipo_desc = '' + if getattr(autor, 'tipo', None) is not None: + tipo_desc = (autor.tipo.descricao or '') + cargo = ('Vereador(a)' if 'parlamentar' in tipo_desc.lower() + else (tipo_desc or 'Vereador(a)')) + tipo_cert = (request.data.get('tipo_certificado') or 'A1').upper() + tipo_cert_display = ( + request.data.get('tipo_certificado_display') + or 'ICP-Brasil – %s' % tipo_cert) + assinaturas = self._normalizar(materia.assinatura_info) assinaturas.append({ + # exibidos na verificação pública (mesmas chaves do fluxo nativo) + 'nome_assinante': request.data.get('nome') or autor.nome, + 'cargo': cargo, + 'data_assinatura': + timezone.localtime(agora).strftime('%d/%m/%Y %H:%M:%S'), + 'tipo_certificado': tipo_cert, + 'tipo_certificado_display': tipo_cert_display, + # rastro operacional interno (não exibido na verificação) 'signed_by': titular.username, - 'nome': request.data.get('nome') or autor.nome, - 'data': agora.isoformat(), - 'tipo_certificado': - request.data.get('tipo_certificado') or '', 'operado_por': operado_por, }) materia.assinatura_info = assinaturas