Fix recurring event duplication - handle recurringEventId properly in all phases

This commit is contained in:
root
2025-10-23 18:46:49 +00:00
parent da2b9960b0
commit db1206f91c
2 changed files with 51 additions and 24 deletions

View File

@@ -255,6 +255,42 @@ Cron-Step für regelmäßige Ausführung.
- Recurring-Events: Begrenzte Unterstützung; Advoware hat keine RRULE.
- Timestamps: Fehlende in Google können zu Fallback führen.
- Performance: Bei vielen Terminen könnte Paginierung helfen.
- **Single Events Expansion**: `singleEvents=true` in `fetch_google_events()` expandiert wiederkehrende Events in einzelne Instanzen, was zu Duplizierungsproblemen führt, wenn nicht korrekt behandelt.
## Kritischer Bugfix: Duplizierung wiederkehrender Termine
### Problemstellung
Bei wiederkehrenden Terminen (`dauertermin=1`) wurden Termine bei jedem Sync dupliziert, weil `fetch_google_events()` mit `singleEvents=true` arbeitet:
1. **Google Calendar erstellt Master-Event** mit RRULE und `event_id` (z.B. `"abc123"`)
2. **`fetch_google_events()` expandiert** das Event in einzelne Instanzen mit IDs wie `"abc123_20251024"`, `"abc123_20251031"`, etc.
3. **Jede Instanz wird als "neu" behandelt** und erstellt einen separaten Advoware-Termin
4. **Ergebnis:** 1 wiederkehrender Advoware-Termin → N duplizierte Advoware-Termine
### Lösung
**RecurringEventId-basierte Erkennung** in allen Phasen:
- **DB-Indizes:** Verwenden weiterhin die gespeicherten `event_id` (Master-ID)
- **Phase 2:** Prüfe sowohl `event_id` als auch `recurringEventId` gegen DB-Index
- **Phase 3:** Berücksichtige `recurringEventId` bei Existenzprüfungen
- **Phase 4:** Verarbeite nur Master-Events einmal, nicht jede Instanz
**Code-Änderungen:**
```python
# Phase 2: Prüfe Master-Event
recurring_master_id = evt.get('recurringEventId')
is_already_synced = event_id in db_google_index or (recurring_master_id and recurring_master_id in db_google_index)
# Phase 4: Verarbeite nur Master-Events einmal
master_event_id = google_data.get('recurringEventId') or event_id
if master_event_id in processed_master_events:
continue
```
### Auswirkung
- Wiederkehrende Termine werden nicht mehr dupliziert
- Bidirektionale Sync funktioniert korrekt für alle Event-Typen
- Performance-Verbesserung durch weniger redundante Verarbeitung
## Korrekter Umgang mit Advoware-Timestamps