From 85282bc7571cc83525b8ecf783a7b11d35eec1ff Mon Sep 17 00:00:00 2001 From: mthiam Date: Mon, 9 Feb 2026 11:05:36 +0100 Subject: [PATCH] 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 @@