Files
nis2-agile/application/cli/build_nuova_agile_p3b_docs.php
DevEnv nis2-agileandClaude Opus 4.8 1c2eced7a4 [CLIENT] Nuova Agile Technology srl (org 996003) — build completo SGSI/NIS2
Provisioning idempotente di un'azienda cliente cloud-only (Aruba/Hetzner/AI, no server in sede, PC portatili):
- Fase 1: org + classificazione NIS2 (important, sub_threshold_candidate/preliminary) + 3 membri esistenti collegati + organigramma 8 ruoli
- Fase 2: 12 asset (NIS2-rilevanti) + 4 fornitori + 10 rischi + gap analysis (80 risposte, 45%)
- Fase 3: ISMS model + SoA 111 controlli (27001/27017/27018) + 31 documenti (Manuale/10 politiche/13 procedure/7 istruzioni)
- Fase 4: 15 piani di controllo periodici + 5 corsi formazione
Documenti AI-redatti con regole fonti-certe (D.Lgs.138/2024 art.23/24/25; 24h/72h/1 mese). Sorgenti in _docs_na/.

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

44 lines
2.3 KiB
PHP

<?php
/**
* build_nuova_agile_p3b_docs.php — FASE 3b: inserisce i 31 documenti SGSI in isms_documents.
* Legge application/cli/_docs_na/*.html (prima riga META, resto = body_html). IDEMPOTENTE per (model,title).
*/
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();
function one(PDO $p, string $sql, array $a = []) { $s=$p->prepare($sql); $s->execute($a); return $s->fetch(PDO::FETCH_ASSOC); }
$NOW='2026-06-20 10:50:00'; $RSGSI=326;
$org=one($pdo,"SELECT id FROM organizations WHERE name=?",['Nuova Agile Technology srl']);
if(!$org) exit("ORG mancante\n"); $orgId=(int)$org['id'];
$m=one($pdo,"SELECT id FROM isms_models WHERE organization_id=?",[$orgId]);
if(!$m) exit("ISMS model mancante: esegui Fase 3a\n"); $modelId=(int)$m['id'];
$dir=__DIR__.'/_docs_na';
$files=glob($dir.'/*.html'); sort($files);
$ins=0;$upd=0;$err=0;
foreach($files as $f){
$raw=file_get_contents($f);
$nl=strpos($raw,"\n");
$meta=substr($raw,0,$nl===false?strlen($raw):$nl);
$body=ltrim(substr($raw,$nl===false?0:$nl+1));
if(!preg_match('/^<!--META\|doc_type=([a-z_]+)\|title=(.+)\|status=(draft|review|approved)\|version=([0-9.]+)-->/',$meta,$mm)){
echo " ! META KO ".basename($f)."\n"; $err++; continue;
}
[$_,$dt,$title,$status,$ver]=$mm;
$title=trim($title);
$ex=one($pdo,"SELECT id FROM isms_documents WHERE isms_model_id=? AND title=?",[$modelId,$title]);
if($ex){
$st=$pdo->prepare("UPDATE isms_documents SET doc_type=?,body_html=?,status=?,version=?,ai_generated=1,updated_at=? WHERE id=?");
$st->execute([$dt,$body,$status,$ver,$NOW,$ex['id']]); $upd++;
echo " ~ ".basename($f)." [$dt] $title\n";
} else {
$st=$pdo->prepare("INSERT INTO isms_documents (isms_model_id,organization_id,doc_type,title,status,ai_generated,body_html,version,created_by,created_at,updated_at) VALUES (?,?,?,?,?,1,?,?,?,?,?)");
$st->execute([$modelId,$orgId,$dt,$title,$status,$body,$ver,$RSGSI,$NOW,$NOW]); $ins++;
echo " + ".basename($f)." [$dt] $title\n";
}
}
echo "\nDOCUMENTI: +$ins inseriti, ~$upd aggiornati, $err errori. (file: ".count($files).")\n";
echo "FASE 3b OK — totale isms_documents per model $modelId: ".one($pdo,"SELECT COUNT(*) c FROM isms_documents WHERE isms_model_id=?",[$modelId])['c']."\n";