DEV Community

Fabio Nobre
Fabio Nobre

Posted on

Tributos de combustíveis no automático: do PDF da Fecombustíveis ao XML em minutos, com IA e GitHub Actions

This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass

What I Built

Todo mês, postos de combustível e sistemas de automação comercial no Brasil precisam atualizar a transparência de tributos (Lei 12.741/2012): quanto de ICMS, PIS/COFINS e CIDE está embutido no litro de cada combustível, em cada estado. A fonte é o PDF "Carga tributária estadual" da Fecombustíveis — e o trabalho era abrir o PDF, copiar valor por valor para 27 UFs e 6 combustíveis e montar o XML TransparenciaTributos à mão.

Construí um site estático (GitHub Pages) que faz isso sozinho:

  1. Busca do PDF – um workflow do GitHub Actions procura o PDF novo a cada 12 horas e salva no repositório.
  2. Leitura com IA – o PDF é enviado a um modelo de IA, que devolve os valores por combustível e por UF.
  3. Comparação – os valores são comparados com o XML do mês anterior; o que mudou fica em amarelo, e contas que não fecham (PMPF × alíquota ≠ ICMS) ficam com borda vermelha.
  4. Geração – para cada combustível que mudou, a vigência antiga é encerrada no dia anterior e um bloco novo é criado. Dá para baixar o XML e uma planilha Excel.

Também há uma página pública, tributos.html, com as tabelas por estado (Gasolina C, Gasolina Premium, Diesel S-500, Diesel S-10, Etanol hidratado e GNV) que se atualiza sozinha quando entra o XML do mês.

E o "Touch Grass"? O objetivo aqui é tirar uma pessoa de uma tarefa repetitiva de tela: o que levava horas de digitação e conferência todo mês virou alguns minutos de revisão. A tela passa a ser a parte mais curta do processo — o resto do dia fica livre.

Para quem é: desenvolvedores de sistemas de PDV/NF-e para postos, contadores e donos de posto que precisam manter a carga tributária correta no cupom.

Demo

Code

Transparência de Tributos – Combustíveis

Site estático (GitHub Pages) que gera todo mês o XML TransparenciaTributos a partir do PDF "Carga tributária estadual" da Fecombustíveis.

Site: https://imextecnologia.github.io/tributacao/ · Tributos por estado: https://imextecnologia.github.io/tributacao/tributos.html

Como funciona

  1. Busca do PDF – a cada 12 horas um workflow procura o PDF novo na página da Fecombustíveis e salva em pdf/.
  2. Leitura com IA – o site envia o PDF ao Google Gemini, que devolve os valores por combustível e UF.
  3. Comparação – os valores são comparados com o XML do mês anterior (em xml/) e o que mudou fica destacado.
  4. Geração – para cada combustível que mudou, o bloco antigo termina no dia anterior (ex.: 30/09/2026) e é criado um bloco novo (ex.: 01/10/2026 até 01/01/2050). Combustíveis sem mudança ficam como estão Também é possível baixar uma planilha Excel com os valores.

Tudo roda no navegador; não há servidor próprio.

Uso

…

How I Built It

  • 100% no navegador, sem servidor próprio: HTML + JavaScript puro, publicado no GitHub Pages.
  • IA para ler o PDF: o site envia o PDF e recebe JSON estruturado por UF/combustível. Hoje uso a API do Google com fallback entre modelos (gemini-flash-latest → gemini-flash-lite-latest → gemini-2.5-flash → gemini-2.5-flash-lite).
  • Validação determinística depois da IA: a IA não tem a palavra final. O site recalcula PMPF × alíquota e PMPF × 9,25% (PIS/COFINS no GNV) e marca qualquer divergência para revisão humana. Os valores podem ser corrigidos direto na tabela.
  • Economia de chamadas: se o XML do mês já existe em xml/, ele é carregado direto; o resultado da IA fica salvo no navegador, então recarregar a página não chama a IA de novo.
  • GitHub Actions:
    • buscar-pdf.yml roda às 00:00 e 12:00 UTC, lê a página da Fecombustíveis, baixa o PDF novo, atualiza o painel.json com o quadro oficial de tributação (%) e publica o site;
    • pages.yml gera a lista de arquivos, embute CSS/tema/logo e publica a cada push na main.
  • Mapeamento por código ANP (ex.: Gasolina C = 320102001/320102002; Diesel S-10 = 820101033/820101034). Produtos não mapeados são mantidos no XML sem alteração.
  • Plano B sem IA: "Preencher a partir do XML (edição manual)" para quando a API estiver indisponível.

Why Does Open Innovation Matter?

O projeto inteiro é aberto e não depende de nenhum servidor meu: o código está no GitHub, o site é estático e roda no navegador, os dados de entrada são públicos (PDF da Fecombustíveis) e o histórico de PDFs e XMLs fica versionado no próprio repositório — qualquer posto ou software house pode fazer um fork e usar.

Sendo transparente: a extração hoje usa um modelo fechado via API. Como toda a lógica de prompt, validação e geração do XML é independente do modelo (o site já troca de modelo automaticamente), o próximo passo é trocar por um modelo open-weight (por exemplo Gemma) — o que permitiria rodar a extração localmente, sem enviar nada a terceiros e sem custo nem limite de cota. A validação determinística (as contas que precisam fechar) é justamente o que torna seguro trocar de modelo: se um modelo menor errar, o erro aparece em vermelho na tela.

Prize Categories

  • Best Use of GitHub Copilot — o projeto é automatizado com GitHub Actions (busca do PDF a cada 12h, atualização do quadro de tributação e publicação no Pages).

Top comments (0)