12). Aggiorna body_html + lo snapshot v2.0. IDEMPOTENTE. */ if (PHP_SAPI !== 'cli') { http_response_code(403); exit("CLI only\n"); } require_once __DIR__ . '/../config/env.php'; require_once __DIR__ . '/../config/database.php'; $pdo = Database::getInstance(); $NOW='2026-06-20 16:30:00'; $modelId=3; $manSec8Old = '/La documentazione è organizzata su livelli gerarchici:.*?qui esposti\./su'; $manSec8New = 'La documentazione segue un approccio lean ed è organizzata su pochi livelli: (1) Manuale SGSI e Politica Generale per la Sicurezza delle Informazioni; ' .'(2) cinque politiche tematiche consolidate — Controllo degli accessi, Crittografia e gestione delle chiavi, Uso accettabile/dispositivi/lavoro da remoto, ' .'Sicurezza del cloud e protezione dei dati, Gestione dei fornitori; (3) cinque procedure operative consolidate — Gestione del rischio, Gestione degli incidenti e ' .'notifica NIS2, Continuità/backup/ripristino, Gestione operativa e sviluppo sicuro, Governance del SGSI; (4) registrazioni ed evidenze raccolte automaticamente ' .'dalla piattaforma. In totale 12 documenti vivi, soggetti a controllo di versione, approvazione e revisione periodica (A.5.37); le versioni precedenti restano ' .'archiviate per tracciabilità.'; function fix(string $b): array { $log=[]; $b2=str_replace('Politica per la Sicurezza delle Informazioni','Politica Generale per la Sicurezza delle Informazioni',$b,$c1); if($c1){$b=$b2;$log[]="rinomina Politica Generale ($c1)";} $b2=str_replace('Procedura di Controllo dei Documenti','Procedura di Governance del SGSI',$b,$c2); if($c2){$b=$b2;$log[]="rinvio->Governance del SGSI ($c2)";} $b2=preg_replace('/l[\x{2019}\x{0027}]Istruzione Hardening/u','le regole di hardening della Politica di Uso Accettabile, Dispositivi e Lavoro da Remoto',$b,-1,$c3); if($c3){$b=$b2;$log[]="istruzione hardening assorbita ($c3)";} return [$b,$log]; } $docs=$pdo->query("SELECT id,title,body_html FROM isms_documents WHERE isms_model_id=$modelId AND status='published' ORDER BY id")->fetchAll(PDO::FETCH_ASSOC); $tot=0; foreach($docs as $d){ [$nb,$log]=fix($d['body_html']); // sezione 8 del Manuale if(strpos($d['title'],'approccio agile')!==false){ $nb2=preg_replace($manSec8Old,$manSec8New,$nb,-1,$cm); if($cm){$nb=$nb2;$log[]="Manuale sez.8 struttura documentale ($cm)";} } if($nb!==$d['body_html']){ $st=$pdo->prepare("UPDATE isms_documents SET body_html=?, updated_at=? WHERE id=?"); $st->execute([$nb,$NOW,$d['id']]); // aggiorna lo snapshot v2.0 più recente $v=$pdo->prepare("SELECT id FROM isms_document_versions WHERE document_id=? AND version='2.0' ORDER BY id DESC LIMIT 1"); $v->execute([$d['id']]); $vid=$v->fetchColumn(); if($vid){ $u=$pdo->prepare("UPDATE isms_document_versions SET body_html=? WHERE id=?"); $u->execute([$nb,$vid]); } echo " ~ {$d['title']}: ".implode(', ',$log)."\n"; $tot++; } } echo "DOCUMENTI corretti: $tot / ".count($docs)."\n"; /* verifica residui */ $res=$pdo->query("SELECT COUNT(*) FROM isms_documents WHERE isms_model_id=$modelId AND status='published' AND (body_html LIKE '%Politica per la Sicurezza delle Informazioni%' OR body_html LIKE '%Procedura di Controllo dei Documenti%' OR body_html LIKE '%Istruzione Hardening%')")->fetchColumn(); echo "Riferimenti obsoleti residui nei pubblicati: $res (atteso 0)\n"; echo "FASE 9 (riferimenti incrociati) OK\n";