# -*- coding: utf-8 -*- from odoo import api, fields, models, _ from odoo.addons.payment.models.payment_acquirer import ValidationError from odoo.tools.float_utils import float_compare import logging import pprint _logger = logging.getLogger(__name__) class TransferPaymentAcquirer(models.Model): _inherit = 'payment.acquirer' provider = fields.Selection(selection_add=[ ('transfer', 'Manual Payment') ], default='transfer', ondelete={'transfer': 'set default'}) @api.model def _create_missing_journal_for_acquirers(self, company=None): # By default, the wire transfer method uses the default Bank journal. company = company or self.env.company acquirers = self.env['payment.acquirer'].search( [('provider', '=', 'transfer'), ('journal_id', '=', False), ('company_id', '=', company.id)]) bank_journal = self.env['account.journal'].search( [('type', '=', 'bank'), ('company_id', '=', company.id)], limit=1) if bank_journal: acquirers.write({'journal_id': bank_journal.id}) return super(TransferPaymentAcquirer, self)._create_missing_journal_for_acquirers(company=company) def transfer_get_form_action_url(self): return '/payment/transfer/feedback' def _format_transfer_data(self): company_id = self.env.company.id # filter only bank accounts marked as visible journals = self.env['account.journal'].search([('type', '=', 'bank'), ('company_id', '=', company_id)]) accounts = journals.mapped('bank_account_id').name_get() bank_title = _('Bank Accounts') if len(accounts) > 1 else _('Bank Account') bank_accounts = ''.join(['']) post_msg = _('''

Please use the following transfer details

%(bank_title)s

%(bank_accounts)s

Communication

Please use the order name as communication reference.

''') % { 'bank_title': bank_title, 'bank_accounts': bank_accounts, } return post_msg @api.model def create(self, values): """ Hook in create to create a default pending_msg. This is done in create to have access to the name and other creation values. If no pending_msg or a void pending_msg is given at creation, generate a default one. """ if values.get('provider') == 'transfer' and not values.get('pending_msg'): values['pending_msg'] = self._format_transfer_data() return super(TransferPaymentAcquirer, self).create(values) def write(self, values): """ Hook in write to create a default pending_msg. See create(). """ if not values.get('pending_msg', False) and all(not acquirer.pending_msg and acquirer.provider != 'transfer' for acquirer in self) and values.get('provider') == 'transfer': values['pending_msg'] = self._format_transfer_data() return super(TransferPaymentAcquirer, self).write(values) class TransferPaymentTransaction(models.Model): _inherit = 'payment.transaction' @api.model def _transfer_form_get_tx_from_data(self, data): reference, amount, currency_name = data.get('reference'), data.get('amount'), data.get('currency_name') tx = self.search([('reference', '=', reference)]) if not tx or len(tx) > 1: error_msg = _('received data for reference %s') % (pprint.pformat(reference)) if not tx: error_msg += _('; no order found') else: error_msg += _('; multiple order found') _logger.info(error_msg) raise ValidationError(error_msg) return tx def _transfer_form_get_invalid_parameters(self, data): invalid_parameters = [] if float_compare(float(data.get('amount') or '0.0'), self.amount, 2) != 0: invalid_parameters.append(('amount', data.get('amount'), '%.2f' % self.amount)) if data.get('currency') != self.currency_id.name: invalid_parameters.append(('currency', data.get('currency'), self.currency_id.name)) return invalid_parameters def _transfer_form_validate(self, data): _logger.info('Validated transfer payment for tx %s: set as pending' % (self.reference)) self._set_transaction_pending() return True