OdooWiki OCA HUB

NF-e abstract models

l10n_br_nfe_spec folder_open OCA/l10n-brazil open_in_new
Accounting License: LGPL-3

Este módulo é a fundação para a emissão da Nota Fiscal Eletrônica (NF-e modelo 55 e NFC-e modelo 65) no Odoo, fornecendo uma estrutura de dados completa e fiel ao leiaute oficial 4.0 da SEFAZ.

É importante entender que este módulo atua como uma biblioteca de modelos abstratos (mixins) e não realiza a emissão da NF-e por si só. Sua finalidade é ser a base para um módulo de implementação, como o l10n_br_nfe, que é responsável por mapear esses modelos nos documentos fiscais do Odoo (l10n_br_fiscal.document) e comunicar-se com os web services da SEFAZ. Esta arquitetura, que separa a estrutura de dados da lógica de emissão, é a mesma utilizada com sucesso nos outros documentos fiscais eletrônicos da localização brasileira.

Estrutura e Principais Conceitos da NF-e

O módulo l10n_br_nfe_spec mapeia com precisão a complexa estrutura hierárquica da NF-e. Os conceitos mais importantes implementados são:

  • Identificação (ide): O cabeçalho da nota, contendo informações como modelo, série, número, datas, finalidade e tipo de operação.
  • Emitente e Destinatário (emit, dest): Modelos detalhados para os dados cadastrais completos do emissor e do recebedor da mercadoria.
  • Itens da Nota (det): O coração da NF-e, um grupo repetível para cada produto ou serviço, contendo descrição, NCM, CFOP, quantidades e valores.
  • Impostos (imposto): Dentro de cada item, há uma estrutura complexa para o detalhamento de todos os tributos incidentes (ICMS, IPI, PIS, COFINS, etc.).
  • Totais (total): Contém o grupo ICMSTot com a consolidação de todas as bases de cálculo e valores de impostos da nota.
  • Transporte (transp): Modelos para informar a modalidade do frete, os dados da transportadora, do veículo e dos volumes transportados.
  • Pagamento (pag): Estrutura para detalhar as formas de pagamento (detPag), incluindo informações de cartões, PIX e boletos.

Geração de Código Automatizada

A principal característica deste módulo é que 100% dos seus modelos de dados Odoo são gerados automaticamente a partir dos esquemas XSD oficiais, publicados pelo Portal da NF-e. Essa geração pelo xsdata-odoo garante máxima fidelidade aos leiautes fiscais e agilidade na atualização para novas versões.

Embora os esquemas XSD oficiais da NF-e sejam publicados e mantidos no Portal da SEFAZ, a arquitetura deste projeto se apoia na biblioteca nfelib para a tarefa de serialização dos dados em XML. Para facilitar o processo de desenvolvimento e garantir a consistência, a própria nfelib armazena em seu repositório uma cópia atualizada desses esquemas oficiais.

Portanto, a prática recomendada para (re)gerar os modelos deste módulo é utilizar um clone local do repositório da nfelib como fonte para os arquivos de esquema (.xsd), direcionando o comando do xsdata-odoo para o diretório correspondente.

Links:

  • GitHub - akretion/xsdata-odoo: Odoo abstract model generator from xsd schemas using xsdata
  • GitHub - akretion/nfelib

O comando utilizado para gerar os modelos da versão 4.0 da NF-e foi:

Prefixo dos campos e versão

Com mais de 800 campos fiscais apenas na NF-e, com uma meia dúzia de documentos fiscais complexos, com 3000 módulos OCA, existiria um risco real de conflito com os nomes de campos vindo dos esquemas. Além disso, temos várias versões da NFe, a 3.1, a 4.0 etc...

Nisso foi decidido que cada campo tem um prefixo composto do nome do schema e de alguns dígitos da versão do esquema. No caso nfe40_. A escolha de 2 dígitos permite que uma atualização menor do esquema use os mesmos campos (e dados no banco então) e que um simples update Odoo (--update=...) consiga resolver a migração. Enquanto que para uma mudança maior como de 3.1 para 4.0, seria assumido de usar novos campos e novas tabelas (para os objetos não Odoo) e que a lib nfelib iria trabalhar com os campos da versão maior do documento fiscal considerado.

O Tratamento Específico dos Impostos ICMS e ICMSSN

Um desafio particular na geração dos modelos da NF-e é a forma como o ICMS é estruturado no XSD oficial. O esquema define um grupo de tags para cada CST de ICMS (ex: ICMS00, ICMS10, ICMS40, etc.), muitos dos quais contêm campos com nomes idênticos (como vBC, pICMS, vICMS).

Se todos esses grupos fossem gerados e injetados no mesmo modelo Odoo, ocorreriam colisões de nomes de campos. Para resolver isso, o comando de geração utiliza o parâmetro XSDATA_SKIP para ignorar explicitamente essas classes de imposto individuais.

Essa abordagem é a ideal, pois a localização brasileira do Odoo, através do módulo l10n_br_fiscal, já possui um sistema robusto e genérico para cálculo e representação de impostos. Portanto, o mapeamento dos campos de impostos para o XML é uma tarefa que exige uma lógica mais elaborada, sendo delegada ao módulo de implementação (l10n_br_nfe), que é o local apropriado para tais regras de negócio.

auto_awesome What this module does

AI-generated from the code · Odoo 18.0

Provides the technical data structure (abstract models) that mirrors the official Brazilian NF-e/NFC-e 4.0 layout, including the new IBS, CBS and Imposto Seletivo tax fields. It does not issue invoices by itself; it is the foundation used by the actual NF-e issuing module.

This module is a library of abstract data models, not a screen users work with directly. It contains no menus, no buttons and no reports; it only defines the fields and their groupings that match the official SEFAZ NF-e layout 4.0.

What it covers, as shown in the code:

  • Tax reform fields for IBS (state and municipal) and CBS, including base, rates, values, reductions, deferral, presumed credit, credit reversal and transfers.
  • Monophasic taxation groups (ad rem and ad valorem) for IBS and CBS, including retention and previously withheld amounts, plus biofuel mixture differences.
  • Imposto Seletivo fields: tax situation code, classification code, base, rates, unit, quantity and calculated value.
  • Totals groups for IBS/CBS and for Imposto Seletivo.
  • Special regimes: incentivised areas (ALC/ZFM) with zero CBS rate, government purchases, regular taxation, and payment references to earlier fiscal documents.

A shared abstract model spec.mixin.nfe adds a Brazilian currency field (brl_currency_id) computed as BRL, used by monetary fields such as ad rem rates. Because the module has no dependencies and no menus, installing it alone changes nothing visible in Odoo; it becomes useful only when a real NF-e implementation module maps these models onto fiscal documents.

Required by other modules

Models and fields (30)
  • nfe.40.di · new modelnfe40_CPF (CPF do adquirente ou do encomendante), nfe40_adi (Adições (NT 2011/004)), nfe40_dDI (Data de registro da DI/DSI/DA), nfe40_nDI (Número do Documento de Importação), nfe40_CNPJ (CNPJ do adquirente ou do encomendante), nfe40_vAFRMM (Valor Adicional ao frete para renovação), nfe40_dDesemb (Data do desembaraço aduaneiro), nfe40_UFDesemb (UF onde ocorreu o desembaraço aduaneiro), nfe40_DI_prod_id, nfe40_UFTerceiro (Sigla da UF do adquirente), nfe40_xLocDesemb (Local do desembaraço aduaneiro), nfe40_cExportador (Código do exportador), nfe40_tpViaTransp (Via), nfe40_tpIntermedio (Forma de Importação quanto)
  • nfe.40.ii · new modelnfe40_vBC (Base da BC do Imposto de Importação), nfe40_vII (Valor do Imposto de Importação), nfe40_vIOF (Valor), nfe40_vDespAdu (Valor das despesas aduaneiras)
  • nfe.40.adi · new modelnfe40_nDraw (Número do ato concessório de Drawback), nfe40_nAdicao (Número da Adição), nfe40_vDescDI (Valor do desconto do item), nfe40_nSeqAdic (Número seqüencial do item), nfe40_adi_DI_id, nfe40_cFabricante (Código do fabricante estrangeiro)
  • nfe.40.det · new modelnfe40_prod (Dados dos produtos e serviços da NF-e), nfe40_nItem (Número do item do NF), nfe40_vItem (Valor total do Item), nfe40_imposto (Tributos incidentes nos produtos), nfe40_obsItem (Grupo de observações de uso livre), nfe40_infAdProd (Informações adicionais do produto), nfe40_impostoDevol (impostoDevol), nfe40_det_infNFe_id, nfe40_DFeReferenciado (Referenciamento de item de outros DFe)
  • nfe.40.dup · new modelnfe40_nDup (Número da duplicata), nfe40_vDup (Valor da duplicata), nfe40_dVenc (Data de vencimento da duplicata), nfe40_dup_cobr_id
  • nfe.40.fat · new modelnfe40_nFat (Número da fatura), nfe40_vLiq (Valor líquido da fatura), nfe40_vDesc (Valor do desconto da fatura), nfe40_vOrig (Valor original da fatura)
  • nfe.40.ide · new modelnfe40_cDV (Digito Verificador da Chave de Acesso), nfe40_cNF (Código numérico que compõe a Chave), nfe40_cUF (Código da UF do emitente), nfe40_mod (Código do modelo do Documento Fiscal), nfe40_nNF (Número do Documento Fiscal), nfe40_tpNF (Tipo do Documento Fiscal), nfe40_NFref (Grupo de infromações da NF referenciada), nfe40_dhEmi (Data e Hora de emissão), nfe40_natOp (Descrição da Natureza da Operação), nfe40_serie (Série do Documento Fiscal), nfe40_tpAmb (Identificação do Ambiente), nfe40_tpImp (Formato de impressão do DANFE), nfe40_xJust (Justificativa da entrada), nfe40_cIndOp (Código indicador do local da operação), nfe40_cMunFG (Código do Município de Ocorrência), nfe40_dhCont (data e hora de entrada), nfe40_finNFe (Finalidade da emissão da NF-e), nfe40_idDest (Identificador de Local de destino), nfe40_tpEmis (Forma de emissão da NF-e), nfe40_indPres (Indicador de presença do comprador), nfe40_procEmi (Processo de emissão utilizado), nfe40_verProc (versão do aplicativo utilizado), nfe40_dhSaiEnt (Data e Hora da saída ou de entrada), nfe40_indFinal (Indica operação com consumidor final), nfe40_cMunFGIBS (município de ocorrência do fato gerador), nfe40_gCompraGov (Grupo de Compras Governamentais), nfe40_tpNFDebito (Tipo de Nota de Débito), nfe40_indIntermed (Indicador de intermediador/marketplace), nfe40_tpNFCredito (Tipo de Nota de Crédito), nfe40_dPrevEntrega (Data da previsão de entrega)
  • nfe.40.ipi · new modelnfe40_vIPIDevol (Valor do IPI devolvido)
  • nfe.40.med · new modelnfe40_vPMC (Preço Máximo ao Consumidor), nfe40_cProdANVISA (Utilizar o número do registro ANVISA), nfe40_xMotivoIsencao (Obs)
  • nfe.40.pag · new modelnfe40_detPag (Grupo de detalhamento da forma), nfe40_vTroco (Valor do Troco)
  • nfe.40.pis · new modelnfe40_PISNT (PISNT), nfe40_PISAliq (Código de Situação Tributária do PIS), nfe40_PISOutr (PISOutr), nfe40_PISQtde (PISQtde)
  • nfe.40.tis · new modelnfe40_pIS (Alíquota do Imposto Seletivo), nfe40_vIS (Valor do Imposto Seletivo calculado), nfe40_CSTIS (Código Situação Tributária), nfe40_qTrib (Quantidade com abse), nfe40_uTrib (Unidade), nfe40_vBCIS (Valor do BC), nfe40_adRemIS (Alíquota do Imposto Seletivo (adRemIS)), nfe40_cClassTribIS (cClassTribIS)
  • nfe.40.vol · new modelnfe40_esp (Espécie dos volumes transportados), nfe40_nVol (Numeração dos volumes transportados), nfe40_qVol (Quantidade de volumes transportados), nfe40_marca (Marca dos volumes transportados), nfe40_pesoB (Peso bruto (em kg)), nfe40_pesoL (Peso líquido (em kg)), nfe40_lacres (lacres), nfe40_vol_transp_id
  • nfe.40.arma · new modelnfe40_descr (Descrição completa da arma), nfe40_nCano (Número de série do cano), nfe40_nSerie (Número de série da arma), nfe40_tpArma (Indicador do tipo de arma de fogo), nfe40_arma_prod_id
  • nfe.40.cana · new modelnfe40_ref (Mês e Ano de Referência), nfe40_vFor (Valor dos fornecimentos), nfe40_deduc (Deduções - Taxas e Contribuições), nfe40_safra (Identificação da safra), nfe40_forDia (Fornecimentos diários), nfe40_qTotAnt (Total Anterior), nfe40_qTotGer (Total Geral), nfe40_qTotMes (Total do mês), nfe40_vLiqFor (Valor Líquido dos fornecimentos), nfe40_vTotDed (Valor Total das Deduções)
  • nfe.40.card · new modelnfe40_CNPJ (CNPJ da instituição de pagamento), nfe40_cAut (Número de autorização da operação), nfe40_tBand (Bandeira da operadora de cartão), nfe40_CNPJReceb (CNPJ do beneficiário do pagamento), nfe40_idTermPag (Identificador do terminal de pagamento), nfe40_tpIntegra (Tipo de Integração do processo)
  • nfe.40.cide · new modelnfe40_vCIDE (Valor do CIDE), nfe40_qBCProd (BC do CIDE), nfe40_vAliqProd (Alíquota do CIDE (em reais))
  • nfe.40.cobr · new modelnfe40_dup (Dados das duplicatas NT 2011/004), nfe40_fat (Dados da fatura)
  • nfe.40.comb · new modelnfe40_CIDE (CIDE Combustíveis), nfe40_pBio (Percentual do índice de mistura), nfe40_pGLP (Percentual do GLP derivado do petróleo), nfe40_pGNi (Percentual), nfe40_pGNn (Percentual de gás natural nacional), nfe40_CODIF (Código de autorização / registro), nfe40_qTemp (Quantidade de combustível), nfe40_vPart (Valor de partida), nfe40_UFCons (Sigla da UF de Consumo), nfe40_descANP (Descrição do Produto conforme ANP), nfe40_cProdANP (Código de produto da ANP), nfe40_origComb (Grupo indicador da origem do combustível), nfe40_encerrante (Informações do grupo de 'encerrante')
  • nfe.40.dest · new modelnfe40_IE (Inscrição Estadual), nfe40_IM (Inscrição Municipal do tomador), nfe40_CPF (Número do CPF), nfe40_CNPJ (Número do CNPJ), nfe40_ISUF (Inscrição na SUFRAMA), nfe40_email (e-mail do destinatário), nfe40_xNome (Razão Social ou nome do destinatário), nfe40_enderDest (Dados do endereço), nfe40_indIEDest (Indicador da IE do destinatário), nfe40_idEstrangeiro (Identificador do destinatário)
  • nfe.40.emit · new modelnfe40_IE (Inscrição Estadual do Emitente), nfe40_IM (Inscrição Municipal), nfe40_CPF (Número do CPF do emitente), nfe40_CRT (Código de Regime Tributário), nfe40_CNAE (CNAE Fiscal), nfe40_CNPJ (Número do CNPJ do emitente), nfe40_IEST (Inscricao Estadual), nfe40_xFant (Nome fantasia), nfe40_xNome (Razão Social ou Nome do emitente), nfe40_ISUFEmit (Inscrição do emitente na Suframa), nfe40_enderEmit (Endereço do emitente)
  • nfe.40.icms · new modelnfe40_ICMSST (Grupo de informação), nfe40_ICMSPart (Partilha do ICMS entre a UF de origem)
  • nfe.40.prod · new modelnfe40_DI (Declaração de Importação), nfe40_NCM (Código NCM (8 posições)), nfe40_NVE (Nomenclatura de Valor aduaneio), nfe40_med (grupo do detalhamento de Medicamentos), nfe40_CEST (Codigo especificador), nfe40_CFOP (Cfop), nfe40_arma (Armamentos), nfe40_cEAN (GTIN), nfe40_comb (Informar apenas para operações), nfe40_nFCI (Número de controle da FCI), nfe40_qCom (Quantidade Comercial do produto), nfe40_uCom (Unidade comercial), nfe40_vSeg (Valor Total do Seguro), nfe40_xPed (pedido de compra), nfe40_cProd (Código do produto ou serviço), nfe40_gCred (Grupo de informações sobre), nfe40_qTrib (Quantidade Tributável), nfe40_uTrib (Unidade Tributável), nfe40_vDesc (Valor do Desconto), nfe40_vProd (Valor bruto do produto ou serviço), nfe40_xProd (Descrição do produto ou serviço), nfe40_EXTIPI (Código EX TIPI (3 posições)), nfe40_cBarra (Codigo de barras diferente), nfe40_cBenef (cBenef), nfe40_indTot (Este campo deverá ser preenchido), nfe40_rastro (rastro), nfe40_vFrete (Valor Total do Frete), nfe40_vOutro (Outras despesas acessórias), nfe40_vUnCom (Valor unitário de comercialização), nfe40_CNPJFab (CNPJ do Fabricante da Mercadoria)
  • nfe.40.tdif · new modelnfe40_pDif (Percentual do diferimento), nfe40_vDif (Valor do diferimento)
  • nfe.40.tipi · new modelnfe40_cEnq (Código de Enquadramento Legal do IPI), nfe40_IPINT (IPINT), nfe40_cSelo (Código do selo de controle do IPI), nfe40_qSelo (Quantidade de selo de controle do IPI), nfe40_IPITrib (IPITrib), nfe40_CNPJProd (CNPJ do produtor da mercadoria)
  • nfe.40.tnfe · new modelnfe40_infNFe (Informações da Nota Fiscal eletrônica), nfe40_infNFeSupl (Informações suplementares Nota Fiscal), nfe40_NFe_TEnviNFe_id
  • nfe.40.tred · new modelnfe40_pRedAliq (Percentual de redução de aliquota), nfe40_pAliqEfet (Aliquota Efetiva que será aplicada)
  • nfe.40.deduc · new modelnfe40_vDed (valor da dedução), nfe40_xDed (Descrição da Dedução), nfe40_deduc_cana_id
  • nfe.40.gcred · new modelnfe40_gCred_prod_id, nfe40_cCredPresumido (Código de Benefício Fiscal), nfe40_pCredPresumido (Percentual do Crédito Presumido), nfe40_vCredPresumido (Valor do Crédito Presumido)
  • nfe.40.gmono · new modelnfe40_vCBSMono (Valor total da CBS monofásica), nfe40_vIBSMono (Valor total do IBS monofásico), nfe40_vCBSMonoRet (Valor (vCBSMonoRet)), nfe40_vIBSMonoRet (Valor), nfe40_vCBSMonoReten (Valor total da CBS monofásica sujeita), nfe40_vIBSMonoReten (Valor total do IBS monofásico sujeito)

Text generated by AI (DeepSeek) from reading the Odoo 18.0 code on GitHub; it may contain mistakes, so check the code before deciding. The module is very large and only part of the code was read. View the code on GitHub

Availability by version

Reviewed: 2026-11-03
Confirmed (verified in repository and branch) Estimated (unverified) No information

Confirmation status: 7 confirmed, 2 with no information of 9 versions.

Sources · Odoo 13.0

Confirmed on 2026-11-03 in branch 13.0 of OCA/l10n-brazil.

terminal Installation and usage

No verified information

Installation instructions, the distribution package, dependencies and configuration steps are not shown because they have not yet been verified in the module documentation for any version.

info

Data imported from GitHub: this sheet reflects the latest catalog review, not a live lookup. Always check the module documentation and staging before installing in production.