314 lines
14 KiB
Python
314 lines
14 KiB
Python
# -*- coding: utf-8 -*-
|
|
from datetime import date, datetime
|
|
|
|
from odoo.tests import Form
|
|
|
|
from odoo.addons.hr_holidays.tests.common import TestHrHolidaysCommon
|
|
from odoo.exceptions import ValidationError
|
|
|
|
|
|
class TestAutomaticLeaveDates(TestHrHolidaysCommon):
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super(TestAutomaticLeaveDates, cls).setUpClass()
|
|
cls.leave_type = cls.env['hr.leave.type'].create({
|
|
'name': 'Automatic Test',
|
|
'time_type': 'leave',
|
|
'requires_allocation': 'no',
|
|
# Required for `request_unit_half` to be visible in the view
|
|
'request_unit': 'half_day',
|
|
})
|
|
|
|
def test_no_attendances(self):
|
|
calendar = self.env['resource.calendar'].create({
|
|
'name': 'No Attendances',
|
|
'attendance_ids': [(5, 0, 0)],
|
|
})
|
|
employee = self.employee_emp
|
|
employee.resource_calendar_id = calendar
|
|
|
|
with Form(self.env['hr.leave'].with_context(default_employee_id=employee.id)) as leave_form:
|
|
leave_form.holiday_status_id = self.leave_type
|
|
leave_form.request_date_from = date(2019, 9, 2)
|
|
leave_form.request_date_to = date(2019, 9, 2)
|
|
leave_form.request_unit_half = True
|
|
leave_form.request_date_from_period = 'am'
|
|
|
|
self.assertEqual(leave_form.number_of_days, 0)
|
|
self.assertEqual(leave_form.number_of_hours, 0)
|
|
|
|
def test_single_attendance_on_morning_and_afternoon(self):
|
|
calendar = self.env['resource.calendar'].create({
|
|
'name': 'simple morning + afternoon',
|
|
'attendance_ids': [(5, 0, 0),
|
|
(0, 0, {
|
|
'name': 'monday morning',
|
|
'hour_from': 8,
|
|
'hour_to': 12,
|
|
'day_period': 'morning',
|
|
'dayofweek': '0',
|
|
}),
|
|
(0, 0, {
|
|
'name': 'monday lunch',
|
|
'hour_from': 12,
|
|
'hour_to': 13,
|
|
'day_period': 'lunch',
|
|
'dayofweek': '0',
|
|
}),
|
|
(0, 0, {
|
|
'name': 'monday afternoon',
|
|
'hour_from': 13,
|
|
'hour_to': 17,
|
|
'day_period': 'afternoon',
|
|
'dayofweek': '0',
|
|
})]
|
|
})
|
|
|
|
employee = self.employee_emp
|
|
employee.resource_calendar_id = calendar
|
|
|
|
with Form(self.env['hr.leave'].with_context(default_employee_id=employee.id)) as leave_form:
|
|
leave_form.holiday_status_id = self.leave_type
|
|
leave_form.request_date_from = date(2019, 9, 2)
|
|
leave_form.request_date_to = date(2019, 9, 2)
|
|
leave_form.request_unit_half = True
|
|
leave_form.request_date_from_period = 'am'
|
|
|
|
self.assertEqual(leave_form.number_of_days, .5)
|
|
self.assertEqual(leave_form.number_of_hours, 4)
|
|
|
|
leave_form.request_date_from_period = 'pm'
|
|
|
|
self.assertEqual(leave_form.number_of_days, .5)
|
|
self.assertEqual(leave_form.number_of_hours, 4)
|
|
|
|
def test_multiple_attendance_on_morning(self):
|
|
calendar = self.env['resource.calendar'].create({
|
|
'name': 'multi morning',
|
|
'attendance_ids': [(5, 0, 0),
|
|
(0, 0, {
|
|
'name': 'monday morning 1',
|
|
'hour_from': 8,
|
|
'hour_to': 10,
|
|
'day_period': 'morning',
|
|
'dayofweek': '0',
|
|
'duration_days': 0.25,
|
|
}),
|
|
(0, 0, {
|
|
'name': 'monday morning 2',
|
|
'hour_from': 10.25,
|
|
'hour_to': 12.25,
|
|
'day_period': 'morning',
|
|
'dayofweek': '0',
|
|
'duration_days': 0.25,
|
|
}),
|
|
(0, 0, {
|
|
'name': 'monday lunch',
|
|
'hour_from': 12.25,
|
|
'hour_to': 13,
|
|
'day_period': 'lunch',
|
|
'dayofweek': '0',
|
|
}),
|
|
(0, 0, {
|
|
'name': 'monday afternoon',
|
|
'hour_from': 13,
|
|
'hour_to': 17,
|
|
'day_period': 'afternoon',
|
|
'dayofweek': '0',
|
|
'duration_days': 0.5,
|
|
})]
|
|
})
|
|
employee = self.employee_emp
|
|
employee.resource_calendar_id = calendar
|
|
|
|
with Form(self.env['hr.leave'].with_context(default_employee_id=employee.id)) as leave_form:
|
|
leave_form.holiday_status_id = self.leave_type
|
|
leave_form.request_date_from = date(2019, 9, 2)
|
|
leave_form.request_date_to = date(2019, 9, 2)
|
|
leave_form.request_unit_half = True
|
|
leave_form.request_date_from_period = 'am'
|
|
|
|
self.assertEqual(leave_form.number_of_days, .5)
|
|
self.assertEqual(leave_form.number_of_hours, 4)
|
|
|
|
leave_form.request_date_from_period = 'pm'
|
|
|
|
self.assertEqual(leave_form.number_of_days, .5)
|
|
self.assertEqual(leave_form.number_of_hours, 4)
|
|
|
|
def test_attendance_on_morning(self):
|
|
calendar = self.env['resource.calendar'].create({
|
|
'name': 'Morning only',
|
|
'attendance_ids': [(5, 0, 0),
|
|
(0, 0, {
|
|
'name': 'Monday All day',
|
|
'hour_from': 8,
|
|
'hour_to': 16,
|
|
'day_period': 'morning',
|
|
'dayofweek': '0',
|
|
})],
|
|
})
|
|
employee = self.employee_emp
|
|
employee.resource_calendar_id = calendar
|
|
with Form(self.env['hr.leave'].with_context(default_employee_id=employee.id)) as leave_form:
|
|
leave_form.holiday_status_id = self.leave_type
|
|
leave_form.request_date_from = date(2019, 9, 2)
|
|
leave_form.request_date_to = date(2019, 9, 2)
|
|
leave_form.request_unit_half = True
|
|
# Ask for morning
|
|
leave_form.request_date_from_period = 'am'
|
|
|
|
self.assertEqual(leave_form.number_of_days, 1)
|
|
self.assertEqual(leave_form.number_of_hours, 8)
|
|
|
|
# Ask for afternoon
|
|
leave_form.request_date_from_period = 'pm'
|
|
|
|
self.assertEqual(leave_form.number_of_days, 0)
|
|
self.assertEqual(leave_form.number_of_hours, 0)
|
|
|
|
def test_attendance_next_day(self):
|
|
self.env.user.tz = 'Europe/Brussels'
|
|
calendar = self.env['resource.calendar'].create({
|
|
'name': 'auto next day',
|
|
'attendance_ids': [(5, 0, 0),
|
|
(0, 0, {
|
|
'name': 'tuesday morning',
|
|
'hour_from': 8,
|
|
'hour_to': 12,
|
|
'day_period': 'morning',
|
|
'dayofweek': '1',
|
|
})]
|
|
})
|
|
employee = self.employee_emp
|
|
employee.resource_calendar_id = calendar
|
|
|
|
with Form(self.env['hr.leave'].with_context(default_employee_id=employee.id)) as leave_form:
|
|
leave_form.holiday_status_id = self.leave_type
|
|
# does not work on mondays
|
|
leave_form.request_date_from = date(2019, 9, 2)
|
|
leave_form.request_date_to = date(2019, 9, 2)
|
|
leave_form.request_unit_half = True
|
|
leave_form.request_date_from_period = 'am'
|
|
|
|
|
|
self.assertEqual(leave_form.number_of_days, 0)
|
|
self.assertEqual(leave_form.number_of_hours, 0)
|
|
self.assertEqual(leave_form.date_from, datetime(2019, 9, 2, 6, 0, 0))
|
|
self.assertEqual(leave_form.date_to, datetime(2019, 9, 2, 10, 0, 0))
|
|
|
|
def test_attendance_previous_day(self):
|
|
self.env.user.tz = 'Europe/Brussels'
|
|
calendar = self.env['resource.calendar'].create({
|
|
'name': 'auto next day',
|
|
'attendance_ids': [(5, 0, 0),
|
|
(0, 0, {
|
|
'name': 'monday morning',
|
|
'hour_from': 8,
|
|
'hour_to': 12,
|
|
'day_period': 'morning',
|
|
'dayofweek': '0',
|
|
})]
|
|
})
|
|
employee = self.employee_emp
|
|
employee.resource_calendar_id = calendar
|
|
|
|
with Form(self.env['hr.leave'].with_context(default_employee_id=employee.id)) as leave_form:
|
|
leave_form.holiday_status_id = self.leave_type
|
|
# does not work on tuesdays
|
|
leave_form.request_date_from = date(2019, 9, 3)
|
|
leave_form.request_date_to = date(2019, 9, 3)
|
|
leave_form.request_unit_half = True
|
|
leave_form.request_date_from_period = 'am'
|
|
|
|
|
|
self.assertEqual(leave_form.number_of_days, 0)
|
|
self.assertEqual(leave_form.number_of_hours, 0)
|
|
self.assertEqual(leave_form.date_from, datetime(2019, 9, 3, 6, 0, 0))
|
|
self.assertEqual(leave_form.date_to, datetime(2019, 9, 3, 10, 0, 0))
|
|
|
|
def test_2weeks_calendar(self):
|
|
self.env.user.tz = 'Europe/Brussels'
|
|
calendar = self.env['resource.calendar'].create({
|
|
'name': 'auto next day',
|
|
'two_weeks_calendar': True,
|
|
'attendance_ids': [(5, 0, 0),
|
|
(0, 0, {
|
|
'name': 'monday morning odd week',
|
|
'hour_from': 8,
|
|
'hour_to': 12,
|
|
'day_period': 'morning',
|
|
'dayofweek': '0',
|
|
'week_type': '0',
|
|
'duration_days': 0.5,
|
|
}),
|
|
(0, 0, {
|
|
'name': 'monday morning even week',
|
|
'hour_from': 10,
|
|
'hour_to': 12,
|
|
'day_period': 'morning',
|
|
'dayofweek': '0',
|
|
'week_type': '1',
|
|
'duration_days': 0.25
|
|
})]
|
|
})
|
|
employee = self.employee_emp
|
|
employee.resource_calendar_id = calendar
|
|
|
|
with Form(self.env['hr.leave'].with_context(default_employee_id=employee.id)) as leave_form:
|
|
leave_form.holiday_status_id = self.leave_type
|
|
# even week, works 2 hours
|
|
leave_form.request_date_from = date(2019, 9, 2)
|
|
leave_form.request_date_to = date(2019, 9, 2)
|
|
leave_form.request_unit_half = True
|
|
leave_form.request_date_from_period = 'am'
|
|
|
|
self.assertEqual(leave_form.number_of_days, 0.25)
|
|
self.assertEqual(leave_form.number_of_hours, 2)
|
|
self.assertEqual(leave_form.date_from, datetime(2019, 9, 2, 8, 0, 0))
|
|
self.assertEqual(leave_form.date_to, datetime(2019, 9, 2, 10, 0, 0))
|
|
|
|
with Form(self.env['hr.leave'].with_context(default_employee_id=employee.id)) as leave_form:
|
|
leave_form.holiday_status_id = self.leave_type
|
|
# odd week, works 4 hours
|
|
leave_form.request_date_from = date(2019, 9, 9)
|
|
leave_form.request_date_to = date(2019, 9, 9)
|
|
leave_form.request_unit_half = True
|
|
leave_form.request_date_from_period = 'am'
|
|
|
|
self.assertEqual(leave_form.number_of_days, 0.5)
|
|
self.assertEqual(leave_form.number_of_hours, 4)
|
|
self.assertEqual(leave_form.date_from, datetime(2019, 9, 9, 6, 0, 0))
|
|
self.assertEqual(leave_form.date_to, datetime(2019, 9, 9, 10, 0, 0))
|
|
|
|
def test_2weeks_calendar_next_week(self):
|
|
self.env.user.tz = 'Europe/Brussels'
|
|
calendar = self.env['resource.calendar'].create({
|
|
'name': 'auto next day',
|
|
'two_weeks_calendar': True,
|
|
'attendance_ids': [(5, 0, 0),
|
|
(0, 0, {
|
|
'name': 'monday morning odd week',
|
|
'hour_from': 8,
|
|
'hour_to': 12,
|
|
'day_period': 'morning',
|
|
'dayofweek': '0',
|
|
'week_type': '0',
|
|
})]
|
|
})
|
|
employee = self.employee_emp
|
|
employee.resource_calendar_id = calendar
|
|
|
|
with Form(self.env['hr.leave'].with_context(default_employee_id=employee.id)) as leave_form:
|
|
leave_form.holiday_status_id = self.leave_type
|
|
# even week, does not work
|
|
leave_form.request_date_from = date(2019, 9, 2)
|
|
leave_form.request_date_to = date(2019, 9, 2)
|
|
leave_form.request_unit_half = True
|
|
leave_form.request_date_from_period = 'am'
|
|
|
|
self.assertEqual(leave_form.number_of_days, 0)
|
|
self.assertEqual(leave_form.number_of_hours, 0)
|
|
self.assertEqual(leave_form.date_from, datetime(2019, 9, 2, 6, 0, 0))
|
|
self.assertEqual(leave_form.date_to, datetime(2019, 9, 2, 10, 0, 0))
|