markocupic / calendar-event-booking-bundle

Contao 4 Extension
13 stars 7 forks source link

Kurzfristige Abmeldungszeiträume #18

Closed philvdb closed 4 years ago

philvdb commented 4 years ago

Hallo @markocupic und vielen Dank für deine Erweiterung!

Wir nutzen sie für ein Fitnessstudio, das seine Kurse darüber buchen lässt. Allerdings ist es für uns ein Problem, dass Abmeldungen hard coded nur in Tagen vor Mitternacht des Starts des Events angegeben werden können.

In unserem Fall wäre eine Stunde vor Start des Events sinnvoll und wünschenswert.

Meine Frage ist, ob du grundsätzlich für pull requests in diese Richtung offen bist oder ob wir einfach einen privaten Fork deiner Erweiterung dafür machen sollen? Ich denke letztlich wird es auf ein simples Datim-Feld hinauslaufen mit sanity checks im save_callback(), à la keine Abmeldung nachdem das Event vorbei ist. (Nach Start des Events kann man ja vielleicht noch use cases dafür finden.)

Nachdem die Abmeldefrist bisher in Tagen angegeben wird, wäre es ja je nach Ausgestaltung ein BC break, deshalb würde ich verstehen wenn du das ablehnst, dann forken wir.

markocupic commented 4 years ago

Hallo @philvdb Bitte, bitte. Evtl. Gäbe es noch den Mittelweg. Ich baue kein neues Feld ein, dafür an geeigneter Stelle einen Hook, der allfällige zusätzliche Felder, die du in in der dcaconfig definierst, auswertet.

So liesse sich der BC Break vermeiden. Wo genau man den Hook placiert, habe ich jetzt noch nicht näher angeschaut.

Was meinst du?

Liebe Grüsse

Marko

philvdb commented 4 years ago

Cool, freut mich dass wir keinen unabhängigen Fork machen müssen!

Ehrlich gesagt habe ich aber weiterhin das Gefühl, dass es langfristig weniger Kopfschmerzen machen würde, das (Datenbank-)Feld statt mit einer Ganzzahl von Tagen doch mit einem timestamp zu belegen. Der könnte natürlich auch gerne von einem save_callback im DCA dynamisch befüllt werden, sodass man (im Backend) auch weiterhin eine Zahl in Tagen angeben kann, die dann einfach zu einem Timestamp umgerechnet wird.

Dann bräuchte man in unserem Fall nur das DCA zu manipulieren und fertig.

Durch die Änderung der Bedeutung des Datenbankfelds bräuchte man aber natürlich eine Migration - oder man lebt etwas schmutziger und fügt klammheimlich eine if-Abfrage ein:

if ($this->objEvent->unsubscribeLimit < 1000)
{
  // als Tage interpretieren
}
else
{
  // als timestamp interpretieren
}

Ich weiß, ich fühle mich dabei auch schmutzig, aber es würde mMn nur versagen, wenn jemand als unsubscribeLimit irgendwas zwischen dem 1.1.1970 0:00 Uhr und 1.1.1970 0:17 Uhr angibt, was ja für Events in der Zukunft mal gar keinen Sinn macht (und beim Speichern eigentlich auch verhindert werden sollte?). So könnte man bestehende Einträge auch "klammheimlich" auf timestamps upgraden.

Man muss dabei beachten, dass das aktuelle unsubscribeLimit natürlich immer relativ ist und wenn jemand die Startzeit des Events verschiebt, verschiebt sich auch das Limit - das müsste man ebenfalls z. B. im Callback berücksichtigen.

Wenn das was ist womit du leben kannst mache ich dir einen PR dazu.

Ansonsten bin ich auch offen für einen Hook - worauf es uns ankommt wäre eben, das unsubscribeLimit fassen zu können, idealerweise als timestamp.

philvdb commented 4 years ago

Okay, jetzt wo ich tatsächlich im Code angefangen habe denke ich man kann es auch ohne die unschöne Überladung des Tabellenfelds lösen. Einfach ein neues Feld namens unsubscribeLimitTstamp, das ein w50 direkt neben dem bestehenden Feld ist, default NULL aber wenn gesetzt, dann hat es Vorrang vor unsubscribeLimit (entsprechend im Label erklärt).

Man kann auch im save_callback die Sicherheitsfunktion einführen, dass wenn in unsubscribeLimit eine Anzahl !=0 gesetzt ist und aber trotzdem in unsubscribeLimitTstamp auch ein Zeitpunkt, dass man dann einen Fehler wirft und darauf aufmerksam macht, dass nicht beides gelten kann (Tage vor Event und fester Zeitpunkt).

Aber das wäre logischerweise komplett ohne BC break, es braucht nur einen Aufruf des Install-tools/Symfony-Schema-Command zum Hinzufügen des neuen Felds.

Wenn ich nichts weiter höre setze ich das um und schicke dir einen PR.

markocupic commented 4 years ago

Added in version 3.7.0

philvdb commented 4 years ago

Danke!

markocupic commented 4 years ago

Schau mal: 7df8bdb0b187691b95d1670f0a46cc104efdb22e Wenn addTime nicht gesetzt ist, werden start- und endTime mit dem Wert von startDate bzw. endDate überschrieben.

markocupic commented 4 years ago

@philvdb Wenn das Startdatum bei eingestellter Startzeit genau dem Abmeldefrist-Zeitpunkt entspricht, so ist der Wert des Abmeldefrist-Zeitpunktes 3600 Sekunden grösser. Gibt es da noch ein timezone Problem? Lust zu debuggen? ;-)

philvdb commented 4 years ago

Wenn addTime nicht gesetzt ist, werden start- und endTime mit dem Wert von startDate bzw. endDate überschrieben.

What? Überschrieben? Was wird überschrieben? Ich hätte erwartet, wenn das zu (int) 0 evaluiert passiert einfach ein + 0 und es ist egal ob time gesetzt ist? Hab's zugegebenermaßen nicht getestet aber sehe jetzt auch nicht was überschrieben wird?

Wenn das Startdatum bei eingestellter Startzeit genau dem Abmeldefrist-Zeitpunkt entspricht, so ist der Wert des Abmeldefrist-Zeitpunktes 3600 Sekunden grösser.

Grrr, dieses Phänomen hat mich auch schon an anderer Stelle ereilt und ich habe letztlich die blöde Stunde abgezogen weil es einfach keinen Sinn ergab :) Aber wenn das nun ein größeres, universelles Problem ist kann ich es schon bei nächster Gelegenheit debuggen.

markocupic commented 4 years ago

What? Überschrieben? Was wird überschrieben?

Wenn Der Fehler tritt auf, wenn addTime nicht angewählt ist. Dann nämlich bekommt startTime den Wert von startDate. Als timestamp bekommst du dann so schöne Werte wie 312012456 anstatt 156006228‬. Eben doppelt so gross. Deshalb braucht es die Fallunterscheidung: https://github.com/markocupic/calendar-event-booking-bundle/blob/7df8bdb0b187691b95d1670f0a46cc104efdb22e/src/Contao/Dca/TlCalendarEvents.php#L114 und https://github.com/markocupic/calendar-event-booking-bundle/blob/7df8bdb0b187691b95d1670f0a46cc104efdb22e/src/Contao/Dca/TlCalendarEvents.php#L125 https://github.com/markocupic/calendar-event-booking-bundle/blob/7df8bdb0b187691b95d1670f0a46cc104efdb22e/src/Contao/Dca/TlCalendarEvents.php#L111-L133

philvdb commented 4 years ago

Oh wow. Starttime ist dann also nicht 0 .. sorry, das hatte ich nicht erwartet. Danke für den Bugfix! Ich versuche wenn mal bisschen Zeit ist das mit der Stunde zu debuggen.

markocupic commented 4 years ago

Ja, kein Problem. Vielleicht fällt mir auch noch was ein ;-)

markocupic commented 4 years ago

Fixed in 20fce93cb8cb8119ca34186804764abf8b46d372

markocupic commented 4 years ago

War wohl ein kleiner Denkfehler ;-)