1
0
forked from Mapan/odoo17e
odoo17e-kedaikipas58/addons/hr_payroll_attendance/tests/test_payslip_overtime.py
2024-12-10 09:04:09 +07:00

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)