5.3 KiB
5.3 KiB
🧠 MEMORY.md — Stato Progetto
Goal
- Implementare 3 feature in Glastree Laravel 13:
- Page-length selector su pagine lista (Individui, Eventi, Email)
- CSV import per gruppi (stesso pattern import individui)
- 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 20app/Http/Controllers/EventoController.php:48-49— stessa logica, default 20app/Http/Controllers/EmailController.php:61-62— stessa logica, default 20resources/views/individui/index.blade.php— dropdown<select name="perPage">in card-footer con hidden fields per preservare altri query paramsresources/views/eventi/index.blade.php— stesso dropdown in card-footerresources/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() connome,descrizione,parent_id,diocesi_id,indirizzo_incontro,cap_incontro,città_incontro,sigla_provincia_incontrodownloadTemplate(): GET, restituisce CSV template con header + esempio
resources/views/gruppi/import.blade.php— form upload + template download + colonna info campiresources/views/gruppi/index.blade.php— bottone "Importa" in card-toolsroutes/web.php—gruppi/import(GET/POST),gruppi/template(GET), tutte prima diRoute::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, usaSabre\VObject\Reader::read()per parsare, estrae VEVENT, mapping:SUMMARY→nome_eventoDESCRIPTION→descrizioneDTSTART→data_specifica+ora_inizioDTEND→durata_minuti(differenza in minuti)LOCATION→luogo_indirizzoUID→uid_esterno(per dedup)
- RRULE: import come
tipo_recorrenza: 'singolo'con prima occorrenza (no espansione) - Dedup: skip se
uid_esternogià presente
resources/views/eventi/import.blade.php— form upload + colonna info campiresources/views/eventi/index.blade.php— bottone "Importa ICS" in card-toolsroutes/web.php—eventi/import(GET/POST), prima diRoute::resource('eventi')
Bug Fix Trovato
Evento::$fillablemancavauid_esterno— la colonna esisteva in DB (aggiunta da migration2026_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 $fillableresources/views/individui/index.blade.php— perPage dropdownresources/views/eventi/index.blade.php— perPage dropdown + ICS import buttonresources/views/eventi/import.blade.php— ICS import form (NEW)resources/views/gruppi/index.blade.php— CSV import buttonresources/views/gruppi/import.blade.php— CSV import form (NEW)resources/views/email/index.blade.php— perPage dropdownroutes/web.php— nuove route gruppi/eventi import