108 lines
3.4 KiB
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');
|
|
});
|