diff --git a/application/config/nis2_sources.php b/application/config/nis2_sources.php
index 84503ad..b781e95 100644
--- a/application/config/nis2_sources.php
+++ b/application/config/nis2_sources.php
@@ -52,16 +52,25 @@ return [
'full' => 'Determinazione del Direttore generale dell\'Agenzia per la Cybersicurezza Nazionale n. 164179 del 14 aprile 2025, in attuazione del D.Lgs. 138/2024, che stabilisce modalita e specifiche di base per gli obblighi di cui agli articoli 23, 24, 25, 29 e 32 (incluse classificazione e notifica degli incidenti significativi: Allegato 3 = soggetti IMPORTANTI, Allegato 4 = soggetti ESSENZIALI).',
'file' => 'docs/nis2/Determina164179_apr2025.pdf',
'authority' => 'Agenzia per la Cybersicurezza Nazionale (ACN)',
- 'url' => 'https://www.acn.gov.it/',
+ 'url' => 'https://www.acn.gov.it/portale/w/nis-avviata-la-seconda-fase',
],
'determina_333017_2025' => [
'key' => 'determina_333017_2025',
- 'short' => 'Determina ACN 333017/2025',
- 'citation' => 'Determinazione ACN n. 333017 del settembre 2025',
- 'full' => 'Determinazione del Direttore generale ACN n. 333017 (settembre 2025): termini, modalita e procedimenti di utilizzo e accesso alla piattaforma digitale ACN, ulteriori informazioni che i soggetti devono fornire e designazione dei rappresentanti NIS sul territorio nazionale.',
+ 'short' => 'Determina ACN 333017/2025 (storica, superata)',
+ 'citation' => 'Determinazione ACN n. 333017 del 22 settembre 2025 (SUPERATA dalla n. 379887/2025)',
+ 'full' => 'Determinazione del Direttore generale ACN n. 333017 del 22 settembre 2025 [data-giorno da confermare sul testo ufficiale]: termini, modalita e procedimenti di utilizzo e accesso alla piattaforma digitale ACN, ulteriori informazioni che i soggetti devono fornire e designazione dei rappresentanti NIS sul territorio nazionale. NOTA: citazione STORICA, SUPERATA dalla Determinazione ACN n. 379887/2025 (efficace dal 31 dicembre 2025); per piattaforma/registrazione/designazioni fare riferimento alla 379887.',
'file' => 'docs/nis2/Determina333017_sett2025.pdf',
'authority' => 'Agenzia per la Cybersicurezza Nazionale (ACN)',
- 'url' => 'https://www.acn.gov.it/',
+ 'url' => 'https://www.acn.gov.it/portale/w/nis-avviata-la-seconda-fase',
+ ],
+ 'determina_379887_2025' => [
+ 'key' => 'determina_379887_2025',
+ 'short' => 'Determina ACN 379887/2025 (vigente)',
+ 'citation' => 'Determinazione ACN n. 379887/2025, efficace dal 31 dicembre 2025',
+ 'full' => 'Determinazione del Direttore generale ACN n. 379887/2025 (adozione 19 dicembre 2025 [da confermare sul testo ufficiale], efficacia dal 31 dicembre 2025) che SOSTITUISCE la n. 333017/2025: disciplina il Portale ACN e i Servizi NIS per il ciclo di registrazione 2026 (registrazione, aggiornamento dei dati entro 10 giorni dalla presentazione, designazioni incluso il referente CSIRT). Fonte VIGENTE per piattaforma/registrazione/designazioni.',
+ 'file' => null,
+ 'authority' => 'Agenzia per la Cybersicurezza Nazionale (ACN)',
+ 'url' => 'https://www.acn.gov.it/portale/w/nis-avviata-la-seconda-fase',
],
'ambiti_nis2' => [
'key' => 'ambiti_nis2',
diff --git a/public/stakeholder-activities.html b/public/stakeholder-activities.html
index defac52..1b29143 100644
--- a/public/stakeholder-activities.html
+++ b/public/stakeholder-activities.html
@@ -61,10 +61,13 @@
+
+
+
@@ -417,17 +420,20 @@
planned_date: el('act-planned').value || null, due_date: el('act-due').value || null,
policy_ids: getMulti('act-proc'),
};
+ const indIds = mode === 'individual' ? getMulti('act-stakeholders') : [];
+ if (mode === 'individual' && !indIds.length) { el('act-err').textContent = 'Seleziona almeno uno stakeholder.'; return; }
const btn = el('act-save'); btn.disabled = true;
try {
let actId;
if (id) { await api.stkActUpdate(parseInt(id, 10), payload); actId = parseInt(id, 10); }
- else { const r = await api.stkActCreate(payload); actId = r.id; }
- // assegnazione immediata
- if (mode === 'individual') {
- const ids = getMulti('act-stakeholders');
- if (ids.length) await api.stkActAssign(actId, { stakeholder_ids: ids });
- } else {
- await api.stkActAssign(actId, {});
+ else { const r = await api.stkActCreate(payload); actId = r.id; el('act-id').value = actId; } // evita create duplicati su retry
+ // assegnazione immediata; se fallisce, l'attività esiste già: NON ricreare
+ try {
+ await api.stkActAssign(actId, mode === 'individual' ? { stakeholder_ids: indIds } : {});
+ } catch (assignErr) {
+ await saLoadAll();
+ el('act-err').textContent = 'Attività salvata, ma assegnazione destinatari non riuscita: ' + (assignErr.message || '') + ' — riprova o assegna dal dettaglio.';
+ return;
}
showNotification(id ? 'Attività aggiornata.' : 'Attività creata e destinatari assegnati.', 'success');
actClose(); await saLoadAll();
diff --git a/public/sw.js b/public/sw.js
index a998db3..dea13ca 100644
--- a/public/sw.js
+++ b/public/sw.js
@@ -13,7 +13,7 @@
* Il nome cache include la release: va BUMPATO ad ogni rilascio (vedi version.json),
* cosi' activate elimina automaticamente la shell vecchia.
*/
-const CACHE = 'nis2-shell-v1.21.1';
+const CACHE = 'nis2-shell-v1.21.2';
const PRECACHE = [
'/offline.html',
diff --git a/public/version.json b/public/version.json
index c038b49..1ac0aba 100644
--- a/public/version.json
+++ b/public/version.json
@@ -1 +1 @@
-{"version": "1.21.1", "build": "2026-06-16-v1.21.1", "date": "2026-06-16", "changelog": "Epic C / C5 hardening (post-verifica flotta): upload allegati con ALLOWLIST estensioni (no html/svg/js same-origin) + nome file random; scadenza magic-link (mig.054 token_expires_at, 410 TOKEN_EXPIRED) + rate-limit endpoint portale + guard scritture su attivita' chiuse; send() non azzera piu' i destinatari gia' responded/acknowledged; assign individuale con semantica replace + guard lista vuota; update conserva assign_mode esistente; editor opzioni per domande a scelta singola/multipla; etichette stato localizzate; risposte mostrate inline (no alert); ARIA su modali/tab; escAttr nel portale; voce sidebar in common.js. Additivo."}
+{"version": "1.21.2", "build": "2026-06-16-v1.21.2", "date": "2026-06-16", "changelog": "Epic C / C5 — fix open-item post-verifica: upload allegati RIPRISTINATO in prod (ACL host www-data su public/uploads; risolve anche evidence/visure) — collaudato. UI: create+assign attività non lascia più attività orfane su errore (no duplicati, messaggio chiaro) e richiede destinatari per assegnazione individuale; blocco PWA di stakeholder-activities allineato (favicon-16, status-bar, application-name). Additivo."}