diff --git a/application/controllers/IsmsModelController.php b/application/controllers/IsmsModelController.php
index ebed7f3..3bcf051 100644
--- a/application/controllers/IsmsModelController.php
+++ b/application/controllers/IsmsModelController.php
@@ -323,13 +323,16 @@ class IsmsModelController extends BaseController
/** PUT /api/isms/documents/{id} */
public function updateDocument(int $id): void
{
- $this->requireOrgRole(['org_admin', 'compliance_manager']);
+ $this->requireOrgRole(['org_admin', 'compliance_manager', 'board_member']);
$model = $this->requireModel();
$body = $this->getJsonBody();
- $row = Database::fetchOne('SELECT id FROM isms_documents WHERE id = ? AND isms_model_id = ?', [$id, $model['id']]);
+ $row = Database::fetchOne('SELECT id, status FROM isms_documents WHERE id = ? AND isms_model_id = ?', [$id, $model['id']]);
if (!$row) {
$this->jsonError('Documento non trovato', 404, 'NOT_FOUND');
}
+ if (array_key_exists('body_html', $body) && !in_array($row['status'], ['draft', 'review'], true)) {
+ $this->jsonError('Il contenuto è modificabile solo in stato Bozza o In revisione. Crea una nuova versione per modificare un documento pubblicato.', 409, 'NOT_EDITABLE');
+ }
$fields = [];
foreach (['title','body_html'] as $k) {
if (array_key_exists($k, $body)) $fields[$k] = (string) $body[$k];
@@ -506,6 +509,60 @@ class IsmsModelController extends BaseController
exit;
}
+ /** GET /api/isms/documents/{id} — documento completo (per visualizzazione/editor) */
+ public function getDocument(int $id): void
+ {
+ $this->requireOrgAccess();
+ $doc = $this->requireDocument($id);
+ $this->jsonSuccess(['document' => $doc]);
+ }
+
+ /** GET /api/isms/documentsWordAll — scarica l'INTERO set documentale in un unico .doc (Word) */
+ public function exportAllDocumentsWord(): void
+ {
+ $this->requireOrgAccess();
+ $model = $this->requireModel();
+ $org = Database::fetchOne('SELECT name FROM organizations WHERE id = ?', [$this->getCurrentOrgId()]);
+ $orgName = htmlspecialchars((string) ($org['name'] ?? ''));
+ $docs = Database::fetchAll(
+ "SELECT title, doc_type, status, version, body_html, published_at
+ FROM isms_documents WHERE isms_model_id = ? AND status <> 'archived' ORDER BY id",
+ [$model['id']]);
+ $statusLabel = ['draft' => 'Bozza', 'review' => 'In revisione', 'approved' => 'Approvato', 'published' => 'Pubblicato', 'archived' => 'Archiviato'];
+ $pageBreak = "
";
+
+ $cover = "