pos_kds_report/models/pos_prep_state.py
2026-03-21 13:34:06 +07:00

104 lines
4.3 KiB
Python

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)