# -*- 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