[CLIENT] Nuova Agile: consolidamento documentale lean (36 -> 12) + archiviazione originali
Approccio ISO 27001 agile/lean: i 36 documenti v1.0 sono fusi per tema in 12 documenti consolidati v2.0 (Manuale, 6 politiche, 5 procedure), pubblicati. I 36 originali sono ARCHIVIATI (storico preservato, non cancellati). Idempotenza ignora gli archiviati (fix collisione titolo procedura incidenti). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
6ca78f9669
commit
c05520c7da
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
/**
|
||||
* build_nuova_agile_p8_consolidate.php — Consolidazione lean: pubblica i 12 documenti consolidati (v2.0 da _docs_cons/)
|
||||
* e ARCHIVIA i 36 originali (v1.0). Lo storico resta. 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();
|
||||
function ex(PDO $p,string $s,array $a=[]):void{$st=$p->prepare($s);$st->execute($a);}
|
||||
function one(PDO $p,string $s,array $a=[]){$st=$p->prepare($s);$st->execute($a);return $st->fetch(PDO::FETCH_ASSOC);}
|
||||
$NOW='2026-06-20 16:00:00'; $TODAY='2026-06-20'; $NEXT='2027-06-20'; $ORGID=996003; $RSGSI=326; $PRES=103;
|
||||
$modelId=(int)one($pdo,"SELECT id FROM isms_models WHERE organization_id=?",[$ORGID])['id'];
|
||||
|
||||
/* 1) Inserisci + pubblica i 12 consolidati (v2.0) */
|
||||
$dir=__DIR__.'/_docs_cons'; $files=glob($dir.'/*.html'); sort($files);
|
||||
$ins=0;$skip=0;
|
||||
foreach($files as $f){
|
||||
$raw=file_get_contents($f); $nl=strpos($raw,"\n");
|
||||
$meta=substr($raw,0,$nl); $body=ltrim(substr($raw,$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"; continue; }
|
||||
[$_,$dt,$title,$ver]=$mm; $title=trim($title);
|
||||
if(one($pdo,"SELECT id FROM isms_documents WHERE isms_model_id=? AND title=? AND status<>'archived'",[$modelId,$title])){ echo " = $title\n"; $skip++; continue; }
|
||||
ex($pdo,"INSERT INTO isms_documents (isms_model_id,organization_id,doc_type,title,status,ai_generated,body_html,version,
|
||||
approved_by,approved_at,reviewed_by,reviewed_at,published_by,published_at,effective_date,next_review_date,created_by,created_at,updated_at)
|
||||
VALUES (?,?,?,?, 'published',1,?, ?, ?,?,?,?,?,?,?,?, ?,?,?)",
|
||||
[$modelId,$ORGID,$dt,$title,$body,$ver, $RSGSI,$NOW,$RSGSI,$NOW,$PRES,$NOW,$TODAY,$NEXT, $RSGSI,$NOW,$NOW]);
|
||||
$did=(int)$pdo->lastInsertId();
|
||||
ex($pdo,"INSERT INTO isms_document_versions (document_id,isms_model_id,organization_id,version,status,body_html,change_note,created_by,created_at)
|
||||
VALUES (?,?,?,?, 'published', ?, ?, ?, ?)",
|
||||
[$did,$modelId,$ORGID,$ver,$body,'Pubblicazione versione '.$ver.' (consolidamento lean)',$PRES,$NOW]);
|
||||
echo " + [$dt] $title\n"; $ins++;
|
||||
}
|
||||
echo "CONSOLIDATI: +$ins pubblicati v2.0 (skip $skip)\n";
|
||||
|
||||
/* 2) Archivia gli originali v1.0 ancora pubblicati (i 36 superati dal consolidamento) */
|
||||
$toArch=$pdo->query("SELECT id,title FROM isms_documents WHERE isms_model_id=$modelId AND status='published' AND version='1.0'")->fetchAll(PDO::FETCH_ASSOC);
|
||||
$arc=0;
|
||||
foreach($toArch as $d){
|
||||
ex($pdo,"UPDATE isms_documents SET status='archived', archived_at=?, updated_at=? WHERE id=?",[$NOW,$NOW,$d['id']]);
|
||||
$arc++;
|
||||
}
|
||||
echo "ARCHIVIATI: $arc originali v1.0\n";
|
||||
|
||||
/* 3) Riepilogo */
|
||||
echo "--- stato finale documenti (model $modelId) ---\n";
|
||||
foreach($pdo->query("SELECT status, version, COUNT(*) c FROM isms_documents WHERE isms_model_id=$modelId GROUP BY status,version ORDER BY status,version")->fetchAll(PDO::FETCH_ASSOC) as $r)
|
||||
echo " {$r['status']} v{$r['version']}: {$r['c']}\n";
|
||||
echo "FASE 8 (consolidamento) OK\n";
|
||||
Reference in New Issue
Block a user