PageSourceSearch

https://tecdvr-v7.web.app/js/tec-dvr-indice-pacchetto.js?v=20.374.20

js tecdvr-v7.web.app collected 2026-10-03 12:39:16 UTC 13,698 bytes, 199 lines download raw bytes

1/**
2 * tec-dvr-indice-pacchetto.js — v20.373.116
3 *
4 * ── PERCHÉ ───────────────────────────────────────────────────────────────────────────────────
5 * Il committente: «il TecDVR genera il DVR ed i suoi allegati: verifica che quegli allegati
6 * (sono nel file zippato generato assieme al dvr) lo contengano».
7 *
8 * Verificato: il pacchetto contiene undici documenti — DVR, VRI, PEE, Fascicolo delle Valutazioni
9 * Specifiche, DUVRI, Allegati 5-10, Istruzioni di Sicurezza, Modulo Ricevimento, Schede di
10 * Sorveglianza Sanitaria, Informativa Visitatori, Organigramma della Sicurezza.
11 *
12 * MA IL DVR NON LO DICE. Il suo Quadro Sinottico, sotto «VALUTAZIONI ALLEGATE AL DVR», elenca
13 * soltanto i documenti che il tecnico ha registrato a mano nella Tab 10B — per GMR tre voci, con
14 * date del 2024 e del 2025 — e non nomina nessuno dei dieci documenti prodotti nello stesso
15 * istante. Chi legge il DVR non può sapere che cosa contiene il pacchetto che ha in mano.
16 *
17 * ── LA REGOLA ────────────────────────────────────────────────────────────────────────────────
18 * L'INDICE DEGLI ALLEGATI LO DICHIARA IL PACCHETTO, NON UNA LISTA COMPILATA A MANO.
19 * E le valutazioni obbligatorie per legge che risultano prive di dati devono EMERGERE — nel tool
20 * prima della generazione, e nel documento se il tecnico genera lo stesso.
21 *
22 * ── UN SOLO PROPRIETARIO ─────────────────────────────────────────────────────────────────────
23 * Questo modulo è l'unico posto che sa che cosa contiene un pacchetto DVR. Lo consultano il
24 * generatore del pacchetto (che cosa costruire) e il DVR (che cosa dichiarare): se divergessero,
25 * il documento tornerebbe a mentire sul proprio contenuto.
26 */
27(function (win) {
28  'use strict';
29  if (typeof win === 'undefined') return;
30
31  var VERSION = '20.373.198';
32
33  /**
34   * I documenti che il pacchetto produce sempre, nell'ordine in cui li numera.
35   * `id` coincide con il prefisso numerico usato dal generatore del pacchetto.
36   */
37  var DOCUMENTI = [
38    { n: '—',  id: 'dvr',        label: 'Relazione di valutazione dei rischi (documento presente)', norma: 'art. 28 D.Lgs. 81/08' },
39    { n: '01', id: 'vri',        label: 'Valutazione del Rischio Incendio (VRI)',                   norma: 'art. 46 D.Lgs. 81/08 · D.M. 03/09/2021' },
40    { n: '02', id: 'pee',        label: 'Piano di Emergenza ed Evacuazione (PEE)',                  norma: 'art. 43 c.1 lett. e-bis · D.M. 02/09/2021' },
41    { n: '03', id: 'fascicolo',  label: 'Fascicolo delle Valutazioni Specifiche',                   norma: 'art. 28 c.2 lett. a D.Lgs. 81/08' },
42    { n: '04', id: 'duvri',      label: 'DUVRI — rischi da interferenze',                           norma: 'art. 26 c.3 D.Lgs. 81/08' },
43    { n: '05', id: 'raccolta',   label: 'Allegati 5-10 (DPI, schede rischi, informativa, verbali)',  norma: 'artt. 36-37 · 77 D.Lgs. 81/08' },
44    { n: '06', id: 'istruzioni', label: 'Istruzioni di Sicurezza ai Lavoratori',                     norma: 'art. 36 D.Lgs. 81/08' },
45    { n: '07', id: 'ricevimento', label: 'Modulo Ricevimento Istruzioni e DPI',                      norma: 'art. 78 D.Lgs. 81/08' },
46    { n: '08', id: 'schedess',   label: 'Schede Sorveglianza Sanitaria',                             norma: 'artt. 41-42 D.Lgs. 81/08' },
47    { n: '09', id: 'visitatori', label: 'Informativa Visitatori',                                    norma: 'art. 26 c.1 lett. b D.Lgs. 81/08' },
48    { n: '10', id: 'organigramma', label: 'Organigramma della Sicurezza',                            norma: 'artt. 17-18 · 31 D.Lgs. 81/08' },
49    // v20.373.136 — l'allegato 11 usciva nel pacchetto e l'indice non lo nominava: un documento
50    // consegnato che l'indice non elenca fa dubitare che l'indice sia completo, ed e' esattamente
51    // l'affermazione indifendibile che questo file esiste per evitare.
52    // E' un ALLEGATO AGGIUNTIVO: non e' parte del DVR ex art. 28, e la sua riga lo dichiara.
53    // v20.373.142 — «Cui prodest?». L'allegato 11 era una PAGELLA DEL CONSULENTE: nove indicatori
54    // che misurano quanto bene il programma e' stato formalizzato. Al datore di lavoro non serviva,
55    // e al consulente faceva danno. Adesso e' il PIANO OPERATIVO: le stesse misure ordinate per
56    // scadenza, con chi vi deve provvedere e che cosa serve per considerarle chiuse.
57    { n: '11', id: 'executive', label: 'Piano Operativo delle Azioni di Miglioramento (allegato operativo, non parte del DVR)',
58      norma: 'art. 28 c.2 lett. c e d · art. 15 c.1 · ISO 45001 §8.1.2 e §10.2' },
59    // v20.373.146 — IL PROFILO DI RISCHIO, FOGLIO AUTOPORTANTE E OPZIONALE.
60    // Richiesta del committente: «l'allegato 12 deve poter uscire anche da solo, staccato dal
61    // pacchetto, come una pagina da lasciare al datore dopo il sopralluogo» — e un interruttore
62    // ON/OFF nel Dashboard per deciderlo. Percio' e' l'unica riga dell'indice CONDIZIONATA: se
63    // il tecnico non lo attiva, il documento non nasce e l'indice non lo nomina. Un indice che
64    // elenca un documento assente e' lo stesso difetto, rovesciato, del documento consegnato che
65    // l'indice non elenca (v20.373.136).
66    { n: '12', id: 'profilo', opzionale: true,
67      label: 'Profilo di Rischio della Sede (foglio autoportante, non parte del DVR)',
68      norma: 'art. 28 c.2 lett. a e d · art. 15 c.1 D.Lgs. 81/08' }
69  ];
70
71  /** L'interruttore. Il default e' SPENTO: un allegato che nasce sempre finisce per essere
72   *  ignorato sempre, e questo foglio ha senso quando il tecnico decide di lasciarlo. */
73  function profiloAttivo(d) {
74    return !!(d && d.allegatoProfiloRischio === true);
75  }
76
77
78  /** Righe pronte per il Quadro Sinottico del DVR. */
79  function righeIndice(d) {
80    return DOCUMENTI.filter(function (x) {
81      // un documento opzionale entra nell'indice solo se esce davvero nel pacchetto
82      if (!x.opzionale) return true;
83      if (x.id === 'profilo') return profiloAttivo(d);
84      return false;
85    }).map(function (x) {
86      return [(x.n === '—' ? '' : x.n + ' — ') + x.label, x.norma];
87    });
88  }
89
90  /**
91   * Le valutazioni obbligatorie per legge e il loro stato reale.
92   * @returns {{obbligatorie:Array, mancanti:Array, presenti:Array}}
93   *   mancanti = obbligatorie per norma su cui il progetto non porta alcun dato.
94   */
95  function statoValutazioniObbligatorie(d) {
96    var VS = win._tecValutazioniSpecifiche;
97    if (!VS || typeof VS.report !== 'function') return { obbligatorie: [], mancanti: [], presenti: [] };
98    var rep = [];
99    try { rep = VS.report(d) || []; } catch (_e) { rep = []; }
100    var obb = rep.filter(function (r) { return r.obbligo; });
101    return {
102      obbligatorie: obb,
103      mancanti: obb.filter(function (r) { return r.stato === 'da_completare'; }),
104      presenti: obb.filter(function (r) { return r.stato !== 'da_completare'; })
105    };
106  }
107
108  /**
109   * La clausola che il DVR deve portare quando viene emesso con valutazioni obbligatorie
110   * incomplete. Non serve a scusare l'omissione: serve a DICHIARARLA, che è l'unica cosa che
111   * riduce davvero il rischio. Un documento che tace su ciò che manca afferma implicitamente
112   * che non manca nulla — ed è quella, davanti a un organo di vigilanza, l'affermazione
113   * indifendibile (art. 28 c.2 lett. a; art. 29 c.1 D.Lgs. 81/08).
114   */
115  /**
116   * v20.373.118 — LA CLAUSOLA CHE INQUADRA LE MISURE PROGRAMMATE.
117   *
118   * Il committente: «nel pacchetto DVR occorre trovare una formula, in legalese, che protegga il
119   * DL». La formula protettiva non è una excusatio: è la qualificazione giuridica corretta di ciò
120   * che il documento contiene. Un intervento inserito nel programma di miglioramento NON è
121   * un'ammissione di inadempimento — è l'adempimento stesso dell'art. 28 c.2 lett. c), che quel
122   * programma lo pretende. Dirlo esplicitamente toglie ogni appiglio a una lettura diversa.
123   */
124  /**
125   * v20.373.154 (audit) — LA CLAUSOLA DICE DI QUALE DOCUMENTO PARLA.
126   * La stessa formula usciva in DUE documenti dello stesso pacchetto con numeri diversi: il DVR
127   * contava le misure esportate (4), il Piano Operativo i propri interventi assegnati (0). Non e'
128   * un errore che uno dei due sia diverso — sono due documenti e contano cose diverse — ma
129   * scrivere «Il presente documento» in entrambi lascia al lettore due numeri e nessun modo di
130   * capire perche'. Ora ciascuno si nomina.
131   */
132  function clausolaMisureProgrammate(n, opts) {
133    n = parseInt(n, 10) || 0;
134    if (!n) return null;
135    var chi = (opts && opts.documento) ? String(opts.documento) : 'Il presente documento';
136    return 'QUALIFICAZIONE DELLE MISURE DI MIGLIORAMENTO PROGRAMMATE — '
137      + chi + ' riporta ' + n + ' intervent' + (n === 1 ? 'o' : 'i')
138      + ' di miglioramento programmat' + (n === 1 ? 'o' : 'i') + '. '
139      + 'Tali interventi costituiscono attuazione dell\'obbligo di cui all\'art. 28 c.2 lett. c) del '
140      + 'D.Lgs. 81/08, che impone al documento di valutazione dei rischi di contenere il programma '
141      + 'delle misure ritenute opportune per garantire il miglioramento nel tempo dei livelli di '
142      + 'sicurezza. La loro indicazione non integra, né può essere interpretata come, il '
143      + 'riconoscimento di un inadempimento agli obblighi di legge da parte del Datore di Lavoro: '
144      + 'essa attesta, al contrario, che la valutazione dei rischi è stata condotta in modo '
145      + 'analitico e che le azioni di miglioramento sono state individuate, pianificate e assegnate. '
146      + 'La valutazione dei rischi è per sua natura dinamica e soggetta ad aggiornamento (art. 29 '
147      + 'c.3 D.Lgs. 81/08): gli interventi programmati sono monitorati e chiusi con evidenza '
148      + 'documentale a cura del Datore di Lavoro, con il supporto del Servizio di Prevenzione e '
149      + 'Protezione. Le risultanze del presente documento sono riferite alla data di emissione e '
150      + 'allo stato dei luoghi e dell\'organizzazione rilevato in tale data.';
151  }
152
153  function clausolaValutazioniIncomplete(mancanti) {
154    if (!mancanti || !mancanti.length) return '';
155    var elenco = mancanti.map(function (r) { return r.titolo + ' (' + r.norma + ')'; }).join('; ');
156    return 'AVVERTENZA SULLA COMPLETEZZA DELLA VALUTAZIONE (art. 28 c. 2 lett. a e art. 29 c. 1 '
157      + 'D.Lgs. 81/08). Alla data di emissione le seguenti valutazioni, dovute per norma, non '
158      + 'risultano completate con dati propri della realtà valutata: ' + elenco + '. '
159      + 'Il presente documento NON attesta l’esito di tali valutazioni e non può essere letto '
160      + 'come dichiarazione della loro assenza di rilievo: le stesse sono da completare a cura del '
161      + 'Datore di Lavoro, con il supporto del Servizio di Prevenzione e Protezione e, ove previsto, '
162      + 'del Medico Competente. Fino al loro completamento la valutazione dei rischi è da '
163      + 'considerarsi parziale limitatamente ai fattori indicati, e il documento è soggetto a '
164      + 'rielaborazione ai sensi dell’art. 29 c. 3. Le misure di prevenzione e protezione già '
165      + 'individuate restano applicabili e cogenti.';
166  }
167
168  function selfTest() {
169    var e = [];
170    if (DOCUMENTI.length !== 13) e.push('documenti del pacchetto: ' + DOCUMENTI.length + ' invece di 13');
171    var _a11 = DOCUMENTI.filter(function (x) { return x.id === 'executive'; })[0];
172    if (!_a11) e.push('l allegato 11 non e nell elenco dei documenti');
173    // ── v20.373.146 — L INDICE SEGUE L INTERRUTTORE ────────────────────────────────────────
174    // Il profilo di rischio e' opzionale: l'indice deve nominarlo quando esce e TACERLO quando
175    // non esce. Un indice che elenca un documento assente e' il difetto della .136 rovesciato.
176    var fissi = DOCUMENTI.filter(function (x) { return !x.opzionale; }).length;
177    if (righeIndice({}).length !== fissi) e.push('l indice nomina un allegato opzionale che non esce');
178    if (righeIndice({ allegatoProfiloRischio: true }).length !== fissi + 1) {
179      e.push('l indice non nomina il profilo di rischio quando il tecnico lo attiva');
180    }
181    if (profiloAttivo({})) e.push('il profilo di rischio nasce anche senza che il tecnico lo chieda');
182    if (!profiloAttivo({ allegatoProfiloRischio: true })) e.push('l interruttore del profilo di rischio non accende nulla');
183    if (DOCUMENTI.some(function (x) { return !x.label || !x.norma; })) e.push('documento senza etichetta o senza norma');
184    if (clausolaValutazioniIncomplete([]) !== '') e.push('clausola emessa senza valutazioni mancanti');
185    var c = clausolaValutazioniIncomplete([{ titolo: 'X', norma: 'Y' }]);
186    if (!/art\. 28 c\. 2 lett\. a/.test(c) || !/art\. 29 c\. 3/.test(c)) e.push('clausola senza riferimenti normativi');
187    return { ok: !e.length, errors: e };
188  }
189
190  win._tecDvrIndicePacchetto = {
191    VERSION: VERSION, profiloAttivo: profiloAttivo,
192    DOCUMENTI: DOCUMENTI,
193    righeIndice: righeIndice,
194    statoValutazioniObbligatorie: statoValutazioniObbligatorie,
195    clausolaValutazioniIncomplete: clausolaValutazioniIncomplete,
196    clausolaMisureProgrammate: clausolaMisureProgrammate,
197    selfTest: selfTest
198  };
199})(typeof window !== 'undefined' ? window : this);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.