diff --git a/models/pos_prep_state.py b/models/pos_prep_state.py index d279630..25b4130 100644 --- a/models/pos_prep_state.py +++ b/models/pos_prep_state.py @@ -68,7 +68,7 @@ class PosPreparationState(models.Model): ('prep_display_id', '=', display_id) ], limit=1) if line_report: - line_report.unlink() + line_report.write({'state': 'in_prep'}) order_report = KdsOrderReport.search([ ('pos_order_id', '=', order_id), @@ -76,34 +76,22 @@ class PosPreparationState(models.Model): ], limit=1) if order_report: - res = KdsLineReport._read_group( - [('pos_order_id', '=', order_id), ('prep_display_id', '=', display_id)], - aggregates=['completion_time:max'] - ) - max_comp_time = res[0][0] if res else 0 - if max_comp_time == 0: - order_report.unlink() - else: - order_report.write({'completion_time': max_comp_time}) + order_report.write({'state': 'in_prep'}) return # --- Completed --- - # Use a slightly larger epsilon for -1 check to be safe with float/int conversions if any prep_time = order_line.preparation_time svc_time = order_line.service_time # Fallback timing logic if prep_time == -1: if old_last_stage_change: - # If we have the old timestamp, it means we spent time in the previous stage prep_time = int(compute_seconds_since(old_last_stage_change)) else: - # Otherwise use the current stage entry time prep_time = int(compute_seconds_since(pdis_state.last_stage_change)) if svc_time == -1: if is_completed and stage.id == last_stage_id and old_last_stage_change: - # If moving to last stage, service time is time spent in previous stage svc_time = int(compute_seconds_since(old_last_stage_change)) else: svc_time = 0 @@ -112,8 +100,10 @@ class PosPreparationState(models.Model): svc_time = max(0, svc_time) comp_time = prep_time + svc_time - _logger.info("KDS Completed: Order %s, Line %s: Prep=%ss, Svc=%ss, Total=%ss", - order_name, order_line.product_id.name, prep_time, svc_time, comp_time) + line_report = KdsLineReport.search([ + ('pos_order_line_id', '=', order_line.id), + ('prep_display_id', '=', display_id) + ], limit=1) vals = { 'pos_order_id': order_id, @@ -124,36 +114,57 @@ class PosPreparationState(models.Model): 'service_time': svc_time, 'completion_time': comp_time, 'completion_datetime': fields.Datetime.now(), + 'state': 'done', } - line_report = KdsLineReport.search([ - ('pos_order_line_id', '=', order_line.id), - ('prep_display_id', '=', display_id) - ], limit=1) - if line_report: - line_report.write(vals) + # Accumulate if it was already existing (e.g. from a previous completion before reset) + # Note: We only accumulate if the current session's time is valid. + new_prep = line_report.preparation_time + prep_time + new_svc = line_report.service_time + svc_time + new_comp = new_prep + new_svc + + _logger.info("KDS Re-Completed (Accumulating): Order %s, Line %s: %ss + %ss = %ss", + order_name, order_line.product_id.name, line_report.completion_time, comp_time, new_comp) + + line_report.write({ + 'preparation_time': new_prep, + 'service_time': new_svc, + 'completion_time': new_comp, + 'completion_datetime': vals['completion_datetime'], + 'state': 'done', + }) + # Update local comp_time for order report update below + comp_time = new_comp else: + _logger.info("KDS Completed: Order %s, Line %s: Prep=%ss, Svc=%ss, Total=%ss", + order_name, order_line.product_id.name, prep_time, svc_time, comp_time) KdsLineReport.create(vals) - # Update Order Report - Optimized to avoid _read_group inside loops + # Update Order Report order_report = KdsOrderReport.search([ ('pos_order_id', '=', order_id), ('prep_display_id', '=', display_id) ], limit=1) if order_report: - # Only update if the new completion time is greater, or if it's been some time - if comp_time > order_report.completion_time: + # Update state and accumulate/max time + # We use the max completion time across all lines of this order for this display. + # If we just updated a line to 219s, and order report was 204s, it becomes 219s. + if comp_time > order_report.completion_time or order_report.state != 'done': order_report.write({ - 'completion_time': comp_time, + 'completion_time': max(comp_time, order_report.completion_time), + 'state': 'done', 'completion_datetime': vals['completion_datetime'], }) else: KdsOrderReport.create({ 'pos_order_id': order_id, 'prep_display_id': display_id, + 'preparation_time': prep_time, # Simplified: will be updated by other lines if needed + 'service_time': svc_time, 'completion_time': comp_time, + 'state': 'done', 'completion_datetime': vals['completion_datetime'], })