isDateBefore gibt immer true zurück

Hallo,

wir haben folgende Funktion in einem Mapper:
<#if stock! == '0' && next_delivery_date!?trim == '' && (manual_delivery_date!?trim == '' || isDateBefore(manual_delivery_date!, datecalc(.now, "DAY", -1)?date?string('yyyy-MM-dd'))?c)> true <#else> false </#if>

Allerdings gibt die Funktion
isDateBefore(manual_delivery_date!, datecalc(.now, "DAY", -1)?date?string('yyyy-MM-dd'))?c
immer nur true zurück. Dabei kommt manual_delivery_date aus einem Datastore in diesem Format ‚2024-05-10‘.

Ich habe es auch so probiert:
isDateBefore(manual_delivery_date!, .now)?c
und so:
isDateBefore(manual_delivery_date!?date('yyyy-MM-dd')?string('yyyy-MM-dd'), .now)?c

Hat aber auch nichts geändert.

Hat jemand eine Idee woran das liegen könnte?

Viele Grüße,
Patrick

UPDATE:
Ich denke ich habe die Antwort schon selbst gefunden. In der IF-Abfrage muss explizit der Wert von isDateBefore abgefragt werden:
isDateBefore(manual_delivery_date!, datecalc(.now, "DAY", -1)?date?string('yyyy-MM-dd'))?c == 'true'

Hallo Patrick,

die Lösung aus deinem Update sollte funktionieren.

Kurze (technische) Erklärung:
Die Ursache für das Verhalten ist das Freemaker Builtin ?c. Das sorgt dafür, dass der boolesche Wert, der von isDateBefore zurückgegeben wird, in einen Text (string) umgewandelt wird.

siehe Built-ins for booleans - Apache FreeMarker Manual

Das hat zu Folge, dass deine Bedingung immer erfüllt ist, da alle nicht leeren strings (auch "false") von Freemarker als true(„wahr“) ausgewertet werden.

Beispiel:
Links ist das was gerade bei dir aufgrund des ?c passiert, rechts entspricht dem Verhalten ohne ?c

Du kannst es so machen wie in deinem Beispiel. Dann wird ein String Vergleich gemacht oder du verwendest nur
<#if isDateBefore(manual_delivery_date!, datecalc(.now, "DAY", -1)?date?string('yyyy-MM-dd'))>... (ohne das ?c) .

Viele Grüße
Torsten

Hallo @synesty-Torsten,

alles klar. Vielen Dank für die Erklärung. Jetzt ergibt es Sinn :slight_smile:

Viele Grüße,
Patrick

1 Like