🚨 NUCLEO EMERGENZE OPERATIVE G.I.V. 📞 CHIAMA 112 📞 CENTRALE G.I.V.: +39 353 491 8472

Accesso Operativo

Dirigente (Accesso completo): DIR-01 (Pass: admin)
Guardia Zoofila: ZOO-01 (Pass: zoofila)
Operatore Standard: GIV-101 (Pass: 1234)

GRUPPO INTERNAZIONALE VIGILANZA

Sistema Operativo Avanzato & Registro Turni

Sessione attiva: — —
Modulo Inizio / Fine Servizio (Con GPS & Foto)
🗓️ Programmazione Turni & Squadre Future
Turni Futuri In Programma
Data Prevista Servizio / Evento Squadra Operatori Azione
Verbale di Controllo Microchip & Anagrafe Canina
Database Persone & Microchip Controllati
Orario Persona Controllata Indirizzo / Città Documento / CF N. Microchip Razza / Specie Luogo Controllo Esito
👥 Gestione Squadre e Sottogruppi G.I.V.
Squadra Caposquadra Membri Assegnati Azioni
Anagrafe ASP & Servizi Veterinari di Zona
Presidio / Asp Zona / Comune Contatto Telefonico Operatività
ASP Ragusa - Servizio Veterinario Ragusa / Modica / Vittoria 0932 234111 Pronto Intervento H24
ASP Catania - Sanità Animale Catania e Provincia 095 254111 Reperibilità Festivi/Notturni
👑 Pannello Esclusivo Dirigente - Gestione Badge & Ruoli
Badge Nome / Email Ruolo Stato Email Azioni Dirigente
Esportazione e Backup Dati

Scarica i dati salvati su questo dispositivo. Il backup JSON permette di ripristinare tutto in seguito.

PDF / Stampa

Nella finestra di stampa scegli «Salva come PDF» come destinazione.

CSV / Backup

`; const w = window.open('', '_blank', 'width=900,height=700'); if (!w) return alert('Consenti i popup per generare il PDF.'); w.document.open(); w.document.write(doc); w.document.close(); } function downloadBlob(filename, content, mime) { const blob = new Blob([content], { type: mime || 'text/plain;charset=utf-8;' }); const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = filename; link.click(); setTimeout(() => URL.revokeObjectURL(link.href), 2000); } function esportaBackupJSON() { const backup = { versione: 'GIV-1.0', dataExport: new Date().toISOString(), turni: JSON.parse(localStorage.getItem('giv_turni') || '[]'), zoofila: JSON.parse(localStorage.getItem('giv_zoofila') || '[]'), pianificazione: JSON.parse(localStorage.getItem('giv_pianificazione') || '[]'), squadre: JSON.parse(localStorage.getItem('giv_squadre') || '[]'), // utenti senza password hash esposte in chiaro se plain - includiamo struttura users: JSON.parse(localStorage.getItem('giv_users') || '[]').map(u => ({ badge: u.badge, name: u.name, role: u.role, active: u.active, email: u.email, emailVerified: u.emailVerified // password omessa dal backup leggero; per backup completo includere pass })) }; // Backup completo con password (solo locale / dirigente) backup.usersFull = JSON.parse(localStorage.getItem('giv_users') || '[]'); const nome = 'backup_giv_' + new Date().toISOString().slice(0,10) + '.json'; downloadBlob(nome, JSON.stringify(backup, null, 2), 'application/json'); alert('Backup JSON scaricato: ' + nome); } function esportaCSVPianificazione() { const list = JSON.parse(localStorage.getItem('giv_pianificazione') || '[]'); let csv = 'Data,Servizio,Squadra,Operatori\n'; list.forEach(p => { csv += `"${p.data || ''}","${p.servizio || ''}","${p.squadra || ''}","${p.operatori || ''}"\n`; }); downloadBlob('pianificazione_giv.csv', csv, 'text/csv;charset=utf-8;'); } function esportaCSVSquadre() { const list = JSON.parse(localStorage.getItem('giv_squadre') || '[]'); let csv = 'Nome Squadra,Caposquadra,Membri\n'; list.forEach(s => { csv += `"${s.nome || ''}","${s.capo || ''}","${s.membri || ''}"\n`; }); downloadBlob('squadre_giv.csv', csv, 'text/csv;charset=utf-8;'); } function esportaCSVUtenti() { if (!isDirigente(currentUser)) return alert('Solo Dirigenza.'); const list = JSON.parse(localStorage.getItem('giv_users') || '[]'); let csv = 'Badge,Nome,Ruolo,Attivo,Email,EmailVerificata\n'; list.forEach(u => { csv += `"${u.badge || ''}","${u.name || ''}","${u.role || ''}","${u.active !== false}","${u.email || ''}","${!!u.emailVerified}"\n`; }); downloadBlob('utenti_giv.csv', csv, 'text/csv;charset=utf-8;'); } function importaBackupJSON() { if (!isDirigente(currentUser)) return alert('Solo Dirigenza.'); const input = document.getElementById('importBackupFile'); if (!input || !input.files || !input.files[0]) return alert('Seleziona un file JSON di backup.'); const reader = new FileReader(); reader.onload = function(ev) { try { const data = JSON.parse(ev.target.result); if (!confirm('Importare il backup? I dati attuali verranno sovrascritti.')) return; if (data.turni) localStorage.setItem('giv_turni', JSON.stringify(data.turni)); if (data.zoofila) localStorage.setItem('giv_zoofila', JSON.stringify(data.zoofila)); if (data.pianificazione) localStorage.setItem('giv_pianificazione', JSON.stringify(data.pianificazione)); if (data.squadre) localStorage.setItem('giv_squadre', JSON.stringify(data.squadre)); if (data.usersFull) localStorage.setItem('giv_users', JSON.stringify(data.usersFull)); else if (data.users) { // merge senza password se solo users leggero const existing = JSON.parse(localStorage.getItem('giv_users') || '[]'); data.users.forEach(nu => { const ex = existing.find(x => x.badge === nu.badge); if (ex) Object.assign(ex, nu); else existing.push({ ...nu, pass: 'changeme', active: true }); }); localStorage.setItem('giv_users', JSON.stringify(existing)); } alert('Backup importato. Ricarico la pagina.'); location.reload(); } catch (err) { alert('File non valido: ' + err.message); } }; reader.readAsText(input.files[0]); } // Init non bloccante try { if (typeof initData === 'function') initData(); } catch (e) { console.error(e); } // Account sistema sempre disponibili anche se init fallisce try { const raw = localStorage.getItem('giv_users'); if (!raw) { localStorage.setItem('giv_users', JSON.stringify([ { badge:'DIR-01', pass:'admin', name:'Dirigente Generale', role:'Dirigente Generale', active:true, email:'dirigente@giv.it', emailVerified:true }, { badge:'GIV-101', pass:'1234', name:'Operatore Squadra 1', role:'Operatore Standard', active:true, email:'operatore@giv.it', emailVerified:true }, { badge:'ZOO-01', pass:'zoofila', name:'Guardia Zoofila 1', role:'Guardia Zoofila', active:true, email:'zoofila@giv.it', emailVerified:true } ])); } } catch(e2) {}