Feat: Hide payroll_frequency from UI and auto-calculate based on pay period dates

This commit is contained in:
2026-05-11 13:25:41 +08:00
parent cf78d71feb
commit 0f15e024d8

View File

@@ -97,7 +97,6 @@ class PayrollRunController extends Controller
if (Auth::user()->can('create-payroll-runs')) {
$validated = $request->validate([
'title' => 'required|string|max:255',
'payroll_frequency' => 'required|in:weekly,biweekly,semi-monthly,monthly',
'pay_period_start' => 'required|date',
'pay_period_end' => 'required|date|after:pay_period_start',
'pay_date' => 'required|date|after_or_equal:pay_period_end',
@@ -106,6 +105,16 @@ class PayrollRunController extends Controller
$validated['created_by'] = creatorId();
$validated['status'] = 'draft';
// Dynamically calculate frequency
$daysDiff = \Carbon\Carbon::parse($validated['pay_period_start'])->diffInDays(\Carbon\Carbon::parse($validated['pay_period_end'])) + 1;
if ($daysDiff >= 28) {
$validated['payroll_frequency'] = 'monthly';
} elseif ($daysDiff <= 7) {
$validated['payroll_frequency'] = 'weekly';
} else {
$validated['payroll_frequency'] = 'semi-monthly';
}
// Check if payroll run already exists for this period
$exists = PayrollRun::where('pay_period_start', $validated['pay_period_start'])
@@ -136,12 +145,21 @@ class PayrollRunController extends Controller
try {
$validated = $request->validate([
'title' => 'required|string|max:255',
'payroll_frequency' => 'required|in:weekly,biweekly,semi-monthly,monthly',
'pay_period_start' => 'required|date',
'pay_period_end' => 'required|date|after:pay_period_start',
'pay_date' => 'required|date|after_or_equal:pay_period_end',
'notes' => 'nullable|string',
]);
// Dynamically calculate frequency
$daysDiff = \Carbon\Carbon::parse($validated['pay_period_start'])->diffInDays(\Carbon\Carbon::parse($validated['pay_period_end'])) + 1;
if ($daysDiff >= 28) {
$validated['payroll_frequency'] = 'monthly';
} elseif ($daysDiff <= 7) {
$validated['payroll_frequency'] = 'weekly';
} else {
$validated['payroll_frequency'] = 'semi-monthly';
}
// Only allow updates if status is draft
if ($payrollRun->status !== 'draft') {
@@ -331,12 +349,11 @@ class PayrollRunController extends Controller
$callback = function () use ($payrollRuns) {
$file = fopen('php://output', 'w');
fputcsv($file, ['Title', 'Payroll Frequency', 'Pay Period Start', 'Pay Period End', 'Pay Date', 'Status', 'Notes']);
fputcsv($file, ['Title', 'Pay Period Start', 'Pay Period End', 'Pay Date', 'Status', 'Notes']);
foreach ($payrollRuns as $run) {
fputcsv($file, [
$run->title,
$run->payroll_frequency,
\Carbon\Carbon::parse($run->pay_period_start)->format('Y-m-d'),
\Carbon\Carbon::parse($run->pay_period_end)->format('Y-m-d'),
\Carbon\Carbon::parse($run->pay_date)->format('Y-m-d'),
@@ -457,9 +474,19 @@ class PayrollRunController extends Controller
continue;
}
// Dynamically calculate frequency
$daysDiff = \Carbon\Carbon::parse($row['pay_period_start'])->diffInDays(\Carbon\Carbon::parse($row['pay_period_end'])) + 1;
if ($daysDiff >= 28) {
$calcFreq = 'monthly';
} elseif ($daysDiff <= 7) {
$calcFreq = 'weekly';
} else {
$calcFreq = 'semi-monthly';
}
PayrollRun::create([
'title' => $row['title'],
'payroll_frequency' => $row['payroll_frequency'] ?? 'monthly',
'payroll_frequency' => $calcFreq,
'pay_period_start' => $row['pay_period_start'],
'pay_period_end' => $row['pay_period_end'],
'pay_date' => $row['pay_date'],