Files
nis2-agile/docs/HANDOFF_C5_STAKEHOLDER.md
DevEnv nis2-agileandClaude Opus 4.8 419162594d [DOCS] Handoff C5 (Stakeholder) — testimone per nuovo prompt
Briefing auto-contenuto: spec verbatim Simon C5, fonte docs/simon/C5_EleStakeH.xlsx (30 tipi),
validazione normativa (Mendelow=best practice, refuso Q4=potere 0-2, GV.SC-02), esistente da
riusare (org_roles/policies/cfg_nis2_requisiti/NCR-CAPA/review_schedule/suppliers), fasi C5.1/C5.2,
convenzioni operative critiche (deploy host SSH, migration runner, common-bi.js sidebar+cache-buster,
multi-tenancy, smoke tester), flotta verifica finale + help/trad/KB, open items.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 20:18:51 +02:00

118 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# HANDOFF — Epic C / C5: Modulo Stakeholder (mappatura + Mendelow + attività)
> Documento di passaggio di consegne per un NUOVO prompt che implementerà **C5**, l'ultimo
> punto delle segnalazioni di Simon Fattori. C1–C4 sono GIÀ LIVE. Leggi questo file + la memoria
> `project-epic-c-simon` prima di iniziare. Aggiornato 2026-06-16.
---
## 0. Cosa è già fatto (Epic C)
| Punto | Stato | Riferimenti |
|---|---|---|
| C1 — Elenco Misure/Requisiti config-driven + valutazione per requisito + copia procedure | ✅ LIVE | mig.046/047/048, `FrameworkController`, `misure-requisiti.html`, `org_requisito_state`, `cfg_nis2_*` |
| C2 — «Determinazione» (non «Determina») | ✅ | decisione utente bloccata |
| C3 — rimosso modulo "Analisi GAP ACN" | ✅ LIVE | mig.049 (drop), RaciController ripuntato su `cfg_nis2_misure` |
| C4 — inventario a 2 voci + sottoclassi | ✅ LIVE | mig.050, `cfg_inventory_voci`/`inventory_subclassi`, `assets.voce_code/subclass_id` |
| **C5 — modulo Stakeholder** | ⏳ **DA FARE** | questo documento |
HEAD al passaggio: `8df8a5d`. **Prossima migrazione = `051`**. Versione corrente `1.18.4`.
---
## 1. La spec C5 (testo VERBATIM di Simon — da rispettare alla lettera)
> C5 - la mappatura e la gestione degli stakeholder deve essere organizzata così:
> 1. l'utente seleziona il tipo stakeholder, con descrizione, dall'elenco (`docs/simon/C5_EleStakeH.xlsx`); l'utente può modificare l'elenco aggiungendo voci e tu provvederai alla codifica proseguendo la numerazione dall'ultimo codice che è **Stak.30**.
> 2. l'utente inizia a inserire i suoi stakeholder tramite un'anagrafica semplificata che deve comunque comprendere un **collegamento all'organigramma** per stakeholder interni, un **collegamento alle procedure**, una griglia di due valutazioni con valori da **0 a 5**: «grado di **potere** sull'azienda» e «grado di **interesse** sull'azienda».
> 3. gli stakeholder così valutati saranno collocati su un **grafico a quattro quadranti**: asse **x = interesse**, asse **y = potere**.
> - **Q1 in alto a sinistra** (interesse 0-2, potere 3-5): *Stakeholder Istituzionali / Keep Satisfied* — Tenerli soddisfatti. Forte potere di blocco, scarso interesse quotidiano. Evitare scontenti improvvisi.
> - **Q2 in alto a destra** (interesse 3-5, potere 3-5): *Stakeholder Chiave / Gestisci Attivamente* — Gestione attiva e coinvolgimento costante. Decisori principali, supporto vitale.
> - **Q3 in basso a destra** (interesse 3-5, potere 0-2): *Stakeholder Operativi / Keep Informed* — Tenere informati. Molto coinvolti, scarso peso decisionale.
> - **Q4 in basso a sinistra** (interesse 0-2, potere 0-2 — vedi §4 nota refuso): *Stakeholder Marginali / Monitorare* — Monitoraggio costante col minimo sforzo. Comunicazioni periodiche non dispendiose.
> 4. il dashboard stakeholder deve prevedere **attività**:
> 4.1 le attività possono essere **azioni e/o questionari** da inviare, con collegamento all'elenco procedure;
> 4.2 il modulo azioni lo trattiamo più avanti *(NB: esiste già il workflow NCR/CAPA — vedi §5)*;
> 4.3 i **questionari** devono prevedere un **sotto-dashboard di ricezione feedback** (questionari compilati o la firma di avvenuta lettura, a seconda del tipo) + possibilità di **commentare** l'attività e **allegare file**;
> 4.4 l'utente deve poter assegnare un'attività a un **codice stakeholder** oppure selezionare **singolarmente** ogni stakeholder (anche di codice diverso);
> 4.5 devono esistere **questionari tipo** con collegamento sia all'elenco procedure sia all'elenco misure/requisiti in **rapporto molti-a-molti**;
> 4.6 ogni attività deve poter essere **pianificata con data e scadenza** e con collegamento a un **calendario del sistema NIS2**.
---
## 2. Fonte dati autoritativa (codifica NON variabile)
- **`docs/simon/C5_EleStakeH.xlsx`** → 30 tipi `Stak.01`–`Stak.30`. **Interni**: Stak.01–06 (Dipendenti, Management, Azionisti, Collaboratori, Sindacalisti, Volontari/Associati). **Esterni**: Stak.07–30 (Clienti finali/aziendali, Fornitori materie prime/servizi, Partner strategici, Rivenditori, Governo/autorità, Camera di commercio, Agenzie di regolamentazione, Comunità locale, ONG, Giornalisti/blogger, Sponsorizzati, Influencer, Banche, Assicurazioni, Sponsor, Investitori privati, Donatori, Associazioni di categoria, Competitor, Attivisti ambientali, Organizzazioni di consumatori, Rappresentanti sindacali).
- **GIÀ DISPONIBILI parsati** in `application/data/nis2_framework_seed.json` → chiave **`stakeholder_types`** (array di `{code,tipo,descr}`, 30 elementi). Riusa quelli o ri-parsa l'xlsx (parser stdlib in cronologia, zipfile+xml, no openpyxl). NON variare codici/descrizioni.
- Nuovi tipi aggiunti dall'utente → **proseguire da `Stak.31`** (codifica automatica).
---
## 3. Validazione normativa (già fatta con `nis2-expert`)
- **Estensione a fornitori/clienti/partner = ancorata a GV.SC-02** (testo verbatim "fornitori, clienti e partner"). OK.
- **La matrice Mendelow (potere/interesse) è BEST PRACTICE, NON un obbligo NIS2.** → etichettarla come tale in AI/help (regola "fonti certe" di `application/config/nis2_sources.php`). NON spacciarla per requisito.
- L'obbligo VERO è GV.SC-02: ruoli/responsabilità di sicurezza per fornitori/clienti/partner + personale terze parti nell'elenco GV.RR-02 p.2. Assicurarsi che il modulo produca QUESTI artefatti, non solo la "bella matrice".
- Ancoraggio comprensione stakeholder: **GV.OC** (contesto organizzativo).
---
## 4. Decisioni di design già prese
- **Config-driven** (direttiva utente, vale per tutto Epic C): tipi e quadranti in **tabelle di configurazione**, NON hardcoded.
- 🔧 **REFUSO confermato (expert + Mendelow + descrizione)**: il **quadrante Q4 (basso-sinistra, Marginali/Monitorare)** nel testo di Simon ha "potere 3-5" ma deve essere **potere 0-2** (basso potere + basso interesse). Implementare con **potere 0-2**. (Q1 alto-sx = potere 3-5/interesse 0-2.) Regola quadranti: potere≥3 = alto, interesse≥3 = alto.
- **Riusare** il modulo Supply Chain / A4 4.5 (`suppliers.stakeholder_type` ENUM supplier/customer/partner, `SupplyChainController::stakeholderMap`, `public/stakeholders.html`) — **estendere, non duplicare**.
---
## 5. Esistente da riusare (NON reinventare)
| Serve a C5 | Esiste già |
|---|---|
| Stakeholder base | `suppliers` (+ `stakeholder_type` ENUM, A4 4.5) · `SupplyChainController::stakeholderMap` · `public/stakeholders.html` |
| Link organigramma (interni) | **`org_roles`** (A4 4.1, `OrgRoleController`) |
| Link procedure | **`policies`** (`PolicyController`) |
| Link misure/requisiti (m2m questionari) | **`cfg_nis2_requisiti`** / `cfg_nis2_misure` (C1) |
| Azioni (4.2) | **`non_conformities` + `capa_actions`** (workflow NCR/CAPA, mig.004) — riusare, NON creare `corrective_actions` (non esiste) |
| Scadenze/calendario (4.6) | **`review_schedule`** (A4 4.4, `ReviewScheduleController`) — valutare se le attività stakeholder ci entrano o serve un calendario dedicato |
| Pattern matrice/valutazione | `org_requisito_state` + modale valutazione di `misure-requisiti.html` (C1) come riferimento UI |
⚠️ **Scelta dati da fare**: estendere `suppliers` con i campi C5 (stakeholder_code, potere, interesse, link org_role, link procedure) **oppure** una tabella compagna `stakeholder_profile(supplier_id, ...)`. Raccomandazione: tabella compagna additiva per non appesantire `suppliers` e tenere C5 isolato. **Decidere a inizio C5.**
---
## 6. Fasi consigliate
- **C5.1 (fondazione)**: `cfg_stakeholder_types` (seed 30 + org-added da Stak.31) + `cfg_stakeholder_quadrants` (4, con range corretti) + anagrafica estesa (tipo, potere/interesse 0-5, link organigramma per interni, link procedure) + **matrice Mendelow** (UI grafico 4 quadranti) + collocazione automatica. Endpoint + pagina (estendere `stakeholders.html`). Help/i18n/KB.
- **C5.2 (operativo)**: **attività** (azioni→NCR/CAPA, questionari) + **questionari tipo** con m2m a procedure e misure/requisiti + **sotto-dashboard feedback** (compilazione / firma lettura) + commenti + allegati + **pianificazione data/scadenza su calendario** (review_schedule o calendario dedicato). Help/i18n/KB.
---
## 7. Convenzioni operative CRITICHE (non sbagliare)
- **DB writes**: SOLO via host SSH → `docker exec nis2-app php ...`. Il devenv NON raggiunge il DB. Chiave host in **`.ssh-temp/`** (ruota ~14h: se scaduta, chiedere all'utente una chiave fresca). Pattern migrazione: scrivi `application/_migrate_051_tmp.php` self-contained (require config+database) → esegui via SSH → **rimuovilo**. Commit del solo `docs/sql/051_*.sql` (record) + eventuale `application/data/*seed*.json`.
- **Migration runner**: il runner fa `PDO::exec` con split su `;` → **MAI `DELIMITER`/stored-procedure**. Usa `CREATE TABLE IF NOT EXISTS` / `ALTER ... ADD` bare + try/catch su errno (1050 tabella esiste, 1060 colonna dup, 1061 indice dup, 1826 FK dup). **UNIQUE con `organization_id` NULL NON deduplica** (NULL≠NULL) → per i default di sistema usa un **check d'esistenza** prima dell'INSERT (vedi `_migrate_050`).
- **PHP hot-reload**: dopo OGNI edit `.php` → `docker exec nis2-app kill -USR2 1` (l'opcache non rilegge da sola).
- **Git push**: DIRETTO dal devenv (helper vault `git-credential-vault`). Commit-early.
- **Frontend / sidebar**: la sidebar V2 attiva è in **`common-bi.js`** (NON solo `common.js` — gotcha: in C3 la voce nuova era stata messa solo in common.js e non compariva). `common-bi.js` ha un **`?v=` PROPRIO** (diverso dagli altri JS) → bumparlo a parte. Cache-buster `?v=YYYYMMDD` su **tutte** le `public/*.html` quando cambi JS condivisi (`sed -i 's/?v=VECCHIA/?v=NUOVA/g'`), + bump `version.json` (MINOR per feature) + nome cache in `public/sw.js` (`nis2-shell-vX.Y.Z`).
- **Help/i18n/KB**: aggiornare `public/js/help.js` (sezione + page-mapping) + `public/js/i18n.js` (chiavi `nav.*`) + ingest KB (`POST /api/knowledgebase/ingest`, super_admin, scope SYSTEM) dopo ogni cambio funzionale.
- **DB API**: `Database::query/fetchAll/fetchOne/insert/update` — **`Database::execute` NON ESISTE**.
- **Multi-tenancy / auth**: ogni query filtra `organization_id`. `getCurrentOrgId()` è valorizzato SOLO dopo `requireOrgAccess()`/`requireOrgRole()`; con `requireAuth()` usa `resolveOrgId()` + verifica accesso a mano (vedi `FrameworkController::catalog` per il pattern anti-IDOR su letture org-opzionali). Scritture: `requireOrgRole(['org_admin','compliance_manager'])`. Il demo guard (isDemo) blocca le scritture sulle org demo.
- **Smoke test**: login tester `s.fattori@agile.software` / **`Tester2026!`** (super_admin) via `POST /api/auth/login` (curl, NON python urllib → Cloudflare 1010). Header `X-Organization-Id`. Org: **151** DataCore (importante), **152** MedClinic (essenziale), **996001/996002** sandbox (isDemo → niente seed/scritture lì). **NON inquinare i golden 151/152**: testa e poi fai cleanup (capture max id → delete > max).
- **Email**: disabilitate (kill-switch); per i questionari "da inviare" NON spedire davvero a go-live mancante — usare `send-raw` solo per test espliciti, altrimenti registrare lo stato senza invio reale.
---
## 8. Alla FINE di C5 (istruzione esplicita dell'utente)
1. **Flotta di agenti per verificare il lavoro** (Workflow multi-agente: sicurezza/correttezza/fedeltà-dato/normativa/UI → verifica avversariale → sintesi; poi correggere i finding). Vedi il workflow usato per C1 come modello.
2. **Help online + traduzioni + KB AI** (giro finale di allineamento).
---
## 9. Open items aperti (segnalare, non rimuovere)
- **92 vs 87 requisiti importanti**: il prodotto usa **92** (file di Simon, vincolante); l'`nis2-expert` contando l'Allegato 1 ufficiale trova **87**. Da riconciliare con Simon sul testo ufficiale. (Allineato a 92 in help.js + nis2_sources.php.)
- **Determinazione 333017/2025**: data esatta (mese senza giorno) in `application/config/nis2_sources.php:60` da verificare sul testo ufficiale.
- **E2E browser di C1–C4**: nuove UI (misure-requisiti, valutazione per requisito, inventario 2 voci) NON collaudate a video — far esercitare ai tester.