From 2bf37b8616aff75817890f42f014bd0bf8791640 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 24 Oct 2025 19:48:12 +0000 Subject: [PATCH] =?UTF-8?q?Fix:=20Korrekte=20Endzeiten=20f=C3=BCr=20recurr?= =?UTF-8?q?ing=20Events?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - parse_times erkennt jetzt recurring Events (dauertermin=1 + turnus/turnusArt > 0) - Für recurring Events wird das Ende aus dem gleichen Tag wie Start berechnet - datumBis wird nur noch für die RRULE-Serie verwendet, nicht für jeden Termin - Fix für Termin 84389: Statt 15-Tage-Terminen jetzt korrekte 30-Minuten-Termine --- .../advoware_cal_sync/calendar_sync_event_step.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/bitbylaw/steps/advoware_cal_sync/calendar_sync_event_step.py b/bitbylaw/steps/advoware_cal_sync/calendar_sync_event_step.py index c7301362..28ad1fe7 100644 --- a/bitbylaw/steps/advoware_cal_sync/calendar_sync_event_step.py +++ b/bitbylaw/steps/advoware_cal_sync/calendar_sync_event_step.py @@ -233,8 +233,17 @@ def parse_times(data, source): start_time = data.get('uhrzeitVon') or '09:00:00' start_dt = BERLIN_TZ.localize(datetime.datetime.fromisoformat(f"{start_str}T{start_time}")) - # Use datumBis for end date if available, otherwise datum - end_date_str = data.get('datumBis', data.get('datum', '')) + # Check if this is a recurring event + is_recurring = (data.get('dauertermin', 0) == 1 and + (data.get('turnus', 0) > 0 or data.get('turnusArt', 0) > 0)) + + if is_recurring: + # For recurring events, end date is same as start date (each instance ends on same day) + end_date_str = data.get('datum', '') + else: + # Use datumBis for end date if available, otherwise datum + end_date_str = data.get('datumBis', data.get('datum', '')) + if 'T' in end_date_str: base_end_date = end_date_str.split('T')[0] else: