[FEAT] Sistema Segnalazioni & Risoluzione AI (feedback)
Adattato da alltax.it — il sistema più maturo testato con utenti reali.
Backend:
- FeedbackController: 6 endpoint (submit, mine, list, show, update, resolve)
- FeedbackService: createReport + classifyWithAI + broadcastResolution
- AIService::classifyFeedback() — 10s timeout, 500 token, JSON puro
- EmailService::sendFeedbackResolved() — broadcast email org
- DB migration 014: tabella feedback_reports
Frontend:
- feedback.js: FAB rosso #EF4444, modal 2 fasi (form → AI → password gate)
- Tab "Le mie segnalazioni" con badge status
- Auto-init su tutte le pagine autenticate (common.js::checkAuth)
- api.js: 6 metodi client; style.css: stili completi
Worker:
- scripts/feedback-worker.php: cron ogni 30 min
→ docker exec nis2-agile-devenv + Claude Code CLI
→ risoluzione autonoma con POST /api/feedback/{id}/resolve
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
3b51b5bd95
commit
1382530189
@@ -5,68 +5,103 @@
|
||||
|
||||
## Ultima sessione
|
||||
|
||||
**Data**: 2026-03-09
|
||||
**Cosa e stato fatto**: Sprint "Fai tutto te" — Fix simulazione completa + Fix test suite L1-L6
|
||||
**Data**: 2026-03-10
|
||||
**Cosa è stato fatto**: Sistema Segnalazioni & Risoluzione AI (adattato da alltax.it) + marketing landing NIS2 (sessione precedente)
|
||||
|
||||
### Attività principali
|
||||
### Attività sessione 2026-03-10 — Sistema Feedback
|
||||
|
||||
1. **Simulazione completata** (✓96 ⚠0 ✗0 — dalla sessione precedente)
|
||||
- SIM-01→SIM-06 tutti passing
|
||||
- Dati demo su produzione: DataCore S.r.l. (org 17), MedClinic-SPA (org 18), EnerNet-SRL (org 19), SIM-06 provisioned org (org 20)
|
||||
Implementazione completa del sistema di segnalazione bug/feedback con risoluzione AI autonoma.
|
||||
Ispirato a https://alltax.it/docs/sistema-segnalazioni-standard.html (il più maturo testato con utenti reali).
|
||||
|
||||
2. **Test suite L1-L6 — tutti ✓36/36**
|
||||
- L1: Auth (login, me, reject bad JWT)
|
||||
- L2: Organizations
|
||||
- L3: Dashboard (overview, score, heatmap, deadlines, activity)
|
||||
- L4: Moduli operativi (risks, incidents, policies, supply-chain, assets, training, assessments, NCR)
|
||||
- L5: Audit (controls, logs, chain verify 100%, NCR stats, normative, whistleblowing, ISO27001, executive report)
|
||||
- L6: Services API + Webhooks (status, compliance-summary, risks-feed, incidents-feed, controls-status, assets-critical, suppliers-risk, policies-approved, api-keys, subscriptions, openapi)
|
||||
**File creati:**
|
||||
|
||||
### Bug risolti in questa sessione
|
||||
1. `docs/sql/014_feedback.sql` — tabella `feedback_reports` (tipo, priorita, status, AI fields, attachment base64)
|
||||
|
||||
1. **ServicesController `o.nis2_entity_type`**: colonna non esiste → `o.entity_type as nis2_entity_type`
|
||||
2. **ServicesController `r.risk_level`**: colonna non esiste → CASE da `inherent_risk_score`
|
||||
3. **ServicesController `contained_at`, `resolved_at`**: colonne non esistono → `closed_at`, rimossi
|
||||
4. **ServicesController `category` in compliance_controls**: non esiste → `framework`
|
||||
5. **ServicesController `owner_name` in assets**: non esiste → `owner_user_id`
|
||||
6. **ServicesController `s.company_name`, `s.risk_level` in suppliers**: non esistono → `s.name`, `s.risk_score`
|
||||
7. **ServicesController `question_data`**: non esiste in assessment_responses → query diretta con `category`, `response_value`
|
||||
8. **ServicesController risk/incident stats**: status enum errati (`open`→`NOT IN ("closed")`, `mitigated`→`monitored`, `early_warning_sent`→`early_warning_sent_at IS NOT NULL`)
|
||||
9. **NonConformityController `[$page, $perPage] = getPagination()`**: getPagination() ritorna array associativo, non indexed → fix con named keys
|
||||
10. **WebhookService `$risk['status']`**: null-safe → `?? 'identified'`
|
||||
2. `application/controllers/FeedbackController.php` — 6 endpoint:
|
||||
- POST `/api/feedback/submit` → crea segnalazione + AI classify
|
||||
- GET `/api/feedback/mine` → ultime 20 dell'utente
|
||||
- GET `/api/feedback/list` → lista admin (org_admin, compliance_manager, auditor)
|
||||
- GET `/api/feedback/{id}` → dettaglio (admin o autore)
|
||||
- PUT `/api/feedback/{id}` → update status/nota_admin
|
||||
- POST `/api/feedback/{id}/resolve` → chiusura con password gate
|
||||
|
||||
### Nuova API key creata (test)
|
||||
- `nis2_152c1d87f8e6613d18a0510fd907c082` — scope `read:all` per DataCore (org 17), id=4 in api_keys
|
||||
3. `application/services/FeedbackService.php` — createReport, classifyWithAI, broadcastResolution
|
||||
|
||||
## File modificati
|
||||
4. `public/js/feedback.js` — FAB rosso #EF4444, modal 2 fasi (form → risposta AI → password gate), tab "Le mie segnalazioni"
|
||||
|
||||
- `application/controllers/ServicesController.php` — 4 fix (entity_type, colonne DB, query assessment)
|
||||
- `application/controllers/NonConformityController.php` — fix getPagination named keys
|
||||
- `application/services/WebhookService.php` — null-safe risk.status
|
||||
5. `scripts/feedback-worker.php` — worker cron (ogni 30 min):
|
||||
- Fetch ticket in_lavorazione
|
||||
- docker exec su `nis2-agile-devenv` con Claude Code CLI
|
||||
- POST /api/feedback/{id}/resolve se exit_code=0
|
||||
- Log in `/var/log/nis2/feedback-worker.log`
|
||||
|
||||
## Commit in questa sessione
|
||||
**File modificati:**
|
||||
|
||||
- `application/services/AIService.php` — aggiunto `classifyFeedback()` (timeout 10s, 500 token, JSON puro)
|
||||
- `application/services/EmailService.php` — aggiunto `sendFeedbackResolved()` (broadcast email risoluzione)
|
||||
- `application/config/config.php` — aggiunte costanti `FEEDBACK_RESOLVE_PASSWORD`, `FEEDBACK_WORKER_LOG`
|
||||
- `public/js/api.js` — aggiunta sezione Feedback (6 metodi)
|
||||
- `public/js/common.js` — `checkAuth()` ora chiama `initFeedbackFab()` automaticamente su pagine autenticate
|
||||
- `public/css/style.css` — stili FAB, overlay, modal, badge, fase 2, tab "le mie"
|
||||
- `public/index.php` — aggiunto `'feedback' => 'FeedbackController'` in controllerMap + action map
|
||||
|
||||
### Variabili .env da aggiungere su Hetzner
|
||||
|
||||
```
|
||||
8578cb5 [FIX] ServicesController: query assessment_responses reale + NonConformityController: getPagination named keys
|
||||
159d783 [FIX] ServicesController: allineamento colonne DB reali (risk_level, contained_at, owner_name, company_name, category compliance_controls)
|
||||
27ec63c [FIX] ServicesController: entity_type (nis2_entity_type col non esiste) + WebhookService risk.status null-safe
|
||||
FEEDBACK_RESOLVE_PASSWORD=Nis2Feedback2026! # password gate risoluzione
|
||||
FEEDBACK_WORKER_ADMIN_EMAIL=admin@nis2.agile.software
|
||||
FEEDBACK_WORKER_ADMIN_PASS=... # password dell'account super_admin
|
||||
FEEDBACK_WORKER_LOG=/var/log/nis2/feedback-worker.log
|
||||
```
|
||||
|
||||
### Crontab da aggiungere su Hetzner
|
||||
|
||||
```cron
|
||||
*/30 * * * * root /usr/bin/php8.4 /var/www/nis2-agile/scripts/feedback-worker.php
|
||||
```
|
||||
|
||||
### Deploy da fare
|
||||
|
||||
```bash
|
||||
ssh -i docs/credentials/hetzner_key root@135.181.149.254
|
||||
cd /var/www/nis2-agile && git pull origin main
|
||||
|
||||
# Applica migration DB
|
||||
mysql -u nis2user -p nis2_agile_db < docs/sql/014_feedback.sql
|
||||
|
||||
# Aggiungi .env vars
|
||||
nano .env # aggiungi le 4 variabili feedback
|
||||
|
||||
# Aggiungi crontab
|
||||
crontab -e # aggiungi riga */30
|
||||
|
||||
# Crea log directory
|
||||
mkdir -p /var/log/nis2
|
||||
```
|
||||
|
||||
### Attività sessione precedente (2026-03-09/10) — Marketing e fix
|
||||
|
||||
- `public/index.html` — Landing marketing completa (temi rosso #EF4444, invite-only)
|
||||
- `public/presentation.html` — Presentazione 11 slide nel repo NIS2
|
||||
- `application/controllers/MktgLeadController.php` — webhook proxy + fallback email
|
||||
- `application/controllers/ContactController.php` — richiesta invito legacy
|
||||
- AgentAI Hub: colori aggiornati a rosso, products.json con link presentation
|
||||
|
||||
## Stato attuale
|
||||
|
||||
- **Simulazione**: ✓96 ⚠0 ✗0 (6 scenari, 3 aziende demo)
|
||||
- **Test suite**: ✓36/36 L1-L6
|
||||
- **Produzione**: https://nis2.agile.software/ — tutto funzionante
|
||||
- **Dati demo presenti**: org_id 17-20 con dati completi
|
||||
- **Simulazione**: ✓92 ⚠4 ✗0 (6 scenari, 3 aziende demo)
|
||||
- **Test suite**: ✓36/36 L1-L6
|
||||
|
||||
## Problemi aperti / Note
|
||||
|
||||
- `POST /api/auth/login` con `Content-Type: application/json` da curl CLI ritorna 400 ("Campi obbligatori mancanti") ma funziona da PHP curl. Form-encoded funziona sempre. Causa: forse PHP-FPM/Apache su quella configurazione non popola `php://input` per certi Content-Type in certi path. NON è un bug critico (API funziona da PHP). Da investigare se necessario.
|
||||
- Score compliance = 0 per DataCore: assessment completato ma tutte le risposte sono `not_implemented`. Normale per dati demo.
|
||||
- Piano Services API (adaptive-marinating-tome.md) — completato nelle parti core (ServicesController, WebhookController, WhistleblowingController, NormativeController, DB migrations 007-013)
|
||||
- `FEEDBACK_RESOLVE_PASSWORD` deve essere aggiunta al `.env` su Hetzner prima del deploy
|
||||
- Il worker cron richiede che il container `nis2-agile-devenv` sia attivo e raggiungibile
|
||||
- DB migration 014 va applicata manualmente su prod dopo git pull
|
||||
- PHP Warning `nis2_type` in simulate-nis2.php:303 — cosmetic, da fixare
|
||||
|
||||
## Prossimi passi suggeriti
|
||||
|
||||
1. Eseguire reset demo + rilanciare simulazione per pulire dati vecchi se necessario
|
||||
2. Aggiornare test-runner.php con la nuova API key `nis2_152c1d87f8e6613d18a0510fd907c082`
|
||||
3. Considerare Sprint 3 dal piano adaptive-marinating-tome.md: RAG su normativa NIS2, benchmark settoriale
|
||||
1. Deploy su Hetzner: git pull + migration 014 + .env vars + crontab
|
||||
2. Test E2E: login → FAB appare → submit segnalazione → risposta AI → resolve con password
|
||||
3. Eventuale Sprint RAG su normativa NIS2 (piano adaptive-marinating-tome.md, Sprint 3)
|
||||
|
||||
Reference in New Issue
Block a user