oca-technical/odoo-bringout-oca-hack-payroll/payroll/tests/test_hr_payslip_worked_days.py
2025-08-29 15:43:03 +02:00

138 lines
4.5 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from datetime import date, datetime
from odoo.tests.common import Form
from .common import TestPayslipBase
class TestWorkedDays(TestPayslipBase):
def setUp(self):
super().setUp()
self.LeaveRequest = self.env["hr.leave"]
self.LeaveType = self.env["hr.leave.type"]
# create holiday type
self.holiday_type = self.LeaveType.create(
{
"name": "TestLeaveType",
"code": "TESTLV",
"allocation_type": "no",
"leave_validation_type": "no_validation",
}
)
self.full_calendar = self.ResourceCalendar.create(
{
"name": "56 Hrs a week",
"tz": "UTC",
}
)
# Create a full 7-day week sor our tests don't fail on Sat. and Sun.
for day in ["0", "1", "2", "3", "4", "5", "6"]:
self.CalendarAttendance.create(
{
"calendar_id": self.full_calendar.id,
"dayofweek": day,
"name": "Morning",
"day_period": "morning",
"hour_from": 8,
"hour_to": 12,
}
)
self.CalendarAttendance.create(
{
"calendar_id": self.full_calendar.id,
"dayofweek": day,
"name": "Afternoon",
"day_period": "afternoon",
"hour_from": 13,
"hour_to": 17,
}
)
def _common_contract_leave_setup(self):
self.richard_emp.resource_id.calendar_id = self.full_calendar
self.richard_emp.contract_ids.resource_calendar_id = self.full_calendar
# I put all eligible contracts (including Richard's) in an "open" state
self.apply_contract_cron()
# Create the leave
self.LeaveRequest.create(
{
"name": "Hol11",
"employee_id": self.richard_emp.id,
"holiday_status_id": self.holiday_type.id,
"date_from": datetime.combine(date.today(), datetime.min.time()),
"date_to": datetime.combine(date.today(), datetime.max.time()),
"number_of_days": 1,
}
)
def test_worked_days_negative(self):
self._common_contract_leave_setup()
# Set system parameter
self.env["ir.config_parameter"].sudo().set_param(
"payroll.leaves_positive", False
)
# I create an employee Payslip
frm = Form(self.Payslip)
frm.employee_id = self.richard_emp
richard_payslip = frm.save()
worked_days_codes = richard_payslip.worked_days_line_ids.mapped("code")
self.assertIn(
"TESTLV", worked_days_codes, "The leave is in the 'Worked Days' list"
)
wdl_ids = richard_payslip.worked_days_line_ids.filtered(
lambda x: x.code == "TESTLV"
)
self.assertEqual(len(wdl_ids), 1, "There is only one line matching the leave")
self.assertEqual(
wdl_ids[0].number_of_days,
-1.0,
"The days worked value is a NEGATIVE number",
)
self.assertEqual(
wdl_ids[0].number_of_hours,
-8.0,
"The hours worked value is a NEGATIVE number",
)
def test_leaves_positive(self):
self._common_contract_leave_setup()
# Set system parameter
self.env["ir.config_parameter"].sudo().set_param(
"payroll.leaves_positive", True
)
# I create an employee Payslip
frm = Form(self.Payslip)
frm.employee_id = self.richard_emp
richard_payslip = frm.save()
worked_days_codes = richard_payslip.worked_days_line_ids.mapped("code")
self.assertIn(
"TESTLV", worked_days_codes, "The leave is in the 'Worked Days' list"
)
wdl_ids = richard_payslip.worked_days_line_ids.filtered(
lambda x: x.code == "TESTLV"
)
self.assertEqual(len(wdl_ids), 1, "There is only one line matching the leave")
self.assertEqual(
wdl_ids[0].number_of_days, 1.0, "The days worked value is a POSITIVE number"
)
self.assertEqual(
wdl_ids[0].number_of_hours,
8.0,
"The hours worked value is a POSITIVE number",
)