forked from Mapan/odoo17e
111 lines
6.4 KiB
Python
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)
|