From 99170807b4e7494da2ef95f10b83f3d3c187a0b6 Mon Sep 17 00:00:00 2001
From: Peter Thienel <thienel@data-quest.de>
Date: Fri, 15 Mar 2024 19:49:19 +0100
Subject: [PATCH] removes duplicated events from calendar views, fixes #3795

---
 .../calendar/CalendarDateAssignment.class.php    | 16 ++++++----------
 1 file changed, 6 insertions(+), 10 deletions(-)

diff --git a/lib/models/calendar/CalendarDateAssignment.class.php b/lib/models/calendar/CalendarDateAssignment.class.php
index 6caae9e9c85..da4761d426a 100644
--- a/lib/models/calendar/CalendarDateAssignment.class.php
+++ b/lib/models/calendar/CalendarDateAssignment.class.php
@@ -217,9 +217,6 @@ class CalendarDateAssignment extends SimpleORMap implements Event
         bool $with_declined = false
     ) : array
     {
-        $begin->setTime(0, 0);
-        $end->setTime(23, 59, 59);
-
         $sql = "JOIN `calendar_dates`
             ON calendar_date_id = `calendar_dates`.`id`
             WHERE
@@ -256,11 +253,8 @@ class CalendarDateAssignment extends SimpleORMap implements Event
                 $e_end = clone $event->getEnd();
                 $e_expire = $event->getExpire();
 
-                // duration in full days
-                $duration = $event->getDurationDays();
-
                 $cal_start = DateTimeImmutable::createFromMutable($m_start);
-                $cal_end = DateTimeImmutable::createFromMutable($m_start)->setTime(23,59,59);
+                $cal_end = DateTimeImmutable::createFromMutable($m_start);
                 $cal_noon = $cal_start->setTime(12, 0);
                 // single events or first event
                 if (
@@ -270,11 +264,13 @@ class CalendarDateAssignment extends SimpleORMap implements Event
                     || ($e_end > $cal_start && $e_start <= $cal_end)
                 ) {
                     // exception for first event or single event
-                    if (!$event->calendar_date->exceptions->findOneBy('date', $cal_start->format('Y-m-d'))) {
-                        $events_created = array_merge($events_created, self::createRecurrentDate($event, $cal_noon));
+                    if (!$event->calendar_date->exceptions->findOneBy('date', $cal_start->format('Y-m-d'))
+                        && !isset($events_created[$event->calendar_date->id])
+                        && !$event->calendar_date->repetition_type) {
+                            $events_created[$event->calendar_date->id] = $event;
                     }
                 } elseif ($e_expire > $cal_start) {
-                    $events_created = array_merge($events_created, self::getRepetition($event, $cal_noon));
+                    $events_created = array_merge($events_created, self::getRepetition($event, $cal_noon, true));
                 }
             }
 
-- 
GitLab