diff options
| author | Xavier Morel <xmo@odoo.com> | 2019-11-26 07:57:01 +0000 |
|---|---|---|
| committer | Xavier Morel <xmo@odoo.com> | 2019-12-03 13:59:25 +0000 |
| commit | ee15b8461d5b98d8711012d0d58fe8dbee2c733e (patch) | |
| tree | cb530e41254dd92468ad8eb3cbd6d5346cac8777 | |
| parent | 4e4813aee68ad0a867951822f9b5f7eaf3ce7e60 (diff) | |
[REM] payment: dynamic domains
Make the domain stricter as well:
* no reason to have / match a token if the payment method is not
electronic
* don't lose the capture mode
* don't remove the company filter though it's probably not useful (as
the journal and payment should already be in the same company so the
check on the token's acquirer's journal should be enough)
The domain used to select the default payment should not matter too much.
Task 2147923
closes odoo/odoo#40959
Signed-off-by: Xavier Morel (xmo) <xmo@odoo.com>
| -rw-r--r-- | addons/payment/models/account_payment.py | 35 | ||||
| -rw-r--r-- | addons/payment/views/account_payment_views.xml | 1 |
2 files changed, 25 insertions, 11 deletions
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 '<a href=# data-oe-model=account.payment data-oe-id=%d>%s</a>' % (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 @@ </xpath> <field name="payment_method_id" position="after"> <field name="payment_method_code" invisible="1"/> + <field name="related_partner_ids" invisible="1"/> <field name="payment_token_id" options="{'no_create': True}" attrs="{'invisible': [('payment_method_code', '!=', 'electronic')], 'readonly': [('state', '!=', 'draft')]}"/> </field> |
