diff --git a/public/js/api.js b/public/js/api.js index 5c2de9e..bafe57d 100644 --- a/public/js/api.js +++ b/public/js/api.js @@ -269,7 +269,9 @@ class NIS2API { importAssets(data) { return this.post('/assets/import', data); } // P2 import CMDB/CSV getControlsMonitoring() { return this.get('/audit/controlsMonitoring'); } getAcnRequirements() { return this.get('/audit/acnRequirements'); } // requisiti ACN per org - updateAcnRequirement(id, status, note) { return this.put(`/audit/acnRequirements/${id}`, { status, evidence_note: note }); } // P1 continuous control monitoring (JWT) + updateAcnRequirement(id, status, note) { return this.put(`/audit/acnRequirements/${id}`, { status, evidence_note: note }); } + sendSupplierQuestionnaire(id, email) { return this.post(`/supply-chain/${id}/send-questionnaire`, email ? { email } : {}); } // self-assessment fornitore (link esterno) + getSupplierQuestionnaireStatus(id) { return this.get(`/supply-chain/${id}/questionnaire-status`); } // P1 continuous control monitoring (JWT) // ═══════════════════════════════════════════════════════════════════ // Audit diff --git a/public/supply-chain.html b/public/supply-chain.html index 450b95d..92421a3 100644 --- a/public/supply-chain.html +++ b/public/supply-chain.html @@ -661,9 +661,12 @@ - + `; @@ -1130,6 +1133,29 @@ } } + // ── Invio questionario self-assessment al fornitore (link esterno) ── + async function sendSupplierQuestionnaire(supplierId, supplierName) { + const def = ''; + const email = prompt('Invia il questionario di sicurezza a "' + (supplierName || 'fornitore') + + '".\nEmail del fornitore (lascia vuoto per usare il contatto in anagrafica):', def); + if (email === null) return; // annullato + try { + const result = await api.sendSupplierQuestionnaire(supplierId, email.trim() || null); + if (result.success) { + const link = result.data?.link; + showNotification('Questionario inviato' + (result.data?.sent_to ? ' a ' + result.data.sent_to : '') + '.', 'success'); + if (link) { + // mostra anche il link generato (utile se l'email non parte / per invio manuale) + prompt('Link del questionario (valido 30 giorni) — puoi inoltrarlo manualmente:', link); + } + } else { + showNotification(result.message || 'Errore nell\'invio del questionario.', 'error'); + } + } catch (e) { + showNotification('Errore di connessione.', 'error'); + } + } + // ── Init ──────────────────────────────────────────────── loadSuppliers();