diff --git a/application/services/AIService.php b/application/services/AIService.php index 7c09be5..1008122 100644 --- a/application/services/AIService.php +++ b/application/services/AIService.php @@ -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 ?? << $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, diff --git a/public/js/help.js b/public/js/help.js index fe20dbb..97d3399 100644 --- a/public/js/help.js +++ b/public/js/help.js @@ -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 pulsante rosso in basso a destra — visibile su tutte le pagine quando sei autenticato.', + 'Scegli il tipo: Bug/Errore, Miglioramento interfaccia, Nuova funzionalita\', Domanda o Altro.', + 'Indica la priorita\' percepita: 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 screenshot 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\'AI analizza la segnalazione 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 "Si\', problema risolto".' + ] + }, + { + heading: 'Conferma risoluzione (Password Gate)', + items: [ + 'Quando clicchi "Si\', problema risolto" viene richiesta una password di conferma.', + 'La password previene chiusure accidentali dei ticket — assicurandosi che la risoluzione sia intenzionale.', + 'Se la segnalazione non e\' risolta, scegli "No, il problema persiste": il ticket rimane aperto e il team lo prende in carico.', + 'Puoi monitorare lo stato nella tab "Le mie segnalazioni".' + ] + }, + { + heading: 'Le mie segnalazioni', + items: [ + 'La tab "Le mie segnalazioni" mostra le ultime 20 segnalazioni inviate per questa organizzazione.', + 'I badge colorati indicano lo stato: Aperto, In lavorazione, Risolto, Chiuso.', + 'La risposta AI e\' sempre visibile sotto ogni segnalazione.' + ] + }, + { + heading: 'Risoluzione autonoma AI (Worker)', + items: [ + 'I ticket marcati "In lavorazione" vengono processati automaticamente ogni 30 minuti da un worker AI.', + 'Il worker utilizza Claude Code CLI per analizzare il codice e applicare correzioni in autonomia.', + 'Se la correzione ha successo, il ticket viene marcato come Risolto 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: [ + 'Sii specifico: "Il bottone Salva nella pagina Rischi non risponde" e\' meglio di "qualcosa non funziona".', + 'Includi i passi: "1. Apro la pagina Rischi, 2. Clicco Nuovo Rischio, 3. Compilo il modulo, 4. Il salvataggio da\' errore 500".', + 'Allega screenshot quando possibile: accelera enormemente la diagnosi.', + 'Usa il tipo Domanda 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) ───────────────────────── diff --git a/public/js/i18n.js b/public/js/i18n.js index 7dada48..bc39295 100644 --- a/public/js/i18n.js +++ b/public/js/i18n.js @@ -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 }; })();