Für Bedingungen, Mappings und Berechnungen nutzt DEPLAW FEEL (Friendly Enough Expression Language). Grundsätzlich stehen alle Standard-FEEL-Funktionen zur Verfügung. In den Header-Feldern von ServiceTasks kommen zusätzlich die folgenden DEPLAW-spezifischen Funktionen hinzu.
Weil in DEPLAW jede Variable eine Zeichenkette ist, folgt fast jede Berechnung demselben Muster: in eine Zahl umwandeln, rechnen, wieder als Text formatieren.
Merkmuster: bigDecimal(...) macht aus dem Text eine Zahl, mit der Sie rechnen; euro(...) formatiert das Ergebnis wieder als Euro-String für Schreiben und Platzhalter.
Funktionsübersicht
| Funktion | Kategorie | Zweck |
|---|---|---|
bigDecimal(x) |
Konvertierung | String → Zahl (rundungssicher) |
euro(x) |
Konvertierung | Zahl → Euro-String |
parseDate(x) |
Konvertierung | Datum zwischen DE- und ISO-Format umwandeln |
parseToJson(x) |
Konvertierung | JSON-String → JSON-Objekt |
toBoolean(x) |
Konvertierung | Wahrheitswert → "Ja" / "Nein" |
isNullOrEmpty(x) |
Prüfung | leer oder nicht gesetzt? |
isDate(x, code) |
Prüfung | gültiges Datum im Format de/en? |
isNumber(x) |
Prüfung | gültige Zahl? |
sortJsonTable(...) |
Tabelle | Zeilen eines Tabellen-JSON sortieren |
jsonToHtmlTable(...) |
Tabelle | Tabellen-JSON → HTML-Tabelle |
getDunningNoticeCatalogDescription(x) |
Fachlich | Mahnbescheid-Katalognummer → Beschreibung |
calcRVGwithDate(...) |
Fachlich | RVG-Gebühren berechnen |
calcGKGwithDate(...) |
Fachlich | GKG-Gebühren berechnen |
Konvertierung und Formatierung
bigDecimal(X) – Wandelt eine Zeichenkette (auch Euro-Werte) rundungssicher in eine Zahl um.
FORDERUNG_BEZAHLT = "13,34 €"
bigDecimal(FORDERUNG_BEZAHLT) → 13.34
euro(X) – Wandelt eine Zahl in einen Euro-Wert (Zeichenkette) um.
FORDERUNG_BEZAHLT = 13.34
euro(FORDERUNG_BEZAHLT) → "13,34 €"
parseDate(X) – Wandelt ein Datum zwischen deutschem und ISO-Format um (in beide Richtungen).
parseDate("01.03.2022") → "2022-03-01"
parseDate("2022-03-01") → "01.03.2022"
parseToJson(X) – Wandelt einen JSON-String in ein JSON-Objekt um.
JSON = "{ \"foo\": \"Baa\", \"test\": \"TEST\" }"
parseToJson(JSON).test → "TEST"
toBoolean(X) – Normalisiert einen Wahrheitswert zu "Ja" oder "Nein".
toBoolean("true"), toBoolean("ja"), toBoolean("Ja") → "Ja"
toBoolean("false"), toBoolean("nein") → "Nein"
Prüffunktionen
isNullOrEmpty(X) – Prüft, ob ein Wert leer oder nicht gesetzt ist.
isNullOrEmpty("null"), isNullOrEmpty(null), isNullOrEmpty("") → true
isNullOrEmpty("test") → false
isDate(X, landcode) – Prüft, ob ein Wert ein gültiges Datum im angegebenen Format ist (landcode = "de" oder "en").
isDate("01.01.2020", "de") → true
isDate("2020-01-01", "en") → true
isDate("2020-01-01", "de") → false
isNumber(X) – Prüft, ob ein Wert eine Zahl ist.
isNumber("2020-01-01") → false
isNumber("100"), isNumber("100,34"), isNumber("100.34") → true
Tabellen-Funktionen
jsonToHtmlTable(...) – Wandelt ein speziell aufgebautes JSON in eine HTML-Tabelle um. Die Parameter lauten: jsonTable, tableStyling, columnWidthList, columnStylingList, lastRowStylingList, enableHeadline, enableLastRow, jsonColumnname, jsonRowname, jsonLastRowName.
Beispiel-JSON:
KOSTENAUFSTELLUNG_TABELLE =
{
"spalten": ["Datum", "Name", "Aktenzeichen", "Betrag"],
"zeilen": [
["12.12.2020", "Peter Tester", "12345/20", "875,30 €"]
],
"endzeile": ["875,30 €"]
}
Aufruf (kombiniert mit Sortierung und Parsing):
jsonToHtmlTable(
sortJsonTable(parseToJson(KOSTENAUFSTELLUNG_TABELLE), "zeilen", 0, "asc"),
"width:100%;",
"15%,35%,35%,15%",
",,,text-align:right;",
"text-align:right;",
true, true,
"spalten", "zeilen", "endzeile"
)
sortJsonTable(json, sortRowName, sortColumnIndex, sortOrder) – Sortiert die Zeilen eines JSON nach einer Spalte.
sortJsonTable(parseToJson(JSON_INPUT), "zeilen", 2, "asc")
mit
JSON_INPUT =
{
"spalten": ["Datum", "Tarif", "Höhe", "Wirksam"],
"zeilen": [
["01.01.2025", "A", "102,50 €", "Unwirksam"],
["02.01.2025", "112/112", "13,67 €", "Unwirksam"],
["01.01.2020", "B", "0,13 €", "Wirksam"],
["01.01.2001", "VC3", "35,00 €", "Wirksam"]
]
}
Fachspezifische Funktionen
getDunningNoticeCatalogDescription(X) – Ersetzt eine Katalognummer aus dem Mahnbescheidsbereich durch ihre Beschreibung.
getDunningNoticeCatalogDescription("5") → "Dienstleistungsvertrag"
calcRVGwithDate(objectValueInput, feeCategory, factor, rvgFeeDate) – Berechnet die RVG-Gebühren (unterstützt RVG ab dem 01.08.2013). Über das Datum wird automatisch die passende Rechtsordnung ausgewählt.
feeCategory:"2300"für Gebühren (z. B. Geschäfts- oder Verfahrensgebühr),"7200"für Auslagenfactor: Faktor als Zeichenkette, z. B."0.5","0,9","1,3"rvgFeeDate: Stichtag der Berechnung
KOSTENSCHUTZ_GGW = "399,99"
calcRVGwithDate(KOSTENSCHUTZ_GGW, "2300", "1.3", "01.01.2025") → "66,95"
calcGKGwithDate(objectValueInput, factor, rvgFeeDate) – Berechnet die GKG-Gebühren (unterstützt GKG ab dem 01.08.2013). Auch hier bestimmt das Datum die anzuwendende Rechtsordnung.
factor: Faktor als Zeichenkette, z. B."0.5","0,9","1,3"rvgFeeDate: Stichtag der Berechnung
KOSTENSCHUTZ_GGW = "3999"
calcGKGwithDate(KOSTENSCHUTZ_GGW, "3.0", "01.01.2025") → "420"
Typische Stolperfallen
Nicht jede FEEL-Funktion wird im Schriftsatz ausgewertet. Der Dokumentgenerator (Textbausteine, {{=…}}) wertet nur einen Teil des FEEL-Sprachumfangs aus. Funktionen mit Leerzeichen im Namen – etwa list contains oder lower case – brechen dort ab und landen als roher FEEL-Text im fertigen Schreiben, statt zu einem Ergebnis ausgewertet zu werden. Bauen Sie die Bedingung stattdessen als Aufzählung von Vergleichen.
Spitze Klammern verschwinden aus dem fertigen Dokument. Eine Handlücke wie <Betrag> wird vom Dokumenterzeuger als HTML-Tag gelesen und samt Inhalt entfernt. Für manuell auszufüllende Lücken eckige Klammern verwenden, also [Betrag].
FEEL-Arrays sind 1-indiziert, nicht 0-indiziert. liste[1] liefert das erste Element; liste[0] ergibt null. Wer aus anderen Sprachen 0-indizierte Arrays gewohnt ist, greift damit unbemerkt ins Leere.
Ein nicht angelegtes Feld ist null, aber nicht „nicht vorhanden“. Eine Bedingung wie =if X != null then … else … greift nicht zuverlässig, wenn das Aktenfeld X in dieser Akte noch nie gesetzt wurde – dann ist es aus Sicht von FEEL nicht dasselbe wie ein explizit leerer Wert. Prüfen Sie mit isNullOrEmpty(X) statt direkt gegen null zu vergleichen.