Files
odoo_source/addons/payment_custom/models/payment_provider.py
T
Horacio Tellez c3f865e1dd [IMP] payment_custom: allow for recomputing of pending message
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>
2022-12-21 13:33:55 +01:00

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()