65 lines
2.8 KiB
Python
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",
|
|
}
|