48 lines
2.3 KiB
Python
48 lines
2.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
from odoo import models, api, fields
|
|
|
|
class PosPrepDisplay(models.Model):
|
|
_inherit = 'pos.prep.display'
|
|
|
|
@api.depends('stage_ids', 'pos_config_ids', 'category_ids')
|
|
def _compute_order_count(self):
|
|
for preparation_display in self:
|
|
open_pdis_lines = preparation_display._get_open_orderlines_in_display()
|
|
progress_orders = open_pdis_lines.filtered(
|
|
lambda state: state.stage_id.id != preparation_display.stage_ids[-1].id
|
|
).prep_line_id.prep_order_id
|
|
preparation_display.order_count = len(progress_orders)
|
|
|
|
completed_order_times = []
|
|
open_prep_order_ids = open_pdis_lines.prep_line_id.prep_order_id.ids
|
|
|
|
# Fetch at most the last 100 completed preparation orders to avoid huge loops and timeouts
|
|
done_orders = self.env['pos.prep.order'].search(
|
|
[('id', 'not in', open_prep_order_ids)],
|
|
order='id desc',
|
|
limit=100
|
|
)
|
|
|
|
if done_orders:
|
|
# Batch query all pos.prep.state for these done orders in a single query
|
|
states = self.env['pos.prep.state'].search([
|
|
('prep_line_id.prep_order_id', 'in', done_orders.ids),
|
|
('stage_id', 'in', preparation_display.stage_ids.ids)
|
|
])
|
|
|
|
# Group states by preparation order id in Python
|
|
states_by_order = {}
|
|
for state in states:
|
|
order_id = state.prep_line_id.prep_order_id.id
|
|
if order_id not in states_by_order:
|
|
states_by_order[order_id] = []
|
|
states_by_order[order_id].append(state)
|
|
|
|
for order in done_orders:
|
|
order_lines = states_by_order.get(order.id, [])
|
|
if order_lines and order.pos_order_id and order.pos_order_id.create_date:
|
|
max_write_date = max(state.write_date for state in order_lines)
|
|
completed_order_times.append((max_write_date - order.pos_order_id.create_date).total_seconds())
|
|
|
|
preparation_display.average_time = round(sum(completed_order_times) / len(completed_order_times) / 60) if completed_order_times else 0
|