Files
HRM-System/tests/Feature/LeaveBalanceAdjustmentTest.php

86 lines
2.6 KiB
PHP

<?php
use App\Models\User;
use App\Models\Employee;
use App\Models\LeaveType;
use App\Models\LeavePolicy;
use App\Models\LeaveBalance;
use App\Models\LeaveApplication;
test('manual adjustments and carried forward leaves are correctly preserved when leave applications are approved', function () {
// 1. Create Company user
$company = User::create([
'name' => 'Test Company',
'email' => 'company_' . rand(1000, 9999) . '@test.com',
'password' => bcrypt('password'),
'type' => 'company',
]);
// 2. Create Employee user
$employeeUser = User::create([
'name' => 'Test Employee',
'email' => 'employee_' . rand(1000, 9999) . '@test.com',
'password' => bcrypt('password'),
'type' => 'employee',
]);
$employee = Employee::create([
'user_id' => $employeeUser->id,
'employee_id' => 'EMP-' . rand(1000, 9999),
'date_of_joining' => '2026-01-01',
'employee_status' => 'active',
'created_by' => $company->id,
]);
// 3. Create Leave Type
$leaveType = LeaveType::create([
'name' => 'Sick Leave',
'status' => 'active',
'created_by' => $company->id,
]);
// 4. Create Leave Policy
$leavePolicy = LeavePolicy::create([
'name' => 'Sick Leave Policy',
'leave_type_id' => $leaveType->id,
'status' => 'active',
'created_by' => $company->id,
]);
// 5. Create Leave Balance with a manual adjustment of -3.00 days
$leaveBalance = LeaveBalance::create([
'employee_id' => $employeeUser->id,
'leave_type_id' => $leaveType->id,
'leave_policy_id' => $leavePolicy->id,
'year' => 2026,
'allocated_days' => 5.00,
'carried_forward' => 0.00,
'manual_adjustment' => -3.00,
'used_days' => 0.00,
'remaining_days' => 2.00,
'created_by' => $company->id,
]);
// 6. Create approved Leave Application for 2 days
$leaveApplication = LeaveApplication::create([
'employee_id' => $employeeUser->id,
'leave_type_id' => $leaveType->id,
'leave_policy_id' => $leavePolicy->id,
'start_date' => '2026-06-01',
'end_date' => '2026-06-02',
'total_days' => 2.00,
'reason' => 'Feeling sick',
'status' => 'approved',
'created_by' => $company->id,
]);
// 7. Update leave balance
$leaveApplication->updateLeaveBalance();
// 8. Assert
$freshBalance = $leaveBalance->fresh();
expect((float)$freshBalance->used_days)->toBe(2.00);
// (5.00 + 0.00 - 3.00) - 2.00 = 0.00
expect((float)$freshBalance->remaining_days)->toBe(0.00);
});