From 462e75faacf88215a3ce2351b6a4b5631cb0904c Mon Sep 17 00:00:00 2001
From: "Anita (anko)" <anko@odoo.com>
Date: Wed, 17 May 2023 11:22:35 +0000
Subject: [PATCH] [FIX] payment: fix payment confirmation onboarding step

User was not able to go through onboarding if they switched company.
By default it tried to edit default payment provider that was conected
to the main company, so other companies were recieving Access Error.

opw-3298326

closes odoo/odoo#121619

Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
---
 addons/payment/models/res_company.py          |  9 ++++++-
 .../payment_acquirer_onboarding_wizard.py     | 27 ++++++++++++++-----
 2 files changed, 29 insertions(+), 7 deletions(-)

diff --git a/addons/payment/models/res_company.py b/addons/payment/models/res_company.py
index a8cb3b3fde8c..2d36023383fd 100644
--- a/addons/payment/models/res_company.py
+++ b/addons/payment/models/res_company.py
@@ -55,7 +55,14 @@ class ResCompany(models.Model):
             [('type', '=', 'bank'), ('company_id', '=', new_env.company.id)], limit=1
         )
 
-        stripe_acquirer = new_env.ref('payment.payment_acquirer_stripe')
+        stripe_acquirer = new_env['payment.acquirer'].search(
+            [('company_id', '=', self.env.company.id), ('name', '=', 'Stripe')], limit=1
+        )
+        if not stripe_acquirer:
+            base_acquirer = self.env.ref('payment.payment_acquirer_stripe')
+            # Use sudo to access payment acquirer record that can be in different company.
+            stripe_acquirer = base_acquirer.sudo().copy(default={'company_id': self.env.company.id})
+            stripe_acquirer.company_id = self.env.company.id
         stripe_acquirer.journal_id = stripe_acquirer.journal_id or default_journal
 
         return stripe_acquirer.action_stripe_connect_account(menu_id=menu_id)
diff --git a/addons/payment/wizards/payment_acquirer_onboarding_wizard.py b/addons/payment/wizards/payment_acquirer_onboarding_wizard.py
index 55860c1d0a60..1919c011efef 100644
--- a/addons/payment/wizards/payment_acquirer_onboarding_wizard.py
+++ b/addons/payment/wizards/payment_acquirer_onboarding_wizard.py
@@ -67,12 +67,16 @@ class PaymentWizard(models.TransientModel):
         ]).mapped('name')
 
         if 'payment_paypal' in installed_modules:
-            acquirer = self.env.ref('payment.payment_acquirer_paypal')
+            acquirer = self.env['payment.acquirer'].search(
+                [('company_id', '=', self.env.company.id), ('name', '=', 'PayPal')], limit=1
+            )
             self._payment_acquirer_onboarding_cache['paypal_email_account'] = acquirer['paypal_email_account'] or self.env.user.email or ''
             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')
+            acquirer = self.env['payment.acquirer'].search(
+                [('company_id', '=', self.env.company.id), ('name', '=', 'Stripe')], limit=1
+            )
             self._payment_acquirer_onboarding_cache['stripe_secret_key'] = acquirer['stripe_secret_key']
             self._payment_acquirer_onboarding_cache['stripe_publishable_key'] = acquirer['stripe_publishable_key']
 
@@ -114,14 +118,23 @@ class PaymentWizard(models.TransientModel):
             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)
 
+            new_env = api.Environment(self.env.cr, self.env.uid, self.env.context)
             if self.payment_method == 'paypal':
-                acquirer = new_env.ref('payment.payment_acquirer_paypal', raise_if_not_found=False)
+                acquirer = new_env['payment.acquirer'].search(
+                    [('name', '=', 'PayPal'), ('company_id', '=', self.env.company.id)], limit=1
+                )
+                if not acquirer:
+                    base_acquirer = self.env.ref('payment.payment_acquirer_paypal')
+                    # Use sudo to access payment acquirer record that can be in different company.
+                    acquirer = base_acquirer.sudo().copy(
+                        default={'company_id': self.env.company.id}
+                    )
+                    acquirer.company_id = self.env.company.id
                 default_journal = new_env['account.journal'].search(
                     [('type', '=', 'bank'), ('company_id', '=', new_env.company.id)], limit=1
                 )
-                new_env.ref('payment.payment_acquirer_paypal').write({
+                acquirer.write({
                     'paypal_email_account': self.paypal_email_account,
                     'paypal_seller_account': self.paypal_seller_account,
                     'paypal_pdt_token': self.paypal_pdt_token,
@@ -129,7 +142,9 @@ class PaymentWizard(models.TransientModel):
                     'journal_id': acquirer.journal_id or default_journal
                 })
             if self.payment_method == 'stripe':
-                new_env.ref('payment.payment_acquirer_stripe').write({
+                new_env['payment.acquirer'].search(
+                    [('name', '=', 'Stripe'), ('company_id', '=', self.env.company.id)], limit=1
+                ).write({
                     'stripe_secret_key': self.stripe_secret_key,
                     'stripe_publishable_key': self.stripe_publishable_key,
                     'state': 'enabled',
-- 
GitLab