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>
44 lines
2.3 KiB
PHP
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";
|