forked from Mapan/odoo17e
89 lines
3.9 KiB
Python
89 lines
3.9 KiB
Python
#-*- coding:utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo.addons.hr_work_entry_contract_attendance.tests.common import HrWorkEntryAttendanceCommon
|
|
|
|
from datetime import datetime, date
|
|
|
|
from odoo.tests import tagged
|
|
|
|
@tagged('-at_install', 'post_install', 'payslip_overtime')
|
|
class TestPayslipOvertime(HrWorkEntryAttendanceCommon):
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super().setUpClass()
|
|
cls.struct_type = cls.env['hr.payroll.structure.type'].create({
|
|
'name': 'Test Structure Type',
|
|
'wage_type': 'hourly',
|
|
})
|
|
cls.struct = cls.env['hr.payroll.structure'].create({
|
|
'name': 'Test Structure - Worker',
|
|
'type_id': cls.struct_type.id,
|
|
})
|
|
cls.payslip = cls.env['hr.payslip'].create({
|
|
'name': 'Test Payslip',
|
|
'employee_id': cls.employee.id,
|
|
'struct_id': cls.struct.id,
|
|
'date_from': '2022-1-1',
|
|
'date_to': '2022-1-31',
|
|
})
|
|
cls.contract.structure_type_id = cls.struct_type
|
|
cls.contract.hourly_wage = 100
|
|
cls.company = cls.payslip.company_id
|
|
cls.company.hr_attendance_overtime = True
|
|
cls.company.overtime_start_date = date(2022, 1, 1)
|
|
|
|
def test_with_overtime(self):
|
|
self.env['hr.attendance'].create({
|
|
'employee_id': self.employee.id,
|
|
'check_in': datetime(2022, 1, 3, 0, 0, 0),
|
|
'check_out': datetime(2022, 1, 3, 20, 0, 0),
|
|
})
|
|
self.payslip._compute_worked_days_line_ids()
|
|
self.assertEqual(self.payslip.worked_days_line_ids.filtered(lambda w: w.code == 'OVERTIME').number_of_hours, 11)
|
|
|
|
def test_with_negative_overtime(self):
|
|
self.env['hr.attendance'].create({
|
|
'employee_id': self.employee.id,
|
|
'check_in': datetime(2022, 1, 3, 9, 0, 0),
|
|
'check_out': datetime(2022, 1, 3, 12, 0, 0),
|
|
})
|
|
self.payslip._compute_worked_days_line_ids()
|
|
self.assertFalse(self.payslip.worked_days_line_ids.filtered(lambda w: w.code == 'OVERTIME'))
|
|
|
|
def test_with_overtime_calendar_contract(self):
|
|
self.contract.work_entry_source = 'calendar'
|
|
self.env['hr.attendance'].create({
|
|
'employee_id': self.employee.id,
|
|
'check_in': datetime(2022, 1, 3, 0, 0, 0),
|
|
'check_out': datetime(2022, 1, 3, 20, 0, 0),
|
|
})
|
|
self.payslip._compute_worked_days_line_ids()
|
|
self.assertEqual(self.payslip.worked_days_line_ids.filtered(lambda w: w.code == 'OVERTIME').number_of_hours, 11)
|
|
|
|
def test_overtime_parameter_percent(self):
|
|
self.env['hr.attendance'].create({
|
|
'employee_id': self.employee.id,
|
|
'check_in': datetime(2022, 1, 3, 0, 0, 0),
|
|
'check_out': datetime(2022, 1, 3, 20, 0, 0),
|
|
})
|
|
rule_value = self.env.ref('hr_payroll_attendance.rule_parameter_overtime_pay_value')
|
|
|
|
rule_value.parameter_value = '50'
|
|
self.payslip._compute_worked_days_line_ids()
|
|
overtime_worked_days = self.payslip.worked_days_line_ids.filtered(lambda w: w.code == 'OVERTIME')
|
|
self.assertEqual(overtime_worked_days.number_of_hours * self.contract.hourly_wage * 0.5, overtime_worked_days.amount)
|
|
|
|
rule_value.parameter_value = '100'
|
|
self.env.registry.clear_cache()
|
|
self.payslip._compute_worked_days_line_ids()
|
|
overtime_worked_days = self.payslip.worked_days_line_ids.filtered(lambda w: w.code == 'OVERTIME')
|
|
self.assertEqual(overtime_worked_days.number_of_hours * self.contract.hourly_wage * 1, overtime_worked_days.amount)
|
|
|
|
rule_value.parameter_value = '15'
|
|
self.env.registry.clear_cache()
|
|
self.payslip._compute_worked_days_line_ids()
|
|
overtime_worked_days = self.payslip.worked_days_line_ids.filtered(lambda w: w.code == 'OVERTIME')
|
|
self.assertEqual(overtime_worked_days.number_of_hours * self.contract.hourly_wage * .15, overtime_worked_days.amount)
|