Registro dedicato degli stakeholder (tabella `stakeholders`, NON una colonna su suppliers: gli interni non sono fornitori; gli esterni si COLLEGANO opzionalmente a un supplier esistente senza duplicare il dato). - mig.051: cfg_stakeholder_types (30 di sistema Stak.01-30 + org-added da Stak.31), cfg_stakeholder_quadrants (4, range corretti: Q4 potere 0-2), stakeholders, stakeholder_procedures (m2m -> policies). Seeder idempotente seed_stakeholders.php. - StakeholderController: list/create/update/delete + types/addType + quadrants + pickers. Quadrante CALCOLATO a read-time dai range config. Anti-IDOR su org_role/supplier/ policy/tipo; coerenza kind (interni->organigramma, esterni->fornitore); punteggi 0-5. - api.js: metodi stk*. stakeholders.html riscritta: registro + matrice di Mendelow in SVG dependency-free + modali (stakeholder, nuovo tipo). Voce sidebar V2 (common-bi.js). - Help aggiornato; cache-buster ?v=20260626 su tutte le pagine; version 1.19.0; sw cache v1.19.0. Ancoraggio GV.SC-02 (obbligo, art. 24 D.Lgs. 138/2024). La matrice di Mendelow e' etichettata come BUONA PRASSI, non obbligo NIS2 (regola fonti-certe). Additivo. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
104 lines
5.5 KiB
SQL
104 lines
5.5 KiB
SQL
-- =====================================================================
|
|
-- 051 — Registro Stakeholder + matrice di Mendelow (Epic C / C5.1)
|
|
-- =====================================================================
|
|
-- Simon C5: registro degli stakeholder con tipo configurabile
|
|
-- (Stak.01-30 di sistema + voci aggiunte dall'org da Stak.31), doppia
|
|
-- valutazione POTERE/INTERESSE 0-5, collegamento all'organigramma
|
|
-- (org_roles, per gli stakeholder INTERNI) e alle procedure (policies),
|
|
-- e collocazione automatica su una matrice a 4 quadranti.
|
|
--
|
|
-- Ancoraggio normativo: GV.SC-02 (ruoli/responsabilita verso fornitori,
|
|
-- clienti e partner) -> obblighi art. 24 D.Lgs. 138/2024. La matrice di
|
|
-- Mendelow (potere/interesse) e' BUONA PRASSI, NON un obbligo NIS2.
|
|
--
|
|
-- Modello: tabella DEDICATA `stakeholders` (NON una colonna su suppliers):
|
|
-- gli stakeholder interni (Dipendenti, Management, Azionisti...) non sono
|
|
-- fornitori. Gli esterni possono COLLEGARSI a un supplier esistente
|
|
-- (supplier_id, nessuna copia di dati): il modulo Supply Chain resta
|
|
-- intatto e coesiste.
|
|
--
|
|
-- Config-driven: righe di sistema con organization_id NULL; le voci
|
|
-- aggiunte dall'org hanno organization_id valorizzato.
|
|
--
|
|
-- Additivo, reversibile. Runner-safe: solo CREATE TABLE IF NOT EXISTS con
|
|
-- le FK DENTRO il corpo del CREATE (il runner non ha pre-check per
|
|
-- ADD CONSTRAINT; con IF NOT EXISTS il CREATE e' nativamente idempotente).
|
|
-- Nessun DELIMITER, nessuna stored procedure, nessun ';' nei commenti.
|
|
--
|
|
-- I dati (4 quadranti + 30 tipi di sistema) sono seedati dal CLI
|
|
-- idempotente application/cli/seed_stakeholders.php (modello seed_framework.php),
|
|
-- che crea anche le tabelle se mancanti. Eseguire dentro il container app:
|
|
-- docker exec nis2-app php /var/www/nis2-agile/application/cli/seed_stakeholders.php
|
|
-- =====================================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS cfg_stakeholder_types (
|
|
code VARCHAR(16) NOT NULL,
|
|
organization_id INT NULL, -- NULL = tipo di sistema; valorizzato = tipo dell'org
|
|
tipo ENUM('Interno','Esterno') NOT NULL,
|
|
descr TEXT NOT NULL,
|
|
ord INT NOT NULL DEFAULT 0,
|
|
created_by INT NULL,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (code),
|
|
KEY idx_cfg_stk_type_org (organization_id),
|
|
CONSTRAINT fk_cfg_stk_type_org FOREIGN KEY (organization_id) REFERENCES organizations (id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_cfg_stk_type_user FOREIGN KEY (created_by) REFERENCES users (id) ON DELETE SET NULL
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE IF NOT EXISTS cfg_stakeholder_quadrants (
|
|
code VARCHAR(4) NOT NULL, -- Q1..Q4
|
|
organization_id INT NULL, -- NULL = quadrante di sistema (per C5.1 solo sistema)
|
|
label VARCHAR(64) NOT NULL,
|
|
strategy TEXT NULL,
|
|
power_min TINYINT NOT NULL,
|
|
power_max TINYINT NOT NULL,
|
|
interest_min TINYINT NOT NULL,
|
|
interest_max TINYINT NOT NULL,
|
|
ord INT NOT NULL DEFAULT 0,
|
|
PRIMARY KEY (code),
|
|
KEY idx_cfg_stk_quad_org (organization_id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE IF NOT EXISTS stakeholders (
|
|
id INT NOT NULL AUTO_INCREMENT,
|
|
organization_id INT NOT NULL,
|
|
stak_code VARCHAR(16) NOT NULL, -- FK -> cfg_stakeholder_types.code
|
|
name VARCHAR(255) NOT NULL,
|
|
org_role_id INT NULL, -- solo INTERNI: nodo dell'organigramma
|
|
supplier_id INT NULL, -- solo ESTERNI: link opzionale al modulo Supply Chain
|
|
power TINYINT NULL, -- 0..5, NULL = non ancora valutato
|
|
interest TINYINT NULL, -- 0..5, NULL = non ancora valutato
|
|
contact_name VARCHAR(255) NULL,
|
|
contact_email VARCHAR(255) NULL,
|
|
notes TEXT NULL,
|
|
created_by INT NULL,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (id),
|
|
KEY idx_stk_org (organization_id),
|
|
KEY idx_stk_org_code (organization_id, stak_code),
|
|
KEY idx_stk_role (org_role_id),
|
|
KEY idx_stk_supplier (supplier_id),
|
|
CONSTRAINT fk_stk_org FOREIGN KEY (organization_id) REFERENCES organizations (id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_stk_code FOREIGN KEY (stak_code) REFERENCES cfg_stakeholder_types (code),
|
|
CONSTRAINT fk_stk_role FOREIGN KEY (org_role_id) REFERENCES org_roles (id) ON DELETE SET NULL,
|
|
CONSTRAINT fk_stk_supplier FOREIGN KEY (supplier_id) REFERENCES suppliers (id) ON DELETE SET NULL,
|
|
CONSTRAINT fk_stk_user FOREIGN KEY (created_by) REFERENCES users (id) ON DELETE SET NULL
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE IF NOT EXISTS stakeholder_procedures (
|
|
stakeholder_id INT NOT NULL,
|
|
policy_id INT NOT NULL,
|
|
PRIMARY KEY (stakeholder_id, policy_id),
|
|
KEY idx_stk_proc_policy (policy_id),
|
|
CONSTRAINT fk_stk_proc_stk FOREIGN KEY (stakeholder_id) REFERENCES stakeholders (id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_stk_proc_policy FOREIGN KEY (policy_id) REFERENCES policies (id) ON DELETE CASCADE
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- ROLLBACK (manuale):
|
|
-- DROP TABLE IF EXISTS stakeholder_procedures
|
|
-- DROP TABLE IF EXISTS stakeholders
|
|
-- DROP TABLE IF EXISTS cfg_stakeholder_quadrants
|
|
-- DROP TABLE IF EXISTS cfg_stakeholder_types
|