diff --git a/hr_payroll_overtime/__manifest__.py b/hr_payroll_overtime/__manifest__.py index 509838be..85940d58 100644 --- a/hr_payroll_overtime/__manifest__.py +++ b/hr_payroll_overtime/__manifest__.py @@ -9,6 +9,7 @@ 'data': [ 'security/ir.model.access.csv', 'data/overtime_data.xml', + 'views/hr_contract_views.xml', 'views/hr_payslip_views.xml', 'views/hr_work_entry_views.xml', 'views/resource_calendar_views.xml', diff --git a/hr_payroll_overtime/models/__init__.py b/hr_payroll_overtime/models/__init__.py index 3fcc81d4..43cd2c4a 100644 --- a/hr_payroll_overtime/models/__init__.py +++ b/hr_payroll_overtime/models/__init__.py @@ -1,3 +1,4 @@ +from . import hr_contract from . import hr_payslip from . import hr_work_entry from . import resource_calendar diff --git a/hr_payroll_overtime/models/hr_contract.py b/hr_payroll_overtime/models/hr_contract.py new file mode 100644 index 00000000..e5847963 --- /dev/null +++ b/hr_payroll_overtime/models/hr_contract.py @@ -0,0 +1,8 @@ +from odoo import fields, models + + +class HrContract(models.Model): + _inherit = 'hr.contract' + + is_overtime_exempt = fields.Boolean(string='Overtime Exempt', + help='e.g. Agriculture or farm work exempt under the US FLSA.') diff --git a/hr_payroll_overtime/models/hr_payslip.py b/hr_payroll_overtime/models/hr_payslip.py index 538d9b9f..e8bcd12e 100644 --- a/hr_payroll_overtime/models/hr_payslip.py +++ b/hr_payroll_overtime/models/hr_payslip.py @@ -105,7 +105,7 @@ class HRPayslip(models.Model): working_aggregation[work_type][2] = multiplier week = iso_date[1] - if work_type.overtime_work_type_id and work_type.overtime_type_id: + if not self.contract_id.is_overtime_exempt and work_type.overtime_work_type_id and work_type.overtime_type_id: ot_h_w = work_type.overtime_type_id.hours_per_week ot_h_d = work_type.overtime_type_id.hours_per_day diff --git a/hr_payroll_overtime/tests/test_overtime.py b/hr_payroll_overtime/tests/test_overtime.py index 55b93a68..d316e36c 100644 --- a/hr_payroll_overtime/tests/test_overtime.py +++ b/hr_payroll_overtime/tests/test_overtime.py @@ -24,9 +24,11 @@ class TestOvertime(common.TransactionCase): 'overtime_work_type_id': self.work_type_overtime.id, }) self.employee = self.env.ref('hr.employee_hne') + self.contract = self.employee.contract_ids.filtered(lambda l: l.state == 'open') self.payslip = self.env['hr.payslip'].create({ 'name': 'test slip', 'employee_id': self.employee.id, + 'contract_id': self.contract.id, 'date_from': '2020-06-11', 'date_to': '2020-06-15', }) @@ -490,3 +492,31 @@ class TestOvertime(common.TransactionCase): self.assertEqual(result_data[self.work_type_overtime][0], 1) self.assertEqual(result_data[self.work_type_overtime][1], 4.0) self.assertEqual(result_data[self.work_type_overtime][2], test_multiplier) + + def test_19_overtime_exempt(self): + iso_date = (2020, 24, 1) + self.overtime_rules.hours_per_day = 8.0 + work_data = [ + (iso_date, [ + (self.work_type, 4.0, None), + (self.work_type, 6.0, None), + ]), + ] + + result_data = self.payslip._aggregate_overtime(work_data) + self.assertTrue(self.work_type in result_data) + self.assertEqual(result_data[self.work_type][0], 1) + self.assertEqual(result_data[self.work_type][1], 8.0) + self.assertTrue(self.work_type_overtime in result_data) + self.assertEqual(result_data[self.work_type_overtime][0], 0) + self.assertEqual(result_data[self.work_type_overtime][1], 2.0) + self.assertEqual(result_data[self.work_type_overtime][2], 1.5) + + self.payslip.contract_id.is_overtime_exempt = True + self.assertTrue(self.payslip.contract_id) + self.assertTrue(self.payslip.contract_id.is_overtime_exempt) + result_data = self.payslip._aggregate_overtime(work_data) + self.assertTrue(self.work_type in result_data) + self.assertEqual(result_data[self.work_type][0], 1) + self.assertEqual(result_data[self.work_type][1], 10.0) + self.assertTrue(self.work_type_overtime not in result_data) diff --git a/hr_payroll_overtime/views/hr_contract_views.xml b/hr_payroll_overtime/views/hr_contract_views.xml new file mode 100644 index 00000000..0e6b9a61 --- /dev/null +++ b/hr_payroll_overtime/views/hr_contract_views.xml @@ -0,0 +1,15 @@ + + + + + hr.contract.form.inherit + hr.contract + + + + + + + + +