[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.
This commit is contained in:
Stéphane Bidoul
2024-08-14 11:18:09 +02:00
parent 4034b4bc79
commit a8319e3ce5
2 changed files with 17 additions and 6 deletions

View File

@@ -52,7 +52,7 @@ class AccountMove(models.Model):
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 ""

View File

@@ -304,10 +304,13 @@ class TestPaymentOrderOutbound(TestPaymentOrderOutboundBase):
)
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
@@ -331,6 +334,13 @@ class TestPaymentOrderOutbound(TestPaymentOrderOutboundBase):
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(
@@ -433,7 +443,7 @@ class TestPaymentOrderOutbound(TestPaymentOrderOutboundBase):
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:
@@ -443,7 +453,9 @@ class TestPaymentOrderOutbound(TestPaymentOrderOutboundBase):
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()
)
# The user add the outstanding payment to the invoice
invoice_line = self.invoice.line_ids.filtered(
@@ -465,8 +477,7 @@ class TestPaymentOrderOutbound(TestPaymentOrderOutboundBase):
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):
"""