This commit is contained in:
2026-06-23 11:12:28 +02:00
parent f2ea5e160b
commit 557bf3fcdf
2458 changed files with 323084 additions and 316 deletions
+58 -2
View File
@@ -42,6 +42,19 @@ App gestionale Laravel 13 con AdminLTE 4 per gestione Persone e Gruppi.
- `run()` restituisce `steps` array; mostrato in flash message (controller) e output (command)
- **2026-06-18**: Diagnose script (`diagnose.php`), .env.example aggiornato (SESSION_SECURE_COOKIE, FORCE_HTTPS, TRUSTED_PROXIES), build-dist.sh aggiornato con passo diagnose
- **2026-06-23**: Usabilità viste colonne: se non si clicca ✏️ su una vista, la vista attiva corrente viene auto-assunta come target di modifica. Se il nome viene cambiato, crea nuova vista invece di aggiornare (rilevamento rename via `currentVistaOriginalNome`)
- **2026-06-23**: Aggiunto campo "Anno fondazione" (anno_fondazione) a Gruppo — migration, model (+fillable/+casts), controller (validazione store/update, import CSV, template CSV), create/edit/show/index views, import view field list
- **2026-06-23**: Implementato "Documento come URL esterno" (link a risorsa esterna) — piena integrazione in email, mailing, preview, download, UI
- Migration: `url` text nullable after `note`
- Model: `url` in `$fillable` + metodo `isLink(): bool` (controlla `tipo === 'link'`)
- DocumentoController: store() validazione condizionale file/URL via radio `tipo_caricamento`; update() campo URL condizionale; download() redirect away per link; preview() mostra fallback con pulsante "Apri link esterno"; massDownload() skip link-docs con counter warning; destroy() skip rimozione file
- EmailController: processAttachments/resolveAttachmentPaths skip URL-docs dall'allegato fisico, accumulano links array; `appendLinksToBody()` inserisce link come testo nel corpo email prima della firma
- MailingController: resolveMailingAttachmentPaths skip URL-docs, accumula links; `appendMailingLinksToBody()` stesso pattern
- Upload modal (index.blade.php): toggle radio File/URL con campi condizionali (JS `toggleTipoCaricamento()`)
- Grid/list view: icona link (`fa-link`) invece di mime icon per URL-docs; pulsante "Apri link esterno" invece di preview/download; move button hidden per link
- Edit view (edit.blade.php): se link, mostra campo URL editabile + info URL nel sidebar invece di file_path/mime/dimensione
- Preview fallback (preview-fallback.blade.php): supporto URL-docs con icona link + pulsante "Apri link esterno"
- Email/mailing document selection table: badge "URL" nella riga documento
- Route `documenti/{id}/download` per URL-docs: redirect HTTP 302 all'URL esterno
## Funzionalità Implementate
@@ -331,8 +344,7 @@ if (!empty($contatto['individuo_id'])) { create }
```
## Prossimi Passi
- [DONE] ... (existing items)
- Verificare end-to-end su remote: tutte le nuove mass action, mailing list con contatti senza email, ricerca multi-tag
- [DONE] Verificare end-to-end su remote: tutte le nuove mass action, mailing list con contatti senza email, ricerca multi-tag
- [DONE] Fix performance: spostata query `VistaReport::where(...)->get()` da `@php` nel partial `table-settings.blade.php` a tutti i 5 controller (prima veniva eseguita 1 query per ogni pagina load per ogni entity, anche senza mai aprire la modale)
- [DONE] Rimosse vecchie modal legacy (`#saveVistaModal`, `#colonneModal`, `#vistaListModal`) da `individui` e `gruppi` — duplicate rispetto al nuovo modal unificato
- [DONE] Rimosse vecchie funzioni JS (`saveVista()`, `toggleColumn()`, `showSaveVistaModal()`) da `individui` e `gruppi`
@@ -1115,3 +1127,47 @@ Fasi install (9 step): come upgrade + setup .env con pausa interattiva
- JS brace balance: OK (diff=0)
- Tutti gli altri listener modal nel file usano già jQuery `.on()` — il fix allinea `massMoveModal` al pattern esistente
- Nessun test automatizzato presente nel progetto (no Pest, no PHPUnit config)
## 2026-06-23 — Test + Fix migration per compatibilità SQLite + massDownload unlink fix
### Tests scritti
- **`tests/Unit/DocumentoLinkTest.php`**: 6 unit test per `Documento::isLink()` — copre tutti i valori `tipo` (link, upload, allegato, null), verifica `url` fillable, verifica link-doc senza file fields
- **`tests/Feature/DocumentoLinkTest.php`**: 14 feature test per link-doc CRUD:
- `store` con link: creazione base, validazione required url, validazione formato url, skip file, set tipo=link, visibilità individuo, visibilità gruppo
- `update`: modifica URL, preserva URL se non inviato, validazione formato
- `download`: redirect away all'URL esterno
- `preview`: vista fallback con header X-Preview-Fallback
- `destroy`: delete senza chiamate Storage
- `massDownload`: skip link-doc con errore "Nessun file disponibile"
- **Totale**: 20 test, 45 assertion, tutti ✅ passanti su SQLite `:memory:`
### Fix migration per compatibilità SQLite (test cross-DB)
3 migration non compatibili con SQLite fixate per permettere test su `:memory:`:
1. **`2026_05_12_000002_change_ruolo_to_multi.php`**:
- Aggiunto `Schema::hasColumn('gruppo_individuo', 'ruolo_id')` guard prima di `dropForeign`/`dropColumn`
- Aggiunto `dropIndex(['ruolo_id'])` prima di `dropColumn` (SQLite richiede drop index esplicito)
2. **`2024_01_01_000008_create_documenti_table.php`**:
- `$table->enum('tipologia', [...])``$table->string('tipologia', 50)` (app-level validation)
- `$table->enum('visibilita', [...])``$table->string('visibilita', 50)` (app-level validation)
- `$table->string('file_path')``$table->string('file_path')->nullable()` (necessario per link-docs)
3. **`2026_05_11_000005_add_email_attachment_to_documenti.php`**: reso no-op (colonna già string, app-level validation)
4. **`2026_05_13_072203_add_programma_locandina_to_tipologia_enum.php`**: reso no-op (colonna già string, app-level validation)
### Fix massDownload unlink edge case
- **`app/Http/Controllers/DocumentoController.php:710`**: Aggiunto `file_exists($zipPath)` guard prima di `@unlink($zipPath)` — preveniva `ErrorException` quando ZipArchive non creava file su alcuni filesystem (documenti tutti link → addedCount=0 → file zip non creato fisicamente → unlink falliva)
### Fix produzione: file_path NOT NULL su MySQL
- **Problema**: La colonna `file_path` su MySQL è `NOT NULL` (migrazione originale `$table->string('file_path')`). Inserendo un link-doc (`tipo='link'`) senza `file_path`, MySQL rifiuta: `Field 'file_path' doesn't have a default value`.
- **Fix**: Nuova migration `2026_06_23_085637_make_file_path_nullable_in_documenti.php``ALTER TABLE documenti MODIFY COLUMN file_path VARCHAR(255) NULL` su MySQL
- **Eseguita** localmente ✅ (80ms)
### build-dist.sh
- Nessuna modifica necessaria: `php artisan migrate --force` è già presente in `post-deploy.sh` sia per upgrade (`[5/10]`) che per install (`[8/11]`)
### Prossimi Passi
- ✅ Eseguire `php artisan migrate` su produzione per rendere `file_path` nullable
- Verificare in ambiente di staging: creazione link-doc (tutte le visibilità), visualizzazione grid/list, preview fallback, download (redirect), modifica URL, eliminazione, mass-download con skip link, email/mailing con link nel corpo
- Test edge case: URL malformato (validazione update), link senza url, link con cartella_id, link con visibilità individuo/gruppo