1
0
forked from Mapan/odoo17e
odoo17e-kedaikipas58/addons/project_enterprise_hr/tests/test_gantt_reschedule_dates.py
2024-12-10 09:04:09 +07:00

111 lines
6.4 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from datetime import timedelta
from dateutil.relativedelta import relativedelta
from freezegun import freeze_time
from odoo.addons.project_enterprise.tests.gantt_reschedule_dates_common import fake_now
from .auto_shift_dates_hr_common import AutoShiftDatesHRCommon
from odoo.fields import Command
@freeze_time(fake_now)
class TestGanttRescheduleOnTasks(AutoShiftDatesHRCommon):
def test_auto_shift_employee_integration(self):
# We have to bypass the calendar validity computation for employees/students,
# Otherwise, we will fallback on company calendar if there are no contracts
# once the test is launched in project_enterprise_hr_contract by extension
self.armande_employee.employee_type = 'freelance'
self.task_4.depend_on_ids = [Command.clear()]
new_task_3_begin_date = self.task_1_date_deadline - timedelta(hours=2) # 2021 06 24 10:00
self.task_3.write({
'planned_date_begin': new_task_3_begin_date,
'date_deadline': new_task_3_begin_date + (self.task_3_date_deadline - self.task_3_planned_date_begin),
})
self.gantt_reschedule_backward(self.task_1, self.task_3)
failed_message = "The auto shift date feature should take the employee's calendar into account."
self.assertEqual(self.task_1.planned_date_begin,
new_task_3_begin_date - relativedelta(days=1, hour=14), failed_message)
self.armande_employee.write({
'resource_calendar_id': self.calendar_morning.id,
})
new_task_3_begin_date = self.task_1.planned_date_begin + relativedelta(hour=10) # 2021 06 23 10:00
self.task_3.write({
'planned_date_begin': new_task_3_begin_date,
'date_deadline': new_task_3_begin_date + (self.task_3_date_deadline - self.task_3_planned_date_begin),
})
self.gantt_reschedule_backward(self.task_1, self.task_3)
self.assertEqual(self.task_1.planned_date_begin,
new_task_3_begin_date + relativedelta(days=-1, hour=11), failed_message)
failed_message = "The auto shift date feature should take the employee's calendar into account even before employee create_date."
new_task_3_begin_date = self.armande_employee_create_date - relativedelta(days=4, hour=15)
self.task_3.write({
'planned_date_begin': new_task_3_begin_date,
'date_deadline': new_task_3_begin_date + (self.task_3_date_deadline - self.task_3_planned_date_begin),
})
self.gantt_reschedule_backward(self.task_1, self.task_3)
self.assertEqual(self.task_1.date_deadline,
new_task_3_begin_date - relativedelta(hour=12), failed_message)
new_task_1_begin_date = self.armande_departure_date + relativedelta(days=1, hour=11)
self.task_1.write({
'planned_date_begin': new_task_1_begin_date,
'date_deadline': new_task_1_begin_date + (self.task_1_date_deadline - self.task_1_planned_date_begin),
})
self.gantt_reschedule_forward(self.task_1, self.task_3)
self.assertEqual(self.task_3.planned_date_begin,
new_task_1_begin_date + relativedelta(days=1, hour=8), failed_message)
failed_message = "The auto shift date feature should work for tasks landing on the edge of employee create_date or on the edge of departure_date."
new_task_3_begin_date = self.armande_employee_create_date + relativedelta(hour=13)
self.task_3.write({
'planned_date_begin': new_task_3_begin_date,
'date_deadline': new_task_3_begin_date + (self.task_3_date_deadline - self.task_3_planned_date_begin),
})
self.gantt_reschedule_backward(self.task_1, self.task_3)
self.assertEqual(self.task_1.planned_date_begin,
new_task_3_begin_date + relativedelta(hour=9), failed_message)
new_task_1_begin_date = self.armande_departure_date - relativedelta(days=1, hour=16)
self.armande_employee.write({
'resource_calendar_id': self.calendar_afternoon.id,
})
self.task_1.write({
'planned_date_begin': new_task_1_begin_date,
'date_deadline': new_task_1_begin_date + (self.task_1_date_deadline - self.task_1_planned_date_begin),
})
self.gantt_reschedule_forward(self.task_1, self.task_3)
self.assertEqual(self.task_3.planned_date_begin,
new_task_1_begin_date + relativedelta(days=1, hour=13), failed_message)
failed_message = "The auto shift date feature should work for tasks landing on the edge of employee create_date or on the edge of departure_date, even when falling in the middle of the allocated_hours."
new_task_3_begin_date = self.armande_employee_create_date + relativedelta(hour=15)
self.armande_employee.write({
'resource_calendar_id': self.calendar_morning.id,
})
self.task_3.write({
'planned_date_begin': new_task_3_begin_date,
'date_deadline': new_task_3_begin_date + (self.task_3_date_deadline - self.task_3_planned_date_begin),
})
self.gantt_reschedule_backward(self.task_1, self.task_3)
self.assertEqual(self.task_1.planned_date_begin,
new_task_3_begin_date + relativedelta(hour=9), failed_message)
new_task_1_begin_date = self.armande_departure_date + relativedelta(hour=10)
self.task_1.write({
'planned_date_begin': new_task_1_begin_date,
'date_deadline': new_task_1_begin_date + (self.task_1_date_deadline - self.task_1_planned_date_begin),
})
self.gantt_reschedule_forward(self.task_1, self.task_3)
self.assertEqual(self.task_3.date_deadline,
new_task_1_begin_date + relativedelta(days=1, hour=10), failed_message)
def test_auto_shift_multiple_assignees(self):
"""
Tests that the auto shift fallbacks to the company calendar in the case that
there are multiple assignees to the task.
"""
self.task_1.user_ids += self.user_projectmanager
self.task_1.write(self.task_1_date_gantt_reschedule_trigger)
self.gantt_reschedule_backward(self.task_1, self.task_3)
failed_message = "The auto shift date feature should move forward a dependent tasks."
self.assertTrue(self.task_1.date_deadline <= self.task_3.planned_date_begin, failed_message)