filled('search')) { $search = $request->search; $query->whereHas('staff', function($q) use ($search) { $q->where('name', 'like', "%{$search}%"); }); } // Filter by Status if ($request->filled('status')) { $query->where('status', $request->status); } else { // Default to showing pending requests first if no filter is applied $query->orderByRaw("FIELD(status, 'PENDING', 'APPROVED', 'REJECTED')"); } $leaveRequests = $query->orderBy('created_at', 'desc')->paginate(15); $leaveRequests->appends($request->query()); // KPIs for HR $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() { // Find the staff profile of the currently logged-in user // Adjust this logic if you link Users to StaffMembers differently (e.g., via a staff_id foreign key) $staff = StaffMember::where('email', auth()->user()->email)->firstOrFail(); // Fetch their leave history, latest first $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']); // Calculate total days excluding weekends $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 updateStatus(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(), // Track who approved it ]); return response()->json(['success' => true, 'message' => 'Leave status updated successfully!']); } }