# Regole di accesso atleta

`AthleteAccessService` è l’unica fonte decisionale. Il risultato contiene `access_allowed`, motivo, stato, inizio, scadenza, giorni residui, fine tolleranza e azione successiva.

L’accesso è consentito soltanto quando:

- ruolo `athlete`;
- account abilitato e non sospeso/disabilitato;
- e-mail attivata;
- sottoscrizione corrente presente;
- `allow_login=true`;
- stato non sospeso, annullato o rinnovato;
- data odierna compresa tra inizio e scadenza, oppure nel grace period.

La scadenza è inclusiva. Con scadenza 30 settembre e tolleranza 3 giorni, l’ultimo giorno consentito è 3 ottobre.

`EnsureAthleteSubscriptionIsValid` protegge tutte le route `/athlete/*`. Al rifiuto registra un audit giornaliero deduplicato, esegue logout, invalida la sessione e reindirizza alla pagina pubblica priva di dati applicativi.

| Caso | Accesso | Stato |
|---|---:|---|
| prima dell’inizio | no | scheduled |
| valido | sì | active/expiring |
| grace period | sì | grace_period |
| oltre tolleranza | no | expired |
| sospeso | no | suspended |
| invito non accettato | no | pending_activation |
| periodo assente/annullato | no | expired/cancelled |

Emergenza: il coach può sospendere immediatamente; per ripristinare usa riattivazione. Se il periodo è terminato deve indicare una nuova scadenza. Non correggere lo stato direttamente nel database salvo recovery documentata.
