# Architecture du calendrier Capsule

Le calendrier central reste implémenté dans `CommercialBundle/Calendar`. Aucun bundle Agenda ou Google séparé n'est utilisé.

## Sources de vérité

- `calendar_internal` décrit un calendrier Capsule `company` ou `employee`.
- `calendar_event` contient les rendez-vous, événements société et blocs de temps.
- Les tâches restent dans ProjetBundle, RoutineBundle et ProspectionBundle. Elles sont exposées par des services tagués `calendar.item_provider` et ne sont jamais copiées.
- Un bloc de temps est un événement autonome qui conserve `source_task_type` et `source_task_token`. Sa suppression ne supprime pas la tâche.
- `calendar_source` reste une ressource Google externe et peut pointer vers son calendrier Capsule avec `local_calendar_id`.

Toutes les recherches HTTP utilisent la société fournie par `CurrentCompanyProvider`. Les tokens publics ne sont jamais suffisants : le repository vérifie également la société active.

## Reprise

```bash
php bin/console app:calendar:ensure-employee-calendars --dry-run
php bin/console app:calendar:ensure-employee-calendars
php bin/console app:calendar:backfill-event-calendars --dry-run
php bin/console app:calendar:backfill-event-calendars
```

Les deux commandes sont idempotentes. La sauvegarde d'un salarié par `AdminUserManager` synchronise ensuite automatiquement son calendrier et archive celui-ci lorsque le salarié devient inactif.

Les dates horaires nouvelles sont converties en UTC. Le fuseau saisi est conservé dans `time_zone`. Les dates de fin des événements sur la journée restent exclusives.
