1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
# -*- coding: utf-8 -*-
from odoo import models, fields, api, _
class AccountPaymentRegister(models.TransientModel):
_inherit = 'account.payment.register'
# == Business fields ==
payment_token_id = fields.Many2one(
comodel_name='payment.token',
string="Saved payment token",
store=True, readonly=False,
compute='_compute_payment_token_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', suitable_payment_token_partner_ids),
]''',
help="Note that tokens from acquirers set to only authorize transactions (instead of capturing the amount) are "
"not available.")
# == Display purpose fields ==
suitable_payment_token_partner_ids = fields.Many2many(
comodel_name='res.partner',
compute='_compute_suitable_payment_token_partner_ids')
payment_method_code = fields.Char(
related='payment_method_id.code')
# -------------------------------------------------------------------------
# COMPUTE METHODS
# -------------------------------------------------------------------------
@api.depends('can_edit_wizard')
def _compute_suitable_payment_token_partner_ids(self):
for wizard in self:
if wizard.can_edit_wizard:
lines = wizard._get_batches()[0]['lines']
partners = lines.partner_id
commercial_partners = partners.commercial_partner_id
children_partners = commercial_partners.child_ids
wizard.suitable_payment_token_partner_ids = (partners + commercial_partners + children_partners)._origin
else:
wizard.suitable_payment_token_partner_ids = False
@api.onchange('can_edit_wizard', 'payment_method_id', 'journal_id')
def _compute_payment_token_id(self):
for wizard in self:
if wizard.can_edit_wizard \
and wizard.payment_method_id.code == 'electronic' \
and wizard.journal_id \
and wizard.suitable_payment_token_partner_ids:
wizard.payment_token_id = self.env['payment.token'].search([
('partner_id', 'in', wizard.suitable_payment_token_partner_ids.ids),
('acquirer_id.capture_manually', '=', False),
('acquirer_id.journal_id', '=', wizard.journal_id.id),
], limit=1)
else:
wizard.payment_token_id = False
# -------------------------------------------------------------------------
# BUSINESS METHODS
# -------------------------------------------------------------------------
def _create_payment_vals_from_wizard(self):
# OVERRIDE
payment_vals = super()._create_payment_vals_from_wizard()
payment_vals['payment_token_id'] = self.payment_token_id.id
return payment_vals
|