Pular para o conteúdo

Bitconn Fiscal

Accounting/Localizations · v19.0.4.0.0 · OPL-1

Módulo fiscal unificado para emissão de documentos fiscais eletrônicos brasileiros.

base, account, mail, product, purchase

Módulo Odoo 19 unificado para emissão de documentos fiscais eletrônicos brasileiros: NF-e (modelo 55), NFC-e (modelo 65), NFS-e (multi-provedor), MDF-e e CT-e (modelo 57).


  1. Visão Geral
  2. Arquitetura de Diretórios
  3. Instalação
  4. Configuração
  5. Prioridade de Configuração Fiscal
  6. Operação
  7. CT-e — Conhecimento de Transporte Eletrônico
  8. Cálculo de Impostos (NF-e / NFC-e)
  9. ICMS no CT-e
  10. Documentação Técnica
  11. Erros Comuns e Solução
  12. Referências

O módulo bitconn_fiscal é um módulo único que cobre toda a emissão de documentos fiscais eletrônicos brasileiros:

DocumentoModeloTransporteDescrição
NF-e55SOAP 1.2 (SEFAZ)Nota Fiscal Eletrônica — leiaute XML 4.00, MOC 7.0
NFC-e65SOAP 1.2 (SEFAZ)Nota Fiscal de Consumidor — QR Code, CSC, DANFE reduzido
NFS-eREST / SOAPNota Fiscal de Serviço — Padrão Nacional (SEFIN) e ABRASF
MDF-e58SOAP 1.2 (SEFAZ)Manifesto de Documentos Fiscais Eletrônicos
CT-e57SOAP 1.2 (SEFAZ)Conhecimento de Transporte Eletrônico — leiaute 4.00, modal rodoviário
  • Certificado digital A1 (PKCS#12 / PFX) — validação, leitura e mTLS
  • Assinatura XML manual (sem dependência do signxml) — RSA-SHA1 (NF-e/NFC-e/MDF-e) e RSA-SHA256 (NFS-e)
  • Comunicação SOAP/REST com SEFAZ/SEFIN usando certificado mTLS
  • Emissão via fatura (account.move) ou como nota avulsa (bitconn_fiscal.document)
  • Suporte a múltiplos documentos fiscais por fatura (split)
  • Cancelamento via evento SEFAZ / API
  • Inutilização de faixa de numeração (NF-e/NFC-e)
  • Carta de Correção Eletrônica (CC-e) — NF-e e CT-e
  • Impressão de DANFE (NF-e, NFC-e, NFS-e, MDF-e) e DACTE (CT-e)
  • Importação de XML de CT-e recebidos (com opção de lançamento contábil)
  • Classificação fiscal configurável (NCM, CFOP, ICMS, PIS, COFINS, IPI)
  • Tabela de municípios IBGE
  • Arquitetura multi-provedor NFS-e (Padrão Nacional, ABRASF)
  • MDF-e com encerramento, vale pedágio e seguro
  • URLs SEFAZ cobrindo todos os autorizadores: AM, BA, GO, MG, MS, MT, PE, PR, RS, SP, SVRS

bitconn_fiscal/
├── __manifest__.py
├── requirements.txt
├── README.md
├── lib/ # Bibliotecas (sem dependência do Odoo)
│ ├── certificate.py # Utilitários de certificado PKCS#12 (unificado)
│ ├── xml_signer.py # Assinador XML-DSIG unificado (SHA-1/SHA-256)
│ ├── uf_codes.py # Mapeamento UF ↔ código IBGE
│ ├── nfe_xml_parser.py # Parser XML NF-e (chave, protocolo, etc.)
│ │
│ ├── nfe/ # NF-e / NFC-e (SEFAZ)
│ │ ├── xml_builder.py # Gerador XML <NFe> (leiaute 4.00)
│ │ ├── xml_signer.py # Wrapper RSA-SHA1
│ │ ├── sefaz_client.py # Cliente SOAP 1.2
│ │ ├── sefaz_urls.py # URLs por UF/autorizador/ambiente
│ │ ├── http_client.py # Transporte HTTP com mTLS
│ │ ├── soap.py # Envelope SOAP 1.2
│ │ ├── event_builder.py # Builder de eventos (cancelamento, CC-e)
│ │ └── schemas/ # XSD NF-e 4.00
│ │
│ ├── nfse/ # NFS-e (multi-provedor)
│ │ ├── xml_builder.py # Gerador DPS (Padrão Nacional)
│ │ ├── xml_signer.py # Wrapper RSA-SHA256
│ │ ├── xml_validator.py # Validador XSD
│ │ ├── sefin_client.py # Cliente REST SEFIN (gzip + base64)
│ │ ├── http_client.py # Transporte HTTP NFS-e
│ │ ├── schemas/ # XSD NFS-e (DPS v1.01)
│ │ └── providers/ # Provedores NFS-e
│ │ ├── base.py # Classe base NfseProvider
│ │ ├── registry.py # Registro de provedores
│ │ ├── nacional.py # Padrão Nacional (SEFIN/ADN)
│ │ ├── abrasf.py # ABRASF genérico
│ │ ├── abrasf_rps_builder.py # Builder RPS ABRASF
│ │ ├── abrasf_soap_client.py # Cliente SOAP ABRASF
│ │ └── abrasf_xml_signer.py # Assinador ABRASF
│ │
│ └── mdfe/ # MDF-e
│ ├── xml_builder.py # Gerador XML <MDFe>
│ ├── xml_validator.py # Validador XSD
│ ├── client.py # Cliente SEFAZ MDF-e
│ ├── event_builder.py # Builder de eventos MDF-e
│ └── schemas/ # XSD MDF-e
│ └── cte/ # CT-e (modelo 57)
│ ├── xml_builder.py # Gerador XML <CTe> (leiaute 4.00)
│ ├── xml_validator.py # Validador XSD (cte_v4.00.xsd)
│ ├── client.py # Cliente SEFAZ CT-e (SVRS, SP, MG, MT)
│ ├── sefaz_urls.py # URLs por UF/autorizador/ambiente CT-e
│ ├── event_builder.py # Builder de eventos (cancelamento, CC-e)
│ └── schemas/ # 44 XSDs CT-e 4.00 (SEFAZ oficial)
├── models/
│ ├── res_company.py # Campos fiscais do emitente
│ ├── res_partner.py # Campos fiscais do destinatário
│ ├── product_template.py # Campos fiscais do produto
│ ├── account_move.py # Campos e ações na fatura
│ ├── account_move_line.py # CFOP/natureza por linha
│ ├── fiscal_document.py # Modelo de documento fiscal (NF-e/NFC-e)
│ ├── fiscal_document_line.py # Linhas do documento fiscal
│ ├── fiscal_document_duplicata.py # Duplicatas
│ ├── fiscal_document_pagamento.py # Formas de pagamento
│ ├── mdfe.py # Modelo MDF-e
│ ├── mdfe_documento.py # Documentos vinculados ao MDF-e
│ ├── mdfe_municipio.py # Municípios de percurso
│ ├── mdfe_vale_pedagio.py # Vale pedágio
│ ├── cte.py # Modelo CT-e (bitconn_fiscal.cte)
│ ├── cte_componente.py # Componentes de valor da prestação
│ ├── cte_documento.py # Documentos transportados
│ ├── municipio.py # Tabela de municípios IBGE
│ ├── cfop.py # Tabela CFOP
│ ├── ncm.py # Tabela NCM
│ └── natureza_operacao.py # Tabela de naturezas de operação
├── wizards/
│ ├── emit_wizard.py # Wizard de emissão NF-e/NFC-e
│ ├── cancel_wizard.py # Wizard de cancelamento NF-e/NFC-e
│ ├── cce_wizard.py # Wizard de CC-e
│ ├── inutilizar_wizard.py # Wizard de inutilização
│ ├── cancel_mdfe_wizard.py # Wizard de cancelamento MDF-e
│ ├── encerrar_mdfe_wizard.py # Wizard de encerramento MDF-e
│ ├── cancel_cte_wizard.py # Wizard de cancelamento CT-e
│ ├── cce_cte_wizard.py # Wizard de CC-e CT-e
│ └── import_xml_cte_wizard.py # Wizard de importação de XML CT-e recebido
├── report/
│ ├── report_danfe_nfe.py # Gerador DANFE NF-e
│ ├── report_danfe_nfce.py # Gerador DANFE NFC-e
│ ├── report_danfse.py # Gerador DANFSE
│ ├── report_damdfe.py # Gerador DAMDFE
│ ├── report_cce.py # Gerador CC-e
│ ├── report_dacte.py # Gerador DACTE (CT-e)
│ ├── danfe_nfe_template.xml # Template QWeb DANFE NF-e
│ ├── danfe_nfce_template.xml # Template QWeb DANFE NFC-e
│ ├── danfe_nfce_a4_template.xml # Template DANFE NFC-e formato A4
│ ├── danfse_template.xml # Template DANFSE
│ ├── damdfe_template.xml # Template DAMDFE
│ ├── cce_template.xml # Template CC-e
│ └── dacte_template.xml # Template DACTE (CT-e)
├── views/
│ ├── res_company_views.xml
│ ├── res_partner_views.xml
│ ├── product_template_views.xml
│ ├── account_move_views.xml
│ ├── fiscal_document_views.xml
│ ├── mdfe_views.xml
│ ├── cte_views.xml
│ ├── cfop_views.xml
│ ├── ncm_views.xml
│ ├── natureza_operacao_views.xml
│ └── menu_views.xml
├── data/ # Dados iniciais (CSV)
│ ├── bitconn_fiscal.cfop.csv
│ ├── bitconn_fiscal.ncm.csv
│ ├── bitconn_fiscal.municipio.csv
│ └── bitconn_fiscal.natureza_operacao.csv
└── security/
└── ir.model.access.csv

Terminal window
sudo apt update
sudo apt install -y build-essential pkg-config python3-dev \
libxml2-dev libxslt1-dev libssl-dev libffi-dev ca-certificates
PacoteVersão mínimaUso
requests2.28Comunicação HTTP com SEFAZ e prefeituras
lxml4.9Construção, parsing e canonicalização de XML
cryptography41.0Assinatura XML e leitura de certificados A1 (PKCS#12)
qrcode7.0QR Code no DANFE NFC-e e DANFSE
Terminal window
pip install -r bitconn_fiscal/requirements.txt
  1. Adicione o diretório pai ao addons_path do odoo.conf:
addons_path = /path/to/odoo/addons,/path/to/bitconn_addons
  1. Ative o modo desenvolvedor no Odoo.
  2. Vá em Apps → Atualizar lista de módulos.
  3. Pesquise e instale Bitconn Fiscal.

No formulário da empresa, as configurações ficam distribuídas em abas:

AbaConteúdo
FiscalEmitente, endereço, certificado A1, CFOP/natureza, impostos padrão
NF-eSérie/numeração, modelo padrão, ações (inutilizar, status SEFAZ)
NFC-eSérie/numeração, CSC, URLs QR Code/consulta
NFS-ePadrão, provedor, ambiente, tributação ISS, regime
MDF-eSérie/numeração, modal, tipo emitente
CampoDescrição
Certificado A1 (.pfx)Arquivo PKCS#12 (certificado digital A1)
Chave PrivadaChave privada extraída ou o mesmo PFX
Senha do certificadoSenha do arquivo PFX

Caminho: Contatos → Parceiro → aba Fiscal

CampoDescrição
CNPJ / CPFDocumento do destinatário
Tipo de DocumentoCPF ou CNPJ
Indicador IE Dest.1 (contribuinte), 2 (isento), 9 (não contribuinte)
MunicípioSeleção por tabela IBGE

Caminho: Estoque → Produtos → Produto → aba Fiscal

GrupoCampos
ClassificaçãoNCM, CEST, CFOP, Origem, Tipo Fiscal
ICMSCST ICMS / CSOSN, Alíquota (%), Redução BC (%)
ICMS STAlíquota ST (%), MVA (%), Redução BC ST (%)
FCPAlíquota FCP (%), Alíquota FCP ST (%)
PISCST PIS, Alíquota (%)
COFINSCST COFINS, Alíquota (%)
IPICST IPI, Alíquota (%)
CBS / IBS / ISCST CBS, Alíquota CBS; CST IBS, Alíquota IBS; Alíquota IS
DIFALAlíq. Interna Destino (%), Alíq. Interestadual (%), FCP UF Destino (%)

Na emissão do XML, cada campo fiscal segue uma hierarquia de resolução. O sistema percorre os níveis da esquerda para a direita e usa o primeiro valor não-vazio encontrado.

Campo XML1º — Linha do documento2º — Documento/Fatura3º — Empresa (padrão)Fallback
CFOPline.cfop_iddoc.cfop_idcompany.fiscal_cfop_default_dentro/fora_id5102 / 6102
NCMline.ncm_idcompany.fiscal_ncm_default_id00000000
CESTline.cestomitido
Origemline.origem0 (Nacional)
CST/CSOSN ICMSline.icms_cstcompany.fiscal_icms_csosn_default / fiscal_icms_cst_default102 (SN) / 00 (RN)
Alíquota ICMSline.icms_aliquotacompany.fiscal_aliquota_icms0
Redução BC ICMSline.icms_reducao_bc0
CST PISline.pis_cstcompany.fiscal_pis_cst_default01
Alíquota PISline.pis_aliquotacompany.fiscal_pis_aliquota0
CST COFINSline.cofins_cstcompany.fiscal_cofins_cst_default01
Alíquota COFINSline.cofins_aliquotacompany.fiscal_cofins_aliquota0
CST IPIline.ipi_cstcompany.fiscal_ipi_cst_default53 (NT)
Alíquota IPIline.ipi_aliquotacompany.fiscal_ipi_aliquota0
MVA / alíquota STline.icms_st_mva / icms_st_aliquota0

Regra geral para o item: Linha do documento → Empresa. O produto não interfere diretamente no XML — ele é a fonte de origem ao criar a linha (via _onchange_product_id ou _emit_fiscal_document). Uma vez que a linha está criada, o XML usa apenas os valores da linha.

Campo XMLOrigem
Natureza da operaçãodoc.natureza_operacao_idcompany.fiscal_natureza_operacao_dentro/fora_id"VENDA DE MERCADORIA"
Sériecompany.nfe_serie / company.nfce_serie
dhSaiEntdoc.dh_sai_entdh_emi (data de emissão)
finNFedoc.fin_nfe (default 1 – Normal)
indPresdoc.ind_pres1 (NFC-e) ou 0 (NF-e)
indFinalDerivado de partner.fiscal_ind_ie_dest (9 = consumidor final = 1)
tpNFdoc.tipo_operacao (default 1 – Saída)
CRTcompany.fiscal_crt
Campo XML1º — Campos fiscais do parceiro2º — Campos nativos Odoo
CNPJ/CPFpartner.fiscal_cnpj_cpfpartner.vat
xNomepartner.fiscal_razao_socialpartner.name
xLgrpartner.fiscal_logradouropartner.street
nropartner.fiscal_numero_endereco"S/N"
xCplpartner.fiscal_complementopartner.street2
xBairropartner.fiscal_bairro
cMunpartner.fiscal_cod_municipio
xMunpartner.fiscal_nome_municipiopartner.city
UFpartner.fiscal_ufpartner.state_id.code
CEPpartner.fiscal_ceppartner.zip
fonepartner.fiscal_fonepartner.phone
emailpartner.fiscal_emailpartner.email
indIEDestpartner.fiscal_ind_ie_dest9
IEpartner.fiscal_inscricao_estadual
IMpartner.fiscal_inscricao_municipal
ISUFpartner.fiscal_inscricao_suframa

Os campos fiscal_* do parceiro têm prioridade total. Os campos nativos do Odoo (street, city, vat, etc.) são usados apenas como fallback. Para emitir corretamente, preencha a aba Fiscal do cadastro do parceiro.

Quando uma NF-e é criada a partir de uma fatura (_emit_fiscal_document), o módulo copia para cada linha do documento fiscal:

  1. Dados do produto: NCM, CEST, CFOP, origem, tipo fiscal
  2. ICMS: CST/CSOSN, alíquota, redução BC, MVA/ST (do product.template)
  3. PIS / COFINS / IPI: CST e alíquota (do product.template)
  4. CBS / IBS / IS: CST e alíquota (do product.template, se configurado)
  5. DIFAL: alíquota interna, interestadual e FCP (do product.template, se configurado)

Após a criação da linha, os valores podem ser editados manualmente no documento fiscal antes da emissão. O botão “Recalcular Impostos” executa _fill_line_tax_values e recalcula base e valor usando os dados atuais da linha + padrões da empresa.

vBC = (qty × preço_unitário) × (1 - desconto%) + frete + seguro + outras_despesas

Esta é a regra modBC=3 (valor da operação), utilizada para ICMS, PIS, COFINS, IPI, CBS, IBS e IS.


  1. Crie e valide uma fatura de cliente no Odoo.
  2. Na fatura, clique no botão “Emitir NF-e” ou “Emitir NFC-e”.
  3. O módulo cria o documento fiscal, calcula os impostos e gera o XML.
  4. O XML é assinado com o certificado A1 e enviado à SEFAZ via SOAP 1.2 com mTLS.
  5. A aba fiscal da fatura mostra: número, chave de acesso, protocolo e status.
CampoDescrição
Finalidade da NF-e1 Normal · 2 Complementar · 3 Ajuste · 4 Devolução
Data/Hora Saída / EntradadhSaiEnt — se não informado, usa a data de emissão
Indicador de Presença0 Não se aplica · 1 Presencial · 2 Internet · 3 Teleatendimento · 4 Entrega em domicílio · 5 Fora do estabelecimento · 9 Outros
CampoDescrição
Informações do produto (inf_ad_prod)Texto livre por item — gerado como <infAdProd> no XML
Alíq. Interna DIFAL (%)Alíquota interna do estado destino — preencha para DIFAL
Alíq. Interestadual DIFAL (%)Alíquota interestadual da operação
FCP UF Destino (%)Alíquota FCP do estado destino
Alíquota II (%)Imposto de Importação — preencha para operações de importação
IPI Devolução (R$)Valor IPI devolvido — use com finNFe=4 (Devolução)
  1. Configure os campos da empresa na aba NFS-e (padrão, provedor, certificado).
  2. Crie e valide uma fatura de serviço.
  3. No menu de ações da fatura, use “Emit NFS-e”.
  4. O módulo seleciona o provedor configurado e executa build → sign → send.
  1. Configure série e numeração na aba MDF-e da empresa.
  2. Acesse o menu Fiscal → MDF-e e crie um novo manifesto.
  3. Preencha os dados de carregamento, descarregamento e veículo.
  4. Clique em Emitir — o módulo gera o XML, assina e envia à SEFAZ.

Na fatura/MDF-e com documento autorizado:

  1. Clique no botão “Cancelar” correspondente.
  2. Preencha a justificativa no wizard.
  3. Confirme — o módulo envia o evento de cancelamento.

Na aba NF-e da empresa:

  1. Clique em “Inutilizar Faixa de Numeração”.
  2. Informe número inicial, final, série e justificativa.
  3. Confirme — o módulo envia à SEFAZ.

No MDF-e autorizado, clique em “Encerrar” e informe o município e UF de encerramento.


O CT-e (modelo 57, leiaute 4.00) é o documento fiscal para prestações de serviço de transporte.

Menu: Fiscal → Documentos Fiscais → CT-e

  1. Crie um CT-e pelo botão “Novo” no menu CT-e.
  2. Preencha os campos obrigatórios:
GrupoCampos obrigatórios
IdentificaçãoTipo de CT-e, Modal, Tipo de Serviço, CFOP, Natureza da Operação
ParticipantesRemetente, Destinatario, Mun. Início, Mun. Fim, Tomador
ValoresComponentes de prestação, Produto Predominante
ImpostosCST ICMS, Base de Cálculo, Alíquota, Valor
ModalRNTRC (rodoviário), placa e dados do veículo
  1. Clique em “Emitir”.
Emitir CT-e
├─ Validações (certificado, RNTRC, dados mínimos)
├─ _get_next_numero() ← numeração automática da empresa
├─ build_cte_xml() ← gera XML <CTe> leiaute 4.00
├─ sign_xml(sign_tag="infCte") ← assina RSA-SHA1
├─ validate_cte_xml() ← valida contra cte_v4.00.xsd (SEFAZ)
├─ CteClient.autorizar() ← SOAP 1.2 + mTLS
└─ Parse resposta (cStat 100 = autorizado → salva cte_xml + cte_protocolo)
AutorizadorUFs atendidas
SPSão Paulo
MGMinas Gerais
MTMato Grosso
SVRSTodos os demais estados
  1. No CT-e autorizado, clique em “Cancelar”.
  2. Informe a justificativa (mínimo 15 caracteres).
  3. Confirme — o módulo envia o evento de cancelamento (tpEvento 110111).

Prazo: 24 horas após a autorização. Após esse prazo a SEFAZ rejeita o cancelamento.

  1. No CT-e autorizado, clique em “Carta de Correção”.
  2. Informe o texto da correção (mínimo 15 caracteres).
  3. O sistema incrementa automaticamente o número sequencial do evento (tpEvento 110110).

A CC-e não substitui o CT-e — corrige apenas dados que não influenciem o valor do frete.

No CT-e autorizado, clique em “Download XML” para baixar o arquivo CTe-{chave}.xml.

Clique em “Consultar” para verificar a situação atual do CT-e na SEFAZ (consSitCTe).

Menu: Fiscal → Documentos Fiscais → Importar XML CT-e

Permite registrar no sistema CT-e emitidos por terceiros (transportadoras), com duas opções:

OpçãoResultado
Criar registro fiscalCria um bitconn_fiscal.cte com os dados do XML (padrão ativado)
Criar lançamento contábilCria uma account.move de despesa com o frete
  1. Acesse o menu e suba o arquivo .xml do CT-e.
  2. Clique em “Analisar XML” — o wizard exibe os dados parsed: chave, número, emitente, valores.
  3. Configure as opções e, se for lançar contábil, escolha a conta de frete e o parceiro.
  4. Clique em “Importar”.

No CT-e autorizado, acesse o menu Imprimir → DACTE. O documento contém:

  • Cabeçalho com dados do emitente e identificação
  • Origem e destino da prestação
  • Tomador, remetente e destinatário
  • Valores da prestação por componente e ICMS
  • Informações da carga e documentos transportados
  • Modal rodoviário (placa, RNTRC, motorista)
  • Código de barras + chave de acesso + protocolo de autorização

O CT-e possui apenas ICMS — não há PIS, COFINS, IPI. O imposto incide sobre o valor total da prestação de serviço de transporte (vTPrest), e existe um único bloco ICMS por CT-e (não por item).

CampoTag XMLDescrição
CST ICMScstCódigo de Situação Tributária
Base de CálculovBCValor sobre o qual a alíquota incide
Alíquota ICMS (%)pICMSPercentual do imposto
Valor ICMSvICMSBC × alíquota%
% Redução BCpRedBCReduz a base — apenas CST 20
CSTSituaçãoCampos obrigatóriosNota
00Tributação integralBC = vTPrest, Alíquota, ValorMais comum em regime normal
20Base reduzida% Redução BC, BC reduzida, Alíquota, ValorBC = vTPrest × (1 - %RedBC/100)
40Isento— (deixe tudo zero)Isenção fiscal
41Não tributado— (deixe tudo zero)Fora do campo de incidência
51DiferimentoAlíquota e Valor DiferidoUsado em acordos estaduais
60ST retida anteriormenteBC retida, Valor retido, Alíquota retidaRetribuição anterior de ST
90OutrosBC, Alíquota, ValorSituações mistas

Simples Nacional (CRT 1 ou 2): os campos de BC/Alíquota/Valor são ignorados. O módulo gera automaticamente <ICMSSN><indSN>1</indSN></ICMSSN> independente do que for preenchido.

CST 00 — Tributação Normal:

vTPrest = R$ 1.000,00
BC = R$ 1.000,00 (igual ao vTPrest)
Alíquota = 12%
Valor ICMS = R$ 120,00

CST 20 — Base Reduzida 33,33%:

vTPrest = R$ 1.000,00
% Redução BC = 33,33%
BC = R$ 1.000,00 × (1 - 0,3333) = R$ 666,70
Alíquota = 12%
Valor ICMS = R$ 80,00

Atenção: o cálculo é manual — o módulo não recalcula automaticamente quando o valor da prestação muda. Preencha BC e Valor corretos antes de clicar em Emitir.

CSTTag XML no <ICMS>
00<ICMS00> com cst, vBC, pICMS, vICMS
20<ICMS20> com cst, pRedBC, vBC, pICMS, vICMS
40, 41, 51<ICMS45> com cst (e pICMS/vICMSDif para CST 51)
60<ICMS60> com cst, vBCSTRet, vICMSSTRet, pICMSSTRet
90<ICMS90> com cst, pRedBC, vBC, pICMS, vICMS
SN<ICMSSN> com indSN=1 (Simples Nacional)

vBC_item = (qty × preço_unitário) - desconto_R$ + frete + seguro + outras_despesas

Esta base (modBC=3) é utilizada para todos os tributos calculados por alíquota.

CSOSNTag XMLGera ICMS?Observação
101ICMSSN101Sim (crédito SN)pCredSN / vCredICMSSN
102, 103, 300, 400ICMSSN102Não
201, 202, 203ICMSSN202Não (ST)vBCST / vICMSST
500ICMSSN500Não
900ICMSSN900SimmodBC=3, vBC, pICMS, vICMS + ST zerado
CSTTag XMLBase reduzida?ST?
00ICMS00NãoNão
10ICMS10NãoSim
20ICMS20Sim (pRedBC)Não
40, 41, 50ICMS40NãoNão
51ICMS51DiferimentoNão
60ICMS60NãoSubstituído
90ICMS90NãoNão

DIFAL — Diferencial de Alíquota (interestadual + consumidor final)

Seção intitulada “DIFAL — Diferencial de Alíquota (interestadual + consumidor final)”

Aplicado automaticamente quando:

  • NF-e (modelo 55)
  • Operação interestadual (UF emitente ≠ UF destinatário)
  • indFinal = 1 (consumidor final — derivado de indIEDest = 9)
  • Campos difal_aliquota_interna e difal_aliquota_interestadual preenchidos na linha

Tag XML gerada: <ICMSUFDest> por item. Acumuladores no totalizador: vFCPUFDest, vICMSUFDest, vICMSUFRemet.

vICMSUFDest = vBC × aliq_interna% - vBC × aliq_interestadual%
vFCPUFDest = vBC × fcp_aliquota%
CSTTag XMLCalcula?
01, 02PISAliqSim
04 a 09PISNTNão
49, 99 e outrosPISOutrSim
CSTTag XMLCalcula?
01, 02COFINSAliqSim
04 a 09COFINSNTNão
49, 99 e outrosCOFINSOutrSim
  • Apenas em NF-e (modelo 55). NFC-e não inclui IPI.
  • CSTs tributados (00, 49, 50, 99) → IPITrib. Demais → IPINT.
  • Para NF-e de devolução (finNFe=4): preencha o campo IPI Devolução na linha — o valor vai para vIPIDevol no totalizador.
  • Preencha Alíquota II (%) na linha do documento fiscal.
  • O módulo calcula ii_valor = vBC × aliq_ii% e acumula em vII no totalizador.
  • Calculados e armazenados no banco de dados (campos cbs_valor, ibs_valor, is_valor).
  • Totais visíveis na aba Totais Reforma Tributária do documento.
  • Não emitidos no XML NF-e 4.00 — o schema 4.00 (MOC 7.0) não prevê essas tags. Serão incluídos quando a SEFAZ publicar o leiaute 5.00.
Emitir ou Recalcular Impostos
├─ _fill_line_tax_values() ← calcula e persiste base + valor por linha
│ ├─ vBC = qty×preço - desc + frete + seguro + outras
│ ├─ ICMS (SN/CSOSN ou RN/CST)
│ ├─ ICMS ST (CST 10, 70 / CSOSN 201-203)
│ ├─ FCP (se fcp_aliquota > 0)
│ ├─ DIFAL (interestadual + consumidor final, CRT 3)
│ ├─ PIS / COFINS
│ ├─ IPI (modelo 55)
│ ├─ II (se ii_aliquota > 0)
│ ├─ CBS / IBS / IS (armazenado, não emitido no XML)
│ └─ Totais do documento recalculados (computed fields)
└─ build_nfe_xml() ← lê valores da linha e gera o XML
├─ <ide> finNFe, dhSaiEnt, indPres, indFinal
├─ <emit> dados da empresa
├─ <dest> dados do parceiro
├─ <det> por linha: prod, ICMS, ICMSUFDest, IPI, PIS, COFINS, infAdProd
├─ <total> ICMSTot com todos os acumuladores
├─ <transp> transportadora, veículo, volumes
├─ <cobr> duplicatas
├─ <pag> formas de pagamento
└─ <infAdic> informações complementares e do fisco

As bibliotecas não dependem do Odoo e podem ser usadas standalone.

ArquivoDescrição
certificate.pyUtilitários de certificado PKCS#12 — decode_odoo_binary, load_pkcs12, CertificateInfo, validate_certificate, pfx_to_pem_files
xml_signer.pyAssinador XML-DSIG unificado — parametrizado por algoritmo hash (SHA-1 / SHA-256), C14N 1.0
uf_codes.pyMapeamento sigla UF ↔ código IBGE
nfe_xml_parser.pyParsing de XML NF-e — extrai chave, protocolo, formato
ArquivoDescrição
xml_builder.pyGerador XML <NFe> (leiaute 4.00) a partir de account.move
xml_signer.pyWrapper — delega para xml_signer com RSA-SHA1
sefaz_client.pyCliente SOAP — autorizar, consultar_recibo, consultar_nfe, status_servico, enviar_evento, inutilizar
sefaz_urls.pyURLs por UF/autorizador/ambiente
http_client.pyTransporte HTTP com mTLS + SefazError, SefazRejeicao
soap.pyEnvelope SOAP 1.2
event_builder.pyBuilder de eventos XML (cancelamento, CC-e)
ArquivoDescrição
xml_builder.pyGerador DPS (Padrão Nacional, XSD v1.01)
xml_signer.pyWrapper — delega para xml_signer com RSA-SHA256
xml_validator.pyValidador XSD
sefin_client.pyCliente REST SEFIN (payloads gzip + base64 em JSON)
http_client.pyTransporte HTTP NFS-e
ArquivoDescrição
base.pyClasse base NfseProvider
registry.pyRegistro de provedores
nacional.pyPadrão Nacional (SEFIN/ADN)
abrasf.pyABRASF genérico
abrasf_rps_builder.pyBuilder RPS ABRASF
abrasf_soap_client.pyCliente SOAP ABRASF
abrasf_xml_signer.pyAssinador ABRASF
ArquivoDescrição
xml_builder.pyGerador XML <MDFe>
xml_validator.pyValidador XSD
client.pyCliente SEFAZ MDF-e
event_builder.pyBuilder de eventos MDF-e
ArquivoDescrição
xml_builder.pyGerador XML <CTe> (leiaute 4.00) com suporte a todos os CSTs e modal rodoviário
xml_validator.pyValidador XSD contra cte_v4.00.xsd e eventoCTe_v4.00.xsd
client.pyCliente SEFAZ CT-e — autorizar, consultar, status_servico, enviar_evento, inutilizar
sefaz_urls.pyURLs por UF/autorizador (SVRS, SP, MG, MT) e ambiente
event_builder.pyBuilder de eventos: cancelamento (110111) e CC-e (110110)
schemas/44 XSDs oficiais SEFAZ — PL_CTe_400_NT2025.001 RTC_1.14
ModeloArquivoDescrição
res.companyres_company.pyCampos fiscais do emitente, certificado, NF-e, NFC-e, NFS-e, MDF-e
res.partnerres_partner.pyCampos fiscais do destinatário
product.templateproduct_template.pyClassificação fiscal do produto
account.moveaccount_move.pyCampos e ações fiscais na fatura
account.move.lineaccount_move_line.pyCFOP/natureza por linha
bitconn_fiscal.documentfiscal_document.pyDocumento fiscal (NF-e/NFC-e) — chave, XML, protocolo
bitconn_fiscal.document.linefiscal_document_line.pyLinhas do documento fiscal
bitconn_fiscal.document.duplicatafiscal_document_duplicata.pyDuplicatas
bitconn_fiscal.document.pagamentofiscal_document_pagamento.pyFormas de pagamento
bitconn_fiscal.mdfemdfe.pyMDF-e — manifesto de documentos fiscais
bitconn_fiscal.mdfe.documentomdfe_documento.pyDocumentos vinculados ao MDF-e
bitconn_fiscal.mdfe.municipiomdfe_municipio.pyMunicípios de percurso
bitconn_fiscal.mdfe.vale.pedagiomdfe_vale_pedagio.pyVale pedágio
bitconn_fiscal.ctecte.pyCT-e — chave, XML, protocolo, states, emissão, cancelamento, CC-e
bitconn_fiscal.cte.componentecte_componente.pyComponentes de valor da prestação (vComp)
bitconn_fiscal.cte.documentocte_documento.pyDocumentos transportados (NF-e, NF, outros)
bitconn_fiscal.municipiomunicipio.pyTabela de municípios IBGE
bitconn_fiscal.cfopcfop.pyTabela CFOP
bitconn_fiscal.ncmncm.pyTabela NCM
bitconn_fiscal.natureza_operacaonatureza_operacao.pyTabela de naturezas de operação
ServiçoDescrição
NfeAutorizacaoEnvio de NF-e/NFC-e para autorização
NfeRetAutorizacaoConsulta recibo de lote assíncrono
NfeConsultaProtocoloConsulta pela chave de acesso
NfeStatusServicoDisponibilidade da SEFAZ
RecepcaoEventoCancelamento, CC-e
NfeInutilizacaoInutilização de faixa de numeração
MDFeRecepcaoEnvio de MDF-e
MDFeConsultaConsulta MDF-e
MDFeRecepcaoEventoCancelamento / encerramento MDF-e
ServiçoDescrição
CTeRecepcaoSincEnvio síncrono de CT-e para autorização
CTeConsultaConsulta pela chave de acesso (consSitCTe)
CTeStatusServicoDisponibilidade da SEFAZ CT-e
CTeRecepcaoEventoCancelamento (110111) e CC-e (110110)
CTeInutilizacaoInutilização de faixa de numeração
APITransporteDescrição
SEFIN (Padrão Nacional)REST (gzip + base64)Envio de DPS, consulta, cancelamento
ABRASFSOAPEnvio de RPS, consulta, cancelamento (por prefeitura)
Emitir NF-e/NFC-e
├─ Validações (certificado, UF, destinatário, CSC para NFC-e)
├─ Numeração automática (serie + numero)
├─ _auto_fill_natureza_cfop() → natureza e CFOP padrão se vazios
├─ _fill_line_tax_values() → calcula ICMS/PIS/COFINS/IPI/DIFAL/II por linha
├─ build_nfe_xml() → gera XML conforme leiaute 4.00
├─ sign_xml() → assina RSA-SHA1
├─ SefazClient.autorizar() → SOAP 1.2 + mTLS
└─ Parse resposta (cStat 100/150 = autorizado → salva xml_autorizado + protocolo)
Emitir NFS-e
├─ Resolver provedor (nacional / abrasf)
├─ Validações (certificado, URL)
├─ xml_builder.py → gera DPS ou RPS
├─ xml_signer.py → assina (RSA-SHA256)
└─ Enviar (REST ou SOAP conforme provedor)

SituaçãoSolução
Certificado digital não configuradoConfigure o PFX na aba Fiscal da empresa
UF não configuradaPreencha o endereço fiscal na aba Fiscal
CSC não configurado (NFC-e)Preencha CSC ID e Token na aba NFC-e
Certificado expiradoRenove o certificado A1 junto à AC
SituaçãoSolução
E0037 (Município não Emissor Nacional)Altere para ABRASF e configure WSDL/variante
E0310 (cTribNac inválido)Corrija nfse_codigo_tributacao para o código de 6 dígitos correto
URL do provedor vaziaConfigure a URL na aba NFS-e da empresa

  • Prefixos de campos: fiscal_* (emitente/produto), nfe_* (NF-e), nfce_* (NFC-e), nfse_* (NFS-e), mdfe_* (MDF-e).
  • Herança por extensão: estende res.company, res.partner, product.template e account.move via _inherit.
  • Bibliotecas independentes: todo o código em lib/ não depende do Odoo e pode ser testado standalone.
  • Assinatura XML: implementação manual SHA-1/SHA-256 + C14N 1.0 unificada em lib/xml_signer.py, com wrappers thin em nfe/xml_signer.py e nfse/xml_signer.py.
  • Certificado: utilitários centralizados em lib/certificate.py, consumidos por todos os subdiretórios.
  • Provedores NFS-e: para adicionar provedores, crie uma subclasse de NfseProvider em lib/nfse/providers/.


Autor: Diego F. Rodrigues <[email protected]> Licença: OPL-1 (Odoo Proprietary License v1.0) Preço: $400 USD