Kochbuch
Zwölf Aufgaben, die in fast jedem Prozess der Musterfirma GmbH vorkommen, jeweils mit dem fertigen Ausdruck zum Kopieren. Jedes Rezept nennt die Aufgabe, das Feld in der App, den Ausdruck und das Ergebnis. Welche Sprache ein Feld erwartet, steht auf der Seite Welche Sprache wo?; die Grundlagen zu Dateien und Daten unter Dateien in Pantarey und Datum und Zeit.
Rechnungsnummer mit Zähler und Jahr
Aufgabe: Eine fortlaufende Rechnungsnummer wie RE-2026-00017 vergeben.
Wo: Dokumentname im Daten Designer (Platzhalter) oder Input-Ausdruck (JSONata) des Schritts, der die Rechnung schreibt.
RE-$fn('str_padStart', $fn('nextId', 'rechnung'), 5, '0')
"RE-" & $substring($now(), 0, 4) & "-" & $fn('str_padStart', $fn('nextId', 'rechnung'), 5, '0')
Ergebnis: RE-00017 bzw. RE-2026-00017.
Hinweis: Der Zähler rechnung entsteht beim ersten Aufruf. Im JSONata-Editor und im Probelauf wird er nur gelesen, erst der echte Lauf zählt hoch, siehe Zähler.
Summe über Positionen
Aufgabe: Den Gesamtbetrag einer Liste von Rechnungspositionen berechnen.
Wo: Input-Ausdruck (JSONata).
$sum(positionen.(menge * preis))
Ergebnis: eine Zahl, etwa 1250.
Netto und Brutto runden
Aufgabe: Einen Betrag kaufmännisch auf zwei Nachkommastellen runden.
Wo: Input-Ausdruck (JSONata) oder Platzhalterfeld.
$fn('number_round', netto * 1.19, 2)
Ergebnis: 1487.5 statt 1487.4999999.
Hinweis: Für Rechnungen mit mehreren Steuersätzen übernimmt Rechnungs-PDF erstellen (mit Berechnung) Summen und Rundung; dort steuern app_vat_rounding: "per_rate" und app_price_basis: "gross" die Rechenweise.
Datum deutsch formatieren
Aufgabe: 2026-03-15 als 15.03.2026 ausgeben.
Wo: Input-Ausdruck (JSONata), Platzhalterfelder wie Anzeigetext oder Betreff, HTML-Vorlage.
$fn('date_toGermanDate', antrag_db.von)
$fn('date_toGermanDate', $substring(antrag_db.$$context.executedAt, 0, 10))
{{toGermanDate rechnungsdatum}} – {{dateTimeFormat erstellt "de-DE" "Europe/Berlin"}}
Ergebnis: 15.03.2026; mit dateTimeFormat 15.03.2026, 10:30:00.
Hinweis: date_toGermanDate erwartet JJJJ-MM-TT; Zeitstempel zuerst mit $substring(x, 0, 10) kürzen. Der Handlebars-Helfer toGermanDate kürzt selbst.
Datei umbenennen
Aufgabe: Ein erzeugtes PDF unter sprechendem Namen anhängen oder speichern.
Wo: Input-Ausdruck (JSONata) des Folgeschritts, etwa der E-Mail.
{
"referenceId": rechnung_pdf.referenceId,
"filename": "Rechnung " & rechnung.nummer & ".pdf",
"contentType": rechnung_pdf.contentType
}
Ergebnis: Der neue Name gilt für E-Mail-Anhang, HTTP-Upload, ZIP und Datensatz; die Datei im Speicher bleibt dieselbe, siehe Dateien.
Status im Datensatz setzen
Aufgabe: Nach der Genehmigung den Status eines gespeicherten Antrags auf „genehmigt“ setzen.
Wo: Datenbank-Element mit Aktion Update, Feld Input-Ausdruck (JSONata), Ergebnis verwerfen aktiv. Der Antrag liegt unter dem Ergebnispfad antrag_db des Speicherschritts.
$merge([$sift(antrag_db, function($v, $k) { $k != '$$context' }), { "status": "genehmigt" }])
Ergebnis: Der ganze Datensatz wird mit id und data_schema_id neu geschrieben, nur status ändert sich.
Hinweis: Das Update ersetzt den Datensatz; deshalb den gespeicherten Stand als Grundlage nehmen, nicht nur das Statusfeld. Fehlende Pflichtfelder stoppen den Schritt. $sift entfernt den mitgeführten $$context.
Liste filtern und gruppieren
Aufgabe: Nur Positionen mit Menge behalten und Beträge je Kategorie summieren.
Wo: Input-Ausdruck (JSONata).
positionen[menge > 0]
positionen{kategorie: $sum(preis)}
Ergebnis: eine gefilterte Liste bzw. ein Objekt wie { "Hardware": 1200, "Schulung": 450 }.
Hinweis: [bedingung] filtert, {schlüssel: wert} hinter einer Liste gruppiert nach dem Schlüssel; innerhalb der Gruppe ist preis die Liste aller Preise dieser Kategorie.
Text aus mehreren Feldern zusammensetzen
Aufgabe: Namen oder Adresszeilen zusammensetzen, ohne hängende Kommas bei leeren Feldern.
Wo: Platzhalterfelder wie Anzeigetext, Vorgangskennung, Dokumentname; in JSONata ohne $(…).
$fn('str_joinNonEmpty', ', ', $(nachname), $(vorname))
$fn('str_coalesce', $(rufname), $(vorname), 'Unbekannt')
$fn('str_ifPresent', $(storniert_am), 'STORNIERT', 'aktiv')
Ergebnis: Müller, Hans, bei leerem Vornamen Müller; str_coalesce liefert den ersten vorhandenen Wert, str_ifPresent einen Text je nachdem, ob ein Wert da ist.
Hinweis: 0 und '0' gelten als vorhanden; leere Texte, null und fehlende Felder nicht.
Wert aus der Werte-Verwaltung nutzen
Aufgabe: Firmenadresse oder Bankverbindung zentral pflegen und im Prozess einsetzen.
Wo: alle Felder im Prozess Designer, auch JSONata- und SQL-Felder; nicht in Formulardaten.
{
"absender": {{value:firma}},
"strasse": {{value:firma.strasse}},
"iban": {{value:global:bank_iban}}
}
Ergebnis: Pantarey setzt den gespeicherten Wert vor der Auswertung ein; außerhalb von Anführungszeichen als JSON-Wert (Objekt, Zahl, Text), innerhalb als maskierter Text.
Hinweis: Namen bestehen aus Kleinbuchstaben, Ziffern und Unterstrich und beginnen mit einem Buchstaben. Alles dazu unter Werte im Prozess.
Bedingung auf gedrückte Schaltfläche
Aufgabe: Am Gateway den Weg nach der Aktionsschaltfläche der Benutzeraufgabe wählen.
Wo: Bedingung am ausgehenden Sequenzfluss des Gateways (JavaScript mit Platzhaltern). Die Aufgabe hat den Ergebnispfad genehmigung, ihre Schaltfläche den Wert approve.
$(genehmigung.$$context.selectedAction) === 'approve'
Ergebnis: true für den Genehmigungsweg; der zweite Fluss wird als Standardfluss markiert oder prüft === 'reject'.
Hinweis: Mit einem Mapping-Pfad an der Schaltfläche steht der Wert zusätzlich in einem Feld der Nachricht, etwa $(genehmigung.entscheidung). Mehr unter Gateway und Bedingungen.
Dateien aus Mehrfach-Upload einzeln verarbeiten
Aufgabe: Jede hochgeladene Datei einzeln analysieren, zum Beispiel alle Belege eines Antrags.
Wo: Abschnitt Schleife der Aktivität (Schraubenschlüssel → Parallel oder Sequential Multi Instance), Input-Ausdruck (JSONata), Ergebnispfad analysen.
[uploadedFiles.{ "pdf": $ }]
Ergebnis: Je Datei ein Durchlauf von PDF analysieren mit { "pdf": { … } } als Nachricht; unter analysen liegt danach die Liste der Einzelergebnisse.
Hinweis: Die Schleife verlangt eine Liste. Die eckigen Klammern sorgen dafür, dass auch eine einzelne Datei als Liste ankommt; sonst meldet der Schritt „Loop activity input must be an array“. Beim Start Ein Prozess für alle Dateien heißt die Liste uploadedFiles, bei einem Mehrfach-Feld im Formular zum Beispiel formular.belege. Standard sind höchstens 1000 Elemente und 40 parallele Durchläufe.
Erinnerung nach Zeitlimit
Aufgabe: Bleibt eine Aufgabe drei Tage liegen, eine Erinnerung senden und die Aufgabe erneut stellen.
Wo: Zeitlimit der Benutzeraufgabe (Ergebnispfad pruefung): Modus Zeitspanne 3 Tage, Verhalten bei Zeitüberschreitung Weiter (automatisch fortfahren). Dahinter ein Gateway mit Bedingung:
$(pruefung.$$context.timedOut) === true
Ergebnis: Nach drei Tagen läuft der Vorgang weiter, timedOut ist true, der Erinnerungsweg sendet die E-Mail und führt zurück zur Aufgabe. Wurde die Aufgabe erledigt, fehlt timedOut und der normale Weg greift.
Hinweis: Soll die Frist aus den Daten kommen, Datum aus Prozessdaten mit $(rechnung_db.frist) wählen; ein reines Datum gilt bis 23:59:59 UTC. Eine feste Pause ohne Aufgabe ist das Timer-Zwischenereignis mit Wartezeit (Sekunden) 259200, siehe Zeit, Fehler und Signale.
Nächster Schritt
Zurück zur Landkarte Welche Sprache wo?: welches Feld JSONata, Platzhalter, JavaScript, Handlebars oder SQL erwartet.