from odoo import models class PosPreparationState(models.Model): _inherit = 'pos.prep.state' def _update_kds_report(self, pdis_state): if not pdis_state.prep_line_id.pos_order_line_id: return order_line = pdis_state.prep_line_id.pos_order_line_id prep_display = pdis_state.stage_id.prep_display_id is_completed = False if len(pdis_state.stage_id.prep_display_id.stage_ids) > 1: if pdis_state.stage_id.is_stage_position(-1): is_completed = True elif pdis_state.stage_id.is_stage_position(-2) and not pdis_state.todo: is_completed = True else: if pdis_state.stage_id.is_stage_position(0) and not pdis_state.todo: is_completed = True is_reset = False if pdis_state.stage_id.is_stage_position(0) and pdis_state.todo: is_reset = True line_report = self.env['pos.kds.report.line'].search([ ('pos_order_line_id', '=', order_line.id), ('prep_display_id', '=', prep_display.id) ], limit=1) if is_completed: prep_time = max(0, order_line.preparation_time) svc_time = max(0, order_line.service_time) comp_time = prep_time + svc_time vals = { 'pos_order_id': order_line.order_id.id, 'pos_order_line_id': order_line.id, 'product_id': order_line.product_id.id, 'prep_display_id': prep_display.id, 'preparation_time': prep_time, 'service_time': svc_time, 'completion_time': comp_time, } if line_report: line_report.write(vals) else: self.env['pos.kds.report.line'].create(vals) # Update order-level report order_report = self.env['pos.kds.report.order'].search([ ('pos_order_id', '=', order_line.order_id.id), ('prep_display_id', '=', prep_display.id) ], limit=1) # Re-calculate max completion time for the order on this KDS all_line_reports = self.env['pos.kds.report.line'].search([ ('pos_order_id', '=', order_line.order_id.id), ('prep_display_id', '=', prep_display.id) ]) max_comp_time = max(all_line_reports.mapped('completion_time')) if all_line_reports else comp_time order_vals = { 'pos_order_id': order_line.order_id.id, 'prep_display_id': prep_display.id, 'completion_time': max_comp_time, } if order_report: order_report.write(order_vals) else: self.env['pos.kds.report.order'].create(order_vals) elif is_reset: if line_report: line_report.unlink() # We don't necessarily delete the order record since other lines might still be complete. # But we could re-calculate the max if needed. Let's re-eval. all_line_reports = self.env['pos.kds.report.line'].search([ ('pos_order_id', '=', order_line.order_id.id), ('prep_display_id', '=', prep_display.id) ]) order_report = self.env['pos.kds.report.order'].search([ ('pos_order_id', '=', order_line.order_id.id), ('prep_display_id', '=', prep_display.id) ], limit=1) if order_report: if not all_line_reports: order_report.unlink() else: max_comp_time = max(all_line_reports.mapped('completion_time')) order_report.write({'completion_time': max_comp_time}) def _record_status_change_prep_time(self, pdis_state): super()._record_status_change_prep_time(pdis_state) self._update_kds_report(pdis_state) def _record_stage_change_prep_time(self, pdis_state, old_last_stage_change, prep_order_completion_time): super()._record_stage_change_prep_time(pdis_state, old_last_stage_change, prep_order_completion_time) self._update_kds_report(pdis_state)