| --- |
| license: mit |
| language: |
| - pt |
| tags: |
| - pytorch |
| - transformer |
| - text-classification |
| - fiscal |
| - sped |
| - brazil |
| - tax |
| - nlp |
| - llm |
| - brazilian-fiscal |
| pipeline_tag: text-classification |
| library_name: pytorch |
| base_model: [] |
| datasets: [] |
| metrics: |
| - accuracy |
| model-index: |
| - name: LLM Fiscal Brasileiro — SPED |
| results: |
| - task: |
| type: text-classification |
| name: Brazilian Fiscal Obligation Classification |
| metrics: |
| - type: accuracy |
| value: 0.95 |
| name: Accuracy (intent classification, 16 classes) |
| --- |
| |
| # LLM Fiscal Brasileiro — SPED Fiscal System |
|
|
| > **PyTorch-powered LLM for Brazilian fiscal obligations (SPED)** |
| > Python 3.12 · PyTorch · Pydantic v2 · 117 tests |
|
|
| --- |
|
|
| ## Table of Contents / Índice |
|
|
| - [English](#english) |
| - [Overview](#overview) |
| - [Architecture](#architecture) |
| - [Project Structure](#project-structure) |
| - [Installation](#installation) |
| - [Quick Start](#quick-start) |
| - [LLM Model](#llm-model) |
| - [Tax Calculators](#tax-calculators) |
| - [SPED / DFe Generators](#sped--dfe-generators) |
| - [Annual Declarations](#annual-declarations) |
| - [SEFAZ Transmitter](#sefaz-transmitter) |
| - [Training the Model](#training-the-model) |
| - [Running Tests](#running-tests) |
| - [Fiscal Calendar](#fiscal-calendar) |
| - [Português Brasileiro](#português-brasileiro) |
| - [Visão Geral](#visão-geral) |
| - [Arquitetura](#arquitetura) |
| - [Estrutura do Projeto](#estrutura-do-projeto) |
| - [Instalação](#instalação) |
| - [Início Rápido](#início-rápido) |
| - [Modelo LLM](#modelo-llm) |
| - [Calculadoras Tributárias](#calculadoras-tributárias) |
| - [Geradores SPED / DFe](#geradores-sped--dfe) |
| - [Declarações Anuais](#declarações-anuais) |
| - [Transmissor SEFAZ](#transmissor-sefaz) |
| - [Treinamento do Modelo](#treinamento-do-modelo) |
| - [Execução dos Testes](#execução-dos-testes) |
| - [Calendário Fiscal](#calendário-fiscal) |
|
|
| --- |
|
|
| # English |
|
|
| ## Overview |
|
|
| The **Brazilian Fiscal LLM** is a Python 3.12 library that combines a custom **PyTorch Transformer** with a complete set of Brazilian tax compliance tools. It is designed to be consumed as a library by any application — there is no CLI or UI bundled in. |
|
|
| The system covers the full lifecycle of Brazilian fiscal obligations: |
|
|
| - **Intent classification** of natural-language fiscal queries (16 obligation classes) |
| - **RAG (Retrieval-Augmented Generation)** with 25 indexed fiscal knowledge documents |
| - **Tax calculators** for all major Brazilian taxes (ICMS, IPI, PIS/COFINS, IRPJ/CSLL, ISS, Simples Nacional) |
| - **SPED file generators** for all federal digital bookkeeping obligations |
| - **Electronic document generators** (NF-e, NFC-e, CT-e, MDF-e) with digital signatures |
| - **SEFAZ SOAP transmitter** for NF-e authorization |
|
|
| The single entry point is `PipelineFiscal`, which orchestrates all components. |
|
|
| --- |
|
|
| ## Architecture |
|
|
| ``` |
| ┌──────────────────────────────────────────────────────────────────┐ |
| │ PipelineFiscal │ |
| │ (src/models/fiscal_llm.py) │ |
| │ │ |
| │ ┌─────────────────────┐ ┌──────────────────────────────────┐ │ |
| │ │ TransformerFiscal │ │ BancoEmbeddingsFiscais (RAG) │ │ |
| │ │ PyTorch 4-layer │ │ 25 knowledge documents │ │ |
| │ │ encoder, d=256 │ │ cosine similarity search │ │ |
| │ │ 8 heads, Pre-LN │ └──────────────────────────────────┘ │ |
| │ └─────────────────────┘ │ |
| │ ┌─────────────────────────────────────────────────────────────┐ │ |
| │ │ Intent Classification (16 classes) │ │ |
| │ └─────────────────────────────────────────────────────────────┘ │ |
| │ │ |
| │ ┌──────────────────┐ ┌──────────────────┐ ┌───────────────┐ │ |
| │ │ Tax Calculators │ │ SPED Generators │ │ DFe / XML │ │ |
| │ │ ICMS · IPI │ │ EFD ICMS/IPI │ │ NF-e · NFC-e │ │ |
| │ │ PIS/COFINS │ │ EFD Contribu. │ │ CT-e · MDF-e │ │ |
| │ │ IRPJ/CSLL · ISS │ │ ECD · ECF │ │ EFD-Reinf │ │ |
| │ │ Simples Nac. │ │ DCTF · GIA │ │ e-Social │ │ |
| │ └──────────────────┘ │ DIRF · DEFIS │ └───────────────┘ │ |
| │ │ DeSTDA │ │ |
| │ └──────────────────┘ │ |
| └──────────────────────────────────────────────────────────────────┘ |
| ``` |
|
|
| **Key design decisions:** |
| - The LLM (`TransformerFiscal`) uses character-level tokenization — no external tokenizer dependency. |
| - RAG runs entirely in-memory using normalized cosine similarity on CLS embeddings. |
| - All monetary values use Python `Decimal` with `ROUND_HALF_UP` — no floating-point arithmetic. |
| - SPED files are pipe-delimited (`|REGISTRO|CAMPO1|`) UTF-8, matching the official Receita Federal spec. |
| - NF-e/CT-e/MDF-e use XML v4.00 with RSA-SHA1 XMLDSig digital signatures via the `cryptography` library. |
|
|
| --- |
|
|
| ## Project Structure |
|
|
| ``` |
| llm-speed/ |
| ├── src/ |
| │ ├── __init__.py # Exports PipelineFiscal |
| │ ├── fiscal/ |
| │ │ ├── entities.py # Pydantic v2 models (Empresa, NotaFiscal, …) |
| │ │ └── constants.py # Tax rates, CST tables, CFOP codes, deadlines |
| │ ├── calculators/ |
| │ │ ├── icms.py # ICMS (own + ST + DIFAL + FCP) |
| │ │ ├── ipi.py # IPI (TIPI rates by NCM chapter) |
| │ │ ├── pis_cofins.py # PIS/COFINS (cumulative + non-cumulative + withholding) |
| │ │ ├── irpj_csll.py # IRPJ/CSLL (Lucro Real + Lucro Presumido + monthly estimates) |
| │ │ ├── iss.py # ISS (LC 116/2003 + Simples Nacional annexes) |
| │ │ └── simples_nacional.py # Simples Nacional (5 annexes, Fator R, PGDAS-D, MEI) |
| │ ├── generators/ |
| │ │ ├── sped_writer.py # Base SPED pipe-delimited writer |
| │ │ ├── efd_icms_ipi.py # EFD ICMS/IPI (blocks 0,C,E,G,H,K,1,9) |
| │ │ ├── efd_contribuicoes.py # EFD Contribuições PIS/COFINS (blocks 0,C,M,1,9) |
| │ │ ├── ecd.py # ECD — Escrituração Contábil Digital |
| │ │ ├── ecf.py # ECF — Escrituração Contábil Fiscal (LALUR/LACS) |
| │ │ ├── nfe_xml.py # NF-e XML v4.00 (model 55) + digital signature |
| │ │ ├── nfce_xml.py # NFC-e XML v4.00 (model 65, consumer/POS) |
| │ │ ├── cte.py # CT-e XML v4.00 (model 57, freight) |
| │ │ ├── mdfe.py # MDF-e XML v3.00 (manifest, model 58) |
| │ │ ├── efd_reinf.py # EFD-Reinf XML events (R-1000…R-2099) |
| │ │ ├── esocial.py # e-Social XML events (S-1000…S-1299, S-2200, S-2299) |
| │ │ ├── dctf.py # DCTF XML (federal tax debit declaration) |
| │ │ ├── dirf.py # DIRF text file (annual IRRF withholding declaration) |
| │ │ ├── defis.py # DEFIS XML (Simples Nacional annual declaration) |
| │ │ ├── destda.py # DeSTDA XML (Simples Nacional monthly ICMS-ST/DIFAL) |
| │ │ └── gia.py # GIA/GIA-ST AIE file (São Paulo monthly ICMS) |
| │ ├── models/ |
| │ │ ├── fiscal_llm.py # TransformerFiscal + RAG + PipelineFiscal |
| │ │ └── trainer.py # TrainerFiscal (173 examples, early stopping, class weights) |
| │ └── transmitters/ |
| │ └── receita_federal.py # NF-e SEFAZ SOAP transmitter + SPED local validator |
| ├── tests/ |
| │ ├── test_calculators.py # 43 tests for all tax calculators |
| │ └── test_generators.py # 74 tests for all generators |
| ├── pyproject.toml |
| └── requirements.txt |
| ``` |
|
|
| --- |
|
|
| ## Installation |
|
|
| **Requirements:** Python 3.12+, pip |
|
|
| ```bash |
| # Clone the repository |
| git clone <repo-url> |
| cd llm-speed |
| |
| # Create and activate virtual environment |
| python -m venv venv |
| source venv/bin/activate # Linux/macOS |
| # venv\Scripts\activate # Windows |
| |
| # Install dependencies |
| pip install -r requirements.txt |
| ``` |
|
|
| **Core dependencies:** |
|
|
| | Package | Purpose | |
| |---------|---------| |
| | `torch>=2.3.0` | TransformerFiscal model + training | |
| | `pydantic>=2.7.0` | Validated fiscal data models | |
| | `cryptography>=42.0.0` | NF-e/CT-e XML digital signatures (RSA-SHA1) | |
| | `lxml>=5.2.0` | C14N canonicalization for XMLDSig | |
| | `httpx>=0.27.0` | SEFAZ SOAP HTTP client | |
| | `zeep>=4.2.1` | SOAP envelope helpers | |
| | `python-dateutil>=2.9.0` | Brazilian fiscal calendar calculations | |
|
|
| --- |
|
|
| ## Quick Start |
|
|
| ```python |
| from src import PipelineFiscal |
| |
| # Instantiate the LLM pipeline (uses random weights until trained) |
| pipeline = PipelineFiscal(diretorio_saida="./output") |
| |
| # --- Natural language processing --- |
| resultado = pipeline.processar( |
| "calculate ICMS for a sale", |
| {"valor_mercadoria": 10000, "aliquota": 18, "uf_origem": "SP", "uf_destino": "RJ"} |
| ) |
| print(resultado.resumo()) |
| # [calcular_icms] |
| # base_calculo: R$ 10,000.00 |
| # aliquota: R$ 18.00 |
| # valor_icms: R$ 1,800.00 |
| # valor_total_icms: R$ 1,800.00 |
| |
| # --- Direct tax calculation --- |
| r = pipeline.calcular_pis_cofins({ |
| "valor": 100000, |
| "regime": "lucro_presumido", |
| }) |
| print(r["pis_a_recolher"]) # 650.00 |
| print(r["cofins_a_recolher"]) # 3000.00 |
| |
| # --- Generate SPED files for an entire period --- |
| from src.fiscal.entities import PeriodoApuracao, Empresa, ... |
| periodo = PeriodoApuracao(...) |
| arquivos = pipeline.gerar_obrigacoes(periodo) |
| # Returns: {"EFD_ICMS_IPI": ResultadoFiscal, "EFD_CONTRIBUICOES": ..., ...} |
| |
| # --- SEFAZ status check --- |
| status = pipeline.verificar_sefaz(uf="SP") |
| print(status["mensagem"]) |
| ``` |
|
|
| --- |
|
|
| ## LLM Model |
|
|
| ### TransformerFiscal |
|
|
| A compact Transformer encoder trained for Brazilian fiscal intent classification. |
|
|
| | Parameter | Value | |
| |-----------|-------| |
| | Architecture | Transformer Encoder (Pre-LN) | |
| | Layers | 4 | |
| | d_model | 256 | |
| | Attention heads | 8 | |
| | FFN dimension | 1,024 | |
| | Tokenizer | Character-level (vocab ~200 chars) | |
| | Max sequence length | 1,024 tokens | |
| | Output classes | 16 fiscal obligation types | |
| |
| **16 Intent Classes:** |
| |
| | Class | Description | |
| |-------|-------------| |
| | `EFD_ICMS_IPI` | Generate EFD ICMS/IPI digital bookkeeping | |
| | `EFD_CONTRIBUICOES` | Generate EFD Contribuições (PIS/COFINS) | |
| | `ECD` | Generate Escrituração Contábil Digital | |
| | `ECF` | Generate Escrituração Contábil Fiscal | |
| | `NFe` | Emit / cancel NF-e or NFC-e | |
| | `NFSe` | Emit NFS-e (municipal service invoice) | |
| | `CTe` | Generate CT-e freight document | |
| | `eSocial` | Generate e-Social payroll events | |
| | `EFD_REINF` | Generate EFD-Reinf withholding events | |
| | `DCTF` | Generate DCTF federal tax declaration | |
| | `PGDAS` | Calculate Simples Nacional DAS / PGDAS-D | |
| | `calculo_icms` | Calculate ICMS for a transaction | |
| | `calculo_ipi` | Calculate IPI for industrial products | |
| | `calculo_pis_cofins` | Calculate PIS and COFINS on revenue | |
| | `calculo_irpj_csll` | Calculate IRPJ and CSLL (corporate taxes) | |
| | `calculo_iss` | Calculate ISS (municipal services tax) | |
|
|
| ### RAG Knowledge Base |
|
|
| `BancoEmbeddingsFiscais` indexes 25 fiscal knowledge documents covering all major obligations, rates, deadlines, and legislation. Retrieval uses cosine similarity on CLS token embeddings. |
|
|
| ```python |
| # Direct access to RAG |
| pipeline.rag.buscar("prazo EFD ICMS IPI", top_k=3) |
| # Returns: [(text, similarity_score), ...] |
| ``` |
|
|
| --- |
|
|
| ## Tax Calculators |
|
|
| All calculators are available directly via `PipelineFiscal` or imported from `src.calculators.*`. All monetary values use `Decimal` with `ROUND_HALF_UP`. |
|
|
| ### ICMS (`src/calculators/icms.py`) |
|
|
| ```python |
| resultado = pipeline.calcular_icms({ |
| "valor_mercadoria": 10000, |
| "aliquota": 18, # internal rate (%) |
| "uf_origem": "SP", |
| "uf_destino": "RJ", |
| "frete": 500, |
| "cst": "000", # CST: 000=taxed, 020=reduced, 040=exempt, 060=ST |
| "calcular_difal": False, |
| "consumidor_final": False, |
| # Optional ST parameters: |
| # "calcular_st": True, "mva": 40, "aliq_interna_destino": 18 |
| }) |
| ``` |
|
|
| Supports: CST 000/010/020/030/040/041/050/051/060/070, ICMS-ST with MVA, FCP (Fundo de Combate à Pobreza), DIFAL (EC 87/2015). |
|
|
| ### IPI (`src/calculators/ipi.py`) |
|
|
| ```python |
| resultado = pipeline.calcular_ipi({ |
| "valor_produtos": 5000, |
| "aliquota": 10, |
| "cst": "50", # 50=taxed, 52=exempt, 54=suspended |
| "frete": 200, |
| }) |
| ``` |
|
|
| Includes TIPI rates by NCM chapter (0% pharmaceuticals, 25% vehicles, 300% tobacco). |
|
|
| ### PIS/COFINS (`src/calculators/pis_cofins.py`) |
| |
| ```python |
| resultado = pipeline.calcular_pis_cofins({ |
| "valor": 100000, |
| "regime": "lucro_real", # or "lucro_presumido" |
| # Optional credits (non-cumulative regime only): |
| "receitas": [ |
| {"descricao": "Vendas", "valor": 100000, "cst_pis": "01", "cst_cofins": "01"} |
| ], |
| }) |
| ``` |
| |
| | Regime | PIS | COFINS | |
| |--------|-----|--------| |
| | Lucro Presumido (cumulative) | 0.65% | 3.00% | |
| | Lucro Real (non-cumulative) | 1.65% | 7.60% | |
| |
| Supports credits on purchases, energy, rent, depreciation (Lei 10.637/2002 and 10.833/2003). |
| |
| ### IRPJ / CSLL (`src/calculators/irpj_csll.py`) |
|
|
| ```python |
| resultado = pipeline.calcular_irpj_csll({ |
| "valor": 500000, # Lucro Real: net profit / Lucro Presumido: gross revenue |
| "regime": "lucro_presumido", # or "lucro_real" |
| "atividade": "venda_mercadorias", # or "servicos_em_geral", "intermediacao" |
| }) |
| ``` |
|
|
| | Rule | Value | |
| |------|-------| |
| | IRPJ base rate | 15% | |
| | IRPJ surcharge | +10% on profit > R$ 20,000/month | |
| | CSLL rate | 9% (general) / 15% (financial institutions) | |
| | Lucro Presumido — commerce/industry | 8% of revenue | |
| | Lucro Presumido — services | 32% of revenue | |
| | Tax loss carryforward limit | 30% of taxable profit | |
|
|
| ### ISS (`src/calculators/iss.py`) |
|
|
| ```python |
| resultado = pipeline.calcular_iss({ |
| "valor_servico": 10000, |
| "codigo_servico": "17", # LC 116/2003 service code |
| "aliquota": 3, # municipal rate (2%–5%) |
| "retencao_fonte": True, |
| }) |
| ``` |
|
|
| ### Simples Nacional (`src/calculators/simples_nacional.py`) |
| |
| ```python |
| # Single activity DAS calculation |
| resultado = pipeline.calcular_simples({ |
| "receita_mes": 50000, |
| "rbt12": 600000, # 12-month accumulated revenue |
| "anexo": "I", # I=commerce, II=industry, III-V=services |
| }) |
| |
| # Full PGDAS-D with multiple activities |
| resultado = pipeline.calcular_pgdas({ |
| "periodo": "2024-01", |
| "rbt12": 600000, |
| "atividades": [ |
| {"tipo": "comercio", "receita": 30000}, |
| {"tipo": "servicos_advocacia", "receita": 20000}, |
| ], |
| }) |
| ``` |
| |
| Covers all 5 annexes (6 revenue brackets each), Fator R calculation for Annex III vs V, and MEI fixed amounts. |
|
|
| --- |
|
|
| ## SPED / DFe Generators |
|
|
| ### EFD ICMS/IPI (`src/generators/efd_icms_ipi.py`) |
|
|
| Layout version 017. Generates all mandatory blocks: |
|
|
| | Block | Contents | |
| |-------|----------| |
| | 0 | Establishment identification, participants (0150), products (0200) | |
| | C | NF-e records (C100, C110, C170, C190) | |
| | E | ICMS settlement (E110), IPI settlement (E520) | |
| | G | CIAP — ICMS credits on permanent assets (G001, G110) | |
| | H | Physical inventory (H005, H010) | |
| | K | Production and stock control (K100, K200) — industrial companies | |
| | 1 | Other information | |
| | 9 | File control and closing | |
|
|
| ```python |
| from src.generators.efd_icms_ipi import GeradorEFDICMSIPI |
| gerador = GeradorEFDICMSIPI(periodo) |
| caminho = gerador.gerar("./output") |
| ``` |
|
|
| ### EFD Contribuições (`src/generators/efd_contribuicoes.py`) |
| |
| Layout version 006. PIS/COFINS digital bookkeeping. |
| |
| Blocks: 0, C (documents), M (PIS/COFINS settlement — M100, M200, M600), 1, 9. |
| |
| ### ECD (`src/generators/ecd.py`) |
| |
| Layout version 010. Digital accounting bookkeeping. |
| |
| Includes default chart of accounts (50+ accounts), journal entries (I200/I250), balance sheet (J150). |
| |
| ### ECF (`src/generators/ecf.py`) |
| |
| Layout version 009. Replaces the old DIPJ declaration. |
| |
| | Block | Contents | |
| |-------|----------| |
| | 0 | Tax parameters (0010), accountant (0930) | |
| | L | LALUR/LACS adjustments (Lucro Real) | |
| | N | IRPJ/CSLL calculation (N620, N630) | |
| | P | Lucro Presumido quarterly breakdown | |
| | Y | Partner information (Y600) | |
| |
| ### NF-e (`src/generators/nfe_xml.py`) |
|
|
| NF-e XML v4.00, model 55. Full document with all fiscal groups: |
|
|
| - `ide` — identification with 44-digit access key (Módulo 11) |
| - `emit` / `dest` — emitter and recipient |
| - `det` — items with ICMS (CST 000–090), IPI, PIS, COFINS per item |
| - `total` / `transp` / `pag` — totals, transport, payment |
| - `AssinadorNFe` — RSA-SHA1 XMLDSig using PKCS#12 certificate |
|
|
| ```python |
| from src.generators.nfe_xml import GeradorNFeXML, AssinadorNFe |
| gerador = GeradorNFeXML(emitente, destinatario, itens) |
| xml = gerador.gerar_xml() |
| xml_assinado = AssinadorNFe(cert_path, cert_password).assinar(xml) |
| ``` |
|
|
| ### NFC-e (`src/generators/nfce_xml.py`) |
| |
| NFC-e XML v4.00, model 65. Consumer invoice for POS/retail. Optional CPF identification, QR Code URL. |
| |
| ### CT-e (`src/generators/cte.py`) |
| |
| CT-e XML v4.00, model 57. Freight transport fiscal document. |
| |
| - Road modal (rodoviário) with RNTRC registration |
| - 44-digit access key (Módulo 11, model 57) |
| - ICMS calculation on freight service |
| - Referenced NF-e documents |
| |
| ### MDF-e (`src/generators/mdfe.py`) |
| |
| MDF-e XML v3.00, model 58. Groups CT-e and NF-e documents in transport routes. |
| |
| - Unload municipalities with referenced documents |
| - Driver registration |
| - Cargo insurance data |
| - 44-digit access key (Módulo 11, model 58) |
| |
| ### EFD-Reinf (`src/generators/efd_reinf.py`) |
|
|
| XML events for the EFD-Reinf (withholdings and social security information). |
|
|
| | Event | Description | |
| |-------|-------------| |
| | R-1000 | Employer registration | |
| | R-2010 | Services taken — INSS withholding | |
| | R-2020 | Services provided — INSS withholding | |
| | R-2060 | CPRB (payroll tax exemption) | |
| | R-2099 | Period closing | |
|
|
| ### e-Social (`src/generators/esocial.py`) |
|
|
| XML events for Brazil's digital labor bookkeeping system. |
|
|
| | Event | Description | |
| |-------|-------------| |
| | S-1000 | Employer data table | |
| | S-1010 | Payroll items (rubricas) table — 16 standard CLT items | |
| | S-1200 | Monthly payroll (remuneração) | |
| | S-1299 | Monthly payroll closing | |
| | S-2200 | Employee admission | |
| | S-2299 | Employment termination (rescisão) | |
|
|
| ### DCTF (`src/generators/dctf.py`) |
|
|
| XML for PGD DCTF Web. Monthly declaration of federal tax debits and credits. |
|
|
| ```python |
| from src.generators.dctf import montar_dctf_do_periodo |
| gerador = montar_dctf_do_periodo( |
| empresa=empresa, |
| periodo="2024-01", |
| valor_irpj=Decimal("5000"), |
| valor_csll=Decimal("1800"), |
| valor_pis=Decimal("650"), |
| valor_cofins=Decimal("3000"), |
| ) |
| caminho = gerador.salvar("./output") |
| print(gerador.relatorio_resumo()) |
| ``` |
|
|
| --- |
|
|
| ## Annual Declarations |
|
|
| ### DIRF (`src/generators/dirf.py`) |
|
|
| Annual declaration of income tax withheld at source (IRRF). Text file format for PGD DIRF. |
|
|
| **Deadline:** Last business day of February. |
|
|
| ```python |
| from src.generators.dirf import GeradorDIRF, BeneficiarioDIRF, ResponsavelDIRF |
| gerador = GeradorDIRF(empresa, ano_calendario=2024, beneficiarios=[...], responsavel=...) |
| caminho = gerador.salvar("./output") |
| ``` |
|
|
| ### DEFIS (`src/generators/defis.py`) |
|
|
| Annual fiscal information declaration for Simples Nacional companies. XML format for the Simples Nacional portal. |
|
|
| **Deadline:** March 31 of the following year. |
|
|
| ```python |
| from src.generators.defis import GeradorDEFIS, ReceitaMensalDEFIS, SocioDEFIS |
| gerador = GeradorDEFIS(empresa, ano_calendario=2024, receitas_mensais=[...], socios=[...]) |
| xml = gerador.gerar_xml() |
| print(gerador.relatorio_resumo()) |
| ``` |
|
|
| ### DeSTDA (`src/generators/destda.py`) |
|
|
| Monthly declaration of ICMS-ST, DIFAL, and tax anticipation for Simples Nacional companies. |
|
|
| **Deadline:** 20th of the following month. |
|
|
| ```python |
| from src.generators.destda import GeradorDeSTDA, OperacaoSTDeSTDA |
| ops = [ |
| OperacaoSTDeSTDA("SP", "RJ", "ST", base_calculo=Decimal("10000"), |
| aliquota=Decimal("18"), valor_imposto=Decimal("1800")), |
| OperacaoSTDeSTDA("SP", "MG", "DIFAL", base_calculo=Decimal("5000"), |
| aliquota=Decimal("6"), valor_imposto=Decimal("300")), |
| ] |
| gerador = GeradorDeSTDA(empresa, "2024-01", ops) |
| print(gerador.relatorio_resumo()) |
| ``` |
|
|
| ### GIA / GIA-ST — São Paulo (`src/generators/gia.py`) |
|
|
| Monthly ICMS information and settlement guide for São Paulo state. AIE pipe-delimited file format for SEFAZ-SP / SCANC. |
|
|
| **Deadline:** 20th of the following month (may vary by revenue tier). |
|
|
| ```python |
| from src.generators.gia import GeradorGIA, ApuracaoGIA, ApuracaoGIAST |
| apuracao = ApuracaoGIA( |
| debitos_operacoes_proprias=Decimal("50000"), |
| creditos_entradas=Decimal("30000"), |
| ) |
| gerador = GeradorGIA(empresa, "2024-01", apuracao, apuracoes_st=[ |
| ApuracaoGIAST("MG", Decimal("20000"), Decimal("12"), Decimal("2400")), |
| ]) |
| caminho = gerador.salvar("./output") # → GIA_CNPJ_2024-01.aie |
| ``` |
|
|
| --- |
|
|
| ## SEFAZ Transmitter |
|
|
| ### NF-e (`src/transmitters/receita_federal.py`) |
| |
| ```python |
| from src.transmitters.receita_federal import TransmissorNFe |
|
|
| transmissor = TransmissorNFe(uf="SP", ambiente="2") # ambiente 2=homologação |
|
|
| # Check service availability |
| status = transmissor.verificar_status_servico() |
|
|
| # Submit NF-e for authorization |
| resultado = transmissor.autorizar_nfe(xml_assinado) |
| print(resultado.protocolo) # authorization protocol |
|
|
| # Cancel NF-e |
| resultado = transmissor.cancelar_nfe(chave, protocolo, justificativa) |
| ``` |
| |
| SOAP endpoints: SP (SEFAZ-SP), SVRS (other states), SVAN (national contingency). |
| |
| ### SPED Local Validator |
| |
| ```python |
| from src.transmitters.receita_federal import TransmissorSPEDLocal, ValidadorArquivoSPED |
|
|
| # Validates required records and line counts |
| valido, erros = ValidadorArquivoSPED().validar(caminho_arquivo) |
| |
| # Prepares file for PGE (Java program) transmission |
| resultado = TransmissorSPEDLocal("./output").preparar_efd_icms_ipi(caminho) |
| ``` |
| |
| > **Note:** EFD ICMS/IPI, EFD Contribuições, and ECD files must be transmitted through the Receita Federal's local PGE/Validador program — direct HTTP upload is not supported for SPED. Only NF-e uses direct SEFAZ SOAP webservices. |
| |
| --- |
| |
| ## Training the Model |
| |
| The `TransformerFiscal` ships with random weights. Use `TrainerFiscal` to train it on the built-in dataset (173 labeled examples) or your own data. |
| |
| ```python |
| from src import PipelineFiscal |
|
|
| pipeline = PipelineFiscal() |
|
|
| # Train with built-in examples |
| history = pipeline.treinar( |
| epochs=50, # early stopping kicks in before if val_loss plateaus |
| caminho_saida="./checkpoints/fiscal_llm.pt", |
| ) |
| |
| # Load trained model |
| pipeline = PipelineFiscal(caminho_modelo="./checkpoints/fiscal_llm.pt") |
|
|
| # Evaluate per-class accuracy |
| from src.models.trainer import TrainerFiscal, EXEMPLOS_CLASSIFICACAO |
| from src.models.fiscal_llm import TokenizadorFiscal, TransformerFiscal, CLASSES_OBRIGACAO |
| |
| tokenizador = TokenizadorFiscal() |
| trainer = TrainerFiscal(pipeline.modelo, tokenizador) |
| metricas = trainer.avaliar_por_classe(EXEMPLOS_CLASSIFICACAO) |
| print(f"Overall accuracy: {metricas['acuracia_geral']:.1%}") |
| ``` |
| |
| **Training configuration:** |
| |
| | Parameter | Default | |
| |-----------|---------| |
| | Epochs | 50 | |
| | Optimizer | AdamW | |
| | Learning rate | 3e-4 (OneCycleLR) | |
| | Batch size | 16 | |
| | Gradient clipping | 1.0 | |
| | Val split | 15% | |
| | Early stopping patience | 8 epochs | |
| | Class weights | Enabled (inverse frequency) | |
| |
| --- |
| |
| ## Running Tests |
| |
| ```bash |
| pip install pytest pytest-asyncio |
| python -m pytest tests/ -v |
| ``` |
| |
| **117 tests** covering all components: |
| |
| | Module | Tests | |
| |--------|-------| |
| | ICMS calculator | 9 | |
| | IPI calculator | 6 | |
| | PIS/COFINS calculator | 6 | |
| | IRPJ/CSLL calculator | 7 | |
| | ISS calculator | 5 | |
| | Simples Nacional calculator | 9 | |
| | SPED writer | 3 | |
| | EFD ICMS/IPI (incl. Blocks G+K) | 10 | |
| | EFD Contribuições | 3 | |
| | ECD | 5 | |
| | ECF | 3 | |
| | NF-e | 6 | |
| | NFC-e | 4 | |
| | CT-e | 4 | |
| | MDF-e | 4 | |
| | EFD-Reinf | 3 | |
| | e-Social | 3 | |
| | DCTF | 5 | |
| | DIRF | 4 | |
| | DEFIS | 5 | |
| | DeSTDA | 5 | |
| | GIA | 5 | |
| |
| --- |
| |
| ## Fiscal Calendar |
| |
| | Obligation | Frequency | Deadline | |
| |-----------|-----------|----------| |
| | DAS (Simples Nacional) | Monthly | Day 20 of following month | |
| | DeSTDA (ICMS-ST Simples) | Monthly | Day 20 of following month | |
| | GIA-SP | Monthly | Day 20 of following month | |
| | EFD ICMS/IPI | Monthly | 15th business day of following month | |
| | DCTF | Monthly | 15th business day of 2nd following month | |
| | EFD Contribuições | Monthly | 10th business day of 2nd following month | |
| | EFD-Reinf | Monthly | Day 15 of following month | |
| | e-Social (payroll) | Monthly | Day 7 of following month | |
| | ECD | Annual | Last business day of June | |
| | DEFIS (Simples Nacional) | Annual | March 31 | |
| | ECF | Annual | Last business day of July | |
| | DIRF | Annual | Last business day of February | |
| |
| --- |
| |
| --- |
| |
| # Português Brasileiro |
| |
| ## Visão Geral |
| |
| O **LLM Fiscal Brasileiro** é uma biblioteca Python 3.12 que combina um **Transformer PyTorch** customizado com um conjunto completo de ferramentas de compliance tributário brasileiro. O sistema é projetado para ser consumido como biblioteca por qualquer aplicação — não há CLI ou interface gráfica embutida. |
| |
| O sistema cobre o ciclo de vida completo das obrigações fiscais brasileiras: |
| |
| - **Classificação de intenção** de consultas fiscais em linguagem natural (16 classes de obrigações) |
| - **RAG (Geração Aumentada por Recuperação)** com 25 documentos de conhecimento fiscal indexados |
| - **Calculadoras tributárias** para todos os principais tributos brasileiros (ICMS, IPI, PIS/COFINS, IRPJ/CSLL, ISS, Simples Nacional) |
| - **Geradores de arquivos SPED** para todas as obrigações de escrituração digital federal |
| - **Geradores de documentos eletrônicos** (NF-e, NFC-e, CT-e, MDF-e) com assinatura digital |
| - **Transmissor SOAP SEFAZ** para autorização de NF-e |
| |
| O ponto de entrada único é o `PipelineFiscal`, que orquestra todos os componentes. |
| |
| --- |
| |
| ## Arquitetura |
| |
| ``` |
| ┌──────────────────────────────────────────────────────────────────┐ |
| │ PipelineFiscal │ |
| │ (src/models/fiscal_llm.py) │ |
| │ │ |
| │ ┌─────────────────────┐ ┌──────────────────────────────────┐ │ |
| │ │ TransformerFiscal │ │ BancoEmbeddingsFiscais (RAG) │ │ |
| │ │ PyTorch encoder │ │ 25 documentos de conhecimento │ │ |
| │ │ 4 camadas, d=256 │ │ busca por similaridade cosseno │ │ |
| │ │ 8 cabeças, Pre-LN │ └──────────────────────────────────┘ │ |
| │ └─────────────────────┘ │ |
| │ ┌─────────────────────────────────────────────────────────────┐ │ |
| │ │ Classificação de Intenção (16 classes) │ │ |
| │ └─────────────────────────────────────────────────────────────┘ │ |
| │ │ |
| │ ┌──────────────────┐ ┌──────────────────┐ ┌───────────────┐ │ |
| │ │ Calculadoras │ │ Geradores SPED │ │ DFe / XML │ │ |
| │ │ ICMS · IPI │ │ EFD ICMS/IPI │ │ NF-e · NFC-e │ │ |
| │ │ PIS/COFINS │ │ EFD Contribu. │ │ CT-e · MDF-e │ │ |
| │ │ IRPJ/CSLL · ISS │ │ ECD · ECF │ │ EFD-Reinf │ │ |
| │ │ Simples Nac. │ │ DCTF · GIA │ │ e-Social │ │ |
| │ └──────────────────┘ │ DIRF · DEFIS │ └───────────────┘ │ |
| │ │ DeSTDA │ │ |
| │ └──────────────────┘ │ |
| └──────────────────────────────────────────────────────────────────┘ |
| ``` |
| |
| **Decisões de design:** |
| - O LLM usa tokenização em nível de caractere — sem dependência de tokenizador externo. |
| - O RAG roda inteiramente em memória usando similaridade cosseno nos embeddings CLS. |
| - Todos os valores monetários usam `Decimal` Python com `ROUND_HALF_UP` — zero aritmética de ponto flutuante. |
| - Arquivos SPED são pipe-delimitados (`|REGISTRO|CAMPO1|`) em UTF-8, seguindo a especificação oficial da Receita Federal. |
| - NF-e/CT-e/MDF-e usam XML v4.00 com assinaturas digitais RSA-SHA1 XMLDSig via biblioteca `cryptography`. |
| |
| --- |
| |
| ## Estrutura do Projeto |
| |
| ``` |
| llm-speed/ |
| ├── src/ |
| │ ├── __init__.py # Exporta PipelineFiscal |
| │ ├── fiscal/ |
| │ │ ├── entities.py # Modelos Pydantic v2 (Empresa, NotaFiscal, …) |
| │ │ └── constants.py # Alíquotas, tabelas CST, CFOPs, prazos |
| │ ├── calculators/ |
| │ │ ├── icms.py # ICMS (próprio + ST + DIFAL + FCP) |
| │ │ ├── ipi.py # IPI (alíquotas TIPI por capítulo NCM) |
| │ │ ├── pis_cofins.py # PIS/COFINS (cumulativo + não cumulativo + retenção) |
| │ │ ├── irpj_csll.py # IRPJ/CSLL (Lucro Real + Lucro Presumido + estimativa) |
| │ │ ├── iss.py # ISS (LC 116/2003 + anexos Simples Nacional) |
| │ │ └── simples_nacional.py # Simples Nacional (5 anexos, Fator R, PGDAS-D, MEI) |
| │ ├── generators/ |
| │ │ ├── sped_writer.py # Escritor base SPED pipe-delimitado |
| │ │ ├── efd_icms_ipi.py # EFD ICMS/IPI (blocos 0,C,E,G,H,K,1,9) |
| │ │ ├── efd_contribuicoes.py # EFD Contribuições PIS/COFINS (blocos 0,C,M,1,9) |
| │ │ ├── ecd.py # ECD — Escrituração Contábil Digital |
| │ │ ├── ecf.py # ECF — Escrituração Contábil Fiscal (LALUR/LACS) |
| │ │ ├── nfe_xml.py # NF-e XML v4.00 (modelo 55) + assinatura digital |
| │ │ ├── nfce_xml.py # NFC-e XML v4.00 (modelo 65, consumidor/PDV) |
| │ │ ├── cte.py # CT-e XML v4.00 (modelo 57, transporte) |
| │ │ ├── mdfe.py # MDF-e XML v3.00 (manifesto, modelo 58) |
| │ │ ├── efd_reinf.py # EFD-Reinf XML eventos (R-1000…R-2099) |
| │ │ ├── esocial.py # e-Social XML eventos (S-1000…S-1299, S-2200, S-2299) |
| │ │ ├── dctf.py # DCTF XML (declaração de débitos tributários federais) |
| │ │ ├── dirf.py # DIRF arquivo texto (declaração anual IRRF) |
| │ │ ├── defis.py # DEFIS XML (declaração anual Simples Nacional) |
| │ │ ├── destda.py # DeSTDA XML (ICMS-ST/DIFAL mensal Simples Nacional) |
| │ │ └── gia.py # GIA/GIA-ST arquivo AIE (ICMS mensal São Paulo) |
| │ ├── models/ |
| │ │ ├── fiscal_llm.py # TransformerFiscal + RAG + PipelineFiscal |
| │ │ └── trainer.py # TrainerFiscal (173 exemplos, early stopping, pesos por classe) |
| │ └── transmitters/ |
| │ └── receita_federal.py # Transmissor NF-e SOAP SEFAZ + validador SPED local |
| ├── tests/ |
| │ ├── test_calculators.py # 43 testes das calculadoras tributárias |
| │ └── test_generators.py # 74 testes dos geradores |
| ├── pyproject.toml |
| └── requirements.txt |
| ``` |
| |
| --- |
| |
| ## Instalação |
| |
| **Requisitos:** Python 3.12+, pip |
| |
| ```bash |
| # Clonar o repositório |
| git clone <repo-url> |
| cd llm-speed |
|
|
| # Criar e ativar ambiente virtual |
| python -m venv venv |
| source venv/bin/activate # Linux/macOS |
| # venv\Scripts\activate # Windows |
|
|
| # Instalar dependências |
| pip install -r requirements.txt |
| ``` |
| |
| **Dependências principais:** |
| |
| | Pacote | Finalidade | |
| |--------|-----------| |
| | `torch>=2.3.0` | Modelo TransformerFiscal + treinamento | |
| | `pydantic>=2.7.0` | Modelos de dados fiscais validados | |
| | `cryptography>=42.0.0` | Assinatura digital NF-e/CT-e (RSA-SHA1) | |
| | `lxml>=5.2.0` | Canonicalização C14N para XMLDSig | |
| | `httpx>=0.27.0` | Cliente HTTP SOAP SEFAZ | |
| | `zeep>=4.2.1` | Auxiliares para envelope SOAP | |
| | `python-dateutil>=2.9.0` | Cálculos de calendário fiscal brasileiro | |
| |
| --- |
| |
| ## Início Rápido |
| |
| ```python |
| from src import PipelineFiscal |
|
|
| # Instanciar o pipeline LLM (pesos aleatórios até ser treinado) |
| pipeline = PipelineFiscal(diretorio_saida="./output") |
| |
| # --- Processamento em linguagem natural --- |
| resultado = pipeline.processar( |
| "calcule o ICMS de uma venda", |
| {"valor_mercadoria": 10000, "aliquota": 18, "uf_origem": "SP", "uf_destino": "RJ"} |
| ) |
| print(resultado.resumo()) |
| # [calcular_icms] |
| # base_calculo: R$ 10.000,00 |
| # valor_icms: R$ 1.800,00 |
| # valor_total_icms: R$ 1.800,00 |
| |
| # --- Cálculo direto de tributos --- |
| r = pipeline.calcular_pis_cofins({ |
| "valor": 100000, |
| "regime": "lucro_presumido", |
| }) |
| print(r["pis_a_recolher"]) # 650.00 |
| print(r["cofins_a_recolher"]) # 3000.00 |
|
|
| # --- Gerar obrigações SPED do período --- |
| from src.fiscal.entities import PeriodoApuracao, Empresa, ... |
| periodo = PeriodoApuracao(...) |
| arquivos = pipeline.gerar_obrigacoes(periodo) |
| # Retorna: {"EFD_ICMS_IPI": ResultadoFiscal, "EFD_CONTRIBUICOES": ..., ...} |
|
|
| # --- Verificar status SEFAZ --- |
| status = pipeline.verificar_sefaz(uf="SP") |
| print(status["mensagem"]) |
| ``` |
| |
| --- |
| |
| ## Modelo LLM |
| |
| ### TransformerFiscal |
| |
| Encoder Transformer compacto treinado para classificação de intenção fiscal brasileira. |
| |
| | Parâmetro | Valor | |
| |-----------|-------| |
| | Arquitetura | Transformer Encoder (Pre-LN) | |
| | Camadas | 4 | |
| | d_model | 256 | |
| | Cabeças de atenção | 8 | |
| | Dimensão FFN | 1.024 | |
| | Tokenizador | Nível de caractere (vocab ~200 chars) | |
| | Comprimento máximo de sequência | 1.024 tokens | |
| | Classes de saída | 16 tipos de obrigação fiscal | |
|
|
| **16 Classes de Intenção:** |
|
|
| | Classe | Descrição | |
| |--------|-----------| |
| | `EFD_ICMS_IPI` | Gerar EFD ICMS/IPI | |
| | `EFD_CONTRIBUICOES` | Gerar EFD Contribuições (PIS/COFINS) | |
| | `ECD` | Gerar Escrituração Contábil Digital | |
| | `ECF` | Gerar Escrituração Contábil Fiscal | |
| | `NFe` | Emitir/cancelar NF-e ou NFC-e | |
| | `NFSe` | Emitir NFS-e (nota de serviço municipal) | |
| | `CTe` | Gerar CT-e (conhecimento de transporte) | |
| | `eSocial` | Gerar eventos e-Social (folha/admissão) | |
| | `EFD_REINF` | Gerar eventos EFD-Reinf (retenções) | |
| | `DCTF` | Gerar DCTF (débitos tributários federais) | |
| | `PGDAS` | Calcular DAS Simples Nacional / PGDAS-D | |
| | `calculo_icms` | Calcular ICMS de uma operação | |
| | `calculo_ipi` | Calcular IPI de produto industrializado | |
| | `calculo_pis_cofins` | Calcular PIS e COFINS sobre receitas | |
| | `calculo_irpj_csll` | Calcular IRPJ e CSLL (tributos corporativos) | |
| | `calculo_iss` | Calcular ISS (imposto municipal sobre serviços) | |
|
|
| ### Base de Conhecimento RAG |
|
|
| `BancoEmbeddingsFiscais` indexa 25 documentos de conhecimento fiscal cobrindo todas as principais obrigações, alíquotas, prazos e legislação. A recuperação usa similaridade cosseno nos embeddings do token CLS. |
|
|
| ```python |
| # Acesso direto ao RAG |
| pipeline.rag.buscar("prazo EFD ICMS IPI", top_k=3) |
| # Retorna: [(texto, score_similaridade), ...] |
| ``` |
|
|
| --- |
|
|
| ## Calculadoras Tributárias |
|
|
| Todas as calculadoras estão disponíveis via `PipelineFiscal` ou importadas de `src.calculators.*`. Todos os valores monetários usam `Decimal` com `ROUND_HALF_UP`. |
|
|
| ### ICMS (`src/calculators/icms.py`) |
|
|
| ```python |
| resultado = pipeline.calcular_icms({ |
| "valor_mercadoria": 10000, |
| "aliquota": 18, # alíquota interna (%) |
| "uf_origem": "SP", |
| "uf_destino": "RJ", |
| "frete": 500, |
| "cst": "000", # CST: 000=tributado, 020=redução, 040=isento, 060=ST |
| "calcular_difal": False, |
| "consumidor_final": False, |
| # Parâmetros opcionais ST: |
| # "calcular_st": True, "mva": 40, "aliq_interna_destino": 18 |
| }) |
| ``` |
|
|
| Suporta: CST 000/010/020/030/040/041/050/051/060/070, ICMS-ST com MVA, FCP (Fundo de Combate à Pobreza), DIFAL (EC 87/2015). |
|
|
| ### IPI (`src/calculators/ipi.py`) |
|
|
| ```python |
| resultado = pipeline.calcular_ipi({ |
| "valor_produtos": 5000, |
| "aliquota": 10, |
| "cst": "50", # 50=tributado, 52=isento, 54=suspenso |
| "frete": 200, |
| }) |
| ``` |
|
|
| Inclui alíquotas TIPI por capítulo NCM (0% farmacêuticos, 25% veículos, 300% cigarro). |
|
|
| ### PIS/COFINS (`src/calculators/pis_cofins.py`) |
| |
| ```python |
| resultado = pipeline.calcular_pis_cofins({ |
| "valor": 100000, |
| "regime": "lucro_real", # ou "lucro_presumido" |
| "receitas": [ |
| {"descricao": "Vendas", "valor": 100000, "cst_pis": "01", "cst_cofins": "01"} |
| ], |
| }) |
| ``` |
| |
| | Regime | PIS | COFINS | |
| |--------|-----|--------| |
| | Lucro Presumido (cumulativo) | 0,65% | 3,00% | |
| | Lucro Real (não cumulativo) | 1,65% | 7,60% | |
| |
| Suporta créditos sobre compras, energia, aluguéis, depreciação (Leis 10.637/2002 e 10.833/2003). |
| |
| ### IRPJ / CSLL (`src/calculators/irpj_csll.py`) |
|
|
| ```python |
| resultado = pipeline.calcular_irpj_csll({ |
| "valor": 500000, # Lucro Real: lucro líquido / Lucro Presumido: receita bruta |
| "regime": "lucro_presumido", # ou "lucro_real" |
| "atividade": "venda_mercadorias", # ou "servicos_em_geral", "intermediacao" |
| }) |
| ``` |
|
|
| | Regra | Valor | |
| |-------|-------| |
| | IRPJ alíquota base | 15% | |
| | IRPJ adicional | +10% sobre lucro > R$ 20.000/mês | |
| | CSLL alíquota | 9% (geral) / 15% (financeiras) | |
| | Lucro Presumido — comércio/indústria | 8% da receita | |
| | Lucro Presumido — serviços | 32% da receita | |
| | Limite compensação prejuízos | 30% do lucro tributável | |
|
|
| ### ISS (`src/calculators/iss.py`) |
|
|
| ```python |
| resultado = pipeline.calcular_iss({ |
| "valor_servico": 10000, |
| "codigo_servico": "17", # código da LC 116/2003 |
| "aliquota": 3, # alíquota municipal (2%–5%) |
| "retencao_fonte": True, |
| }) |
| ``` |
|
|
| ### Simples Nacional (`src/calculators/simples_nacional.py`) |
| |
| ```python |
| # Cálculo do DAS para uma atividade |
| resultado = pipeline.calcular_simples({ |
| "receita_mes": 50000, |
| "rbt12": 600000, # receita acumulada 12 meses |
| "anexo": "I", # I=comércio, II=indústria, III-V=serviços |
| }) |
| |
| # PGDAS-D completo com múltiplas atividades |
| resultado = pipeline.calcular_pgdas({ |
| "periodo": "2024-01", |
| "rbt12": 600000, |
| "atividades": [ |
| {"tipo": "comercio", "receita": 30000}, |
| {"tipo": "servicos_advocacia", "receita": 20000}, |
| ], |
| }) |
| ``` |
| |
| Cobre todos os 5 anexos (6 faixas cada), cálculo do Fator R para Anexo III vs V, e valores fixos do MEI. |
|
|
| --- |
|
|
| ## Geradores SPED / DFe |
|
|
| ### EFD ICMS/IPI (`src/generators/efd_icms_ipi.py`) |
|
|
| Layout versão 017. Gera todos os blocos obrigatórios: |
|
|
| | Bloco | Conteúdo | |
| |-------|----------| |
| | 0 | Identificação do estabelecimento, participantes (0150), produtos (0200) | |
| | C | Registros NF-e (C100, C110, C170, C190) | |
| | E | Apuração ICMS (E110), apuração IPI (E520) | |
| | G | CIAP — crédito ICMS sobre ativo permanente (G001, G110) | |
| | H | Inventário físico (H005, H010) | |
| | K | Controle de produção e estoque (K100, K200) — indústrias | |
| | 1 | Outras informações | |
| | 9 | Controle e encerramento do arquivo | |
|
|
| ```python |
| from src.generators.efd_icms_ipi import GeradorEFDICMSIPI |
| gerador = GeradorEFDICMSIPI(periodo) |
| caminho = gerador.gerar("./output") |
| ``` |
|
|
| ### EFD Contribuições (`src/generators/efd_contribuicoes.py`) |
| |
| Layout versão 006. Escrituração digital de PIS/COFINS. |
| |
| Blocos: 0, C (documentos), M (apuração PIS/COFINS — M100, M200, M600), 1, 9. |
| |
| ### ECD (`src/generators/ecd.py`) |
| |
| Layout versão 010. Escrituração contábil digital. |
| |
| Inclui plano de contas padrão (50+ contas), lançamentos (I200/I250), balanço (J150). |
| |
| ### ECF (`src/generators/ecf.py`) |
| |
| Layout versão 009. Substitui a DIPJ. |
| |
| | Bloco | Conteúdo | |
| |-------|----------| |
| | 0 | Parâmetros fiscais (0010), contador (0930) | |
| | L | Ajustes LALUR/LACS (Lucro Real) | |
| | N | Cálculo IRPJ/CSLL (N620, N630) | |
| | P | Lucro Presumido por trimestre | |
| | Y | Quadro societário (Y600) | |
| |
| ### NF-e (`src/generators/nfe_xml.py`) |
|
|
| NF-e XML v4.00, modelo 55. Documento completo com todos os grupos fiscais: |
|
|
| - `ide` — identificação com chave de acesso 44 dígitos (Módulo 11) |
| - `emit` / `dest` — emitente e destinatário |
| - `det` — itens com ICMS (CST 000–090), IPI, PIS, COFINS por item |
| - `total` / `transp` / `pag` — totais, transporte, pagamento |
| - `AssinadorNFe` — assinatura RSA-SHA1 XMLDSig com certificado PKCS#12 |
|
|
| ```python |
| from src.generators.nfe_xml import GeradorNFeXML, AssinadorNFe |
| gerador = GeradorNFeXML(emitente, destinatario, itens) |
| xml = gerador.gerar_xml() |
| xml_assinado = AssinadorNFe(cert_path, cert_password).assinar(xml) |
| ``` |
|
|
| ### NFC-e (`src/generators/nfce_xml.py`) |
| |
| NFC-e XML v4.00, modelo 65. Nota do consumidor para PDV/varejo. Identificação do CPF opcional, URL QR Code. |
| |
| ### CT-e (`src/generators/cte.py`) |
| |
| CT-e XML v4.00, modelo 57. Documento fiscal para transporte de carga. |
| |
| - Modal rodoviário com registro RNTRC |
| - Chave de acesso 44 dígitos (Módulo 11, modelo 57) |
| - Cálculo do ICMS sobre o serviço de transporte |
| - Documentos NF-e referenciados |
| |
| ### MDF-e (`src/generators/mdfe.py`) |
| |
| MDF-e XML v3.00, modelo 58. Agrupa CT-e e NF-e em rotas de transporte. |
| |
| - Municípios de descarga com documentos referenciados |
| - Cadastro de condutores |
| - Dados do seguro de carga |
| - Chave de acesso 44 dígitos (Módulo 11, modelo 58) |
| |
| ### EFD-Reinf (`src/generators/efd_reinf.py`) |
|
|
| Eventos XML para o EFD-Reinf (retenções e informações previdenciárias). |
|
|
| | Evento | Descrição | |
| |--------|-----------| |
| | R-1000 | Cadastro do empregador | |
| | R-2010 | Serviços tomados — retenção INSS | |
| | R-2020 | Serviços prestados — retenção INSS | |
| | R-2060 | CPRB (contribuição previdenciária sobre receita bruta) | |
| | R-2099 | Fechamento do período | |
|
|
| ### e-Social (`src/generators/esocial.py`) |
|
|
| Eventos XML para o sistema de escrituração digital trabalhista brasileiro. |
|
|
| | Evento | Descrição | |
| |--------|-----------| |
| | S-1000 | Dados do empregador | |
| | S-1010 | Tabela de rubricas — 16 itens CLT padrão | |
| | S-1200 | Remuneração mensal (folha de pagamento) | |
| | S-1299 | Fechamento da folha mensal | |
| | S-2200 | Admissão de empregado | |
| | S-2299 | Desligamento (rescisão contratual) | |
|
|
| ### DCTF (`src/generators/dctf.py`) |
|
|
| XML para o PGD DCTF Web. Declaração mensal de débitos e créditos tributários federais. |
|
|
| ```python |
| from src.generators.dctf import montar_dctf_do_periodo |
| gerador = montar_dctf_do_periodo( |
| empresa=empresa, |
| periodo="2024-01", |
| valor_irpj=Decimal("5000"), |
| valor_csll=Decimal("1800"), |
| valor_pis=Decimal("650"), |
| valor_cofins=Decimal("3000"), |
| ) |
| caminho = gerador.salvar("./output") |
| print(gerador.relatorio_resumo()) |
| ``` |
|
|
| --- |
|
|
| ## Declarações Anuais |
|
|
| ### DIRF (`src/generators/dirf.py`) |
|
|
| Declaração anual do imposto de renda retido na fonte. Arquivo texto para o PGD DIRF. |
|
|
| **Prazo:** Último dia útil de fevereiro. |
|
|
| ```python |
| from src.generators.dirf import GeradorDIRF, BeneficiarioDIRF, ResponsavelDIRF |
| gerador = GeradorDIRF(empresa, ano_calendario=2024, beneficiarios=[...], responsavel=...) |
| caminho = gerador.salvar("./output") |
| ``` |
|
|
| ### DEFIS (`src/generators/defis.py`) |
|
|
| Declaração de informações socioeconômicas e fiscais para empresas do Simples Nacional. XML para o portal do Simples Nacional. |
|
|
| **Prazo:** 31 de março do ano seguinte. |
|
|
| ```python |
| from src.generators.defis import GeradorDEFIS, ReceitaMensalDEFIS, SocioDEFIS |
| gerador = GeradorDEFIS(empresa, ano_calendario=2024, receitas_mensais=[...], socios=[...]) |
| xml = gerador.gerar_xml() |
| print(gerador.relatorio_resumo()) |
| ``` |
|
|
| ### DeSTDA (`src/generators/destda.py`) |
|
|
| Declaração mensal de substituição tributária, diferencial de alíquota e antecipação para empresas do Simples Nacional. |
|
|
| **Prazo:** Dia 20 do mês seguinte. |
|
|
| ```python |
| from src.generators.destda import GeradorDeSTDA, OperacaoSTDeSTDA |
| ops = [ |
| OperacaoSTDeSTDA("SP", "RJ", "ST", base_calculo=Decimal("10000"), |
| aliquota=Decimal("18"), valor_imposto=Decimal("1800")), |
| OperacaoSTDeSTDA("SP", "MG", "DIFAL", base_calculo=Decimal("5000"), |
| aliquota=Decimal("6"), valor_imposto=Decimal("300")), |
| ] |
| gerador = GeradorDeSTDA(empresa, "2024-01", ops) |
| print(gerador.relatorio_resumo()) |
| ``` |
|
|
| ### GIA / GIA-ST — São Paulo (`src/generators/gia.py`) |
|
|
| Guia de informação e apuração do ICMS mensal para o estado de São Paulo. Arquivo AIE pipe-delimitado para SEFAZ-SP / SCANC. |
|
|
| **Prazo:** Dia 20 do mês seguinte (pode variar por faixa de faturamento). |
|
|
| ```python |
| from src.generators.gia import GeradorGIA, ApuracaoGIA, ApuracaoGIAST |
| apuracao = ApuracaoGIA( |
| debitos_operacoes_proprias=Decimal("50000"), |
| creditos_entradas=Decimal("30000"), |
| ) |
| gerador = GeradorGIA(empresa, "2024-01", apuracao, apuracoes_st=[ |
| ApuracaoGIAST("MG", Decimal("20000"), Decimal("12"), Decimal("2400")), |
| ]) |
| caminho = gerador.salvar("./output") # → GIA_CNPJ_2024-01.aie |
| ``` |
|
|
| --- |
|
|
| ## Transmissor SEFAZ |
|
|
| ### NF-e (`src/transmitters/receita_federal.py`) |
| |
| ```python |
| from src.transmitters.receita_federal import TransmissorNFe |
|
|
| transmissor = TransmissorNFe(uf="SP", ambiente="2") # ambiente 2=homologação |
|
|
| # Verificar disponibilidade do serviço |
| status = transmissor.verificar_status_servico() |
|
|
| # Transmitir NF-e para autorização |
| resultado = transmissor.autorizar_nfe(xml_assinado) |
| print(resultado.protocolo) # protocolo de autorização |
|
|
| # Cancelar NF-e |
| resultado = transmissor.cancelar_nfe(chave, protocolo, justificativa) |
| ``` |
| |
| Endpoints SOAP: SP (SEFAZ-SP), SVRS (demais estados), SVAN (contingência nacional). |
| |
| ### Validador SPED Local |
| |
| ```python |
| from src.transmitters.receita_federal import TransmissorSPEDLocal, ValidadorArquivoSPED |
|
|
| # Valida presença de registros obrigatórios e contagem de linhas |
| valido, erros = ValidadorArquivoSPED().validar(caminho_arquivo) |
| |
| # Prepara arquivo para transmissão via PGE (programa Java) |
| resultado = TransmissorSPEDLocal("./output").preparar_efd_icms_ipi(caminho) |
| ``` |
| |
| > **Observação:** Os arquivos EFD ICMS/IPI, EFD Contribuições e ECD devem ser transmitidos pelo programa PGE/Validador da Receita Federal — não há upload HTTP direto para o SPED. Apenas a NF-e usa webservices SOAP diretos da SEFAZ. |
| |
| --- |
| |
| ## Treinamento do Modelo |
| |
| O `TransformerFiscal` é iniciado com pesos aleatórios. Use o `TrainerFiscal` para treiná-lo com o dataset built-in (173 exemplos rotulados) ou seus próprios dados. |
| |
| ```python |
| from src import PipelineFiscal |
|
|
| pipeline = PipelineFiscal() |
|
|
| # Treinar com os exemplos built-in |
| historico = pipeline.treinar( |
| epochs=50, # early stopping pode parar antes se val_loss parar de melhorar |
| caminho_saida="./checkpoints/fiscal_llm.pt", |
| ) |
| |
| # Carregar modelo treinado |
| pipeline = PipelineFiscal(caminho_modelo="./checkpoints/fiscal_llm.pt") |
|
|
| # Avaliar acurácia por classe |
| from src.models.trainer import TrainerFiscal, EXEMPLOS_CLASSIFICACAO |
| from src.models.fiscal_llm import TokenizadorFiscal |
|
|
| tokenizador = TokenizadorFiscal() |
| trainer = TrainerFiscal(pipeline.modelo, tokenizador) |
| metricas = trainer.avaliar_por_classe(EXEMPLOS_CLASSIFICACAO) |
| print(f"Acurácia geral: {metricas['acuracia_geral']:.1%}") |
| for classe, acc in metricas["acuracia_por_classe"].items(): |
| print(f" {classe}: {acc:.1%}") |
| ``` |
| |
| **Configuração de treinamento:** |
|
|
| | Parâmetro | Padrão | |
| |-----------|--------| |
| | Épocas | 50 | |
| | Otimizador | AdamW | |
| | Learning rate | 3e-4 (OneCycleLR) | |
| | Batch size | 16 | |
| | Gradient clipping | 1,0 | |
| | Divisão validação | 15% | |
| | Paciência early stopping | 8 épocas | |
| | Pesos por classe | Habilitado (frequência inversa) | |
|
|
| --- |
|
|
| ## Execução dos Testes |
|
|
| ```bash |
| pip install pytest pytest-asyncio |
| python -m pytest tests/ -v |
| ``` |
|
|
| **117 testes** cobrindo todos os componentes: |
|
|
| | Módulo | Testes | |
| |--------|--------| |
| | Calculadora ICMS | 9 | |
| | Calculadora IPI | 6 | |
| | Calculadora PIS/COFINS | 6 | |
| | Calculadora IRPJ/CSLL | 7 | |
| | Calculadora ISS | 5 | |
| | Simples Nacional | 9 | |
| | Escritor SPED | 3 | |
| | EFD ICMS/IPI (incl. Blocos G+K) | 10 | |
| | EFD Contribuições | 3 | |
| | ECD | 5 | |
| | ECF | 3 | |
| | NF-e | 6 | |
| | NFC-e | 4 | |
| | CT-e | 4 | |
| | MDF-e | 4 | |
| | EFD-Reinf | 3 | |
| | e-Social | 3 | |
| | DCTF | 5 | |
| | DIRF | 4 | |
| | DEFIS | 5 | |
| | DeSTDA | 5 | |
| | GIA | 5 | |
|
|
| --- |
|
|
| ## Calendário Fiscal |
|
|
| | Obrigação | Periodicidade | Prazo | |
| |-----------|--------------|-------| |
| | DAS (Simples Nacional) | Mensal | Dia 20 do mês seguinte | |
| | DeSTDA (ICMS-ST Simples) | Mensal | Dia 20 do mês seguinte | |
| | GIA-SP | Mensal | Dia 20 do mês seguinte | |
| | EFD ICMS/IPI | Mensal | 15º dia útil do mês seguinte | |
| | DCTF | Mensal | 15º dia útil do 2º mês seguinte | |
| | EFD Contribuições | Mensal | 10º dia útil do 2º mês seguinte | |
| | EFD-Reinf | Mensal | Dia 15 do mês seguinte | |
| | e-Social (folha) | Mensal | Dia 7 do mês seguinte | |
| | ECD | Anual | Último dia útil de junho | |
| | DEFIS (Simples Nacional) | Anual | 31 de março | |
| | ECF | Anual | Último dia útil de julho | |
| | DIRF | Anual | Último dia útil de fevereiro | |
|
|
| --- |
|
|
| *Sistema desenvolvido em Python 3.12 com PyTorch para o ecossistema fiscal brasileiro (SPED).* |
| *117 testes · 20 obrigações cobertas · 6 tributos calculados* |
|
|