Odoo18-Base/addons/loyalty/controllers/portal.py
2025-01-06 10:57:38 +07:00

128 lines
4.9 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import _, fields
from odoo.http import request, route
from odoo.addons.portal.controllers.portal import CustomerPortal
from odoo.addons.portal.controllers.portal import pager as portal_pager
class CustomerPortalLoyalty(CustomerPortal):
def _prepare_home_portal_values(self, counters):
values = super()._prepare_home_portal_values(counters)
if not counters:
# we want those data to be added to the /my/home page only, and always computed
values['cards_per_programs'] = dict(request.env['loyalty.card'].sudo()._read_group(
domain=[
('partner_id', '=', request.env.user.partner_id.id),
('program_id.active', '=', True),
('program_id.program_type', 'in', ['loyalty', 'ewallet']),
'|',
('expiration_date', '>=', fields.Date().today()),
('expiration_date', '=', False),
],
groupby=['program_id'],
aggregates=['id:recordset'],
))
return values
def _get_loyalty_searchbar_sortings(self):
return {
'date': {'label': _("Date"), 'order': 'create_date desc'},
'used': {'label': _("Used"), 'order': 'used desc'},
'description': {'label': _("Description"), 'order': 'description desc'},
'issued': {'label': _("Issued"), 'order': 'issued desc'},
}
@route(
[
'/my/loyalty_card/<int:card_id>/history',
'/my/loyalty_card/<int:card_id>/history/page/<int:page>',
],
type='http',
auth='user',
website=True,
)
def portal_my_loyalty_card_history(self, card_id, page=1, sortby='date', **kw):
card_sudo = request.env['loyalty.card'].sudo().search([
('id', '=', int(card_id)),
('partner_id', '=', request.env.user.partner_id.id),
])
if not card_sudo:
return request.redirect('/my')
LoyaltyHistorySudo = request.env['loyalty.history'].sudo()
searchbar_sortings = self._get_loyalty_searchbar_sortings()
order = searchbar_sortings[sortby]['order']
lines_count = LoyaltyHistorySudo.search_count([('card_id', '=', card_id)])
pager = portal_pager(
url='/my/loyalty_card/<int:card_id>/history',
url_args={'sortby': sortby, 'card_id': card_id},
total=lines_count,
page=page,
step=self._items_per_page,
)
history_lines = LoyaltyHistorySudo.search(
domain=[
('card_id', '=', card_id),
('card_id.partner_id', '=', request.env.user.partner_id.id)
],
order=order,
limit=self._items_per_page,
offset=pager['offset'],
)
values = {
'pager': pager,
'searchbar_sortings': searchbar_sortings,
'page_name': 'loyalty_history',
'sortby': sortby,
'history_lines': history_lines,
}
return request.render('loyalty.loyalty_card_history_template', values)
@route('/my/loyalty_card/<int:card_id>/values', type='json', auth='user')
def portal_get_card_history_values(self, card_id):
card_sudo = request.env['loyalty.card'].sudo().search([
('id', '=', int(card_id)),
('partner_id', '=', request.env.user.partner_id.id)
])
if not card_sudo:
return {}
program_type = card_sudo.program_id.program_type
rewards = request.env['loyalty.reward'].sudo().search(
[
('program_id', '=', card_sudo.program_id.id),
('required_points', '<=', card_sudo.points)
],
order='required_points desc',
limit=3,
)
return {
'card': {
'id': card_sudo.id,
'points_display': card_sudo.points_display,
'expiration_date': card_sudo.expiration_date,
'code': card_sudo.code,
},
'program': {
'program_name': card_sudo.program_id.name,
'program_type': program_type,
},
'history_lines': [{
'order_id': line.order_id,
'description': line.description,
'order_portal_url': line._get_order_portal_url(),
'points': f'{"-" if line.issued < line.used else "+"}'
f'{card_sudo._format_points(abs(line.issued - line.used))}',
} for line in card_sudo.history_ids[:5]],
'rewards': [{
'description': reward.description,
'points': card_sudo._format_points(reward.required_points),
} for reward in rewards],
'img_path': f'/loyalty/static/src/img/{program_type}.svg',
}