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

148 lines
6.3 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details
from datetime import date, datetime
import pytz
from odoo import fields
from .common import TestCommonForecast
class TestUnavailabilityForForecasts(TestCommonForecast):
@classmethod
def setUpClass(cls):
super(TestUnavailabilityForForecasts, cls).setUpClass()
cls.setUpEmployees()
cls.setUpProjects()
cls.employee_bert.resource_calendar_id.tz = 'UTC'
# extra employee to test gantt_unavailability grouped by resource_id
cls.employee_lionel = cls.env['hr.employee'].create({
'name': 'lionel',
'work_email': 'lionel@a.be',
'tz': 'UTC'
})
cls.resource_lionel = cls.employee_lionel.resource_id
# employee leaves
leave_values = {
'name': 'leave 1',
'date_from': fields.Datetime.to_string(date(2019, 5, 5)),
'date_to': fields.Datetime.to_string(date(2019, 5, 18)),
'resource_id': cls.employee_bert.resource_id.id,
'calendar_id': cls.employee_bert.resource_calendar_id.id,
}
cls.bert_leave = cls.env['resource.calendar.leaves'].create(leave_values)
def test_gantt_unavailability_correctly_update_gantt_object_single_group_by(self):
# create a few forecasts in the opera project
values = {
'project_id': self.project_opera.id,
'allocated_hours': 8,
'start_datetime': datetime(2019, 8, 6, 0, 0),
'end_datetime': datetime(2019, 8, 8, 0, 0),
}
generated = {}
for resource in [self.resource_bert, self.resource_lionel, self.resource_joseph]:
generated[resource.id] = self.env['planning.slot'].create({'resource_id': resource.id, **values})
rows = [{
'groupedBy': ["resource_id"],
'records': [generated[self.resource_bert.id].read()[0]],
'name': "Bert",
'resId': self.resource_bert.id,
'rows': []
}, {
'groupedBy': ["resource_id"],
'records': [generated[self.resource_joseph.id].read()[0]],
'name': "Bert",
'resId': self.resource_joseph.id,
'rows': []
}, {
'groupedBy': ["resource_id"],
'records': [generated[self.resource_lionel.id].read()[0]],
'name': "Bert",
'resId': self.resource_lionel.id,
'rows': []
}]
gantt_processed_rows = self.env['planning.slot'].gantt_unavailability(
datetime(2019, 1, 1),
datetime(2019, 1, 7),
'month',
'user_id, stage_id',
rows
)
expected_unavailabilities = [
{'start': datetime(2019, 1, 1, 17, 0, tzinfo=pytz.utc), 'stop': datetime(2019, 1, 2, 8, 0, tzinfo=pytz.utc)},
{'start': datetime(2019, 1, 2, 17, 0, tzinfo=pytz.utc), 'stop': datetime(2019, 1, 3, 8, 0, tzinfo=pytz.utc)},
{'start': datetime(2019, 1, 3, 17, 0, tzinfo=pytz.utc), 'stop': datetime(2019, 1, 4, 8, 0, tzinfo=pytz.utc)},
{'start': datetime(2019, 1, 4, 17, 0, tzinfo=pytz.utc), 'stop': datetime(2019, 1, 7, 0, 0, tzinfo=pytz.utc)},
]
bert_unavailabilities = gantt_processed_rows[0]['unavailabilities']
lionel_unavailabilities = gantt_processed_rows[1]['unavailabilities']
self.assertEqual(bert_unavailabilities, expected_unavailabilities, 'the gantt object was tranformed for bert')
self.assertEqual(lionel_unavailabilities, expected_unavailabilities, 'the gantt object was tranformed for lionel')
def test_gantt_unavailability_correctly_update_gantt_object_multiple_group_by(self):
# create a few forecasts in the opera project
values = {
'project_id': self.project_opera.id,
'allocated_hours': 8,
'start_datetime': datetime(2019, 8, 6, 0, 0),
'end_datetime': datetime(2019, 8, 8, 0, 0),
}
generated = {}
for resource in [self.resource_bert, self.resource_lionel, self.resource_joseph]:
generated[resource.id] = self.env['planning.slot'].create({'resource_id': resource.id, **values})
rows = [{
'groupedBy': ["project_id", "resource_id"],
'records': list(map(lambda x: x.read()[0], generated.values())),
'name': "Opera project",
'resId': 9,
'rows': [{
'groupedBy': ["resource_id"],
'records': [generated[self.resource_bert.id].read()[0]],
'name': "Bert",
'resId': self.resource_bert.id,
'rows': []
}, {
'groupedBy': ["resource_id"],
'records': [generated[self.resource_joseph.id].read()[0]],
'name': "Bert",
'resId': self.resource_joseph.id,
'rows': []
}, {
'groupedBy': ["resource_id"],
'records': [generated[self.resource_lionel.id].read()[0]],
'name': "Bert",
'resId': self.resource_lionel.id,
'rows': []
}]
}]
gantt_processed_rows = self.env['planning.slot'].gantt_unavailability(
datetime(2019, 1, 1),
datetime(2019, 1, 7),
'month',
'user_id, stage_id',
rows
)
expected_unavailabilities = [
{'start': datetime(2019, 1, 1, 17, 0, tzinfo=pytz.utc), 'stop': datetime(2019, 1, 2, 8, 0, tzinfo=pytz.utc)},
{'start': datetime(2019, 1, 2, 17, 0, tzinfo=pytz.utc), 'stop': datetime(2019, 1, 3, 8, 0, tzinfo=pytz.utc)},
{'start': datetime(2019, 1, 3, 17, 0, tzinfo=pytz.utc), 'stop': datetime(2019, 1, 4, 8, 0, tzinfo=pytz.utc)},
{'start': datetime(2019, 1, 4, 17, 0, tzinfo=pytz.utc), 'stop': datetime(2019, 1, 7, 0, 0, tzinfo=pytz.utc)},
]
bert_unavailabilities = gantt_processed_rows[0]['rows'][0]['unavailabilities']
lionel_unavailabilities = gantt_processed_rows[0]['rows'][1]['unavailabilities']
self.assertEqual(bert_unavailabilities, expected_unavailabilities, 'the gantt object was tranformed for bert')
self.assertEqual(lionel_unavailabilities, expected_unavailabilities, 'the gantt object was tranformed for lionel')