diff --git a/addons/payment/models/account_payment.py b/addons/payment/models/account_payment.py
index dc939989104..5c398c8f634 100644
--- a/addons/payment/models/account_payment.py
+++ b/addons/payment/models/account_payment.py
@@ -12,27 +12,40 @@ class AccountPayment(models.Model):
payment_transaction_id = fields.Many2one('payment.transaction', string='Payment Transaction', readonly=True)
payment_token_id = fields.Many2one(
'payment.token', string="Saved payment token",
- domain="[('acquirer_id.capture_manually', '=', False), ('company_id', '=', company_id)]",
+ domain="""[
+ (payment_method_code == 'electronic', '=', 1),
+ ('company_id', '=', company_id),
+ ('acquirer_id.capture_manually', '=', False),
+ ('acquirer_id.journal_id', '=', journal_id),
+ ('partner_id', 'in', related_partner_ids),
+ ]""",
help="Note that tokens from acquirers set to only authorize transactions (instead of capturing the amount) are not available.")
+ related_partner_ids = fields.Many2many('res.partner', compute='_compute_related_partners')
def _get_payment_chatter_link(self):
self.ensure_one()
return '%s' % (self.id, self.name)
+ @api.depends('partner_id.commercial_partner_id.child_ids')
+ def _compute_related_partners(self):
+ for p in self:
+ p.related_partner_ids = (
+ p.partner_id
+ | p.partner_id.commercial_partner_id
+ | p.partner_id.commercial_partner_id.child_ids
+ )._origin
+
@api.onchange('partner_id', 'payment_method_id', 'journal_id')
def _onchange_set_payment_token_id(self):
- res = {}
-
- if not self.payment_method_code == 'electronic' or not self.partner_id or not self.journal_id:
+ if not (self.payment_method_code == 'electronic' and self.partner_id and self.journal_id):
self.payment_token_id = False
- return res
+ return
- partners = self.partner_id | self.partner_id.commercial_partner_id | self.partner_id.commercial_partner_id.child_ids
- domain = [('partner_id', 'in', partners.ids), ('acquirer_id.journal_id', '=', self.journal_id.id)]
- self.payment_token_id = self.env['payment.token'].search(domain, limit=1)
-
- res['domain'] = {'payment_token_id': domain}
- return res
+ self.payment_token_id = self.env['payment.token'].search([
+ ('partner_id', 'in', self.related_partner_ids.ids),
+ ('acquirer_id.capture_manually', '=', False),
+ ('acquirer_id.journal_id', '=', self.journal_id.id),
+ ], limit=1)
def _prepare_payment_transaction_vals(self):
self.ensure_one()
diff --git a/addons/payment/views/account_payment_views.xml b/addons/payment/views/account_payment_views.xml
index 5d25c93773c..c6ce4c1a88d 100644
--- a/addons/payment/views/account_payment_views.xml
+++ b/addons/payment/views/account_payment_views.xml
@@ -11,6 +11,7 @@
+