2026-06-01 22:55:50 +02:00
# 🧠 MEMORY.md — Stato Progetto
## Goal
2026-06-02 22:07:16 +02:00
- Correggere tutti i bug critici identificati nell'applicazione Glastree
- Implementare nuove funzionalità richieste: cancellazione account email, fix firma editor, sincronizzazione calendario con Google Calendar / CalDAV
2026-06-01 22:55:50 +02:00
## Constraints & Preferences
2026-06-02 20:29:47 +02:00
- Laravel 13, PHP 8.4, AdminLTE 4, MySQL/MariaDB
- Zero placeholder, zero TODO, codice funzionante
- Compatibilità cross-DB MySQL ↔ SQLite
2026-06-01 22:55:50 +02:00
## Progress
### Done
2026-06-02 20:29:47 +02:00
- **Cancellata cache Laravel** (`php artisan optimize:clear` )
2026-06-02 22:07:16 +02:00
- **Fix BUG CRITICO 3** – `IndividuoController::update()` (riga 216): avvolto `$individuo->contatti()->delete()` dentro `if ($request->has('contatti'))` .
- **Fix BUG CRITICO 1** – `individui/edit.blade.php` : convertiti 4 form annidati in pulsanti `type="button"` + `fetch()` AJAX
- **Fix BUG CRITICO 2** – `gruppi/edit.blade.php` : convertiti 3 form annidati in pulsanti `type="button"` + `fetch()` AJAX
- **Fix BUG CRITICO 4** – `gruppi/show.blade.php` : flash messages spostati dentro `@section('content')`
- **Fix BUG CRITICO 5/6** – `eventi/show.blade.php` : rimossi div extra, XSS escape in confirm()
- **Fix BUG CRITICO 7/8** – `ImpostazioniController.php` : use Documento + JSON_CONTAINS → PHP
- **Fix BUG CRITICO 9** – `ReportController.php` : `$contatto->email` → `$contatto->valore`
- **Fix BUG CRITICO 10** – `DocumentoController.php` : morph injection prevention in massUpdate()
- **NUOVA FEATURE – Cancellazione account email**: Aggiunto metodo `destroy()` in `EmailSettingsController` , rotta `DELETE /impostazioni/email` , pulsante "Elimina Configurazione" in entrambe le viste (admin dedicata e unificata)
- **FIX – Doppia barra icone firma**: Cambiata la guardia di `createEditor()` e `initSignatureEditor()` da `container.querySelector('.ql-toolbar')` (che non funziona perché Quill crea la toolbar come sibling, non child) a flag `quillEditorInstance` in entrambe le viste
- **NUOVA FEATURE – Sincronizzazione calendario**: Implementata sincronizzazione con Google Calendar e CalDAV (Infomaniak/NextCloud):
- Migration `create_calendario_connessioni_table` + `add_uid_esterno_to_eventi_table`
- Model `CalendarioConnessione` con encrypt/decrypt config
- Service `CalDavService` (PROPFIND, REPORT, calendar-query, PUT)
- Service `GoogleCalendarSyncService` (Google Calendar API v3)
- Controller `CalendarioConnessioneController` (CRUD + test + sync + reorder)
- Routes RESTful per calendario-connessioni
- UI nella tab "Calendario" delle impostazioni unificate con tabella, modale CRUD, pulsanti test/sync/elimina, Sortable drag&drop
- Installati pacchetti: `sabre/vobject` , `google/apiclient`
2026-06-01 22:55:50 +02:00
### In Progress
2026-06-02 20:29:47 +02:00
- *(nessuno)*
2026-06-01 22:55:50 +02:00
### Blocked
2026-06-02 20:29:47 +02:00
- *(nessuno)*
2026-05-26 08:14:29 +02:00
## Key Decisions
2026-06-02 22:07:16 +02:00
- Per i form annidati si è scelto l'approccio `type="button"` + `fetch()` AJAX
- Per la cancellazione account email si usa `EmailSetting::first()->delete()` con verifica esistenza
- Per il fix Quill: variabile flag `quillEditorInstance` invece di `container.querySelector('.ql-toolbar')` perché Quill inserisce `.ql-toolbar` come elemento sibling, non child
- Per CalDAV: usato Guzzle (già in Laravel) per HTTP + `sabre/vobject` per parsing iCal
- Per Google Calendar: usato `google/apiclient` con OAuth 2.0 (refresh token)
- La sync può essere bidirezionale, solo import o solo export
- I campi sensibili delle connessioni calendario sono criptati con `Crypt`
2026-05-26 08:14:29 +02:00
2026-06-01 22:55:50 +02:00
## Next Steps
2026-06-02 22:07:16 +02:00
- *(nessuno)*
2026-05-26 08:14:29 +02:00
2026-06-01 22:55:50 +02:00
## Critical Context
2026-06-02 22:07:16 +02:00
- Le connessioni calendario supportano: Google Calendar, CalDAV (NextCloud, Infomaniak, Synology)
- La direzione di sync è configurabile per ogni connessione
- Le password/refresh token sono automaticamente criptati all salvataggio via `encryptAndSetConfig()`
- Il campo `uid_esterno` sugli eventi traccia la corrispondenza con eventi remoti
2026-05-26 08:14:29 +02:00
## Relevant Files
2026-06-02 22:07:16 +02:00
- `app/Http/Controllers/Admin/EmailSettingsController.php` : +destroy() method
- `app/Http/Controllers/CalendarioConnessioneController.php` : NEW – CRUD + test + sync
- `app/Models/CalendarioConnessione.php` : NEW – model con encrypt config
- `app/Services/CalDavService.php` : NEW – CalDAV sync
- `app/Services/GoogleCalendarSyncService.php` : NEW – Google Calendar sync
- `app/Http/Controllers/ImpostazioniController.php` : +calendarioConnessioni in index()
- `resources/views/admin/email-settings/index.blade.php` : +delete button, fix Quill guard
- `resources/views/impostazioni/index.blade.php` : +delete button, fix Quill guard, +calendario tab UI, +calendario modal, +JS funcs
- `routes/web.php` : +email destroy route, +calendario-connessioni routes
- `database/migrations/2026_06_02_000001_create_calendario_connessioni_table.php` : NEW
- `database/migrations/2026_06_02_000002_add_uid_esterno_to_eventi_table.php` : NEW