Fix recurring event duplication - handle recurringEventId properly in all phases
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user