O SGDP é uma aplicação web multiusuário para a Procuradoria-Geral municipal gerenciar seus documentos jurídicos — Leis, Decretos, Portarias, Pareceres e Ofícios. O sistema controla numeração automática, armazena os PDFs assinados digitalmente e oferece busca, auditoria e backup completo.
Compartilha a arquitetura (servidor Python + SQLite + frontend single-file, sem nada a instalar) com os sistemas irmãos SGCD, SGCA e SGEA.
Funciona em rede local: um único computador executa o servidor e todos os procuradores acessam pelo navegador via IP ou localhost.
- Gestão de 5 tipos de documento: Lei, Decreto, Portaria, Parecer e Ofício
- Numeração automática por tipo e ano, com possibilidade de ajuste manual — Lei e Decreto usam numeração histórica contínua (nunca reinicia por ano), com separador de milhar
- Ofício Interno — numeração própria e separada por departamento (Procuradoria-Geral/Gabinete), com sufixo automático (ex: "nº 001/2026 PG"), sem colidir com a sequência normal de Ofício
- Últimos instrumentos no Dashboard — cada card de tipo mostra a numeração mais recente cadastrada (ex: Última Lei: 012/2026)
- Campo Assunto com categorias dinâmicas: 14 gerais e 46 jurídicas específicas para Parecer
- Campos específicos por tipo — Parecer: PA + Modalidade licitatória (ativados por assunto); Portaria: tipo de ato e cargo
- Relatório Gerencial — produção por tipo, assunto e mês com filtros de período e gráfico SVG
- Sons de notificação — feedback sonoro para cliques, sucesso e erro via Web Audio API
- Brasão do município na sidebar, configurável e persistido no servidor (visível para todos os procuradores)
- Upload e visualização de PDF assinado diretamente no navegador
- Login multiusuário — a sessão se renova sozinha enquanto a aba está aberta e expira cerca de um minuto depois de fechada; até N procuradores simultâneos
- Busca e filtros por número, ementa, partes envolvidas e ano
- Trilha de auditoria completa de todas as ações (criar, editar, excluir, upload)
- Gestão de usuários com perfil administrador e perfil padrão, cada um com departamento fixo (Procuradoria-Geral ou Gabinete)
- Documentos sigilosos — marcação opcional (só pra Parecer, Portaria e Ofício — Lei e Decreto nunca podem ser sigilosos) que restringe a visibilidade e a edição a quem criou e a administradores; documentos não-sigilosos podem ser editados por qualquer colega do mesmo departamento de quem criou. Coluna "Origem" no Dashboard e nas listagens mostra o departamento de cada documento
- Exportação com diálogo "Salvar Como" — todo botão de exportar/baixar (PDF, CSVs de relatório e auditoria, backups) abre o explorador nativo do Windows na máquina servidora; cai no download tradicional pra Downloads ao acessar por outro computador na rede
- Backup e restauração — exporta JSON com todos os documentos e PDFs; backup automático do banco em pacote
.zip(banco + pasta de anexos), cuja restauração repõe também os PDFs (backups.dbantigos continuam sendo aceitos, sem os anexos) - Sincronização de backup entre agentes — mescla dados de outra instalação (soma o que é novo, revisa o que conflita) sem substituir o banco inteiro
- Navegação persistente — F5 mantém o usuário na tela atual via
location.hash - Encerramento do sistema com tela de confirmação e desligamento do servidor
- Diagnóstico de rede — verifica IP, porta 3001, regras de firewall e acessibilidade pela LAN; disponível como script independente e no menu de inicialização
- Lixeira — exclusão reversível com restauração em até 30 dias, tanto para documentos quanto para lembretes
- Agenda — lembretes com prazo, vinculáveis a documentos
- Envio por e-mail — anexa o PDF assinado e envia via SMTP configurável
- Importação em lote via CSV — cadastro de múltiplos documentos de uma vez
- Personalização visual — largura do conteúdo (compacta/expandida) e cor de destaque (institucional/azul/verde/roxo)
- Histórico de revisões — cada edição de documento guarda os campos anteriores, com autor e data/hora
- Notificação de prazo por e-mail — avisa automaticamente o responsável (ou um e-mail padrão) quando um lembrete vence
- Resumo diário por e-mail — envia diariamente um resumo de lembretes vencidos e vencendo em breve, mesmo sem ninguém logado
- Busca full-text (FTS5) — pesquisa em ementa, partes e observações por palavras (não só substring), com índice sincronizado automaticamente
- Etiquetas (tags) livres — categorização adicional além do Assunto fixo, com autocomplete e filtro por etiqueta
- Vínculos entre documentos — relação tipada (revoga, altera, complementa, referencia) navegável nos dois sentidos
- Exportação do relatório — CSV com os dados brutos do período, e impressão/PDF limpo (sem menu/sidebar)
- Exportação da Trilha de Auditoria em CSV, respeitando os filtros ativos na tela
- Sincronização de auditoria entre instâncias — a sincronização de backup também mescla o histórico de auditoria, preservando autor e data originais
- Relatórios em papel timbrado — Pendências e Prazos, Produtividade por Usuário, Certidão de Documento, Certidão Negativa de Pendências, Certidões em lote, Cadeia Normativa, Relatório de Etiquetas e Backup e Integridade (admin), no mesmo padrão documental do SGCD (brasão, Times New Roman, bloco de assinatura manuscrita)
- Comparativo entre períodos no Relatório Gerencial — variação (▲/▼, diferença e percentual) contra o intervalo de mesma duração imediatamente anterior
- Aviso de edição simultânea — se outro procurador salvar o mesmo documento enquanto sua tela está aberta, a gravação é recusada com aviso para reabrir o documento, em vez de sobrescrever o trabalho do colega
- Erros recentes — tela no Diagnóstico (administrador) com os erros registrados em log rotativo, agrupados por tipo e contagem, incluindo os ocorridos no navegador dos usuários; travamentos graves ficam em
*_crash.log
- Python 3.8+
- Google Chrome ou Microsoft Edge (recomendado)
- Windows 10/11
- Nada a instalar além do Python — o SGDP usa a biblioteca padrão e o servidor waitress, que já vem vendorizado na pasta
waitress/do próprio repositório (não é stdlib, mas não exigepip installnem acesso à internet)
Servidor sem Python instalado (ex.: Windows Server bloqueado por política de TI): o
Iniciar SGDP.batdetecta automaticamente a ausência do Python e extrai uma versão portátil (embarcável, sem instalador) incluída no próprio projeto (python-3.12.9-embed-amd64.zip) paraC:\Python312-embed\— não exige instalação nem privilégio de administrador.
- Copie a pasta
SGDP/para o computador que atuará como servidor - Clique duas vezes em
Iniciar SGDP.bat - No menu que aparecer no terminal, escolha [2] Iniciar Servidor (ou aguarde — é a opção padrão)
- Faça login com as credenciais iniciais abaixo — o sistema exige a troca de senha no primeiro acesso
⚠️ Importante: abrir oSGDP.htmldiretamente pelo navegador (sem o servidor) impede o funcionamento do sistema. Use sempre oIniciar SGDP.bat.
| Campo | Valor |
|---|---|
| Usuário | admin |
| Senha | admin123 |
O Iniciar SGDP.bat abre um menu no terminal:
| Opção | Descrição |
|---|---|
| [1] Diagnóstico | Verifica e corrige automaticamente rede, porta e firewall (pede elevação de Administrador quando necessário) |
| [2] Iniciar Servidor | Sobe o servidor e mantém rodando continuamente — atende uso individual e em rede. Só encerra com Ctrl+C no terminal ou fechando a janela |
O sistema foi projetado para uso multiusuário em rede local (LAN): uma única máquina executa o servidor (e guarda o banco de dados) e os demais procuradores acessam pelo navegador, sem instalar nada.
Na máquina servidora (uma vez só):
- Execute
Liberar Porta SGDP.batcomo Administrador (botão direito → Executar como administrador) — cria a regra no Firewall do Windows liberando a porta 3001 para conexões de entrada - Inicie o sistema pelo
Iniciar SGDP.bate deixe a máquina ligada — ao iniciar, o console mostra o endereço de rede pronto para distribuir (Rede: http://<IP>:3001/SGDP.html)
Nas outras máquinas: basta abrir o navegador (Chrome ou Edge) no endereço do servidor:
http://192.168.x.x:3001/SGDP.html
Cada procurador faz login com sua própria conta — o servidor atende acessos simultâneos e todos enxergam os mesmos dados.
Se a conexão não funcionar, execute Diagnostico SGDP.bat (ou a opção [1] do Iniciar SGDP.bat) na máquina servidora: ele descobre o IP e verifica a acessibilidade pela rede.
⚠️ Uso restrito à rede interna. A comunicação é HTTP simples (sem criptografia de transporte) — adequado para uma LAN interna confiável, mas nunca exponha a porta do sistema à internet (redirecionamento de porta no roteador, DMZ etc.). Para acesso remoto, use a VPN institucional.
SGDP/
├── SGDP.html # Frontend — aplicação web completa
├── server.py # Servidor Python (API REST + SQLite + uploads)
├── sgx_base.py # Camada compartilhada da família (sessões, backup, log de erros)
├── base.css # Estilos compartilhados da família (cópia distribuída)
├── base.js # Helpers de front compartilhados da família (cópia distribuída)
├── _esqueleto.sha256 # Manifesto de conferência das cópias compartilhadas (checado no CI)
├── waitress/ # Servidor WSGI vendorizado (não precisa instalar nada)
├── scripts/ # Scripts de apoio ao desenvolvimento (lint, verificação do esqueleto)
├── tests/ # Suíte de testes automatizados do backend
│ ├── test_server.py
│ └── e2e/ # Testes E2E (Playwright) — navegador real de ponta a ponta
├── Iniciar SGDP.bat # Inicializa o servidor
├── python-3.12.9-embed-amd64.zip # Python portátil (fallback se não houver Python instalado)
├── get-pip.py # Usado só pelo script acima (Python embarcável não vem com pip)
├── Criar Atalho SGDP.bat # Cria atalho na área de trabalho com ícone
├── Criar Atalho SGDP.ps1 # Script PowerShell de criação do atalho
├── Diagnostico SGDP.bat # Roda o diagnóstico de rede (clique duplo)
├── Liberar Porta SGDP.bat # Cria regra de firewall para porta 3001 (Admin)
├── diagnostico.py # Script de diagnóstico de rede e firewall
├── sgdp.ico # Ícone personalizado do sistema
├── sgdp.db # Banco de dados SQLite (criado automaticamente)
├── uploads/ # PDFs armazenados (criado automaticamente)
├── backups/ # Backups automáticos (criado automaticamente)
├── requirements.txt # Nada a instalar via pip (stdlib + waitress vendorizado)
├── README.md
├── CHANGELOG.md
└── MANUAL.html
| Documento | Descrição |
|---|---|
| PDF assinado do documento | Impressão ou download do PDF anexado ao registro (o sistema não gera o corpo do documento) |
| Certidão de Documento | Certidão de existência e teor de um documento |
| Certidão Negativa de Pendências | Declaração de inexistência de pendências |
| Certidões em Lote | Emissão de certidões de vários documentos de uma vez |
| Relatório de Cadeia Normativa | Vínculos entre normas (altera, revoga, regulamenta) |
| Relatório de Etiquetas | Etiquetas para organização física dos documentos |
| Relatório de Pendências | Documentos com pendências |
| Relatório de Produtividade | Produção por período e por autor |
| Relatório de Integridade | Estado do banco, backups e contagens |
Todos os documentos abrem em janela separada com botão "🖨 Imprimir / Salvar PDF".
- Senhas armazenadas com PBKDF2-HMAC-SHA256 e salt aleatório por usuário
- Sessões de curta duração, renovadas automaticamente enquanto a aba do sistema está aberta e invalidadas cerca de um minuto após ela ser fechada
- Acesso à API exige token de sessão em todas as rotas (exceto login e verificação)
- Upload restrito a PDF, com limite de 50 MB
- Trilha de auditoria imutável registra todas as ações com usuário e timestamp
- Verificação de integridade do banco de dados (SQLite
PRAGMA integrity_check) na inicialização - Recomenda-se uso em rede interna (LAN) apenas
| Tecnologia | Uso |
|---|---|
| HTML5 + CSS3 | Interface da aplicação, temas claro/escuro, layout responsivo |
| JavaScript puro (ES6+) | Toda a lógica de negócio, sem frameworks externos |
| Python 3 (stdlib) | Servidor local: REST API, SQLite, auth, SMTP |
| waitress | Servidor WSGI que atende as requisições — vendorizado em waitress/, sem instalação |
| SQLite | Armazenamento persistente dos dados (sgdp.db), com índice FTS5 para busca full-text |
O sistema em si continua sem nada a instalar: Python stdlib + HTML puro, mais o waitress já incluído no repositório. Para quem for alterar o código, há um lint opcional que verifica variáveis indefinidas no JavaScript de SGDP.html:
npm install # uma vez, instala apenas o ESLint (ferramenta de dev, não é usada em produção)
npm run lintParte do código é compartilhada com os outros sistemas da família (SGCD, SGCA e SGEA): base.css, base.js e sgx_base.py são cópias distribuídas a partir de uma fonte única, que fica fora deste repositório. Editar essas cópias aqui funciona e passa no lint — mas a alteração é silenciosamente sobrescrita na próxima distribuição. Por isso o CI confere as cópias contra o manifesto _esqueleto.sha256 e quebra o build se elas divergirem:
python scripts/verificar_esqueleto.pyHá também uma suíte de testes automatizados do backend (server.py), usando só unittest da stdlib — sobe o servidor real contra um banco e uploads temporários e testa os endpoints REST (login, documentos, departamento/sigiloso, usuários, vínculos, tags, revisões, importação CSV, arquivos, relatórios, lembretes, auditoria, config, backup/restore e sincronização):
python -m unittest discover -s tests -vHá também uma suíte de testes E2E (tests/e2e/), usando Playwright — sobe o servidor real e dirige um Chromium de verdade pelo fluxo completo (login com troca de senha obrigatória, criar documento):
npm install
npx playwright install chromium # uma vez, baixa o navegador de teste
npm run test:e2eRoda contra um banco/uploads/backups temporários (nunca o sgdp.db real), criados e descartados automaticamente a cada execução.
Consulte o CHANGELOG.md para o histórico completo de versões e alterações.
Contribuições são bem-vindas! Veja o CONTRIBUTING.md para orientações sobre como reportar bugs, sugerir funcionalidades e enviar Pull Requests.
Distribuído sob a licença MIT. Veja LICENSE para o texto completo.
Aviso: Os dados ficam armazenados no arquivo
sgdp.dbna pasta do sistema. Faça backups regulares em Configurações → Dados e mantenha cópia dosgdp.dbem local seguro.