Files
glastree/MEMORY.md
T

5.3 KiB

🧠 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:20paginate(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.phpgruppi/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:
      • SUMMARYnome_evento
      • DESCRIPTIONdescrizione
      • DTSTARTdata_specifica + ora_inizio
      • DTENDdurata_minuti (differenza in minuti)
      • LOCATIONluogo_indirizzo
      • UIDuid_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.phpeventi/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