Odoo18-Base/addons/account_payment/models/payment_provider.py
2025-03-10 11:12:23 +07:00

139 lines
5.3 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models, _
from odoo.exceptions import UserError
class Paymentprovider(models.Model):
_inherit = 'payment.provider'
journal_id = fields.Many2one(
string="Payment Journal",
help="The journal in which the successful transactions are posted.",
comodel_name='account.journal',
compute='_compute_journal_id',
inverse='_inverse_journal_id',
domain='[("type", "=", "bank"), ("company_id", "=", company_id)]',
copy=False,
)
#=== COMPUTE METHODS ===#
def _ensure_payment_method_line(self, allow_create=True):
self.ensure_one()
if not self.id:
return
pay_method_line = self.env['account.payment.method.line'].search(
[('code', '=', self.code), ('payment_provider_id', '=', self.id)],
limit=1,
)
if not self.journal_id:
if pay_method_line:
pay_method_line.unlink()
return
if not pay_method_line:
pay_method_line = self.env['account.payment.method.line'].search(
[
('company_id', '=', self.company_id.id),
('code', '=', self.code),
('payment_provider_id', '=', False),
],
limit=1,
)
if pay_method_line:
pay_method_line.payment_provider_id = self
pay_method_line.journal_id = self.journal_id
pay_method_line.name = self.name
elif allow_create:
default_payment_method_id = self._get_default_payment_method_id(self.code)
if not default_payment_method_id:
return
create_values = {
'name': self.name,
'payment_method_id': default_payment_method_id,
'journal_id': self.journal_id.id,
'payment_provider_id': self.id,
}
pay_method_line_same_code = self.env['account.payment.method.line'].search(
[
('company_id', '=', self.company_id.id),
('code', '=', self.code),
],
limit=1,
)
if pay_method_line_same_code:
create_values['payment_account_id'] = pay_method_line_same_code.payment_account_id.id
self.env['account.payment.method.line'].create(create_values)
@api.depends('code', 'state', 'company_id')
def _compute_journal_id(self):
for provider in self:
pay_method_line = self.env['account.payment.method.line'].search(
[('code', '=', provider.code), ('payment_provider_id', '=', provider._origin.id)],
limit=1,
)
if pay_method_line:
provider.journal_id = pay_method_line.journal_id
elif provider.state in ('enabled', 'test'):
provider.journal_id = self.env['account.journal'].search(
[
('company_id', '=', provider.company_id.id),
('type', '=', 'bank'),
],
limit=1,
)
if provider.id:
provider._ensure_payment_method_line()
def _inverse_journal_id(self):
for provider in self:
provider._ensure_payment_method_line()
@api.model
def _get_default_payment_method_id(self, code):
provider_payment_method = self._get_provider_payment_method(code)
if provider_payment_method:
return provider_payment_method.id
return None
@api.model
def _get_provider_payment_method(self, code):
return self.env['account.payment.method'].search([('code', '=', code)], limit=1)
#=== BUSINESS METHODS ===#
@api.model
def _setup_provider(self, code):
""" Override of `payment` to create the payment method of the provider. """
super()._setup_provider(code)
self._setup_payment_method(code)
@api.model
def _setup_payment_method(self, code):
if code not in ('none', 'custom') and not self._get_provider_payment_method(code):
providers_description = dict(self._fields['code']._description_selection(self.env))
self.env['account.payment.method'].sudo().create({
'name': providers_description[code],
'code': code,
'payment_type': 'inbound',
})
def _check_existing_payment_method_lines(self, payment_method):
existing_payment_method_lines_count = \
self.env['account.payment.method.line'].search_count([('payment_method_id', '=', \
payment_method.id)], limit=1)
return bool(existing_payment_method_lines_count)
@api.model
def _remove_provider(self, code):
""" Override of `payment` to delete the payment method of the provider. """
payment_method = self._get_provider_payment_method(code)
if self._check_existing_payment_method_lines(payment_method):
raise UserError(_("To uninstall this module, please remove first the corresponding payment method line in the incoming payments tab defined on the bank journal."))
super()._remove_provider(code)
payment_method.unlink()