Skip to content

Commit

Permalink
[FIX] account_payment_order: use payment_reference if present for out…
Browse files Browse the repository at this point in the history
… 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.
  • Loading branch information
sbidoul committed Aug 14, 2024
1 parent 4034b4b commit 7473434
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 4 deletions.
6 changes: 5 additions & 1 deletion account_payment_order/models/account_move.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,11 @@ 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
if self.move_type in self.get_outbound_types(include_receipts=False):
# Vendor bill
communication = self.payment_reference or self.ref
else:
communication = self.ref or self.payment_reference
else:
communication = self.payment_reference or self.name
return communication or ""
Expand Down
16 changes: 13 additions & 3 deletions account_payment_order/tests/test_payment_order_outbound.py
Original file line number Diff line number Diff line change
Expand Up @@ -304,10 +304,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
Expand All @@ -331,6 +334,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(
Expand Down Expand Up @@ -433,7 +443,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:
Expand Down Expand Up @@ -465,7 +475,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.assertEqual("F/1234 R1234", payment_order.payment_line_ids.communication)
self.assertNotIn("FR/1234", payment_order.payment_line_ids.communication)

def test_supplier_manual_refund(self):
Expand Down

0 comments on commit 7473434

Please sign in to comment.