feat: fetch and include order references and store names in loyalty history using batch queries

This commit is contained in:
Suherdy Yacob 2026-06-14 16:30:17 +07:00
parent 8571ddc88a
commit b2a14520ab

View File

@ -177,11 +177,50 @@ class AppNotificationController(http.Controller):
history_records = request.env['loyalty.history'].sudo().search_read( history_records = request.env['loyalty.history'].sudo().search_read(
[('card_id', 'in', card_ids)], [('card_id', 'in', card_ids)],
['id', 'card_id', 'issued', 'used', 'create_date', 'order_id', 'description'], ['id', 'card_id', 'issued', 'used', 'create_date', 'order_model', 'order_id', 'description'],
order='create_date desc', order='create_date desc',
limit=100 limit=100
) )
# Collect IDs to fetch in batches
pos_order_ids = []
sale_order_ids = []
for rec in history_records:
order_model = rec.get('order_model')
order_id = rec.get('order_id')
if order_id and order_model == 'pos.order':
pos_order_ids.append(order_id)
elif order_id and order_model == 'sale.order':
sale_order_ids.append(order_id)
# Batch query pos.orders to get receipt number and store name
pos_orders_map = {}
if pos_order_ids:
pos_orders = request.env['pos.order'].sudo().search_read(
[('id', 'in', pos_order_ids)],
['id', 'name', 'pos_reference', 'config_id']
)
for po in pos_orders:
config_name = po.get('config_id')[1] if isinstance(po.get('config_id'), (list, tuple)) else ''
pos_orders_map[po['id']] = {
'reference': po.get('pos_reference') or po.get('name') or '',
'pos_name': config_name
}
# Batch query sale.orders to get order number and warehouse name
sale_orders_map = {}
if sale_order_ids:
sale_orders = request.env['sale.order'].sudo().search_read(
[('id', 'in', sale_order_ids)],
['id', 'name', 'warehouse_id']
)
for so in sale_orders:
wh_name = so.get('warehouse_id')[1] if isinstance(so.get('warehouse_id'), (list, tuple)) else ''
sale_orders_map[so['id']] = {
'reference': so.get('name') or '',
'pos_name': wh_name
}
result = [] result = []
for rec in history_records: for rec in history_records:
issued = rec.get('issued') or 0.0 issued = rec.get('issued') or 0.0
@ -189,14 +228,26 @@ class AppNotificationController(http.Controller):
points = issued - used points = issued - used
point_type = 'earn' if points >= 0 else 'spend' point_type = 'earn' if points >= 0 else 'spend'
order_ref = '' order_model = rec.get('order_model')
order_id = rec.get('order_id') order_id = rec.get('order_id')
order_ref = ''
pos_name = ''
if order_id and order_model == 'pos.order' and order_id in pos_orders_map:
order_ref = pos_orders_map[order_id]['reference']
pos_name = pos_orders_map[order_id]['pos_name']
elif order_id and order_model == 'sale.order' and order_id in sale_orders_map:
order_ref = sale_orders_map[order_id]['reference']
pos_name = sale_orders_map[order_id]['pos_name']
# Fallbacks
if not order_ref:
if order_id and isinstance(order_id, (list, tuple)) and len(order_id) > 1: if order_id and isinstance(order_id, (list, tuple)) and len(order_id) > 1:
order_ref = str(order_id[1]) order_ref = str(order_id[1])
elif order_id: elif order_id:
order_ref = str(order_id) order_ref = str(order_id)
else:
if not order_ref:
order_ref = rec.get('description') or '' order_ref = rec.get('description') or ''
result.append({ result.append({
@ -205,6 +256,7 @@ class AppNotificationController(http.Controller):
'points': round(float(points), 2), 'points': round(float(points), 2),
'type': point_type, 'type': point_type,
'order_ref': order_ref, 'order_ref': order_ref,
'pos_name': pos_name,
'card_id': rec['card_id'][0] if isinstance(rec.get('card_id'), (list, tuple)) else rec.get('card_id'), 'card_id': rec['card_id'][0] if isinstance(rec.get('card_id'), (list, tuple)) else rec.get('card_id'),
}) })