where('user_id', $userId)->first(); return $row ?: null; } public function getAdminPatientList(string $sortBy = 'patient_id', string $sortDir = 'asc'): array { $fullNameSql = "TRIM(CONCAT(COALESCE(users.first_name, ''), ' ', COALESCE(users.last_name, '')))"; $sortColumns = [ 'patient_id' => 'users.id', 'name' => $fullNameSql, 'email' => 'users.email', 'phone' => 'patients.phone', 'status' => 'users.status', ]; $sortColumn = $sortColumns[$sortBy] ?? 'users.id'; $sortDir = strtolower($sortDir) === 'desc' ? 'DESC' : 'ASC'; return $this->asObject() ->select("users.id as user_id, CASE WHEN users.formatted_user_id IS NULL OR users.formatted_user_id = '' OR users.formatted_user_id LIKE 'PHY%' THEN CONCAT('PAT', LPAD(users.id, 7, '0')) ELSE users.formatted_user_id END as formatted_user_id, {$fullNameSql} as name, users.email, users.first_name, users.last_name, users.status, patients.id, patients.phone") ->join('users', 'users.id = patients.user_id') ->where('users.role', 'patient') ->orderBy($sortColumn, $sortDir) ->findAll(); } public function getLatestPatients(int $limit = 5): array { return $this->select("TRIM(CONCAT(COALESCE(users.first_name, ''), ' ', COALESCE(users.last_name, ''))) as name, patients.phone") ->join('users', 'users.id = patients.user_id') ->orderBy('patients.id', 'DESC') ->findAll($limit); } }