177 lines
5.8 KiB
PHP
177 lines
5.8 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\LeaveRequest;
|
|
use App\Models\StaffMember;
|
|
use Illuminate\Http\Request;
|
|
use Carbon\Carbon;
|
|
|
|
class LeaveRequestController extends Controller
|
|
{
|
|
|
|
|
|
|
|
public function index(Request $request)
|
|
{
|
|
$query = LeaveRequest::with('staff');
|
|
|
|
|
|
if ($request->filled('search')) {
|
|
$search = $request->search;
|
|
$query->whereHas('staff', function($q) use ($search) {
|
|
$q->where('name', 'like', "%{$search}%");
|
|
});
|
|
}
|
|
|
|
if ($request->filled('status')) {
|
|
$query->where('status', $request->status);
|
|
}
|
|
else {
|
|
|
|
$query->orderByRaw("FIELD(status, 'PENDING', 'APPROVED', 'REJECTED')");
|
|
}
|
|
|
|
$leaveRequests = $query->orderBy('created_at', 'desc')->paginate(15);
|
|
$leaveRequests->appends($request->query());
|
|
|
|
$pendingCount = LeaveRequest::where('status', 'PENDING')->count();
|
|
$approvedThisMonth = LeaveRequest::where('status', 'APPROVED')
|
|
->whereMonth('start_date', Carbon::now()->month)
|
|
->whereYear('start_date', Carbon::now()->year)
|
|
->count();
|
|
|
|
$data = [
|
|
'leaveRequests' => $leaveRequests,
|
|
'pendingCount' => $pendingCount,
|
|
'approvedThisMonth' => $approvedThisMonth,
|
|
];
|
|
|
|
return view('leave.index', $data);
|
|
}
|
|
public function myLeave()
|
|
{
|
|
|
|
$staff = StaffMember::where('email', auth()->user()->email)->firstOrFail();
|
|
$leaveRequests = LeaveRequest::where('staff_member_id', $staff->id)
|
|
->orderBy('created_at', 'desc')
|
|
->paginate(10);
|
|
|
|
$data = [
|
|
'staff' => $staff,
|
|
'leaveRequests' => $leaveRequests,
|
|
];
|
|
|
|
return view('leave.my_leave', $data);
|
|
}
|
|
|
|
public function store(Request $request)
|
|
{
|
|
$validated = $request->validate([
|
|
'staff_member_id' => 'required|exists:staff_members,id',
|
|
'leave_type' => 'required|string',
|
|
'start_date' => 'required|date',
|
|
'end_date' => 'required|date|after_or_equal:start_date',
|
|
'reason' => 'required|string',
|
|
]);
|
|
|
|
$start = Carbon::parse($validated['start_date']);
|
|
$end = Carbon::parse($validated['end_date']);
|
|
|
|
$totalDays = $start->diffInDaysFiltered(function (Carbon $date) {
|
|
return !$date->isWeekend();
|
|
}, $end) + 1; // +1 to include both the start and end day
|
|
|
|
|
|
if ($validated['leave_type'] === 'Annual') {
|
|
$staff = StaffMember::find($validated['staff_member_id']);
|
|
if ($staff->annual_leave_balance < $totalDays) {
|
|
return response()->json([
|
|
'success' => false,
|
|
'message' => "Insufficient balance. Requested: $totalDays days. Available: {$staff->annual_leave_balance} days."
|
|
], 422);
|
|
}
|
|
}
|
|
|
|
$validated['total_days'] = $totalDays;
|
|
$validated['status'] = 'PENDING';
|
|
|
|
LeaveRequest::create($validated);
|
|
|
|
return response()->json(['success' => true, 'message' => 'Leave request submitted successfully!']);
|
|
}
|
|
|
|
|
|
public function updateStatusOld(Request $request, $id)
|
|
{
|
|
$leaveRequest = LeaveRequest::findOrFail($id);
|
|
|
|
$validated = $request->validate([
|
|
'status' => 'required|in:APPROVED,REJECTED',
|
|
'admin_remarks' => 'nullable|string',
|
|
]);
|
|
|
|
if ($validated['status'] === 'APPROVED' && $leaveRequest->status !== 'APPROVED') {
|
|
if ($leaveRequest->leave_type === 'Annual') {
|
|
$staff = $leaveRequest->staff;
|
|
$staff->annual_leave_balance -= $leaveRequest->total_days;
|
|
$staff->save();
|
|
}
|
|
}
|
|
|
|
if ($validated['status'] === 'REJECTED' && $leaveRequest->status === 'APPROVED') {
|
|
if ($leaveRequest->leave_type === 'Annual') {
|
|
$staff = $leaveRequest->staff;
|
|
$staff->annual_leave_balance += $leaveRequest->total_days;
|
|
$staff->save();
|
|
}
|
|
}
|
|
|
|
$leaveRequest->update([
|
|
'status' => $validated['status'],
|
|
'admin_remarks' => $validated['admin_remarks'],
|
|
'approved_by' => auth()->id(),
|
|
]);
|
|
|
|
return response()->json(['success' => true, 'message' => 'Leave status updated successfully!']);
|
|
}
|
|
public function updateStatus(Request $request, $id)
|
|
{
|
|
$leaveRequest = LeaveRequest::findOrFail($id);
|
|
|
|
$incomingStatus = strtoupper($request->status);
|
|
$request->merge(['status' => $incomingStatus]);
|
|
|
|
$validated = $request->validate([
|
|
'status' => 'required|in:APPROVED,REJECTED',
|
|
'admin_remarks' => 'nullable|string',
|
|
]);
|
|
|
|
$currentStatus = strtoupper($leaveRequest->status);
|
|
$newStatus = $validated['status'];
|
|
|
|
$staff = $leaveRequest->staff;
|
|
|
|
if ($staff && strtolower($leaveRequest->leave_type) === 'annual') { // only annual leave affects leave balance
|
|
|
|
if ($newStatus === 'APPROVED' && $currentStatus !== 'APPROVED') {
|
|
$staff->annual_leave_balance -= $leaveRequest->total_days;
|
|
$staff->save();
|
|
}
|
|
|
|
if ($newStatus === 'REJECTED' && $currentStatus === 'APPROVED') {
|
|
$staff->annual_leave_balance += $leaveRequest->total_days;
|
|
$staff->save();
|
|
}
|
|
}
|
|
|
|
$leaveRequest->update([
|
|
'status' => $newStatus,
|
|
'admin_remarks' => $validated['admin_remarks'] ?? null,
|
|
'approved_by' => auth()->id(),
|
|
]);
|
|
|
|
return response()->json(['success' => true, 'message' => 'Leave status updated successfully!']);
|
|
}
|
|
}
|