Files
nis2-agile/application/cli/build_nuova_agile_p9_crossrefs.php
T
DevEnv nis2-agileandClaude Opus 4.8 27bbed3ec9 [CLIENT] Nuova Agile: allineati i riferimenti incrociati post-consolidamento
Dopo la fusione 36->12, corretti i rinvii nei 12 documenti pubblicati: 'Politica per la Sicurezza delle Informazioni' -> 'Politica Generale...'; rinvii a 'Procedura di Controllo dei Documenti' -> 'Procedura di Governance del SGSI'; rinvio all'Istruzione Hardening (assorbita) -> regole di hardening nella Politica Uso Accettabile/Dispositivi/Remoto; riscritta la sez.8 'Struttura documentale' del Manuale sui 12 documenti. Aggiornati anche gli snapshot v2.0. Auto-referenze interne (minuscole) lasciate invariate.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 15:42:40 +02:00

54 lines
3.5 KiB
PHP

<?php
/**
* build_nuova_agile_p9_crossrefs.php — Allinea i riferimenti incrociati nei 12 documenti consolidati
* (dopo il consolidamento 36->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";