Before this commit (in the case the `custom_mode` is set to `wire_transfer`) the model tries to find existing bank accounts to compute a pending message with the necessary information. When bank accounts are not already setup we end with an incomplete message. After this commit we can at any point recompute the pending message and it will be updated with the current bank information. Task - 2511080 closes odoo/odoo#103903 Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
77 lines
3.1 KiB
Python
77 lines
3.1 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import _, api, fields, models
|
|
|
|
|
|
class PaymentProvider(models.Model):
|
|
_inherit = 'payment.provider'
|
|
|
|
_sql_constraints = [(
|
|
'custom_providers_setup',
|
|
"CHECK(custom_mode IS NULL OR (code = 'custom' AND custom_mode IS NOT NULL))",
|
|
"Only custom providers should have a custom mode."
|
|
)]
|
|
|
|
code = fields.Selection(
|
|
selection_add=[('custom', "Custom")], ondelete={'custom': 'set default'}
|
|
)
|
|
custom_mode = fields.Selection(
|
|
string="Custom Mode",
|
|
selection=[('wire_transfer', "Wire Transfer")],
|
|
required_if_provider='custom',
|
|
)
|
|
qr_code = fields.Boolean(
|
|
string="Enable QR Codes", help="Enable the use of QR-codes when paying by wire transfer.")
|
|
|
|
@api.model_create_multi
|
|
def create(self, values_list):
|
|
providers = super().create(values_list)
|
|
providers.filtered(lambda p: p.custom_mode == 'wire_transfer').pending_msg = None
|
|
return providers
|
|
|
|
@api.depends('code')
|
|
def _compute_view_configuration_fields(self):
|
|
""" Override of payment to hide the credentials page.
|
|
|
|
:return: None
|
|
"""
|
|
super()._compute_view_configuration_fields()
|
|
self.filtered(lambda p: p.code == 'custom').update({
|
|
'show_credentials_page': False,
|
|
'show_payment_icon_ids': False,
|
|
'show_pre_msg': False,
|
|
'show_done_msg': False,
|
|
'show_cancel_msg': False,
|
|
})
|
|
|
|
def action_recompute_pending_msg(self):
|
|
""" Recompute the pending message to include the existing bank accounts. """
|
|
account_payment_module = self.env['ir.module.module']._get('account_payment')
|
|
if account_payment_module.state == 'installed':
|
|
for provider in self.filtered(lambda p: p.custom_mode == 'wire_transfer'):
|
|
company_id = provider.company_id.id
|
|
accounts = self.env['account.journal'].search([
|
|
('type', '=', 'bank'), ('company_id', '=', company_id)
|
|
]).bank_account_id
|
|
account_names = "".join(f"<li>{account.display_name}</li>" for account in accounts)
|
|
provider.pending_msg = f'<div>' \
|
|
f'<h3>{_("Please use the following transfer details")}</h3>' \
|
|
f'<h4>{_("Bank Account") if len(accounts) == 1 else _("Bank Accounts")}</h4>' \
|
|
f'<ul>{account_names}</ul>' \
|
|
f'<h4>{_("Communication")}</h4>' \
|
|
f'<p>{_("Please use the order name as communication reference.")}</p>' \
|
|
f'</div>'
|
|
|
|
def _get_removal_values(self):
|
|
""" Override of `payment` to nullify the `custom_mode` field. """
|
|
res = super()._get_removal_values()
|
|
res['custom_mode'] = None
|
|
return res
|
|
|
|
def _transfer_ensure_pending_msg_is_set(self):
|
|
transfer_providers_without_msg = self.filtered(
|
|
lambda p: p.custom_mode == 'wire_transfer' and not p.pending_msg
|
|
)
|
|
if transfer_providers_without_msg:
|
|
transfer_providers_without_msg.action_recompute_pending_msg()
|