FriendsOfREDAXO / forcal

Kalender- / Newsverwaltung für REDAXO. Mehrsprachig, Beliebig definierbare Eingabefelder
MIT License
20 stars 4 forks source link

Termine werden nicht ausgelesen weil Datumsprüfung in der Query-Erstellung falsch ist #30

Closed iceman-fx closed 2 weeks ago

iceman-fx commented 2 years ago

In der aktuelle forCal scheint die Erstellung des Querys zur Abfrage der Termine falsch zu sein. Wenn ein repeat-Termin mit Beginn am gleichen Tag wie der Beginn des Auslesens der Termine erstellt wird, dann wird dieser nicht ausgegeben, obwohl dieser innerhalb des gewünschten Start-End-Zeitfensters liegt.

Bsp: Terminbereich: Start: 22.09.2022 Ende: 30.04.2023

repeat-Termin: 22.09.2022 - 22.09.2022 Wiederholung: monatlich jeden 1. Monat Enddatum: 22.04.2023

Termin wird erst im Oktober angezeigt, jedoch nicht bei den Septemberterminen, was er aber müsste.

UPDATE 1: betrifft übrigens auch nicht wiederkehrende Termin, wenn Sie das Datum von heute (22.09.2022) haben.

UPDATE 2: setzt man das Datum des Termins auf den 23.09.2022 - 23.09.2022, dann wird er heute mit angezeigt. Irgendwo ist da der Wurm drin.

UPDATE 3: Ich vermute, dass die MySQL-Abfrage nicht greifen kann, weil z.B. auf ...BETWEEN '2022-09-22 13:57:55' AND '2022-09-30 23:59:59')... geprüft wird, aber in der DB nur das Datumsformat hinterlegt ist '2022-09-2022'. Ändert man es nämlich auf ...BETWEEN '2022-09-22' AND '2022-09-30')... werden alle Einträge korrekt ausgegeben.

UPDATE 4: In der Funktion decorateEntryRepeats in der Datei https://github.com/FriendsOfREDAXO/forcal/blob/main/lib/forcal/Handler/forcalHandler.php wird das Vergleichsdatum falsch gesetzt, wodurch bei sich wiederholenden Terminen z.B. das Termin-Startdatum älter ist als das aktuelle Startdatum der Eingrenzung ($startSearchDate).

Bsp: Termin-Startdatum ist: 2022-09-22 00:00:00.0 Wird aber in forCalDateTimeHelper::isDateRangeBetweenDateRange verglichen mit: 2022-09-22 14:37:04.0 -> Ergebnis = false

Entweder müsste in der DB auch die Zeit beim Datum mit gespeichert werden oder die Prüfung müsste sich auf den korrekten Tagesbeginn ab 0:00 Uhr beziehen, da sonst ein sich wiederholender Termin am gleichen Tag nicht angezeigt wird.

skerbis commented 2 years ago

Ich hätte gerne einen Beispielcode Deiner Abfrage

iceman-fx commented 2 years ago

Hier der Code:

$now = time();
$start = date('Y-m-d H:i:s', $now);
$end = date('Y-m-d H:i:s', strtotime(date('Y-m-d', strtotime('first day of +1 month', $now))) - 1);

$items = \forCal\Handler\forCalHandler::getEntries($start, $end, false, 'SORT_ASC', $category, $location);      //3.Param = offline-Termine ausgeben (true|false)
dump($items);

Die Ausgaben sehen dann so aus: start > 2022-09-23 07:27:14 end > 2022-09-30 23:59:59

array:3 [ 0 => array:4 [ "id" => "2" "sort_key" => "20220914131500" "date" => {#221} "entry" => {#222} ] 1 => array:4 [ "id" => "1" "sort_key" => "20220922000000" "date" => {#228} "entry" => {#229} ] 2 => array:4 [ "id" => "4" "sort_key" => "20220922000000" "date" => {#235} "entry" => {#236} ] ]

Im Kalender sind dazu aber 5 Termine angelegt, welche in diesen Zeitraum passen würden:

1

Es fehlen demnach die Termine, welche nur an einem Tag stattfinden (23.09.20022).

skerbis commented 2 years ago

Was passiert wenn du $start = date('Y-m-d H:i:s', $now); mal auf 0 Uhr stellst?

iceman-fx commented 2 years ago

Dann klappt es. Allerdings werden dann Termine angezeigt, welche am Tag bereits gelaufen sind. Das kann u.U. schon mal sehr viel sein, wenn es Termine einer ganzen Stadt sind.

Das Problem ist halt in Eurer Prüfung, welche immer die Zeit mit einbezieht, aber in der DB halt nur das Datum gespeichert wird (ohne Zeit). Damit greift dann die Abfrage/Prüfung nicht mehr korrekt für ganztägige Termine, welche ab 00:00:00 Uhr beginnen.

skerbis commented 2 years ago

Ich sehe das nun nicht wirklich als Bug an aber verstehe das Problem. Danke für den Hinweis. @joachimdoerr und ich werden uns beraten. Gerne kannst du aber auch einen PR einreichen.

iceman-fx commented 2 years ago

Als Anmerkung noch... Das Problem wird jeder haben, wenn er sich an die Doku/Hilfe hält, da dort der Startwert immer mit H:i:s angegeben ist.

skerbis commented 2 years ago

Die Doku ist schon alt .. ich komme aber nicht dazu sie zu bearbeiten. Hilfe ist jederzeit gern gesehen.