odex30_standard/employee_requests/tests/test_hr_personal_permission.py

143 lines
5.4 KiB
Python

# -*- coding: utf-8 -*-
from odoo.tests.common import TransactionCase
from odoo.exceptions import UserError, ValidationError
from odoo import fields
from datetime import datetime, timedelta
class TestHrPersonalPermission(TransactionCase):
def setUp(self):
super(TestHrPersonalPermission, self).setUp()
self.permission_type = self.env['hr.personal.permission.type'].create({
'name': 'Medical Permission',
'daily_hours': 4.0,
'monthly_hours': 10.0,
'approval_by': 'direct_manager',
})
self.calendar = self.env['resource.calendar'].create({
'name': 'Standard 8 Hours',
'is_full_day': True,
'hours_per_day': 8.0,
'full_min_sign_in': 7.0,
'full_max_sign_in': 9.0,
'full_min_sign_out': 15.0,
'full_max_sign_out': 17.0,
})
self.employee = self.env['hr.employee'].create({
'name': 'Ahmed Test Employee',
'resource_calendar_id': self.calendar.id,
'first_hiring_date': fields.Date.today() - timedelta(days=365),
})
def test_01_duration_calculation(self):
start_time = datetime.now().replace(hour=9, minute=0, second=0, microsecond=0)
end_time = start_time + timedelta(hours=1.5)
permission = self.env['hr.personal.permission'].create({
'employee_id': self.employee.id,
'permission_type_id': self.permission_type.id,
'date_from': start_time,
'date_to': end_time,
'permission_number': 10.0,
})
self.assertEqual(permission.duration, 1.5, "Duration calculation is wrong")
def test_02_daily_limit_constraint(self):
self.permission_type.daily_hours = 2.0
start_time = datetime.now().replace(hour=9, minute=0, second=0, microsecond=0)
end_time = start_time + timedelta(hours=3)
with self.assertRaises(UserError, msg="Should prevent permission > daily limit"):
self.env['hr.personal.permission'].create({
'employee_id': self.employee.id,
'permission_type_id': self.permission_type.id,
'date_from': start_time,
'date_to': end_time,
'permission_number': 10.0,
})
def test_03_monthly_limit_constraint(self):
self.permission_type.monthly_hours = 4.0
base_date = datetime.now().replace(day=1, hour=9, minute=0, second=0, microsecond=0)
self.env['hr.personal.permission'].create({
'employee_id': self.employee.id,
'permission_type_id': self.permission_type.id,
'date_from': base_date,
'date_to': base_date + timedelta(hours=2),
'state': 'approve',
'permission_number': 4.0,
})
base_date_2 = base_date + timedelta(days=1)
self.env['hr.personal.permission'].create({
'employee_id': self.employee.id,
'permission_type_id': self.permission_type.id,
'date_from': base_date_2,
'date_to': base_date_2 + timedelta(hours=2),
'state': 'approve',
'permission_number': 2.0,
})
base_date_3 = base_date + timedelta(days=2)
with self.assertRaises(UserError, msg="Should prevent permission > monthly limit"):
self.env['hr.personal.permission'].create({
'employee_id': self.employee.id,
'permission_type_id': self.permission_type.id,
'date_from': base_date_3,
'date_to': base_date_3 + timedelta(hours=1),
'permission_number': 0.0, # الرصيد انتهى
})
def test_04_check_attendance_hours(self):
start_time = datetime.now().replace(hour=18, minute=0, second=0, microsecond=0)
end_time = start_time + timedelta(hours=1)
with self.assertRaises(ValidationError, msg="Should prevent permission outside attendance hours"):
self.env['hr.personal.permission'].create({
'employee_id': self.employee.id,
'permission_type_id': self.permission_type.id,
'date_from': start_time,
'date_to': end_time,
'permission_number': 10.0,
})
def test_05_overlap_with_holiday(self):
if 'hr.holidays' not in self.env:
return
today = fields.Date.today()
holiday_status = self.env['hr.holidays.status'].search([], limit=1)
if not holiday_status:
holiday_status = self.env['hr.holidays.status'].create({'name': 'Test Leave'})
self.env['hr.holidays'].create({
'employee_id': self.employee.id,
'holiday_status_id': holiday_status.id,
'date_from': today,
'date_to': today,
'type': 'remove',
'state': 'validate',
})
start_time = datetime.now().replace(hour=10, minute=0, second=0, microsecond=0)
with self.assertRaises(UserError, msg="Should prevent permission during approved holiday"):
perm = self.env['hr.personal.permission'].create({
'employee_id': self.employee.id,
'permission_type_id': self.permission_type.id,
'date_from': start_time,
'date_to': start_time + timedelta(hours=1),
'permission_number': 10.0,
})
perm.check_holiday_mission()