refactor: update KDS report state management to support accumulation and status tracking instead of unlinking records

This commit is contained in:
Suherdy Yacob 2026-05-12 10:06:56 +07:00
parent e77b92a1c2
commit 32352f0449

View File

@ -68,7 +68,7 @@ class PosPreparationState(models.Model):
('prep_display_id', '=', display_id) ('prep_display_id', '=', display_id)
], limit=1) ], limit=1)
if line_report: if line_report:
line_report.unlink() line_report.write({'state': 'in_prep'})
order_report = KdsOrderReport.search([ order_report = KdsOrderReport.search([
('pos_order_id', '=', order_id), ('pos_order_id', '=', order_id),
@ -76,34 +76,22 @@ class PosPreparationState(models.Model):
], limit=1) ], limit=1)
if order_report: if order_report:
res = KdsLineReport._read_group( order_report.write({'state': 'in_prep'})
[('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})
return return
# --- Completed --- # --- Completed ---
# Use a slightly larger epsilon for -1 check to be safe with float/int conversions if any
prep_time = order_line.preparation_time prep_time = order_line.preparation_time
svc_time = order_line.service_time svc_time = order_line.service_time
# Fallback timing logic # Fallback timing logic
if prep_time == -1: if prep_time == -1:
if old_last_stage_change: 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)) prep_time = int(compute_seconds_since(old_last_stage_change))
else: else:
# Otherwise use the current stage entry time
prep_time = int(compute_seconds_since(pdis_state.last_stage_change)) prep_time = int(compute_seconds_since(pdis_state.last_stage_change))
if svc_time == -1: if svc_time == -1:
if is_completed and stage.id == last_stage_id and old_last_stage_change: 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)) svc_time = int(compute_seconds_since(old_last_stage_change))
else: else:
svc_time = 0 svc_time = 0
@ -112,8 +100,10 @@ class PosPreparationState(models.Model):
svc_time = max(0, svc_time) svc_time = max(0, svc_time)
comp_time = prep_time + svc_time comp_time = prep_time + svc_time
_logger.info("KDS Completed: Order %s, Line %s: Prep=%ss, Svc=%ss, Total=%ss", line_report = KdsLineReport.search([
order_name, order_line.product_id.name, prep_time, svc_time, comp_time) ('pos_order_line_id', '=', order_line.id),
('prep_display_id', '=', display_id)
], limit=1)
vals = { vals = {
'pos_order_id': order_id, 'pos_order_id': order_id,
@ -124,36 +114,57 @@ class PosPreparationState(models.Model):
'service_time': svc_time, 'service_time': svc_time,
'completion_time': comp_time, 'completion_time': comp_time,
'completion_datetime': fields.Datetime.now(), '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: 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: 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) KdsLineReport.create(vals)
# Update Order Report - Optimized to avoid _read_group inside loops # Update Order Report
order_report = KdsOrderReport.search([ order_report = KdsOrderReport.search([
('pos_order_id', '=', order_id), ('pos_order_id', '=', order_id),
('prep_display_id', '=', display_id) ('prep_display_id', '=', display_id)
], limit=1) ], limit=1)
if order_report: if order_report:
# Only update if the new completion time is greater, or if it's been some time # Update state and accumulate/max time
if comp_time > order_report.completion_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({ order_report.write({
'completion_time': comp_time, 'completion_time': max(comp_time, order_report.completion_time),
'state': 'done',
'completion_datetime': vals['completion_datetime'], 'completion_datetime': vals['completion_datetime'],
}) })
else: else:
KdsOrderReport.create({ KdsOrderReport.create({
'pos_order_id': order_id, 'pos_order_id': order_id,
'prep_display_id': display_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, 'completion_time': comp_time,
'state': 'done',
'completion_datetime': vals['completion_datetime'], 'completion_datetime': vals['completion_datetime'],
}) })