with(['employee.user.userProfile']) ->when($filters['status'] ?? null, function ($query, $status) { $query->where('status', $status); }) ->latest() ->get(); } public function paginated(int $perPage = 15, string $search = '', string $sort = 'created_at', string $direction = 'desc', array $filters = []): LengthAwarePaginator { return LeaveRequest::query() ->select('id', 'employee_id', 'start_date', 'end_date', 'total_days', 'status', 'created_at') ->with(['employee.user.userProfile']) ->when($search, fn ($q) => $q->whereHas('employee.user.userProfile', fn ($uq) => $uq->where('full_name', 'like', "%{$search}%"))) ->when($filters['status'] ?? null, function ($query, $status) { $query->where('status', $status); }) ->orderBy($sort, $direction) ->paginate($perPage); } public function create(array $data): LeaveRequest { return DB::transaction(function () use ($data) { $employee = auth()->user()->employee; if (! $employee) { throw new \Exception('Anda tidak terdaftar sebagai karyawan.'); } $startDate = new Carbon($data['start_date']); $endDate = new Carbon($data['end_date']); $totalDays = $startDate->diffInDays($endDate) + 1; return LeaveRequest::create([ 'employee_id' => $employee->id, 'start_date' => $data['start_date'], 'end_date' => $data['end_date'], 'total_days' => $totalDays, 'status' => LeaveRequestStatus::PENDING, ]); }); } public function update(LeaveRequest $leaveRequest, array $data): LeaveRequest { return DB::transaction(function () use ($leaveRequest, $data) { $startDate = new Carbon($data['start_date']); $endDate = new Carbon($data['end_date']); $totalDays = $startDate->diffInDays($endDate) + 1; $leaveRequest->update([ 'start_date' => $data['start_date'], 'end_date' => $data['end_date'], 'total_days' => $totalDays, ]); return $leaveRequest; }); } public function delete(LeaveRequest $leaveRequest): bool { return $leaveRequest->delete(); } public function approve(LeaveRequest $leaveRequest): LeaveRequest { $leaveRequest->update([ 'status' => LeaveRequestStatus::APPROVED, 'verified_by_id' => auth()->id(), 'verified_at' => now(), ]); return $leaveRequest; } public function reject(LeaveRequest $leaveRequest): LeaveRequest { $leaveRequest->update([ 'status' => LeaveRequestStatus::REJECTED, 'verified_by_id' => auth()->id(), 'verified_at' => now(), ]); return $leaveRequest; } }