[FEAT] Help online feedback, traduzioni IT/EN, AI system prompt aggiornato

- help.js: nuova sezione 'feedback' con 6 sotto-sezioni (come usare FAB,
  risposta AI, password gate, le mie segnalazioni, worker autonomo, consigli)
- i18n.js: 30 chiavi IT/EN per tutto il sistema feedback
- AIService::callAPI: system prompt esteso con lista completa moduli NIS2 Agile
- AIService::classifyFeedback: system prompt NIS2-aware

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
DevEnv nis2-agile 2026-03-10 09:05:12 +01:00
parent 3a382d34be
commit c52766953d
3 changed files with 128 additions and 3 deletions

View File

@ -197,7 +197,27 @@ PROMPT;
*/
private function callAPI(string $prompt, ?string $systemPrompt = null): string
{
$system = $systemPrompt ?? 'Sei un esperto consulente di cybersecurity e compliance NIS2. Rispondi sempre in italiano in modo professionale e accurato.';
$system = $systemPrompt ?? <<<SYSTEM
Sei un esperto consulente di cybersecurity e compliance NIS2, integrato nella piattaforma SaaS "NIS2 Agile".
Moduli della piattaforma che conosci:
- Gap Analysis (80 domande, 10 categorie Art.21)
- Risk Management (registro rischi ISO 27005, matrice 5×5)
- Incident Management (flussi Art.23: early warning 24h, notifica 72h, report 30d)
- Policy Management (generazione e approvazione policy NIS2)
- Supply Chain (valutazione fornitori, risk scoring)
- Training (assegnazione corsi, compliance Art.20)
- Asset Inventory (asset critici, dipendenze)
- Audit & Report (controlli, evidenze, export CSV)
- NCR/CAPA (non conformità, azioni correttive)
- Whistleblowing (segnalazioni anomalie Art.32)
- Normative Updates (feed NIS2/ACN/DORA con ACK)
- Segnalazioni Feedback (bug reporting con risoluzione autonoma AI)
- Services API (endpoint pubblici per integrazioni B2B)
Rispondi sempre in italiano, in modo professionale, preciso e conciso.
Non includere dati identificativi dell'organizzazione nelle risposte.
SYSTEM;
$body = [
'model' => $this->model,
@ -351,7 +371,7 @@ PROMPT;
CURLOPT_POSTFIELDS => json_encode([
'model' => $this->model,
'max_tokens' => 500,
'system' => 'Sei un assistente tecnico. Rispondi SEMPRE con JSON puro, senza markdown né testo aggiuntivo.',
'system' => 'Sei l\'assistente tecnico di NIS2 Agile, piattaforma SaaS per compliance NIS2. Conosci tutti i moduli: gap analysis, rischi, incidenti, policy, supply chain, formazione, asset, audit, NCR/CAPA, whistleblowing, normative, feedback. Rispondi SEMPRE con JSON puro, senza markdown né testo aggiuntivo.',
'messages' => [['role' => 'user', 'content' => $prompt]],
]),
CURLOPT_RETURNTRANSFER => true,

View File

@ -563,6 +563,73 @@ const HelpSystem = (function () {
'D.Lgs. 138/2024 - Recepimento NIS2 in Italia',
'ACN - Linee guida attuative per i soggetti NIS2'
]
},
// ─── Segnalazioni (Feedback) ─────────────────────────────────
'feedback': {
title: 'Guida - Segnalazioni & Feedback',
intro: 'Il sistema di segnalazioni ti permette di comunicare direttamente con il team tecnico di NIS2 Agile. Puoi segnalare bug, proporre miglioramenti, fare domande o richiedere nuove funzionalita\'. L\'intelligenza artificiale analizza ogni segnalazione in tempo reale e tenta la risoluzione autonoma.',
sections: [
{
heading: 'Come aprire una segnalazione',
items: [
'Clicca il <strong>pulsante rosso</strong> <i class="fas fa-comment-alt"></i> in basso a destra — visibile su tutte le pagine quando sei autenticato.',
'Scegli il <strong>tipo</strong>: Bug/Errore, Miglioramento interfaccia, Nuova funzionalita\', Domanda o Altro.',
'Indica la <strong>priorita\' percepita</strong>: Alta (blocca il lavoro), Media (workaround disponibile) o Bassa (miglioria).',
'Descrivi il problema in modo dettagliato: cosa hai fatto, cosa ti aspettavi, cosa e\' successo invece.',
'Puoi allegare uno <strong>screenshot</strong> trascinandolo nell\'area dedicata (max 1.5 MB).',
'L\'URL della pagina viene catturato automaticamente — non devi copiarlo.'
]
},
{
heading: 'Risposta AI immediata',
items: [
'Dopo l\'invio, l\'<strong>AI analizza la segnalazione</strong> entro pochi secondi e mostra una risposta personalizzata.',
'La risposta AI include suggerimenti su come procedere o conferma che il problema e\' stato registrato.',
'L\'AI assegna automaticamente la categoria (es. rischi, incidenti, interfaccia) e la priorita\' tecnica.',
'Se il suggerimento AI ha gia\' risolto il tuo problema, puoi confermarlo con <strong>"Si\', problema risolto"</strong>.'
]
},
{
heading: 'Conferma risoluzione (Password Gate)',
items: [
'Quando clicchi <strong>"Si\', problema risolto"</strong> viene richiesta una <strong>password di conferma</strong>.',
'La password previene chiusure accidentali dei ticket — assicurandosi che la risoluzione sia intenzionale.',
'Se la segnalazione non e\' risolta, scegli <strong>"No, il problema persiste"</strong>: il ticket rimane aperto e il team lo prende in carico.',
'Puoi monitorare lo stato nella tab <strong>"Le mie segnalazioni"</strong>.'
]
},
{
heading: 'Le mie segnalazioni',
items: [
'La tab <strong>"Le mie segnalazioni"</strong> mostra le ultime 20 segnalazioni inviate per questa organizzazione.',
'I badge colorati indicano lo stato: <span style="color:#64748b">Aperto</span>, <span style="color:#f59e0b">In lavorazione</span>, <span style="color:#22c55e">Risolto</span>, <span style="color:#3b82f6">Chiuso</span>.',
'La risposta AI e\' sempre visibile sotto ogni segnalazione.'
]
},
{
heading: 'Risoluzione autonoma AI (Worker)',
items: [
'I ticket marcati <strong>"In lavorazione"</strong> vengono processati automaticamente ogni 30 minuti da un worker AI.',
'Il worker utilizza <strong>Claude Code CLI</strong> per analizzare il codice e applicare correzioni in autonomia.',
'Se la correzione ha successo, il ticket viene marcato come <strong>Risolto</strong> e tutti i membri dell\'organizzazione ricevono una notifica email.',
'I ticket non risolvibili automaticamente rimangono in lavorazione per l\'intervento manuale del team.'
]
},
{
heading: 'Consigli per segnalazioni efficaci',
items: [
'<strong>Sii specifico</strong>: "Il bottone Salva nella pagina Rischi non risponde" e\' meglio di "qualcosa non funziona".',
'<strong>Includi i passi</strong>: "1. Apro la pagina Rischi, 2. Clicco Nuovo Rischio, 3. Compilo il modulo, 4. Il salvataggio da\' errore 500".',
'<strong>Allega screenshot</strong> quando possibile: accelera enormemente la diagnosi.',
'Usa il tipo <strong>Domanda</strong> per richieste di chiarimento sull\'utilizzo della piattaforma.'
]
}
],
references: [
'Sistema ispirato a alltax.it/docs/sistema-segnalazioni-standard.html',
'Risoluzione autonoma tramite Anthropic Claude Code CLI'
]
}
};
@ -592,7 +659,8 @@ const HelpSystem = (function () {
'settings.html': 'settings',
'settings': 'settings',
'workflow.html': 'workflow',
'workflow': 'workflow'
'workflow': 'workflow',
'feedback': 'feedback'
};
// ── Stili CSS (iniettati una sola volta) ─────────────────────────

View File

@ -276,6 +276,43 @@ const I18n = (function () {
Object.assign(_dict, entries);
}
// ── Feedback & Segnalazioni ─────────────────────────────────
addTranslations({
'feedback.fab_title': { it: 'Segnala un problema o un miglioramento', en: 'Report an issue or improvement' },
'feedback.tab_new': { it: 'Nuova segnalazione', en: 'New report' },
'feedback.tab_mine': { it: 'Le mie segnalazioni', en: 'My reports' },
'feedback.tipo_label': { it: 'Tipo', en: 'Type' },
'feedback.tipo_bug': { it: 'Bug / Errore', en: 'Bug / Error' },
'feedback.tipo_ux': { it: 'Miglioramento interfaccia', en: 'UX improvement' },
'feedback.tipo_funzionalita':{ it: 'Nuova funzionalità', en: 'New feature' },
'feedback.tipo_domanda': { it: 'Domanda / Supporto', en: 'Question / Support' },
'feedback.tipo_altro': { it: 'Altro', en: 'Other' },
'feedback.priorita_label': { it: 'Priorità percepita', en: 'Perceived priority' },
'feedback.priorita_alta': { it: 'Alta', en: 'High' },
'feedback.priorita_media': { it: 'Media', en: 'Medium' },
'feedback.priorita_bassa': { it: 'Bassa', en: 'Low' },
'feedback.desc_label': { it: 'Descrizione', en: 'Description' },
'feedback.desc_hint': { it: 'Sii specifico: cosa hai fatto, cosa ti aspettavi, cosa è successo', en: 'Be specific: what you did, what you expected, what happened' },
'feedback.attach_label': { it: 'Screenshot (opzionale)', en: 'Screenshot (optional)' },
'feedback.submit_btn': { it: 'Invia segnalazione', en: 'Submit report' },
'feedback.submitting': { it: 'Analisi AI in corso…', en: 'AI analysis in progress…' },
'feedback.ai_badge': { it: 'Analisi AI completata', en: 'AI analysis complete' },
'feedback.resolve_question': { it: 'Il problema è stato risolto grazie a questo suggerimento?', en: 'Was the problem resolved by this suggestion?' },
'feedback.resolve_yes': { it: 'Sì, problema risolto', en: 'Yes, problem resolved' },
'feedback.resolve_no': { it: 'No, il problema persiste', en: 'No, problem persists' },
'feedback.resolve_password': { it: 'Conferma con password di verifica', en: 'Confirm with verification password' },
'feedback.resolve_confirm': { it: 'Conferma', en: 'Confirm' },
'feedback.resolved_ok': { it: 'Segnalazione marcata come risolta. Grazie per il feedback.', en: 'Report marked as resolved. Thank you for your feedback.' },
'feedback.status_aperto': { it: 'Aperto', en: 'Open' },
'feedback.status_lavorazione': { it: 'In lavorazione', en: 'In progress' },
'feedback.status_risolto': { it: 'Risolto', en: 'Resolved' },
'feedback.status_chiuso': { it: 'Chiuso', en: 'Closed' },
'feedback.empty': { it: 'Nessuna segnalazione ancora. Usala per segnalare problemi!', en: 'No reports yet. Use it to report issues!' },
'feedback.error_short': { it: 'Descrizione troppo breve (minimo 10 caratteri).', en: 'Description too short (minimum 10 characters).' },
'feedback.error_password': { it: 'Password non corretta.', en: 'Incorrect password.' },
'feedback.notif_open': { it: 'Segnalazione registrata. Il team la prenderà in carico.', en: 'Report registered. The team will handle it.' },
});
return { init, getLang, setLang, t, applyTranslations, addTranslations };
})();