load(['position', 'sector']); } public function getAll(): Collection { return User::with(['position', 'sector'])->orderBy("created_at", "desc")->get(); } public function getAllPaginated(array $filters = [], int $perPage = 10): \Illuminate\Pagination\LengthAwarePaginator { $query = User::with(['position', 'sector'])->orderBy('created_at', 'desc'); if (!empty($filters['type'])) { $query->where('type', $filters['type']); } 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]) ->orWhereRaw('UNACCENT(LOWER(email)) LIKE UNACCENT(?)', [$term]) ->orWhereRaw('UNACCENT(LOWER(COALESCE(cpf, \'\'))) LIKE UNACCENT(?)', [$term]) ->orWhereRaw('UNACCENT(LOWER(COALESCE(registration, \'\'))) LIKE UNACCENT(?)', [$term]); }); } return $query->paginate($perPage); } public function findById(int $id): ?User { return User::find($id); } public function create(array $data): User { return User::create($data); } public function update(int $id, array $data): ?User { $model = $this->findById($id); if (!$model) { return null; } if (isset($data['status'])) { $newStatus = $data['status'] instanceof UserStatusEnum ? $data['status'] : UserStatusEnum::from($data['status']); if ($newStatus === UserStatusEnum::INACTIVE && $model->status !== UserStatusEnum::INACTIVE) { $data['excluded_at'] = now(); } elseif ($newStatus !== UserStatusEnum::INACTIVE) { $data['excluded_at'] = null; } } $model->update($data); return $model->fresh(); } public function delete(int $id): bool { $model = $this->findById($id); if (!$model) { return false; } return $model->delete(); } public function getUserTypes(): array { return UserTypeEnum::toArray(); } }