# PROJECT_STATE.md — FranCoach

Documento interno di stato del progetto. Aggiornato alla fine di ogni modulo.

---

## Aggiornamento applicativo — completato (2026-07-28)

- Stato dettagliato: `IMPLEMENTATION_STATUS_2026-07-28.md`.
- Schede convertite in modelli settimanali ripetuti per una durata in settimane.
- Sessioni estese con autosave atleta/coach, serie manuali eliminabili, dropset, media privati per esercizio e tempo effettivo.
- Dashboard atleta e coach riallineate ai flussi richiesti.
- Profilo atleta completo lato coach con contatti rapidi.
- Libreria esercizi importabile con dati italiani e GIF, filtro per gruppo muscolare e dettaglio media condizionale.
- Nutrizione aggiornata con catalogo alimenti e alternative nella lista della spesa.
- Polling notifiche globale ogni 60 secondi.
- Tema scuro e contrasto uniformati.
- Stato verificato: **154 test/975 asserzioni, 211 route, 66 migration, build Vite superata**.
- Restano aperti: messaggistica completa, pannello admin, push remoto, collaudo hosting reale e revisione legale.

---

## Modulo Gestione atleti e accessi — completato (2026-07-28)

- Supporto multi-atleta completato mantenendo un solo coach; rimossi contesto e testi dipendenti da un atleta fisso.
- Create 4 tabelle (`athlete_subscriptions`, `subscription_reminders`, `subscription_events`, `athlete_invitations`) e aggiunti controlli `allow_login`, sospensione e grace period.
- Aggiunti `AthleteAccessService`, DTO strutturato, middleware `subscription.valid`, selettore atleta validato, CRUD coach, area accesso atleta e flusso invito firmato monouso.
- Disponibili 22 route specifiche per gestione atleta/accesso/invito, per un totale applicativo corrente di 211 route.
- Comando idempotente `subscriptions:process-expirations`, scheduler quotidiano alle 07:00 `Europe/Rome`, comando assistito `athletes:migrate-existing-subscriptions`.
- Disponibili 11 notifiche di ciclo vita, notifica interna, e-mail parametrica, registro invii e rate limit.
- Documentazione: `MULTI_ATHLETE_IMPLEMENTATION.md`, `ATHLETE_INVITATION_FLOW.md`, `SUBSCRIPTION_ACCESS_RULES.md`, `SUBSCRIPTION_REMINDERS.md`, `CRON_CONFIGURATION.md`, `ATHLETE_MIGRATION_GUIDE.md`, `MULTI_ATHLETE_CHECKLIST.md`.
- Test modulo originario: 13 test/73 asserzioni. Verifica applicativa corrente: 154 test/975 asserzioni, 66 migration e build Vite superata.
- Problemi noti: la messaggistica resta il sottosistema incompleto già segnalato; nessun pagamento o rinnovo automatico previsto.
- Attività successiva: collaudo SMTP e cron su hosting reale, migrazione assistita dell’eventuale atleta esistente con scadenza scelta dal coach.

---

## Nota di provenienza e perimetro (2026-07-28)

I Moduli 1, 2, 3 e 13-15 sono stati sviluppati e verificati in questa stessa conversazione. I Moduli 4-12 e il Modulo Nutrizione sono comparsi nella cartella del progetto già completati, sviluppati altrove (probabilmente un'altra sessione/strumento, verosimilmente Claude Code in locale) senza passare da qui. Su richiesta esplicita, ho riletto l'intero codebase reale (migration, model, enum, route, controller, service, view, test) per verificare che questo documento corrisponda a quanto effettivamente presente su disco, e ho corretto le sole incongruenze trovate; il contenuto descrittivo dei Moduli 4-12/Nutrizione è stato lasciato come trovato perché già coerente con il codice reale.

**Segnalazione importante**: il Modulo Nutrizione implementa una funzionalità (piani alimentari, consigli nutrizionali, integrazione, liste della spesa — 15 tabelle, 14 model, 9 enum, 9 service, 14 controller, ~50 route, 22 view) che il perimetro di progetto concordato all'inizio escludeva esplicitamente ("Nessuna funzionalità di nutrizione/dieta"). Non è uno stub isolato: è un sottosistema completo, testato (`NutritionModuleTest`) e collegato alle dashboard coach/atleta. Lo lascio documentato qui per trasparenza, ma è una deviazione dal perimetro originale che vale la pena confermare esplicitamente con il committente del progetto, non un'estensione naturale di un modulo già pianificato.

Verificato inoltre, con controllo diretto sul codice: 66 migration totali, 23 file di test e cartella `Http/Controllers/Admin` ancora vuota (solo `.gitkeep`). La messaggistica non dispone ancora di controller e view; il centro notifiche è completo.

---

## Moduli completati

- **Modulo 1 — Inizializzazione tecnica** ✅ completato e revisionato.
- **Modulo 2 — Progettazione del database generale** ✅ completato.
- **Modulo 3 — Autenticazione e gestione account iniziali** ✅ completato e adeguato al flusso inviti.
- **Modulo 4 — Layout definitivo e dashboard differenziate** ✅ completato e verificato.
- **Modulo 5 — Anagrafica e profilo completo atleta** ✅ completato e verificato.
- **Modulo 6 — Libreria esercizi e video multi-sorgente** ✅ completato e verificato.
- **Modulo 7 — Creazione e gestione schede di allenamento** ✅ completato e verificato.
- **Modulo 8 — Assegnazione scheda e calendario allenamenti** ✅ completato e verificato.
- **Modulo 9 — Esecuzione e registrazione della sessione** ✅ completato e verificato.
- **Modulo 10 — Diario e storico degli allenamenti** ✅ completato e verificato.
- **Modulo 11 — Progressi corporei e misurazioni** ✅ completato e verificato.
- **Modulo 12 — Fotografie progressi** ✅ completato e verificato.
- **Modulo Nutrizione — Piani, consigli, integrazione e spesa** ✅ completato e verificato.
- **Modulo 13 — Report e statistiche** ✅ completato e verificato.
- **Modulo 14 — Impostazioni generali** ✅ completato e verificato.
- **Modulo 15 — Hardening sicurezza, privacy e audit** ✅ completato e verificato.
- **Modulo 14B — Notifiche interne e promemoria** ✅ completato e verificato.
- **Modulo 18 — Deployment e collaudo finale** ✅ completato; MVP `0.1.0-rc.1` pronto per il collaudo su hosting reale.

## Moduli non ancora sviluppati

- Pannello amministrativo (cartella `Http/Controllers/Admin` predisposta ma vuota)
- Messaggistica coach/atleta (tabelle `conversations`/`messages`/`message_attachments`/`message_reads` e model esistono dal Modulo 2, nessuna route/controller/view)

---

## Modulo 18 — Deployment e collaudo finale

### Deployment

- Guida Apache definitiva per upload, document root `public`, `.env`, database, migration, seed, storage, permessi, cache, cron, SMTP, HTTPS, PWA, log e aggiornamenti.
- Procedura alternativa senza SSH con `vendor` e asset precompilati, schema SQL, storage pubblico configurabile senza symlink e template installer temporaneo protetto.
- Template installer non eseguibile per default (`.example`), con HTTPS, token, allowlist IP, lock monouso e obbligo di eliminazione.
- Schema MySQL opzionale in `database/schema/mysql-schema.sql`, privo di utenti e dati applicativi.
- Inventario aggiornato a 211 route in `ROUTES.md` e credenziali da configurare in `CONFIGURATION_CREDENTIALS.md`.

### Backup

- Comando `francoach:backup` per database, file pubblici controllati e fotografie/file privati.
- Archivi fuori document root con permessi restrittivi, manifest per file, checksum SHA-256 e verifica profonda.
- Cifratura ZIP AES-256 opzionale, rotazione configurabile, log dedicato e scheduler giornaliero alle 02:15.
- Documentazione di ripristino completo e selettivo, controllo integrità, copia off-site e prova periodica.

### Collaudo e release

- Creati `FINAL_TEST_PLAN.md`, `RELEASE_CHECKLIST.md`, `POST_DEPLOY_CHECKLIST.md`, `BACKUP_RESTORE.md`, `CHANGELOG.md` e README aggiornato.
- PWA corretta con percorsi relativi per dominio root e sottocartella.
- Disco pubblico configurabile tramite `PUBLIC_STORAGE_PATH`/`PUBLIC_STORAGE_URL` per hosting senza symlink.
- Sicurezza di deployment e continuità operativa aggiunta a `SECURITY_CHECKLIST.md`.
- Verifica finale locale aggiornata: 154 test e 975 asserzioni, 66 migration, build Vite, 211 route e scheduler verificati.
- `composer audit --locked` e `npm audit`: nessuna vulnerabilità nota.
- MVP dichiarato pronto per il collaudo finale come release candidate `0.1.0-rc.1`, non ancora dichiarato produzione.
- Non conformità esplicita: messaggistica non collaudabile perché controller, route e interfaccia non sono presenti; deve essere risolta o formalmente esclusa dal perimetro prima della promozione in produzione.

---

## Modulo 14B — Notifiche interne e promemoria

La denominazione `14B` evita la collisione con il precedente Modulo 14 già assegnato alle impostazioni generali.

### Centro notifiche

- Tipi completi per messaggi, schede, allenamenti, progressi, fotografie, commenti, misurazioni e avvisi sistema.
- Priorità, icone, collegamenti interni sanificati, badge globale, filtri, ricerca, paginazione, lettura singola/multipla ed eliminazione.
- Policy proprietario e ULID impediscono accessi IDOR; le azioni mutative usano CSRF e metodi non GET.
- Notifiche applicative generate per assegnazioni, calendario, misurazioni, fotografie, allenamenti completati e commenti coach.

### Promemoria e hosting

- Comando idempotente `notifications:send-reminders`, eseguibile integralmente o per tipo.
- Scheduler `Europe/Rome` per allenamento odierno, sessione non completata, peso, fotografia e messaggi non letti.
- Frequenze peso/foto lette dalle impostazioni coach; chiavi univoche e `withoutOverlapping` prevengono duplicati.
- Nessun worker permanente: compatibilità con cron cPanel ogni minuto e coda sincrona.
- Log Laravel e output dedicato in `storage/logs/notifications-scheduler.log`.
- Documentazione operativa in `NOTIFICATIONS_CRON.md`.

### PWA e test

- Notification API e service worker predisposti come opzione esplicita, senza dipendenza da push remoto e senza impatto sul funzionamento ordinario.
- Service worker corretto per installazioni in sottocartella e gestione click della notifica.
- `NotificationModuleTest` copre privacy, filtri, badge, lettura, eliminazione, IDOR, link interni, idempotenza, timezone, promemoria e PWA opzionale.
- Suite completa: 120 test, 732 asserzioni; migration pulita con seeder, Pint, cache Blade e build Vite verificati.
- `composer audit --locked` e `npm audit`: nessuna vulnerabilità nota.

---

## Modulo 15 — Hardening sicurezza, privacy e audit

### Audit e protezioni

- Audit append-only esteso con ULID evento, attore, soggetto, entità, IP, user agent, metodo, percorso e valori precedenti/successivi sanitizzati.
- Copertura di login, logout, accessi falliti, profilo, esercizi, schede, assegnazioni, correzioni allenamenti, progressi, fotografie, impostazioni ed esportazioni report.
- Oscuramento centralizzato di password, token, contatti, dati corporei, note e percorsi file.
- HTTPS obbligatorio in produzione, proxy attendibili configurabili, sessioni cifrate e cookie `Secure`, `HttpOnly`, `SameSite=Lax`.
- Security header, CSP con allowlist video, cache privata disabilitata e rate limiting dedicato ai flussi sensibili.
- Review completata per CSRF, XSS, query parametrizzate, IDOR, policy, upload, traversal, redirect e mass assignment.

### Privacy

- Informativa privacy e termini come bozze tecniche chiaramente marcate, non testi legali definitivi.
- Gestione e storico dei consensi versionati con audit di concessione e revoca.
- Esportazione JSON privata, autorizzata, senza credenziali, percorsi storage o file binari e disponibile per 24 ore.
- Richiesta cancellazione con password corrente, conferma testuale, periodo tecnico di 30 giorni e possibilità di annullamento.
- Necessità di revisione legale professionale esplicitata nelle view, nel codice e in `PRIVACY_IMPLEMENTATION.md`.
- Checklist completa in `SECURITY_CHECKLIST.md` e `MODULE_15_CHECKLIST.md`.

### Test e verifica

- `SecurityPrivacyTest` copre header, bozze legali, consensi, storico, esportazione, IDOR, cancellazione, audit autenticazione, sanitizzazione, immutabilità, CSRF, escaping e rate limiting.
- Suite completa: 114 test, 699 asserzioni; migration pulita con seeder, Pint, cache Blade e build Vite 8 verificati.
- `composer audit --locked` e `npm audit`: nessuna vulnerabilità nota.

---

## Modulo 14 — Impostazioni generali

### Configurazione e sicurezza

- Pannello accessibile esclusivamente al coach tramite middleware, policy e validazione server-side.
- Impostazioni globali persistenti per nome applicazione, Instagram, modifica sessioni completate, unità di misura, timer recupero, promemoria, limite upload, manutenzione, formati data/ora e timezone fissa `Europe/Rome`.
- E-mail e telefono del coach gestiti sul profilo utente senza duplicare dati sensibili nella tabella impostazioni.
- Allowlist rigorosa dei valori ammessi; nessun tema, palette, white-label, font, layout, dominio o abbonamento esposto.

### Cache, manutenzione e audit

- `SettingsService` centralizza valori predefiniti, lettura cache, aggiornamento, ripristino e applicazione runtime.
- Tabella `settings` estesa con scope, gruppo, tipo, autore modifica e unicità globale per chiave.
- Modalità manutenzione applicata all’area atleta, mantenendo accessibile il pannello coach.
- Conferma obbligatoria per cambio manutenzione, pulizia cache e ripristino valori predefiniti.
- Audit delle modifiche, del reset e della pulizia cache, senza registrare i valori dei contatti.
- Checklist operativa in `SETTINGS_MODULE_CHECKLIST.md`.

### Test e verifica

- `GeneralSettingsTest` copre autorizzazioni, caricamento valori predefiniti, persistenza, cache, validazione, manutenzione, reset, audit e unicità.
- Suite completa: 107 test, 633 asserzioni; migration pulita con seeder, Pint, cache Blade e build Vite verificati.

---

## Modulo 13 — Report e statistiche

### Report coach

- Report generale dell’atleta selezionato con filtri settimana, mese, 90 giorni, 6 mesi e intervallo personalizzato.
- Riepilogo di allenamenti previsti, completati e saltati, aderenza, volume totale, carico medio, record personali, durata media e RPE medio.
- Aggregazioni per volume muscolare, carichi medi/massimi, trend allenamenti, volume e carichi.
- Andamento di peso, massa grassa, massa magra, massa muscolare e circonferenze con variazioni iniziale/finale.
- Frequenza dei messaggi e note rilevanti provenienti da sessioni e feedback.
- Query aggregate e limitate, eager loading controllato e nessuna query nelle componenti visuali.

### Interfaccia ed esportazioni

- Dashboard coach responsive con sette grafici Chart.js, riepiloghi testuali, tabelle ed empty state.
- Stampa ottimizzata tramite stylesheet dedicato.
- Esportazione PDF sincrona con Dompdf, logo FranCoach, atleta, periodo, riepilogo, tabelle, data di generazione e note del coach.
- Esportazione CSV UTF-8 con sezioni tabellari e separatore compatibile con fogli di calcolo italiani.
- Autorizzazione server-side tramite middleware coach e `ReportFilterRequest`; esportazioni registrate nell’audit log.
- Checklist operativa in `REPORT_MODULE_CHECKLIST.md`.

### Test e verifica

- `ReportStatisticsTest` copre aggregazioni, periodi, intervallo personalizzato, autorizzazioni, PDF valido, CSV e audit.
- PDF A4 renderizzato con Poppler e verificato visivamente.
- Suite completa: 100 test, 590 asserzioni; Pint, cache Blade e build Vite verificati.

---

## Modulo Nutrizione — Piani alimentari, consigli, integrazione e spesa

### Dominio e versionamento

- Piani alimentari strutturati in giornate, pasti, pietanze e alternative con ordinamento, duplicazione e soft delete.
- Stati bozza, pubblicato, attivo, sospeso e archiviato; modifica diretta del piano esistente, anche quando già assegnato.
- Una sola assegnazione corrente per atleta, sostituzione confermata e conservazione delle assegnazioni precedenti.
- Calcolo centralizzato delle calorie da proteine, carboidrati e grassi con soglia di scostamento configurabile.

### Interfacce e funzioni

- Dashboard nutrizione differenziate, editor coach responsive con autosave Fetch, anteprima atleta e navigazione desktop/mobile.
- Dettaglio coach completo con riepilogo generale, medie macro, assegnazioni e contenuto di ogni giornata, pasto, pietanza e alternativa.
- Vista atleta in sola lettura per piano assegnato, giornate, pasti, alternative e riepiloghi macro con Chart.js.
- Consigli alimentari categorizzati, prioritari, programmabili, assegnabili e filtrabili.
- Piani di integrazione separati con quantità, unità, momento, frequenza, istruzioni e avvertenza configurabile.
- Liste della spesa generate aggregando pietanze per nome e unità, modificabili dal coach e spuntabili dall’atleta.
- Componenti Blade riutilizzabili per piani, giornate, pasti, macro, consigli, integrazione, spesa, stati ed empty state.

### Sicurezza, audit e dati

- Policy separate per piani, giornate, pasti, pietanze, consigli, integrazione e liste della spesa.
- L’atleta vede esclusivamente contenuti pubblicati e assegnati; tutte le mutazioni restano riservate al coach.
- Form Request con vincoli su date, quantità, unità, stato e contenuti; output testuale sempre escapato.
- Audit append-only per creazione, modifica, pubblicazione, assegnazione, sostituzione, consigli, integrazione e generazione spesa.
- Migration completa delle 13 tabelle richieste, enum PHP, relazioni Eloquent, factory e `NutritionDemoSeeder`.

### Test

- `NutritionModuleTest` copre dashboard/empty state, autorizzazioni, visibilità assegnata, CRUD di base, macro e warning, sostituzione, storico, duplicazione gerarchica, aggregazione spesa, consigli e validazione.
- Suite completa: 95 test, 556 asserzioni; migration/seed demo, cache Blade, Pint e build Vite verificati.

---

## Modulo 12 — Fotografie progressi

### Archivio e immagini

- Tipologie: frontale, laterale destra, laterale sinistra, posteriore e posa libera.
- Campi completi per utente, data, posa, tre percorsi elaborati, peso, note atleta/coach e autore dell’upload.
- Upload JPG, PNG e WebP fino a 10 MB con controllo MIME e nomi casuali.
- HEIC abilitato esclusivamente quando ImageMagick dichiara supporto HEIC; altrimenti viene rifiutato senza tentativi inaffidabili.
- Correzione dell’orientamento EXIF per JPEG, ricodifica, compressione, rimozione metadati e generazione thumbnail.
- Originale normalizzato, versione elaborata e thumbnail salvati esclusivamente sul disco privato `progress_photos`.

### Accesso e privacy

- Immagini servite solo da controller autenticati e policy: accesso limitato all’atleta proprietario e al coach.
- Nessun percorso storage o URL pubblico permanente esposto nelle view.
- Risposte immagine `inline` con cache disabilitata, protezione same-origin, referrer disabilitato e indicazione `noindex/noarchive`.
- Ogni accesso del coach alle immagini viene registrato nell’audit log.
- Creazione, modifica note ed eliminazione sono auditabili; la cancellazione confermata rimuove record e tutte le copie fisiche.
- Nessuna fotografia viene inserita nelle notifiche o resa condivisibile pubblicamente.

### Galleria e confronto

- Galleria responsive paginata con filtro per posa, data, peso, note e autore.
- Selezione indipendente della prima e della seconda fotografia.
- Affiancamento interattivo con slider prima/dopo accessibile da tastiera.
- Confronto di data, posa, peso, variazione e note atleta/coach.
- Navigazione desktop/mobile e azione rapida atleta collegate alle nuove route.

### Test

- `ProgressPhotoTest` copre upload, MIME, limite 10 MB, HEIC condizionale, elaborazione JPEG, dimensioni thumbnail, storage privato, nomi casuali, accessi, header, audit coach, note, confronto, isolamento dati e cancellazione file.
- Suite completa: 83 test, 515 asserzioni.

---

## Modulo 11 — Progressi corporei e misurazioni

### Tipi e registrazione

- Seeder strutturale con peso, composizione corporea, metabolismo basale e tutte le circonferenze richieste.
- Unità coerenti: kg per peso e masse, cm per circonferenze, percentuali per composizione relativa e kcal per metabolismo basale.
- Inserimento, modifica e cancellazione logica con valore decimale, note, fonte, autore e data/ora.
- Fonte e autore determinati dal ruolo autenticato, senza possibilità di alterazione dal form.
- Blocco dei valori fuori scala, delle percentuali oltre 100, delle date future per l’atleta e dei duplicati per tipo/data/ora.

### Permessi, obiettivi e audit

- FranCoach può inserire, correggere ed eliminare ogni misurazione dell’atleta, incluse quelle con data futura.
- Ogni atleta può operare solo sui propri valori e modificarli/eliminarli entro la finestra configurabile `MEASUREMENT_EDIT_HOURS`.
- Gli inserimenti del coach non sono modificabili dall’atleta.
- Obiettivi collegati ai tipi di misurazione tramite il dominio `AthleteGoal` esistente.
- Audit append-only per creazione, correzione, cancellazione e aggiornamento obiettivi.

### Storico e grafici

- Storico filtrabile e paginato con tipo, valore, fonte, autore, note e timestamp.
- Filtri per 7 giorni, 30 giorni, 90 giorni, 6 mesi, un anno e intervallo personalizzato.
- Grafici Chart.js per ogni misurazione disponibile, inclusi peso, masse e circonferenze.
- Confronto fra periodo selezionato e precedente, variazione assoluta e percentuale.
- Navigazione e azioni rapide coach/atleta collegate alle nuove route reali.

### Test

- `MeasurementProgressTest` copre seeder, unità, inserimento, fonte/autore, audit, duplicati, futuro, limiti percentuali, permessi, finestra di modifica, soft delete, correzioni coach, obiettivi, isolamento dati, filtri, paginazione, confronti e grafici.
- Suite completa: 77 test, 449 asserzioni.

---

## Modulo 10 — Diario e storico degli allenamenti

### Diario e filtri

- Diario cronologico differenziato per atleta e coach con stato, durata, volume, completamento, valutazione e accesso al dettaglio.
- Filtri temporali per settimana, mese, 90 giorni, anno e intervallo personalizzato.
- Filtri coach aggiuntivi per scheda ed esercizio, conservati durante la paginazione.
- Calendario delle attività completate e saltate con collegamento alla sessione pianificata.
- Query isolate per atleta, eager loading selettivo, indici dedicati e paginazione a 12 sessioni.

### Statistiche e storico esercizio

- Statistiche per sessioni completate, aderenza, volume, durata media, RPE medio e sessioni saltate.
- Classifica degli esercizi più eseguiti e trend dei carichi tramite Chart.js.
- Dettaglio sessione con feedback, note, record, confronto precedente, esercizi e tutte le serie registrate.
- Storico per esercizio con carico massimo, ripetizioni, volume, RPE/RIR medi, record personale e grafico del carico.
- Collegamenti alla scheda esercizio e video tramite il componente riutilizzabile `<x-video-player>`.

### Coach, audit e test

- Commenti operativi del coach con autore, timestamp e audit append-only.
- Correzione asincrona dei dati delle serie con ricalcolo delle statistiche e consultazione delle variazioni precedenti/successive.
- Policy estese per proprietà delle sessioni, commenti, audit e accesso atleta agli esercizi presenti nello storico.
- `WorkoutJournalTest` copre isolamento dei dati, ordine cronologico, filtri, paginazione, empty state, dettaglio, feedback, record, commenti, correzioni, audit e storico esercizio.
- Suite completa: 72 test, 401 asserzioni.

---

## Modulo 9 — Esecuzione e registrazione della sessione

### Esecuzione

- Avvio transazionale e idempotente della sessione con data/ora, versione assegnata e snapshot immutabile di giornata, esercizi, prescrizioni e serie.
- Ripresa della sessione esistente senza duplicazioni, garantita anche da vincolo univoco sulla sessione pianificata.
- Stati in corso, pausa, completata e annullata sincronizzati con il calendario.
- Interfaccia atleta responsive con immagini, istruzioni, video tramite `<x-video-player>`, prescrizioni, ultima prestazione, note coach e serie.
- Autosave Fetch con chiavi di idempotenza per carico, ripetizioni, durata, distanza, RIR, RPE, recupero, note e completamento.
- Aggiunta serie, salto esercizio, annullamento confermato e modifica delle sessioni completate entro il limite configurabile.

### Timer e riepilogo

- Countdown persistente con avvio, pausa, ripristino, durata precompilata, sincronizzazione server e recupero corretto dopo inattività della pagina.
- Vibrazione quando supportata e segnale sonoro opzionale.
- Feedback finale su difficoltà, energia, qualità, dolore, commento e valutazione.
- Calcolo di volume per esercizio e totale, serie e percentuale completate, durata effettiva, record personali e confronto con la sessione precedente.

### Sicurezza, audit e test

- `WorkoutSessionService`, request validate, policy per proprietà/stato/scadenza e mutation log idempotente.
- Correzioni coach consentite con registrazione completa nell’audit log e ricalcolo dei risultati.
- `WorkoutSessionExecutionTest` copre snapshot, avvio duplicato, autosave idempotente, ripresa, serie, salto, timer, completamento, feedback, calcoli, record, scadenza modifiche, audit, annullamento e autorizzazioni.
- Suite completa: 66 test, 360 asserzioni. Migration fresh con seed, cache Blade, formattazione dei file del modulo e build Vite verificate.

---

## Modulo 8 — Assegnazione scheda e calendario allenamenti

### Assegnazioni

- Assegnazione di una versione pubblicata precisa della scheda all’atleta selezionato.
- Campi operativi: utente, piano, versione, periodo, programmazione settimanale, note coach, stato, assegnatore e flag corrente.
- Una sola assegnazione corrente per atleta, garantita dal service transazionale con lock.
- Richiesta di conferma obbligatoria per la sostituzione.
- La sostituzione archivia la precedente assegnazione, conserva lo storico e annulla le sessioni future non eseguite.
- Riassegnazioni identiche sono idempotenti e non creano righe duplicate.

### Calendario

- `WorkoutCalendarService` genera sessioni dalla data iniziale, dalle settimane/versione, dall’ordine dei giorni e dalla programmazione settimanale.
- Generazione idempotente per coppia assegnazione/giorno del programma.
- Stati sessione: pianificata, iniziata, completata, saltata, annullata e riprogrammata.
- Riprogrammazione della singola data con conservazione della data originale.
- Annullamento e note coach sulla singola sessione.
- Tutte le operazioni temporali usano esplicitamente `Europe/Rome`.

### Interfacce

- Area coach con assegnazione/sostituzione, scheda corrente, storico, calendario mensile, aderenza e gestione sessioni.
- Area atleta con calendario mensile, vista settimanale, allenamento odierno, sessioni future e conteggi completate/saltate/riprogrammate.
- Dettaglio sessione condiviso con esercizi, serie, prescrizioni, alternative e disponibilità video.
- Navigazione desktop/mobile e azioni rapide collegate alle nuove route.

### Architettura e test

- `WorkoutAssignmentService`, `WorkoutCalendarService`, controller coach/atleta, request e policy dedicate.
- Migration compatibile con i dati precedenti e normalizzazione delle eventuali assegnazioni attive duplicate.
- `WorkoutAssignmentCalendarTest` copre assegnazione, conferma sostituzione, storico, calendario, idempotenza, timezone, riprogrammazione, annullamento, note e autorizzazioni.
- Suite completa: 59 test, 297 asserzioni.

---

## Modulo 7 — Creazione e gestione schede di allenamento

### Dominio e dati

- Schede strutturate su `workout_plans` → versioni → settimane → giorni → esercizi → serie.
- Metadati completi: titolo, descrizione, obiettivo, livello, durata, frequenza, stato, note, versione e autore.
- Giorni con numero, giorno della settimana opzionale, focus, durata stimata, note e ordine.
- Esercizi con blocco, ordine, tecnica, obbligatorietà, alternativa, recupero e note.
- Serie con ripetizioni, carico, percentuale 1RM, tempo, recupero, RIR, RPE, tempo di esecuzione e note.
- Enum `WorkoutTechnique` con normale, superset, triset, giant set, circuito, drop set, rest pause, AMRAP, EMOM, isometria e tempo.

### Editor e interfacce

- Editor visuale responsive per aggiungere, duplicare, eliminare e riordinare settimane, giorni, esercizi e serie.
- Pulsanti accessibili per ogni operazione di ordinamento; nessuna funzione dipende esclusivamente dal drag and drop.
- Ricerca asincrona nella libreria esercizi, indicatore video e anteprima in modale senza uscire dall’editor.
- Salvataggio bozza anche incompleta, pubblicazione validata e anteprima atleta.
- Pagina “La mia scheda” per l’atleta con settimane, giorni, blocchi, prescrizioni e collegamenti ai video.
- Navigazione desktop/mobile e azioni rapide aggiornate con le route reali delle schede.

### Versionamento

- Le bozze non assegnate vengono aggiornate in-place.
- La modifica di una versione pubblicata o assegnata crea automaticamente una nuova versione.
- La pubblicazione rende corrente la nuova versione e archivia la precedente senza eliminarla.
- Ogni versione conserva uno snapshot dei metadati; assegnazioni e storico restano collegati alla versione originale.
- Le schede con assegnazioni storiche non possono essere eliminate.

### Architettura e test

- `WorkoutPlanService`, controller coach/atleta, `WorkoutPlanRequest`, policy per piano/versione e componenti Blade dedicati.
- Query paginate e filtrate, eager loading della struttura e ricerca esercizi limitata.
- `WorkoutPlanManagementTest` copre autorizzazioni, editor, bozza, pubblicazione, struttura, versionamento, immutabilità assegnazioni, anteprima e vista atleta.
- Suite completa: 53 test, 253 asserzioni.

---

## Modulo 6 — Libreria esercizi e video multi-sorgente

### Funzionalità

- CRUD coach completo con ricerca, filtri, creazione, modifica, duplicazione, attivazione/disattivazione, soft delete, ripristino e anteprima atleta.
- Accesso atleta limitato agli esercizi attivi visibili o inclusi in una scheda attiva assegnata.
- Scheda esercizio completa con classificazione, muscoli primari/secondari, attrezzatura, istruzioni, note tecniche/private, copertina e ordinamento.
- Upload JPG/PNG/WebP fino a 5 MB con validazione MIME, nome casuale, ridimensionamento/ottimizzazione GD e rimozione del file sostituito.

### Video

- Architettura estensibile con `VideoProviderInterface`, `VideoProviderManager`, DTO `ResolvedVideo`, enum `VideoProviderType` e provider YouTube, Vimeo, Instagram, TikTok, video diretto ed esterno.
- Riconoscimento di YouTube Watch, `youtu.be`, Shorts, Vimeo, Reel/post Instagram, video TikTok e URL diretti MP4/WebM/OGG.
- Componente Blade riutilizzabile `<x-video-player>` con iframe ufficiali, player HTML5, lazy loading, privacy notice, stato di caricamento/errore e fallback esterno.
- Verifica video asincrona nel form coach tramite Fetch API, senza salvataggio automatico.

### Sicurezza

- Solo HTTPS; validazione e normalizzazione lato server; rimozione dei parametri di tracking.
- Blocco di credenziali URL, porte non consentite, host locali, IP letterali, domini interni e domini contraffatti dei provider.
- Nessuno scraping, download o richiesta server-side verso i video; nessun HTML/iframe accettato dall’utente.
- CSP applicativa con allowlist dei soli player ufficiali e iframe sandboxati.

### Test e verifiche

- `VideoProviderManagerTest`: YouTube, Shorts, `youtu.be`, Vimeo, Instagram, TikTok, MP4, provider esterno e URL non sicuri.
- `ExerciseLibraryTest`: permessi, preview, CRUD, duplicazione, stato, soft delete/ripristino, upload, accesso atleta assegnato/visibile e fallback player.
- Suite completa: 47 test, 207 asserzioni. Lint PHP e build Vite verificati.

---

## Modulo 5 — Anagrafica e profilo completo atleta

### Funzionalità

- Profilo coach completo di dati personali, esperienza, disponibilità, attrezzatura, obiettivi, limitazioni, note private e timeline.
- Profilo atleta personale con modifica dei soli dati anagrafici e contatti consentiti.
- Stato account, ruolo, dati operativi, attrezzatura, obiettivi, limitazioni e note private restano sotto controllo del coach.
- Le note private non vengono caricate né renderizzate nell’area atleta.
- Navigazione desktop/mobile aggiornata con le nuove route reali `coach.athlete.*` e `athlete.profile.*`.

### Dati e dominio

- Migration `2026_04_01_000000_extend_athlete_profile_for_module_five`: professione, esperienza, luogo, giorni disponibili, durata media, peso iniziale, preferenze, obiettivo principale e soggetto della timeline.
- Nuovo enum `ExperienceLevel`; `GoalType` ora include anche mantenimento e usa l’etichetta “Ricomposizione corporea”.
- L’obiettivo principale è identificato da `athlete_goals.is_primary`; gli altri obiettivi attivi sono secondari.
- `audit_logs.subject_user_id` rende la timeline dell’atleta indipendente dal tipo di entità modificata.

### Architettura

- Controller: `Coach\AthleteProfileController`, `Athlete\ProfileController`.
- Request dedicate per profilo coach/atleta, obiettivi, attrezzatura, limitazioni e note private.
- Policy `AthleteProfilePolicy` per visualizzazione, modifica, obiettivi, attrezzatura, limitazioni, note private e timeline.
- Service `AthleteProfileService` con transazioni, query filtrate e gestione operativa.
- Service `AuditService` per log append-only con attore, soggetto, valori precedenti/successivi, IP e user agent.

### Timeline

Azioni registrate: modifica profilo, creazione/modifica/rimozione obiettivo, creazione/modifica/rimozione limitazione, nota privata e aggiornamento attrezzatura. Sono già previste le etichette per future assegnazioni scheda, misurazioni e allenamenti.

### Test e verifiche

- `tests/Feature/AthleteProfileTest.php` copre visibilità coach/atleta, note private, aggiornamenti consentiti, protezione di ruolo/stato, audit, obiettivi principali, attrezzatura, limitazioni e autorizzazioni incrociate.
- Suite completa: 40 test, 136 asserzioni.
- Migration SQLite/MySQL-compatible, template Blade, stile PHP e build Vite verificati.
- Verifica visuale Playwright completata sul profilo coach desktop e mobile.

---

## Modulo 4 — Layout definitivo e dashboard differenziate

### Dashboard Coach

Dashboard alimentata da dati reali con saluto, profilo sintetico dell'atleta associato, scheda attiva, allenamento odierno, completati e saltati della settimana, aderenza, ultimo peso e variazione, andamento peso, ultimo allenamento, messaggi, notifiche non lette, attività recente e azioni rapide.

### Dashboard Atleta

Dashboard alimentata dai soli dati dell'utente autenticato con allenamento odierno, prossima sessione, scheda attiva, completamento settimanale, ultimo peso e variazione, record di carico, ultimo messaggio, notifiche e azioni rapide.

### Servizi e query

- `App\Services\CoachDashboardService`
- `App\Services\AthleteDashboardService`
- Array strutturati come contratto tra servizi e view.
- Query filtrate per ruolo/proprietario, eager loading selettivo, aggregazioni per record e limiti sugli elenchi recenti.
- Empty state e fallback espliciti per atleta, scheda, allenamenti, misurazioni, record, messaggi e notifiche assenti.
- Il tipo peso usa il codice strutturale `body_weight` del `MeasurementTypeSeeder`.

### Struttura UI

- Sidebar desktop e navigazione mobile differenziate per ruolo, con menu completo e `aria-current`.
- Topbar con logo, avatar, menu utente e contatore notifiche reale.
- Breadcrumb, card statistiche, feature card, grafici Chart.js, tabella responsive e azioni rapide.
- Componenti riutilizzabili: `breadcrumbs`, `dashboard-stat`, `empty-state`, `quick-actions`, `loading-state`, `skeleton`, `toast-container`, `confirm-dialog`.
- Light mode fisso, senza selettore tema.
- Focus visibile, contrasto semantico, nomi accessibili, testo alternativo e navigazione da tastiera.

Le azioni relative ai moduli non ancora sviluppati sono mostrate come controlli disabilitati e non puntano a route inventate.

### Test e verifiche

- Aggiunto `tests/Feature/DashboardTest.php`: caricamento coach/atleta, empty state, dati filtrati per ruolo e contenuti reali.
- I test di autorizzazione del Modulo 3 restano attivi.
- Suite completa: 33 test, 93 asserzioni.
- Build Vite di produzione completata.
- Verifica visuale Playwright completata su dashboard coach desktop e dashboard atleta desktop/mobile.
- Aggiunti `APP_URL` e `APP_KEY` isolati in `phpunit.xml` per rendere la suite indipendente dall'URL e dalla chiave del file `.env` locale.

---

## Modulo 3 — Autenticazione e gestione account iniziali

Nessuna registrazione pubblica: `UserSeeder` crea soltanto il coach; gli atleti vengono creati dal coach e attivati tramite invito firmato.

### Campi `users` verificati/aggiunti

Migration `2026_03_01_000000_add_profile_fields_to_users_table`: `first_name`, `last_name`, `display_name`, `avatar_path`, `phone`, `date_of_birth`, `gender`, `height_cm`, `last_login_ip`. Già presenti dai moduli precedenti: `email`, `email_verified_at`, `password`, `role`, `is_active`, `last_login_at`, `remember_token`, `deleted_at`, timestamps.

**Riorganizzazione dati (migration `2026_03_01_000001`)**: `date_of_birth`/`gender`/`height_cm` erano stati messi nel Modulo 2 su `athlete_profiles` (`birth_date`/`gender`/`height_cm`), pensati solo per l'atleta. Poiché il Modulo 3 li richiede su `users` (validi per qualsiasi utente, anche il coach), sono stati spostati lì e rimossi da `athlete_profiles` (con backfill automatico di eventuali valori già presenti), per avere un'unica fonte di verità. `coach_id`, `activity_level`, `started_coaching_on` restano su `athlete_profiles` (attributi del rapporto di coaching). Dettagli in `DATABASE_DESIGN.md`.

### Codice generato

- **Migration**: le 2 sopra.
- **Model aggiornati**: `User` (nuovi fillable/cast, `displayName()`, `fullName()`, `dashboardRouteName()`), `AthleteProfile` (campi rimossi).
- **Form Request**: `LoginRequest` (throttling per email+IP, tentativo di autenticazione, blocco inattivi, aggiornamento `last_login_at`/`last_login_ip`), `ChangePasswordRequest` (regola nativa `current_password`).
- **Middleware**: `EnsureUserIsActive` (alias `active`, disconnette a metà sessione un account disattivato), `EnsureUserIsCoach` (alias `coach`), `EnsureUserIsAthlete` (alias `athlete`). `auth`/`guest`/`auth.session` sono gli alias nativi di Laravel, non ridichiarati.
- **Controller**: `Auth\LoginController` (login/logout), `Auth\ForgotPasswordController`, `Auth\ResetPasswordController`, `Auth\ChangePasswordController` (anticipa solo il cambio password dalla futura "Gestione profilo", perché esplicitamente richiesto in questo modulo), `Coach\DashboardController`, `Athlete\DashboardController` (placeholder protetti), `DashboardRedirectController` (redirect `/dashboard` in base al ruolo).
- **View**: `layouts/guest.blade.php` (card centrata, mobile-first), `auth/login`, `auth/forgot-password`, `auth/reset-password`, `auth/change-password`, `coach/dashboard`, `athlete/dashboard`. Sidebar/topbar/bottom-nav aggiornate con utente reale, menu profilo e logout; `welcome.blade.php` ora mostra un pulsante "Accedi".
- **Seeder**: `UserSeeder` legge da `.env` soltanto `SEED_COACH_EMAIL` e `SEED_COACH_PASSWORD`; nessuna password reale nel repository. Va in errore esplicito se le variabili non sono impostate.
- **Test**: `tests/Feature/Auth/{LoginTest,LogoutTest,PasswordChangeTest}.php`, `tests/Feature/RoleBasedAccessTest.php` — login coach/atleta, credenziali errate, email inesistente, utente inattivo, throttling, redirect per ruolo, accesso incrociato coach/atleta, logout via POST (e rifiuto GET), cambio password, disconnessione a metà sessione se l'account viene disattivato. Aggiunta anche l'infrastruttura di test mancante (`tests/TestCase.php`, `tests/CreatesApplication.php`).

### Route disponibili (nuove)

| Metodo | URI | Nome | Middleware |
|---|---|---|---|
| GET/POST | `/login` | `login` | `guest` |
| GET/POST | `/forgot-password` | `password.request` / `password.email` | `guest` |
| GET/POST | `/reset-password[/{token}]` | `password.reset` / `password.update` | `guest` |
| POST | `/logout` | `logout` | `auth`, `active`, `auth.session` |
| GET | `/dashboard` | `dashboard` | `auth`, `active`, `auth.session` |
| GET/PUT | `/profile/password` | `profile.password.edit` / `profile.password.update` | `auth`, `active`, `auth.session` |
| GET | `/coach/dashboard` | `coach.dashboard` | `auth`, `active`, `auth.session`, `coach` |
| GET | `/athlete/dashboard` | `athlete.dashboard` | `auth`, `active`, `auth.session`, `athlete` |

### Scelte di sicurezza

- **Messaggi non rivelatori**: credenziali errate, email inesistente e account disattivato mostrano nel form di login lo stesso identico messaggio generico (protezione da enumerazione account). La disconnessione "a metà sessione" per un account disattivato mostra invece un messaggio esplicito, perché visibile solo a chi possedeva già una sessione valida (nessun rischio di enumerazione).
- **Rate limiting**: 5 tentativi per combinazione email+IP, poi blocco temporizzato (`RateLimiter`, stesso pattern di Laravel Breeze).
- **Sessioni**: rigenerazione dell'ID sessione al login, invalidazione completa al logout, invalidazione delle sessioni sugli ALTRI dispositivi dopo cambio password (`Auth::logoutOtherDevices()` + middleware `auth.session`).
- **Open redirect**: `redirect()->intended()` usa solo l'URL precedente salvato internamente da Laravel; nessun parametro di redirect fornito dall'utente viene mai letto.
- **Cookie**: `SESSION_SECURE_COOKIE`/`SESSION_SAME_SITE` già configurati dal Modulo 1 (nessuna modifica necessaria).
- **Password**: hashing automatico via cast `'password' => 'hashed'` su `User` (mai `Hash::make()` manuale, per evitare doppio hashing); policy minima `Password::min(8)` centralizzata in `AppServiceProvider`.

### Credenziali demo

Non più hardcoded: impostare in `.env` (mai committare valori reali):

```
SEED_COACH_EMAIL=coach@example.test
SEED_COACH_PASSWORD=cambia-questa-password
```

### Comandi da eseguire

```bash
composer install
php artisan migrate
# impostare le 4 variabili SEED_* in .env prima di seminare
php artisan db:seed --class=UserSeeder
php artisan test   # o: vendor/bin/phpunit
npm run build
```

### Problemi noti / limiti

1. Ambiente di sviluppo senza PHP/Composer disponibile in questa sessione: non è stato possibile eseguire `php artisan migrate`, `phpunit` o `php -l`. Verificato invece: bilanciamento parentesi/graffe su tutti i file nuovi/modificati, corrispondenza tra ogni `route('...')` referenziato in view/controller/test e i nomi di route effettivamente definiti in `routes/*.php`, corrispondenza tra i metodi dei controller e quelli richiamati dalle route, build Vite eseguita con successo (CSS/JS rigenerati in `public/build`).
2. `ChangePasswordController` anticipa solo il cambio password dal futuro modulo "Gestione profilo" (richiesto esplicitamente qui): modifica di dati anagrafici e avatar restano nel modulo dedicato.
3. `avatar_path` è solo una colonna: nessun form di upload in questo modulo.

## Prossimo modulo (nota storica, superata)

Al termine del Modulo 3 il backlog indicava "gestione esercizi o gestione schede di allenamento" come probabile prossimo passo: sono infatti diventati i Moduli 6 e 7 (vedi sopra). Per il backlog aggiornato a oggi vedi "Moduli non ancora sviluppati" in cima al documento.

---

## Modulo 2 — Database generale

Documentazione completa: [`DATABASE_DESIGN.md`](./DATABASE_DESIGN.md) (colonne/tipi/nullable/default/PK/FK/indici/unique/cascade-restrict/soft delete per tutte le 36 tabelle, diagramma ER Mermaid, descrizione relazioni, diagramma di flusso, politica cascade/restrict/set-null, limiti noti).

### Strategia adottata

- **ID**: `BIGINT UNSIGNED AUTO_INCREMENT` ovunque per le foreign key; colonna `ulid` aggiuntiva (univoca) su `users`, `workout_sessions`, `conversations`, `messages`, `progress_photos`, `notifications`, `data_export_requests`, `account_deletion_requests` — entità esposte in futuro via URL/deep-link.
- **Enum**: nessun `ENUM` MySQL nativo, solo colonne `VARCHAR` castate a **26 enum PHP** in `app/Enums/` (elenco completo in DATABASE_DESIGN.md).
- **Versionamento schede**: `workout_plans` → `workout_plan_versions` (immutabile una volta pubblicata) → settimane → giorni → esercizi → serie. `workout_plan_assignments` lega l'atleta a una versione congelata: modifiche successive al piano non toccano mai assegnazioni/sessioni storiche.
- **Video esercizi**: colonne generiche su `exercises` (`video_url`, `video_provider`, `video_external_id`, `video_embed_url`, `video_metadata`, `video_is_embeddable`, `video_last_checked_at`), nessun campo per singolo provider. `App\Enums\VideoProvider` copre youtube/vimeo/instagram/tiktok/direct/external/unsupported.

### Database creato (migration, in ordine)

38 file in `database/migrations/`, da `2026_02_01_000000` a `2026_02_01_000037`:

`users` (ALTER: +ulid, +role, +is_active, +last_login_at, +soft delete) → `athlete_profiles` → `measurement_types` → `muscle_groups` → `exercise_categories` → `equipment` → `athlete_equipment` → `athlete_goals` → `athlete_notes` → `athlete_limitations` → `exercises` → `exercise_muscle_group` → `workout_plans` → `workout_plan_versions` → `workout_plan_weeks` → `workout_plan_days` → `workout_plan_exercises` → `workout_plan_sets` → `workout_plan_assignments` → `scheduled_workouts` → `workout_sessions` → `workout_session_exercises` → `workout_session_sets` → `workout_session_feedback` → (ALTER `scheduled_workouts` +workout_session_id, chiude la FK reciproca) → `measurements` → `progress_photos` → `conversations` → `conversation_participants` → `messages` → `message_attachments` → `message_reads` → `notifications` → `settings` → `audit_logs` → `consent_records` → `data_export_requests` → `account_deletion_requests`.

### Codice generato

- **36 model Eloquent nuovi** + `User` aggiornato (ruolo, ulid, soft delete, ~20 relazioni), in `app/Models/` (+ `app/Models/Concerns/HasUlid.php`).
- **26 enum PHP** in `app/Enums/` (UserRole già esistente dal Modulo 1 + 25 nuovi: Gender, ActivityLevel, GoalType, GoalStatus, NoteCategory, LimitationSeverity, LimitationStatus, EquipmentCategory, MuscleBodyRegion, ExerciseLevel, VideoProvider, ExerciseMuscleRole, PlanStatus, PlanVersionStatus, SetType, AssignmentStatus, ScheduledWorkoutStatus, SessionStatus, WellbeingLevel, MeasurementCategory, MeasurementSource, PhotoAngle, ConversationType, NotificationType, ConsentType, GdprRequestStatus).
- **37 factory** (una per model, inclusa `UserFactory` estesa con stati `coach()`/`athlete()`/`inactive()`).
- **6 seeder applicativi**: `UserSeeder` (solo coach), `MuscleGroupSeeder`, `ExerciseCategorySeeder`, `EquipmentSeeder`, `MeasurementTypeSeeder` e `MealTypeSeeder`. Tutti idempotenti e richiamati da `DatabaseSeeder`.

Nessun controller, form request, policy o view aggiunta in questo modulo (esplicitamente fuori perimetro, come richiesto).

### Credenziali iniziali

`UserSeeder` crea il solo coach usando `SEED_COACH_EMAIL` e `SEED_COACH_PASSWORD`; nessuna credenziale è hardcoded. Gli atleti vengono creati dal pannello coach.

### Comandi da eseguire (in un ambiente con PHP 8.3 + Composer)

```bash
composer install
php artisan migrate
php artisan db:seed
```

oppure, in un colpo solo su un DB vuoto: `php artisan migrate --seed`.

### Problemi noti / limiti applicativi documentati (non bug, scelte esplicite)

Vedi DATABASE_DESIGN.md, sezione "Limiti noti e mitigazioni applicative", per il dettaglio. Riepilogo:

1. "Un solo gruppo muscolare `primary` per esercizio": da validare lato applicativo nel modulo "gestione esercizi" (MySQL non supporta indici unique parziali).
2. "Una sola versione `is_current=true` per piano": da garantire lato service di pubblicazione versione, stesso motivo.
3. Unicità delle chiavi `settings` globali (`user_id IS NULL`): da garantire lato applicativo (MySQL non considera due NULL duplicati).
4. `consent_records`/`account_deletion_requests` con `ON DELETE CASCADE` su `user_id`: scelto per semplicità nello scope attuale; da rivalutare (anonimizzazione anziché cancellazione) prima di un lancio con obblighi legali formalizzati.

### Verifica eseguita in questa sessione

Ambiente senza PHP/Composer disponibile (solo Node.js): non è stato possibile eseguire `php artisan migrate`, `php -l` o i test. Verificato invece:

- coerenza incrociata di tutti i riferimenti `App\Enums\*` e `App\Models\*` usati in model/migration/factory/seeder contro i file realmente presenti (nessun riferimento a classi inesistenti);
- controllo automatico di bilanciamento parentesi/graffe su tutti i file PHP di `app/` e `database/` (nessuna anomalia reale; alcuni falsi positivi dovuti ad apostrofi nei commenti in italiano, verificati manualmente uno per uno);
- ordine delle migration e direzione delle foreign key (in particolare la dipendenza reciproca `scheduled_workouts` ↔ `workout_sessions`, risolta in due migration separate).

**Da eseguire obbligatoriamente in un ambiente con PHP 8.3 + Composer prima del primo commit/deploy**: `composer install`, `composer dump-autoload`, `php -l` su tutti i file PHP, `php artisan migrate` su un DB di prova, `php artisan db:seed`, verifica manuale in phpMyAdmin della struttura di 2-3 tabelle chiave (`workout_plan_versions`, `exercises`, `notifications`).

---

## Modulo 1 — Inizializzazione tecnica (storico, invariato)

### Route disponibili

| Metodo | URI | Nome | Note |
|---|---|---|---|
| GET | `/` | `home` | Pagina iniziale temporanea |
| GET | `/up` | — | Health check nativo Laravel |

### Controller disponibili

- `App\Http\Controllers\Controller` — classe base astratta.
- Cartelle predisposte (vuote): `Http/Controllers/Coach`, `Http/Controllers/Athlete`, `Http/Controllers/Admin`, `Http/Controllers/Auth`.

### View disponibili

- `resources/views/layouts/app.blade.php` + componenti (`sidebar`, `topbar`, `notifications-panel`, `bottom-nav`, `app-footer`, `flash-messages`).
- `resources/views/welcome.blade.php`, pagine di errore `errors/{403,404,419,429,500,503}.blade.php`.

### Asset di branding

Logo definitivo installato in `public/assets/images/branding/logo_francoach.webp` e utilizzato in tutte le superfici dell’applicazione. Dettagli invariati rispetto alla consegna precedente.

### Problemi noti e correzioni applicate nella revisione tecnica del Modulo 1

1. **[Critico]** `public/.htaccess` disattivava PHP sull'intera document root → corretto, spostato in `storage/app/public/.htaccess`.
2. **[Critico]** `.htaccess` di root privo di `RewriteCond !^/public/` (rischio loop infinito) → corretto.
3. **[Alto]** `AppServiceProvider` chiamava un metodo `Date::use()` inesistente → rimosso, sostituito con `Carbon::setLocale()`.
4. **[Medio]** `.gitignore` con regole di negazione incomplete per le cartelle vuote di `storage/` → corretto.
5. **[Basso]** Voci di navigazione placeholder con `<a href="#">` invece di `<span>` non interattivo → corretto.
6. **[Basso]** Warning Sass ripetuti in build → silenziati in `vite.config.js`.
