# 🧠 MEMORY.md — Stato Progetto ## Obiettivo App gestionale Laravel 13 con AdminLTE 4 per gestione Persone e Gruppi. ## Funzionalità Implementate ### Page-length selector - **4 pagine**: Individui, Eventi, Email, Gruppi - **Valori**: 10, 20, 25, 50, 100 (default 20) - Dropdown nel card-footer con campi hidden per preservare query params - GruppoController: usa `LengthAwarePaginator` per paginare la collezione ordinata gerarchicamente ### CSV Import Gruppi - Stesso pattern di `IndividuoController` (import GET, importStore POST, downloadTemplate GET) - Colonne: nome, descrizione, parent_id, diocesi_id, indirizzo_incontro, cap_incontro, città_incontro, sigla_provincia_incontro - Fault-tolerant: skip righe vuote, log errori, try/catch su ogni riga ### ICS Import Eventi - Usa `Sabre\VObject\Reader::read()` già in vendor/ - Mapping: SUMMARY→nome_evento, DESCRIPTION→descrizione, DTSTART→data_specifica+ora_inizio, DTEND→durata_minuti, LOCATION→luogo_indirizzo, UID→uid_esterno - Dedup via uid_esterno - RRULE: import come evento singolo con prima occorrenza ### build-dist.sh (script di distribuzione) - Genera `glastree-YYYYMMDD_HHMM.tar.gz` - Include: sorgenti, vendor (production) - Esclude: .git, node_modules, tests, cache, storage content, vendor/docs/tests, Docker - **Istruzioni post-estrazione complete**: mkdir, permessi, configurazione, cache clear ## Bug Fix Recenti ### 2026-06-07 — Colonne mancanti in eventi e gruppo_individuo - `descrizione_evento` e `is_incontro_gruppo` mancanti in install.sql → creata migration + ALTER TABLE - `ruolo_nel_gruppo` mancante in install.sql per pivot `gruppo_individuo` - `VistaReport.php`: aggiunto `is_default` a `$fillable` ### 2026-06-08 — build-dist.sh: "provide valid cache path" su server remoto **Problema**: Le esclusioni in `build-dist.sh` usavano `--exclude='storage/framework/cache'` (e simili per sessions, views, logs), che escludevano **l'intera directory** dall'archivio. Dopo l'estrazione, le directory necessarie a Laravel non esistevano. **Fix**: 1. Cambiati exclude patterns per **contenuti soltanto** (non la directory): - `--exclude='storage/framework/cache/*'` (non `/cache`) - `--exclude='storage/framework/sessions/*'` - `--exclude='storage/framework/views/*'` - `--exclude='storage/logs/*'` - `--exclude='storage/debugbar/*'` 2. Aggiunte esclusioni per upload utente: - `--exclude='storage/app/public'` - `--exclude='storage/app/private'` 3. Creato `.gitignore` in `storage/framework/views/` (mancante) 4. Istruzioni post-estrazione riscritte con: - `mkdir -p` per tutte le directory necessarie (cache, sessions, views, logs, public, backups, documenti, bootstrap/cache) - `chmod -R 775` e `chown -R www-data:www-data` per permessi - `php artisan config:clear`, `route:clear`, `view:clear` ## Problema 419 (Page Expired) su Produzione Il codice NON ha errori di CSRF — tutte le form hanno `@csrf`. Il problema è configurazione sessione del server: 1. `storage/framework/sessions/` non scrivibile dal web server 2. `APP_URL` in `.env` non corrisponde all'URL reale 3. `SESSION_SECURE_COOKIE=true` ma sito in HTTP Soluzione: ```bash chmod -R 775 storage/framework/sessions php artisan config:clear ``` ### 2026-06-08 — build-dist.sh: impossibilità salvare logo su server remoto **Problema**: - `public/storage` era un symlink **assoluto** (`/var/www/html/glastree/storage/app/public`) incluso nell'archivio → all'estrazione su altro server puntava a path inesistente. - `php artisan storage:link` falliva perché il symlink rotto esisteva già. - Sottodirectory `logos/`, `documenti/eventi/`, `avatars/gruppi/` non create dal `mkdir -p`. **Fix**: 1. Aggiunto `--exclude='public/storage'` al tar — il symlink va ricreato sul target. 2. Aggiunto `rm -f public/storage` prima di `php artisan storage:link` per evitare conflitto. 3. Usato `ln -sf ../storage/app/public public/storage` (invece di `php artisan storage:link --relative` che richiede `symfony/filesystem` non sempre presente). 4. Aggiunte al `mkdir -p` le sottodirectory mancanti: - `storage/app/public/logos` (logo upload) - `storage/app/public/documenti/eventi` (event documenti) - `storage/app/private/avatars/gruppi` (avatar gruppi) 5. Aggiunta creazione `.gitignore` in `storage/app/public/` (placeholder Laravel). ### Fix form annidato salvataggio email **2026-06-08 — Problema**: Il form di DELETE era **annidato dentro** il form di SAVE in entrambe le pagine: - `resources/views/impostazioni/index.blade.php` - `resources/views/admin/email-settings/index.blade.php` - HTML invalido: il browser chiudeva implicitamente il form SAVE all'apertura del form DELETE, causando l'invio alla route sbagliata. **Fix**: Spostato il form DELETE fuori dal form SAVE, separato in un `div` autonomo. ### DiagnoseEmail Command - `php artisan diagnose:email` — controlla APP_KEY, tabella email_settings, record, decrittazione password, sender_accounts, log errori, estensioni PHP. ## Prossimi Passi - *(nessuno — in attesa di nuove richieste)*