92 lines
5.3 KiB
Markdown
92 lines
5.3 KiB
Markdown
# 🧠 MEMORY.md — Stato Progetto
|
|
|
|
## Goal
|
|
- Implementare 3 feature in Glastree Laravel 13:
|
|
1. **Page-length selector** su pagine lista (Individui, Eventi, Email)
|
|
2. **CSV import per gruppi** (stesso pattern import individui)
|
|
3. **ICS import per eventi** (via sabre/vobject)
|
|
|
|
## Constraints & Preferences
|
|
- Laravel 13, PHP 8.4, AdminLTE 4, MySQL/MariaDB
|
|
- Zero placeholder, zero TODO, codice funzionante
|
|
- Seguire pattern esistenti (individui import, controller conventions, view layouts)
|
|
- sabre/vobject già installato in composer.json (verificato funzionante in vendor/)
|
|
- UI in Italiano come da applicazione esistente
|
|
|
|
## Verifica Finale — Tutto OK ✅
|
|
|
|
| Controllo | Risultato |
|
|
|-----------|-----------|
|
|
| Syntax PHP tutti i file modificati | ✅ Nessun errore |
|
|
| Bilanciamento `{}` JS in tutte le views | ✅ Tutte bilanciate |
|
|
| Rotta `gruppi.import` GET | ✅ Registrata |
|
|
| Rotta `gruppi.import.store` POST | ✅ Registrata |
|
|
| Rotta `gruppi.template` GET | ✅ Registrata |
|
|
| Rotta `eventi.import` GET | ✅ Registrata |
|
|
| Rotta `eventi.import.store` POST | ✅ Registrata |
|
|
| View `gruppi/import.blade.php` | ✅ Creata |
|
|
| View `eventi/import.blade.php` | ✅ Creata |
|
|
| sabre/vobject loadabile | ✅ `Sabre\VObject\Reader` disponibile |
|
|
|
|
## Modifiche Effettuate
|
|
|
|
### 1. Page-length selector (3 pagine)
|
|
**File modificati:**
|
|
- `app/Http/Controllers/IndividuoController.php:20` — `paginate(20)` → `paginate($perPage)` con clamp `[10,20,25,50,100]`, default 20
|
|
- `app/Http/Controllers/EventoController.php:48-49` — stessa logica, default 20
|
|
- `app/Http/Controllers/EmailController.php:61-62` — stessa logica, default 20
|
|
- `resources/views/individui/index.blade.php` — dropdown `<select name="perPage">` in card-footer con hidden fields per preservare altri query params
|
|
- `resources/views/eventi/index.blade.php` — stesso dropdown in card-footer
|
|
- `resources/views/email/index.blade.php` — stesso dropdown in card-footer
|
|
|
|
### 2. CSV Import Gruppi (nuovo)
|
|
**File modificati:**
|
|
- `app/Http/Controllers/GruppoController.php` — aggiunti 3 metodi:
|
|
- `import()`: GET, mostra form upload (authorizeWrite)
|
|
- `importStore()`: POST, validate file CSV, parsing fault-tolerant (skip righe vuote, log errori), crea Gruppo::create() con `nome,descrizione,parent_id,diocesi_id,indirizzo_incontro,cap_incontro,città_incontro,sigla_provincia_incontro`
|
|
- `downloadTemplate()`: GET, restituisce CSV template con header + esempio
|
|
- `resources/views/gruppi/import.blade.php` — form upload + template download + colonna info campi
|
|
- `resources/views/gruppi/index.blade.php` — bottone "Importa" in card-tools
|
|
- `routes/web.php` — `gruppi/import` (GET/POST), `gruppi/template` (GET), tutte prima di `Route::resource('gruppi')`
|
|
|
|
### 3. ICS Import Eventi (nuovo)
|
|
**File modificati:**
|
|
- `app/Models/Evento.php:34` — aggiunto `'uid_esterno'` a `$fillable` (colonna esisteva in DB ma mancava dal model — potenziale bug risolto)
|
|
- `app/Http/Controllers/EventoController.php` — aggiunti 2 metodi:
|
|
- `importIcs()`: GET, mostra form upload (authorizeWrite)
|
|
- `importIcsStore()`: POST, validate file ICS, usa `Sabre\VObject\Reader::read()` per parsare, estrae VEVENT, mapping:
|
|
- `SUMMARY` → `nome_evento`
|
|
- `DESCRIPTION` → `descrizione`
|
|
- `DTSTART` → `data_specifica` + `ora_inizio`
|
|
- `DTEND` → `durata_minuti` (differenza in minuti)
|
|
- `LOCATION` → `luogo_indirizzo`
|
|
- `UID` → `uid_esterno` (per dedup)
|
|
- RRULE: import come `tipo_recorrenza: 'singolo'` con prima occorrenza (no espansione)
|
|
- Dedup: skip se `uid_esterno` già presente
|
|
- `resources/views/eventi/import.blade.php` — form upload + colonna info campi
|
|
- `resources/views/eventi/index.blade.php` — bottone "Importa ICS" in card-tools
|
|
- `routes/web.php` — `eventi/import` (GET/POST), prima di `Route::resource('eventi')`
|
|
|
|
## Bug Fix Trovato
|
|
- **`Evento::$fillable` mancava `uid_esterno`** — la colonna esisteva in DB (aggiunta da migration `2026_06_02_000002_add_uid_esterno_to_eventi_table.php`) ma non era in `$fillable`, quindi mass-assignment la ignorava silenziosamente. Risolto.
|
|
|
|
## Key Decisions
|
|
- **perPage clamping**: soli valori `[10,20,25,50,100]`, fallback a default 20 su valore non valido
|
|
- **CSV gruppi segue pattern individui**: stesso approccio fault-tolerant (skip righe incomplete, log errori, riepilogo finale)
|
|
- **ICS senza espansione RRULE**: eventi ricorrenti importati come evento singolo con data della prima occorrenza
|
|
- **Dedup via uid_esterno**: lookup prima della creazione, skip se già presente
|
|
|
|
## Relevant Files
|
|
- `app/Http/Controllers/IndividuoController.php` — perPage in index()
|
|
- `app/Http/Controllers/EventoController.php` — perPage in index() + importIcs()/importIcsStore()
|
|
- `app/Http/Controllers/GruppoController.php` — import()/importStore()/downloadTemplate()
|
|
- `app/Http/Controllers/EmailController.php` — perPage in index()
|
|
- `app/Models/Evento.php` — uid_esterno in $fillable
|
|
- `resources/views/individui/index.blade.php` — perPage dropdown
|
|
- `resources/views/eventi/index.blade.php` — perPage dropdown + ICS import button
|
|
- `resources/views/eventi/import.blade.php` — ICS import form (NEW)
|
|
- `resources/views/gruppi/index.blade.php` — CSV import button
|
|
- `resources/views/gruppi/import.blade.php` — CSV import form (NEW)
|
|
- `resources/views/email/index.blade.php` — perPage dropdown
|
|
- `routes/web.php` — nuove route gruppi/eventi import
|