query( "SELECT DISTINCT name FROM users WHERE activo = 1 AND role IN ('socio','abogado') AND name != '' ORDER BY name ASC" )->fetchAll(); return array_map(fn($r) => $r['name'], $rows); } /** Usuarios activos para el picker de Involucrados (sin admins ni placeholders). */ public static function involucrablesUsers(): array { $rows = Db::pdo()->query( "SELECT id, email, name, role FROM users WHERE activo = 1 AND role != 'admin' AND email NOT LIKE 'placeholder-%' ORDER BY name ASC, email ASC" )->fetchAll(); foreach ($rows as &$r) { $r['id'] = (int)$r['id']; } return $rows; } /** * Todos los users para el Panel de Control. * Si $includeAdmins es false, oculta el rol admin (uso para socios). */ public static function allUsers(bool $includeAdmins = true): array { $sql = "SELECT id, email, name, role, activo, first_seen_at, last_login_at FROM users"; if (!$includeAdmins) $sql .= " WHERE role != 'admin'"; $sql .= " ORDER BY name ASC, email ASC"; $rows = Db::pdo()->query($sql)->fetchAll(); foreach ($rows as &$r) { $r['id'] = (int)$r['id']; $r['activo'] = (int)$r['activo']; } return $rows; } /** id del usuario por email; null si no existe. */ public static function userIdByEmail(string $email): ?int { $stmt = Db::pdo()->prepare('SELECT id FROM users WHERE email = :e'); $stmt->execute([':e' => $email]); $id = $stmt->fetchColumn(); return $id === false ? null : (int)$id; } }