This commit aims to improve the user experience when using payment acquirers. There currently are no error feedback with some acquirers, which leaves the user wondering what is going on and what is the real status of its payment. In some cases, the user is currently being redirected to the home page even though the payment has failed. We want to make it more obvious to the user that something unexpected has happened by redirecting to an intermediate page that will provide good feedback on payments status. Another goal of this commit is to order acquirers by sequence instead of by flow and to select the first acquirer by default. This feature was already implmented in commit fe294fd43e521bd2d339e962f43acf46c3d4cb97, some UI adaptations were needed though. Related to task #36680 Closes #26958
113 lines
5.3 KiB
Python
113 lines
5.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import http, _
|
|
from odoo.addons.portal.controllers.portal import CustomerPortal, pager as portal_pager
|
|
from odoo.addons.payment.controllers.portal import PaymentProcessing
|
|
from odoo.exceptions import AccessError, MissingError
|
|
from odoo.http import request
|
|
|
|
|
|
class PortalAccount(CustomerPortal):
|
|
|
|
def _prepare_portal_layout_values(self):
|
|
values = super(PortalAccount, self)._prepare_portal_layout_values()
|
|
invoice_count = request.env['account.invoice'].search_count([
|
|
('type', 'in', ['out_invoice', 'out_refund'])
|
|
])
|
|
values['invoice_count'] = invoice_count
|
|
return values
|
|
|
|
# ------------------------------------------------------------
|
|
# My Invoices
|
|
# ------------------------------------------------------------
|
|
|
|
def _invoice_get_page_view_values(self, invoice, access_token, **kwargs):
|
|
values = {
|
|
'page_name': 'invoice',
|
|
'invoice': invoice,
|
|
}
|
|
return self._get_page_view_values(invoice, access_token, values, 'my_invoices_history', False, **kwargs)
|
|
|
|
@http.route(['/my/invoices', '/my/invoices/page/<int:page>'], type='http', auth="user", website=True)
|
|
def portal_my_invoices(self, page=1, date_begin=None, date_end=None, sortby=None, **kw):
|
|
values = self._prepare_portal_layout_values()
|
|
AccountInvoice = request.env['account.invoice']
|
|
|
|
domain = []
|
|
|
|
searchbar_sortings = {
|
|
'date': {'label': _('Invoice Date'), 'order': 'date_invoice desc'},
|
|
'duedate': {'label': _('Due Date'), 'order': 'date_due desc'},
|
|
'name': {'label': _('Reference'), 'order': 'name desc'},
|
|
'state': {'label': _('Status'), 'order': 'state'},
|
|
}
|
|
# default sort by order
|
|
if not sortby:
|
|
sortby = 'date'
|
|
order = searchbar_sortings[sortby]['order']
|
|
|
|
archive_groups = self._get_archive_groups('account.invoice', domain)
|
|
if date_begin and date_end:
|
|
domain += [('create_date', '>', date_begin), ('create_date', '<=', date_end)]
|
|
|
|
# count for pager
|
|
invoice_count = AccountInvoice.search_count(domain)
|
|
# pager
|
|
pager = portal_pager(
|
|
url="/my/invoices",
|
|
url_args={'date_begin': date_begin, 'date_end': date_end, 'sortby': sortby},
|
|
total=invoice_count,
|
|
page=page,
|
|
step=self._items_per_page
|
|
)
|
|
# content according to pager and archive selected
|
|
invoices = AccountInvoice.search(domain, order=order, limit=self._items_per_page, offset=pager['offset'])
|
|
request.session['my_invoices_history'] = invoices.ids[:100]
|
|
|
|
values.update({
|
|
'date': date_begin,
|
|
'invoices': invoices,
|
|
'page_name': 'invoice',
|
|
'pager': pager,
|
|
'archive_groups': archive_groups,
|
|
'default_url': '/my/invoices',
|
|
'searchbar_sortings': searchbar_sortings,
|
|
'sortby': sortby,
|
|
})
|
|
return request.render("account.portal_my_invoices", values)
|
|
|
|
@http.route(['/my/invoices/<int:invoice_id>'], type='http', auth="public", website=True)
|
|
def portal_my_invoice_detail(self, invoice_id, access_token=None, report_type=None, download=False, **kw):
|
|
try:
|
|
invoice_sudo = self._document_check_access('account.invoice', invoice_id, access_token)
|
|
except (AccessError, MissingError):
|
|
return request.redirect('/my')
|
|
|
|
if report_type in ('html', 'pdf', 'text'):
|
|
return self._show_report(model=invoice_sudo, report_type=report_type, report_ref='account.account_invoices', download=download)
|
|
|
|
values = self._invoice_get_page_view_values(invoice_sudo, access_token, **kw)
|
|
PaymentProcessing.remove_payment_transaction(invoice_sudo.transaction_ids)
|
|
return request.render("account.portal_invoice_page", values)
|
|
|
|
# ------------------------------------------------------------
|
|
# My Home
|
|
# ------------------------------------------------------------
|
|
|
|
def details_form_validate(self, data):
|
|
error, error_message = super(PortalAccount, self).details_form_validate(data)
|
|
# prevent VAT/name change if invoices exist
|
|
partner = request.env['res.users'].browse(request.uid).partner_id
|
|
if not partner.can_edit_vat():
|
|
if 'vat' in data and (data['vat'] or False) != (partner.vat or False):
|
|
error['vat'] = 'error'
|
|
error_message.append(_('Changing VAT number is not allowed once invoices have been issued for your account. Please contact us directly for this operation.'))
|
|
if 'name' in data and (data['name'] or False) != (partner.name or False):
|
|
error['name'] = 'error'
|
|
error_message.append(_('Changing your name is not allowed once invoices have been issued for your account. Please contact us directly for this operation.'))
|
|
if 'company_name' in data and (data['company_name'] or False) != (partner.company_name or False):
|
|
error['company_name'] = 'error'
|
|
error_message.append(_('Changing your company name is not allowed once invoices have been issued for your account. Please contact us directly for this operation.'))
|
|
return error, error_message
|