91 lines
5.2 KiB
Python
91 lines
5.2 KiB
Python
from odoo import fields, models
|
|
from odoo.addons.pos_enterprise.utils.date_utils import compute_seconds_since
|
|
|
|
|
|
class PosPreparationState(models.Model):
|
|
_name = 'pos.prep.state'
|
|
_description = 'Pos Preparation State'
|
|
_inherit = ['pos.load.mixin']
|
|
|
|
prep_line_id = fields.Many2one('pos.prep.line', string='Preparation Orderline', required=True, ondelete='cascade')
|
|
todo = fields.Boolean("Status of the orderline", help="The status of a command line, todo or not", default=True)
|
|
stage_id = fields.Many2one('pos.prep.stage', ondelete='cascade', index=True)
|
|
last_stage_change = fields.Datetime(default=fields.Datetime.now)
|
|
|
|
def change_state_status(self, todos, prep_display_id):
|
|
pdis_state_todos = []
|
|
|
|
for pdis_state in self:
|
|
pdis_state.todo = todos[str(pdis_state.id)]
|
|
pdis_state_todos.append({
|
|
'id': pdis_state.id,
|
|
'todo': pdis_state.todo
|
|
})
|
|
self._record_status_change_prep_time(pdis_state)
|
|
|
|
p_dis = self.env['pos.prep.display'].browse(int(prep_display_id))
|
|
p_dis._notify('CHANGE_STATE_STATUS', pdis_state_todos)
|
|
|
|
return True
|
|
|
|
def _record_status_change_prep_time(self, pdis_state):
|
|
# If first stage & line is done, write the preparation_time
|
|
if not pdis_state.todo and pdis_state.stage_id.is_stage_position(0) and pdis_state.prep_line_id.pos_order_line_id.preparation_time == -1:
|
|
pdis_state.prep_line_id.pos_order_line_id.preparation_time = compute_seconds_since(pdis_state.last_stage_change)
|
|
elif pdis_state.todo and pdis_state.stage_id.is_stage_position(0) and pdis_state.prep_line_id.pos_order_line_id.preparation_time != -1:
|
|
pdis_state.prep_line_id.pos_order_line_id.preparation_time = -1
|
|
# If second last stage & line is done, write the service_time
|
|
if len(pdis_state.stage_id) > 1:
|
|
if not pdis_state.todo and pdis_state.stage_id.is_stage_position(-2) and pdis_state.prep_line_id.pos_order_line_id.service_time == -1:
|
|
pdis_state.prep_line_id.pos_order_line_id.service_time = compute_seconds_since(pdis_state.last_stage_change)
|
|
elif pdis_state.todo and pdis_state.stage_id.is_stage_position(-2) and pdis_state.prep_line_id.pos_order_line_id.service_time != -1:
|
|
pdis_state.prep_line_id.pos_order_line_id.service_time = -1
|
|
|
|
def change_state_stage(self, stages, prep_display_id):
|
|
pdis_state_stages = []
|
|
prep_order_completion_time = {}
|
|
|
|
for pdis_state in self:
|
|
old_last_stage_change = pdis_state.last_stage_change
|
|
pdis_state.todo = True
|
|
pdis_state.stage_id = stages[str(pdis_state.id)]
|
|
pdis_state.last_stage_change = pdis_state.write_date
|
|
pdis_state_stages.append({
|
|
'id': pdis_state.id,
|
|
'stage_id': pdis_state.stage_id.id,
|
|
'last_stage_change': pdis_state.last_stage_change
|
|
})
|
|
self._record_stage_change_prep_time(pdis_state, old_last_stage_change, prep_order_completion_time)
|
|
|
|
p_dis = self.env['pos.prep.display'].browse(int(prep_display_id))
|
|
p_dis._notify('CHANGE_STATE_STAGE', {'pdis_state_stages': pdis_state_stages, 'prep_order_completion_time': prep_order_completion_time})
|
|
|
|
return True
|
|
|
|
def _record_stage_change_prep_time(self, pdis_state, old_last_stage_change, prep_order_completion_time):
|
|
pos_order_line = pdis_state.prep_line_id.pos_order_line_id
|
|
# If new stage is the first one & line is not done, it means the order has been reset
|
|
if pdis_state.stage_id.is_stage_position(0):
|
|
if pos_order_line.preparation_time != -1:
|
|
pos_order_line.preparation_time = -1
|
|
if pos_order_line.service_time != -1:
|
|
pos_order_line.service_time = -1
|
|
# If new stage is the second last one & line is done, write the preparation_time
|
|
if pos_order_line.preparation_time == -1 and pdis_state.stage_id.is_stage_position(-2):
|
|
pos_order_line.preparation_time = compute_seconds_since(old_last_stage_change)
|
|
# If new stage is the last one & line is done, write the service_time
|
|
if pos_order_line.service_time == -1 and pdis_state.stage_id.is_stage_position(-1):
|
|
pos_order_line.service_time = compute_seconds_since(old_last_stage_change)
|
|
|
|
# If the order is done, write the completion_time
|
|
# Also, if all the quantities are cancelled (don't have pos_order_line_id in that case), no need to update the completion_time
|
|
if pdis_state.stage_id.is_stage_position(-1) and pdis_state.prep_line_id.prep_order_id.id not in prep_order_completion_time and pdis_state.prep_line_id.prep_order_id.prep_line_ids.pos_order_line_id:
|
|
order_completion_seconds = max(
|
|
pdis_state.prep_line_id.prep_order_id.prep_line_ids.pos_order_line_id.mapped(
|
|
lambda line: line.service_time + line.preparation_time
|
|
)
|
|
)
|
|
order_completion_minutes = int(order_completion_seconds / 60)
|
|
pdis_state.prep_line_id.prep_order_id.completion_time = order_completion_minutes
|
|
prep_order_completion_time[pdis_state.prep_line_id.prep_order_id.id] = order_completion_minutes
|