diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/hr_holidays/tests/test_company_leave.py | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/hr_holidays/tests/test_company_leave.py')
| -rw-r--r-- | addons/hr_holidays/tests/test_company_leave.py | 323 |
1 files changed, 323 insertions, 0 deletions
diff --git a/addons/hr_holidays/tests/test_company_leave.py b/addons/hr_holidays/tests/test_company_leave.py new file mode 100644 index 00000000..941a5595 --- /dev/null +++ b/addons/hr_holidays/tests/test_company_leave.py @@ -0,0 +1,323 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from datetime import date, datetime + +from odoo.tests import tagged +from odoo.tests.common import SavepointCase + + +@tagged('company_leave') +class TestCompanyLeave(SavepointCase): + """ Test leaves for a whole company, conflict resolutions """ + + @classmethod + def setUpClass(cls): + super(TestCompanyLeave, cls).setUpClass() + cls.company = cls.env['res.company'].create({'name': 'A company'}) + + cls.bank_holiday = cls.env['hr.leave.type'].create({ + 'name': 'Bank Holiday', + 'responsible_id': cls.env.user.id, + 'company_id': cls.company.id, + }) + + cls.paid_time_off = cls.env['hr.leave.type'].create({ + 'name': 'Paid Time Off', + 'request_unit': 'day', + 'leave_validation_type': 'both', + 'company_id': cls.company.id, + }) + + cls.employee = cls.env['hr.employee'].create({ + 'name': 'My Employee', + 'company_id': cls.company.id, + }) + + def test_leave_whole_company_01(self): + # TEST CASE 1: Leaves taken in days. Take a 3 days leave + # Add a company leave on the second day. + # Check that leave is split into 2. + + leave = self.env['hr.leave'].create({ + 'name': 'Hol11', + 'employee_id': self.employee.id, + 'holiday_status_id': self.paid_time_off.id, + 'request_date_from': date(2020, 1, 7), + 'date_from': date(2020, 1, 7), + 'request_date_to': date(2020, 1, 9), + 'date_to': date(2020, 1, 9), + 'number_of_days': 3, + }) + leave._compute_date_from_to() + + company_leave = self.env['hr.leave'].create({ + 'name': 'Bank Holiday', + 'holiday_type': 'company', + 'mode_company_id': self.company.id, + 'holiday_status_id': self.bank_holiday.id, + 'date_from': date(2020, 1, 8), + 'request_date_from': date(2020, 1, 8), + 'date_to': date(2020, 1, 8), + 'request_date_to': date(2020, 1, 8), + 'number_of_days': 1, + }) + company_leave._compute_date_from_to() + + company_leave.action_validate() + + all_leaves = self.env['hr.leave'].search([('employee_id', '=', self.employee.id)], order='id') + self.assertEqual(len(all_leaves), 4) + # Original Leave + self.assertEqual(leave.state, 'refuse') + # before leave + self.assertEqual(all_leaves[1].date_from, datetime(2020, 1, 7, 7, 0)) + self.assertEqual(all_leaves[1].date_to, datetime(2020, 1, 7, 16, 0)) + self.assertEqual(all_leaves[1].number_of_days, 1) + self.assertEqual(all_leaves[1].state, 'confirm') + # After leave + self.assertEqual(all_leaves[2].date_from, datetime(2020, 1, 9, 7, 0)) + self.assertEqual(all_leaves[2].date_to, datetime(2020, 1, 9, 16, 0)) + self.assertEqual(all_leaves[2].number_of_days, 1) + self.assertEqual(all_leaves[2].state, 'confirm') + # Company Leave + self.assertEqual(all_leaves[3].date_from, datetime(2020, 1, 8, 7, 0)) + self.assertEqual(all_leaves[3].date_to, datetime(2020, 1, 8, 16, 0)) + self.assertEqual(all_leaves[3].number_of_days, 1) + self.assertEqual(all_leaves[3].state, 'validate') + + + def test_leave_whole_company_02(self): + # TEST CASE 2: Leaves taken in half-days. Take a 3 days leave + # Add a company leave on the second day + # Check that leave is split into 2 + self.paid_time_off.request_unit = 'half_day' + + leave = self.env['hr.leave'].create({ + 'name': 'Hol11', + 'employee_id': self.employee.id, + 'holiday_status_id': self.paid_time_off.id, + 'request_date_from': date(2020, 1, 7), + 'date_from': date(2020, 1, 7), + 'request_date_to': date(2020, 1, 9), + 'date_to': date(2020, 1, 9), + 'number_of_days': 3, + }) + leave._compute_date_from_to() + + company_leave = self.env['hr.leave'].create({ + 'name': 'Bank Holiday', + 'holiday_type': 'company', + 'mode_company_id': self.company.id, + 'holiday_status_id': self.bank_holiday.id, + 'date_from': date(2020, 1, 8), + 'request_date_from': date(2020, 1, 8), + 'date_to': date(2020, 1, 8), + 'request_date_to': date(2020, 1, 8), + 'number_of_days': 1, + }) + company_leave._compute_date_from_to() + + company_leave.action_validate() + + all_leaves = self.env['hr.leave'].search([('employee_id', '=', self.employee.id)], order='id') + self.assertEqual(len(all_leaves), 4) + # Original Leave + self.assertEqual(leave.state, 'refuse') + # before leave + self.assertEqual(all_leaves[1].date_from, datetime(2020, 1, 7, 7, 0)) + self.assertEqual(all_leaves[1].date_to, datetime(2020, 1, 7, 16, 0)) + self.assertEqual(all_leaves[1].number_of_days, 1) + self.assertEqual(all_leaves[1].state, 'confirm') + # After leave + self.assertEqual(all_leaves[2].date_from, datetime(2020, 1, 9, 7, 0)) + self.assertEqual(all_leaves[2].date_to, datetime(2020, 1, 9, 16, 0)) + self.assertEqual(all_leaves[2].number_of_days, 1) + self.assertEqual(all_leaves[2].state, 'confirm') + # Company Leave + self.assertEqual(all_leaves[3].date_from, datetime(2020, 1, 8, 7, 0)) + self.assertEqual(all_leaves[3].date_to, datetime(2020, 1, 8, 16, 0)) + self.assertEqual(all_leaves[3].number_of_days, 1) + self.assertEqual(all_leaves[3].state, 'validate') + + def test_leave_whole_company_03(self): + # TEST CASE 3: Leaves taken in half-days. Take a 0.5 days leave + # Add a company leave on the same day + # Check that leave refused + self.paid_time_off.request_unit = 'half_day' + + leave = self.env['hr.leave'].create({ + 'name': 'Hol11', + 'employee_id': self.employee.id, + 'holiday_status_id': self.paid_time_off.id, + 'request_date_from': date(2020, 1, 7), + 'request_date_to': date(2020, 1, 7), + 'number_of_days': 0.5, + 'request_unit_half': True, + 'request_date_from_period': 'am', + + }) + leave._compute_date_from_to() + + company_leave = self.env['hr.leave'].create({ + 'name': 'Bank Holiday', + 'holiday_type': 'company', + 'mode_company_id': self.company.id, + 'holiday_status_id': self.bank_holiday.id, + 'date_from': date(2020, 1, 7), + 'request_date_from': date(2020, 1, 7), + 'date_to': date(2020, 1, 7), + 'request_date_to': date(2020, 1, 7), + 'number_of_days': 1, + }) + company_leave._compute_date_from_to() + + company_leave.action_validate() + + all_leaves = self.env['hr.leave'].search([('employee_id', '=', self.employee.id)], order='id') + self.assertEqual(len(all_leaves), 2) + # Original Leave + self.assertEqual(leave.state, 'refuse') + # Company Leave + self.assertEqual(all_leaves[1].date_from, datetime(2020, 1, 7, 7, 0)) + self.assertEqual(all_leaves[1].date_to, datetime(2020, 1, 7, 16, 0)) + self.assertEqual(all_leaves[1].number_of_days, 1) + self.assertEqual(all_leaves[1].state, 'validate') + + def test_leave_whole_company_04(self): + # TEST CASE 4: Leaves taken in days. Take a 1 days leave + # Add a company leave on the same day + # Check that leave is refused + self.paid_time_off.request_unit = 'day' + + leave = self.env['hr.leave'].create({ + 'name': 'Hol11', + 'employee_id': self.employee.id, + 'holiday_status_id': self.paid_time_off.id, + 'request_date_from': date(2020, 1, 9), + 'request_date_to': date(2020, 1, 9), + 'number_of_days': 1, + + }) + leave._compute_date_from_to() + + company_leave = self.env['hr.leave'].create({ + 'name': 'Bank Holiday', + 'holiday_type': 'company', + 'mode_company_id': self.company.id, + 'holiday_status_id': self.bank_holiday.id, + 'date_from': date(2020, 1, 9), + 'request_date_from': date(2020, 1, 9), + 'date_to': date(2020, 1, 9), + 'request_date_to': date(2020, 1, 9), + 'number_of_days': 1, + }) + company_leave._compute_date_from_to() + + company_leave.action_validate() + + all_leaves = self.env['hr.leave'].search([('employee_id', '=', self.employee.id)], order='id') + self.assertEqual(len(all_leaves), 2) + # Original Leave + self.assertEqual(leave.state, 'refuse') + # Company Leave + self.assertEqual(all_leaves[1].date_from, datetime(2020, 1, 9, 7, 0)) + self.assertEqual(all_leaves[1].date_to, datetime(2020, 1, 9, 16, 0)) + self.assertEqual(all_leaves[1].number_of_days, 1) + self.assertEqual(all_leaves[1].state, 'validate') + + def test_leave_whole_company_06(self): + # Test case 6: Leaves taken in days. But the employee + # only works on Monday, Wednesday and Friday + # Takes a time off for all the week (3 days), should be split + + self.employee.resource_calendar_id.write({'attendance_ids': [ + (5, 0, 0), + (0, 0, {'name': 'Monday Morning', 'dayofweek': '0', 'hour_from': 8, 'hour_to': 12, 'day_period': 'morning'}), + (0, 0, {'name': 'Monday Afternoon', 'dayofweek': '0', 'hour_from': 13, 'hour_to': 17, 'day_period': 'afternoon'}), + (0, 0, {'name': 'Wednesday Morning', 'dayofweek': '2', 'hour_from': 8, 'hour_to': 12, 'day_period': 'morning'}), + (0, 0, {'name': 'Wednesday Afternoon', 'dayofweek': '2', 'hour_from': 13, 'hour_to': 17, 'day_period': 'afternoon'}), + (0, 0, {'name': 'Friday Morning', 'dayofweek': '4', 'hour_from': 8, 'hour_to': 12, 'day_period': 'morning'}), + (0, 0, {'name': 'Friday Afternoon', 'dayofweek': '4', 'hour_from': 13, 'hour_to': 17, 'day_period': 'afternoon'}) + ]}) + + leave = self.env['hr.leave'].create({ + 'name': 'Hol11', + 'employee_id': self.employee.id, + 'holiday_status_id': self.paid_time_off.id, + 'request_date_from': date(2020, 1, 6), + 'request_date_to': date(2020, 1, 10), + 'number_of_days': 3, + }) + leave._compute_date_from_to() + + company_leave = self.env['hr.leave'].create({ + 'name': 'Bank Holiday', + 'holiday_type': 'company', + 'mode_company_id': self.company.id, + 'holiday_status_id': self.bank_holiday.id, + 'date_from': date(2020, 1, 10), + 'request_date_from': date(2020, 1, 10), + 'date_to': date(2020, 1, 10), + 'request_date_to': date(2020, 1, 10), + 'number_of_days': 1, + }) + company_leave._compute_date_from_to() + company_leave.action_validate() + + all_leaves = self.env['hr.leave'].search([('employee_id', '=', self.employee.id)], order='id') + self.assertEqual(len(all_leaves), 3) + # Original Leave + self.assertEqual(leave.state, 'refuse') + # before leave + self.assertEqual(all_leaves[1].date_from, datetime(2020, 1, 6, 7, 0)) + self.assertEqual(all_leaves[1].date_to, datetime(2020, 1, 9, 16, 0)) + self.assertEqual(all_leaves[1].number_of_days, 2) + self.assertEqual(all_leaves[1].state, 'confirm') + # Company Leave + self.assertEqual(all_leaves[2].date_from, datetime(2020, 1, 10, 7, 0)) + self.assertEqual(all_leaves[2].date_to, datetime(2020, 1, 10, 16, 0)) + self.assertEqual(all_leaves[2].number_of_days, 1) + self.assertEqual(all_leaves[2].state, 'validate') + + def test_leave_whole_company_07(self): + # Test Case 7: Try to create a bank holidays for a lot of + # employees, and check the performances + # 100 employees - 15 already on holidays that day + + employees = self.env['hr.employee'].create([{ + 'name': 'Employee %s' % i, + 'company_id': self.company.id + } for i in range(100)]) + + leaves = self.env['hr.leave'].create([{ + 'name': 'Holiday - %s' % employee.name, + 'employee_id': employee.id, + 'holiday_status_id': self.paid_time_off.id, + 'request_date_from': date(2020, 3, 29), + 'request_date_to': date(2020, 4, 1), + 'number_of_days': 3, + } for employee in employees[0:15]]) + leaves._compute_date_from_to() + + company_leave = self.env['hr.leave'].create({ + 'name': 'Bank Holiday', + 'holiday_type': 'company', + 'mode_company_id': self.company.id, + 'holiday_status_id': self.bank_holiday.id, + 'date_from': date(2020, 4, 1), + 'request_date_from': date(2020, 4, 1), + 'date_to': date(2020, 4, 1), + 'request_date_to': date(2020, 4, 1), + 'number_of_days': 1, + }) + company_leave._compute_date_from_to() + + count = 732 + with self.assertQueryCount(__system__=count, admin=count): + # Original query count: 1987 + # Without tracking/activity context keys: 5154 + company_leave.action_validate() + + leaves = self.env['hr.leave'].search([('holiday_status_id', '=', self.bank_holiday.id)]) + self.assertEqual(len(leaves), 102) |
