- 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>
- 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>
- 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>
- 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>
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>
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>
- 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>
- 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>
- 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>
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>
AuthController:
- register() accetta `role` diretto (compliance_manager, org_admin, auditor, board_member, consultant)
- Aggiunto validateInvite() → POST /api/auth/validate-invite (no auth)
OnboardingController:
- Aggiunto lookupPiva() → POST /api/onboarding/lookup-piva (no auth, rate limit 10/min)
usato da register.html per P.IVA lookup pre-login
Router (index.php):
- Aggiunto POST:validateInvite e POST:lookupPiva
api.js:
- register() invia sia `role` che `user_type` per retrocompatibilità
simulate-nis2.php:
- SIM-06: B2B provisioning via X-Provision-Secret → org + JWT + API Key
- Filtro NIS2_SIM=SIM06 via goto per skip SIM-01→05 indipendenti
- readEnvValue() helper per leggere PROVISION_SECRET da .env
register.html:
- lookupPiva usa /onboarding/lookup-piva (endpoint pubblico)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- CONTEXT_LAST_SESSION.md: documento completo di tutto lo sprint B2B
- mktg-api-doc.html: Quick Start box con chiave attiva, flusso visivo 4 step, curl pronti
- integrazioniext.html tab Inviti: tabella "Chi fa cosa" per ruolo, sezione mktg-agile
con chiave API + 3 curl pronti, Quick Start aggiornato con tabella risorse per destinatario
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ServicesController:
- POST /api/services/token: lg231 invia API key → riceve JWT 15min
- POST /api/services/sso: SSO federato con identità utente + responsabilità
→ crea/trova utente NIS2 + emette JWT 2h con ruolo e responsibilities
- Audit trail: ogni chiamata esterna autenticata loggata (api.external_call)
- SSO login loggato come auth.sso_login severity=warning con responsabilità
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- test-runner.php: bottone verde scuro in cima al tab Test che esegue
reset DB → simulazioni → smoke test in sequenza
- reset-demo.sql: INSERT ON DUPLICATE KEY per cristiano.benassati@gmail.com
(super_admin, Silvia1978!@) — sopravvive a qualsiasi reset
- Tab Credenziali: admin permanente in cima alla tabella
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Il document root Apache è public/, quindi il runner deve essere
accessibile da /test-runner.php?t=Nis2Test2026
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Tutti i riferimenti nis2.certisource.it → nis2.agile.software
- Apache vhost HTTP nis2.agile.software attivo su Hetzner
- Script setup-nis2-agile-software.sh: certbot SSL + redirect da vecchio dominio
- .env server: APP_URL aggiornato a https://nis2.agile.software
- CLAUDE.md, docs commerciali, integrazioni, API docs aggiornati
DNS da aggiungere in Cloudflare: nis2.agile.software A 135.181.149.254 (proxy OFF)
Poi eseguire: bash /opt/devenv/scripts/setup-nis2-agile-software.sh
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- common.js: idle session timeout 30min con avviso countdown 5min prima del logout
- common.js: checkAuth() attiva automaticamente il monitor di inattività
- api.js: messaggi errore connessione usano i18n (IT/EN) tramite I18n.t()
- risks.html: saveRisk() e aiSuggest() con setButtonLoading durante salvataggio
- risks.html: deleteRisk() ricarica la matrice se si è in matrix view
- incidents.html: createIncident() con setButtonLoading durante registrazione
- policies.html: savePolicy() e saveAIGeneratedPolicy() con setButtonLoading
- policies.html: banner AI-draft con pulsante X per dismissione
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- common.js: aggiunto i18nKey a navItems, data-i18n su sezioni e voci
sidebar → toggle IT/EN ora traduce la navigazione in tempo reale
- Tutte e 10 le pagine HTML: aggiunto data-i18n="*.title" agli h2
(dashboard, assessment, risks, incidents, policies, supply-chain,
training, assets, reports, settings)
- FIX BUG: sidebar puntava ad audit.html (inesistente) → corretto
in reports.html
- HelpSystem: funziona correttamente in tutte le 10 pagine
(content-header-actions presente, init() chiamato)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>