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
diff --git a/addons/payment_transfer/models/payment_acquirer.py b/addons/payment_transfer/models/payment_acquirer.py
new file mode 100644
index 00000000000..1d7d51f4b16
--- /dev/null
+++ b/addons/payment_transfer/models/payment_acquirer.py
@@ -0,0 +1,79 @@
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import _, api, fields, models
+
+
+class PaymentAcquirer(models.Model):
+ _inherit = 'payment.acquirer'
+
+ provider = fields.Selection(
+ selection_add=[('transfer', "Wire Transfer")], default='transfer',
+ ondelete={'transfer': 'set default'})
+ qr_code = fields.Boolean(
+ string="Enable QR Codes", help="Enable the use of QR-codes when paying by wire transfer.")
+
+ @api.depends('provider')
+ def _compute_view_configuration_fields(self):
+ """ Override of payment to hide the credentials page.
+
+ :return: None
+ """
+ super()._compute_view_configuration_fields()
+ self.filtered(lambda acq: acq.provider == 'transfer').write({
+ 'show_credentials_page': False,
+ 'show_payment_icon_ids': False,
+ 'show_pre_msg': False,
+ 'show_done_msg': False,
+ 'show_cancel_msg': False,
+ })
+
+ @api.model
+ def _create_missing_journals(self, company=None):
+ """ Override of payment to assign the default Bank journal instead or Electronic. """
+ # Search for transfer acquirers having no journal
+ company = company or self.env.company
+ transfer_acquirers = self.env['payment.acquirer'].search([
+ ('provider', '=', 'transfer'),
+ ('journal_id', '=', False),
+ ('company_id', '=', company.id)
+ ])
+
+ if transfer_acquirers:
+ # Pick the Bank journal
+ bank_journal = self.env['account.journal'].search(
+ [('type', '=', 'bank'), ('company_id', '=', company.id)], limit=1
+ )
+ if bank_journal:
+ transfer_acquirers.write({'journal_id': bank_journal.id})
+
+ return super()._create_missing_journals(company=company)
+
+ @api.model_create_multi
+ def create(self, values_list):
+ """ Make sure to have a pending_msg set. """
+ # This is done here and not in a default to have access to all required values.
+ acquirers = super().create(values_list)
+ acquirers._transfer_ensure_pending_msg_is_set()
+ return acquirers
+
+ def write(self, values):
+ """ Make sure to have a pending_msg set. """
+ # This is done here and not in a default to have access to all required values.
+ res = super().write(values)
+ self._transfer_ensure_pending_msg_is_set()
+ return res
+
+ def _transfer_ensure_pending_msg_is_set(self):
+ for acquirer in self.filtered(lambda a: a.provider == 'transfer' and not a.pending_msg):
+ company_id = acquirer.company_id.id
+ # filter only bank accounts marked as visible
+ accounts = self.env['account.journal'].search([
+ ('type', '=', 'bank'), ('company_id', '=', company_id)
+ ]).bank_account_id
+ acquirer.pending_msg = f'
' \
+ f'
{_("Please use the following transfer details")}
' \
+ f'
{_("Bank Account") if len(accounts) == 1 else _("Bank Accounts")}
' \
+ f'
{"".join(f"
{account.display_name}
" for account in accounts)}
' \
+ f'
{_("Communication")}
' \
+ f'
{_("Please use the order name as communication reference.")}
' \
+ f'
'
diff --git a/addons/payment_transfer/models/payment_transaction.py b/addons/payment_transfer/models/payment_transaction.py
new file mode 100644
index 00000000000..470869c59c3
--- /dev/null
+++ b/addons/payment_transfer/models/payment_transaction.py
@@ -0,0 +1,93 @@
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+import logging
+
+from odoo import _, api, models
+from odoo.exceptions import ValidationError
+
+from odoo.addons.payment_transfer.controllers.main import TransferController
+
+_logger = logging.getLogger(__name__)
+
+
+class PaymentTransaction(models.Model):
+ _inherit = 'payment.transaction'
+
+ def _get_specific_rendering_values(self, processing_values):
+ """ Override of payment to return Transfer-specific rendering values.
+
+ Note: self.ensure_one() from `_get_processing_values`
+
+ :param dict processing_values: The generic and specific processing values of the transaction
+ :return: The dict of acquirer-specific processing values
+ :rtype: dict
+ """
+ res = super()._get_specific_rendering_values(processing_values)
+ if self.provider != 'transfer':
+ return res
+
+ return {
+ 'api_url': TransferController._accept_url,
+ 'reference': self.reference,
+ }
+
+ @api.model
+ def _get_tx_from_feedback_data(self, provider, data):
+ """ Override of payment to find the transaction based on transfer data.
+
+ :param str provider: The provider of the acquirer that handled the transaction
+ :param dict data: The transfer feedback data
+ :return: The transaction if found
+ :rtype: recordset of `payment.transaction`
+ :raise: ValidationError if the data match no transaction
+ """
+ tx = super()._get_tx_from_feedback_data(provider, data)
+ if provider != 'transfer':
+ return tx
+
+ reference = data.get('reference')
+ tx = self.search([('reference', '=', reference), ('provider', '=', 'transfer')])
+ if not tx:
+ raise ValidationError(
+ "Wire Transfer: " + _("No transaction found matching reference %s.", reference)
+ )
+ return tx
+
+ def _process_feedback_data(self, data):
+ """ Override of payment to process the transaction based on transfer data.
+
+ Note: self.ensure_one()
+
+ :param dict data: The transfer feedback data
+ :return: None
+ """
+ super()._process_feedback_data(data)
+ if self.provider != 'transfer':
+ return
+
+ _logger.info(
+ "validated transfer payment for tx with reference %s: set as pending", self.reference
+ )
+ self._set_pending()
+
+ def _log_received_message(self):
+ """ Override of payment to remove transfer acquirer from the recordset.
+
+ :return: None
+ """
+ other_provider_txs = self.filtered(lambda t: t.provider != 'transfer')
+ super(PaymentTransaction, other_provider_txs)._log_received_message()
+
+ def _get_sent_message(self):
+ """ Override of payment to return a different message.
+
+ :return: The 'transaction sent' message
+ :rtype: str
+ """
+ message = super()._get_sent_message()
+ if self.provider == 'transfer':
+ message = _(
+ "The customer has selected %(acq_name)s to make the payment.",
+ acq_name=self.acquirer_id.name
+ )
+ return message
diff --git a/addons/payment_transfer/views/payment_transfer_templates.xml b/addons/payment_transfer/views/payment_transfer_templates.xml
index a3af2f4e318..f352f8e2a0d 100644
--- a/addons/payment_transfer/views/payment_transfer_templates.xml
+++ b/addons/payment_transfer/views/payment_transfer_templates.xml
@@ -1,14 +1,27 @@
-
-
-
-
-
+
+
+
+
+
+
+
+
+