Skip to content

Commit d8ef66e

Browse files
committed
[ADD] l10n_br_nfe_dfe: DF-e for NF-e
1 parent 5e2c87d commit d8ef66e

23 files changed

+1783
-0
lines changed

l10n_br_nfe_dfe/README.rst

Lines changed: 291 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,291 @@
1+
===============
2+
Monitor de NF-e
3+
===============
4+
5+
..
6+
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
7+
!! This file is generated by oca-gen-addon-readme !!
8+
!! changes will be overwritten. !!
9+
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
10+
!! source digest: sha256:60c6f65af17a8157d859d7ff5644fd37d321027d1c3c957a9fd9a49cee107c0b
11+
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
12+
13+
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
14+
:target: https://odoo-community.org/page/development-status
15+
:alt: Beta
16+
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
17+
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
18+
:alt: License: AGPL-3
19+
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fl10n--brazil-lightgray.png?logo=github
20+
:target: https://github.com/OCA/l10n-brazil/tree/16.0/l10n_br_nfe_dfe
21+
:alt: OCA/l10n-brazil
22+
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
23+
:target: https://translation.odoo-community.org/projects/l10n-brazil-16-0/l10n-brazil-16-0-l10n_br_nfe_dfe
24+
:alt: Translate me on Weblate
25+
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
26+
:target: https://runboat.odoo-community.org/builds?repo=OCA/l10n-brazil&target_branch=16.0
27+
:alt: Try me on Runboat
28+
29+
|badge1| |badge2| |badge3| |badge4| |badge5|
30+
31+
Monitor de NF-e (Distribuição de DFe)
32+
=====================================
33+
34+
Este módulo implementa a funcionalidade de monitoramento, download e
35+
processamento automático de **Notas Fiscais Eletrônicas (NF-e, modelo
36+
55)** emitidas contra o CNPJ da sua empresa. Ele opera conectando-se
37+
diretamente ao Web Service de Distribuição de DF-e da SEFAZ (Ambiente
38+
Nacional).
39+
40+
Este módulo estende o framework abstrato genérico ``l10n_br_fiscal_dfe``
41+
e incorpora as necessidades e especificidades exclusivas aplicadas à
42+
Nota Fiscal Eletrônica (como Manifestação do Destinatário e os schemas
43+
XML da NF-e).
44+
45+
Principais Funcionalidades
46+
--------------------------
47+
48+
- **Consulta Automática (Polling):** Tarefa agendada (Cron) que
49+
consulta periodicamente o serviço da SEFAZ, garantindo que você tenha
50+
acesso rápido a todas as NF-es emitidas contra o seu CNPJ sem
51+
precisar solicitar o arquivo ao fornecedor.
52+
- **Processamento Especializado:** Identifica e separa os payloads
53+
baixados nos seus devidos formatos: XMLs Completos com protocolo
54+
(``procNFe``), Resumos da NF-e (``resNFe``) e Eventos da Nota Fiscal
55+
(``resEvento`` / ``procEventoNFe``).
56+
- **Manifestação do Destinatário (MD-e):** Funcionalidade nativa para
57+
acusar o recebimento ou rejeição da NF-e perante a SEFAZ:
58+
59+
- **Ciência da Operação:** Confirmação prévia para liberar o
60+
download do XML completo.
61+
- **Confirmação da Operação.**
62+
- **Desconhecimento da Operação.**
63+
- **Operação não Realizada.**
64+
65+
- **Manifestação Automática:** Opção para o Odoo aplicar o evento de
66+
"Ciência da Operação" instantânea e automaticamente a todas as novas
67+
notas resumidas identificadas, acelerando o recebimento do arquivo
68+
completo para importação.
69+
- **Importação Inteligente:** Botão de ação que converte
70+
instantaneamente o XML válido baixado em um rascunho de Documento
71+
Fiscal padrão do Odoo (``l10n_br_fiscal.document``), pré-populando os
72+
impostos, CFOPs, emitentes e destinatários.
73+
- **Geração de DANFE:** Geração do documento PDF do DANFE utilizando a
74+
biblioteca ``brazilfiscalreport``.
75+
- **Notificações:** Notifica os usuários inscritos, diretamente no
76+
inbox do Odoo, caso novas NF-es emitidas por terceiros sejam
77+
detectadas no servidor da Receita Federal.
78+
79+
Este módulo é implementado em estrita conformidade com a `Nota Técnica
80+
2014.002
81+
v1.30 <https://www.nfe.fazenda.gov.br/portal/exibirArquivo.aspx?conteudo=P0U3lU1Fe40=>`__.
82+
83+
**Table of contents**
84+
85+
.. contents::
86+
:local:
87+
88+
Installation
89+
============
90+
91+
Este módulo requer os seguintes componentes e dependências para
92+
funcionar corretamente:
93+
94+
1. **Dependências Odoo:**
95+
96+
- ``l10n_br_fiscal_dfe`` (O framework de distribuição abstrato da
97+
OCA)
98+
- ``l10n_br_nfe`` (O módulo base de emissão e gestão de modelos da
99+
NF-e)
100+
- ``queue_job`` (Sempre requerido pelo framework base para
101+
agendamentos e chamadas assíncronas)
102+
103+
2. **Dependências Python:**
104+
105+
- ``nfelib``: A biblioteca moderna que consolida os *bindings* e
106+
clientes de comunicação para NF-e/CT-e/MDF-e.
107+
- ``brazilfiscalreport``: Necessária para realizar o *parse* do XML
108+
e desenhar a saída em formato PDF (DANFE).
109+
110+
Para instalar as bibliotecas de sistema Python:
111+
112+
.. code:: bash
113+
114+
pip install nfelib brazilfiscalreport
115+
116+
Configuração Pré-Requisito Obrigatória
117+
--------------------------------------
118+
119+
A SEFAZ bloqueia e rejeita as chamadas aos Web Services caso sua empresa
120+
não esteja perfeitamente configurada no Odoo. Antes de rodar as
121+
consultas:
122+
123+
1. Acesse o cadastro de **Empresas** e preencha corretamente o Estado
124+
(UF) e o **CNPJ/CPF** (somente numéricos ou formatado).
125+
2. Na aba **Fiscal** -> **Certificados**, faça o upload e valide o
126+
**Certificado Digital A1** com a senha correta. Este certificado será
127+
utilizado ativamente pelo módulo para a troca de chaves com o
128+
Ambiente Nacional da SEFAZ.
129+
130+
Configuration
131+
=============
132+
133+
Canal queue_job
134+
---------------
135+
136+
O módulo registra os jobs de distribuição DF-e no canal ``root.dfe``. É
137+
**obrigatório** configurar este canal com capacidade máxima de **1 job
138+
simultâneo**, caso contrário consultas concorrentes à SEFAZ podem causar
139+
erro 656 (consumo indevido) e bloqueio temporário do CNPJ.
140+
141+
No arquivo de configuração do Odoo:
142+
143+
.. code:: ini
144+
145+
[queue_job]
146+
channels = root:2,root.dfe:1
147+
148+
Ou via variável de ambiente:
149+
150+
::
151+
152+
ODOO_QUEUE_JOB_CHANNELS=root:2,root.dfe:1
153+
154+
Configuração da empresa
155+
-----------------------
156+
157+
Em **Faturamento > Configuração > Empresas**, na aba **Fiscal > DF-e**
158+
(Configurações DF-e):
159+
160+
- **Versão DF-e**: versão do serviço (padrão: 1.01)
161+
- **Ambiente DF-e**: Produção ou Homologação
162+
- **Busca automática de DF-e**: habilita a consulta automática via cron
163+
- **Manifestação Automática do Destinatário (NF-e)**: envia ciência da
164+
operação automaticamente para cada resumo de NF-e recebido
165+
166+
A empresa precisa ter um **certificado digital A1** configurado no
167+
módulo ``l10n_br_fiscal_certificate``.
168+
169+
Notificação de documentos (por usuário)
170+
---------------------------------------
171+
172+
Em **Preferências do Usuário**, o campo **Notificação DF-e** habilita o
173+
recebimento de notificações na caixa de entrada quando novos documentos
174+
de terceiros são encontrados pela distribuição DF-e.
175+
176+
Usage
177+
=====
178+
179+
Configuração
180+
------------
181+
182+
Para habilitar a busca e o processamento automático de notas:
183+
184+
1. Acesse **Configurações > Usuários e Empresas > Empresas**.
185+
2. Abra o cadastro da sua empresa e localize a aba ou seção **NF-e
186+
DF-e**.
187+
3. Marque a opção **Auto-fetch NF-e** para que o Odoo realize as
188+
consultas periódicas de forma agendada em background.
189+
4. Opcionalmente, ative a **Manifestação Automática** caso queira que o
190+
sistema registre o evento de "Ciência da Operação" automaticamente
191+
assim que a SEFAZ alertar sobre a existência de uma nota nova. Isso
192+
acelera significativamente a liberação do XML completo para download.
193+
194+
Painel de Controle (Dashboard)
195+
------------------------------
196+
197+
Acesse a visão principal navegando por **Faturamento > Fiscal >
198+
Consultas DF-e > NF-e de Terceiros**.
199+
200+
No topo da listagem, o sistema exibe um painel de status em tempo real
201+
da sua comunicação com a SEFAZ:
202+
203+
- **Status do Ambiente:** Indica se você está operando em Produção ou
204+
Homologação.
205+
- **Progresso do NSU:** Mostra a numeração em que o seu Odoo está
206+
(Último NSU) comparado ao NSU máximo registrado na base da Receita
207+
Federal para o seu CNPJ. Quando os números se igualam, a tag verde
208+
"Sincronizado" é exibida.
209+
- **Importações Pendentes:** Um contador de alerta que mostra quantas
210+
notas completas já foram baixadas em XML, mas ainda não foram
211+
efetivamente importadas como Documentos Fiscais no Odoo.
212+
213+
Fluxo de Trabalho e Ações Disponíveis
214+
-------------------------------------
215+
216+
Ao clicar em um documento na listagem, você poderá identificar a sua
217+
situação através das cores (Azul para Resumo, Verde para XML Completo).
218+
O fluxo padrão permite as seguintes ações:
219+
220+
1. **Manifestar:** Botão que abre o assistente para você enviar
221+
oficialmente um evento à SEFAZ (Ciência, Confirmação, Desconhecimento
222+
ou Operação Não Realizada). Lembre-se: por regras da SEFAZ, o XML
223+
completo com validade jurídica (``procNFe``) só é liberado para
224+
download após uma manifestação de Ciência ou Confirmação.
225+
2. **Importar como Documento Fiscal:** Disponível apenas quando o XML
226+
completo já foi baixado. Este botão converte o XML imediatamente em
227+
um registro de ``l10n_br_fiscal.document``, preenchendo
228+
automaticamente os fornecedores, CFOPs e valores para uso nos módulos
229+
de compras e estoque.
230+
3. **Download PDF:** Utiliza os dados do XML para gerar e baixar o
231+
arquivo PDF do DANFE.
232+
4. **Pesquisa Específica:** No painel superior das listagens, você
233+
encontra o assistente de busca específica. Ele permite pular o
234+
sequencial de NSU e forçar a requisição pontual de uma NF-e
235+
utilizando apenas a sua **Chave de Acesso** (44 dígitos), ideal para
236+
notas de recebimento urgente.
237+
238+
Bug Tracker
239+
===========
240+
241+
Bugs are tracked on `GitHub Issues <https://github.com/OCA/l10n-brazil/issues>`_.
242+
In case of trouble, please check there if your issue has already been reported.
243+
If you spotted it first, help us to smash it by providing a detailed and welcomed
244+
`feedback <https://github.com/OCA/l10n-brazil/issues/new?body=module:%20l10n_br_nfe_dfe%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
245+
246+
Do not contact contributors directly about support or help with technical issues.
247+
248+
Credits
249+
=======
250+
251+
Authors
252+
-------
253+
254+
* Engenere
255+
* KMEE
256+
257+
Contributors
258+
------------
259+
260+
- `Engenere <https://engenere.one>`__:
261+
262+
- Felipe Motter <felipe@engenere.one>
263+
- Antônio Neto <neto@engenere.one>
264+
- Cristiano Mafra Junior
265+
266+
- `KMEE <https://www.kmee.com.br>`__:
267+
268+
- Luis Felipe Miléo <mileo@kmee.com.br>
269+
- Gabriel Cardoso <gabriel.cardoso@kmee.com.br>
270+
- Felipe Zago <felipe.zago@kmee.com.br>
271+
272+
- `AKRETION <https://akretion.com/pt-BR/>`__:
273+
274+
- Raphaël Valyi <raphael.valyi@akretion.com.br>
275+
276+
Maintainers
277+
-----------
278+
279+
This module is maintained by the OCA.
280+
281+
.. image:: https://odoo-community.org/logo.png
282+
:alt: Odoo Community Association
283+
:target: https://odoo-community.org
284+
285+
OCA, or the Odoo Community Association, is a nonprofit organization whose
286+
mission is to support the collaborative development of Odoo features and
287+
promote its widespread use.
288+
289+
This module is part of the `OCA/l10n-brazil <https://github.com/OCA/l10n-brazil/tree/16.0/l10n_br_nfe_dfe>`_ project on GitHub.
290+
291+
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

l10n_br_nfe_dfe/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import models

l10n_br_nfe_dfe/__manifest__.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Copyright 2026 Engenere
2+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
3+
{
4+
"name": "Monitor de NF-e",
5+
"summary": """
6+
Monitor incoming NF-e documents via the DF-e distribution web service
7+
(NFeDistribuicaoDFe).
8+
""",
9+
"version": "16.0.1.0.0",
10+
"license": "AGPL-3",
11+
"author": "Engenere, KMEE, Odoo Community Association (OCA)",
12+
"website": "https://github.com/OCA/l10n-brazil",
13+
"depends": ["l10n_br_fiscal_dfe", "l10n_br_nfe"],
14+
"data": [
15+
# Data & Actions
16+
"data/ir_cron.xml",
17+
"data/queue_job_data.xml",
18+
# Views
19+
"views/nfe_dfe_views.xml",
20+
"views/nfe_document_views.xml", # Inherits base to add MD-e buttons
21+
"views/res_company_view.xml", # Adds nfe_last_nsu, auto_manifest, etc.
22+
],
23+
"external_dependencies": {
24+
"python": [
25+
"nfelib",
26+
"brazilfiscalreport",
27+
],
28+
},
29+
}

l10n_br_nfe_dfe/data/ir_cron.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<odoo>
3+
<data noupdate="1">
4+
<record id="ir_cron_search_nfe_dfe" model="ir.cron">
5+
<field name="name">DF-e: Auto-fetch NF-e</field>
6+
<field name="model_id" ref="base.model_res_company" />
7+
<field name="state">code</field>
8+
<field name="code">model._cron_nfe_dfe_search_documents()</field>
9+
<field name="interval_number">1</field>
10+
<field name="interval_type">hours</field>
11+
<field name="numbercall">-1</field>
12+
<field name="active" eval="False" />
13+
</record>
14+
</data>
15+
</odoo>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
<!--
3+
Copyright 2026 Engenere
4+
License AGPL-3 or later (http://www.gnu.org/licenses/agpl)
5+
-->
6+
<odoo noupdate="0">
7+
<record id="job_function_nfe_dfe_document_distribution" model="queue.job.function">
8+
<field name="model_id" ref="base.model_res_company" />
9+
<field name="method">_nfe_dfe_document_distribution</field>
10+
<field name="channel_id" ref="l10n_br_fiscal_dfe.channel_dfe" />
11+
</record>
12+
13+
<record id="job_function_md_event_action_confirm" model="queue.job.function">
14+
<field name="model_id" ref="l10n_br_nfe.model_l10n_br_nfe_md_event" />
15+
<field name="method">action_confirm</field>
16+
<field name="channel_id" ref="l10n_br_fiscal_dfe.channel_dfe" />
17+
</record>
18+
</odoo>

l10n_br_nfe_dfe/models/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from . import dfe_document
2+
from . import res_company
3+
from . import nfe_md_event

0 commit comments

Comments
 (0)