Files
enterprise-addons/pos_enterprise/models/pos_prep_state.py
T

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