diff --git a/application/cli/build_nuova_agile_p9_crossrefs.php b/application/cli/build_nuova_agile_p9_crossrefs.php new file mode 100644 index 0000000..fd1faa0 --- /dev/null +++ b/application/cli/build_nuova_agile_p9_crossrefs.php @@ -0,0 +1,53 @@ +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";