# FranCoach — Notifiche e cron

## Comando manuale

Esecuzione completa:

```bash
php artisan notifications:send-reminders
```

Esecuzione selettiva:

```bash
php artisan notifications:send-reminders --type=today
php artisan notifications:send-reminders --type=incomplete
php artisan notifications:send-reminders --type=weight --type=photo
php artisan notifications:send-reminders --type=message
```

Tipi ammessi: `today`, `incomplete`, `weight`, `photo`, `message`.

Ogni esecuzione scrive il riepilogo nel log Laravel. Le esecuzioni pianificate appendono inoltre l’output a:

```text
storage/logs/notifications-scheduler.log
```

## Scheduler configurato

Timezone: `Europe/Rome`.

| Orario | Attività |
|---|---|
| 07:00 ogni giorno | Allenamento del giorno |
| 08:00 ogni giorno | Verifica scadenza peso e fotografia |
| 21:30 ogni giorno | Sessioni precedenti non completate |
| Ogni ora | Messaggi non letti |

Le frequenze peso e fotografia sono lette dalle impostazioni coach. Il controllo giornaliero crea la notifica solo quando la frequenza configurata è scaduta.

## Cron cPanel

Configurare un solo cron ogni minuto:

```cron
* * * * * /usr/local/bin/php /home/UTENTE/francoach/artisan schedule:run >> /home/UTENTE/francoach/storage/logs/scheduler-cron.log 2>&1
```

Adattare il percorso di PHP e la directory assoluta del progetto ai valori indicati dal provider.

Non serve un worker permanente. La coda resta `sync`.

## Prevenzione duplicati

Ogni promemoria usa una chiave univoca composta da destinatario, evento e periodo. Ripetere il comando non genera duplicati. Lo scheduler usa anche `withoutOverlapping`.

## Verifica

```bash
php artisan schedule:list
php artisan notifications:send-reminders --type=today
tail -n 100 storage/logs/notifications-scheduler.log
```

Verificare:

- permesso di scrittura su `storage/logs`;
- timezone applicativa `Europe/Rome`;
- cron eseguito dall’utente corretto;
- percorso PHP CLI compatibile con il progetto;
- impostazioni promemoria non configurate su `off`.

## Notifiche browser/PWA

Il centro notifiche permette l’attivazione facoltativa della Notification API del browser. Il permesso viene richiesto solo dopo un’azione esplicita dell’utente.

Questa modalità:

- richiede HTTPS e service worker;
- funziona quando l’app è aperta o installata come PWA;
- non richiede chiavi push o servizi esterni;
- non sostituisce il centro notifiche interno;
- può essere negata o non supportata senza compromettere l’applicazione.

Non è implementato un servizio push remoto in background.

## Polling nell’app

Quando una pagina autenticata è aperta, il frontend interroga `notifications/browser/poll` ogni 60 secondi. La risposta è limitata all’utente autenticato e aggiorna:

- contatore delle notifiche non lette;
- pannello notifiche;
- eventuale notifica browser, se il permesso è già stato concesso.

Il polling è indipendente dal cron e si interrompe quando l’app non è aperta. Non sostituisce un servizio push remoto.
