# Migrazione atleti esistenti

La procedura preserva ID utente e associazioni esistenti. Non crea profili duplicati, non modifica allenamenti, misurazioni, foto, piani o nutrizione e non inventa scadenze.

## Preparazione

1. Creare backup database e file.
2. Mettere l’app in manutenzione.
3. Eseguire le migration.
4. Stabilire con il coach la scadenza iniziale reale.

```bash
php artisan migrate --force
php artisan athletes:migrate-existing-subscriptions \
  --starts=YYYY-MM-DD \
  --expires=YYYY-MM-DD \
  --grace=0 \
  --dry-run
```

In alternativa impostare `EXISTING_ATHLETE_ACCESS_END=YYYY-MM-DD`. Senza `--expires` o variabile ambiente il comando fallisce.

Il report JSON privato in `storage/app/migration-reports` elenca atleti, periodi già presenti, record da creare e conteggi delle relazioni. Verificarlo prima dell’esecuzione reale:

```bash
php artisan athletes:migrate-existing-subscriptions \
  --starts=YYYY-MM-DD \
  --expires=YYYY-MM-DD \
  --grace=3
```

Il comando crea soltanto periodi mancanti ed è rieseguibile. Dopo:

```bash
php artisan subscriptions:process-expirations
php artisan test
php artisan optimize:clear
```

Controllare profilo, scheda, calendario, diario, progressi, foto, nutrizione, notifiche, report e audit per ogni atleta migrato. Conservare report e backup fuori dalla document root. In caso di anomalia ripristinare il backup; non cancellare manualmente storico o foreign key.
