[IMP] resource: add time_type field on resource.calendar.leaves
We would like to have an overview of project forecast that include
leaves, for this we need to implement several kind of 'leaves' directly
in resource module.
These kind of 'leaves' can be defined via the hr.leave.type model (only
visible in base.group_no_one (choices currently are 'leave' and 'other')
* Add field time_type on resource.calendar.leaves
* Add a domain restriction that allows for filtering on this field
* Add tests
This commit is contained in:
@@ -283,7 +283,8 @@ class HolidaysRequest(models.Model):
|
||||
'holiday_id': leave.id,
|
||||
'date_to': leave.date_to,
|
||||
'resource_id': leave.employee_id.resource_id.id,
|
||||
'calendar_id': leave.employee_id.resource_calendar_id.id
|
||||
'calendar_id': leave.employee_id.resource_calendar_id.id,
|
||||
'time_type': leave.holiday_status_id.time_type,
|
||||
})
|
||||
return True
|
||||
|
||||
|
||||
@@ -77,6 +77,9 @@ class HolidaysType(models.Model):
|
||||
|
||||
valid = fields.Boolean(compute='_compute_valid', search='_search_valid', help='This indicates if it is still possible to use this type of leave')
|
||||
|
||||
time_type = fields.Selection([('leave', 'Leave'), ('other', 'Other')], default='leave', string="Kind of Leave",
|
||||
help="Whether this should be computed as a holiday or as work time (eg: formation)")
|
||||
|
||||
@api.multi
|
||||
@api.constrains('validity_start', 'validity_stop')
|
||||
def _check_validity_dates(self):
|
||||
|
||||
@@ -2,3 +2,4 @@
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from . import test_holidays_flow
|
||||
from . import test_hr_leave_type
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
from datetime import datetime
|
||||
from dateutil.relativedelta import relativedelta
|
||||
|
||||
from odoo.addons.hr_holidays.tests.common import TestHrHolidaysBase
|
||||
|
||||
|
||||
class TestHrLeaveType(TestHrHolidaysBase):
|
||||
def setUp(self):
|
||||
super(TestHrLeaveType, self).setUp()
|
||||
|
||||
LeaveType = self.env['hr.leave.type']
|
||||
|
||||
self.leave_leave = LeaveType.create({
|
||||
'name': 'Legal Leaves',
|
||||
'limit': True,
|
||||
'time_type': 'leave',
|
||||
})
|
||||
|
||||
def test_time_type(self):
|
||||
Leave = self.env['hr.leave']
|
||||
RLeave = self.env['resource.calendar.leaves']
|
||||
|
||||
leave_1 = Leave.create({
|
||||
'name': 'Doctor Appointment',
|
||||
'employee_id': self.employee_hruser_id,
|
||||
'holiday_status_id': self.leave_leave.id,
|
||||
'date_from': (datetime.today() - relativedelta(days=1)),
|
||||
'date_to': datetime.today(),
|
||||
'number_of_days_temp': 1,
|
||||
})
|
||||
|
||||
leave_1.action_approve()
|
||||
|
||||
self.assertEqual(RLeave.search([('holiday_id', '=', leave_1.id)]).time_type, 'leave')
|
||||
|
||||
leave_1.action_refuse()
|
||||
leave_1.action_draft()
|
||||
|
||||
leave_1.unlink()
|
||||
@@ -30,6 +30,7 @@
|
||||
<field name="name"/>
|
||||
</group>
|
||||
<group name="leave_request" string="Leave Request">
|
||||
<field name="time_type" groups="base.group_no_one"/>
|
||||
<field name="limit"/>
|
||||
<field name="sequence" attrs="{'invisible': [('limit', '=', 'False')]}" groups="base.group_no_one"/>
|
||||
</group>
|
||||
|
||||
@@ -314,6 +314,8 @@ class ResourceCalendar(models.Model):
|
||||
search_domain += [('date_from', '<', fields.Datetime.to_string(end_datetime + timedelta(days=1)))]
|
||||
if domain:
|
||||
search_domain += domain
|
||||
if domain is None:
|
||||
search_domain += [('time_type', '=', 'leave')]
|
||||
leaves = self.env['resource.calendar.leaves'].search(search_domain + [('calendar_id', '=', self.id)])
|
||||
|
||||
filtered_leaves = self.env['resource.calendar.leaves']
|
||||
@@ -591,9 +593,9 @@ class ResourceCalendar(models.Model):
|
||||
return intervals
|
||||
|
||||
@api.multi
|
||||
def plan_hours(self, hours, day_dt, compute_leaves=False, resource_id=None):
|
||||
def plan_hours(self, hours, day_dt, compute_leaves=False, resource_id=None, domain=None):
|
||||
""" Return datetime after having planned hours """
|
||||
res = self._schedule_hours(hours, day_dt, compute_leaves, resource_id)
|
||||
res = self._schedule_hours(hours, day_dt, compute_leaves, resource_id, domain)
|
||||
if res and hours < 0.0:
|
||||
return res[0][0]
|
||||
elif res:
|
||||
@@ -641,9 +643,9 @@ class ResourceCalendar(models.Model):
|
||||
return intervals
|
||||
|
||||
@api.multi
|
||||
def plan_days(self, days, day_dt, compute_leaves=False, resource_id=None):
|
||||
def plan_days(self, days, day_dt, compute_leaves=False, resource_id=None, domain=None):
|
||||
""" Returns the datetime of a days scheduling. """
|
||||
res = self._schedule_days(days, day_dt, compute_leaves, resource_id)
|
||||
res = self._schedule_days(days, day_dt, compute_leaves, resource_id, domain)
|
||||
return res and res[-1][1] or False
|
||||
|
||||
|
||||
@@ -762,6 +764,8 @@ class ResourceCalendarLeaves(models.Model):
|
||||
resource_id = fields.Many2one(
|
||||
"resource.resource", 'Resource',
|
||||
help="If empty, this is a generic holiday for the company. If a resource is set, the holiday/leave is only for this resource")
|
||||
time_type = fields.Selection([('leave', 'Leave'), ('other', 'Other')], default='leave',
|
||||
help="Whether this should be computed as a holiday or as work time (eg: formation)")
|
||||
|
||||
@api.constrains('date_from', 'date_to')
|
||||
def check_dates(self):
|
||||
|
||||
@@ -810,3 +810,40 @@ class TestGlobalLeaves(TestResourceCommon):
|
||||
|
||||
work_spec = [to_tuple(x) for x in self.calendar._get_day_leave_intervals(Date.from_string('2018-04-06'), time(0), time(23, 59, 59), self.resource1_id)]
|
||||
self.assertEqual(work_spec[0], (Datetime.from_string('2018-04-06 16:00:00'), Datetime.from_string('2018-04-06 21:00:00')))
|
||||
|
||||
|
||||
class TestTimeType(TestResourceCommon):
|
||||
def setUp(self):
|
||||
super(TestTimeType, self).setUp()
|
||||
Leave = self.env['resource.calendar.leaves']
|
||||
|
||||
self.other1 = Leave.create({
|
||||
'name': 'Formation',
|
||||
'calendar_id': self.calendar.id,
|
||||
'resource_id': self.resource1_id,
|
||||
'date_from': Datetime.from_string('2013-02-15 09:00:00'),
|
||||
'date_to': Datetime.from_string('2013-02-15 19:00:00'),
|
||||
'time_type': 'other',
|
||||
})
|
||||
self.other2 = Leave.create({
|
||||
'name': 'Homeworking',
|
||||
'calendar_id': self.calendar.id,
|
||||
'resource_id': self.resource1_id,
|
||||
'date_from': Datetime.from_string('2013-02-12 09:00:00'),
|
||||
'date_to': Datetime.from_string('2013-02-12 15:00:00'),
|
||||
'time_type': 'other',
|
||||
})
|
||||
|
||||
def test_leaves_leaves(self):
|
||||
# Here we test if setting the value to leave has the effect intended
|
||||
leave = self.calendar._get_day_leave_intervals(Date.from_string('2013-02-26'), time(0), time(23, 59, 59), self.resource1_id, [('time_type', '=', 'leave')])
|
||||
self.assertEqual(len(leave), 1, "When asking for leave should compute the leaves")
|
||||
leave = self.calendar._get_day_leave_intervals(Date.from_string('2013-02-15'), time(0), time(23, 59, 59), self.resource1_id, [('time_type', '=', 'leave')])
|
||||
self.assertEqual(len(leave), 0, "When asking for leave should ignore others")
|
||||
|
||||
def test_leaves_other(self):
|
||||
# Here we test if setting the value to other has the effect intended
|
||||
leave = self.calendar._get_day_leave_intervals(Date.from_string('2013-02-26'), time(0), time(23, 59, 59), self.resource1_id, [('time_type', '=', 'other')])
|
||||
self.assertEqual(len(leave), 0, "When asking for other should ignore leaves")
|
||||
leave = self.calendar._get_day_leave_intervals(Date.from_string('2013-02-15'), time(0), time(23, 59, 59), self.resource1_id, [('time_type', '=', 'other')])
|
||||
self.assertEqual(len(leave), 2, "When asking for other should compute others")
|
||||
|
||||
Reference in New Issue
Block a user