diff --git a/addons/payment/wizards/payment_link_wizard.py b/addons/payment/wizards/payment_link_wizard.py index 5fc6521e8ba..9f8fdb91fcf 100644 --- a/addons/payment/wizards/payment_link_wizard.py +++ b/addons/payment/wizards/payment_link_wizard.py @@ -42,6 +42,22 @@ class PaymentLinkWizard(models.TransientModel): description = fields.Char('Payment Ref') access_token = fields.Char(compute='_compute_values') company_id = fields.Many2one('res.company', compute='_compute_company') + available_acquirer_ids = fields.Many2many( + comodel_name='payment.acquirer', + string="Payment Acquirers Available", + compute='_compute_available_acquirer_ids', + compute_sudo=True, + ) + acquirer_id = fields.Many2one( + comodel_name='payment.acquirer', + string="Specific Payment Acquirer", + domain="[('id', 'in', available_acquirer_ids)]", + help="Leave blank to select all acquirers" + ) + has_multiple_acquirers = fields.Boolean( + string="Has Multiple Acquirers", + compute='_compute_has_multiple_acquirers', + ) @api.onchange('amount', 'description') def _onchange_amount(self): @@ -50,7 +66,7 @@ class PaymentLinkWizard(models.TransientModel): if self.amount <= 0: raise ValidationError(_("The value of the payment amount must be positive.")) - @api.depends('amount', 'description', 'partner_id', 'currency_id') + @api.depends('amount', 'description', 'partner_id', 'currency_id', 'acquirer_id') def _compute_values(self): for payment_link in self: payment_link.access_token = payment_utils.generate_access_token( @@ -65,6 +81,20 @@ class PaymentLinkWizard(models.TransientModel): record = self.env[link.res_model].browse(link.res_id) link.company_id = record.company_id if 'company_id' in record else False + @api.depends('company_id', 'partner_id', 'currency_id') + def _compute_available_acquirer_ids(self): + for link in self: + link.available_acquirer_ids = link.env['payment.acquirer']._get_compatible_acquirers( + company_id=link.company_id.id, + partner_id=link.partner_id.id, + currency_id=link.currency_id.id + ) + + @api.depends('available_acquirer_ids') + def _compute_has_multiple_acquirers(self): + for link in self: + link.has_multiple_acquirers = len(link.available_acquirer_ids) > 1 + def _generate_link(self): for payment_link in self: related_document = self.env[payment_link.res_model].browse(payment_link.res_id) @@ -75,4 +105,5 @@ class PaymentLinkWizard(models.TransientModel): f'¤cy_id={payment_link.currency_id.id}' \ f'&partner_id={payment_link.partner_id.id}' \ f'&company_id={payment_link.company_id.id}' \ + f'{"&acquirer_id=" + str(payment_link.acquirer_id.id) if payment_link.acquirer_id else "" }' \ f'&access_token={payment_link.access_token}' diff --git a/addons/payment/wizards/payment_link_wizard_views.xml b/addons/payment/wizards/payment_link_wizard_views.xml index 46e3eed4355..e0a975903e9 100644 --- a/addons/payment/wizards/payment_link_wizard_views.xml +++ b/addons/payment/wizards/payment_link_wizard_views.xml @@ -13,8 +13,14 @@ + + + diff --git a/addons/sale/wizard/sale_payment_link.py b/addons/sale/wizard/sale_payment_link.py index b9e1d6fd3df..df0b865b282 100644 --- a/addons/sale/wizard/sale_payment_link.py +++ b/addons/sale/wizard/sale_payment_link.py @@ -24,6 +24,17 @@ class PaymentLinkWizard(models.TransientModel): }) return res + @api.depends('company_id', 'partner_id', 'currency_id') + def _compute_available_acquirer_ids(self): + sale_links = self.filtered(lambda link: link.res_model == 'sale.order') + super(PaymentLinkWizard, self-sale_links)._compute_available_acquirer_ids() + for link in sale_links: + link.available_acquirer_ids = link.env['payment.acquirer']._get_compatible_acquirers( + company_id=link.company_id.id, + partner_id=link.partner_id.id, + currency_id=link.currency_id.id, + sale_order_id=link.res_id) + def _generate_link(self): """ Override of payment to add the sale_order_id in the link. """ for payment_link in self: @@ -35,6 +46,7 @@ class PaymentLinkWizard(models.TransientModel): f'?reference={urls.url_quote(payment_link.description)}' \ f'&amount={payment_link.amount}' \ f'&sale_order_id={payment_link.res_id}' \ + f'{"&acquirer_id=" + str(payment_link.acquirer_id.id) if payment_link.acquirer_id else "" }' \ f'&access_token={payment_link.access_token}' # Order-related fields are retrieved in the controller else: