Commit Graph

112 Commits

Author SHA1 Message Date
DevEnv nis2-agile
c37423f900 [DOCS] CONTEXT_LAST_SESSION: BigSim v2.0 completata + bug fix log 2026-03-17 15:59:41 +01:00
DevEnv nis2-agile
8045a9273f [FIX] BigSim: asset_type mapping + incident/NCR ENUM values
- createAsset(): type→asset_type mapping + ENUM: ot_system→hardware,
  server→hardware, datacenter→facility (colonna DB è asset_type)
- incidents classification: availability→system_failure,
  unauthorized_access→other, fraud→other (ENUM DB non li contiene)
- NCR severity: high→major (ENUM: minor/major/critical/observation)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-17 15:49:49 +01:00
DevEnv nis2-agile
65c7d8723e [FIX] simulate.html: card BIG + training user_ids array fix
- simulate.html: aggiunta card BIG (10 aziende, 18 fasi) con url
  simulate-nis2-big.php, label BIG in SIM_LABELS, confirm dialog dedicato
- simulate-nis2-big.php: fix training assign user_id → user_ids (array)
  come richiesto da TrainingController::assignCourse()

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-17 15:32:02 +01:00
DevEnv nis2-agile
56df54f8b1 [FEAT] Services API: full-snapshot endpoint + BigSim SSE wrapper
- ServicesController: nuovo endpoint GET /api/services/full-snapshot
  Aggrega gap-analysis, measures, incidents, training, deadlines,
  compliance-summary in una sola chiamata (reduce 6 round-trip → 1)
  Parametro ?days=N per finestra deadlines (default 30, max 365)

- public/index.php: route GET:fullSnapshot aggiunta all'action map services

- public/simulate-nis2-big.php: wrapper SSE per simulate-nis2-big.php
  Esegue il simulatore come sottoprocesso CLI con NIS2_SSE=1 e
  streama l'output al browser tramite Server-Sent Events

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-17 15:16:00 +01:00
DevEnv nis2-agile
a122b49721 [FEAT] Services API: 5 nuovi endpoint lg231 (gap-analysis, measures, incidents, training, deadlines)
- GET /services/gap-analysis — gap per dominio NIS2 Art.21 con mapping MOG 231 pillars
- GET /services/measures — compliance_controls con mog_area e nis2_article derivati
- GET /services/incidents — incidenti con Art.23 CSIRT compliance per step (24h/72h/30d)
- GET /services/training — corsi + completamento board (Art.20 compliance flag)
- GET /services/deadlines — scadenze aggregate da 4 sorgenti con ?days= filter

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-17 14:10:17 +01:00
DevEnv nis2-agile
cfaead6121 [FEAT] CertiSource atti-service.php integration: structured data, PAT auth, ATECO fix
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-17 14:07:16 +01:00
DevEnv nis2-agile
75a678f60e [FEAT] CertiSource atti-service.php integration: structured data, PAT auth, ATECO fix
- VisuraService::fetchFromCertiSource: new atti-service.php API (POST richiesta → polling stato → GET dati)
- Structured data mapping: sedi/ateco_codes/cariche/addetti → formato interno
- mapAtecoToNis2Sector: allineato ENUM DB (digital_infra, water, waste, public_admin, ecc.)
- config.php: CERTISOURCE_API_URL, CERTISOURCE_API_KEY, CERTISOURCE_POLL_MAX/SEC
- PHP 8.4: curl_close → unset,  usato in logAiInteraction

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-17 13:24:03 +01:00
DevEnv nis2-agile
0e2774d1a6 [FIX] BigSim: sector enum (digital_infra/water), VAT skip, rate-limit clear fix (md5 filenames)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 16:06:46 +01:00
DevEnv nis2-agile
90ac82156b [FIX] simulate-nis2-b2b: POST /invites → /invites/create (router mapping)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 15:55:23 +01:00
DevEnv nis2-agile
219479959e [FIX] InviteController requireRole→requireSuperAdmin + OnboardingController add RateLimitService
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 15:54:16 +01:00
DevEnv nis2-agile
8b9a617fd5 [FEAT] Simulatore B2B licenze + registrazione ridotta
- simulate-nis2-b2b.php: 6 scenari autonomi (SIM-B1→B6):
  mktg login, invito con recipient data, validazione pubblica,
  registrazione ridotta, provision org, login con org, API Key M2M
- public/simulate-b2b.html: UI terminale dark con flow diagram e SSE streaming
- public/register.html:
  - Registrazione ridotta: con invito che ha recipient data mostra banner
    "Ciao [Nome]!" + campi pre-compilati read-only + solo password richiesta
  - Post-register con inviteToken: chiama provision automaticamente,
    salva nis2_org_id in localStorage, redirect a dashboard.html

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 15:26:23 +01:00
DevEnv nis2-agile
8304da91b4 [DOCS] Aggiornamento contesto sessione 2026-03-10 2026-03-10 12:04:01 +01:00
DevEnv nis2-agile
e02e0e21d0 [FEAT] licenseExt: sezione dati destinatario pre-compila form + link pronto + modale con recipient data 2026-03-10 12:00:26 +01:00
DevEnv nis2-agile
7bb92b1971 [FEAT] invite: recipient data (nome/cognome/email/piva) pre-compila form registrazione + invite_url->register.html 2026-03-10 11:57:19 +01:00
DevEnv nis2-agile
67560e1758 [UX] register: P.IVA validazione locale + messaggio verde se valida (non blocca su lookup fallito) 2026-03-10 11:39:20 +01:00
DevEnv nis2-agile
d603f3563f [FIX] register.html: ?invite= auto-fill + placeholder corretto; lookup-piva: 500->404 graceful 2026-03-10 11:33:22 +01:00
DevEnv nis2-agile
4143dd31d3 [UX] FAB feedback: pill cyan con label, animazione pulse, stile lg231 2026-03-10 11:27:19 +01:00
DevEnv nis2-agile
397d6a88d2 [FIX] common.js: auto-inject feedback.js su tutte le pagine autenticate 2026-03-10 11:23:31 +01:00
DevEnv nis2-agile
545e01948f [DOCS] Big simulation prompt: 10 aziende, copertura totale API, lg231-pattern 2026-03-10 11:01:13 +01:00
DevEnv nis2-agile
2e83e66932 [FIX] simulate wrapper: PHP_BINARY→php-cli corretto (FPM≠CLI) 2026-03-10 10:51:48 +01:00
DevEnv nis2-agile
49c62ab811 [FIX] simulate: proc_open streaming SSE (pattern lg231) + NIS2_SSE flag
- public/simulate-nis2.php: riscritta con proc_open come lg231 test-runner.
  Lancia simulate-nis2.php come subprocess CLI con NIS2_SSE=1, streama
  ogni riga SSE al browser immediatamente senza buffering Apache/FPM.
  Stderr del subprocess → eventi SSE 'error' visibili nel terminale.

- simulate-nis2.php: aggiunto supporto NIS2_SSE=1 (env var).
  Quando NIS2_SSE=1, IS_CLI=false → output SSE anche da sottoprocesso.
  API_BASE usa sempre server prod in modalità subprocess.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 10:51:05 +01:00
DevEnv nis2-agile
0a3f2d15e2 [FIX] simulate-nis2: rate limit reset + login retry in ensureUser
- autoResetDemo(): cancella tutti i file /tmp/nis2_ratelimit/*.json
  all'avvio così la re-esecuzione immediata non incappa in "Troppi tentativi"
- ensureUser(): aggiunge retry login se register fallisce con "email già
  registrata" (caso in cui dbSeedUser ha inserito l'utente ma il primo
  login aveva avuto un errore transitorio)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 10:37:57 +01:00
DevEnv nis2-agile
459d2bc8cd [FIX] simulate-nis2.php: SSE heartbeat ogni 25s + Apache Timeout 1800
- SSE heartbeat (commento ': heartbeat') ogni 25s in simLog() per mantenere
  viva la connessione attraverso proxy/CDN con timeout 300s (pattern lg231)
- Apache vhost: Timeout 1800 + ProxyTimeout 1800 (su Hetzner direttamente)
  per simulazioni che richiedono 8-12 minuti

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 10:28:28 +01:00
DevEnv nis2-agile
527446f4e3 [FIX] simulate-nis2.php wrapper: set_time_limit(0) per simulazione lunga
max_execution_time=30 in Apache php.ini interrompeva la simulazione dopo 30s.
La simulazione completa richiede 8-12 minuti.
Aggiunto: set_time_limit(0), ignore_user_abort(true), memory_limit=256M.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 10:23:10 +01:00
DevEnv nis2-agile
1876798836 [FIX] simulate.html: wrapper pubblico per simulate-nis2.php fuori DocumentRoot
DocumentRoot è public/ → simulate-nis2.php (root progetto) era 404.
Aggiunto public/simulate-nis2.php: wrapper che imposta NIS2_SIM env
e include il simulatore reale tramite require __DIR__/../simulate-nis2.php.
Aggiornato URL in simulate.html: ../simulate-nis2.php → simulate-nis2.php.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 10:20:19 +01:00
DevEnv nis2-agile
e8b74a7cb7 [FEAT] Simulatore v2: auto-reset, UX migliorata, 6 scenari (lg231-inspired)
- simulate-nis2.php: autoResetDemo() via PDO pulisce dati demo prima di ogni
  run (SIM-01→05), skip per SIM-06 indipendente. Rimuove tutte le tabelle
  org_id>4 eccetto audit_logs (trigger immutabile).
- simulate.html v2.0: rimosso pulsante "Reset Dati Demo" (chiamava endpoint
  inesistente /api/admin/reset-demo). Aggiunti: confirm dialog con lista
  aziende + durata, spinner sul bottone, nota auto-reset visibile, run history
  localStorage (ultimi 5), card SIM-06 B2B License Provisioning, console
  phase-banner stile lg231.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 10:15:41 +01:00
DevEnv nis2-agile
ca8f077a7a [DOCS] Pagina documentazione Testing & Simulazione
Pagina HTML standalone che descrive:
- Test Runner (L1-L6, SSE streaming, token auth, comandi speciali)
- Simulazione Demo (6 scenari SIM-01→06, 3 aziende, architettura)
- Worker Feedback AI (cron, flow, configurazione)
- URL di accesso, credenziali, reset dati demo

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 09:40:27 +01:00
DevEnv nis2-agile
fc4fbda732 [FIX] feedback-worker.php: correggi */ in docblock PHP
Il pattern */30 chiudeva prematuramente il docblock /** causando
parse error. Sostituito con spazio per chiarezza.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 09:16:09 +01:00
DevEnv nis2-agile
a0fc0bd042 [DOCS] CLAUDE.md aggiornato: FeedbackService, controller, endpoint, contatore file
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 09:07:20 +01:00
DevEnv nis2-agile
c52766953d [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>
2026-03-10 09:05:12 +01:00
DevEnv nis2-agile
3a382d34be [FIX] FeedbackController/Service: u.name → u.full_name (colonna corretta)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 08:56:19 +01:00
DevEnv nis2-agile
1382530189 [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>
2026-03-10 08:51:52 +01:00
DevEnv nis2-agile
3b51b5bd95 [FEAT] Presentazione NIS2 Agile nel repo (presentation.html)
Sposta la presentazione commerciale da /opt/agent-ai/hub/ al repo NIS2.
Servita da Apache a https://nis2.agile.software/presentation.html
- 11 slide: cover, sfida normativa, soluzione, target, features,
  portfolio, compliance journey, pricing, ecosistema, contatti
- Tema rosso #EF4444, CTA "Richiedi accesso" → /#richiedi-accesso

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 15:31:07 +01:00
DevEnv nis2-agile
86cd5f760b [FIX] MktgLeadController + ContactController: getRequestBody → getJsonBody
Il metodo corretto in BaseController è getJsonBody(), non getRequestBody().

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 12:19:21 +01:00
DevEnv nis2-agile
b909136d53 [FIX] MktgLeadController + ContactController: rimuovi parent::__construct()
BaseController non ha costruttore — la chiamata parent::__construct()
causava Fatal Error "Cannot call constructor" su ogni richiesta.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 12:18:14 +01:00
DevEnv nis2-agile
b1dcd4cbd7 [FEAT] Standardizzazione lead form — allineamento a TRPG Agile
MktgLeadController.php:
- Endpoint POST /api/mktg-lead/submit (standard condiviso TRPG/NIS2)
- Proxy a mktg.agile.software/api/webhook/leads con X-Webhook-Key server-side
- Payload standard: name, email, phone, company, product_interest, source, notes
- source: "nis2-landing" per tracciamento CRM
- Fallback email a info@agile.software se webhook non raggiungibile
- Rate limit 3/10min per IP, supporto campi IT e EN

index.html — form allineato a TRPG:
- Aggiunto: telefono (opzionale)
- Aggiunto: tipo utilizzo (select 6 opzioni)
- N° dipendenti: fasce standardizzate (<50/50-249/250-999/1000+)
- Aggiunto: interesse (info/demo/accesso/integrazione B2B)
- Endpoint aggiornato a /api/mktg-lead/submit
- Payload mappato su campi standard EN + source: "nis2-landing"

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 12:14:42 +01:00
DevEnv nis2-agile
c4c34aeed1 [UX] Landing NIS2: tema rosso cybersecurity
Cambio colore brand da cyan (#06B6D4) a rosso (#EF4444):
- --brand-accent: #EF4444
- --brand-gradient: #EF4444 → #DC2626
- --border-color: rgba(239,68,68,0.12)
- --cyan: #EF4444 (compatibilità var)
Tutte le 22+ referenze colore aggiornate via CSS variables cascade.
Tema blu (#3B82F6) mantenuto solo per card "Azienda" (differenziazione).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 11:56:03 +01:00
DevEnv nis2-agile
0a194f6f12 [FEAT] Landing NIS2: accesso su invito + form lead request
- index.html: CTA "Registrati" → "Richiedi accesso" (anchor form)
  Badge hero "Accesso su invito — Richiedi il tuo codice per iniziare"
  Sezione #richiedi-accesso con form lead (nome, email, azienda, ruolo,
  dimensioni, messaggio) + JS submit asincrono + stato successo/errore
  CTA finale aggiornato con messaggio codice invito
- ContactController.php: POST /api/contact/request-invite
  Validazione campi, rate limit 3/10min per IP, email a info@agile.software
  tramite EmailService con template HTML branded
- index.php: route contact → ContactController + action requestInvite

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 11:23:40 +01:00
DevEnv nis2-agile
6cf1cd7384 [FEAT] Landing page marketing NIS2 Agile — sito completo
Sostituisce il placeholder minimalista con una landing page marketing
completa dark-theme, stile AgentAI hub:
- Hero con mock dashboard interattiva e 4 statistiche chiave
- Sezione normativa: sanzioni Art.34, 18 settori, scadenze Art.23
- Sezione "Per chi è": Azienda PMI vs Consulente/MSSP con feature list
- 9 feature card moduli piattaforma con icone Font Awesome
- Banner integrazione 231 Agile (link a lg231.agile.software)
- How-it-works 4 step con CTA
- CTA finale + footer con info@agile.software
- Brand cyan #06B6D4, Inter font, Font Awesome 6.5.1
- Responsive mobile

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 11:04:21 +01:00
DevEnv nis2-agile
902423d768 [DOCS] Aggiorna CONTEXT_LAST_SESSION: sprint fix simulazione + test suite ✓36/36 2026-03-09 10:24:09 +01:00
DevEnv nis2-agile
8578cb5c31 [FIX] ServicesController: query assessment_responses reale + NonConformityController: getPagination named keys 2026-03-09 10:22:40 +01:00
DevEnv nis2-agile
159d783ed7 [FIX] ServicesController: allineamento colonne DB reali (risk_level, contained_at, owner_name, company_name, category compliance_controls) 2026-03-09 10:20:43 +01:00
DevEnv nis2-agile
27ec63c28d [FIX] ServicesController: entity_type (nis2_entity_type col non esiste) + WebhookService risk.status null-safe 2026-03-09 10:14:30 +01:00
DevEnv nis2-agile
086ffbd675 [FIX] test-runner: aggiorna email/password ai valori del simulatore
Email corrette: admin@datacore-srl.demo, admin@medclinic-spa.demo,
admin@enernet-srl.demo, consultant@nis2agile.demo
Password: NIS2Demo2026! (era Demo2026!)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 10:03:14 +01:00
DevEnv nis2-agile
1602438aac [FIX] Simulazione: warning residui + provision JWT standard
- ServicesController::provision(): JWT usa user_id (standard requireAuth)
- simulate-nis2.php: classifyOrg null-safe per entity_type
- simulate-nis2.php: completeOnboarding usa PUT /organizations/{id}
  invece di /onboarding/complete (evita 409 quando org già esiste)
- simulate-nis2.php: supplier.critical rimosso da $supDef (was extra field)
- EmailService: rimosso sent_at (non in email_log schema)
- WebhookService: status ?? 'detected' (null-safe)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 10:00:59 +01:00
DevEnv nis2-agile
13df162ec4 [FIX] SIM-06 + EmailService + WebhookService + supplier assessment
- ServicesController::provision(): created_by usa userId (INT) non string
- EmailService::logEmail(): rimosso sent_at (colonna non esiste in email_log)
- WebhookService::incidentPayload(): status ?? 'detected' (null-safe)
- simulate-nis2.php: supplier assessment usa formato assessment_responses
  corretto [{question, weight, value: yes|partial|no}]

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 09:56:39 +01:00
DevEnv nis2-agile
4be541e9b5 [FIX] reset-demo.sql: gestione trigger audit_log + drop/recreate
Il trigger prevent_audit_log_delete blocca DELETE e interrompe lo script.
Fix: drop triggers prima di DELETE audit_logs, poi ricrea.
Richiede esecuzione con utente root MySQL.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 09:51:40 +01:00
DevEnv nis2-agile
9f9f967d52 [FIX] simulate-nis2: allineamento completo a schema DB reale
- ensureUser: seed-first (1 login call invece di 2) → evita rate limit
- Risk category: technical→cyber, data_breach→compliance, availability→operational,
  human_factor→human (enum reale: cyber,operational,compliance,supply_chain,physical,human)
- Risk: rimosso status:'open' (default 'identified' nel DB)
- Policy: type→category nel createPolicy, aggiunto mappa cryptography→encryption,
  data_protection→information_security, risk_management→vulnerability_management
- Incident SIM-02/03: category→classification, valori corretti (cyber_attack/data_breach),
  affected_systems→affected_services, rimosso estimated_impact, status investigating→analyzing,
  status resolved→recovering, aggiunto detected_at (campo required)
- Onboarding: org_name→name, employees_count→employee_count
- Classify: aggiunti employee_count e annual_turnover_eur (required)
- Supplier: risk_level→criticality, rimosso is_critical

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 09:48:42 +01:00
DevEnv nis2-agile
ef8b7a90e4 [FIX] Simulator: P.IVA checksum + ServicesController: sectorMap + role enum
- simulate-nis2.php: P.IVA demo corrette con checksum Luhn validi
  (09876543217, 07654321095, 05432109873, 99887766550)
- ServicesController::provision(): sectorMap rimappato a valori enum reali
  (es: 'energia'→'energy', 'finanza'→'banking', 'ict'→'ict_services')
- ServicesController::provision(): user_organizations.role 'super_admin'→'org_admin'
  (super_admin non è nel enum di user_organizations)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 09:38:02 +01:00
DevEnv nis2-agile
48317e0556 [FIX] Simulator + ServicesController: allineamento a schema DB reale
simulate-nis2.php:
- sector: ict → ict_services, healthcare → health (enum DB corretto)
- employee_count (non employees_count) per OrganizationController

ServicesController::provision():
- INSERT organizations: rimossi campi non esistenti (legal_form, ateco_code, etc.)
- Usa colonne reali: name, vat_number, employee_count, sector, entity_type, is_active
- entity_type: voluntary → not_applicable (enum non supporta voluntary)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 09:30:20 +01:00