-- ===================================================================== -- 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