27 KiB
27 KiB
MEMORY.md - Glastree Project
Project Context
Laravel 13 / PHP 8.4 project for parish management (Glastree). Full codebase exists and is operational.
System Status
✅ FUNZIONANTE (Stable)
- Dashboard
- Individui (CRUD completo) - funziona da internet (con viste personalizzate per colonna)
- Gruppi (CRUD completo) - funziona da internet (con vista tabella/albero e colonne personalizzate)
- Documenti - funziona da internet
- Eventi (CRUD completo) - funziona da internet (con mass delete)
- Calendario eventi - funziona da internet
- Email (sistema completo)
- Impostazioni (App Settings, Logo, Email Settings)
- Mailing List - funziona da internet (con mass delete)
- Report (predefiniti e personalizzati, accesso tramite permesso 'report')
⚠️ IN COMPLETAMENTO
- Sistema Email: funziona al 95%, SMTP potrebbe necessitare credenziali corrette
Progress Summary
Eventi Enhancements (Completed)
- Migration
2026_05_12_142009_add_location_to_eventi_tableaddedluogo_indirizzoandluogo_url_mapscolumns - Evento model updated with fillable fields
- EventoController updated: index() with search + sorting, store/update with location fields
- eventi/index.blade.php: search input, sortable columns (nome_evento, created_at), delete button
- eventi/create.blade.php: "Dove" card with address + Google Maps URL fields
- eventi/edit.blade.php: "Dove" card with address + Google Maps URL fields
- eventi/show.blade.php: "Luogo" section with address, link to Google Maps, embedded map preview
Responsabile Multi-select (Completed)
- Migration
2026_05_12_000003_change_responsabile_to_multi.phpchangedresponsabile_idtoresponsabile_idsJSON - Gruppo model updated with
getResponsabiliIds()andgetResponsabili()methods - GruppoController updated: index(), store(), update(), show() for multi-select
- Views updated: show, edit, create blades with multi-select support
13 Maggio 2026 - Fixes
- Ordinamento colonne: Aggiunto ordinamento per Descrizione, Tipo, Gruppi, Responsabili
- Form edit: Aggiunti campi
tipo_eventoenotemancanti - Show view: Corretta struttura HTML della sezione documenti
14 Maggio 2026 - Fixes
- Form annidati: La sezione Documenti spostata FUORI dal form principale
- Tipologia enum: Aggiunti valori 'programma' e 'locandina' alla colonna tipologia in documenti
- Visibilita enum: Aggiunto valore 'evento' alla colonna visibilita in documenti
15 Maggio 2026 - Eventi Show
- Rimossa sezione "Dove" duplicata dalla sidebar
- Aggiunta nuova sezione "Luogo" sotto "Data e Orario" nella colonna centrale
15 Maggio 2026 - Email Settings
- Aggiunto pulsante "Test Invio Email (SMTP)" nella pagina impostazioni email
- Aggiunto metodo
testSmtp()nel controller per verificare la configurazione SMTP - Route:
POST /impostazioni/email/test-smtp - Campo password opzionale (non più required)
- Rimossi attributi required dai campi del form impostazioni email
15 Maggio 2026 - Eventi Calendar
- Nuova vista calendario con FullCalendar 6.1.10
- Routes:
GET /eventi/calendareGET /eventi/calendar/events - Metodo
calendar()ecalendarEvents()in EventoController - Sidebar: menu Eventi con sottovoci Calendario, Elenco, Nuovo Evento
- Click su evento apre la pagina show dell'evento
15 Maggio 2026 - Email UI
- Compose view: Rimossa sidebar sinistra, solo form a schermo intero
- Sidebar menu Email:
- Ordine: Nuova Email, In arrivo, Preferiti, Inviate, Bozze, Archivio, Cestino
- Cliccando "Email" apre direttamente inbox
- Bottone sincronizzazione: "Ricevi/Invia" nella pagina inbox
- Sincronizzazione: Limitata a 100 messaggi per cartella
15 Maggio 2026 - Bug Fixes
- RFC 2822: Usare
Address::create()di Symfony per gestire correttamente il display name - Route email.sync: Sostituito
route('email.sync.quick')conurl('email/sync/quick')nella vista email/index.blade.php
16 Maggio 2026 - Email UI Fixes
- Footer: Aggiunto
min-height: calc(100vh - 120px)al content-wrapper per garantire visibilità footer - Pagination: Creato custom view
vendor.pagination.simple-bootstrap-4con caratteri‹e›invece di SVG (problema scalabilità risolto)
16 Maggio 2026 - Logo Upload System
- Model:
App\Models\AppSettingcon metodigetLogoUrl(),getLogoSmallUrl(),getAppName() - Migration:
2026_05_16_000001_add_logo_path_to_app_settings- aggiungelogo_pathelogo_small_path - Controller:
ImpostazioniController- metodiuploadLogo()eremoveLogo() - Routes:
POST /impostazioni/logo,POST /impostazioni/logo/remove - Views: Sezione Logo in
/impostazioniper caricare logo grande e piccolo - Login page: Logo dinamico da
AppSetting::getLogoUrl() - Sidebar: Logo piccolo da
AppSetting::getLogoSmallUrl()con fallback a icona
16 Maggio 2026 - Email Signature Feature
- Migration:
2026_05_16_000003_add_signature_to_email_settings- aggiunge colonnasignature(longText) - Migration:
2026_05_16_000004_add_signature_enabled_to_email_settings- aggiunge colonnasignature_enabled(boolean, default true) - Model:
EmailSettingaggiornato consignatureesignature_enabledin fillable, cast boolean, metodogetSignature() - View:
admin/email-settings/index.blade.phpaggiornato con:- Titolo cambiato da "Email IMAP" a "Email Settings"
- Nuova sezione "Firma" nel menu laterale
- Toggle switch "Attiva firma automatica" per abilitare/disabilitare la firma
- Editor WYSIWYG Quill.js per la composizione della firma
- Caricamento lazy di Quill.js da CDN
- Controller:
EmailControlleraggiornato con metodoappendSignature(body, signature, enabled)che aggiunge la firma al body solo se abilitata - La firma viene aggiunta sia alle email inviate via SMTP che a quelle salvate in "Invio"
- Sidebar: Voce di menu cambiata da "Email IMAP" a "Impostazione Email"
Sistema Email - Dettagli Tecnici
Routes Eventi
GET /eventi → eventi.index (elenco)
GET /eventi/calendar → eventi.calendar (calendario)
GET /eventi/calendar/events → eventi.calendar.events (eventi per FullCalendar)
GET /eventi/create → eventi.create
POST /eventi → eventi.store
GET /eventi/{id} → eventi.show
GET /eventi/{id}/edit → eventi.edit
PUT /eventi/{id} → eventi.update
DELETE /eventi/{id} → eventi.destroy
Routes Email
POST /email/send → email.send
POST /email/sync/quick → email.sync.quick
POST /email/bulk → email.bulk
GET /email/{folder?} → email.index
POST /email/{id}/star → email.star
DELETE /email/{id} → email.destroy
Folder Types
- inbox, sent, drafts, archive, starred, trash
SMTP Configuration
- Credenziali salvate in
email_settingscon criptatura - Password decriptata con
getDecryptedPassword()ogetDecryptedSmtpPassword() - Display name validato con
filter_var($fromName, FILTER_VALIDATE_EMAIL)- se è un'email usa "Glastree"
Email Signature
- Campo
signatureinemail_settings(longText, nullable) - WYSIWYG editor Quill.js via CDN
- Metodo
appendSignature()in EmailController aggiunge "---\n" + signature al body - Applicato sia in
sendViaImap()che instoreSentMessage()
Key Decisions
Database
- Location uses separate columns:
luogo_indirizzo(varchar 500) andluogo_url_maps(text) - Map preview via Google Maps embed iframe using the address
- Sortable columns: nome_evento, created_at, descrizione_evento, tipo_recorrenza, gruppi, responsabili
- Multi-select uses Ctrl+click pattern with array input names
- SMTP defaults to Gmail if not configured
- Email name sanitized to comply with RFC 2822
- Sincronizzazione IMAP limitata a 100 messaggi per cartella
- Signature appended with separator "---\n" before the signature text
UI
- AdminLTE per tutte le viste
- Sidebar con menu navigazione
- Compose email senza sidebar sinistra
Relevant Files
Core Controllers
app/Http/Controllers/EventoController.php: eventi with extended sortingapp/Http/Controllers/EmailController.php: email system completo, signature auto-appendapp/Http/Controllers/Admin/EmailSettingsController.php: email settings + test SMTP
Models
app/Models/EmailSetting.php: getDecryptedPassword(), getDecryptedSmtpPassword(), getSignature()app/Models/Evento.php: fillable with location fieldsapp/Models/Gruppo.php: getResponsabiliIds(), getResponsabili()
Views
resources/views/admin/email-settings/index.blade.php: Email settings with signature section (Quill.js WYSIWYG)resources/views/eventi/index.blade.php: sortable columnsresources/views/eventi/edit.blade.php: fixed nested form, added tipo_evento and noteresources/views/eventi/show.blade.php: removed duplicate "Dove", added "Luogo" sectionresources/views/email/index.blade.php: mailbox view con AdminLTEresources/views/email/compose.blade.php: compose senza sidebar sinistraresources/views/layouts/adminlte.blade.php: sidebar menu Email con ordine corretto
Migrations
2026_05_16_000003_add_signature_to_email_settings.php: Adds signature column to email_settings table
Commands Utili
# Clear all caches
php artisan optimize:clear
# Recompile views
php artisan view:cache
# Check routes
php artisan route:list --name=email
Known Issues / TODO
- SMTP authentication con Infomaniak - verificare credenziali corrette
- Invio email richiede password SMTP corretta nel form impostazioni
16 Maggio 2026 - URL Hardcoded Fix (Internet Access)
- Problema: Da internet (accesso remoto) molti form e link puntavano a
http://localhostinvece del server remoto - Causa: Uso di
url('/path')in tutte le view che generava URL basati suAPP_URL=http://localhost - Soluzione: Sostituzione di tutte le occorrenze di
url('/path')con path relativi/path - Files modificati:
individui/edit.blade.php: form action, link gruppi/documenti, fetch API callsindividui/show.blade.php: link gruppi, documenti, form, fetch API callsgruppi/edit.blade.php: form action, link individui/documenti, fetch API callsgruppi/show.blade.php: link individui, eventieventi/edit.blade.php: form action, link annulla, documentieventi/show.blade.php: breadcrumbs, link gruppi/responsabili, documentieventi/create.blade.php: form action, link annullaeventi/index.blade.php: link create, reset, eventi, gruppidocumenti/index.blade.php: link targets, edit, delete, mass actions, fetch APIdocumenti/edit.blade.php: form action, download, back linkmailing-liste/edit.blade.php: fetch API callseventi/calendar.blade.php: eventSource URL
- Layout fix: Aggiunto meta tag
csrf-tokeninadminlte.blade.phphead
16 Maggio 2026 - Individui Edit Form Fix
- Problema: Form non salvava da accesso internet, il pulsante submit non funzionava
- Causa: Il button type="submit" non triggherava il form submission
- Soluzione:
- Cambiato button da
type="submit"atype="button"cononclick="document.getElementById('main-form').submit()" - Path relativi per tutti i form action
- CSRF token in meta tag del layout
- Cambiato button da
17 Maggio 2026 - Bulk Action Error Fix
- Problema: Azioni massive sulle email (sposta nel cestino) mostravano popup "errore" generico
- Causa:
authorizeWrite()lancia eccezione 403 HTML invece di JSON per richieste AJAX - Soluzione: Aggiunto try-catch in
bulkAction(),markRead()etoggleStar()per ritornare JSON con messaggio appropriato
17 Maggio 2026 - Nginx Proxy Manager Config
- Problema: Email non funziona da internet (dietro NPM)
- bootstrap/app.php: Aggiunto
$middleware->trustProxies(at: '*') - Configurazione .env:
APP_URL= APP_PROTOCOL=https FORCE_HTTPS=true TRUSTED_PROXIES=* - Middleware rimosso: ForceHttps non necessario - NPM gestisce terminazione HTTPS
- Advanced Tab NPM: Abilitare X-Forwarded-Proto e headers proxy
17 Maggio 2026 - Form Annidati Fix
- Problema: Contatti, gruppi e documenti in individui/edit non venivano salvati
- Causa: Sezioni fuori dal main-form (chiusura prematura)
- Soluzione: Spostata chiusura form dopo tutte le sezioni, aggiunto pulsante "Salva Tutte le Modifiche"
- Contatti: Aggiunto pulsante salva nella riga nuova (icona💾)
17 Maggio 2026 - Bulk Action Email Fix
- Problema: Azioni massive su email mostravano popup "errore"
- Causa: authorizeWrite() lancia eccezione 403 HTML invece di JSON
- Soluzione: try-catch in bulkAction(), markRead(), toggleStar()
(Last updated: 25 Maggio 2026 - Fix export CSV individui)
18 Maggio 2026 - AGENTS.md Update
- Aggiunta regola "Verifica Salvataggio" nelle Regole Operative AI
- Obbligo di verificare SEMPRE l'avvenuta riuscita dopo operazioni di modifica (store, update, delete, upload, sync)
25 Maggio 2026 - IndividuoController::elimina() Method
- Problema: Errore 500 "Call to undefined method App\Http\Controllers\IndividuoController::elimina()" su richiesta
POST /individui/{id}/elimina - Causa: Route definita in
routes/web.php:58ma metodoelimina()non implementato nel controller - Soluzione: Aggiunto metodo
elimina()inIndividuoControllerche:- Verifica autorizzazione con
authorizeDelete('individui') - Riceve parametri
elimina_contattieelimina_documentidal form - Elimina opzionalmente i contatti collegati se richiesto
- Elimina opzionalmente i documenti collegati (con rimozione file fisico) se richiesto
- Elimina l'individuo e redirect alla lista con messaggio di successo
- Verifica autorizzazione con
- Files modificati:
app/Http/Controllers/IndividuoController.php: aggiunto metodoelimina()dopodestroy()
25 Maggio 2026 - Fix Eliminazione Singola e Massiva
- Problema: L'eliminazione non veniva eseguita né per il singolo né per la mass action
- Cause:
$request->boolean()interpretava male i valori'true'/'false'come stringhedeleteSelected()faceva submit multipli di form separati causando redirect concorrenti
- Soluzione:
- Sostituito
$request->boolean()confilter_var(..., FILTER_VALIDATE_BOOLEAN)per parsing corretto - Aggiunto metodo
massElimina()inIndividuoControllerper gestire eliminazione multipla con singolo form - Aggiunta route
POST /individui/mass-eliminainroutes/web.php - Rifattorizzata funzione JS
deleteSelected()per usare singolo form con arrayids[]
- Sostituito
- Files modificati:
app/Http/Controllers/IndividuoController.php: correttoelimina(), aggiuntomassElimina()routes/web.php: aggiunta routeindividui/mass-eliminaresources/views/individui/index.blade.php: rifattorizzatadeleteSelected()
25 Maggio 2026 - Fix Export CSV Individui
- Problema: "Esporta Tutti CSV" e "Esporta Selezionati CSV" non funzionavano
- Cause:
exportCSV()usava:visible(selettore jQuery) conquerySelectorAll(JS nativo) che non lo supporta- Export client-side esportava solo righe nel DOM (pagina corrente con pagination), non tutti i record
- Dati limitati a 5 colonne senza contatti email/telefono
- Soluzione:
- Creato metodo
exportCSV()server-side inIndividuoControllerconStreamedResponse - Export completo con: Codice, Cognome, Nome, Data Nascita, Genere, Email, Telefono, Cellulare, Indirizzo, CAP, Città, Provincia, Note
- Email/Telefono/Cellulare recuperati dai contatti con preferenza per quelli primari
- Supporto per export tutti o solo selezionati tramite parametro
ids[] - Funzioni JS
exportCSV()eexportSelectedCSV()ora puntano a/individui/export
- Creato metodo
- Files modificati:
app/Http/Controllers/IndividuoController.php: aggiunto metodoexportCSV()con StreamedResponseroutes/web.php: aggiunta routeGET /individui/exportresources/views/individui/index.blade.php: semplificate funzioniexportCSV()eexportSelectedCSV()
(Last updated: 25 Maggio 2026 - Report system, mass actions, gruppi deletion fix)
25 Maggio 2026 - Fix Eliminazione Gruppi Padre (Superadmin Only)
- Problema: Eliminando un gruppo padre si otteneva pagina 404. Inoltre l'eliminazione di gruppi con figli era disponibile per tutti
- Cause:
- Mancato detach delle tabelle pivot (
gruppo_individuo,eventi_gruppi) prima della cancellazione - Nessun controllo per limitare l'eliminazione di gruppi con sottogruppi al superadmin
- Mancato detach delle tabelle pivot (
- Soluzione:
- Rifattorizzato
destroy()inGruppoController: aggiunta verificaisSuperAdmin()per gruppi con figli - Creato metodo
destroyGruppo()helper che esegue detach pivot, cancella documenti fisici e poi cancella il gruppo - Aggiornata vista
tree-item.blade.php: pulsante elimina disabilitato per non-superadmin su gruppi con figli
- Rifattorizzato
- Files modificati:
app/Http/Controllers/GruppoController.php: rifattorizzatodestroy(), aggiuntodestroyGruppo()resources/views/gruppi/partials/tree-item.blade.php: pulsante elimina condizionato a superadmin per gruppi padre
25 Maggio 2026 - Mass Actions Eventi e Mailing List
- Problema: Eventi e Mailing List non avevano funzionalità di eliminazione massiva
- Soluzione:
- Aggiunti checkbox di selezione, pulsante "Elimina Selezionati" e modal di conferma in
eventi/index.blade.php - Aggiunti checkbox di selezione, pulsante "Elimina Selezionati" e modal di conferma in
mailing-liste/index.blade.php - Aggiunto metodo
massElimina()inEventoControllercon detach di gruppi e responsabili - Aggiunto metodo
massElimina()inMailingListControllercon cancellazione contatti associati - Aggiunte route
POST /eventi/mass-eliminaePOST /mailing-liste/mass-elimina
- Aggiunti checkbox di selezione, pulsante "Elimina Selezionati" e modal di conferma in
- Files modificati:
app/Http/Controllers/EventoController.php: aggiuntomassElimina()app/Http/Controllers/MailingListController.php: aggiuntomassElimina()routes/web.php: aggiunte route mass-elimina per eventi e mailing-listeresources/views/eventi/index.blade.php: aggiunta selezione massiva, modal conferma, JSresources/views/mailing-liste/index.blade.php: aggiunta selezione massiva, modal conferma, JS
25 Maggio 2026 - Rimozione Menu Utilità Viste
- Modifica: Rimosso dal sidebar menu la voce "Utilità Viste" (
viste.index) - Nota: Le route e i controller per le viste rimangono funzionanti, solo il link sidebar è stato rimosso temporaneamente
25 Maggio 2026 - Sistema Report Completo
- Funzionalità: Nuova pagina Report accessibile solo dal superadmin con:
- Panoramica database: statistiche rapide (individui, gruppi, eventi, documenti, mailing list, contatti)
- 12 Report predefiniti:
- Individui per Genere
- Individui per Fascia d'Età
- Gerarchia Gruppi
- Gruppi e Membri
- Eventi del Mese
- Documenti per Tipologia
- Contatti per Tipo
- Dettaglio Mailing List
- Individui senza Contatti
- Individui senza Gruppo
- Eventi per Gruppo
- Documenti Orfani
- Report personalizzati: creazione di report custom con selezione tipo dato, colonne, ordinamento e limite
- Export CSV: ogni report può essere esportato in CSV
- Files creati:
app/Http/Controllers/ReportController.php: controller completo con 12 report + customapp/Models/ReportCustom.php: modello per report personalizzatidatabase/migrations/2026_05_25_000001_create_report_custom_table.php: migration tabella report_customresources/views/report/index.blade.php: pagina principale report con card e form creazioneresources/views/report/result.blade.php: pagina visualizzazione risultati report
- Routes aggiunte:
GET /report→ report.indexGET /report/run→ report.runGET /report/export→ report.exportGET /report/custom/{id}→ report.run-customPOST /report/custom→ report.store-customDELETE /report/custom/{id}→ report.destroy-custom
- Sidebar aggiornata: link "Report" ora punta a
route('report.index')con evidenziazione active
(Last updated: 25 Maggio 2026 - Fix sidebar @endif orfano, verifica completa sintassi)
25 Maggio 2026 - Fix Sidebar Errore Sintassi
- Problema: Errore "syntax error, unexpected token 'endif'" nella dashboard
- Causa: Dopo aver rimosso il blocco
@if(Auth::user()->isSuperAdmin())dalla sidebar per sostituirlo con@if(Auth::user()->canAccess('report')), erano rimasti un@endiforfano (linea 237) e un</li>extra (linea 239) - Soluzione:
- Rimosso
@endiforfano - Rimosso
</li>extra - Aggiunto nuovo
@if(Auth::user()->isSuperAdmin())per proteggere i menu Impostazioni e Admin
- Rimosso
- Verifica completa: Scansionati tutti i blade file del progetto - tutte le direttive
@if/@endif,@foreach/@endforeach,@php/@endphpsono correttamente bilanciate. Compilazione viste OK.
25 Maggio 2026 - Accesso Report Basato su Permessi
- Modifica: Il modulo 'report' è stato aggiunto a
User::MODULEScome nuovo modulo permissionabile - Funzionalità: Gli utenti con permesso
canAccess('report')(livello lettura o superiore) possono accedere alla pagina Report, non più solo il superadmin - Files modificati:
app/Models/User.php: aggiunto 'report' aMODULES= ['individui', 'gruppi', 'eventi', 'documenti', 'mailing', 'viste', 'report']app/Http/Controllers/ReportController.php: sostituiti tutti i checkisSuperAdmin()concanAccess('report')resources/views/layouts/adminlte.blade.php: sidebar mostra "Report" secanAccess('report')invece diisSuperAdmin()
- Come abilitare un utente: Dal pannello Admin → Utenti, assegnare permesso di livello ≥ 1 (Lettura) per il modulo 'report'
25 Maggio 2026 - Viste Personalizzate per Colonne (Individui e Gruppi)
- Funzionalità: Ogni utente può personalizzare quali colonne visualizzare nelle liste di Individui e Gruppi
- Individui:
- Colonne disponibili: Codice, Cognome, Nome, Email, Telefono
- Il controller
IndividuoController@index()ora passa$allColumnse$visibleColumnsalla vista - Le colonne visibili sono determinate dalla
VistaReportpredefinita dell'utente - Modal "Colonne Visibili" mostra tutte le colonne con checkbox per toggle
- Modal "Salva Vista" permette di salvare una vista con nome, colonne, e opzione predefinita
- Gruppi:
- Nuova vista tabella affiancata alla vista albero esistente
- Toggle "Tabella/Albero" nella card header
- Colonne disponibili: Nome, Descrizione, Diocesi, Livello, Gruppo Padre, Membri, Responsabili, Indirizzo, Città
- Le colonne visibili sono determinate dalla
VistaReportpredefinita per tipo 'gruppi' - Salvataggio vista dedicato con route
POST /gruppi/save-vista - Eliminazione vista con route
DELETE /gruppi/vista/{id}
- Model utilizzato:
VistaReport(tabellaviste_report) con campi:user_id,nome,tipo,colonne_visibili(JSON),is_default - Files modificati:
app/Http/Controllers/IndividuoController.php:index()passa$allColumnse$visibleColumnsapp/Http/Controllers/GruppoController.php:index()rifattorizzato per vista tabella/albero, aggiuntisaveVista()edeleteVista()routes/web.php: aggiunte routegruppi/save-vistaegruppi/delete-vistaresources/views/individui/index.blade.php: colonne condizionali con@if(in_array(..., $visibleColumns))resources/views/gruppi/index.blade.php: riscritta completamente con doppio mode (tabella/albero), modal salvataggio vista, toggle colonne
25 Maggio 2026 - Fix Vari Pagine (Individui, Eventi, Mailing, Documenti Upload)
- Individui/Gruppi: Errore
$tableColumnsnon definito risolto usando$allColumns - Eventi: Checkbox righe senza
idimpedivano il corretto funzionamento del label; aggiuntoid="row-checkbox-{{ $evento->id }}" - Mailing List: Stesso problema checkbox, corretto con
idunivoci - Documenti upload: Funzione
loadUploadTargets()chiamata ma non definita; aggiunta per popolare il dropdown target
25 Maggio 2026 - Fix Documento Avatar e Morph Map
- Problema: Caricando un documento avatar associato a un individuo, errore "Class 'individuo' not found"
- Causa: Il campo
visibilita_target_typenel database conteneva nomi brevi ('individuo', 'gruppo') invece del namespace completo - Soluzione:
- Registrata
Relation::morphMap()inAppServiceProvider@boot()per mappare nomi brevi a classi complete - Aggiornato
DocumentoController@store()per impostare correttamentevisibilita_target_typein base alla visibilità
- Registrata
- Files modificati:
app/Providers/AppServiceProvider.php: aggiunta morphMap per individuo, gruppo, evento, mailing, associazione, federazioneapp/Http/Controllers/DocumentoController.php: logica esplicita per mappare visibilità → target_type
25 Maggio 2026 - Fix Pagina Gruppi (Tabella Pivot Inesistente)
- Problema: Pagina gruppi falliva con "Table 'glastree.gruppo_responsabili' doesn't exist"
- Causa: Il modello
Gruppoaveva una relazioneresponsabili()che puntava a tabella pivot inesistente (la migration2026_05_12_000003aveva migrato a JSONresponsabile_ids) - Soluzione:
- Rimossa relazione
responsabili()daGruppo.php - Rimossa eager loading
responsabilidaGruppoController@index() - Mantenuti metodi helper
getResponsabiliIds()egetResponsabili()che leggono dal campo JSON - Corretti riferimenti in
gruppi/show.blade.phpeindividui/show.blade.phpper usaregetResponsabili()
- Rimossa relazione
- Files modificati:
app/Models/Gruppo.php: rimossa relazioneresponsabili(), mantenuti helperapp/Http/Controllers/GruppoController.php: rimossa eager loadingresponsabiliresources/views/gruppi/show.blade.php: corretto$child->responsabile→$child->getResponsabili()->first()resources/views/individui/show.blade.php: corretto$gruppo->responsabile→$gruppo->getResponsabili()->first()
25 Maggio 2026 - Fix Caricamento Documenti in Pagina Gruppi
- Funzionalità: Aggiunto modale "Carica Documento" nella pagina
gruppi/showper upload diretto - Logica Responsabili: Solo i membri del gruppo possono essere selezionati come responsabili
- In
create.blade.php: il dropdown responsabili si aggiorna dinamicamente quando si aggiungono/rimuovono membri - Funzione JS
updateResponsabiliFromMembri()sincronizza il select responsabili con i membri aggiunti
- In
- Files modificati:
resources/views/gruppi/show.blade.php: aggiunto modale upload documento, alert success/errorresources/views/gruppi/create.blade.php: logica JS per vincolare responsabili ai soli membri
(Last updated: 25 Maggio 2026 - Fix report eventi_calendario, colonna data)
25 Maggio 2026 - Fix Report Eventi Calendario
- Problema: Report "Eventi del Mese" falliva con "Unknown column 'data_inizio' in 'WHERE'"
- Causa: Il report usava
data_inizioche non esiste nella tabellaeventi. La colonna corretta èdata_specifica - Soluzione: Sostituito
data_iniziocondata_specificainreportEventiCalendario()ereportEventiPerGruppo() - Files modificati:
app/Http/Controllers/ReportController.php: righe 389-397 e 532, corretto nome colonna
(Last updated: 25 Maggio 2026 - Fix report eventi_calendario, colonna data)