query($sql); } self::ensureColumn( 'department_lanes', 'machine_type_id', 'ALTER TABLE department_lanes ADD COLUMN machine_type_id INT NULL AFTER dynamic_image_id' ); self::ensureColumn( 'department_lanes', 'selfserve_enabled', 'ALTER TABLE department_lanes ADD COLUMN selfserve_enabled TINYINT(1) NOT NULL DEFAULT 1 AFTER machine_type_id' ); self::ensureColumn( 'department_selfserve_conditions', 'machine_type_id', 'ALTER TABLE department_selfserve_conditions ADD COLUMN machine_type_id INT NULL AFTER product' ); self::ensureColumn( 'department_selfserve_tasks', 'machine_type_id', 'ALTER TABLE department_selfserve_tasks ADD COLUMN machine_type_id INT NULL AFTER product' ); self::ensureColumn( 'department_selfserve_tasks', 'gate_type', "ALTER TABLE department_selfserve_tasks ADD COLUMN gate_type VARCHAR(16) NULL DEFAULT 'ALWAYS' AFTER condition_id" ); self::ensureColumn( 'department_selfserve_tasks', 'gate_ref_id', 'ALTER TABLE department_selfserve_tasks ADD COLUMN gate_ref_id INT NULL AFTER gate_type' ); self::ensureColumn( 'selfserve_wash_session_tasks', 'dynamic_images_vehicle_type', 'ALTER TABLE selfserve_wash_session_tasks ADD COLUMN dynamic_images_vehicle_type INT NULL AFTER buttons' ); self::ensureColumn( 'selfserve_wash_sessions', 'wash_started_at', 'ALTER TABLE selfserve_wash_sessions ADD COLUMN wash_started_at DATETIME NULL AFTER machine_start_triggered_at' ); self::$initialized = true; } public static function tableHasColumn(string $table, string $column): bool { global $db; $table = $db->escape_string($table); $column = $db->escape_string($column); $database = $db->escape_string($db->getDatabase()); $sql = "SELECT COUNT(*) AS c FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = '$database' AND TABLE_NAME = '$table' AND COLUMN_NAME = '$column'"; $result = $db->query($sql); if (!$result) { return false; } $row = $result->fetch_assoc(); return ((int)($row['c'] ?? 0)) > 0; } public static function ensureColumn(string $table, string $column, string $alterSql): void { global $db; if (self::tableHasColumn($table, $column)) { return; } $db->query($alterSql); } }