CLAUDE.md/AGENTS.md agora apontam para knowledge/AGENTS.md com regras
anti-alucinação explícitas (vale para Claude Code, Codex e Cursor):
não inventar regra/contrato, dizer quando não está documentado, citar o
doc governante, knowledge/ prevalece sobre doc local divergente.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Documentacao oficial em knowledge/ (submodule de docs-ia-projects, branch
main). Path knowledge/ e nao docs/ porque tres repositorios ja tem docs/
proprio ainda nao migrado.
Clone: git clone --recurse-submodules
Atualizar: git -C knowledge pull origin main && git add knowledge
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Adiciona pagina onde o Presidente da Mesa Diretora pode visualizar e
assinar em lote, com um unico certificado A1, TODOS os documentos
acessorios do tipo "Despacho" ainda pendentes de assinatura digital
(filtro frouxo: tipo__descricao__icontains "despacho").
Reuso integral do backend ja existente:
- docacessorio_assinar_lote() em views_assinatura.py ja aceita PKs de
documentos de multiplas materias num unico POST.
- Modal de 4 passos (selecao -> certificado -> previa -> progresso ->
resumo) extraido de documentoacessorio_list.html para partial
reusavel e incluido nos dois templates (refactor mecanico, HTML/JS
byte-a-byte identico).
Acesso: restrito ao grupo SGVP_GROUP_PRESIDENTE_MESA (ou superuser
para depuracao); demais usuarios recebem 403. Atalhos pra tela
aparecem so quando usuario esta no grupo:
- "Pesquisar Materia Legislativa" (botao na linha de filtro de
assinatura)
- "Materias Pendentes de Assinatura" (botao no bloco de acoes)
Arquivos:
- sapl/materia/views.py: ListView DespachosPendentesLoteView nova +
flag is_presidente_mesa nos contextos das views existentes.
- sapl/materia/urls.py: rota /materia/despachos-pendentes-lote.
- sapl/templates/materia/assinatura_doc_lote_modal.html (novo): partial
com modal completo.
- sapl/templates/materia/despachos_pendentes_lote_list.html (novo):
tela do presidente.
- sapl/templates/materia/documentoacessorio_list.html: substitui modal
embedded por include do partial.
- sapl/templates/materia/materialegislativa_filter.html: atalho.
- sapl/templates/materia/materias_pendentes_assinatura_list.html: atalho.
A condição em materialegislativa_detail.html exigia numero_protocolo
para mostrar o bloco com botão Assinar PDF Digitalmente, Ver PDF
Assinado, Todos em PDF e Todos em ZIP. Como o template de listagem
(materialegislativa_filter.html) já mostra a tag Pendente de
Assinatura baseado apenas em texto_original (sem exigir protocolo),
havia inconsistência: a matéria aparecia como pendente na lista mas
ao abrir o detalhe o autor não tinha botão para assinar.
Remove a exigência de numero_protocolo da condição externa. Os botões
internos preservam suas condições próprias (is_autor/can_edit_materia,
not ja_assinou, etc).
A borda era desenhada no TextBoxStyle (tamanho do texto), ficando menor
que o bloco. Movida para o TextStampStyle (tamanho da annotation box)
para coincidir com os blocos do ReportLab. Texto alinhado topo-esquerdo.
O parâmetro avg_width do SimpleFontEngineFactory estava com valor 600
(unidades glyph space) quando o pyhanko espera fração do font_size (0.5).
Isso causava largura natural do texto de ~105.000pt, e o SHRINK_TO_FIT
reduzia a escala para ~0.2%, tornando o texto invisível nos stamps
das assinaturas subsequentes.
- Adicionar validador combinado (documentos + imagens) para DocumentoAcessorio
- Criar modelo AnexoProposicao para anexos durante edição de proposição
- Adicionar upload drag-and-drop na lista de Documentos Acessórios da matéria
- Adicionar seção de anexos na tela do editor OnlyOffice de proposição
- Transferir anexos automaticamente para DocumentoAcessorio ao incorporar proposição
- Corrige fonte dos stamps subsequentes de Courier para Helvetica
- Elimina borda dupla (border_width=0 no outer, 1 no inner)
- Substitui y_base=500 fixo por grid dinâmico baseado nas dimensões da página
- Unifica col_width entre ReportLab e pyhanko (era 70mm vs calculado)
- Footer (código, QR, URL, aviso legal) em posição fixa no rodapé (68mm)
- Adiciona Hash do documento abaixo da Data em cada bloco de assinatura
- Suporta até 14 assinaturas por página de autenticação
Signed-off-by: rangelbruno <rangelbruno@users.noreply.github.com>
Assinaturas após a primeira usavam a aparência padrão do pyhanko
em vez do template customizado da página de autenticação. Agora
usa PdfSigner com TextStampStyle para manter o visual consistente.
Remove a página de documentação customizada (/api/doc/) e adiciona
card de atalho para Swagger UI e ReDoc na tela inicial do administrador.
Corrige ReDoc em branco fixando versão estável do CDN.
Adiciona /api/doc/ com documentação auto-gerada de todos os endpoints
REST, incluindo testador interativo com suporte a GET, POST, PUT, PATCH
e DELETE, autenticação por token e busca por endpoints.
Adiciona fluxo intermediário de revisão pelo Setor Legislativo antes do
envio ao Protocolo, protegido por feature flag (desabilitado por padrão).
- Novos campos: data_envio_setor, data_retorno_setor, usuario_envio_setor,
usuario_retorno_setor, observacao_setor em Proposicao
- Flag revisao_setor_legislativo em AppConfig (Sistema > Configurações)
- Novo grupo "Operador do Setor Legislativo" com permissões específicas
- Ações send_setor e return_from_setor no DetailView
- Views ProposicaoPendenteSetor (inbox) e RevisarProposicaoSetor
- OnlyOffice: setor pode editar documento quando proposição está com eles
- Status S (Enviada ao Setor) e V (Revisada pelo Setor) no histórico
- Templates: badges, alertas, botões condicionais e subnav
- Fonte Arial forçada em todos os slots XML (ascii, hAnsi, eastAsia, cs)
nos documentos criados via python-docx e na numeração de matéria
- Substituir alert() nativo por SweetAlert2 nos 3 templates do editor
- Corrigir beforeunload que disparava sem alterações no documento
- 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.2
Permite que múltiplos co-autores assinem o mesmo documento sequencialmente.
O primeiro assinante usa o fluxo atual (ReportLab + pyhanko), e os subsequentes
adicionam assinatura incremental preservando as anteriores. Template mostra
botões "Ver PDF Assinado" e "Assinar" simultaneamente, e o card lista todos
os assinantes. Backward-compatible com assinatura_info legado (dict → lista).
Co-Authored-By: rangelbruno <rangelbruno@users.noreply.github.com>
Adiciona opção de baixar matéria + acessórios mesclados em um único PDF,
além do ZIP já existente. Reorganiza botões da página de detalhe com
flex-wrap responsivo e cores distintas para cada ação.
Permite baixar ZIP com o PDF da matéria (assinado ou original) junto
com todos os documentos acessórios. Botão aparece na página de detalhe
e na pesquisa de matérias quando há documentos acessórios cadastrados.
Adiciona verificação de signer None antes de acessar signing_cert,
evitando erro 'NoneType object has no attribute signing_cert' ao
assinar matéria e documento acessório com certificado inválido.
Signed-off-by: rangelbruno
Permite atribuir o grupo "Presidente da Mesa Diretora" diretamente ao usuário
na tela /sistema/usuario/, como alternativa à verificação via Mesa Diretora
cadastrada na Sessão Legislativa.
Signed-off-by: rangelbruno
- Renomeia DEBUG para DJANGO_DEBUG nos docker-compose de dev,
alinhando com o que settings.py espera via python-decouple
- Corrige bug em menus.py onde itens com check_permission tinham
a URL limpa mesmo quando o usuário possuía a permissão,
causando o menu Sistema vazio
Signed-off-by: rangelbruno <rangelbruno@users.noreply.github.com>