The idea of removing the domain was to have the portal views based
only on access rights and rules. We were just not really consistent
in not removing the domain on the counter. If the user has the right
to see also supplier invoices, it makes sens to let the user see
them in the portal. The domain on the counter is then here removed
to align both counter and views.
Fix commit 9434f7b64e
Closes PR #27583
Link to Task ID 30985
111 lines
5.2 KiB
Python
111 lines
5.2 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([])
|
|
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
|