# Kalender Auto-Synchronisation

## Übersicht

Das System unterstützt **automatische Synchronisation** von Kursänderungen zu konfigurierten Kalender-Diensten. Die Synchronisation erfolgt asynchron über **Symfony Messenger** im Hintergrund.

## Funktionen

### Auto-Sync wird ausgelöst bei:

1. **Kurs-Änderungen**:
   - Neuer Kurs erstellt
   - Kurs aktualisiert (Name, Zeit, Standort, etc.)
   - Kurs aktiviert/deaktiviert

2. **Teilnehmer-Änderungen**:
   - Neuer Teilnehmer bucht
   - Teilnehmer storniert
   - Teilnehmer-Details ändern sich

## Aktivierung

### Im Admin-Interface:

1. Navigieren Sie zu **Admin → Universal Kalender**
2. Konfigurieren Sie mindestens eine Kalender-Verbindung (Microsoft/Google/CalDAV/iCal)
3. Aktivieren Sie den **Auto-Sync Toggle** oben rechts
4. ✅ Fertig! Alle Kurs-Änderungen werden nun automatisch synchronisiert

### Status:

- 🟢 **Auto-Sync aktiviert**: Toggle ist grün, Änderungen werden automatisch synchronisiert
- ⚫ **Auto-Sync deaktiviert**: Toggle ist grau, nur manuelle Synchronisation möglich

## Technische Details

### Architektur:

```
Kurs-Änderung → Doctrine Event → Message Dispatch → Queue → Worker → Sync API
```

1. **Doctrine Event Listener** (`CalendarAutoSyncListener`):
   - Hört auf `postUpdate`, `postPersist`, `postRemove` Events
   - Prüft ob Auto-Sync aktiviert ist
   - Dispatcht `SyncCourseToCalendarMessage` für jeden konfigurierten Kalender

2. **Message** (`SyncCourseToCalendarMessage`):
   - Enthält Kurs-ID, Aktion, Provider und Credentials
   - Wird in die Messenger-Queue eingereiht

3. **Message Handler** (`SyncCourseToCalendarMessageHandler`):
   - Verarbeitet Messages asynchron
   - Lädt Kurs aus Datenbank
   - Ruft `UniversalCalendarService` auf
   - Loggt Erfolg/Fehler

### Messenger Worker starten:

**Windows (PowerShell):**
```powershell
php bin/console messenger:consume async -vv
```

**Linux/Mac:**
```bash
php bin/console messenger:consume async -vv
```

**Als Systemdienst (Linux/systemd):**
```bash
# Datei: /etc/systemd/system/messenger-worker.service
[Unit]
Description=Symfony Messenger Worker
After=network.target

[Service]
Type=simple
User=www-data
WorkingDirectory=/path/to/project
ExecStart=/usr/bin/php bin/console messenger:consume async --time-limit=3600
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
```

Dann aktivieren:
```bash
sudo systemctl enable messenger-worker
sudo systemctl start messenger-worker
sudo systemctl status messenger-worker
```

### Konfiguration

In `config/packages/messenger.yaml`:

```yaml
framework:
    messenger:
        transports:
            async:
                dsn: '%env(MESSENGER_TRANSPORT_DSN)%'
                options:
                    use_notify: true
                    check_delayed_interval: 60000
                retry_strategy:
                    max_retries: 3
                    delay: 1000
                    multiplier: 2
                    max_delay: 0

        routing:
            'App\Message\SyncCourseToCalendarMessage': async
```

In `.env`:
```
MESSENGER_TRANSPORT_DSN=doctrine://default
```

## Vorteile

✅ **Keine Verzögerungen**: Benutzer warten nicht auf Sync-Operationen  
✅ **Automatisch**: Keine manuellen Sync-Aktionen notwendig  
✅ **Zuverlässig**: Retry-Mechanismus bei Fehlern  
✅ **Skalierbar**: Mehrere Worker können parallel laufen  
✅ **Transparent**: Alle Sync-Operationen werden geloggt  

## Fehlerbehebung

### Problem: Auto-Sync funktioniert nicht

**Lösung 1**: Prüfen Sie ob der Messenger Worker läuft
```bash
ps aux | grep messenger:consume
```

**Lösung 2**: Prüfen Sie die Logs
```bash
tail -f var/log/dev.log | grep -i "sync"
```

**Lösung 3**: Prüfen Sie die Queue
```bash
php bin/console messenger:stats
```

### Problem: Messages werden nicht verarbeitet

**Lösung**: Starten Sie den Worker neu
```bash
php bin/console messenger:stop-workers
php bin/console messenger:consume async -vv
```

### Problem: Zu viele Failed Messages

**Lösung**: Failed Messages anzeigen und neu versuchen
```bash
# Anzeigen
php bin/console messenger:failed:show

# Erneut versuchen
php bin/console messenger:failed:retry
```

## Deaktivierung

Um Auto-Sync zu deaktivieren:

1. **Temporär**: Toggle im Admin-Interface ausschalten
2. **Permanent**: Event Listener in `config/services.yaml` deaktivieren:

```yaml
services:
    App\EventListener\CalendarAutoSyncListener:
        enabled: false
```

## Best Practices

1. **Testen Sie zuerst manuell**: Synchronisieren Sie einzelne Kurse manuell bevor Sie Auto-Sync aktivieren
2. **Überwachen Sie die Logs**: Prüfen Sie regelmäßig die Sync-Logs
3. **Worker-Überwachung**: Stellen Sie sicher, dass der Worker immer läuft (systemd, supervisor, etc.)
4. **Backup**: Konfigurieren Sie nur vertrauenswürdige Kalender-Accounts

## Support

Bei Problemen prüfen Sie:
- Messenger Worker Status
- Log-Dateien (`var/log/dev.log`)
- Kalender-Verbindungen (im Admin-Interface)
- Internet-Verbindung zu Kalender-APIs

