forked from Mapan/odoo17e
148 lines
6.3 KiB
Python
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')
|