104 lines
4.3 KiB
Python
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)
|