You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

119 lines
4.0 KiB

from odoo import fields, models
class Task(models.Model):
_inherit = "beesdoo.shift.shift"
@api.constrains("worker_id")
def _check_worker_id(self):
"""
When worker_id changes we need to check whether is_regular
and is_compensation are set correctly.
When worker_id is set to a worker that doesn't need field
is_regular and is_compensation, these two fields are set to
False.
"""
for task in self:
if task.working_mode == "regular":
self._compensation_validation(task)
else:
task.write({"is_regular": False, "is_compensation": False})
if task.worker_id:
if task.worker_id == task.replaced_id:
raise UserError(_("A worker cannot replace himself."))
def _compensation_validation(self, task):
"""
Raise a validation error if the fields is_regular and
is_compensation are not properly set.
"""
if task.is_regular == task.is_compensation or not (
task.is_regular or task.is_compensation
):
raise ValidationError(
_(
"You must choose between Regular Shift or "
"Compensation Shift."
)
)
@api.constrains("is_regular", "is_compensation")
def _check_compensation(self):
for task in self:
if task.working_mode == "regular":
self._compensation_validation(task)
#################################
# State Definition #
#################################
def _get_selection_status(self):
return [
("open", "Confirmed"),
("done", "Attended"),
("absent_2", "Absent - 2 compensations"),
("absent_1", "Absent - 1 compensation"),
("absent_0", "Absent - 0 compensation"),
("cancel", "Cancelled"),
]
def _get_color_mapping(self, state):
return {
"draft": 0,
"open": 1,
"done": 5,
"absent_2": 2,
"absent_1": 7,
"absent_0": 3,
"cancel": 9,
}[state]
def _get_final_state(self):
return ["done", "absent_2", "absent_1", "absent_0"]
state = fields.Selection(selection=_get_selection_status)
##############################################
# Change counter when state change #
##############################################
def _get_counter_date_state_change(self, new_state):
data = {}
if self.worker_id.working_mode == "regular":
if not self.replaced_id: # No replacement case
status = self.worker_id.cooperative_status_ids[0]
else:
status = self.replaced_id.cooperative_status_ids[0]
if new_state == "done" and not self.is_regular:
# Regular counter is always updated first
if status.sr < 0:
data["sr"] = 1
elif status.sc < 0:
data["sc"] = 1
# Bonus shift case
else:
data["sr"] = 1
if new_state == "absent_2":
data["sr"] = -1
data["sc"] = -1
if new_state == "absent_1":
data["sr"] = -1
elif self.worker_id.working_mode == "irregular":
status = self.worker_id.cooperative_status_ids[0]
if new_state == "done" or new_state == "absent_0":
data["sr"] = 1
data["irregular_absence_date"] = False
data["irregular_absence_counter"] = (
1 if status.irregular_absence_counter < 0 else 0
)
if new_state == "absent_2" or new_state == "absent_1":
if new_state == "absent_2":
data["sr"] = -1
data["irregular_absence_date"] = self.start_time.date()
data["irregular_absence_counter"] = -1
return data, status