Merge pull request 'Fix PayDunya redirect flow rendering in Odoo 18' (#1) from fix/payment-paydunya into main
Reviewed-on: #1
This commit is contained in:
@@ -1,8 +1,9 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<odoo>
|
<odoo noupdate="1">
|
||||||
<record id="payment_provider_paydunya" model="payment.provider">
|
<record id="payment_provider_paydunya" model="payment.provider">
|
||||||
<field name="name">PayDunya</field>
|
<field name="name">PayDunya</field>
|
||||||
<field name="code">paydunya</field>
|
<field name="code">paydunya</field>
|
||||||
<field name="sequence">10</field>
|
<field name="sequence">10</field>
|
||||||
|
<field name="redirect_form_view_id" ref="payment_paydunya.paydunya_redirect_form"/>
|
||||||
</record>
|
</record>
|
||||||
</odoo>
|
</odoo>
|
||||||
|
|||||||
@@ -9,7 +9,41 @@ _logger = logging.getLogger(__name__)
|
|||||||
class PaymentTransaction(models.Model):
|
class PaymentTransaction(models.Model):
|
||||||
_inherit = 'payment.transaction'
|
_inherit = 'payment.transaction'
|
||||||
|
|
||||||
def _get_specific_rendering_values(self, **kwargs):
|
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."""
|
"""Create invoice on PayDunya and return rendering values for redirection."""
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
provider = False
|
provider = False
|
||||||
@@ -53,6 +87,18 @@ class PaymentTransaction(models.Model):
|
|||||||
'phone': self.partner_id.phone or '',
|
'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
|
# Authentication headers
|
||||||
headers = {
|
headers = {
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
@@ -78,16 +124,12 @@ class PaymentTransaction(models.Model):
|
|||||||
|
|
||||||
if token:
|
if token:
|
||||||
# store reference to match notifications
|
# store reference to match notifications
|
||||||
self.acquirer_reference = token
|
self.provider_reference = token
|
||||||
self._cr.commit()
|
|
||||||
_logger.info('PayDunya invoice created: token=%s, url=%s', token, redirect_url)
|
_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 {
|
return {
|
||||||
'rendering_template': 'payment_paydunya.paydunya_redirect_form',
|
'api_url': redirect_url,
|
||||||
'rendering_values': {
|
'token': token,
|
||||||
'paydunya_token': token,
|
|
||||||
'redirect_url': redirect_url,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else:
|
else:
|
||||||
_logger.warning('PayDunya: no token in response: %s', data)
|
_logger.warning('PayDunya: no token in response: %s', data)
|
||||||
@@ -107,7 +149,7 @@ class PaymentTransaction(models.Model):
|
|||||||
token = invoice_data.get('invoice', {}).get('token') or invoice_data.get('token')
|
token = invoice_data.get('invoice', {}).get('token') or invoice_data.get('token')
|
||||||
if not token:
|
if not token:
|
||||||
return None
|
return None
|
||||||
tx = self.search([('acquirer_reference', '=', token)], limit=1)
|
tx = self.search([('provider_reference', '=', token)], limit=1)
|
||||||
return tx or None
|
return tx or None
|
||||||
|
|
||||||
def _handle_notification_data(self, data):
|
def _handle_notification_data(self, data):
|
||||||
|
|||||||
@@ -1,29 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<odoo>
|
<odoo>
|
||||||
<template id="paydunya_redirect_form">
|
<template id="paydunya_redirect_form">
|
||||||
<t t-call="website.layout">
|
<form t-att-action="api_url" method="get">
|
||||||
<div class="container my-5">
|
|
||||||
<div class="oe_paydunya_redirect">
|
|
||||||
<h3>Redirection vers PayDunya...</h3>
|
|
||||||
|
|
||||||
<form id="paydunya_redirect_form" t-att-action="redirect_url" method="post">
|
|
||||||
<input type="hidden" name="token" t-att-value="paydunya_token"/>
|
|
||||||
<noscript>
|
|
||||||
<button type="submit" class="btn btn-primary">Payer</button>
|
|
||||||
</noscript>
|
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<t t-if="redirect_url">
|
|
||||||
<script type="text/javascript">
|
|
||||||
(function () {
|
|
||||||
const f = document.getElementById('paydunya_redirect_form');
|
|
||||||
if (f) { f.submit(); }
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
</t>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</t>
|
|
||||||
</template>
|
</template>
|
||||||
</odoo>
|
</odoo>
|
||||||
Reference in New Issue
Block a user