# Sincronizzazione Addetti ed Editori tra Database

## Panoramica

Questo sistema sincronizza automaticamente le tabelle `tbl_addetti` e `tbl_editori` tra tutti i database degli eventi (es: Pordenone legge, Geografie, Milano FVG, ecc.).

## Funzionamento

La procedura segue un processo in 4 fasi:

1. **Fase 1A - Raccolta Editori**: Consolida tutti gli editori da tutti i database eventi → database comune
2. **Fase 1B - Raccolta Addetti**: Consolida tutti gli addetti da tutti i database eventi → database comune  
3. **Fase 2A - Distribuzione Editori**: Distribuisce gli editori dal database comune → tutti i database eventi
4. **Fase 2B - Distribuzione Addetti**: Distribuisce gli addetti dal database comune → tutti i database eventi

## Metodo 1: Esecuzione dall'Applicazione Web

### Requisiti
- Essere loggati come **Super Admin**
- Avere accesso al menu di amministrazione

### Procedura
1. Accedi all'applicazione
2. Vai all'URL: `/site/syncAddettiEditori`
3. La procedura verrà eseguita automaticamente
4. Visualizzerai i risultati sulla pagina

### Link Diretto
```
http://tuosito.local/site/syncAddettiEditori
```

## Metodo 2: Esecuzione da Terminale (MySQL)

### Prerequisiti

1. **Creare il database comune** (se non esiste):
```bash
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS pnlegge_common CHARACTER SET utf8 COLLATE utf8_general_ci;"
```

### Installazione

2. **Creare la procedura** nel database comune:
```bash
cd /path/to/pnlegge2026
mysql -u root -p pnlegge_common < protected/data/sync_addetti_editori_procedure.sql
```

Questo comando:
- Crea le tabelle `tbl_editori` e `tbl_addetti` nel database comune (se non esistono)
- Crea la stored procedure `sync_addetti_editori_consolidate_and_distribute()`

### Esecuzione

3. **Eseguire la sincronizzazione**:
```bash
mysql -u root -p pnlegge_common -e "CALL sync_addetti_editori_consolidate_and_distribute();"
```

L'output mostrerà:
- Numero di editori raccolti da ogni database
- Numero di addetti raccolti da ogni database
- Numero di editori distribuiti a ogni database
- Numero di addetti distribuiti a ogni database
- Riepilogo finale con totali

### Verifica

4. **Verificare i risultati**:
```bash
# Conta totale editori nel database comune
mysql -u root -p pnlegge_common -e "SELECT COUNT(*) AS total_editori FROM tbl_editori;"

# Conta totale addetti nel database comune
mysql -u root -p pnlegge_common -e "SELECT COUNT(*) AS total_addetti FROM tbl_addetti;"

# Visualizza ultimi 10 editori inseriti
mysql -u root -p pnlegge_common -e "SELECT * FROM tbl_editori ORDER BY casaEditriceId DESC LIMIT 10;"

# Visualizza ultimi 10 addetti inseriti
mysql -u root -p pnlegge_common -e "SELECT * FROM tbl_addetti ORDER BY id DESC LIMIT 10;"
```

## Database Coinvolti

La procedura sincronizza automaticamente tutti i database che corrispondono al pattern:
```
pordenonelegge_it_2026%
```

Questo include ad esempio:
- `pordenonelegge_it_2026_fuoricitta`
- `pordenonelegge_it_2026_geografie`
- `pordenonelegge_it_2026_hemingway`
- `pordenonelegge_it_2026_milanofvg`
- `pordenonelegge_it_2026_piulibri`
- `pordenonelegge_it_2026_pordenonelegge`
- `pordenonelegge_it_2026_salonelibro`
- `pordenonelegge_it_2026_tolmezzo`

## Gestione Duplicati e ID

### Editori
- **Chiave univoca**: `denominazione`
- Gli editori con la stessa denominazione vengono considerati identici
- **Gestione ID**: Gli ID originali (`casaEditriceId`) vengono **IGNORATI**
- Ogni database assegna i propri ID tramite AUTO_INCREMENT
- Esempio: "Mondadori" potrebbe essere ID 5 in DB1, ID 12 in DB2, ID 8 in DB3
- Usa `INSERT IGNORE` per evitare errori su duplicati
- Solo il primo editore con una data denominazione viene inserito

### Addetti  
- **Chiave univoca**: `cognome + nome + denominazione_editore` (NON editoreId!)
- **Gestione ID e Foreign Key**: 
  - Gli ID originali degli addetti vengono ignorati (AUTO_INCREMENT nel target)
  - Il campo `editoreId` viene **rimappato** tramite JOIN sulla denominazione dell'editore
  - Questo garantisce che l'addetto punti sempre all'editore corretto, anche se ha ID diversi
- Esempio: 
  ```
  DB1: Mario Rossi (id=10) → editoreId=5 (Mondadori)
  DB2: Mario Rossi (id=23) → editoreId=12 (Mondadori)  ← Stesso editore, ID diverso!
  ```
- Permette omonimi se associati a editori diversi

### Perché questa strategia?

Gli ID auto-increment sono **locali** a ogni database e possono divergere:
- Un editore creato come primo in DB1 avrà ID=1
- Lo stesso editore sincronizzato in DB2 (già popolato) potrebbe ricevere ID=47
- Usare la `denominazione` come chiave naturale garantisce consistenza logica
- Il JOIN dinamico su `denominazione` risolve automaticamente le foreign key

## Automazione

### Cron Job (Linux/Mac)

Per eseguire la sincronizzazione automaticamente ogni giorno alle 2:00 AM:

1. Apri il crontab:
```bash
crontab -e
```

2. Aggiungi questa linea:
```cron
0 2 * * * /usr/bin/mysql -u root -pYOURPASSWORD pnlegge_common -e "CALL sync_addetti_editori_consolidate_and_distribute();" >> /var/log/pnlegge_sync.log 2>&1
```

### Task Scheduler (Windows)

Crea un file batch `sync_addetti_editori.bat`:
```batch
@echo off
mysql -u root -pYOURPASSWORD pnlegge_common -e "CALL sync_addetti_editori_consolidate_and_distribute();" >> C:\logs\pnlegge_sync.log 2>&1
```

Poi configura Task Scheduler per eseguirlo automaticamente.

## Risoluzione Problemi

### Errore: "Table doesn't exist"
**Causa**: Il database comune o le tabelle non sono state create.  
**Soluzione**: Esegui nuovamente il comando di installazione del passo 2.

### Errore: "Procedure doesn't exist"
**Causa**: La stored procedure non è stata creata correttamente.  
**Soluzione**: 
```bash
mysql -u root -p pnlegge_common -e "DROP PROCEDURE IF EXISTS sync_addetti_editori_consolidate_and_distribute;"
mysql -u root -p pnlegge_common < protected/data/sync_addetti_editori_procedure.sql
```

### Errore: "Access denied"
**Causa**: L'utente MySQL non ha i permessi necessari.  
**Soluzione**: Assicurati che l'utente abbia permessi su tutti i database coinvolti:
```sql
GRANT ALL PRIVILEGES ON `pordenonelegge_it_2026%`.* TO 'root'@'localhost';
GRANT ALL PRIVILEGES ON `pnlegge_common`.* TO 'root'@'localhost';
FLUSH PRIVILEGES;
```

### I dati non vengono sincronizzati
**Possibili cause**:
1. Le tabelle sorgente sono vuote
2. Ci sono già duplicati (INSERT IGNORE li salta)
3. I nomi dei database non corrispondono al pattern `pordenonelegge_it_2026%`

**Debug**:
```bash
# Verifica i database disponibili
mysql -u root -p -e "SHOW DATABASES LIKE 'pordenonelegge_it_2026%';"

# Verifica contenuto di un database specifico
mysql -u root -p pordenonelegge_it_2026_fuoricitta -e "SELECT COUNT(*) FROM tbl_editori;"
mysql -u root -p pordenonelegge_it_2026_fuoricitta -e "SELECT COUNT(*) FROM tbl_addetti;"
```

## Sicurezza

- La procedura usa **INSERT IGNORE** per evitare crash su duplicati
- Non modifica né elimina record esistenti
- Opera solo in modalità INSERT (aggiunta)
- Solo gli utenti SuperAdmin possono eseguirla tramite web
- Tutti gli accessi vengono loggati in Yii

## File Correlati

- **Procedura SQL**: `protected/data/sync_addetti_editori_procedure.sql`
- **Controller Action**: `protected/controllers/SiteController.php::actionSyncAddettiEditori()`
- **View**: `protected/views/site/syncAddettiEditori.php`
- **Questa Documentazione**: `protected/data/SYNC_ADDETTI_EDITORI_README.md`

## Log e Monitoraggio

### Log Applicazione Yii
Gli errori vengono loggati automaticamente in:
```
protected/runtime/application.log
```

### Log MySQL
Per abilitare il log delle query MySQL, modifica `my.cnf`:
```ini
[mysqld]
general_log = 1
general_log_file = /var/log/mysql/query.log
```

## Supporto

Per problemi o domande, contatta l'amministratore di sistema o verifica:
- `.github/copilot-instructions.md` per convenzioni del progetto
- `DATABASE_SELECTOR.md` per informazioni sul sistema multi-database
- Log dell'applicazione in `protected/runtime/`
