# Configuration Google Calendar

Créer deux projets Google Cloud séparés pour DEV et PROD, puis activer **Google Calendar API**. Dans Google Auth Platform, renseigner le branding, la page d’accueil, la politique de confidentialité et choisir une audience `Internal` ou `External`. En mode test, déclarer explicitement les comptes autorisés.

Créer un client OAuth 2.0 de type **Application Web** et déclarer exactement l’URI configurée dans `GOOGLE_REDIRECT_URI`. Activer les scopes `openid`, `email`, `calendar.calendarlist.readonly` et `calendar.events`. Ajouter `calendar.freebusy` uniquement si la vérification temps réel est activée.

Configurer les secrets sans les committer :

```dotenv
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GOOGLE_REDIRECT_URI=https://capsule.example/calendar/google/callback
GOOGLE_CALENDAR_WEBHOOK_URL=https://capsule.example/webhooks/google/calendar
CALENDAR_TOKEN_ENCRYPTION_KEY=
GOOGLE_CALENDAR_ALLOWED_SCOPES="openid email https://www.googleapis.com/auth/calendar.calendarlist.readonly https://www.googleapis.com/auth/calendar.events"
GOOGLE_CALENDAR_FREEBUSY_ENABLED=0
```

En production, stocker ces valeurs dans Symfony Secrets. La clé de chiffrement doit être stable, distincte par environnement et sauvegardée : sa perte rend les jetons illisibles.

Pour le calendrier société, créer un calendrier partagé dans Google, donner au compte OAuth le rôle propriétaire ou éditeur, puis ouvrir `/calendar/google/company`. Chaque salarié connecte séparément son compte depuis `/calendar/google`.

Le webhook doit être public en HTTPS. Vérifier qu’il répond `204`, que Messenger consomme la file et que les commandes périodiques sont exécutées :

```cron
*/10 * * * * php /app/bin/console app:calendar:google:sync
15 * * * * php /app/bin/console app:calendar:google:check-connections
30 2 * * * php /app/bin/console app:calendar:google:renew-watches
```

Ne pas copier ces exemples automatiquement dans le cron serveur.

Diagnostic : `redirect_uri_mismatch` indique une URI différente dans Google Cloud ; `invalid_grant` demande généralement une reconnexion ; un `403` signale un scope, un rôle ou un quota insuffisant ; un `410` entraîne automatiquement une synchronisation complète contrôlée. Passer l’application de Testing à Production et préparer la vérification Google si l’audience ou les scopes l’exigent.
