diff --git a/application/cli/migrate_062_feedback_provenance.php b/application/cli/migrate_062_feedback_provenance.php new file mode 100644 index 0000000..2e8808b --- /dev/null +++ b/application/cli/migrate_062_feedback_provenance.php @@ -0,0 +1,11 @@ +query('SELECT DATABASE()')->fetchColumn(); +function addc($p,$db,$t,$c,$ddl){ $s=$p->prepare("SELECT 1 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=? AND TABLE_NAME=? AND COLUMN_NAME=?"); $s->execute([$db,$t,$c]); if($s->fetchColumn()){echo " = $t.$c\n";return;} $p->exec("ALTER TABLE `$t` ADD COLUMN $ddl"); echo " + $t.$c\n"; } +echo "Mig 062 — version-provenance feedback_reports\n"; +addc($pdo,$db,'feedback_reports','client_surface',"client_surface VARCHAR(16) NULL"); +addc($pdo,$db,'feedback_reports','client_version',"client_version VARCHAR(32) NULL"); +addc($pdo,$db,'feedback_reports','client_build', "client_build VARCHAR(64) NULL"); +echo "FATTO. Prossima mig=063.\n"; diff --git a/application/controllers/FeedbackController.php b/application/controllers/FeedbackController.php index 9b4afe9..0d0c952 100644 --- a/application/controllers/FeedbackController.php +++ b/application/controllers/FeedbackController.php @@ -40,6 +40,10 @@ class FeedbackController extends BaseController $descrizione = trim($body['descrizione'] ?? ''); $pageUrl = trim($body['page_url'] ?? ''); $attachment = $body['attachment'] ?? null; // base64 string + // version-provenance (std feedback-version-provenance): superficie + release REALE del prodotto + build + $clientSurface = substr(trim((string) ($body['client_surface'] ?? '')), 0, 16) ?: null; + $clientVersion = substr(trim((string) ($body['client_version'] ?? '')), 0, 32) ?: null; + $clientBuild = substr(trim((string) ($body['client_build'] ?? '')), 0, 64) ?: null; if (strlen($descrizione) < 10) { $this->jsonError('Descrizione troppo breve (minimo 10 caratteri).', 422); @@ -67,6 +71,9 @@ class FeedbackController extends BaseController 'descrizione' => $descrizione, 'page_url' => $pageUrl, 'attachment' => $attachment, + 'client_surface' => $clientSurface, + 'client_version' => $clientVersion, + 'client_build' => $clientBuild, ] ); diff --git a/application/services/FeedbackService.php b/application/services/FeedbackService.php index 8682a2d..ee24088 100644 --- a/application/services/FeedbackService.php +++ b/application/services/FeedbackService.php @@ -45,14 +45,19 @@ class FeedbackService $descrizione = $data['descrizione'] ?? ''; $pageUrl = $data['page_url'] ?? ''; $attachment = $data['attachment'] ?? null; + $clientSurface = $data['client_surface'] ?? null; + $clientVersion = $data['client_version'] ?? null; + $clientBuild = $data['client_build'] ?? null; Database::query( 'INSERT INTO feedback_reports (organization_id, user_id, user_email, user_role, page_url, - tipo, priorita, descrizione, attachment) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)', + tipo, priorita, descrizione, attachment, + client_surface, client_version, client_build) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', [$orgId, $userId, $userEmail, $userRole, $pageUrl, - $tipo, $priorita, $descrizione, $attachment] + $tipo, $priorita, $descrizione, $attachment, + $clientSurface, $clientVersion, $clientBuild] ); $reportId = (int) Database::lastInsertId(); diff --git a/docs/sql/062_feedback_version_provenance.sql b/docs/sql/062_feedback_version_provenance.sql new file mode 100644 index 0000000..a33a06f --- /dev/null +++ b/docs/sql/062_feedback_version_provenance.sql @@ -0,0 +1,5 @@ +-- 062_feedback_version_provenance.sql — version-provenance sulle segnalazioni (std feedback-version-provenance v1.0) +-- Record DDL. Apply autoritativo idempotente: application/cli/migrate_062_feedback_provenance.php +ALTER TABLE feedback_reports ADD COLUMN client_surface VARCHAR(16) NULL; -- web-v1|web-v2|android|ios +ALTER TABLE feedback_reports ADD COLUMN client_version VARCHAR(32) NULL; -- release REALE del prodotto (NON la versione del widget) +ALTER TABLE feedback_reports ADD COLUMN client_build VARCHAR(64) NULL; diff --git a/public/js/feedback.js b/public/js/feedback.js index c5dc4f9..57ce89e 100644 --- a/public/js/feedback.js +++ b/public/js/feedback.js @@ -44,6 +44,7 @@ let _currentReportId = null; let _attachmentBase64 = null; let _myReports = []; + let _appVer = null; // version-provenance: release REALE del prodotto (da /version.json) // ── Init ────────────────────────────────────────────────────────────────── @@ -360,12 +361,18 @@ _setSubmitting(true); + // version-provenance: release REALE del prodotto + superficie + build (std feedback-version-provenance) + if (!_appVer) { try { _appVer = await (await fetch('/version.json?_=' + Date.now())).json(); } catch (e) { _appVer = {}; } } + const payload = { tipo, priorita, descrizione, page_url: pageUrl, attachment: _attachmentBase64 || null, + client_surface: 'web-v2', + client_version: (_appVer && _appVer.version) || null, + client_build: (_appVer && _appVer.build) || null, }; try { diff --git a/public/version.json b/public/version.json index 54d4eaa..63fb13e 100644 --- a/public/version.json +++ b/public/version.json @@ -1 +1 @@ -{"version": "1.24.3", "build": "2026-06-20-v1.24.3", "date": "2026-06-20", "changelog": "Allineamento help/traduzioni/AI per la gestione documentale SGSI: (1) Help contestuale — aggiunta in Impostazioni la sezione 'Permessi documentali (ciclo di vita SGSI)' e completata la guida del Modello SGSI su editor, download Word singolo/unico e ciclo di vita; (2) Traduzioni — matrice Permessi documentali resa bilingue IT/EN (azioni, ruoli, suggerimenti); (3) AI/KB — ingerito nella knowledge base RAG (nis2_kb, scope SYSTEM) il documento 'Gestione documentale SGSI' (ciclo di vita, export Word, editor, permessi), cosi' l'assistente puo' guidare l'utente su queste funzioni."} +{"version": "1.24.4", "build": "2026-06-20-v1.24.4", "date": "2026-06-20", "changelog": "Version-provenance sulle segnalazioni (standard feedback-version-provenance): la tabella feedback_reports ora salva client_surface (web-v2), client_version (release reale del prodotto) e client_build; il backend (FeedbackController/FeedbackService) li persiste e il widget di segnalazione (feedback.js) li invia leggendo /version.json. Migrazione 062. Re-ingest nella KB della guida UI V2 corretta (sostituiti i chunk stale)."}