Im Menüpunkt Workflows kannst Du eigene, individuell angepasste Abläufe definieren. Diese benutzerdefinierten Workflows ermöglichen es Dir, Prozesse zu automatisieren, die von den Standardabläufen in VARIO Cloud abweichen. So kannst Du das System optimal an die Anforderungen und Arbeitsweise Deines Unternehmens anpassen und Deine Arbeit mit der VARIO Cloud noch effizienter gestalten.
Hier die Vorteile von Workflows für Dein Unternehmen im Überblick:
Einmal eingerichtet, laufen die meisten Workflow-Abläufe unauffällig im Hintergrund. Dadurch fügen sie sich nahtlos in bestehende Abläufe ein und sind im täglichen Einsatz kaum von systemseitigen Prozessen zu unterscheiden.
Für das Erstellen und Bearbeiten von Workflows sind Kenntnisse in der Programmiersprache JavaScript erforderlich. Die Workflows greifen direkt in die Abläufe von VARIO Cloud ein – fehlerhafte Workflows können daher zu unerwünschtem Verhalten oder Störungen im System führen. Prüfe Deine Workflows daher sorgfältig, bevor Du sie aktivierst.
Mithilfe der integrierten Protokolle und Logs zu den Workflows lassen sich solche Fehler zwar nachvollziehen, dennoch ist technisches Verständnis erforderlich, um sie gezielt zu beheben.
Über “+ Workflow” kannst Du einen neuen Workflow anlegen. Bestehende Workflows lassen sich über das Aktionsmenü auch als JSON-Datei importieren.

Bevor Du Deinen ersten Workflow erstellst, ist es wichtig, den Unterschied zwischen den beiden verfügbaren Varianten zu kennen: synchrone und asynchrone Workflows.
Welche Variante verwendet wird, hängt vom Workflow-Auslöser ab, den Du beim Anlegen des Workflows festlegst. Je nach Variante stehen Dir unterschiedliche Workflow-Elemente zur Verfügung.
Wie Du den passenden Workflow-Auslöser auswählst, erfährst Du im Abschnitt “Workflow anlegen“.
Ein synchroner Workflow wird direkt im Rahmen einer Benutzeraktion ausgeführt – z. B. beim Speichern eines Datensatzes. Der Datensatz wird in diesem Fall erst gespeichert, wenn der gesamte Workflow vollständig durchgelaufen ist.
Während der Ausführung kann es zu kurzen Wartezeiten kommen. Der aktive Workflow wird durch eine Hinweismeldung im System angezeigt, und die Änderungen, die durch den Workflow vorgenommen werden, erscheinen sofort im geöffneten Datensatz.
Verwende synchrone Workflows überall dort, wo Daten unmittelbar geprüft oder Folgeprozesse im gleichen Dialog gestartet werden sollen.
Merksatz: Synchron = “blockierend” – der Workflow wird innerhalb der Benutzeraktion ausgeführt und hält den Vorgang an, bis diese abgeschlossen ist.
Ein Anwendungsfall für einen synchronen Workflow ist die automatische Prüfung und Erstellung eines Deals beim Speichern eines Angebots.
Dabei läuft der Workflow wie folgt ab:
Da es sich um einen synchronen Workflow handelt, wird das Angebot erst gespeichert, wenn die Prüfung abgeschlossen und ggf. der neue Deal erstellt wurde. Der Benutzer kann erst dann mit der Arbeit fortfahren, wenn der gesamte Workflow erfolgreich beendet ist.
Ein Workflow wird synchron ausgeführt, wenn er mit einem der folgenden Auslöser angelegt wird:
Ein asynchroner Workflow wird nicht sofort im Rahmen einer Benutzeraktion ausgeführt, sondern nachgelagert. Erst wenn die ursprüngliche Aktion abgeschlossen ist, startet der Workflow im Hintergrund – während der Benutzer bereits weiterarbeiten kann.
Im Gegensatz zu synchronen Workflows entstehen hier keine Wartezeiten. Änderungen, die durch den Workflow vorgenommen werden, sind daher erst nach dessen Abschluss sichtbar. Falls gewünscht, kann der Benutzer über eine im Skript definierte Hinweismeldung informiert werden.
Verwende asynchrone Workflows für ressourcenintensive, zeitaufwändige oder optionale Aufgaben, um den Arbeitsfluss nicht zu unterbrechen.
Merksatz: Asynchron = “hintergründig” – die Benutzeraktion ist sofort abgeschlossen, der Workflow übernimmt den Rest im Nachgang.
Ein Anwendungsfall für einen asynchronen Workflow ist die automatische Erstellung eines Deals beim Speichern eines Angebots – unabhängig davon, ob bereits ein Deal zum Angebot existiert.
Der Ablauf sieht wie folgt aus:
Ein Workflow wird asynchron ausgeführt, wenn er mit einem der folgenden Auslöser angelegt wird:
| Entscheidungskriterien | Synchron | Asynchron |
|---|---|---|
| Benutzerrückmeldung muss sofort sein? (z. B. Validierung, Pflichtfeldprüfung) | ✅ | ❎ |
| Längere Hintergrundlogik (z. B. Angebotsprüfung durch mehrere Regeln) | ❎ | ✅ |
| Direkter Datenzugriff anderer Prozesse nötig? (z. B. Folgeereignis im selben Fenster) | ✅ | ❎ |
| Performance wichtig, Benutzer soll ohne Unterbrechung weiterarbeiten können? | ❎ | ✅ |
Synchron: Workflow läuft innerhalb der Aktion -> Kurze Wartezeit, sofortige Ergebnisse
Asynchron: Workflow läuft nach der Aktion im Hintergrund -> Keine Wartezeit, Ergebnis erscheint später
Um Dir den Einstieg in die Arbeit mit Workflows zu erleichtern, zeigen wir Dir die einzelnen Schritte anhand des Beispiel-Workflows “Lieferungs- und Zahlungsmodalitäten für Angebote”.
Dieser Workflow vereinfacht die Erstellung von Angeboten für Interessenten, bei denen noch keine Geschäftsbeziehung hinterlegt ist.
Standardablauf ohne Workflow:
Beim Anlegen eines Angebots für eine Adresse ohne Geschäftsbeziehung (z. B. bei neuen Interessenten) müssen die Zahlungs- und Lieferbedingungen manuell eingetragen werden.
Ablauf mit Workflow:
Mit Hilfe des Workflows werden die Zahlungs- und Lieferungsmodalitäten in diesem Fall automatisch vorausgefüllt, sobald das neue Angebot erstellt wird.
Der Workflow prüft dazu:
– ob es sich um einen Beleg der Kategorie “Angebot” handelt,
– und ob keine Geschäftsbeziehung vom Typ “Kunde” bei der Adresse hinterlegt ist.
Wenn beide Bedingungen zutreffen, werden die Modalitäten aus im Workflow festgelegten Standardwerten übernommen.

Auf den Aufbau und die einzelnen Elemente eines Workflows gehen wir im Abschnitt “Workflow-Elemente” detailliert ein.
Um einen neuen Workflow zu erstellen, gehe folgendermaßen vor:

Die Auslöser legen fest, welche Aktion in VARIO Cloud den Start eines Workflows auslöst. Sie sind nach Funktionsbereiche wie Belege, CRM/Office oder Adressen unterteilt. Je nach Bereich stehen unterschiedliche Auslöser zu Verfügung, wie zum Beispiel das Speichern eines Datensatzes und die Übernahme eines Beleges.
Wichtig: Pro Auslöser kann nur ein aktiver Workflow gleichzeitig bestehen!
Mit der Wahl des Auslösers wird gleichzeitig bestimmt, ob der Workflow synchron oder asynchron ausgeführt wird. Eine Übersicht aller verfügbaren Auslöser und deren Zuordnung zu synchronen oder asynchronen Workflows findest Du im Abschnitt “Synchrone und Asynchrone Workflow“.
Beispiel Auslöser
Für unseren Beispiel-Workflow “Lieferungs- und Zahlungsmodalitäten für Angebote” verwenden wir den Auslöser “Beleg: Bei Erstellung”. Dieser löst einen asynchronen Workflow aus, der unmittelbar nach dem Anlegen eines Belegs gestartet wird.

Mit den einzelnen Workflow-Elementen bestimmst Du die Schritte innerhalb eines Workflows und legst fest, was an jeder Stelle passieren soll.
– Das Start-Element markiert den Beginn des Workflows.
– Ein Abschließen-Element signalisiert das erfolgreiche Ende des Ablaufs.
– Mit den Elementen “Benutzeraktion” und “Benutzerskript” definierst Du die konkrete Abläufe.
Im Abschnitt “Workflow-Elemente” findest Du eine ausführliche Beschreibung aller verfügbaren Elemente und ihrer Einsatzmöglichkeiten.


Stelle sicher, dass der Workflow vollständig und korrekt konfiguriert ist, bevor Du ihn aktivierst. Ein aktivierter Workflow wirkt sich unmittelbar auf die Funktionsweise in den jeweiligen Bereichen von VARIO Cloud aus – fehlerhafte Konfigurationen können zu unerwünschten Abläufen oder Datenänderungen führen.
kannst Du die Bezeichnung des Workflows anpassen.
Wenn der Support-Modus aktiviert ist, wird beim Auslösen eines Workflows eine Infobox mit den IDs der möglichen Workflow-Auslöser für den jeweiligen Datensatz angezeigt. Im gezeigten Screenshot siehst Du beispielsweise die potenziellen Auslöser vor und nach dem Speichern einer Adresse.

Mit den einzelnen Workflow-Elementen bestimmst Du die Schritte und Abläufe innerhalb eines Workflows. Jedes Element definiert, was genau in einem bestimmten Abschnitt des Workflows passieren soll.
Damit ein Workflow aktiviert werden kann, müssen mindestens folgende Elemente enthalten sein:
Die verfügbaren Elemente richten sich nach der Art des Workflows: synchron oder asynchron. Je nach Variante stehen unterschiedliche Funktionen zur Verfügung. In Elementen wie dem Benutzerskript-Element wird die Funktion mittels Skript definiert. Hier legst Du den konkreten Ablauf fest – z. B. Bedingungen, Berechnungen oder Aktionen wie das Erstellen eines Datensatzes. Durch das Hovern mit der Maus über ein Element wird ein Tooltip mit einer kurzen Beschreibung des Elements eingeblendet.
Das Element “Start”
kennzeichnet den Beginn des Workflows. Es steht für den Workflow-Auslöser, der beim Anlegen des Workflows definiert wurde und wird beim Erstellen eines neuen Workflows automatisch hinzugefügt.
Das Element “Abschließen”
kennzeichnet das Ende eines Workflows. Im Gegensatz zum Fehler-Element, das einen Workflow z. B. mit einer Fehlermeldung beendet, steht das Abschließen-Element für einen erfolgreichen Abschluss des Ablaufs.
Mit dem Element “Fehler”
lässt sich ein individueller Fehlerfall definieren. Es dient als alternative Abschlussvariante, die nach den entsprechenden Schritten im Workflow eintreten soll – z. B. wenn bestimmte Felder leer bleiben.
Alternativ kann ein Fehler auch direkt im Skript, z. B. im Benutzerskript-Element, integriert werden, z. B. mit dem Befehl “throw’“. Auf diese Weise lässt sich gezielt eine Aktion verhindern. Der ausgelöste Fehler wird anschließend als solches im Workflow-Protokoll vermerkt. Weitere Informationen dazu findest Du um Abschnitt “Fehlermeldungen in Workflows“.

Das Element “Benutzeraktion”
fügt dem Workflow einen manuellen Zwischenschritt hinzu, bei dem eine Interaktion durch den Benutzer erforderlich ist, um den Ablauf fortzusetzen.
Typischerweise wird dem Benutzer ein Pop-up-Fenster mit Auswahlmöglichkeiten angezeigt. Erst nachdem die Aktion bestätigt oder eine Auswahl getroffen wurde, läuft der Workflow weiter.
Ein Szenario für eine Benutzeraktion ist eine Abfrage beim Speichern eines Angebots, ob dieses:
– einem bereits vorhandenen Deal zugeordnet werden soll,
– einem neuen Deal zugewiesen werden soll,
– oder nicht mit einem Deal verknüpft werden soll.
Die getroffene Auswahl wird anschließend im nachfolgenden Benutzerskript-Element verarbeitet, um den entsprechenden Schritt im Workflow auszuführen.

Neben den Feldern “Bezeichnung” und “Beschreibung” stehen Dir im Reiter “Allgemein” folgende Optionen zur Verfügungen. Für die Aktivierung des Workflow muss eine dieser Einstellungen ausgewählt werden:

Über den Button “+Benutzeraktion” kannst Du eine neue Benutzeraktion anlegen. Jede Benutzeraktion steht für eine manuelle Entscheidung oder Eingabe, die vom Benutzer vorgenommen werden muss, z. B. die Auswahl zwischen mehreren Optionen in einem Pop-Up-Fenster. Die Benutzeraktion kann jederzeit über das Kreuz in der oberen rechten Ecke des Elements wieder entfernt werden.

Eine Benutzeraktion unterteilt sich in drei Teilbereiche. Dies sind die Benutzeraktion (1) selbst, die Auswahlmöglichkeiten (2) innerhalb der Benutzeraktion und die Folgeentscheidungen (3) in den jeweiligen Auswahlmöglichkeiten. In den folgenden Abschnitten gehen wir näher auf diese Teilbereiche und die entsprechenden Felder ein.

Innerhalb einer Benutzeraktion kannst Du aus drei Strukturierungsvarianten wählen:
Du kannst auch mehrere Benutzeraktionen anlegen, um verschiedene Eingabearten miteinander zu kombinieren. Beispielsweise lässt sich eine Benutzeraktion erstellen, in der der Benutzer ein Datum eingibt, und eine weitere, in der er eine von mehreren Auswahlmöglichkeiten trifft.
Wird eine dieser Benutzeraktionen als synchron definiert, gelten alle Benutzeraktionen des Workflows als synchron.
Ergebnisname der Benutzeraktion – Interner Kennzeichnung, unter der die Benutzeraktion im Skript des nachfolgenden Elements verwendet wird. Der Name kann frei gewählt werden, sollte jedoch eindeutig und nachvollziehbar sein, so dass er auch nachträglich verständlich bleibt.
Typ – Bestimmt den Feldtyp für die Eingabe, z. B. Text, Datum oder Währung. Für Auswahlmöglichkeiten muss “Text” ausgewählt sein. Bei Suchdialogen entfällt dieser.
Toggle “Mehrfachauswahl” – Ermöglicht es dem Benutzer, mehrere Optionen gleichzeitig auszuwählen. Nur relevant bei Auswahlfeldern.
Toggle “Synchron” – Gibt an, ob die Benutzeraktion synchron (vor sofortiger Fortsetzung des Workflows) oder asynchron (zeitversetzt) ausgeführt wird.
Suchdialog – Ermöglich die Auswahl eines Datensatzes aus einem VARIO Cloud Bereich (z. B. Adresse).
Bezeichnung Benutzeraktion – Beschreibungstext, der im Pop-up-Fenster über den Auswahlmöglichkeiten angezeigt wird. Beispiel: “Deal mit Angebot verknüpfen”.

Innerhalb einer Benutzeraktion kannst Du mehrere Auswahlmöglichkeiten definieren, aus denen der Benutzer im Pop-up-Fenster wählen kann. Jede Auswahlmöglichkeit steht dabei für eine Option, die zur Auswahl steht.
Im Beispiel “Deal anlegen?” stehen dem Benutzer folgende Optionen zur Verfügung:

Über den Button “+Auswahlmöglichkeit” kannst Du die einzelne Optionen hinzufügen und definieren.
Bezeichnung Auswahlmöglichkeit – Beschreibungstext zur Auswahlmöglichkeit, der dem Benutzer in der Benutzeraktion angezeigt wird. Beispiel: “Zu einem bestehenden Deal zuordnen“.
Ergebniswert des Auswahlmöglichkeit – Interner Kennzeichnung, unter der die Benutzeraktion im Skript des nachfolgenden Elements verwendet wird. Der Name kann frei gewählt werden, sollte jedoch eindeutig und nachvollziehbar sein, so dass er auch nachträglich verständlich bleibt.
Toogle “Standard” – Legt fest, welche Option beim Öffnen des Pop-ups standardmäßig vorausgewählt ist. Beispiel: “Zu einem neuen Deal zuordnen” bei häufigem Anwendungsfall.

Zu jeder Auswahlmöglichkeit kann eine Folgeentscheidung definiert werden. Diese wird ausgeführt, sobald der Benutzer die jeweilige Auswahl im Pop-up-Fenster trifft.
Im Fall unseres Beispiels „Deal anlegen?“ ergeben sich folgende Folgeentscheidungen:


Ergebnisname der Folgeentscheidung – Interner Kennzeichnung, unter der die Folgeentscheidung im Skript des nachfolgenden Elements verwendet wird. Der Name kann frei gewählt werden, sollte jedoch eindeutig und nachvollziehbar sein, so dass er auch nachträglich verständlich bleibt.
Typ – Definiert den Feldtyp der Eingabe (z. B. Text, Datum, Währung). Wird ein Suchdialog verwendet, legt der Typ fest, welcher Wert aus dem Datensatz genutzt wird – z. B. die ID eines Deals (Typ: Zahl).
Suchdialog – Ermöglicht die Auswahl eines Datensatzes aus einem Bereich der VARIO Cloud – z. B. ein bestehender Deal oder ein Deal-Thema.
Bezeichnung Folgeentscheidung – Beschreibungstext zur Folgeentscheidung, der dem Benutzer in der Benutzeraktion angezeigt wird. Beispiel zur Auswahlmöglichkeit “Zu einem bestehenden Deal zuordnen”: “Bestehenden Deal auswählen“

Damit die Entscheidung, die Du in einer Benutzeraktion triffst, auch eine konkrete Auswirkung im Workflow hat, müssen die verwendeten Ergebnisnamen und Ergebniswerte korrekt in ein Folgeelement – zum Beispiel ein Benutzerskript – übernommen werden. Nur so kann der Workflow abhängig von Deiner Auswahl unterschiedliche Aktionen ausführen.
In unserem Beispiel wird das Angebot erst durch die Verarbeitung im Benutzerskript mit einem bereits vorhandenen oder einem neuen Deal verknüpft. Dazu werden die in der Benutzeraktion definierten Ergebnisnamen und Ergebniswerte im Skript des darauffolgenden Benutzerskript-Elements wie folgt integriert:
import workItem from “work_item_script”;
workItem.setGuard( (ctx) => {
return true;
});
workItem.setAction( (ctx) => {
let crmDealService = ctx.services.crmDealService;
let crmDocumentRefService = ctx.services.crmDocumentRefService;
let documentService = ctx.services.documentService;
let userAndGroupService = ctx.services.userAndGroupService;
let utils = ctx.services.utils;
let userDecision = ctx.parameters[‘DECISION_KEY_CHECK_DEAL_TO_OFFER‘];
let documentId = ctx.parameters[‘documentId’];
if (userDecision == ‘DECISION_ANSWER_REFERENCE_TO_EXISTING_DEAL‘) {
let existingDealId = ctx.parameters[‘DECISION_ANSWER_EXISTING_DEAL_ID‘];
crmDocumentRefService.addDocumentRef(existingDealId,
‘DEAL’,
documentId);
}
else if (userDecision == ‘DECISION_ANSWER_CREATE_NEW_DEAL‘) {
let document = documentService.readById(documentId);
let dealState = crmDealService.findStartState();
let dealType = crmDealService.findTypeByLabel(‘Vertrieb’);
let dealTopicId = ctx.parameters[‘DECISION_ANSWER_NEW_DEAL_TOPIC_ID‘];
let dealTopic = crmDealService.findTopicById(dealTopicId);
let dealPriority = crmDealService.findPriorityByType(‘NORMAL’);
let currentUser = userAndGroupService.getCurrentUser();
let deal = crmDealService.getNewDto();
deal.typeRef = utils.toApiReference(dealType);
deal.stateRef = utils.toApiReference(dealState);
deal.priorityRef = utils.toApiReference(dealPriority);
deal.assignedUserRef = utils.toApiReference(currentUser);
deal.mainResponsibleUserRef = utils.toApiReference(currentUser);
deal.topicRef = utils.toApiReference(dealTopic);
deal.accountRef = utils.toApiReference(document.accountId);
deal = crmDealService.create(deal);
crmDocumentRefService.addDocumentRef(deal.id,
‘DEAL’,
documentId);
}
});
Mit dem Element
fügst Du dem Workflow einen automatisierten Schritt hinzu, der ohne Benutzerinteraktion ausgeführt wird. Die Ausführung erfolgt anhand eines individuell definierten Skripts.
Im Reiter “Skript” steht Dir ein integrierter JavaScript-Editor zur Verfügung, in dem Du das Skript für das Benutzerskript-Element bearbeiten kannst. Hier kannst Du auf verschiedene Utility-Funktionen, Parameter und Services zugreifen und diese gezielt einsetzen, um den gewünschten Ablauf im Workflow zu steuern.
Im Feld “Skript-Modul” kannst Du eines der unter dem Menüpunkt “Skripte” gespeicherten Skripte auswählen. So musst Du den Skripttext nicht bei jedem Element neu verfassen und kannst zentrale Skripte bei Bedarf gezielt anpassen oder erweitern.
Wenn Du kein Skript aus der Liste auswählst, muss der Skript direkt im Element manuell eingetragen werden, um das Element speichern zu können.

Im Skript eines Benutzerskript-Elements stehen Dir verschiedene Funktionen und Objekte zur Verfügung, mit denen Du den Ablauf des Workflows gezielt steuern kannst. Hier ein Überblick über die wichtigsten Begriffe:
| Begriff | Beschreibung |
|---|---|
| setGuard (optional) | Definiert eine Bedingung, unter der der Workflow ausgeführt werden soll. Beispiel: nur bei bestimmtem Ländercode. |
| return true | Gibt innerhalb der setGuard an, dass die definierte Aktion immer ausgeführt wird. |
| return false | Gibt innerhalb der setGuard an, dass die definierte Aktion nie ausgeführt wird. |
| setPrepare (optional) | Hier können Variablen mit Parametern befüllt werden, die später in setAction verwendet werden. |
| setAction | Definiert die eigentliche Aktion, die im Workflow ausgeführt werden soll. |
| ctx | Bietet Zugriff auf verschiedene Kontextinformationen, die sich je nach Workflow-Auslöser unterscheiden können. |
| ctx.availableinput | Zugriff auf die für den Workflow verfügbaren Parameter, je nach Auslöser (z. B. die Aufgaben-ID bei einem Workflow mit dem Auslöser “Nach dem Speichern einer Aufgabe”). |
| ctx.instanceDetails | Zugriff auf Informationen zur aktuellen Workflow-Instanz. |
| ctx.parameters | Zugriff auf vordefinierte Parameter, z. B. Vorgängerbeleg oder vorherige Datensatzversion. Anders als bei availableinput können diese erweitert werden, z. B. durch C-Units. |
| ctx.parameters[‘previousDocument’] | Zugriff auf die vorherige Version des Beleges für Workflows mit den Auslösern “Vor dem Speichern“, “Nach dem Speichern“, “Bei Beginn der Bearbeitung” und “Bei Synchronisierung” von Belegen. |
| ctx.parameters[‘sourceDocumentId’] | Zugriff auf die ID des Ursprungsbelegs für einen Workflow mit dem Auslöser Übernahme von Belegen. |
| ctx.services | Zugriff auf die für den Workflow zur Verfügung stehenden Verarbeitungsmethoden, mit denen wiederum auf auf die Geschäftsobjekte in der VARIO Cloud, z. B. Adressen oder Artikel, zugegriffen werden kann. Beispiel: ctx.services.accountService.create = Adresse anlegen |
| ctx.services.logger.info(…) | Fügt einen selbst definierten Hinweis zum Log des Elements hinzu. |
| ctx.services.vqlService | Ausführung einer VQL-Abfrage um im Workflow auf das Ergebnis dieser zugreifen zu können. |
ctx.) und JavaScript-Methoden auflistet.

setAction definieren und anschließend innerhalb von setAction verwenden.Im Reiter “Parameter” kannst Du über “+Parameter” zusätzliche Parameter anlegen, die im Skript verwendet werden können. Dabei stehen Dir zwei Optionen zur Verfügung:
Über die Symbols
/
kannst Du zwischen beide Optionen wechseln.

Felder zur Parametereinrichtung
Name – Interne Kennzeichnung des Parameters, der im Skript verwendet wird. Der Name kann frei gewählt werden, sollte jedoch eindeutig und nachvollziehbar sein.
Wert – Der feste Wert, der dem Parameter zugewiesen wird und im Workflow bzw. Skript verwendet werden kann.
Datentyp – Legt fest, welche Art von Wert im Feld “Wert” angegeben werden kann. Zur Auswahl stehen: Text, Zahl und Boolesch.
Selektion – Hier kannst Du eine im voraus angelegte Selektion auswählen. Voraussetzung: Toggle “Workflow” ist aktiv.
Pfad – Gibt den Spalten- oder Feldnamen aus den C-Unit-Einstellungen an, der bestimmt, welcher Wert aus der Selektion für den Parameter übernommen wird.
Die benötigten Bezeichnungen kannst Du im Support-Modus der Selektion über den Toggle “Originale C-Unit Bezeichnungen anzeigen” einsehen.
Das Element “Abfrage”
teilt den Workflow in mehrere mögliche Pfade auf. Welcher Pfad ausgeführt wird, hängt von der im Element definierten Bedingung ab.
Im Beispiel-Workflow „Lieferungs- und Zahlungsmodalitäten für Angebote“ wird eine Abfrage eingesetzt, um zu prüfen, ob der neu angelegte Beleg ein Angebot ist:
Mit der Abfrage steuerst Du also gezielt, welcher Ablauf im Workflow abhängig von definierten Bedingungen durchlaufen wird.

Im Reiter “Skript” des Abfrage-Elements steht Dir ein integrierter JavaScript-Editor zur Verfügung. Dort definierst Du eine Bedingung, deren Ergebnis als Zeichenkette (string) zurückgegeben wird. Jede zurückgegebene Zeichenkette entspricht einer möglichen Abzweigung, die Du im Reiter “Abzweigungen” anlegen kannst. Auf Basis des Rückgabewerts wird der entsprechende Pfad im Workflow fortgeführt. Die möglichen Abzweigungen legst Du im Skript mit setSplit() fest.
Hinweis: Weitere Informationen zum Aufbau und zur Funktionsweise des Skripts findest Du im vorherigen Abschnitt zum Benutzerskript.

Wie beim Benutzerskript-Element kannst Du auch im Reiter “Parameter” des Abfrage-Elements über “+ Parameter” zusätzliche Werte anlegen, die im Skript verwendet werden können. Dabei stehen Dir zwei Optionen zur Verfügung:
Über die Symbols
/
kannst Du zwischen beide Optionen wechseln. Weitere Informationen zu den einzelnen Feldern findest Du im vorherigen Abschnitt.
Im Reiter “Abzweigungen” kannst Du die gewünschten Pfad-Abzweigungen hinzufügen und diese entsprechend der Rückgabewerte im Skript benennen.
Jede hier angelegte Abzweigung stellt einen möglichen Verlauf im Workflow dar, abhängig vom Ergebnis der Bedingung im Skript.
Das Element “Warten (eins)”
dient dazu, mehrere Pfade, die zuvor durch ein Abfrage-Element entstanden sind, wieder zusammenzuführen.
Sobald einer der Pfade das Warten-Element erreicht, wird der Workflow fortgesetzt – ohne darauf zu warten, dass auch die anderen Pfade abgeschlossen sind.
Ähnlich wie beim Element “Warten (eins)” werden mit “Warten (alle)”
mehrere zuvor verzweigte Pfade wieder zusammengeführt.
Unterschied: Der Workflow wird erst dann fortgesetzt, wenn alle angebundenen Pfade vollständig abgeschlossen sind.
Mit dem Element “Warten (indirekt)”
kannst Du im Workflow einen Zwischenstopp einbauen, der den Ablauf temporär pausiert. Die Fortsetzung erfolgt asynchron, sobald ein bestimmtes Signal, eine Bedingung oder ein Zeitpunkt eintritt.
Diese Bedingungen werden – ähnlich wie im Abfrage-Element – im Reiter “Skript” definiert und im Reiter “Fortsetzungssignale” angelegt. Es muss mindestens ein Fortsetzungssignal vorhanden sein, damit der Workflow mit dem Element “Warten (indirekt)” aktiviert werden kann. Es können jedoch beliebig viele Fortsetzungssignale hinzugefügt werden.
Mit dem Element “Timeout”
lässt sich eine feste Wartezeit im Workflow einbauen. Im Feld “Timeout (in Millisekunden)” gibst Du die gewünschte Zeitspanne an, über die der Workflow pausiert werden soll.
Erst nach Ablauf dieser Zeit wird der Workflow automatisch fortgesetzt.
Mit dem Element “Unter-Workflow”
kannst Du einen bereits angelegten Unter-Workflow auswählen und in den aktuellen Workflow einfügen. Das ist besonders hilfreich, wenn wiederkehrende Abläufe in mehreren Workflows verwendet werden oder wenn Du komplexe Prozesse übersichtlich strukturieren möchtest.
Ein asynchroner Unter-Workflow kann nicht in einen synchronen Workflow eingebunden werden, da sich die verfügbaren Elemente unterscheiden.
Weitere Informationen zur Erstellung und Verwendung von Unter-Workflows findest Du im Abschnitt “Unter-Workflows”.
Das Element “Abfrage der Dokumentkategorien”
ist eine vordefinierte Variante des klassischen Abfrage-Elements. Es dient dazu, den Workflow abhängig von der Belegkategorie in mehrere Pfade aufzuteilen.
Im Gegensatz zum regulären Abfrage-Element ist das Skript bereits vorkonfiguriert. Im Reiter “Abzweigungen” sind die gängigen Belegkategorien bereits als vordefinierte Abzweigungen angelegt. Diese kannst Du je nach Bedarf bearbeiten, anpassen oder erweitern.

Beim Bearbeiten eines aktiven Workflows wird automatisch eine Kopie erstellt. Diese kann frei bearbeitet und als Entwurf gespeichert werden. Der Entwurf erscheint in Übersicht unterhalb des aktiven Workflows. So musst Du den Workflow nicht unterbrechen, um Anpassungen vorzunehmen – besonders hilfreich bei Workflows, die dauerhaft im Einsatz sind.
Sobald der Entwurf aktiviert wird, ersetzt er automatisch den bisherigen aktiven Workflow. Die alte Version des Workflows wird dabei deaktiviert und ist anschließend unter den deaktivierten Workflows zu finden.

Wenn Du einen inaktiven Workflow bearbeitest, wird kein Duplikat erstellt. Stattdessen ändert sich der Status von “Inaktiv” zu “Entwurf” und der Workflow kann anschließend frei bearbeitet werden.
Nur Workflow-Entwürfe können gelöscht werden. Einen Workflow-Entwurf kannst Du entweder über die drei Punkte im Datagrid oder über den Button “Löschen” beim Bearbeiten des Workflows entfernen.
Beim Löschen eines Entwurfs wird dieser nicht endgültig entfernt, sondern lediglich deaktiviert. Dadurch bleibt der Entwurf erhalten und kann bei Bedarf nachträglich eingesehen oder wieder aktiviert werden.

Ein aktiver Workflow kann über den Button “Workflow deaktivieren” in der Workflow-Konfiguration deaktiviert werden. Auch hier bleibt der Workflow erhalten, wechselt jedoch in den Status “Inaktiv”.

Deaktivierte Workflows kannst Du über das Symbol
im Datagrid einsehen.

Durch das Auswählen eines Workflows und den Button “Workflow aktivieren” kannst Du diesen wieder aktivieren.

Noch ist dieser Bereich nicht ganz vollständig. Aber keine Sorge: Unser Team für Dokumentation und Qualität füllt sie Schritt für Schritt mit allem, was Dir im Alltag weiterhilft. Schau bald wieder vorbei, es lohnt sich!
Über die Aktionen innerhalb eines Workflows kannst Du den geöffneten Workflow als JSON-Datei exportieren.

Die Workflows kannst Du auch über den Drei-Punkte-Menü exportiert werden.

Über die Aktionen im Workflow-Datagrid kannst Du einen Workflow mittels Auswahl einer JSON-Datei importieren.


Es öffnet sich ein Menü, in welchem Du die entsprechende Datei auswählen oder per Drag & Drop hinzufügen kannst:

Danach musst Du nur noch auf den Button “Workflow importieren” klicken:

Unter-Workflows dienen dazu, eine Gruppe von Workflow-Schritten zu speichern, die in verschiedene Workflows eingebunden werden können.
Sie sind besonders hilfreich für:
Unter-Workflows sind nicht eigenständig lauffähig und haben aus dem Grund keinen eigenen Auslöser. Auch wenn sie als “aktiv” markiert sind, haben sie keinen direkten Einfluss auf Prozesse in VARIO Cloud, solange sie nicht in einen übergeordneten Workflow integriert wurden.
Unter-Workflows kannst Du wie jeden anderen Workflow über den Button “+ Workflow” in der Übersicht erstellen.
Durch das Aktivieren des Toggles “Unter-Workflow” legst Du fest, dass es sich nicht um einen eigenständigen Workflow, sondern um einen Unter-Workflow handelt.

Nach dem Anlegen kann der Unter-Workflow wie gewohnt bearbeitet und konfiguriert werden. Auch hier gilt:
Bevor ein Unter-Workflow in andere Workflows integriert werden kann, muss er zunächst aktiviert werden.
Innerhalb eines bestehenden Workflows kannst Du den Unter-Workflow anschließend über das Element “Unter-Workflow” einfügen. Dort wählst Du den gewünschten Unter-Workflow aus.

Beim Exportieren eines Workflows werden enthaltene Unter-Workflows mit ihrem jeweiligen Namen gespeichert.
Beim Import eines Workflows gilt Folgendes:
Alle Ausführungen von Workflows werden in VARIO Cloud protokolliert, um Abläufe nachvollziehbar zu machen – was insbesondere bei Fehlern oder unerwartetem Verhalten nützlich ist.
Damit ein Workflow protokolliert wird, muss er aktiviert und mindestens einmal ausgeführt worden sein – z. B. durch das Anlegen eines Angebots im Fall unseres Beispiel-Workflows.
Die Logs bleiben so lange erhalten, bis der Workflow erneut bearbeitet und gespeichert wird. Solange ein Workflow nur deaktiviert wird, bleiben die Protokolle erhalten.
Die Protokolle (Logs) sind an mehreren Stellen einsehbar:
Mithilfe von ctx.services.logger.info(…) kann im Skript eines Elements ein eigener Log-Hinweis zum Element angegeben werden.

Dieser ist nach Ausführung des Workflows im Log des Elements zu sehen.

Wähle einen Workflow aus und klicke auf den Button “Ausführungen”. Hier werden alle bisherigen Ausführungen des Workflows aufgelistet. Es stehen Dir zwei Möglichkeiten zur Verfügung, auf denen auch die Protokollansichten in anderen Bereichen basieren:




Über die Aktionen innerhalb eines Datensatzes kannst Du gezielt die Workflow-Instanzen einsehen, in denen der jeweilige Datensatz einbezogen oder verwendet wurde. Im Fall unseres Beispiel-Workflows “Lieferungs- und Zahlungsmodalitäten für Angebote” kannst Du die Protokolle direkt in einem geöffneten Angebot einsehen, dessen Erstellung unseren aktiven Workflow ausgelöst hat.
Öffne dazu den entsprechenden Datensatz, z. B. das Angebot, und klicke auf dem Button “Aktionen”. Dort stehen Dir zwei Möglichkeiten zur Verfügung:

Mit diesem Workflow werden Versandlieferscheine beim Speichern automatisch in den Status “Übernommen” versetzt – somit können diese nicht mehr in eine Rechnung übernommen werden. Dies kann nützlich sein, um eine individuell angelegte Belegarten wie den “Versandauftrag” und den “Versandlieferschein” beispielsweise für kostenlose Mustersendungen zu verwenden.
Alle anderen Belegarten der Belegkategorie “Lieferschein” werden trotzdem weiterhin wie gewohnt erst bei der Übernahme in den Folgebeleg in den Status “Übernommen” gesetzt.
Damit die entsprechenden Schritte im Workflow ausgeführt werden können, muss die Belegart Versandlieferschein im Bereich Einstellungen/Belege/Belegarten vorhanden sein.
Um diesen Workflow anzulegen, gehe wie folgt vor:
import workItem from ‘work_item_script’;
workItem.setAction((ctx) => {
var documentService = ctx.services.documentService;
var document = documentService.readById(ctx.parameters[‘documentId’]);
if (document.documentType === ‘Versandlieferschein’) { ctx.parameters[‘targetState’] = ‘ACCEPTED’;
}
});


Der Workflow kann selbstverständlich beliebig erweitert und mit anderen Workflow-Pfaden und –Schritten kombiniert werden.
In einem Workflow mit dem Auslöser “Nach dem Speichern von Belegen” kannst Du in einem Benutzerskript-Element folgendes Skript hinterlegen, um Belege einer bestimmten Belegart automatisch beim Speichern in den jeweiligen Folgebeleg übernehmen zu lassen – in diesem Beispiel ein Angebot in einen Auftrag. Der Aufbau des Workflows kann dabei an den Workflow “Versandlieferscheine übernehmen” angelehnt oder individuell erweitert und angepasst werden.
import workItem from “work_item_script”;
workItem.setAction( ctx => {
var documentService = ctx.services.documentService;
var document = documentService.readById(ctx.parameters[‘documentId’]);
if (document.documentType === ‘Angebot’) {
let documentTransferToTypeRequest = documentService.getDocumentTransferToTypeRequest(); documentTransferToTypeRequest.documentId = document.id;
documentTransferToTypeRequest.targetDocumentType = ‘Auftrag’; documentService.transferToType(documentTransferToTypeRequest);
ctx.parameters[‘skipTransitionToTargetState’] = true;
}
});
Die in diesem Beispiel verwendeten Belegarten “Angebot” und “Auftrag” lassen sich durch beliebige, selbst angelegte Belegarten ersetzen, sofern diese in der Belegkette direkt aufeinanderfolgen.

Mit VQL kannst Du in einem Workflow-Skript auf bestimmte Daten zugreifen. Dazu steht Dir im Skript-Editor der vql-Service zur Verfügung. Du erreichst ihn dort ganz einfach über:
ctx.services.vqlservice
In diesem Beispiel berechnen wir die Summe aller Nettobeträge der Belege einer Adresse und schreiben den Wert ins Log.
Im Bereich Benutzerskript kannst Du folgendes Beispiel-Skript mit VQL-Anteil einfügen:
import workItem from ‘work_item_script’;
workItem.setGuard((ctx) => {
// Skript-Methode “action” ausführen?
return true; });
workItem.setAction((ctx) => {
let document = ctx.services.documentService.readById(ctx.availableInput.documentId);
let accountId = document.accountId;
let totalBoughtGoods = ctx.services.vqlService.queryAll(
`SELECT sum(totalNetPrice) FROM document.querySalesDocuments WHERE accountId = ${accountId}`
);
ctx.services.logger.info(totalBoughtGoods);
});
Im Workflow-Log findest Du dann die mit dieser Beispiel-VQL errechnete Summe:

Mehr Informationen zu VQL findest Du auf unserer Handbuchseite zur freien VQL.
In bestimmten Fällen ist es sinnvoll, einen Workflow gezielt in einen Fehler laufen zu lassen – beispielsweise, wenn ein bestimmtes Feld nicht ausgefüllt wurde oder bestimmte Bedingungen nicht erfüllt sind. Im Skript des betroffenen Elements (z. B. Benutzerskript) kann dazu eine individuelle Fehlermeldung hinterlegt werden, die dem Benutzer beim Ausführen des Workflow-Schritts angezeigt wird.
In diesem Beispiel wird ein Fehler innerhalb eines Workflows mit dem Auslöser “Vor dem Speichern von Belegen” integriert.
Im Benutzerskript wird dazu mit throw eine Fehlermeldung beim Speichern des Belegs ausgegeben, um die Speicherung aktiv zu verhindern.
Mit ctx.services.logger.info(...) kann zusätzlich eine Log-Info im Workflow-Protokoll und Element-Log erzeugt werden, um den Grund der Unterbrechung nachvollziehbar zu dokumentieren.

Beim Speichern des Belegs erscheint eine Hinweismeldung mit dem definierten Fehlertext.

Sowohl der Inhalt der Meldung als auch die Log-Info sind im Log des Benutzerskript-Elements und im Gesamtprotokoll des Workflows einsehbar.

Mit diesem Workflow kannst Du die Erstellung von Angeboten für Interessenten vereinfachen, bei denen noch keine Geschäftsbeziehung hinterlegt ist.
Standardmäßig müssten in solchen Fällen die Zahlungs- und Lieferungsmodalitäten manuell im Angebot eingetragen werden. Mit diesem Workflow werden diese Angaben automatisch mit vordefinierten Standardwerten ausgefüllt, die im Workflow festgelegt wurden.
Damit die im Beispiel definierte Zahlungs- und Lieferungsmodalitäten eingetragen werden können, müssen diese im Vorfeld unter folgenden Bereichen angelegt sein:
Im Skript des Benutzerskript-Elements kannst Du die entsprechenden Werte an Deine eigenen Zahlungs- und Lieferungsmodalitäten anpassen.
Um diesen Workflow anzulegen, gehe wie folgt vor:
import workItem from ‘work_item_split_gateway’;
workItem.setSplit((ctx) => {
var category = ctx.parameters[‘targetCategory’];
if (category === ‘CUSTOMER_OFFER’) {
return category;
}
return ‘UNKNOWN’;
});


import workItem from ‘work_item_script’;
const DELIVERY_METHOD = ‘DL’;
const DELIVERY_TERM = ‘FH’;
const PAYMENT_METHOD = ‘UEB’;
const PAYMENT_TERM = ‘SN’;
workItem.setAction((ctx) => {
const { documentId } = ctx.parameters;
const {
documentService,
accountService,
deliveryMethodService,
deliveryTermService,
paymentMethodService,
paymentTermService,
utils,
logger,
} = ctx.services;
const document = documentService.readById(documentId);
const account = accountService.readById(document.accountId);
if (account.types.includes(‘CUSTOMER’)) {
return;
}
let changed = false;
if (!document.deliveryMethodRef) {
logger.info(‘Setze Versandart: ‘ + DELIVERY_METHOD);
changed = true;
const deliveryMethod = deliveryMethodService.findByLabel(DELIVERY_METHOD);
document.deliveryMethodRef = utils.toApiReference(deliveryMethod);
}
if (!document.deliveryTermRef) {
logger.info(‘Setze Lieferbedingung: ‘ + DELIVERY_TERM);
changed = true;
const deliveryTerm = deliveryTermService.findByLabel(DELIVERY_TERM);
document.deliveryTermRef = utils.toApiReference(deliveryTerm);
}
if (!document.paymentMethodRef) {
logger.info(‘Setze Zahlungsart: ‘ + PAYMENT_METHOD);
changed = true;
const paymentMethod = paymentMethodService.findByLabel(PAYMENT_METHOD);
document.paymentMethodRef = utils.toApiReference(paymentMethod);
}
if (!document.paymentTermRef) {
logger.info(‘Setze Zahlungsbedingung: ‘ + PAYMENT_TERM);
changed = true;
const paymentTerm = paymentTermService.findByLabel(PAYMENT_TERM);
document.paymentTermRef =
paymentTermService.createPaymentTermRef(paymentTerm);
}
if (!changed) {
return;
}
const updateRequest = documentService.getUpdateDocumentRequest();
updateRequest.document = document;
documentService.update(updateRequest);
});
Die im Benutzerskript angegebenen Zahlungs- und Lieferungsmodalitäten können bei Bedarf individuell angepasst werden. Dazu musst Du lediglich folgende Angaben im Skript des Benutzerskript-Elements ändern:
const DELIVERY_METHOD = ‘DL‘; – statt DL kannst Du hier die Bezeichnung der gewünschten Versandart eintragen
const DELIVERY_TERM = ‘FH‘; – statt FH kannst Du hier die Bezeichnung der gewünschten Lieferbedingung eintragen
const PAYMENT_METHOD = ‘UEB‘; – statt UEB kannst Du hier die Bezeichnung der gewünschten Zahlungsart eintragen
const PAYMENT_TERM = ‘SN‘; – statt UEB kannst Du hier die Bezeichnung der gewünschten Zahlungsbedingung eintragen

Mit diesem Workflow wird beim Wechsel eines bestimmten Projektstatus, in unserem Beispiel vom Status “00 – Angelegt” in den Status “05 – in Vorbereitung für Kick-Off”, der im Projekt hinterlegte Projektmanager (intern) als zugeordneter Benutzer in den verknüpften Aufgaben eingetragen. Zusätzlich wird der Status der betroffenen Aufgaben auf einen vordefinierten Status gesetzt, bspw. “Zugeordnet“.
Damit die entsprechenden Schritte im Workflow korrekt ausgeführt werden können, müssen folgende Projekt- und Aufgabenstatus zuvor unter folgenden Bereichen in der VARIO Cloud angelegt sein:
Im Skript des Benutzerskript-Elements kannst Du die entsprechenden Werte an deine eigenen Statusbezeichnungen anpassen.
Zusätzlich wird eine Selektion aus der Adressverwaltung mit den folgenden Einstellungen benötigt:
Weitere Informationen zur Konfiguration von Selektionen findest Du hier.
import workItem from ‘work_item_script’;
const PROJEKT_STATUS_ANGELEGT = ’00 – Angelegt’;
const PROJEKT_STATUS_VORBEREITUNG = ’05 – in Vorbereitung für Kick-Off’;
const AUFGABE_STATUS_ZUGEORDNET = ‘Zugeordnet’;
workItem.setAction(ctx =>
{
const taskService = ctx.services.crmTaskService;
const projectService = ctx.services.crmProjectService;
const previous = ctx.parameters.previousCrmProject;
const projectId = ctx.parameters.crmProjectId;
if (!previous)
{
return;
}
const project = projectService.readById(projectId);
if (project.stateRef.label !== PROJEKT_STATUS_VORBEREITUNG)
{
return;
}
const previousState = projectService.findStateById(previous.stateRef.id);
if (previousState.label !== PROJEKT_STATUS_ANGELEGT)
{
return;
}
ctx.services.logger.info(‘Bereite verknüpfte Aufgaben vor’);
const responsibleUser = getUserFromAccountPerson(ctx, project.projectManagerOfContractor?.accountPersonRef?.id);
if (project.childRefs !== null)
{
const targetState = taskService.findStateByLabel(AUFGABE_STATUS_ZUGEORDNET);
project.childRefs.forEach(child =>
{
if (child.type === ‘TASK’)
{
const task = taskService.readById(child.id);
task.stateRef = ctx.services.utils.toApiReference(targetState);
if (responsibleUser)
{
task.assignedGroupRef = null;
task.assignedUserRef = ctx.services.utils.toApiReference(responsibleUser);
}
task.stateRef = ctx.services.utils.toApiReference(targetState);
taskService.update(task);
}
});
}
});
function getUserFromAccountPerson(ctx, accountPersonId)
{
const companyId = ctx.parameters.id;
if (!companyId || !accountPersonId)
{
return null;
}
const persons = ctx.services.accountService.getPersons(companyId);
const targetPerson = persons.find(
person => person.id === accountPersonId,
);
if (!targetPerson?.userRef?.id)
{
return null;
}
return ctx.services.userAndGroupService.findUserById(
targetPerson.userRef.id,
);
}
Die im Benutzerskript angegebenen Projekt- und Aufgabenstatus können bei Bedarf individuell angepasst werden. Dazu musst Du lediglich folgende Angaben im Skript des Benutzerskript-Elements ändern:
const PROJEKT_STATUS_ANGELEGT = ‘00 – Angelegt‘; – statt “00 – Angelegt” kannst Du hier die Bezeichnung des ersten gewünschten Projektstatus eintragen
const PROJEKT_STATUS_VORBEREITUNG = ‘05 – in Vorbereitung für Kick-Off’’; – statt “05 – in Vorbereitung für Kick-Off” kannst Du hier die Bezeichnung des zweiten gewünschten Projektstatus eintragen
onst AUFGABE_STATUS_ZUGEORDNET = ‘Zugeordnet‘; – statt Zugeordnet kannst Du hier die Bezeichnung des gewünschten Aufgabenstatus eintragen


Mit diesem Workflow kann ein beliebiger Artikel als Genschenk-Artikel automatisch mit einem vorgegebenen Rabatt zu einem Angebot hinzugefügt werden, beispielsweise für bestimmte Adressen, bei denen z. B. einen vordefinierten Umsatz erreicht wurde. Dabei kann frei definiert werden welcher Umsatz als Variable gesetzt wird und welcher Rabatt der Artikel erhalten soll.
In unserem Beispiel wird der Artikel “ACC-1083” mit einem Rabatt von 100% in Angebote für Adressen hinzugefügt, die einen Umsatz von mindestens 10.000 erreicht haben.
Der im Workflow angegebene Artikel muss mit den entsprechenden Angaben angelegt werden (als Verkaufsartikel, rabattierbar, mit Verkaufspreis usw.)
import workItem from ‘work_item_split_gateway’;
workItem.setPrepare((ctx) => {});
workItem.setSplit((ctx) => {
// Dokument laden über die übergebene documentId
const document = ctx.services.documentService.readById(ctx.availableInput.documentId);
// Zuordnung zur Adresse (Account)
const accountId = document.accountId;
// Aggregation: Summe aller Nettoverkaufspreise für diesen Account (Hier müsste man auch Rechnungen etc einschränken)
const result = ctx.services.vqlService.queryAll(
`SELECT sum(totalNetPrice) FROM document.querySalesDocuments WHERE accountId = ${accountId}`
);
const totalNetSum = result?.[0]?.[“totalNetPrice.sum”] ?? 0;
ctx.services.logger.info(result?.[0]);
ctx.services.logger.info(totalNetSum);
// Entscheidung auf Basis der Gesamtsumme
if (totalNetSum > 10000 && document.documentTypeCategory === ‘CUSTOMER_OFFER’ ) {
return ‘SHOW_USER_DECISION’; // Falls der Schwellenwert überschritten wird
}
return ‘DO_NOTHING’; // Sonst keine Aktion
});

import workItem from ‘work_item_script’;
/**
* Vorbereitung – optional (z. B. Logging-Kontext setzen)
*/
workItem.setPrepare((ctx) => {
// keine spezielle Vorbereitung erforderlich
});
/**
* Guard – Antwort auf die Benutzeraktion bestimmt, ob der Skript ausgeführt wird
*/
workItem.setGuard((ctx) => {
let userDecision = ctx.parameters[‘ADD_PRESENT’];
if (userDecision == ‘true’) {
return true;}
if (userDecision == ‘false’) {
return false;}
});
/**
* Action – lädt den Beleg, fügt eine neue Position hinzu und hinterlegt einen Price-Modifier
*/
workItem.setAction((ctx) => {
const {
documentService,
articleService,
utils,
logger,
} = ctx.services;
const { documentId } = ctx.parameters;
const document = documentService.readById(documentId);
if (!document) {
logger?.warn?.(`Dokument ${documentId} nicht gefunden – Abbruch.`);
return;
}
const articleNumber = ‘ACC-1083’; // ⚠️ hier Artikelnummer. anpassen
const article = articleService.readByNumber(articleNumber);
if (!article) {
logger?.warn?.(`Artikel ${articleNumber} nicht gefunden – Abbruch.`);
return;
}
const newLine = documentService.getNewDocumentLine();
newLine.articleId = article.id;
newLine.number = article.number;
newLine.name = article.name;
newLine.description = ‘Dein Geschenk’;
newLine.quantity = 1;
// Price-Modifier mit Factory erzeugen
const priceModifier = documentService.getNewDocumentPriceModifier();
priceModifier.name = ‘Geschenkrabatt’; // ⚠️ siehe Hinweis unten zu Feldnamen
priceModifier.value = 100; // 100%
priceModifier.modifierType = ‘DISCOUNT’;
priceModifier.valueType = ‘PERCENT’;
priceModifier.sourceType = ‘CUSTOM’;
// Statt push(): Liste in einem Schritt neu setzen (bewahrt evtl. vorhandene Modifiers)
newLine.priceModifiers = [ …(newLine.priceModifiers || []), priceModifier ];
ctx.services.logger.info(newLine);
// Position anhängen
document.lines = [ …(document.lines || []), newLine ];
// Beleg aktualisieren
const updateRequest = documentService.getUpdateDocumentRequest();
updateRequest.document = document;
documentService.update(updateRequest);
});
