# Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo.http import request from odoo.addons.account.controllers import portal from odoo.addons.payment.controllers.portal import PaymentPortal class PortalAccount(portal.PortalAccount, PaymentPortal): def _invoice_get_page_view_values(self, invoice, access_token, **kwargs): values = super()._invoice_get_page_view_values(invoice, access_token, **kwargs) if not invoice._has_to_be_paid(): # Do not compute payment-related stuff if given invoice doesn't have to be paid. return values logged_in = not request.env.user._is_public() # We set partner_id to the partner id of the current user if logged in, otherwise we set it # to the invoice partner id. We do this to ensure that payment tokens are assigned to the # correct partner and to avoid linking tokens to the public user. partner_sudo = request.env.user.partner_id if logged_in else invoice.partner_id invoice_company = invoice.company_id or request.env.company # Select all the payment methods and tokens that match the payment context. providers_sudo = request.env['payment.provider'].sudo()._get_compatible_providers( invoice_company.id, partner_sudo.id, invoice.amount_total, currency_id=invoice.currency_id.id ) # In sudo mode to read the fields of providers and partner (if logged out). payment_methods_sudo = request.env['payment.method'].sudo()._get_compatible_payment_methods( providers_sudo.ids, partner_sudo.id, currency_id=invoice.currency_id.id, ) # In sudo mode to read the fields of providers. tokens_sudo = request.env['payment.token'].sudo()._get_available_tokens( providers_sudo.ids, partner_sudo.id ) # In sudo mode to read the partner's tokens (if logged out) and provider fields. # Make sure that the partner's company matches the invoice's company. company_mismatch = not PaymentPortal._can_partner_pay_in_company( partner_sudo, invoice_company ) portal_page_values = { 'company_mismatch': company_mismatch, 'expected_company': invoice_company, } payment_form_values = { 'show_tokenize_input_mapping': PaymentPortal._compute_show_tokenize_input_mapping( providers_sudo ), } payment_context = { 'amount': invoice.amount_residual, 'currency': invoice.currency_id, 'partner_id': partner_sudo.id, 'providers_sudo': providers_sudo, 'payment_methods_sudo': payment_methods_sudo, 'tokens_sudo': tokens_sudo, 'transaction_route': f'/invoice/transaction/{invoice.id}/', 'landing_route': invoice.get_portal_url(), 'access_token': access_token, } values.update( **portal_page_values, **payment_form_values, **payment_context, **self._get_extra_payment_form_values(**kwargs), ) return values