From b13c7229167b484d68cad2e80dc967c9854b4ad9 Mon Sep 17 00:00:00 2001 From: Marcel Savegnago Date: Tue, 3 Dec 2024 15:17:22 -0300 Subject: [PATCH 1/5] [RFC] l10n_br_nfe: refactor nfce qrcode methods --- l10n_br_nfe/models/document.py | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/l10n_br_nfe/models/document.py b/l10n_br_nfe/models/document.py index abdfcc7092b0..8abf6d66a408 100644 --- a/l10n_br_nfe/models/document.py +++ b/l10n_br_nfe/models/document.py @@ -1226,14 +1226,23 @@ def _is_nfe_found(c_stat): def _prepare_nfce_send(self): self.ensure_one() - self._prepare_payments_for_nfce() - self.nfe40_infNFeSupl = self.env["l10n_br_fiscal.document.supplement"].create( - { - "nfe40_qrCode": self.get_nfce_qrcode(), - "nfe40_urlChave": self.get_nfce_qrcode_url(), - } + self.nfe40_detPag.filtered(lambda p: p.nfe40_tPag == "99").write( + {"nfe40_xPag": "Outros"} ) + def _document_qrcode(self): + super()._document_qrcode() + + for record in self.filtered(lambda d: d.document_type == MODELO_FISCAL_NFCE): + record.nfe40_infNFeSupl = self.env[ + "l10n_br_fiscal.document.supplement" + ].create( + { + "qrcode": record.get_nfce_qrcode(), + "url_key": record.get_nfce_qrcode_url(), + } + ) + def _eletronic_document_send(self): super()._eletronic_document_send() for record in self.filtered(filter_processador_edoc_nfe): @@ -1528,12 +1537,6 @@ def get_nfce_qrcode_url(self): return self._edoc_processor().consulta_qrcode_url - def _prepare_payments_for_nfce(self): - for rec in self.filtered(lambda d: d.document_type == MODELO_FISCAL_NFCE): - rec.nfe40_detPag.filtered(lambda p: p.nfe40_tPag == "99").write( - {"nfe40_xPag": "Outros"} - ) - def action_danfe_nfce_report(self): return ( self.env["ir.actions.report"] From dac4511d8c389d7c3452d5bf81d6c750a2221748 Mon Sep 17 00:00:00 2001 From: Diego Paradeda Date: Tue, 10 Dec 2024 15:58:37 -0300 Subject: [PATCH 2/5] [FIX] l10n_br_nfe: unlink nfesupl before reassigning --- l10n_br_nfe/models/document.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/l10n_br_nfe/models/document.py b/l10n_br_nfe/models/document.py index 8abf6d66a408..977cd5970c7b 100644 --- a/l10n_br_nfe/models/document.py +++ b/l10n_br_nfe/models/document.py @@ -1234,6 +1234,8 @@ def _document_qrcode(self): super()._document_qrcode() for record in self.filtered(lambda d: d.document_type == MODELO_FISCAL_NFCE): + if record.nfe40_infNFeSupl: + record.nfe40_infNFeSupl.unlink() record.nfe40_infNFeSupl = self.env[ "l10n_br_fiscal.document.supplement" ].create( From 32e7c19bd14c695fd1de9e32ff105a587e15a418 Mon Sep 17 00:00:00 2001 From: Diego Paradeda Date: Thu, 12 Dec 2024 13:14:41 -0300 Subject: [PATCH 3/5] [FIX] l10n_br_nfe: nfce test csc vars have strict pattern --- l10n_br_nfe/tests/test_nfce.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/l10n_br_nfe/tests/test_nfce.py b/l10n_br_nfe/tests/test_nfce.py index 9bc9f964f9da..030589af8bb3 100644 --- a/l10n_br_nfe/tests/test_nfce.py +++ b/l10n_br_nfe/tests/test_nfce.py @@ -44,8 +44,8 @@ def setUp(self): } ) self.document_id.company_id.certificate_nfe_id = certificate_id - self.document_id.company_id.nfce_csc_token = "DUMMY" - self.document_id.company_id.nfce_csc_code = "DUMMY" + self.document_id.company_id.nfce_csc_token = "1" + self.document_id.company_id.nfce_csc_code = "1" self.prepare_test_nfe(self.document_id) From 31f8b6dc8f5fb01f30ef9f76b645c9ce7d438037 Mon Sep 17 00:00:00 2001 From: Diego Paradeda Date: Thu, 12 Dec 2024 17:05:13 -0300 Subject: [PATCH 4/5] [FIX] l10n_br_nfe: nfce test contingency --- l10n_br_account_nfe/models/document.py | 2 ++ .../tests/test_nfce_contingency.py | 21 +++++++++++++++++-- l10n_br_nfe/models/document.py | 4 ++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/l10n_br_account_nfe/models/document.py b/l10n_br_account_nfe/models/document.py index 2e5a70ca15b7..9f934c55fb10 100644 --- a/l10n_br_account_nfe/models/document.py +++ b/l10n_br_account_nfe/models/document.py @@ -162,5 +162,7 @@ def _update_nfce_for_offline_contingency(self): res = super()._update_nfce_for_offline_contingency() if self.move_ids: copy_invoice = self.move_ids[0].copy() + copy_invoice.fiscal_document_id.processador_edoc = self.processador_edoc + copy_invoice.fiscal_document_id.nfe_transmission = self.nfe_transmission copy_invoice.action_post() return res diff --git a/l10n_br_account_nfe/tests/test_nfce_contingency.py b/l10n_br_account_nfe/tests/test_nfce_contingency.py index 6333f5710dc6..7322c06dc93e 100644 --- a/l10n_br_account_nfe/tests/test_nfce_contingency.py +++ b/l10n_br_account_nfe/tests/test_nfce_contingency.py @@ -1,6 +1,7 @@ # Copyright 2023 KMEE (Felipe Zago Rodrigues ) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from odoo import fields from odoo.tests import TransactionCase @@ -54,8 +55,24 @@ def prepare_account_move_nfce(self): "payment_mode_id": payment_mode.id, "company_id": self.env.ref("base.main_company").id, "line_ids": [ - (0, 0, {"account_id": receivable_account_id.id, "credit": 10}), - (0, 0, {"account_id": payable_account_id.id, "debit": 10}), + ( + 0, + 0, + { + "date_maturity": fields.Date.today(), + "account_id": receivable_account_id.id, + "credit": 10, + }, + ), + ( + 0, + 0, + { + "date_maturity": fields.Date.today(), + "account_id": payable_account_id.id, + "debit": 10, + }, + ), ], } ) diff --git a/l10n_br_nfe/models/document.py b/l10n_br_nfe/models/document.py index 977cd5970c7b..c58f730d931d 100644 --- a/l10n_br_nfe/models/document.py +++ b/l10n_br_nfe/models/document.py @@ -1528,6 +1528,8 @@ def get_nfce_qrcode(self): processador = self._edoc_processor() if self.nfe_transmission == "1": return processador.monta_qrcode(self.document_key) + if not self.serialize() or not len(self.serialize()): + return serialized_doc = self.serialize()[0] xml = processador.assina_raiz(serialized_doc, serialized_doc.infNFe.Id) @@ -1536,6 +1538,8 @@ def get_nfce_qrcode(self): def get_nfce_qrcode_url(self): if self.document_type != MODELO_FISCAL_NFCE: return + if self._edoc_processor() is None: + return return self._edoc_processor().consulta_qrcode_url From 2fb1c1a86f07d0277f7972d5ad5c26f40ee329d7 Mon Sep 17 00:00:00 2001 From: Diego Paradeda Date: Fri, 13 Dec 2024 16:40:30 -0300 Subject: [PATCH 5/5] [FIX] l10n_br_nfe: NFCE contingencia processador --- l10n_br_account_nfe/models/document.py | 4 +++- l10n_br_nfe/models/document.py | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/l10n_br_account_nfe/models/document.py b/l10n_br_account_nfe/models/document.py index 9f934c55fb10..65d01b40417f 100644 --- a/l10n_br_account_nfe/models/document.py +++ b/l10n_br_account_nfe/models/document.py @@ -162,7 +162,9 @@ def _update_nfce_for_offline_contingency(self): res = super()._update_nfce_for_offline_contingency() if self.move_ids: copy_invoice = self.move_ids[0].copy() + copy_invoice.fiscal_document_id.processador_edoc = self.processador_edoc - copy_invoice.fiscal_document_id.nfe_transmission = self.nfe_transmission + copy_invoice.processador_edoc = self.processador_edoc + copy_invoice.action_post() return res diff --git a/l10n_br_nfe/models/document.py b/l10n_br_nfe/models/document.py index c58f730d931d..68355bf91a9b 100644 --- a/l10n_br_nfe/models/document.py +++ b/l10n_br_nfe/models/document.py @@ -896,10 +896,17 @@ def _serialize(self, edocs): for record in self.with_context(lang="pt_BR").filtered( filter_processador_edoc_nfe ): + processor = record.processador_edoc + + # TODO: Avaliar a possibilidade de remover esse flush e invalidate record.flush() record.invalidate_cache() inf_nfe = record._build_binding("nfe", "40") + if hasattr(record, "move_ids") and record.move_ids: + record.move_ids.processador_edoc = processor + record.processador_edoc = processor + inf_nfe_supl = None if record.nfe40_infNFeSupl: inf_nfe_supl = record.nfe40_infNFeSupl._build_binding("nfe", "40")