[FIX] Epic C / C5 open-items — upload ripristinato + fonti ACN aggiornate + UI
- UPLOAD ALLEGATI RIPRISTINATO in prod (causa: il sito è servito da php-fpm HOST e public/uploads era git:git senza ACL per www-data → move_uploaded_file falliva; fix host: setfacl -R -m u:www-data:rwx -m d:u:www-data:rwx public/uploads). Collaudato: upload interno+portale .pdf 201, .html→422. Risolve anche evidence_files/visure. - nis2_sources.php (fonti-certe): Determina 333017/2025 datata 22 settembre 2025 e marcata STORICA/superata; aggiunta entry VIGENTE 379887/2025 (efficace dal 31/12/2025); URL ACN autorevoli (date-giorno marcate [da confermare sul testo ufficiale], verifica nis2-expert). - UI attività: create+assign non lascia più attività orfane su errore (no duplicati su retry, messaggio chiaro) + assegnazione individuale richiede almeno un destinatario; blocco PWA di stakeholder-activities allineato (favicon-16/status-bar/application-name). v1.21.2. ESCALATION (decisione di Simon, non modificata): nis2_sources.php riga 79 riporta "37 misure / 92 requisiti" per gli importanti (dato file Simon), ma la pagina UFFICIALE ACN indica "37/87". Da riconciliare con Simon (open item #2). NON cambiato per rispettare la decisione bloccata. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
f065d70dda
commit
3051983003
@@ -61,10 +61,13 @@
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<meta name="theme-color" content="#0066CC">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/assets/icons/favicon-32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/assets/icons/favicon-16.png">
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/assets/icons/apple-touch-icon.png">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="default">
|
||||
<meta name="apple-mobile-web-app-title" content="NIS2 Agile">
|
||||
<meta name="application-name" content="NIS2 Agile">
|
||||
<script src="/js/pwa.js?v=20260614" defer></script>
|
||||
<!-- PWA:end -->
|
||||
</head>
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user