diff --git a/controllers/main.py b/controllers/main.py index d0c43f9..9101225 100644 --- a/controllers/main.py +++ b/controllers/main.py @@ -177,11 +177,50 @@ class AppNotificationController(http.Controller): history_records = request.env['loyalty.history'].sudo().search_read( [('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', 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 = [] for rec in history_records: issued = rec.get('issued') or 0.0 @@ -189,15 +228,27 @@ class AppNotificationController(http.Controller): points = issued - used point_type = 'earn' if points >= 0 else 'spend' - order_ref = '' + order_model = rec.get('order_model') order_id = rec.get('order_id') - if order_id and isinstance(order_id, (list, tuple)) and len(order_id) > 1: - order_ref = str(order_id[1]) - elif order_id: - order_ref = str(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: - order_ref = rec.get('description') or '' + if order_id and isinstance(order_id, (list, tuple)) and len(order_id) > 1: + order_ref = str(order_id[1]) + elif order_id: + order_ref = str(order_id) + else: + order_ref = rec.get('description') or '' result.append({ 'id': rec['id'], @@ -205,6 +256,7 @@ class AppNotificationController(http.Controller): 'points': round(float(points), 2), 'type': point_type, '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'), })