From 480977568e58af18400295c9836d974b58753fd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul?= Date: Wed, 14 Aug 2024 11:18:09 +0200 Subject: [PATCH] [FIX] account_payment_order: use payment_reference if present for out payments When a payment reference (field `payment_reference`) is provided on the vendor bill, it should be used in priority over the vendor bill number (field `ref`). One reason is that the `ref` field is different for each invoice of the same supplier (it is used in Odoo's standard duplicate warning), but the payment reference maybe the same for all payments to the same supplier. For instance some suppliers request that the customer id is used on the payment communication and it is the same on all their invoices. Another reason is that some supplier use a structured payment communication scheme, and that one only makes sense in the payment_reference field. --- account_payment_order/models/account_move.py | 2 +- .../tests/test_payment_order_outbound.py | 21 ++++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/account_payment_order/models/account_move.py b/account_payment_order/models/account_move.py index 3efbe9de413..7c1b5d19c02 100644 --- a/account_payment_order/models/account_move.py +++ b/account_payment_order/models/account_move.py @@ -53,7 +53,7 @@ def _get_payment_order_communication_direct(self): communication = self.payment_reference or self.ref or self.name if self.is_invoice(): if self.is_purchase_document(): - communication = self.ref or self.payment_reference + communication = self.payment_reference or self.ref else: communication = self.payment_reference or self.name return communication or "" diff --git a/account_payment_order/tests/test_payment_order_outbound.py b/account_payment_order/tests/test_payment_order_outbound.py index 54555e02019..c520f4755a0 100644 --- a/account_payment_order/tests/test_payment_order_outbound.py +++ b/account_payment_order/tests/test_payment_order_outbound.py @@ -277,10 +277,13 @@ def test_invoice_communication_01(self): ) def test_invoice_communication_02(self): - self.invoice.payment_reference = "R1234" self.assertEqual( "F1242", self.invoice._get_payment_order_communication_direct() ) + self.invoice.payment_reference = "R1234" + self.assertEqual( + "R1234", self.invoice._get_payment_order_communication_direct() + ) def test_invoice_communication_03(self): self.invoice.ref = False @@ -304,6 +307,13 @@ def test_invoice_communication_03(self): self.invoice._get_payment_order_communication_full(), ) + def test_supplier_invoice_payment_reference(self): + self.invoice.payment_reference = "+++F1234+++" + self.invoice.action_post() + self.assertEqual( + "+++F1234+++", self.invoice._get_payment_order_communication_full() + ) + def test_manual_line_and_manual_date(self): # Create payment order outbound_order = self.env["account.payment.order"].create( @@ -406,7 +416,7 @@ def test_supplier_refund_reference(self): self.invoice.payment_reference = "F/1234" self.invoice.action_post() self.assertEqual( - "F1242", self.invoice._get_payment_order_communication_direct() + "F/1234", self.invoice._get_payment_order_communication_direct() ) self.refund = self._create_supplier_refund(self.invoice) with Form(self.refund) as refund_form: @@ -416,7 +426,9 @@ def test_supplier_refund_reference(self): line_form.price_unit = 75.0 self.refund.action_post() - self.assertEqual("R1234", self.refund._get_payment_order_communication_direct()) + self.assertEqual( + "FR/1234", self.refund._get_payment_order_communication_direct() + ) self.env["account.invoice.payment.line.multi"].with_context( active_model="account.move", active_ids=self.invoice.ids @@ -429,8 +441,7 @@ def test_supplier_refund_reference(self): self.assertEqual(len(payment_order.payment_line_ids), 1) - self.assertEqual("F1242 R1234", payment_order.payment_line_ids.communication) - self.assertNotIn("FR/1234", payment_order.payment_line_ids.communication) + self.assertEqual("F/1234 FR/1234", payment_order.payment_line_ids.communication) def test_supplier_manual_refund(self): """