Files
suite/hr_payroll_attendance/tests/test_payroll_attendance.py
Jared Kipe 9f59dd2dee [MIG] hr_payroll_attendance: for Odoo Enterprise 13.0
Move some concerns to other modules, refactor new API to make it possible to use timesheets and attendances together.

Now possible to add attendances by hand or import via smart button and 'recompute' attendances.
2020-11-27 14:20:26 -08:00

158 lines
6.4 KiB
Python

# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from odoo.addons.hr_payroll_hibou.tests import common
from odoo.exceptions import ValidationError
class TestUsPayslip(common.TestPayslip):
def setUp(self):
super().setUp()
self.test_hourly_wage = 21.5
self.employee = self._createEmployee()
self.contract = self._createContract(self.employee,
wage=self.test_hourly_wage,
hourly_wage=self.test_hourly_wage,
wage_type='hourly',
paid_hourly_attendance=True)
self.work_entry_type_leave = self.env['hr.work.entry.type'].create({
'name': 'Test PTO',
'code': 'TESTPTO',
'is_leave': True,
})
def _setup_attendance(self, employee):
# Total 127.37 hours in 2 weeks.
# Six 9-hour days in one week (plus a little). 58.97 hours in that week.
attendances = self.env['hr.attendance']
attendances += self.env['hr.attendance'].create({
'employee_id': employee.id,
'check_in': '2020-01-06 10:00:00', # Monday
'check_out': '2020-01-06 19:00:00',
})
attendances += self.env['hr.attendance'].create({
'employee_id': employee.id,
'check_in': '2020-01-07 10:00:00',
'check_out': '2020-01-07 19:00:00',
})
attendances += self.env['hr.attendance'].create({
'employee_id': employee.id,
'check_in': '2020-01-08 10:00:00',
'check_out': '2020-01-08 19:00:00',
})
attendances += self.env['hr.attendance'].create({
'employee_id': employee.id,
'check_in': '2020-01-09 10:00:00',
'check_out': '2020-01-09 19:00:00',
})
attendances += self.env['hr.attendance'].create({
'employee_id': employee.id,
'check_in': '2020-01-10 10:00:00',
'check_out': '2020-01-10 19:00:00',
})
attendances += self.env['hr.attendance'].create({
'employee_id': employee.id,
'check_in': '2020-01-11 06:00:00',
'check_out': '2020-01-11 19:58:12',
})
# Five 10-hour days, Two 9-hour days (plus a little) in one week. 68.4 hours in that week
attendances += self.env['hr.attendance'].create({
'employee_id': employee.id,
'check_in': '2020-01-13 08:00:00', # Monday
'check_out': '2020-01-13 18:00:00',
})
attendances += self.env['hr.attendance'].create({
'employee_id': employee.id,
'check_in': '2020-01-14 08:00:00',
'check_out': '2020-01-14 18:00:00',
})
attendances += self.env['hr.attendance'].create({
'employee_id': employee.id,
'check_in': '2020-01-15 08:00:00',
'check_out': '2020-01-15 18:00:00',
})
attendances += self.env['hr.attendance'].create({
'employee_id': employee.id,
'check_in': '2020-01-16 08:00:00',
'check_out': '2020-01-16 18:00:00',
})
attendances += self.env['hr.attendance'].create({
'employee_id': employee.id,
'check_in': '2020-01-17 08:00:00',
'check_out': '2020-01-17 18:00:00',
})
attendances += self.env['hr.attendance'].create({
'employee_id': employee.id,
'check_in': '2020-01-18 09:00:00',
'check_out': '2020-01-18 18:00:00',
})
last = self.env['hr.attendance'].create({
'employee_id': employee.id,
'check_in': '2020-01-19 09:00:00',
'check_out': '2020-01-19 18:24:00',
})
attendances += last
return last
def test_attendance_hourly(self):
attn_last = self._setup_attendance(self.employee)
self.payslip = self._createPayslip(self.employee, '2020-01-06', '2020-01-19')
self.assertTrue(self.payslip.contract_id, 'No auto-discovered contract!')
self.payslip.compute_sheet()
# 58.97 => 40hr regular, 18.97hr OT
# 68.4 => 40hr regular, 28.4hr OT
# (80 * 21.50) + (47.37 * 21.50 * 1.5) = 3247.6825
cats = self._getCategories(self.payslip)
self.assertAlmostEqual(cats['BASIC'], 3247.68, 2)
# ensure unlink behavior.
self.payslip.attendance_ids = self.env['hr.attendance'].browse()
self.payslip.state = 'draft'
self.payslip.flush()
self.payslip._onchange_employee()
self.payslip.compute_sheet()
cats = self._getCategories(self.payslip)
self.assertAlmostEqual(cats['BASIC'], 3247.68, 2)
self.payslip.write({'attendance_ids': [(5, 0, 0)]})
self.payslip.state = 'draft'
self.payslip.flush()
self.payslip._onchange_employee()
self.payslip.compute_sheet()
cats = self._getCategories(self.payslip)
self.assertAlmostEqual(cats['BASIC'], 3247.68, 2)
self.process_payslip()
self.assertTrue(self.payslip.state not in ('draft', 'verify'))
self.assertEqual(self.payslip, attn_last.payslip_id)
# can empty, by design you have to be able to do so
attn_last.payslip_id = False
with self.assertRaises(ValidationError):
# cannot re-assign as it is a finished payslip
attn_last.payslip_id = self.payslip
def test_with_leave(self):
date_from = '2020-01-10'
date_to = '2020-01-11'
self.env['resource.calendar.leaves'].create({
'name': 'Doctor Appointment',
'date_from': date_from,
'date_to': date_to,
'resource_id': self.employee.resource_id.id,
'calendar_id': self.employee.resource_calendar_id.id,
'work_entry_type_id': self.work_entry_type_leave.id,
'time_type': 'leave',
})
self._setup_attendance(self.employee)
self.payslip = self._createPayslip(self.employee, '2020-01-06', '2020-01-19')
self.assertTrue(self.payslip.worked_days_line_ids)
leave_line = self.payslip.worked_days_line_ids.filtered(lambda l: l.code == 'TESTPTO')
self.assertTrue(leave_line)
self.assertEqual(leave_line.number_of_days, 1.0)
self.assertEqual(leave_line.number_of_hours, 8.0)
self.assertEqual(leave_line.amount, 8.0 * self.test_hourly_wage)