[FIX] payment_custom: use correct payment reference

When the payment reference is set as the customer reference, the warning message of the
transaction still show the order reference instead.

With this commit, we now ensure the expected reference is shown instead.

opw-3461181

closes odoo/odoo#147143

X-original-commit: f25537dc83a6cb9193f78ab8f32c94a541fade0e
Signed-off-by: Morgane Demesmaeker <edm@odoo.com>
This commit is contained in:
Demesmaeker
2023-12-22 16:14:50 +00:00
parent be715e5ad2
commit 741f4b4e1c
4 changed files with 86 additions and 3 deletions
@@ -31,6 +31,24 @@ class PaymentTransaction(models.Model):
'reference': self.reference,
}
def _get_communication(self):
""" Return the communication the user should use for their transaction.
This communication might change according to the settings and the accounting localization.
Note: self.ensure_one()
:return: The selected communication.
:rtype: str
"""
self.ensure_one()
communication = ""
if hasattr(self, 'invoice_ids') and self.invoice_ids:
communication = self.invoice_ids[0].payment_reference
elif hasattr(self, 'sale_order_ids') and self.sale_order_ids:
communication = self.sale_order_ids[0].reference
return communication or self.reference
def _get_tx_from_notification_data(self, provider_code, notification_data):
""" Override of payment to find the transaction based on custom data.
+3
View File
@@ -0,0 +1,3 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import test_payment_transaction
@@ -0,0 +1,61 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import Command, fields
from odoo.tests import tagged
from odoo.addons.payment.tests.common import PaymentCommon
@tagged('-at_install', 'post_install')
class TestPaymentTransaction(PaymentCommon):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.provider = cls._prepare_provider(code='custom')
cls.product = cls.env['product.product'].create({
'name': "test product", 'list_price': cls.amount
})
def test_communication_based_on_transaction_reference(self):
""" Test that the payment communication falls back to the transaction reference when there
is no linked invoice or sales order. """
tx = self._create_transaction(flow='direct', reference="test")
self.assertEqual(tx._get_communication(), "test")
def test_communication_for_invoice(self):
""" Test that the communication displayed is the invoice payment reference. """
account_payment_module = self.env['ir.module.module']._get('account_payment')
if account_payment_module.state != 'installed':
self.skipTest("account_payment module is not installed")
invoice = self.env['account.move'].create({
'move_type': 'in_invoice',
'partner_id': self.partner.id,
'invoice_date': fields.Date.from_string('2019-01-01'),
'currency_id': self.currency.id,
'invoice_line_ids': [Command.create({'product_id': self.product.id, 'quantity': 1})],
})
invoice.action_post()
tx = self._create_transaction(flow='direct', invoice_ids=[invoice.id])
invoice.payment_reference = "test"
self.assertEqual(tx._get_communication(), "test")
def test_communication_for_sale_order(self):
""" Test that the communication displayed is the sale order reference. """
sale_module = self.env['ir.module.module']._get('sale')
if sale_module.state != 'installed':
self.skipTest("sale module is not installed")
sale_order = self.env['sale.order'].create({
'partner_id': self.partner.id,
'order_line': [Command.create({'product_id': self.product.id, 'product_uom_qty': 1})],
})
sale_order.action_confirm()
tx = self._create_transaction(flow='direct', sale_order_ids=[sale_order.id])
sale_order.reference = "test"
self.assertEqual(tx._get_communication(), "test")
@@ -34,7 +34,7 @@
<xpath expr="//div[@name='o_payment_status_alert']" position="inside">
<t t-set="qr_code"
t-value="tx.provider_id.sudo().qr_code and tx.company_id.sudo().partner_id.bank_ids[:1].build_qr_code_base64(tx.amount, tx.reference, None, tx.currency_id, tx.partner_id)"
t-value="tx.provider_id.sudo().qr_code and tx.company_id.sudo().partner_id.bank_ids[:1].build_qr_code_base64(tx.amount, tx._get_communication(), None, tx.currency_id, tx.partner_id)"
/>
<t t-if="tx.provider_id.sudo().code == 'custom' and qr_code">
<div class="position-relative order-2 d-flex flex-md-column justify-content-center align-items-center align-items-md-stretch w-100 w-md-auto">
@@ -74,11 +74,12 @@
<div class="card flex-grow-1">
<div class="card-body">
<t>$0</t>
<t t-if="tx.reference">
<t t-if="tx._get_communication()">
<hr class="w-100"/>
<strong class="mt-auto">Communication: </strong>
<span t-out="tx.reference"/>
<span t-out="tx._get_communication()"/>
</t>
<t t-if="tx.reference"/> <!-- Remove in master -->
</div>
</div>
</div>