From 5e7d10748118740234169529bd81bf8ef44c7797 Mon Sep 17 00:00:00 2001 From: mthiam Date: Fri, 6 Feb 2026 15:19:28 +0100 Subject: [PATCH 1/2] Fix PayDunya redirect flow rendering in Odoo 18 --- .../data/payment_provider_data.xml | 3 ++- .../models/payment_transaction.py | 16 +++++------ .../views/payment_paydunya_templates.xml | 27 +++---------------- 3 files changed, 11 insertions(+), 35 deletions(-) diff --git a/addons/payment_paydunya/data/payment_provider_data.xml b/addons/payment_paydunya/data/payment_provider_data.xml index 1d28e78..76a970c 100644 --- a/addons/payment_paydunya/data/payment_provider_data.xml +++ b/addons/payment_paydunya/data/payment_provider_data.xml @@ -1,8 +1,9 @@ - + PayDunya paydunya 10 + diff --git a/addons/payment_paydunya/models/payment_transaction.py b/addons/payment_paydunya/models/payment_transaction.py index f8082de..aba54ae 100644 --- a/addons/payment_paydunya/models/payment_transaction.py +++ b/addons/payment_paydunya/models/payment_transaction.py @@ -9,7 +9,7 @@ _logger = logging.getLogger(__name__) class PaymentTransaction(models.Model): _inherit = 'payment.transaction' - def _get_specific_rendering_values(self, **kwargs): + def _get_specific_rendering_values(self, processing_values): """Create invoice on PayDunya and return rendering values for redirection.""" self.ensure_one() provider = False @@ -78,16 +78,12 @@ class PaymentTransaction(models.Model): if token: # store reference to match notifications - self.acquirer_reference = token - self._cr.commit() + self.provider_reference = token _logger.info('PayDunya invoice created: token=%s, url=%s', token, redirect_url) - # Return the template name and rendering values expected by Odoo + # Return the rendering values expected by the redirect form template. return { - 'rendering_template': 'payment_paydunya.paydunya_redirect_form', - 'rendering_values': { - 'paydunya_token': token, - 'redirect_url': redirect_url, - } + 'api_url': redirect_url, + 'token': token, } else: _logger.warning('PayDunya: no token in response: %s', data) @@ -107,7 +103,7 @@ class PaymentTransaction(models.Model): token = invoice_data.get('invoice', {}).get('token') or invoice_data.get('token') if not token: return None - tx = self.search([('acquirer_reference', '=', token)], limit=1) + tx = self.search([('provider_reference', '=', token)], limit=1) return tx or None def _handle_notification_data(self, data): diff --git a/addons/payment_paydunya/views/payment_paydunya_templates.xml b/addons/payment_paydunya/views/payment_paydunya_templates.xml index 9970859..bc1862d 100644 --- a/addons/payment_paydunya/views/payment_paydunya_templates.xml +++ b/addons/payment_paydunya/views/payment_paydunya_templates.xml @@ -1,29 +1,8 @@ - \ No newline at end of file + -- 2.49.1 From 85282bc7571cc83525b8ecf783a7b11d35eec1ff Mon Sep 17 00:00:00 2001 From: mthiam Date: Mon, 9 Feb 2026 11:05:36 +0100 Subject: [PATCH 2/2] fix: redirection --- .../models/payment_transaction.py | 46 +++++++++++++++++++ .../views/payment_paydunya_templates.xml | 3 +- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/addons/payment_paydunya/models/payment_transaction.py b/addons/payment_paydunya/models/payment_transaction.py index aba54ae..2dd3f68 100644 --- a/addons/payment_paydunya/models/payment_transaction.py +++ b/addons/payment_paydunya/models/payment_transaction.py @@ -9,6 +9,40 @@ _logger = logging.getLogger(__name__) class PaymentTransaction(models.Model): _inherit = 'payment.transaction' + def _get_paydunya_channel(self, processing_values): + """Return the PayDunya channel to force based on selected payment method.""" + self.ensure_one() + + selected_code = ( + processing_values.get('payment_method_code') + or processing_values.get('payment_method') + or getattr(getattr(self, 'payment_method_id', False), 'code', False) + ) + + # Odoo checkout often sends only payment_method_id; resolve it to code. + if not selected_code: + pm_id = processing_values.get('payment_method_id') + if pm_id: + try: + payment_method = self.env['payment.method'].browse(int(pm_id)) + if payment_method.exists(): + selected_code = payment_method.code + except (TypeError, ValueError): + selected_code = None + + if not selected_code: + return None + + channel_map = { + 'wave-senegal': 'wave-senegal', + 'orange-money-senegal': 'orange-money-senegal', + 'om': 'orange-money-senegal', + 'orange-money': 'orange-money-senegal', + 'wave': 'wave-senegal', + 'card': 'card', + } + return channel_map.get(str(selected_code).lower()) + def _get_specific_rendering_values(self, processing_values): """Create invoice on PayDunya and return rendering values for redirection.""" self.ensure_one() @@ -53,6 +87,18 @@ class PaymentTransaction(models.Model): 'phone': self.partner_id.phone or '', } + channel = self._get_paydunya_channel(processing_values or {}) + if channel: + # Force a single payment channel so PayDunya redirects to the selected operator flow. + payload['invoice']['channels'] = [channel] + _logger.info( + 'PayDunya checkout channel: selected=%s resolved=%s', + processing_values.get('payment_method_code') + or processing_values.get('payment_method') + or processing_values.get('payment_method_id'), + channel, + ) + # Authentication headers headers = { 'Content-Type': 'application/json', diff --git a/addons/payment_paydunya/views/payment_paydunya_templates.xml b/addons/payment_paydunya/views/payment_paydunya_templates.xml index bc1862d..c5930a3 100644 --- a/addons/payment_paydunya/views/payment_paydunya_templates.xml +++ b/addons/payment_paydunya/views/payment_paydunya_templates.xml @@ -1,8 +1,7 @@ -- 2.49.1