orderBy('name') ->get(); } public function getAllPaginated(array $filters = [], int $perPage = 10): LengthAwarePaginator { $query = $this->baseQuery($filters) ->with(['responsibleUser.position', 'responsibleUser.sector']) ->orderBy('created_at', 'asc'); if (!empty($filters['status'])) { $query->where('status', $filters['status']); } return $query->paginate($perPage); } /** * Status existentes no conjunto filtrado, desconsiderando o prĂ³prio filtro de status. * * @return array */ public function getStatusOptions(array $filters = []): array { return $this->baseQuery($filters) ->toBase() ->distinct() ->pluck('status') ->filter() ->values() ->all(); } private function baseQuery(array $filters): Builder { $query = UserDependent::query(); if (!empty($filters['search'])) { $term = '%' . mb_strtolower($filters['search']) . '%'; $query->where(function ($q) use ($term) { $q->whereRaw('UNACCENT(LOWER(user_dependents.name)) LIKE UNACCENT(?)', [$term]) ->orWhereRaw("TO_CHAR(user_dependents.created_at, 'DD/MM/YYYY HH24:MI:SS') LIKE ?", [$term]) ->orWhereHas('responsibleUser', function ($u) use ($term) { $u->whereRaw('UNACCENT(LOWER(users.name)) LIKE UNACCENT(?)', [$term]); }); }); } return $query; } 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(); } }