Files

65 lines
2.8 KiB
Python

from odoo import models
from odoo.addons.pos_enterprise.utils.date_utils import compute_seconds_since
class PosPrepDisplay(models.Model):
_inherit = "pos.prep.display"
def _get_pos_orders(self):
self.ensure_one()
if len(self.stage_ids) <= 1:
return {"done": [], "notDone": []}
last_stage = self.stage_ids[-1] # last stage always means that the order is done.
second_last_stage = self.stage_ids[-2] # order will be displayed as ready.
pdis_line_ids = self._get_open_orderlines_in_display().filtered(lambda o: o.stage_id != last_stage)
# Prefetch the relational chain to avoid repeated lazy-load queries.
pdis_line_ids.mapped('prep_line_id.prep_order_id.pos_order_id')
# Group lines by pos_order_id to avoid O(n²) inner loop.
order_lines = {}
for line in pdis_line_ids:
pos_order = line.prep_line_id.prep_order_id.pos_order_id
order_lines.setdefault(pos_order.id, []).append(line)
orders_completed = set()
orders_not_completed = set()
orders_completed_ready_date = {}
for lines in order_lines.values():
all_ready = all(line.stage_id == second_last_stage for line in lines)
if all_ready:
# Use the latest stage change as the order ready date.
ready_line = max(lines, key=lambda line: line.last_stage_change)
order_ready_date = ready_line.last_stage_change
order_ready_delay = int(compute_seconds_since(order_ready_date) / 60)
is_order_visible = not self.auto_clear or order_ready_delay < self.clear_time_interval
if is_order_visible:
tracking_ref = lines[0].prep_line_id.prep_order_id.pos_order_id.tracking_number
orders_completed.add(tracking_ref)
orders_completed_ready_date[tracking_ref] = str(order_ready_date)
else:
tracking_ref = lines[0].prep_line_id.prep_order_id.pos_order_id.tracking_number
orders_not_completed.add(tracking_ref)
return {
"done": list(orders_completed),
"notDone": list(orders_not_completed),
"ordersCompletedReadyDate": orders_completed_ready_date,
}
def _send_orders_to_customer_display(self):
self.ensure_one()
self._notify("NEW_ORDERS", [])
def _send_load_orders_message(self, sound=False, notification=None, orderId=None):
super()._send_load_orders_message(sound, notification, orderId)
self._send_orders_to_customer_display()
def open_customer_display(self):
return {
"type": "ir.actions.act_url",
"url": f"/pos-order-tracking?access_token={self.access_token}",
"target": "new",
}