orderBy('name') ->get(); } public function getAllPaginated(array $filters = [], int $perPage = 10): LengthAwarePaginator { $query = UserDependent::with(['responsibleUser.position', 'responsibleUser.sector']) ->orderBy('created_at', 'asc'); if (!empty($filters['status'])) { $query->where('status', $filters['status']); } if (!empty($filters['search'])) { $term = '%' . mb_strtolower($filters['search']) . '%'; $query->where(function ($q) use ($term) { $q->whereRaw('UNACCENT(LOWER(name)) LIKE UNACCENT(?)', [$term]) ->orWhereHas('responsibleUser', function ($q) use ($term) { $q->whereRaw('UNACCENT(LOWER(name)) LIKE UNACCENT(?)', [$term]); }); }); } return $query->paginate($perPage); } public function findById(int $id): ?UserDependent { return UserDependent::find($id); } public function create(array $data, ?UploadedFile $document = null): UserDependent { unset($data['document']); $data['status'] = UserDependentStatusEnum::PENDING->value; return DB::transaction(function () use ($data, $document): UserDependent { $dependent = UserDependent::create($data); if ($document) { $dependent->update([ 'document_path' => $document->store($this->documentDirectory($dependent), 's3'), 'document_name' => $document->getClientOriginalName(), ]); } return $dependent->fresh(); }); } private function documentDirectory(UserDependent $dependent): string { return "dependents/{$dependent->responsible_user_id}/dependent/{$dependent->id}"; } public function approve(int $id): ?UserDependent { $model = $this->findById($id); if (!$model) { return null; } $model->update(['status' => UserDependentStatusEnum::APPROVED]); return $model->fresh(); } public function refuse(int $id): ?UserDependent { $model = $this->findById($id); if (!$model) { return null; } $model->update(['status' => UserDependentStatusEnum::REFUSED]); return $model->fresh(); } public function update(int $id, array $data): ?UserDependent { $model = $this->findById($id); if (!$model) { return null; } unset($data['status'], $data['document'], $data['document_path'], $data['document_name']); $model->update($data); return $model->fresh(); } public function delete(int $id): bool { $model = $this->findById($id); if (!$model) { return false; } if ($model->document_path) { Storage::disk('s3')->deleteDirectory($this->documentDirectory($model)); } return $model->delete(); } }