Commit Graph

123 Commits

Author SHA1 Message Date
DevEnv nis2-agile
94d7867cea [FIX] Qdrant URL hostname drift-proof (RAG produzione) + recreate app
L'IP hardcoded Qdrant 172.21.0.5 era driftato a .3 (container senza IP statico) e
con php-fpm clear_env=no la env QDRANT_URL=172.21.0.5 (morta) veniva usata -> RAG web rotta.
Fix: QDRANT_URL e fallback VectorService usano l'hostname http://nis2-qdrant:6333,
risolto via Docker DNS sia in CLI sia in php-fpm. Verificato retrieval end-to-end (287 chunk).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-29 17:22:54 +02:00
DevEnv nis2-agile
0330bcf29d [DOCS] CONTEXT_LAST_SESSION: sessione 2026-05-29 pomeriggio (reboot, 5 commit, utenti/org Agile)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-29 17:19:05 +02:00
DevEnv nis2-agile
5c545ea3d0 [FEAT] Integrazione analisi docs/nis2 v1.7.0 — scoring asset, tassonomia incidenti, PIR, NIST CSF, fonti certe
Fase 1 - Asset Relevance Scoring NIS2 (GV.OC-04): metodologia 0-100 a 6 criteri,
  AssetScoringService + endpoint scoringGrid/score/relevantSystems + UI assets.html + registro stampabile.
Fase 2 - Tassonomia incidenti Determina ACN 164179/2025: IS-1..4 + regime essenziale/importante (Allegati 3/4).
Fase 3 - Post-Incident Review (5-Whys) + metriche TTD/TTC/TTR + timestamp di fase.
Fase 4 - Mapping NIST CSF 2.0 (43 controlli) reference-only.
Fonti certe: registry config/nis2_sources.php + grounding AI (vieta riferimenti inventati) +
  citazioni help.js + ingest PDF normativi nella KB RAG (scripts/ingest-nis2-sources.php).
Migrazioni 020/021/022 (additive idempotenti). Fix VectorService IP Qdrant (drift .5->.3).
Analisi concorrenza Evix (docs/EVIX_ANALISI_CONCORRENZA.html, gap-driven).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-29 17:15:13 +02:00
DevEnv nis2-agile
a7a21faa82 [FEAT] Knowledge Base RAG multi-livello (SYSTEM/FIRM/ORG) + Qdrant + Voyage
- KnowledgeBaseController: ingest, list, firmOrgs, search, delete
- VectorService (Qdrant + buildAuthzFilter), EmbedService (Voyage), RagService (pipeline)
- AIService::askWithRag con fallback graceful
- docker-compose: servizio qdrant + env Voyage (chiave da .env/vault, no hardcoded)
- SQL 012 consulting_firms, 013 firm_assignments + kb_uploaded_documents
- public/kb.html + kb.js (upload, lista, search preview)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-29 15:44:13 +02:00
DevEnv nis2-agile
9b53ca3ba1 [FEAT] MktgLead getJsonBody + script import-feedback-to-nexus + seed demo agile-tech
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-29 15:42:05 +02:00
DevEnv nis2-agile
1d934e4e63 [FEAT] UI: guida online, landing EN, mobile-conversion, ai-assistant, bug-reporter + help/i18n
- public/guida.html, index-en.html, service-continuity.html
- public/js/ai-assistant.js, bug-reporter.js (FAB supporto)
- public/mobile-conversion.css/js
- index.html, common.js, help.js, risks.html: aggiornamenti UI/help

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-29 15:42:00 +02:00
DevEnv nis2-agile
c0bf7b6c15 [DOCS] Standard cross-suite AgileHub + governance CLAUDE.md + registri agent
- CLAUDE.md: TZ, SSO, vault-steward, versioning, persona v2.0, multitenant, KB RAG
- docs/standards: persona-conversational-rules v2.0
- docs/STANDARD_*: installer-integration, email-relay, AI-prodotto, marketing-tenant, multitenant
- AGENT_CHANGES.md + OPEN_TICKETS.md (registri agent automatico)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-29 15:41:54 +02:00
DevEnv nis2-agile
1d13166d7a [CHORE] .gitignore: escludi backup (*.bak*, .backups/) e chiavi SSH effimere (.ssh-temp/)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-29 15:41:44 +02:00
DevEnv nis2-agile
4a85abeb3b [DOCS] Help online + i18n IT/EN + product_knowledge AI per Fasi 2-5 (v1.6.1)
Aggiornamento documentazione obbligatorio post-feature (CLAUDE.md agent workflow):

- public/js/help.js: estesa sezione 'settings' con 5 nuovi heading:
  Sessioni Attive (Fase 2), Preferenze utente (Fase 4), Password dimenticata
  (Fase 3), Cambio organizzazione multi-tenant (Fase 3), Branding white-label
  (Fase 5, solo super_admin/consulente). Riscrittura Sicurezza Account con
  dettaglio sessions UI.

- public/js/i18n.js: aggiunte 60+ chiavi IT/EN per sessions.*, pwreset.*,
  tenant.*, preferences.*, impersonate.*, branding.*, settings.* (preferences
  + branding).

- AgileHub product_knowledge: PUT /ai/products/NIS2/card (id=914) con
  description + 11 scope tag + target_buyer + free_markdown completo
  (target, moduli, auth/security Fasi 1-5, servizi B2B, AI/RAG, stack,
  multi-tenancy, GDPR). Sostituisce card vuota precedente.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-29 13:50:06 +02:00
DevEnv nis2-agile
a7bd37a797 [FEAT] UI Fasi 4+5: Impersonate banner + Preferenze + Branding white-label (v1.6.0)
Completamento UI per gli endpoint backend già attivi (commit e4f9e91):

- admin/users.html: colonna Azioni con pulsante "Impersonate" per utenti non-super_admin
  attivi → salva token originale in sessionStorage, sostituisce con quello impersonate,
  redirige a dashboard
- js/common.js: banner persistente arancione "Modalità Impersonate" in tutte le
  pagine quando sessionStorage ha impersonate origin → pulsante "Esci impersonate"
  ripristina token originale e torna ad admin/users
- settings.html: nuovo tab "Preferenze" (lingua/tema/timezone/notifiche email+in-app)
  con form salva via PUT /auth/preferences
- settings.html: nuovo tab "Branding" (solo super_admin / consulente) con
  brand_name/logo_url/primary_color/secondary_color, PUT /branding

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-29 13:28:57 +02:00
DevEnv nis2-agile
e4f9e9179e [FEAT] Allineamento NIS2 ↔ TRPG (Fasi 1-5): SSO + Sessions + Reset + Impersonate + Branding
Implementazione completa del progetto allineamento alla suite Evix (TRPG/lg231),
basato sul doc canonico docs/GAP_TRPG_NIS2_ALIGNMENT.md (5 fasi, 18 gap).

Version 1.0.0 → 1.5.0

Fase 1 — SSO Federation (v1.1.0)
- Migration 015_sso_columns: users.sso_identity_id + password_version
- application/services/SsoHelper.php (client SSO dual-mode, cURL nativo, zero deps)
- AuthController::login() + changePassword() conditional SSO (SSO_MODE=local default)

Fase 2 — Multi-device Sessions (v1.2.0)
- Migration 016_active_sessions: tabella + refresh_tokens.session_jti
- BaseController::requireAuth() verifica jti + last_activity throttle + parseDeviceLabel
- login() genera jti, logout/changePassword revoca selettiva
- GET/DELETE /auth/sessions[/{id}]
- UI settings.html tab Sicurezza con lista device + revoca

Fase 3 — Password Reset + Tenant Switcher (v1.3.0)
- Migration 017_password_reset_tokens (TTL 30min, single-use)
- POST /auth/forgot-password (risposta opaca) + reset-password
- Pagine forgot-password.html + reset-password.html (con strength bar)
- EmailService::sendPasswordReset
- POST /auth/switchContext con rotazione JWT + organization_id claim
- Dropdown tenant in sidebar esposto a tutti gli utenti con ≥2 org

Fase 4 — Impersonate + Preferences + Versioning UI (v1.4.0)
- POST /auth/impersonate (super_admin o consulente stesso firm, TTL 1h, audit)
- Migration 018_user_preferences: users.theme/timezone/notif_email/notif_inapp
- GET/PUT /auth/preferences
- Sidebar footer mostra versione + changelog modal su click

Fase 5 — Branding white-label + Auth-gate (v1.5.0)
- Migration 019_firm_branding (logo/colori/brand_name per consulting firm)
- BrandingController GET /branding/current (auth opzionale) + PUT
- common.js auto-applica CSS variables al boot
- public/js/auth-gate.js (gate password client-side per docs riservati, da TRPG)

Skip motivati:
- G15 demo login: simulator esistenti coprono
- G18 refactor controllers: rinviato (~5gg, valore tecnico solo)

Cron sync SSO: AgileHub Ticket #220 aperto a team AGILEHUB per estendere
sso-password-sync.sh al DB nis2_agile_db. Prerequisito per switch SSO_MODE=dual.

Backup files: tutti i file modificati hanno .bak.pre-{fase}-{ts} sia in DEV
sia in /var/www/nis2-agile/.backups/ su Hetzner (rollback ready).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-29 13:18:35 +02:00
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