feat(calendar): expand recurring events in GET /calendar and /upcoming

expandRecurringEvents() iterates from the event's original start date,
generating all occurrences within the requested window using the existing
nextOccurrence() service (max 1000 iterations). The SQL query is extended
to also fetch recurring events that started before the window. Event
duration is preserved across instances. Virtual instances carry
is_recurring_instance=1 and are shown with a repeat icon in the agenda
view. /upcoming expands across a 90-day forward window.

Closes BL-01.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Ulas
2026-03-31 10:17:39 +02:00
parent 82e5b2cd85
commit 6a860f2c13
4 changed files with 91 additions and 14 deletions
+2 -2
View File
@@ -8,7 +8,7 @@ Feature-Requests und geplante Erweiterungen. Einträge hier werden **nicht** imp
### BL-01 — Kalender: Wiederkehrende Events werden nicht expandiert
**Status:** Offen
**Status:** Erledigt (v0.3.0)
**Aufwand:** M (35 Tage)
Das Datenmodell speichert `recurrence_rule` (iCal RRULE) für Kalender-Events. Der `recurrence.js`-Service mit `nextOccurrence()` existiert und wird in Tasks genutzt. Im Kalender-Route (`server/routes/calendar.js`) fehlt jedoch die Expansion: Beim Abruf der Events werden Wiederholungsinstanzen nicht generiert. Wiederkehrende Termine erscheinen daher nur einmal (beim Originaldatum).
@@ -84,7 +84,7 @@ Das Budget-Formular hat eine „Wiederkehrend"-Checkbox und speichert `is_recurr
### BL-06 — Shopping: Schnell-Add Autocomplete von lokalem Verlauf
**Status:** In Arbeit (API-seitig implementiert, UI prüfen)
**Status:** Erledigt (bereits vollständig implementiert)
**Aufwand:** XS
`shopping.js` ruft `/api/v1/shopping/suggestions?q=...` auf. Prüfen ob der API-Endpunkt auf Server-Seite existiert und korrekt auf die `shopping_items`-Historie zugreift. Falls ja, Status auf „Fertig" setzen.