87 lines
3.5 KiB
Python
87 lines
3.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import api, fields, models, _
|
|
from odoo.exceptions import UserError
|
|
from odoo.osv import expression
|
|
|
|
|
|
class AccountPaymentMethodLine(models.Model):
|
|
_inherit = "account.payment.method.line"
|
|
|
|
payment_provider_id = fields.Many2one(
|
|
comodel_name='payment.provider',
|
|
compute='_compute_payment_provider_id',
|
|
store=True,
|
|
readonly=False,
|
|
)
|
|
payment_provider_state = fields.Selection(
|
|
related='payment_provider_id.state'
|
|
)
|
|
|
|
@api.depends('payment_provider_id.name')
|
|
def _compute_name(self):
|
|
super()._compute_name()
|
|
for line in self:
|
|
if line.payment_provider_id and not line.name:
|
|
line.name = line.payment_provider_id.name
|
|
|
|
@api.depends('payment_method_id')
|
|
def _compute_payment_provider_id(self):
|
|
results = self.journal_id._get_journals_payment_method_information()
|
|
manage_providers = results['manage_providers']
|
|
method_information_mapping = results['method_information_mapping']
|
|
providers_per_code = results['providers_per_code']
|
|
|
|
for line in self:
|
|
journal = line.journal_id
|
|
company = journal.company_id
|
|
if (
|
|
company
|
|
and line.payment_method_id
|
|
and not line.payment_provider_id
|
|
and manage_providers
|
|
and method_information_mapping.get(line.payment_method_id.id, {}).get('mode') == 'electronic'
|
|
):
|
|
provider_ids = providers_per_code.get(company.id, {}).get(line.code, set())
|
|
|
|
# Exclude the 'unique' / 'electronic' values that are already set on the journal.
|
|
protected_provider_ids = set()
|
|
for payment_type in ('inbound', 'outbound'):
|
|
lines = journal[f'{payment_type}_payment_method_line_ids']
|
|
for journal_line in lines:
|
|
if journal_line.payment_method_id:
|
|
if (
|
|
manage_providers
|
|
and method_information_mapping.get(journal_line.payment_method_id.id, {}).get('mode') == 'electronic'
|
|
):
|
|
protected_provider_ids.add(journal_line.payment_provider_id.id)
|
|
|
|
candidates_provider_ids = provider_ids - protected_provider_ids
|
|
if candidates_provider_ids:
|
|
line.payment_provider_id = next(iter(candidates_provider_ids))
|
|
|
|
@api.ondelete(at_uninstall=False)
|
|
def _unlink_except_active_provider(self):
|
|
""" Ensure we don't remove an account.payment.method.line that is linked to a provider
|
|
in the test or enabled state.
|
|
"""
|
|
active_provider = self.payment_provider_id.filtered(lambda provider: provider.state in ['enabled', 'test'])
|
|
if active_provider:
|
|
raise UserError(_(
|
|
"You can't delete a payment method that is linked to a provider in the enabled "
|
|
"or test state.\n""Linked providers(s): %s",
|
|
', '.join(a.display_name for a in active_provider),
|
|
))
|
|
|
|
def action_open_provider_form(self):
|
|
self.ensure_one()
|
|
return {
|
|
'type': 'ir.actions.act_window',
|
|
'name': _('Provider'),
|
|
'view_mode': 'form',
|
|
'res_model': 'payment.provider',
|
|
'target': 'current',
|
|
'res_id': self.payment_provider_id.id
|
|
}
|