prepare( "SELECT 1 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?" ); $st->execute([$table, $col]); return (bool) $st->fetchColumn(); } function tblExists(PDO $pdo, string $table): bool { $st = $pdo->prepare( "SELECT 1 FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?" ); $st->execute([$table]); return (bool) $st->fetchColumn(); } $adds = [ 'residual_likelihood' => "ADD COLUMN residual_likelihood TINYINT NULL COMMENT 'Probabilita residua 1-5' AFTER impact", 'residual_impact' => "ADD COLUMN residual_impact TINYINT NULL COMMENT 'Impatto residuo 1-5' AFTER residual_likelihood", ]; foreach ($adds as $col => $clause) { if (colExists($pdo, 'org_requisito_state', $col)) { echo " - $col gia presente, skip\n"; continue; } $pdo->exec("ALTER TABLE org_requisito_state $clause"); echo " + aggiunta colonna org_requisito_state.$col\n"; } if (tblExists($pdo, 'requisito_actions')) { echo " - tabella requisito_actions gia presente, skip\n"; } else { $pdo->exec( "CREATE TABLE requisito_actions ( id INT AUTO_INCREMENT PRIMARY KEY, organization_id INT NOT NULL, requisito_id INT NOT NULL, risk_code VARCHAR(64) NULL, description TEXT NOT NULL, status ENUM('bozza','in_corso','archiviata') NOT NULL DEFAULT 'bozza', created_by INT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_reqact_org_req (organization_id, requisito_id, created_at), INDEX idx_reqact_org (organization_id, created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci" ); echo " + creata tabella requisito_actions\n"; } echo "Migrazione 067 — residuo + requisito_actions OK. Prossima mig=068.\n";