[CONTEXT+MKTG] Contesto sessione + HTML migliorati per comunicazione terze parti

- 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>
This commit is contained in:
DevEnv nis2-agile
2026-03-07 16:37:14 +01:00
co-authored by Claude Sonnet 4.6
parent 13eb8ae8a8
commit f7347ccd8c
3 changed files with 277 additions and 7 deletions
+100 -7
View File
@@ -324,9 +324,46 @@
<strong>Sistema Inviti / Licenze B2B:</strong> NIS2 Agile genera token di invito che abilitano
il provisioning automatico di organizzazioni e utenti. L'e-commerce o il partner riceve l'invito,
lo consegna al cliente finale (es. lg231), che lo usa per attivarsi automaticamente.
L'accesso si interrompe alla scadenza dell'invito.
L'accesso si interrompe alla scadenza della licenza.
</div>
<div class="section-title">Chi fa cosa — ruoli nell'ecosistema</div>
<table class="api-table" style="margin-bottom:1.5rem">
<thead><tr><th>Sistema</th><th>Ruolo</th><th>API usata</th><th>Auth</th></tr></thead>
<tbody>
<tr>
<td><strong>NIS2 Admin</strong><br><span style="font-size:.72rem;color:var(--text-secondary)">o mktg-agile</span></td>
<td>Genera i token licenza, fissa piano/durata/utenti/prezzo</td>
<td><code>POST /api/invites/create</code></td>
<td><span class="badge-status s-pending" style="font-size:.65rem">API Key admin:licenses</span></td>
</tr>
<tr>
<td><strong>E-commerce</strong></td>
<td>Riceve token all'acquisto, lo consegna al cliente con l'ordine</td>
<td>— (semplice consegna token)</td>
<td><span class="badge-status s-pending" style="font-size:.65rem">API Key admin:licenses</span></td>
</tr>
<tr>
<td><strong>lg231 / partner</strong></td>
<td>Valida il token, fa provisioning automatico per il cliente</td>
<td><code>GET /api/invites/validate</code><br><code>POST /api/services/provision</code></td>
<td><span class="badge-status s-used" style="font-size:.65rem">invite_token nel body</span></td>
</tr>
<tr>
<td><strong>Cliente finale</strong></td>
<td>Apre invite_url e si registra in autonomia via wizard</td>
<td><code>onboarding.html?invite=inv_...</code></td>
<td><span class="badge-status" style="font-size:.65rem;background:rgba(156,163,175,.1);color:#9ca3af">nessuna auth</span></td>
</tr>
<tr>
<td><strong>NIS2 Admin</strong></td>
<td>Monitora uso licenze, revoca, rigenera</td>
<td><code>GET /api/invites/list</code><br><code>DELETE /api/invites/{id}</code></td>
<td><span class="badge-status s-pending" style="font-size:.65rem">API Key o JWT super_admin</span></td>
</tr>
</tbody>
</table>
<div class="section-title">Flusso completo</div>
<div class="code-block" style="font-family:monospace;line-height:1.8;font-size:.82rem">
<span style="color:#22c55e">1. GENERAZIONE</span> NIS2 Admin (super_admin)
@@ -458,6 +495,31 @@ curl "https://nis2.agile.software/api/invites/validate?token=inv_a1b2c3..."
</tbody>
</table>
<div class="section-title">Per mktg-agile / E-commerce — Quick Start</div>
<div class="callout">
Chiave API già attiva per mktg-agile: <code style="color:#4ade80">nis2_mktg_8c8bd38e78fccb9faa749d8601051f42</code>
· Scope: <code>admin:licenses</code> · Scade: 2028-03-07
· Doc completa: <a href="/mktg-api-doc.html" style="color:var(--primary)">mktg-api-doc.html</a>
· Pannello web: <a href="/licenseExt.html" style="color:var(--primary)">licenseExt.html</a>
</div>
<div class="code-block"><span class="cmt"># 1. Crea licenza (mktg-agile → NIS2)</span>
curl -X POST https://nis2.agile.software/api/invites/create \
-H <span class="str">"X-API-Key: nis2_mktg_8c8bd38e78fccb9faa749d8601051f42"</span> \
-H <span class="str">"Content-Type: application/json"</span> \
-d <span class="str">'{"plan":"professional","duration_months":12,"max_users_per_org":10,
"label":"Ordine MKT-001","channel":"ecommerce","price_eur":990}'</span>
<span class="cmt"># → risposta contiene token (inv_xxx) e invite_url</span>
<span class="cmt"># → consegna invite_url al cliente nel messaggio di conferma ordine</span>
<span class="cmt"># 2. Verifica stato licenza in qualsiasi momento</span>
curl -H <span class="str">"X-API-Key: nis2_mktg_8c8bd38e78fccb9faa749d8601051f42"</span> \
"https://nis2.agile.software/api/invites/42"
<span class="cmt"># 3. Lista licenze attive per canale ecommerce</span>
curl -H <span class="str">"X-API-Key: nis2_mktg_8c8bd38e78fccb9faa749d8601051f42"</span> \
"https://nis2.agile.software/api/invites/list?channel=ecommerce&amp;status=pending"</div>
<div class="callout">
<strong>Sicurezza token:</strong> il token <code>inv_</code> viene restituito in chiaro UNA SOLA VOLTA
alla creazione. Nel DB è conservato solo il hash SHA-256. Il <code>token_prefix</code> (es: <code>inv_a1b2c3...</code>)
@@ -729,14 +791,45 @@ curl -H <span class="str">"X-API-Key: nis2_TUA_CHIAVE"</span> \
curl -H <span class="str">"X-API-Key: nis2_TUA_CHIAVE"</span> \
"https://nis2.agile.software/api/services/risks/feed?level=high,critical"</div>
<div class="section-title">Contatti e riferimenti</div>
<div class="section-title">Risorse per ogni tipo di integratore</div>
<table class="api-table">
<thead><tr><th>Destinatario</th><th>Risorsa</th><th>URL</th></tr></thead>
<tbody>
<tr><td>App NIS2 Agile</td><td><a href="https://nis2.agile.software" style="color:var(--primary)">https://nis2.agile.software</a></td></tr>
<tr><td>Specifiche OpenAPI</td><td><code>GET /api/services/openapi.json</code></td></tr>
<tr><td>Test Runner</td><td><a href="/test-runner.php?t=Nis2Test2026" style="color:var(--primary)">test-runner.php</a></td></tr>
<tr><td>Amministratore</td><td>cristiano.benassati@gmail.com</td></tr>
<tr><td>Documento tecnico lg231</td><td><code>docs/integration/lg231-nis2-integration.md</code></td></tr>
<tr>
<td><strong>mktg-agile / E-commerce</strong></td>
<td>Documentazione API licenze + Quick Start</td>
<td><a href="/mktg-api-doc.html" style="color:var(--primary)">mktg-api-doc.html</a></td>
</tr>
<tr>
<td><strong>mktg-agile / E-commerce</strong></td>
<td>Pannello web gestione licenze</td>
<td><a href="/licenseExt.html" style="color:var(--primary)">licenseExt.html</a></td>
</tr>
<tr>
<td><strong>mktg-agile / E-commerce</strong></td>
<td>Postman Collection (import diretto)</td>
<td><a href="/nis2-license-api.postman.json" download style="color:var(--primary)">nis2-license-api.postman.json</a></td>
</tr>
<tr>
<td><strong>lg231 / Partner tecnici</strong></td>
<td>Questa pagina — tab Guida lg231</td>
<td><a href="/integrazioniext.html" style="color:var(--primary)">integrazioniext.html</a></td>
</tr>
<tr>
<td><strong>lg231 (agente Claude)</strong></td>
<td>Spec tecnica completa per implementazione</td>
<td><code>docs/integration/lg231-nis2-integration.md</code></td>
</tr>
<tr>
<td><strong>Tutti</strong></td>
<td>Health check (no auth)</td>
<td><code>GET https://nis2.agile.software/api/services/status</code></td>
</tr>
<tr>
<td><strong>Tutti</strong></td>
<td>App NIS2 Agile</td>
<td><a href="https://nis2.agile.software" style="color:var(--primary)">https://nis2.agile.software</a></td>
</tr>
</tbody>
</table>
</div>
+51
View File
@@ -103,6 +103,57 @@ table.resp code { background: rgba(255,255,255,.06); padding: .1rem .3rem; borde
</div>
</div>
<!-- ── QUICK START ── -->
<div style="background:rgba(6,182,212,.06);border:1px solid rgba(6,182,212,.25);border-radius:12px;padding:1.5rem;margin-bottom:2rem">
<div style="font-size:.75rem;font-weight:700;color:var(--primary);letter-spacing:.06em;margin-bottom:1rem">QUICK START — OPERATIVO IN 2 MINUTI</div>
<div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:1rem;margin-bottom:1.25rem">
<div style="background:rgba(0,0,0,.25);border-radius:8px;padding:1rem">
<div style="font-size:.7rem;color:var(--text-secondary);margin-bottom:.4rem">CHIAVE API (già attiva)</div>
<code style="font-size:.75rem;color:#4ade80;word-break:break-all">nis2_mktg_8c8bd38e78fccb9faa749d8601051f42</code>
<div style="font-size:.68rem;color:var(--text-secondary);margin-top:.3rem">Scope: admin:licenses · Scade: 2028-03-07</div>
</div>
<div style="background:rgba(0,0,0,.25);border-radius:8px;padding:1rem">
<div style="font-size:.7rem;color:var(--text-secondary);margin-bottom:.4rem">BASE URL</div>
<code style="font-size:.8rem;color:var(--text-primary)">https://nis2.agile.software/api</code>
<div style="font-size:.68rem;color:var(--text-secondary);margin-top:.3rem">Tutti gli endpoint sotto questo path</div>
</div>
<div style="background:rgba(0,0,0,.25);border-radius:8px;padding:1rem">
<div style="font-size:.7rem;color:var(--text-secondary);margin-bottom:.4rem">TEST IMMEDIATO</div>
<code style="font-size:.75rem;color:#fbbf24">curl nis2.agile.software/api/services/status</code>
<div style="font-size:.68rem;color:var(--text-secondary);margin-top:.3rem">Nessuna auth — deve rispondere 200</div>
</div>
</div>
<div style="font-size:.78rem;color:var(--text-secondary);margin-bottom:.5rem;font-weight:600">FLUSSO COMPLETO — dalla vendita all'attivazione cliente</div>
<div style="display:flex;align-items:center;gap:.4rem;flex-wrap:wrap;font-size:.8rem">
<div style="background:rgba(168,85,247,.15);border:1px solid rgba(168,85,247,.3);border-radius:6px;padding:.3rem .7rem;color:#a855f7;white-space:nowrap">
<strong>1. mktg-agile</strong><br><span style="font-size:.7rem">POST /invites/create</span>
</div>
<div style="color:var(--text-secondary)">→ token inv_xxx</div>
<div style="background:rgba(249,115,22,.12);border:1px solid rgba(249,115,22,.25);border-radius:6px;padding:.3rem .7rem;color:#f97316;white-space:nowrap">
<strong>2. e-commerce</strong><br><span style="font-size:.7rem">consegna token al cliente</span>
</div>
<div style="color:var(--text-secondary)">→ inv_xxx</div>
<div style="background:rgba(6,182,212,.12);border:1px solid rgba(6,182,212,.25);border-radius:6px;padding:.3rem .7rem;color:#06b6d4;white-space:nowrap">
<strong>3. lg231 / cliente</strong><br><span style="font-size:.7rem">POST /services/provision</span>
</div>
<div style="color:var(--text-secondary)">→ org + api_key</div>
<div style="background:rgba(34,197,94,.12);border:1px solid rgba(34,197,94,.25);border-radius:6px;padding:.3rem .7rem;color:#22c55e;white-space:nowrap">
<strong>4. NIS2 attivo</strong><br><span style="font-size:.7rem">fino a license_expires_at</span>
</div>
</div>
<pre style="margin-top:1rem;margin-bottom:0;font-size:.78rem"><span class="cm"># Crea licenza in 1 chiamata:</span>
curl -X POST https://nis2.agile.software/api/invites/create \
-H <span class="sv">"X-API-Key: nis2_mktg_8c8bd38e78fccb9faa749d8601051f42"</span> \
-H <span class="sv">"Content-Type: application/json"</span> \
-d <span class="sv">'{"plan":"professional","duration_months":12,"label":"Ordine #123","channel":"ecommerce","max_users_per_org":10,"price_eur":990}'</span>
<span class="cm"># Risposta → prendi invites[0].token (inv_xxx) e invites[0].invite_url</span>
<span class="cm"># Consegna invite_url al cliente — lui clicca e si attiva in autonomia</span></pre>
</div>
<!-- ── Q1 ── -->
<h2><span class="num">1</span> API di creazione licenza</h2>
<div class="answer-box highlight">