summaryrefslogtreecommitdiff
path: root/addons/payment/wizards/payment_acquirer_onboarding_wizard.py
diff options
context:
space:
mode:
Diffstat (limited to 'addons/payment/wizards/payment_acquirer_onboarding_wizard.py')
-rw-r--r--addons/payment/wizards/payment_acquirer_onboarding_wizard.py161
1 files changed, 161 insertions, 0 deletions
diff --git a/addons/payment/wizards/payment_acquirer_onboarding_wizard.py b/addons/payment/wizards/payment_acquirer_onboarding_wizard.py
new file mode 100644
index 00000000..24b6696a
--- /dev/null
+++ b/addons/payment/wizards/payment_acquirer_onboarding_wizard.py
@@ -0,0 +1,161 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import api, models, fields, _
+from odoo.exceptions import UserError
+
+
+class PaymentWizard(models.TransientModel):
+ _name = 'payment.acquirer.onboarding.wizard'
+ _description = 'Payment acquire onboarding wizard'
+
+ payment_method = fields.Selection([
+ ('paypal', "PayPal"),
+ ('stripe', "Credit card (via Stripe)"),
+ ('other', "Other payment acquirer"),
+ ('manual', "Custom payment instructions"),
+ ], string="Payment Method", default=lambda self: self._get_default_payment_acquirer_onboarding_value('payment_method'))
+
+ paypal_user_type = fields.Selection([
+ ('new_user', "I don't have a Paypal account"),
+ ('existing_user', 'I have a Paypal account')], string="Paypal User Type", default='new_user')
+ paypal_email_account = fields.Char("Email", default=lambda self: self._get_default_payment_acquirer_onboarding_value('paypal_email_account'))
+ paypal_seller_account = fields.Char("Merchant Account ID", default=lambda self: self._get_default_payment_acquirer_onboarding_value('paypal_seller_account'))
+ paypal_pdt_token = fields.Char("PDT Identity Token", default=lambda self: self._get_default_payment_acquirer_onboarding_value('paypal_pdt_token'))
+
+ stripe_secret_key = fields.Char(default=lambda self: self._get_default_payment_acquirer_onboarding_value('stripe_secret_key'))
+ stripe_publishable_key = fields.Char(default=lambda self: self._get_default_payment_acquirer_onboarding_value('stripe_publishable_key'))
+
+ manual_name = fields.Char("Method", default=lambda self: self._get_default_payment_acquirer_onboarding_value('manual_name'))
+ journal_name = fields.Char("Bank Name", default=lambda self: self._get_default_payment_acquirer_onboarding_value('journal_name'))
+ acc_number = fields.Char("Account Number", default=lambda self: self._get_default_payment_acquirer_onboarding_value('acc_number'))
+ manual_post_msg = fields.Html("Payment Instructions")
+
+ _data_fetched = fields.Boolean(store=False)
+
+ @api.onchange('journal_name', 'acc_number')
+ def _set_manual_post_msg_value(self):
+ self.manual_post_msg = _(
+ '<h3>Please make a payment to: </h3><ul><li>Bank: %s</li><li>Account Number: %s</li><li>Account Holder: %s</li></ul>',
+ self.journal_name or _("Bank"),
+ self.acc_number or _("Account"),
+ self.env.company.name
+ )
+
+ _payment_acquirer_onboarding_cache = {}
+
+ def _get_manual_payment_acquirer(self, env=None):
+ if env is None:
+ env = self.env
+ module_id = env.ref('base.module_payment_transfer').id
+ return env['payment.acquirer'].search([('module_id', '=', module_id),
+ ('company_id', '=', env.company.id)], limit=1)
+
+ def _get_default_payment_acquirer_onboarding_value(self, key):
+ if not self.env.is_admin():
+ raise UserError(_("Only administrators can access this data."))
+
+ if self._data_fetched:
+ return self._payment_acquirer_onboarding_cache.get(key, '')
+
+ self._data_fetched = True
+
+ self._payment_acquirer_onboarding_cache['payment_method'] = self.env.company.payment_onboarding_payment_method
+
+ installed_modules = self.env['ir.module.module'].sudo().search([
+ ('name', 'in', ('payment_paypal', 'payment_stripe')),
+ ('state', '=', 'installed'),
+ ]).mapped('name')
+
+ if 'payment_paypal' in installed_modules:
+ acquirer = self.env.ref('payment.payment_acquirer_paypal')
+ self._payment_acquirer_onboarding_cache['paypal_email_account'] = acquirer['paypal_email_account'] or self.env.user.email or ''
+ self._payment_acquirer_onboarding_cache['paypal_seller_account'] = acquirer['paypal_seller_account']
+ self._payment_acquirer_onboarding_cache['paypal_pdt_token'] = acquirer['paypal_pdt_token']
+
+ if 'payment_stripe' in installed_modules:
+ acquirer = self.env.ref('payment.payment_acquirer_stripe')
+ self._payment_acquirer_onboarding_cache['stripe_secret_key'] = acquirer['stripe_secret_key']
+ self._payment_acquirer_onboarding_cache['stripe_publishable_key'] = acquirer['stripe_publishable_key']
+
+ manual_payment = self._get_manual_payment_acquirer()
+ journal = manual_payment.journal_id
+
+ self._payment_acquirer_onboarding_cache['manual_name'] = manual_payment['name']
+ self._payment_acquirer_onboarding_cache['manual_post_msg'] = manual_payment['pending_msg']
+ self._payment_acquirer_onboarding_cache['journal_name'] = journal.name if journal.name != "Bank" else ""
+ self._payment_acquirer_onboarding_cache['acc_number'] = journal.bank_acc_number
+
+ return self._payment_acquirer_onboarding_cache.get(key, '')
+
+ def _install_module(self, module_name):
+ module = self.env['ir.module.module'].sudo().search([('name', '=', module_name)])
+ if module.state not in ('installed', 'to install', 'to upgrade'):
+ module.button_immediate_install()
+
+ def _on_save_payment_acquirer(self):
+ self._install_module('account_payment')
+
+ def add_payment_methods(self):
+ """ Install required payment acquiers, configure them and mark the
+ onboarding step as done."""
+
+ if self.payment_method == 'paypal':
+ self._install_module('payment_paypal')
+
+ if self.payment_method == 'stripe':
+ self._install_module('payment_stripe')
+
+ if self.payment_method in ('paypal', 'stripe', 'manual', 'other'):
+
+ self._on_save_payment_acquirer()
+
+ self.env.company.payment_onboarding_payment_method = self.payment_method
+
+ # create a new env including the freshly installed module(s)
+ new_env = api.Environment(self.env.cr, self.env.uid, self.env.context)
+
+ if self.payment_method == 'paypal':
+ new_env.ref('payment.payment_acquirer_paypal').write({
+ 'paypal_email_account': self.paypal_email_account,
+ 'paypal_seller_account': self.paypal_seller_account,
+ 'paypal_pdt_token': self.paypal_pdt_token,
+ 'state': 'enabled',
+ })
+ if self.payment_method == 'stripe':
+ new_env.ref('payment.payment_acquirer_stripe').write({
+ 'stripe_secret_key': self.stripe_secret_key,
+ 'stripe_publishable_key': self.stripe_publishable_key,
+ 'state': 'enabled',
+ })
+ if self.payment_method == 'manual':
+ manual_acquirer = self._get_manual_payment_acquirer(new_env)
+ if not manual_acquirer:
+ raise UserError(_(
+ 'No manual payment method could be found for this company. '
+ 'Please create one from the Payment Acquirer menu.'
+ ))
+ manual_acquirer.name = self.manual_name
+ manual_acquirer.pending_msg = self.manual_post_msg
+ manual_acquirer.state = 'enabled'
+
+ journal = manual_acquirer.journal_id
+ if journal:
+ journal.name = self.journal_name
+ journal.bank_acc_number = self.acc_number
+ else:
+ raise UserError(_("You have to set a journal for your payment acquirer %s.", self.manual_name))
+
+ # delete wizard data immediately to get rid of residual credentials
+ self.sudo().unlink()
+ # the user clicked `apply` and not cancel so we can assume this step is done.
+ self._set_payment_acquirer_onboarding_step_done()
+ return {'type': 'ir.actions.act_window_close'}
+
+ def _set_payment_acquirer_onboarding_step_done(self):
+ self.env.company.sudo().set_onboarding_step_done('payment_acquirer_onboarding_state')
+
+ def action_onboarding_other_payment_acquirer(self):
+ self._set_payment_acquirer_onboarding_step_done()
+ action = self.env["ir.actions.actions"]._for_xml_id("payment.action_payment_acquirer")
+ return action