[FEAT] Modulo Controlli periodici (control monitoring §9.1/A.8.16) — v1.23.0
Registro controlli ricorrenti (owner/frequenza/metodo/controllo SoA-NIS2 collegato) + registro esecuzioni come EVIDENZA (data/esito/note) con avanzamento automatico della scadenza; da esito non conforme generazione NC o NC+azione correttiva (riuso non_conformities/capa_actions, nuova source 'monitoring'); report scheda+storico stampabile; scadenze nel Calendario unico. mig.057: periodic_controls + periodic_control_executions (FK CASCADE, UNIQUE (organization_id, code)). PeriodicControlController (slug periodic-controls) + controlli-periodici.html + CalendarController.srcPeriodicControls. Fix da flotta di verifica avversariale (9 finding confermati): - advance(): correzione overflow strtotime '+1 month' (31/01 -> 28/02, no salto mese) via DateTimeImmutable con clamp all'ultimo giorno valido (mensile/ trimestrale/semestrale/annuale); giornaliero/settimanale/custom invariati. - create(): retry-on-duplicate del codice CTL-NNN con UNIQUE (org_id, code). - update(): array_key_exists per azzerare owner_role_id / next_due_date. - delete(): rimossa cleanup morta su review_schedule (il calendario legge diretto). - CalendarController.srcReviewSchedule: esclude internal_audit/stakeholder_activity (gia' con sorgente diretta) -> fix doppia comparsa nel calendario. - calendario.html: TYPE_META 'periodic_control' (chip filtro + label + colore). Additivo. Cache-buster ?v= bump (sidebar) + sw cache nis2-shell-v1.23.0. 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
0738504fdd
commit
4fdeae7cee
@@ -371,6 +371,14 @@ class NIS2API {
|
||||
return this._acn(this.get('/calendar/summary' + (q ? '?' + q : '')));
|
||||
}
|
||||
|
||||
// ── Controlli periodici (control monitoring §9.1/A.8.16) ──
|
||||
pctlList() { return this._acn(this.get('/periodic-controls/list')); }
|
||||
pctlGet(id) { return this._acn(this.get(`/periodic-controls/${id}`)); }
|
||||
pctlCreate(d) { return this._acn(this.post('/periodic-controls/create', d || {})); }
|
||||
pctlUpdate(id, d) { return this._acn(this.put(`/periodic-controls/${id}`, d || {})); }
|
||||
pctlDelete(id) { return this._acn(this.del(`/periodic-controls/${id}`)); }
|
||||
pctlAddExecution(id, d) { return this._acn(this.post(`/periodic-controls/${id}/executions`, d || {})); }
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════════
|
||||
// Dashboard
|
||||
// ═══════════════════════════════════════════════════════════════════
|
||||
|
||||
@@ -92,6 +92,7 @@
|
||||
{ name: 'Formazione', href: 'training.html', icon: iconAcademicCap(), i18nKey: 'nav.training' },
|
||||
{ name: 'Inventario', href: 'assets.html', icon: iconServer(), i18nKey: 'nav.assets' },
|
||||
{ name: 'Audit interni', href: 'internal-audits.html', icon: `<svg viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4zm5.707 6.707a1 1 0 00-1.414-1.414L7 10.586l-.293-.293a1 1 0 00-1.414 1.414l1 1a1 1 0 001.414 0l2-2zM10 13a1 1 0 100 2h3a1 1 0 100-2h-3z" clip-rule="evenodd"/></svg>`, i18nKey: 'nav.internal_audits' },
|
||||
{ name: 'Controlli periodici', href: 'controlli-periodici.html', icon: `<svg viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm1-12a1 1 0 10-2 0v4a1 1 0 00.293.707l2.5 2.5a1 1 0 001.414-1.414L11 9.586V6z" clip-rule="evenodd"/></svg>`, i18nKey: 'nav.periodic_controls' },
|
||||
{ name: 'Riesame di Direzione', href: 'management-review.html', icon: `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 11l3 3L22 4"/><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"/></svg>`, i18nKey: 'nav.management_review' },
|
||||
{ name: 'Audit & Report', href: 'reports.html', icon: iconChartBar(), i18nKey: 'nav.audit' }
|
||||
]
|
||||
|
||||
@@ -218,6 +218,7 @@ function loadSidebar() {
|
||||
{ name: 'Formazione', href: 'training.html', icon: iconAcademicCap(), i18nKey: 'nav.training' },
|
||||
{ name: 'Inventario', href: 'assets.html', icon: iconServer(), i18nKey: 'nav.assets' },
|
||||
{ name: 'Audit interni', href: 'internal-audits.html', icon: `<svg viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4zm5.707 6.707a1 1 0 00-1.414-1.414L7 10.586l-.293-.293a1 1 0 00-1.414 1.414l1 1a1 1 0 001.414 0l2-2zM10 13a1 1 0 100 2h3a1 1 0 100-2h-3z" clip-rule="evenodd"/></svg>`, i18nKey: 'nav.internal_audits' },
|
||||
{ name: 'Controlli periodici', href: 'controlli-periodici.html', icon: `<svg viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm1-12a1 1 0 10-2 0v4a1 1 0 00.293.707l2.5 2.5a1 1 0 001.414-1.414L11 9.586V6z" clip-rule="evenodd"/></svg>`, i18nKey: 'nav.periodic_controls' },
|
||||
{ name: 'Riesame di Direzione', href: 'management-review.html', icon: `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 11l3 3L22 4"/><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"/></svg>`, i18nKey: 'nav.management_review' },
|
||||
{ name: 'Audit & Report',href: 'reports.html', icon: iconChartBar(), i18nKey: 'nav.audit' },
|
||||
]
|
||||
|
||||
@@ -400,6 +400,42 @@ const HelpSystem = (function () {
|
||||
'NOTA: gli obblighi normativi in Italia derivano dal D.Lgs. 138/2024; la matrice e i framework NIST CSF/ACN sono strumenti di supporto, non un parere legale.'
|
||||
]
|
||||
},
|
||||
'controlli-periodici': {
|
||||
title: 'Guida - Controlli periodici',
|
||||
intro: 'Il modulo Controlli periodici gestisce i controlli RICORRENTI di monitoraggio (ISO/IEC 27001 §9.1 e A.8.16): definisci ogni controllo con responsabile, frequenza e metodo, e registri ogni esecuzione con esito ed evidenze. Lo storico delle esecuzioni è la prova del monitoraggio nel tempo. È uno strumento di supporto organizzativo, non un parere legale.',
|
||||
sections: [
|
||||
{
|
||||
heading: 'Definire un controllo',
|
||||
items: [
|
||||
'Crea un <strong>controllo</strong> con titolo, categoria, <strong>responsabile</strong> (ruolo dell\'organigramma), <strong>frequenza</strong> (giornaliera, settimanale, mensile, trimestrale, semestrale, annuale o personalizzata) e metodo di verifica. Riceve un codice <strong>CTL-NNN</strong>.',
|
||||
'Puoi collegarlo a un <strong>controllo del SoA/NIS2</strong> (campo "Controllo collegato", es. A.8.13): così il controllo periodico diventa l\'<strong>evidenza operativa</strong> che quel controllo tecnico funziona.',
|
||||
'La <strong>prossima scadenza</strong> compare nel <strong>Calendario</strong> con stato in ritardo / in scadenza / pianificato.'
|
||||
]
|
||||
},
|
||||
{
|
||||
heading: 'Registrare le esecuzioni (evidenza)',
|
||||
items: [
|
||||
'Dal dettaglio, <strong>Registra esecuzione</strong>: indichi data, <strong>esito</strong> (conforme, parziale, non conforme, non applicabile) e note/evidenze. La scadenza <strong>avanza automaticamente</strong> secondo la frequenza.',
|
||||
'Lo <strong>storico</strong> delle esecuzioni è la prova, all\'auditor, che il controllo è eseguito periodicamente.',
|
||||
'Il pulsante <strong>Report</strong> genera la scheda del controllo con lo storico, stampabile.'
|
||||
]
|
||||
},
|
||||
{
|
||||
heading: 'Generazione NC / azioni correttive',
|
||||
items: [
|
||||
'Su esito <strong>non conforme o parziale</strong> puoi <strong>generare una non conformità (NC)</strong> oppure <strong>NC + azione correttiva (AC)</strong>: confluiscono nel modulo <strong>NCR/CAPA</strong>, dove gestisci root cause e azioni.',
|
||||
'Riferimenti: <strong>ISO/IEC 27001 §10.2</strong> (non conformità e azioni correttive). Le azioni correttive sono collegate alla NC di origine.'
|
||||
]
|
||||
}
|
||||
],
|
||||
references: [
|
||||
'ISO/IEC 27001:2022 §9.1 - Monitoraggio, misurazione, analisi e valutazione',
|
||||
'ISO/IEC 27001:2022 Annex A.8.16 - Attività di monitoraggio',
|
||||
'ISO/IEC 27001:2022 §10.2 - Non conformità e azioni correttive',
|
||||
'Il monitoraggio periodico dei controlli è buona prassi (continuous control monitoring); gli obblighi normativi in Italia derivano dal D.Lgs. 138/2024.',
|
||||
'NOTA: strumento di supporto organizzativo, non un parere legale.'
|
||||
]
|
||||
},
|
||||
'internal-audits': {
|
||||
title: 'Guida - Audit interni',
|
||||
intro: 'Il modulo Audit interni gestisce il ciclo degli audit del SGSI previsto dalla clausola 9.2 della ISO/IEC 27001: programmi gli audit, conduci la checklist (clausole 4-10 ISO 27001 + controlli Annex A applicabili dal tuo SoA), registri gli esiti riga per riga, apri una non conformità sui punti non conformi e generi il report stampabile. È uno strumento di supporto organizzativo, non un parere legale.',
|
||||
@@ -1403,6 +1439,8 @@ const HelpSystem = (function () {
|
||||
'management-review': 'management-review',
|
||||
'calendario.html': 'calendario',
|
||||
'calendario': 'calendario',
|
||||
'controlli-periodici.html': 'controlli-periodici',
|
||||
'controlli-periodici': 'controlli-periodici',
|
||||
'stakeholder-activities': 'stakeholder-activities',
|
||||
'risks.html': 'risks',
|
||||
'risks': 'risks',
|
||||
|
||||
@@ -82,6 +82,8 @@ const I18n = (function () {
|
||||
'iaud.title': { it: 'Audit interni', en: 'Internal audits' },
|
||||
'nav.management_review': { it: 'Riesame di Direzione', en: 'Management Review' },
|
||||
'mreview.title': { it: 'Riesame di Direzione', en: 'Management Review' },
|
||||
'nav.periodic_controls': { it: 'Controlli periodici', en: 'Periodic controls' },
|
||||
'pctl.title': { it: 'Controlli periodici', en: 'Periodic controls' },
|
||||
'nav.risks': { it: 'Rischi', en: 'Risks' },
|
||||
'nav.incidents': { it: 'Incidenti', en: 'Incidents' },
|
||||
'nav.policies': { it: 'Policy', en: 'Policies' },
|
||||
|
||||
Reference in New Issue
Block a user