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

108 lines
3.4 KiB
PHP

<?php
use App\Models\User;
use App\Models\Employee;
use App\Models\PayrollRun;
use App\Models\PayrollEntry;
use App\Models\Payslip;
test('payslip number generation is unique and appends sequential suffixes', 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 Payroll Runs
$payrollRun1 = PayrollRun::create([
'title' => 'June 1-15 2026',
'payroll_frequency' => 'semi-monthly',
'pay_period_start' => '2026-06-01',
'pay_period_end' => '2026-06-15',
'pay_date' => '2026-06-30',
'status' => 'draft',
'created_by' => $company->id,
]);
$payrollRun2 = PayrollRun::create([
'title' => 'June 16-30 2026',
'payroll_frequency' => 'semi-monthly',
'pay_period_start' => '2026-06-16',
'pay_period_end' => '2026-06-30',
'pay_date' => '2026-06-30',
'status' => 'draft',
'created_by' => $company->id,
]);
// 4. Create Payroll Entries
$payrollEntry1 = PayrollEntry::create([
'payroll_run_id' => $payrollRun1->id,
'employee_id' => $employeeUser->id,
'basic_salary' => 10000,
'created_by' => $company->id,
]);
$payrollEntry2 = PayrollEntry::create([
'payroll_run_id' => $payrollRun2->id,
'employee_id' => $employeeUser->id,
'basic_salary' => 10000,
'created_by' => $company->id,
]);
$employeeIdForNumber = $employee->employee_id; // Will pad to 4 digits if numeric, or keep as string
$payDate = '2026-06-30';
// Step 5: Generate first payslip number
$num1 = Payslip::generatePayslipNumber($employeeUser->id, $payDate);
// Create a payslip with this number
$payslip1 = Payslip::create([
'payroll_entry_id' => $payrollEntry1->id,
'employee_id' => $employeeUser->id,
'payslip_number' => $num1,
'pay_period_start' => '2026-06-01',
'pay_period_end' => '2026-06-15',
'pay_date' => $payDate,
'status' => 'generated',
'created_by' => $company->id,
]);
// Step 6: Generate second payslip number for the same employee/date
$num2 = Payslip::generatePayslipNumber($employeeUser->id, $payDate);
expect($num2)->toBe($num1 . '-1');
// Create a payslip with this second number
$payslip2 = Payslip::create([
'payroll_entry_id' => $payrollEntry2->id,
'employee_id' => $employeeUser->id,
'payslip_number' => $num2,
'pay_period_start' => '2026-06-16',
'pay_period_end' => '2026-06-30',
'pay_date' => $payDate,
'status' => 'generated',
'created_by' => $company->id,
]);
// Step 7: Generate third payslip number
$num3 = Payslip::generatePayslipNumber($employeeUser->id, $payDate);
expect($num3)->toBe($num1 . '-2');
});