[FEAT] Gestione documentale ISMS — ciclo di vita ISO 27001 cl.7.5 + export Word (v1.24.0)
Ogni documento del Modello SGSI ha un ciclo di vita completo Bozza->In revisione->Approvato->Pubblicato->Archiviato con tracciamento (revisore/approvatore/pubblicatore, date, entrata in vigore, prossimo riesame) e storico versioni (snapshot). Download Word .doc modificabile per documento.
- mig.060: stati published/archived + 10 colonne tracciamento + tabella isms_document_versions
- IsmsModelController: submit/approve/publish/reject/archive/newVersion/versions/exportWord + listDocuments arricchito
- index.php: 8 route documents/{id}/(submit|approve|publish|reject|archive|newVersion|versions|word)
- isms.js: UI badge stato + pulsanti transizione + download Word + storico (IT/EN inline); cache-buster
- help.js: sezione 'Ciclo di vita dei documenti (cl.7.5)'
- 31 documenti di Nuova Agile pubblicati v1.0 (build_nuova_agile_p6_publish)
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
94e3a4293e
commit
68694a0f38
@@ -0,0 +1,56 @@
|
||||
<?php
|
||||
/**
|
||||
* migrate_060_isms_doc_lifecycle.php — Ciclo di vita documentale ISMS (ISO 27001 cl.7.5).
|
||||
* Estende isms_documents (stati pubblicato/archiviato + tracciamento + riesame) + tabella versioni.
|
||||
* IDEMPOTENTE: ALTER guardati da information_schema, CREATE TABLE IF NOT EXISTS.
|
||||
*/
|
||||
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();
|
||||
$db = $pdo->query('SELECT DATABASE()')->fetchColumn();
|
||||
function col_exists(PDO $p,string $db,string $t,string $c):bool{
|
||||
$s=$p->prepare("SELECT 1 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=? AND TABLE_NAME=? AND COLUMN_NAME=?");
|
||||
$s->execute([$db,$t,$c]); return (bool)$s->fetchColumn();
|
||||
}
|
||||
function add_col(PDO $p,string $db,string $t,string $c,string $ddl):void{
|
||||
if(col_exists($p,$db,$t,$c)){ echo " = $t.$c\n"; return; }
|
||||
$p->exec("ALTER TABLE `$t` ADD COLUMN $ddl"); echo " + $t.$c\n";
|
||||
}
|
||||
|
||||
echo "Migrazione 060 — ciclo di vita documenti ISMS (db=$db)\n";
|
||||
|
||||
/* 1) Estensione enum stato (idempotente: MODIFY) */
|
||||
$pdo->exec("ALTER TABLE isms_documents MODIFY COLUMN status ENUM('draft','review','approved','published','archived') NOT NULL DEFAULT 'draft'");
|
||||
echo " enum status -> draft/review/approved/published/archived\n";
|
||||
|
||||
/* 2) Colonne di tracciamento del ciclo di vita */
|
||||
add_col($pdo,$db,'isms_documents','reviewed_by', "reviewed_by INT NULL");
|
||||
add_col($pdo,$db,'isms_documents','reviewed_at', "reviewed_at DATETIME NULL");
|
||||
add_col($pdo,$db,'isms_documents','approved_by', "approved_by INT NULL");
|
||||
add_col($pdo,$db,'isms_documents','approved_at', "approved_at DATETIME NULL");
|
||||
add_col($pdo,$db,'isms_documents','published_by', "published_by INT NULL");
|
||||
add_col($pdo,$db,'isms_documents','published_at', "published_at DATETIME NULL");
|
||||
add_col($pdo,$db,'isms_documents','archived_at', "archived_at DATETIME NULL");
|
||||
add_col($pdo,$db,'isms_documents','review_note', "review_note VARCHAR(500) NULL");
|
||||
add_col($pdo,$db,'isms_documents','effective_date',"effective_date DATE NULL");
|
||||
add_col($pdo,$db,'isms_documents','next_review_date',"next_review_date DATE NULL");
|
||||
|
||||
/* 3) Tabella storico versioni (snapshot ad ogni approvazione/pubblicazione) */
|
||||
$pdo->exec("CREATE TABLE IF NOT EXISTS isms_document_versions (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
document_id INT NOT NULL,
|
||||
isms_model_id INT NOT NULL,
|
||||
organization_id INT NOT NULL,
|
||||
version VARCHAR(20) NOT NULL,
|
||||
status VARCHAR(20) NOT NULL,
|
||||
body_html LONGTEXT NULL,
|
||||
change_note VARCHAR(255) NULL,
|
||||
created_by INT NULL,
|
||||
created_at DATETIME NULL,
|
||||
INDEX idx_docver_doc (document_id),
|
||||
INDEX idx_docver_org (organization_id)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
|
||||
echo " tabella isms_document_versions OK\n";
|
||||
|
||||
echo "FATTO. Prossima mig=061.\n";
|
||||
Reference in New Issue
Block a user