Ferramenta para calcular o ICMS-ST (substituição tributária) devido ao Espírito Santo a partir de
XMLs de NF-e (modelo 55), com base na MVA ajustada da Portaria 16-R/2019 da SEFAZ ES. Gera um
arquivo Excel por empresa destinatária e um Resumo.xlsx consolidado.
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txtPara extrair arquivos
.rar, é necessário um extrator externo instalado no Windows (unrarou WinRAR). Arquivos.zipfuncionam nativamente. Sem o extrator de.rar, a ferramenta registra o erro no log e continua processando os demais arquivos.
O aplicativo agora é um app web local em Streamlit:
python run.pyIsso inicia o servidor Streamlit e abre o navegador. As abas:
- Processar — informe a pasta de XML e a pasta de saída, marque "Extrair .zip/.rar" e "Gerar resumo consolidado" conforme desejar e clique em Processar. A barra de progresso acompanha o processamento; ao final, a tela mostra a fonte da portaria usada (cache, site ou fallback) e as falhas por arquivo (se houver).
- Resultados — tabela-resumo (Empresa, CNPJ, Qtd. notas, Total ICMS-ST), gráfico de barras de ICMS-ST por empresa, drill-down por empresa e Exportar Excel.
- Histórico — lista de execuções anteriores (gravadas no banco), com opção de reabrir uma execução na tela e re-exportar o Excel sem reprocessar.
Extração de
.rarrequer o utilitário unrar/WinRAR instalado (os.zipusam a stdlib). As empresas monitoradas são lidas deconfig/empresas.csv.
O histórico é persistido em SQLite (data/sefaz_st.db, criado em runtime e ignorado
pelo Git). Cada execução grava o resumo, as empresas, as notas, os itens e as falhas.
A tabela MVA é resolvida na ordem cache → site → fallback embutido
(data/portaria_fallback.html, snapshot validado). Se o site estiver fora do ar, o
cálculo ainda roda usando o fallback, e a tela sinaliza claramente a fonte e a data
usadas (o fallback pode estar desatualizado em relação ao site).
A busca automática por e-mail (IMAP) não faz parte desta versão (planejada para uma fase futura); por ora a entrada de XML é manual pela aba Processar.
Tudo é editável sem mexer no código, em config/:
config/config.toml— URL/cache da portaria, pastas padrão, CFOPs excluídos, opções.config/empresas.csv—CNPJ;Nomedas empresas destinatárias monitoradas.config/aliquotas_icms.csv—UF;Aliquotainterestadual.
pytest -vOs testes de caracterização travam a lógica fiscal: a saída numérica é comparada com os valores "golden" capturados do código original.
- Busca de XML por e-mail (IMAP) — havia um
email.pyno projeto original, reservado para fase futura. - CLI e agendamento automático.
A versão anterior do programa subestimava o ICMS-ST devido a um problema na
leitura da tabela MVA da portaria. O HTML da Portaria 16-R/2019 usa quebras de
linha \r\r\n (CRLF duplo); o código antigo não normalizava essas quebras antes
de passar o texto para o scraper, de modo que apenas ~35 das 368 entradas
da tabela MVA eram encontradas. Como resultado, a maioria dos produtos sujeitos
à substituição tributária era erroneamente tratada como não sujeita.
A versão nova normaliza os fins-de-linha antes do parser e recupera todas as 368 entradas da tabela MVA. Isso faz com que o cálculo abranja os produtos que realmente constam da portaria como sujeitos à ST — o que é o comportamento correto. Os totais calculados pela versão nova foram validados manualmente contra a portaria para todas as empresas do conjunto de testes.
Recomendação: antes de usar em produção, o contador responsável deve conferir uma amostra das notas calculadas com o novo programa para confirmar que os valores estão de acordo com a portaria vigente.