From 93eaf8ae056063cbf0a2cbdcd8e869668e9c38e3 Mon Sep 17 00:00:00 2001 From: odooNextev Date: Thu, 6 Nov 2025 14:54:58 +0100 Subject: [PATCH] [FIX] l10n_it_riba_oca: revert and fix related documents computation Now it checks both: - Invoice-level related documents (account.move.related_document_ids) - Invoice line-level related documents (account.move.line.related_document_ids) Priority: Invoice line-level values always take precedence over invoice-level values. --- l10n_it_riba_oca/__manifest__.py | 2 +- l10n_it_riba_oca/models/riba.py | 21 ++++++++- l10n_it_riba_oca/readme/USAGE.md | 4 ++ l10n_it_riba_oca/tests/test_riba.py | 43 +++++++++++++++++++ .../wizard/wizard_riba_file_export.py | 6 +-- l10n_it_riba_oca/wizard/wizard_riba_issue.py | 12 +++++- 6 files changed, 79 insertions(+), 9 deletions(-) diff --git a/l10n_it_riba_oca/__manifest__.py b/l10n_it_riba_oca/__manifest__.py index 502fbff82293..5003ca8c9431 100644 --- a/l10n_it_riba_oca/__manifest__.py +++ b/l10n_it_riba_oca/__manifest__.py @@ -23,7 +23,7 @@ "account_due_list", "base_iban", "l10n_it_abicab", - "l10n_it_edi", + "l10n_it_edi_related_document", "account_payment_term_extension", ], "data": [ diff --git a/l10n_it_riba_oca/models/riba.py b/l10n_it_riba_oca/models/riba.py index 9f17bdb82205..e8f82974148f 100644 --- a/l10n_it_riba_oca/models/riba.py +++ b/l10n_it_riba_oca/models/riba.py @@ -283,8 +283,25 @@ def _compute_line_values(self): amount = fields.Float(compute="_compute_line_values") invoice_date = fields.Char(compute="_compute_line_values", size=256) invoice_number = fields.Char(compute="_compute_line_values", size=256) - cig = fields.Char(string="CIG", size=256) - cup = fields.Char(string="CUP", size=256) + cig = fields.Char(compute="_compute_cig_cup_values", string="CIG", size=256) + cup = fields.Char(compute="_compute_cig_cup_values", string="CUP", size=256) + + def _compute_cig_cup_values(self): + for line in self: + line.cig = "" + line.cup = "" + related_documents = line.mapped( + "move_line_ids.move_line_id.move_id.related_document_ids" + ) + + for related_document in related_documents: + if related_document.cup: + line.cup = str(related_document.cup) + if related_document.cig: + line.cig = str(related_document.cig) + # Stop if at least one value is found + if line.cup or line.cig: + break sequence = fields.Integer("Number") move_line_ids = fields.One2many( diff --git a/l10n_it_riba_oca/readme/USAGE.md b/l10n_it_riba_oca/readme/USAGE.md index ba4b75e29b9d..3a7e7fa44c84 100644 --- a/l10n_it_riba_oca/readme/USAGE.md +++ b/l10n_it_riba_oca/readme/USAGE.md @@ -33,3 +33,7 @@ impostata con la data di scadenza della RiBa, ma è possibile modificarla in due - successivamente a pagamento effettivamente avvenuto selezionando la registrazione dalla vista ed elenco ed eseguendo l'azione "Imposta data di pagamento RiBa". + +Non è possibile emettere Riba per fatture verso Enti che richiedono più di un CIG e un CUP differenti per fattura. +In questo caso particolare, emettere più fatture. +Non è possibile raggruppare Riba in fase di emissione se le fatture contengono CIG e CUP differenti. Verrà creata una riga di distinta per ogni fattura. diff --git a/l10n_it_riba_oca/tests/test_riba.py b/l10n_it_riba_oca/tests/test_riba.py index b1f50e37371d..d812d11d8cc6 100644 --- a/l10n_it_riba_oca/tests/test_riba.py +++ b/l10n_it_riba_oca/tests/test_riba.py @@ -455,6 +455,18 @@ def test_riba_fatturapa(self): }, ) ], + "related_document_ids": [ + ( + 0, + 0, + { + "type": "order", + "name": "SO1232", + "cig": "7987210EG5", + "cup": "H71N17000690124", + }, + ) + ], } ) invoice._onchange_riba_partner_bank_id() @@ -472,8 +484,12 @@ def test_riba_fatturapa(self): riba_list_id = action and action["res_id"] or False riba_list = self.slip_model.browse(riba_list_id) riba_list.confirm() + self.assertEqual(riba_list.line_ids[0].cig, "7987210EG5") + self.assertEqual(riba_list.line_ids[0].cup, "H71N17000690124") wizard_riba_export = self.env["riba.file.export"].create({}) wizard_riba_export.with_context(active_ids=[riba_list.id]).act_getfile() + riba_txt = base64.decodebytes(wizard_riba_export.riba_txt) + self.assertTrue(b"CIG: 7987210EG5 CUP: H71N17000690124" in riba_txt) # Assert file_content = base64.decodebytes(wizard_riba_export.riba_txt).decode() self.assertNotIn("INV/2025/00004", file_content) @@ -508,6 +524,18 @@ def test_riba_fatturapa_group(self): }, ) ], + "related_document_ids": [ + ( + 0, + 0, + { + "type": "order", + "name": "SO1232", + "cig": "7987210EG5", + "cup": "H71N17000690124", + }, + ) + ], } ) invoice._onchange_riba_partner_bank_id() @@ -533,6 +561,18 @@ def test_riba_fatturapa_group(self): }, ) ], + "related_document_ids": [ + ( + 0, + 0, + { + "type": "order", + "name": "SO1232", + "cig": "7987210EG5", + "cup": "H71N17000690125", + }, + ) + ], } ) invoice1._onchange_riba_partner_bank_id() @@ -556,6 +596,9 @@ def test_riba_fatturapa_group(self): self.assertTrue(len(riba_list.line_ids), 2) wizard_riba_export = self.env["riba.file.export"].create({}) wizard_riba_export.with_context(active_ids=[riba_list.id]).act_getfile() + riba_txt = base64.decodebytes(wizard_riba_export.riba_txt) + self.assertTrue(b"CIG: 7987210EG5 CUP: H71N17000690124" in riba_txt) + self.assertTrue(b"CIG: 7987210EG5 CUP: H71N17000690125" in riba_txt) # Assert file_content = base64.decodebytes(wizard_riba_export.riba_txt).decode() self.assertNotIn("INV/2025/00008", file_content) diff --git a/l10n_it_riba_oca/wizard/wizard_riba_file_export.py b/l10n_it_riba_oca/wizard/wizard_riba_file_export.py index 5cd36294f0a9..04ecc2580652 100644 --- a/l10n_it_riba_oca/wizard/wizard_riba_file_export.py +++ b/l10n_it_riba_oca/wizard/wizard_riba_file_export.py @@ -392,10 +392,8 @@ def act_getfile(self): unidecode(line.partner_id.ref and line.partner_id.ref[:16] or ""), unidecode(line.invoice_number[:40]), line.invoice_date, - unidecode(f"CIG: {line.cig if line.cig else ''} "), - "", - unidecode(f"CUP: {line.cup if line.cup else ''} "), - "", + unidecode(f"CIG: {line.cig} " if line.cig else ""), + unidecode(f"CUP: {line.cup} " if line.cup else ""), ] array_riba.append(riba) diff --git a/l10n_it_riba_oca/wizard/wizard_riba_issue.py b/l10n_it_riba_oca/wizard/wizard_riba_issue.py index 7c7ac5960c00..58c2e0a34673 100644 --- a/l10n_it_riba_oca/wizard/wizard_riba_issue.py +++ b/l10n_it_riba_oca/wizard/wizard_riba_issue.py @@ -62,7 +62,15 @@ def create_rdl( self.env._("It is possible to issue C/O for posted move only!") ) do_group_riba = True - if len({f"{x.l10n_it_cig}{x.l10n_it_cup}" for x in move_lines.move_id}) > 1: + if ( + len( + { + f"{x.cig}{x.cup}" + for x in move_lines.mapped("move_id.related_document_ids") + } + ) + > 1 + ): do_group_riba = False if do_group_riba: for move_line in move_lines: @@ -90,7 +98,7 @@ def create_rdl( invoice=move_line.move_id.name, ) ) - if move_line.partner_id.group_riba: # and do_group_riba: + if move_line.partner_id.group_riba and do_group_riba: for key in grouped_lines: if ( key[0] == move_line.partner_id.id