1.2.5 - fix for email settings
This commit is contained in:
@@ -1,70 +1,97 @@
|
||||
# 🧠 MEMORY.md — Stato Progetto
|
||||
|
||||
## Goal
|
||||
- Implementare page-length selector su liste (Individui, Eventi, Email)
|
||||
- Implementare CSV import per gruppi
|
||||
- Implementare ICS import per eventi
|
||||
- Creare script build-dist.sh per distribuzione
|
||||
## Obiettivo
|
||||
App gestionale Laravel 13 con AdminLTE 4 per gestione Persone e Gruppi.
|
||||
|
||||
## Modifiche Effettuate (10 file + 3 nuovi)
|
||||
## Funzionalità Implementate
|
||||
|
||||
### File modificati
|
||||
| File | Cosa |
|
||||
|------|------|
|
||||
| `app/Http/Controllers/IndividuoController.php` | perPage support (20 default, clamp [10,20,25,50,100]) |
|
||||
| `app/Http/Controllers/EventoController.php` | perPage + importIcs/importIcsStore (Sabre\VObject) |
|
||||
| `app/Http/Controllers/GruppoController.php` | import/importStore/downloadTemplate CSV gruppi |
|
||||
| `app/Http/Controllers/EmailController.php` | perPage support |
|
||||
| `app/Models/Evento.php` | `uid_esterno` aggiunto a $fillable (bug fix) |
|
||||
| `resources/views/individui/index.blade.php` | dropdown perPage in card-footer |
|
||||
| `resources/views/eventi/index.blade.php` | dropdown perPage + pulsante Importa ICS |
|
||||
| `resources/views/gruppi/index.blade.php` | pulsante Importa CSV |
|
||||
| `resources/views/email/index.blade.php` | dropdown perPage in card-footer |
|
||||
| `routes/web.php` | route gruppi/import, gruppi/template, eventi/import |
|
||||
|
||||
### File nuovi
|
||||
| File | Cosa |
|
||||
|------|------|
|
||||
| `resources/views/gruppi/import.blade.php` | form upload CSV gruppi |
|
||||
| `resources/views/eventi/import.blade.php` | form upload ICS eventi |
|
||||
| `build-dist.sh` | script build distribuzione |
|
||||
|
||||
## Feature
|
||||
|
||||
### 1. Page-length selector
|
||||
- **3 pagine**: Individui, Eventi, Email
|
||||
### Page-length selector
|
||||
- **4 pagine**: Individui, Eventi, Email, Gruppi
|
||||
- **Valori**: 10, 20, 25, 50, 100 (default 20)
|
||||
- Dropdown nel card-footer con hidden fields per preservare altri query param
|
||||
- Dropdown nel card-footer con campi hidden per preservare query params
|
||||
- GruppoController: usa `LengthAwarePaginator` per paginare la collezione ordinata gerarchicamente
|
||||
|
||||
### 2. CSV Import Gruppi
|
||||
### 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
|
||||
- Fault-tolerant: skip righe vuote, log errori, try/catch su ogni riga
|
||||
|
||||
### 3. ICS Import Eventi
|
||||
### 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
|
||||
|
||||
### 4. Script build-dist.sh
|
||||
- Genera `glastree-YYYYMMDD_HHMM.tar.gz` (~26MB)
|
||||
- Include: sorgenti, vendor (production), Dockerfile, docker-compose, install.php, install.sql
|
||||
- Esclude: .git, node_modules, tests, cache, storage content, vendor/docs/tests
|
||||
### 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
|
||||
|
||||
## Installazione su server remoto
|
||||
## 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
|
||||
# Estrarre
|
||||
tar xzf glastree-20260607_2052.tar.gz
|
||||
|
||||
# Configurare
|
||||
cp .env.example .env
|
||||
php artisan key:generate
|
||||
php artisan storage:link
|
||||
|
||||
# Opzione A — Docker
|
||||
docker compose up -d
|
||||
|
||||
# Opzione B — Apache nativo (MySQL)
|
||||
php install.php
|
||||
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)*
|
||||
|
||||
Reference in New Issue
Block a user