From c4e2f64334919ae433ebaa6bfbee13a0a058039c Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Fri, 22 Apr 2022 14:14:53 +0200 Subject: [PATCH] [14.0][FIX] account_payment_order: Don't duplicate communication reference --- .../models/account_move_line.py | 56 ++++++++++++------- .../tests/test_payment_order_outbound.py | 9 +++ 2 files changed, 44 insertions(+), 21 deletions(-) diff --git a/account_payment_order/models/account_move_line.py b/account_payment_order/models/account_move_line.py index bc9a5e80a..0e2a6ff6f 100644 --- a/account_payment_order/models/account_move_line.py +++ b/account_payment_order/models/account_move_line.py @@ -48,6 +48,40 @@ class AccountMoveLine(models.Model): else: ml.partner_bank_id = ml.partner_bank_id + def _get_linked_move_communication(self): + """ + This will collect the references from referral moves: + - Reversal moves + - Partial payments + """ + self.ensure_one() + references = [] + # Build a recordset to gather moves from which references have already + # taken in order to avoid duplicates + reference_moves = self.env["account.move"].browse() + # If we have credit note(s) - reversal_move_id is a one2many + if self.move_id.reversal_move_id: + references.extend( + [ + move.payment_reference or move.ref + for move in self.move_id.reversal_move_id + if move.payment_reference or move.ref + ] + ) + reference_moves |= self.move_id.reversal_move_id + # Retrieve partial payments - e.g.: manual credit notes + for ( + _, + _, + payment_move_line, + ) in self.move_id._get_reconciled_invoices_partials(): + payment_move = payment_move_line.move_id + if payment_move not in reference_moves and ( + payment_move.payment_reference or payment_move.ref + ): + references.append(payment_move.payment_reference or payment_move.ref) + return references + def _get_communication(self): """ Retrieve the communication string for the payment order @@ -58,7 +92,6 @@ class AccountMoveLine(models.Model): communication = self.ref or self.name # change these default values if move line is linked to an invoice if self.move_id.is_invoice(): - references = [] if (self.move_id.reference_type or "none") != "none": communication = self.move_id.ref ref2comm_type = aplo.invoice_reference_type2communication_type() @@ -72,26 +105,7 @@ class AccountMoveLine(models.Model): elif "out" in self.move_id.move_type: # Force to only put invoice number here communication = self.move_id.payment_reference or self.move_id.name - # If we have credit note(s) - reversal_move_id is a one2many - if self.move_id.reversal_move_id: - references.extend( - [ - move.payment_reference or move.ref - for move in self.move_id.reversal_move_id - if move.payment_reference or move.ref - ] - ) - # Retrieve partial payments - e.g.: manual credit notes - for ( - _, - _, - payment_move_line, - ) in self.move_id._get_reconciled_invoices_partials(): - payment_move = payment_move_line.move_id - if payment_move.payment_reference or payment_move.ref: - references.append( - payment_move.payment_reference or payment_move.ref - ) + references = self._get_linked_move_communication() if references: communication += " " + " ".join(references) return communication_type, communication diff --git a/account_payment_order/tests/test_payment_order_outbound.py b/account_payment_order/tests/test_payment_order_outbound.py index dd243b9fd..2e42500cc 100644 --- a/account_payment_order/tests/test_payment_order_outbound.py +++ b/account_payment_order/tests/test_payment_order_outbound.py @@ -353,6 +353,15 @@ class TestPaymentOrderOutbound(TestPaymentOrderOutboundBase): self.refund.action_post() + # The user add the outstanding payment to the invoice + invoice_line = self.invoice.line_ids.filtered( + lambda line: line.account_internal_type == "payable" + ) + refund_line = self.refund.line_ids.filtered( + lambda line: line.account_internal_type == "payable" + ) + (invoice_line | refund_line).reconcile() + self.env["account.invoice.payment.line.multi"].with_context( active_model="account.move", active_ids=self.invoice.ids ).create({}).run()