netgescon-master/docs/02-architettura-laravel/05-chiavi-sicurezza/ANALISI-CHIAVI-SICUREZZA.md
Pikappa2 480e7eafbd 🎯 NETGESCON - Setup iniziale repository completo
📋 Commit iniziale con:
-  Documentazione unificata in docs/
-  Codice Laravel in netgescon-laravel/
-  Script automazione in scripts/
-  Configurazione sync rsync
-  Struttura organizzata e pulita

🔄 Versione: 2025.07.19-1644
🎯 Sistema pronto per Git distribuito
2025-07-19 16:44:47 +02:00

515 lines
17 KiB
Markdown

# NETGESCON - GESTIONE CHIAVI E SICUREZZA
## 📋 OVERVIEW
Sistema completo per la gestione delle chiavi condominiali, accessi ai locali tecnici, sicurezza degli spazi comuni e tracciabilità di tutte le operazioni di consegna/ritiro chiavi.
## 🔑 SISTEMA ARCHIVIO CHIAVI
### Tipologie Chiavi Standardizzate
#### Chiavi Accesso Principale
```
🚪 PORTONI E INGRESSI
├── Portone Principale (MAIN-DOOR)
│ ├── Chiave Master (MAIN-MASTER)
│ ├── Chiavi Standard Condomini (MAIN-STD-001, 002...)
│ └── Chiavi Servizio (MAIN-SRV-001, 002...)
├── Porte Secondarie (SEC-DOOR)
│ ├── Ingresso Servizio (SRV-DOOR)
│ ├── Uscita Emergenza (EMG-DOOR)
│ └── Accesso Garage (GAR-DOOR)
└── Cancelli Automatici (AUTO-GATE)
├── Chiave Override (GATE-OVR)
├── Telecomandi (GATE-REM-001, 002...)
└── Chiavi Manutenzione (GATE-MNT)
```
#### Chiavi Locali Tecnici
```
🔧 LOCALI TECNICI E SERVIZI
├── Centrale Termica (HEAT-PLANT)
│ ├── Chiave Principale (HEAT-MAIN)
│ ├── Chiave Emergenza Vigili Fuoco (HEAT-FIRE)
│ └── Chiave Manutenzione (HEAT-MNT)
├── Locale Contatori (METER-ROOM)
│ ├── Contatori Gas (MTR-GAS)
│ ├── Contatori Acqua (MTR-H2O)
│ └── Contatori Elettrici (MTR-ELEC)
├── Locale Pompe/Autoclave (PUMP-ROOM)
│ ├── Chiave Accesso (PUMP-ACC)
│ ├── Quadro Elettrico (PUMP-ELEC)
│ └── Valvole Principali (PUMP-VALV)
└── Locali Ascensori (ELEV-ROOM)
├── Vano Motore (ELEV-MOT-A, B...)
├── Quadro Comando (ELEV-CTL-A, B...)
└── Chiave Emergenza (ELEV-EMG)
```
#### Chiavi Spazi Comuni
```
🏛️ SPAZI CONDOMINIALI
├── Giardino/Terrazza (GARDEN)
│ ├── Cancelletto Accesso (GARD-GATE)
│ ├── Deposito Attrezzi (GARD-TOOL)
│ └── Irrigazione (GARD-IRR)
├── Sala Comune (COMMON-HALL)
│ ├── Accesso Principale (HALL-MAIN)
│ ├── Deposito Sedie/Tavoli (HALL-STOR)
│ └── Cucina/Angolo Cottura (HALL-KITCH)
├── Lavanderia (LAUNDRY)
│ ├── Accesso Generale (LAUN-ACC)
│ ├── Quadro Elettrico (LAUN-ELEC)
│ └── Scarichi/Valvole (LAUN-DRAIN)
└── Locale Biciclette (BIKE-ROOM)
├── Accesso (BIKE-ACC)
└── Catene/Lucchetti (BIKE-LOCK-001, 002...)
```
### Database Archivio Chiavi
#### Struttura Dati Principale
```sql
CREATE TABLE archivio_chiavi (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
stabile_id BIGINT NOT NULL,
-- Identificativi
codice_chiave VARCHAR(20) UNIQUE NOT NULL, -- Es: MAIN-STD-001
denominazione VARCHAR(100) NOT NULL, -- Es: "Portone Via Roma 15"
descrizione_dettagliata TEXT,
-- Categorizzazione
categoria_principale ENUM('accesso', 'tecnico', 'comune', 'servizio', 'emergenza'),
categoria_secondaria VARCHAR(50), -- portone, centrale_termica, giardino, etc.
-- Localizzazione
zona_stabile VARCHAR(50), -- Palazzina A, Scala 1, Piano -1, etc.
ubicazione_dettagliata TEXT, -- "Centrale termica nel seminterrato, lato cortile"
-- Gestione Copie
numero_copie_totali INT DEFAULT 1,
numero_copie_circolazione INT DEFAULT 0,
numero_copie_archivio INT DEFAULT 1,
numero_copie_perse INT DEFAULT 0,
-- Sicurezza
livello_sicurezza ENUM('basso', 'medio', 'alto', 'critico') DEFAULT 'medio',
richiede_autorizzazione BOOLEAN DEFAULT FALSE,
tempo_max_detenzione_giorni INT NULL, -- NULL = illimitato
-- QR Code e Tracciabilità
qr_code_uuid VARCHAR(36) UNIQUE,
qr_code_attivo BOOLEAN DEFAULT TRUE,
-- Stato
stato ENUM('attiva', 'persa', 'sostituita', 'ritirata') DEFAULT 'attiva',
data_creazione TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
data_ultima_modifica TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-- Note
note_particolari TEXT,
istruzioni_utilizzo TEXT,
FOREIGN KEY (stabile_id) REFERENCES stabili(id),
INDEX idx_codice_chiave (codice_chiave),
INDEX idx_categoria (categoria_principale, categoria_secondaria),
INDEX idx_qr_code (qr_code_uuid)
);
```
#### Copie Singole Chiavi
```sql
CREATE TABLE copie_chiavi (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
archivio_chiave_id BIGINT NOT NULL,
-- Identificativo copia
numero_copia VARCHAR(10) NOT NULL, -- 001, 002, 003...
codice_completo VARCHAR(30), -- MAIN-STD-001-C001 (generato automaticamente)
-- QR specifico copia
qr_code_copia VARCHAR(36) UNIQUE,
-- Stato copia
stato_copia ENUM('disponibile', 'assegnata', 'persa', 'danneggiata') DEFAULT 'disponibile',
-- Assegnazione corrente
assegnata_a_persona_id BIGINT NULL,
data_assegnazione TIMESTAMP NULL,
data_riconsegna_prevista DATE NULL,
-- Tracciabilità fisica
posizione_attuale VARCHAR(100), -- "Cassetta chiavi ufficio amministratore"
ultima_verifica_presenza DATE,
FOREIGN KEY (archivio_chiave_id) REFERENCES archivio_chiavi(id),
FOREIGN KEY (assegnata_a_persona_id) REFERENCES persone(id),
UNIQUE KEY uk_archivio_numero (archivio_chiave_id, numero_copia)
);
```
## 📋 SISTEMA ASSEGNAZIONE E TRACCIABILITÀ
### Registro Movimenti Chiavi
```sql
CREATE TABLE movimenti_chiavi (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
copia_chiave_id BIGINT NOT NULL,
-- Tipologia movimento
tipo_movimento ENUM('consegna', 'ritiro', 'trasferimento', 'verifica', 'sostituzione'),
-- Persone coinvolte
persona_consegnataria_id BIGINT NULL, -- Chi riceve
persona_consegnante_id BIGINT NULL, -- Chi consegna (admin, portiere)
persona_autorizzante_id BIGINT NULL, -- Chi autorizza (se richiesto)
-- Dettagli movimento
data_movimento TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
motivo_richiesta TEXT NOT NULL,
durata_prevista_giorni INT NULL,
data_riconsegna_prevista DATE NULL,
data_riconsegna_effettiva DATE NULL,
-- Autorizzazioni
richiede_autorizzazione BOOLEAN DEFAULT FALSE,
autorizzazione_concessa BOOLEAN NULL,
data_autorizzazione TIMESTAMP NULL,
note_autorizzazione TEXT,
-- Conferme e firme
firma_digitale_consegnatario TEXT, -- Hash firma o file
firma_digitale_consegnante TEXT,
metodo_conferma ENUM('presenza_fisica', 'firma_digitale', 'sms', 'email'),
-- Tracciabilità
ip_address VARCHAR(45),
user_agent TEXT,
geolocalizzazione POINT, -- Se disponibile
-- Note
note_movimento TEXT,
condizioni_particolari TEXT,
FOREIGN KEY (copia_chiave_id) REFERENCES copie_chiavi(id),
FOREIGN KEY (persona_consegnataria_id) REFERENCES persone(id),
FOREIGN KEY (persona_consegnante_id) REFERENCES persone(id),
FOREIGN KEY (persona_autorizzante_id) REFERENCES persone(id)
);
```
### Sistema Autorizzazioni Gerarchiche
#### Matrice Autorizzazioni
```php
class ChiaveAuthorizationService {
protected $autorizzazioni = [
'amministratore' => [
'accesso' => ['tutte'],
'tecnico' => ['tutte'],
'comune' => ['tutte'],
'servizio' => ['tutte'],
'emergenza' => ['tutte']
],
'portiere' => [
'accesso' => ['portone_principale', 'portone_servizio'],
'tecnico' => ['previa_autorizzazione'],
'comune' => ['tutte'],
'servizio' => ['pulizie', 'manutenzione'],
'emergenza' => ['limitato']
],
'condomino_proprietario' => [
'accesso' => ['portone_principale'],
'tecnico' => ['previa_autorizzazione'],
'comune' => ['con_prenotazione'],
'servizio' => ['no'],
'emergenza' => ['no']
],
'condomino_inquilino' => [
'accesso' => ['portone_principale'],
'tecnico' => ['no'],
'comune' => ['con_prenotazione'],
'servizio' => ['no'],
'emergenza' => ['no']
],
'ditta_manutenzione' => [
'accesso' => ['previa_autorizzazione'],
'tecnico' => ['specifica_competenza'],
'comune' => ['no'],
'servizio' => ['temporaneo'],
'emergenza' => ['no']
]
];
public function verificaAutorizzazione($personaId, $chiaveId, $motivoRichiesta) {
$persona = Persona::find($personaId);
$chiave = ArchivioChinve::find($chiaveId);
$ruolo = $this->determinaRuolo($persona);
$categoria = $chiave->categoria_principale;
$autorizzazioni = $this->autorizzazioni[$ruolo][$categoria] ?? ['no'];
if (in_array('tutte', $autorizzazioni)) {
return true;
}
if (in_array('previa_autorizzazione', $autorizzazioni)) {
return $this->richiedeApprovazione($personaId, $chiaveId, $motivoRichiesta);
}
return false;
}
private function richiedeApprovazione($personaId, $chiaveId, $motivo) {
return RichiestaAutorizzazione::create([
'persona_richiedente_id' => $personaId,
'chiave_id' => $chiaveId,
'motivo' => $motivo,
'stato' => 'pending',
'data_richiesta' => now()
]);
}
}
```
## 📱 SISTEMA QR CODE E APP MOBILE
### Generazione QR Code Unici
```php
class QRCodeChiaveService {
/**
* Genera QR code univoco per ogni copia chiave
*/
public function generaQRCode($copiaChiaveId) {
$copia = CopiaChiave::find($copiaChiaveId);
$uuid = Str::uuid();
$qrData = [
'type' => 'netgescon_key',
'version' => '1.0',
'uuid' => $uuid,
'key_id' => $copia->id,
'key_code' => $copia->codice_completo,
'stabile_id' => $copia->archivioChiave->stabile_id,
'timestamp' => now()->timestamp,
'checksum' => $this->generaChecksum($copia, $uuid)
];
$copia->update(['qr_code_copia' => $uuid]);
return QrCode::size(200)
->format('png')
->merge('/public/logo-netgescon.png', 0.1, true)
->generate(json_encode($qrData));
}
/**
* Verifica QR code scansionato
*/
public function verificaQRCode($qrCodeData) {
$data = json_decode($qrCodeData, true);
if (!$this->verificaChecksum($data)) {
throw new InvalidQRCodeException('QR Code non valido o manomesso');
}
$copia = CopiaChiave::where('qr_code_copia', $data['uuid'])->first();
if (!$copia) {
throw new ChiaveNotFoundException('Chiave non trovata nel sistema');
}
return [
'copia_chiave' => $copia,
'archivio_chiave' => $copia->archivioChiave,
'stabile' => $copia->archivioChiave->stabile,
'stato_attuale' => $copia->stato_copia,
'assegnata_a' => $copia->assegnataAPersona,
'ultimo_movimento' => $copia->movimenti()->latest()->first()
];
}
}
```
### App Mobile Gestione Chiavi
#### Funzionalità Principali
1. **Scansione QR Code**
- Identificazione immediata chiave
- Cronologia movimenti
- Stato attuale
2. **Richiesta Chiavi**
- Form semplificato
- Upload documenti
- Notifica in tempo reale
3. **Riconsegna Chiavi**
- Conferma tramite QR
- Foto stato chiave
- Geolocalizzazione
4. **Dashboard Personale**
- Chiavi attualmente detenute
- Scadenze riconsegna
- Storico accessi
## 🔔 SISTEMA NOTIFICHE E ALERTING
### Notifiche Automatiche
```php
class ChiaveNotificationService {
/**
* Notifiche scadenze riconsegna
*/
public function notificheScadenze() {
$scadenzeImminenti = CopiaChiave::whereNotNull('assegnata_a_persona_id')
->where('data_riconsegna_prevista', '<=', now()->addDays(3))
->get();
foreach($scadenzeImminenti as $copia) {
$this->inviaNotificaScadenza($copia);
}
}
/**
* Alert chiavi non riconsegnate
*/
public function alertChiaviScadute() {
$chiavi_scadute = CopiaChiave::whereNotNull('assegnata_a_persona_id')
->where('data_riconsegna_prevista', '<', now())
->get();
foreach($chiavi_scadute as $copia) {
$this->inviaAlertAmministratore($copia);
$this->inviaRichiestaSollecito($copia);
}
}
/**
* Notifica movimenti sospetti
*/
public function monitoraggioSicurezza() {
// Troppi accessi in poco tempo
$accessiFrequenti = MovimentoChiave::where('created_at', '>', now()->subHours(1))
->select('copia_chiave_id')
->groupBy('copia_chiave_id')
->havingRaw('COUNT(*) > 5')
->get();
// Accessi fuori orario normale
$accessiFuoriOrario = MovimentoChiave::whereTime('data_movimento', '<', '06:00')
->orWhereTime('data_movimento', '>', '22:00')
->where('created_at', '>', now()->subDays(1))
->get();
foreach($accessiFrequenti as $movimento) {
$this->inviaAlertSicurezza('accessi_frequenti', $movimento);
}
foreach($accessiFuoriOrario as $movimento) {
$this->inviaAlertSicurezza('accessi_fuori_orario', $movimento);
}
}
}
```
## 📊 REPORTING E STATISTICHE
### Dashboard Gestione Chiavi
- **Panoramica chiavi per categoria**
- **Chiavi attualmente assegnate**
- **Scadenze imminenti**
- **Chiavi perse/da sostituire**
- **Statistiche utilizzo spazi comuni**
### Report Sicurezza
- **Log accessi per periodo**
- **Analisi pattern utilizzo**
- **Audit trail movimenti**
- **Report conformità assicurativa**
### Integrazione Assicurazioni
- **Export dati per polizze**
- **Certificazione sistemi sicurezza**
- **Documentazione accessi autorizzati**
- **Prove implementazione misure sicurezza**
## 🎯 ROADMAP IMPLEMENTAZIONE
### Fase 1: Archivio Base (2 settimane)
- ✅ Database archivio chiavi
- ✅ CRUD gestione chiavi
- ✅ Sistema copie multiple
### Fase 2: Tracciabilità (2 settimane)
- ✅ Movimenti e assegnazioni
- ✅ Sistema autorizzazioni
- ✅ Notifiche automatiche
### Fase 3: QR Code e Mobile (3 settimane)
- ✅ Generazione QR code
- ✅ App mobile base
- ✅ Scansione e verifica
### Fase 4: Sicurezza Avanzata (2 settimane)
- ✅ Monitoring accessi
- ✅ Alert automatici
- ✅ Reporting compliance
### Fase 5: Integrazione (1 settimana)
- ✅ Dashboard principale
- ✅ Export assicurazioni
- ✅ Ottimizzazione UX
## 5. SISTEMA ETICHETTATURA E QR CODES
### 5.1 Gestione Etichette Fisiche
- **Stampa Etichette per Organizzazione**
- Etichette per cassette postali
- Numerazione unità immobiliari
- Etichette per chiavi e badge
- Codici QR per accesso rapido a documenti
- Etichette per attrezzature condominiali
### 5.2 QR Code per Accesso Digitale
- **QR Linking a Sistema**
- QR su cassette postali → dati proprietario
- QR su chiavi → registro movimenti
- QR su impianti → schede tecniche
- QR per documenti → accesso immediato PDF
### 5.3 Stampante Integrata
```php
// Esempio implementazione stampa etichette
class EtichettaService {
public function stampaEtichettaCassetta($unitaId) {
$unita = UnitaImmobiliare::find($unitaId);
$qrCode = QrCode::size(50)->generate(
route('unita.show', $unitaId)
);
return view('stampa.etichetta-cassetta', [
'unita' => $unita,
'qrCode' => $qrCode
]);
}
public function stampaEtichettaChiave($chiaveId) {
$chiave = ChiaveStabile::find($chiaveId);
$qrCode = QrCode::size(40)->generate(
route('chiavi.movimento', $chiaveId)
);
return view('stampa.etichetta-chiave', [
'chiave' => $chiave,
'qrCode' => $qrCode
]);
}
}
```