Ferramenta que lê o relatório de não conformidades exportado do sistema de fiscalização, recorta as fotos de cada NC, monta o PDF de evidência no padrão exigido pelo órgão regulador e prepara o e-mail de envio agrupado por disciplina.
O relatório de não conformidades sai do sistema de fiscalização como um PDF único com centenas de blocos, cada um com suas fotos de antes e depois misturadas na página. Cada NC precisava virar um PDF separado, no layout do órgão regulador, nomeado segundo a disciplina, e depois ser enviada por e-mail ao executor certo. Feito à mão, era um dia inteiro de recortar imagem, digitar km e sentido e arrastar anexo, com erro de digitação chegando ao documento oficial.
- Lê o PDF exportado e separa os blocos de NC, mesmo quando uma NC ocupa várias páginas, do cabeçalho até a linha de encerramento
- Extrai rodovia, km inicial e final, sentido, data, classificação e tipo, e sugere o nome do arquivo no padrão usado pela equipe
- Recupera todas as fotos do bloco com o rótulo original e sugere qual é o antes e qual é o depois pela posição na página
- Permite corrigir o pareamento na tela antes de gerar, porque laudo torto existe e o automático sozinho erraria em silêncio
- Gera o PDF de evidência com os pares empilhados, três por página, cabeçalho completo repetido em toda página
- Agrupa os PDFs por disciplina através de palavras-chave configuráveis e monta um e-mail por disciplina no Outlook, com os anexos e a assinatura do usuário
- Busca dados e fotos direto na API do sistema interno de fiscalização, quando a credencial está configurada, evitando a exportação manual
- Tem uma versão online, em HTML e Supabase, para quem precisa acompanhar sem instalar nada
![]() |
![]() |
As três imagens acima são placeholders. A lista dos prints que faltam está no fim deste arquivo.
| Escolha | Por que |
|---|---|
| Flask local mais navegador, no lugar da janela embutida | A primeira versão usava pywebview, mas o WebView2 nem sempre existia na máquina corporativa e o empacotamento era frágil. O navegador do usuário já está lá e depurar nele é muito mais rápido |
PyMuPDF para ler e reportlab para gerar |
Um extrai texto com coordenada e a imagem embutida, o outro dá controle de milímetro sobre o layout que o órgão exige |
| Pareamento manual antes de gerar | O automático acerta a maioria, mas laudo com página fora de ordem existe. Como o PDF vira documento oficial, o erro silencioso custa mais caro que o clique a mais |
| Classificação por palavra-chave em JSON | A lista de disciplinas muda por contrato. Em arquivo de configuração, muda sem tocar no código |
Outlook via COM, com Display() antes do corpo |
Abrir o rascunho primeiro faz o Outlook carregar a assinatura do usuário, e o corpo é injetado acima dela. Ninguém envia sem revisar |
| Destinatários só em arquivo de configuração | O core/email_config.json está no .gitignore. Nenhum endereço de pessoa ou empresa fica no código |
| Credenciais do sistema interno fora do código | core/kweb_config.json está no .gitignore, com kweb_config.example.json versionado. O endereço do sistema também vem de lá ou de KWEB_BASE_URL |
| Sessão da API reaproveitada por 25 minutos | A sessão do sistema expira em 30. Reautenticar a cada chamada derrubaria o ritmo de um lote inteiro |
| Marca em arquivo separado | Nome, lote e logotipo saem de core/concessionarias.json. Trocar de contrato não é mexer em código |
| Indicador | Número |
|---|---|
| NCs processadas por lote | [PREENCHER] |
| PDFs de evidência gerados | [PREENCHER] |
| Tempo de tratamento de um lote, antes | [PREENCHER] |
| Tempo de tratamento de um lote, depois | [PREENCHER] |
| E-mails montados por ciclo | [PREENCHER] |
pip install -r requirements.txt- Copie
core/kweb_config.example.jsonparacore/kweb_config.jsonse for usar a integração com o sistema interno. Para o fluxo offline, não é necessário. python app.py. O navegador abre emhttp://localhost:5055. Importedados-exemplo/KCOR-exemplo-ficticio.pdfpara ver o fluxo completo.
din-automator/
├── app.py launcher: sobe o Flask e abre o navegador
├── server_v2.py API atual (extração, pareamento, geração, e-mail)
├── server.py API da versão anterior, ainda usada por web/index.html
├── build.spec empacotamento com PyInstaller
├── core/
│ ├── gerador_v2.py extrai as NCs do PDF e gera o relatório com pares
│ ├── gerador.py layout do cabeçalho, mapa de tipos e versão 1
│ ├── kweb_client.py integração com a API do sistema interno
│ ├── api_fotos.py busca das fotos por NC
│ ├── parser.py classificação por disciplina
│ ├── email_builder.py corpo do e-mail por disciplina
│ ├── outlook_sender.py cria o rascunho no Outlook via COM
│ └── *.example.json modelos de configuração
├── config/ regras de classificação por palavra-chave
├── web/ interface do aplicativo local
├── online/ versão web com Supabase
├── saida/ destino dos PDFs gerados (vazia no repositório)
├── dados-exemplo/ KCOR fictício e um PDF de saída de exemplo
└── docs/
├── img/ capturas de tela
└── historico/ a versão pywebview que veio antes
docs/img/01-painel-ncs.png: painel com as NCs do KCOR de exemplo já extraídas, mostrando o status de cada uma.docs/img/02-pareamento-fotos.png: a tela de pareamento, com as fotos sugeridas como antes e depois.docs/img/03-email-outlook.png: o rascunho montado no Outlook, agrupado por disciplina. Cubra os destinatários antes de salvar o print.
Desenvolvido por Jonathan Vaz linkedin.com/in/jonathan-vaz-260764b3 · jvaz.eng.dev@gmail.com


