- 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>
- 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>
- 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>
- 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>
- 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>
- dbSeedUser(): inserisce utenti demo direttamente nel DB MySQL (bypass HTTP rate limit)
- ensureUser(): usa dbSeedUser() come metodo primario, API /register come fallback
- Rimosse le 2 chiamate register doppie (DEMO_EMAIL + email reale)
- Aggiunto seed consultant@nis2agile.demo + membership a tutte le org demo
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- ServicesController::provision(): INSERT users usa full_name/is_active (non first_name/last_name/status)
- ServicesController::ssoLogin(): stesso fix per SSO user creation
- simulate-nis2::ensureUser(): registration payload usa full_name (non first_name+last_name)
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>
- 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>