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!']); } }