# FranCoach

MVP Laravel per la gestione dei percorsi tra FranCoach e più atleti.

## Stato release

Release candidate `0.1.0-rc.1` con aggiornamenti non ancora rilasciati del 28 luglio 2026, pronta per il collaudo finale su hosting Apache. La verifica corrente è di **154 test e 975 asserzioni**, **211 route** e **66 migration**. I test automatizzati coprono autenticazione, ruoli, dashboard, profilo, esercizi e video, schede settimanali, calendario ripetuto, sessioni, dropset, media privati, diario, nutrizione, progressi, fotografie, notifiche, report, impostazioni, privacy, sicurezza e backup.

La messaggistica dispone dello schema dati ma non di interfaccia, controller e route: resta una non conformità nota del collaudo, non una funzione dichiarata completa.

## Requisiti

- PHP `>= 8.3` con estensioni richieste da Composer, `zip`, `fileinfo`, `mbstring`, `openssl`, `pdo_mysql`;
- MySQL 8 o MariaDB compatibile;
- Apache 2.4 con `mod_rewrite` e `mod_headers`;
- Composer 2;
- Node.js/npm solo per compilare gli asset;
- `mysqldump` per il backup MySQL/MariaDB;
- HTTPS in produzione.

## Installazione locale

```bash
composer install
cp .env.example .env
php artisan key:generate
php artisan migrate --seed
npm ci
npm run build
php artisan storage:link
php artisan serve
```

Impostare in `.env` credenziali forti per `SEED_COACH_*` prima del seed. Gli atleti vengono creati dal pannello coach. Non versionare `.env`.

## Comandi operativi

```bash
php artisan test
php artisan migrate --force
php artisan db:seed --force
php artisan optimize
php artisan optimize:clear
php artisan schedule:list
php artisan notifications:send-reminders
php artisan subscriptions:process-expirations
php artisan athletes:migrate-existing-subscriptions --expires=YYYY-MM-DD --dry-run
php artisan francoach:import-exercises-dataset --source=/percorso/dataset --dry-run
php artisan francoach:demo create --athlete=atleta@example.com
php artisan francoach:demo clear
php artisan francoach:backup
php artisan francoach:backup --verify=nome-backup.zip --deep
```

Il cron esegue `php artisan schedule:run` ogni minuto. Non è richiesto un worker permanente.

## Storage

- file pubblici controllati: `storage/app/public`;
- fotografie e dati privati: `storage/app/private`;
- backup: `storage/app/private/backups`, mai sotto la document root.

Se il provider non consente symlink, configurare `PUBLIC_STORAGE_PATH` e `PUBLIC_STORAGE_URL` come descritto nella guida Apache.

## Documentazione release

- [IMPLEMENTATION_STATUS_2026-07-28.md](IMPLEMENTATION_STATUS_2026-07-28.md)
- [DEPLOYMENT_APACHE.md](DEPLOYMENT_APACHE.md)
- [BACKUP_RESTORE.md](BACKUP_RESTORE.md)
- [FINAL_TEST_PLAN.md](FINAL_TEST_PLAN.md)
- [RELEASE_CHECKLIST.md](RELEASE_CHECKLIST.md)
- [POST_DEPLOY_CHECKLIST.md](POST_DEPLOY_CHECKLIST.md)
- [CONFIGURATION_CREDENTIALS.md](CONFIGURATION_CREDENTIALS.md)
- [ROUTES.md](ROUTES.md)
- [SECURITY_CHECKLIST.md](SECURITY_CHECKLIST.md)
- [PRIVACY_IMPLEMENTATION.md](PRIVACY_IMPLEMENTATION.md)
- [PROJECT_STATE.md](PROJECT_STATE.md)
- [MULTI_ATHLETE_IMPLEMENTATION.md](MULTI_ATHLETE_IMPLEMENTATION.md)
- [ATHLETE_INVITATION_FLOW.md](ATHLETE_INVITATION_FLOW.md)
- [SUBSCRIPTION_ACCESS_RULES.md](SUBSCRIPTION_ACCESS_RULES.md)
- [SUBSCRIPTION_REMINDERS.md](SUBSCRIPTION_REMINDERS.md)
- [CRON_CONFIGURATION.md](CRON_CONFIGURATION.md)
- [ATHLETE_MIGRATION_GUIDE.md](ATHLETE_MIGRATION_GUIDE.md)

Lo schema SQL opzionale senza dati utente è in `database/schema/mysql-schema.sql`.

## Note legali

Le pagine privacy e termini sono bozze tecniche. Prima della pubblicazione è obbligatoria una revisione legale professionale, in particolare per il trattamento di dati personali, corporei e potenzialmente relativi alla salute.
