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

80 lines
2.6 KiB
PHP

<?php
use App\Models\User;
use App\Models\PayrollRun;
use App\Models\PayrollEntry;
use Illuminate\Support\Facades\DB;
test('backfill migration correctly populates overtime columns from json earnings breakdown', function () {
// 1. Create a Company user
$company = User::create([
'name' => 'Test Company',
'email' => 'company_' . rand(1000, 9999) . '@test.com',
'password' => bcrypt('password'),
'type' => 'company',
]);
// 2. Create an Employee user
$employee = User::create([
'name' => 'Test Employee',
'email' => 'employee_' . rand(1000, 9999) . '@test.com',
'password' => bcrypt('password'),
'type' => 'employee',
]);
// 3. Create a Payroll Run
$payrollRun = PayrollRun::create([
'title' => 'June 11-25 2026',
'payroll_frequency' => 'semi-monthly',
'pay_period_start' => '2026-06-11',
'pay_period_end' => '2026-06-25',
'pay_date' => '2026-06-30',
'status' => 'draft',
'created_by' => $company->id,
]);
// 4. Create a Payroll Entry simulating the old bug state (0 in DB columns, but OT present in JSON)
$earningsBreakdown = [
'basic_salary' => 10000.00,
'summary' => [
'days_worked' => 10,
'reg_ot_hours' => '3.50',
'reg_ot_amount' => 450.75,
]
];
$entry = PayrollEntry::create([
'payroll_run_id' => $payrollRun->id,
'employee_id' => $employee->id,
'basic_salary' => 10000.00,
'component_earnings' => 450.75,
'total_earnings' => 10450.75,
'total_deductions' => 0.00,
'gross_pay' => 10450.75,
'net_pay' => 10450.75,
'working_days' => 10,
'present_days' => 10,
'full_present_days' => 10,
'half_days' => 0,
'holiday_days' => 0,
'paid_leave_days' => 0,
'unpaid_leave_days' => 0,
'absent_days' => 0,
'overtime_hours' => 0.00, // old bugged default
'overtime_amount' => 0.00, // old bugged default
'per_day_salary' => 1000.00,
'earnings_breakdown' => $earningsBreakdown,
'deductions_breakdown' => [],
'created_by' => $company->id,
]);
// 5. Run the migration logic manually to test the update
$migration = require database_path('migrations/2026_06_26_150000_backfill_payroll_entry_overtime.php');
$migration->up();
// 6. Assert that values have been backfilled correctly
$freshEntry = $entry->fresh();
expect((float)$freshEntry->overtime_hours)->toBe(3.50);
expect((float)$freshEntry->overtime_amount)->toBe(450.75);
});