# Workflow Beispiele

## Versandlieferscheine übernehmen <a href="#versandlieferscheine-ubernehmen" id="versandlieferscheine-ubernehmen"></a>

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.

{% hint style="info" %}

#### Voraussetzungen:

Damit die entsprechenden Schritte im Workflow ausgeführt werden können, muss die Belegart **Versandlieferschein** im Bereich **Einstellungen/Belege/Belegarten** vorhanden sein.
{% endhint %}

Um diesen Workflow anzulegen, gehe wie folgt vor:

{% stepper %}
{% step %}
Lege einen Workflow an und wähle als Auslöser entweder **“Vor dem Speichern von Belegen”** oder “**Übernahme von Belege**“.
{% endstep %}

{% step %}
Füge dem Start-Element den **Element “Benutzerskript”** hinzu.
{% endstep %}

{% step %}
Wechsle in den **Reiter “Skript”** des Benutzerskript-Elements und ersetze den vorhandenen Inhalt durch folgendes Skript:

<details>

<summary><mark style="color:$primary;">Skript</mark> des <strong>Benutzerskript-Elements</strong></summary>

{% code title="Benutzerskript für den Workflow " %}

```
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’;
}
});
```

{% endcode %}

</details>

<figure><img src="/files/KfM2DO2qthMzrVMahEUv" alt="Workflow Versandlieferscheine übernehmen Skript" width="563"><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Klicke auf “**Speichern**“, um das Benutzerskript-Element anzulegen.
{% endstep %}

{% step %}
Füge das **Element “Abschließen”** hinzu und verbinde die drei Elemente – **Start**, **Benutzerskript** und **Abschließen** – wie im folgenden Bild dargestellt.

<figure><img src="/files/kcsxidieNoPPNgPU9Dc8" alt="Workflow Versandlieferscheine übernehmen"><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Speichere** und **aktiviere** den Workflow, damit er bei zukünftigen Belegen automatisch ausgeführt wird.
{% endstep %}
{% endstepper %}

Der Workflow kann selbstverständlich **beliebig erweitert** und mit anderen Workflow-Pfaden und –**Schritten** **kombiniert** werden.

## Belege beim Speichern in Folgebeleg übernehmen

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 A**ngebot in einen Auftrag**. Der Aufbau des Workflows kann dabei an den **Workflow “Versandlieferscheine übernehmen”** angelehnt oder individuell erweitert und angepasst werden.

<details>

<summary><mark style="color:$primary;">Skript</mark> für das Benutzerskript-Element</summary>

{% code title=" Benutzerskript für den Workflow " %}

```
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;
}
});
```

{% endcode %}

</details>

Die in diesem Beispiel verwendeten **Belegarten “Angebot”** und **“Auftrag”** lassen sich durch **beliebige, selbst angelegte Belegarten** ersetzen, **sofern** diese in der Belegkette direkt **aufeinanderfolgen**.

<figure><img src="/files/rzdpd63LCwJoq2QjFum7" alt="Workflow Belege beim Speichern in Folgebeleg übernehmen" width="563"><figcaption></figcaption></figure>

## VQL in Workflow-Skripten

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: <kbd>**ctx.services.vqlservice**</kbd>

<details>

<summary><mark style="color:$primary;">Skript</mark> für das <strong>Benutzerskript-Element</strong></summary>

In diesem Beispiel berechnen wir die **Summe aller Nettobeträge** der Belege einer Adresse und schreiben den Wert ins Log.

Im Element **"Benutzerskript"** kannst Du folgendes **Beispiel-Skript mit VQL-Anteil** einfügen:

{% code title="Benutzerskript" %}

```
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);
});
```

{% endcode %}

Im [**Workflow-Log**](/vario-cloud-handbuch/system/workflows/protokolle-und-logs.md#protokolle-im-workflow) findest Du dann die mit dieser Beispiel-VQL errechnete **Summe**:

<figure><img src="/files/b1qu9MT4IjPIagAK6OGq" alt="VQL im Workflow-Log" width="563"><figcaption></figcaption></figure>

</details>

## Fehlermeldungen in Workflows

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.

<details>

<summary><mark style="color:$primary;"><strong>Beispiel:</strong></mark> Fehler beim Speichern eines Belegs</summary>

In diesem Beispiel wird ein Fehler innerhalb eines Workflows mit dem Auslöser **“Vor dem Speichern von Belegen”** integriert.

Im **Benutzerskript** wird dazu mit <kbd>**throw**</kbd> eine **Fehlermeldung beim Speichern des Belegs** ausgegeben, um die Speicherung aktiv zu verhindern.

Mit <kbd>**ctx.services.logger.info(...)**</kbd> kann zusätzlich eine **Log-Info** im **Workflow-Protokoll** und **Element-Log** erzeugt werden, um den Grund der Unterbrechung nachvollziehbar zu dokumentieren.

<figure><img src="/files/OlQX5MxkmYLHMTN4hKyC" alt="Fehlermeldungen in Workflows Skript" width="563"><figcaption></figcaption></figure>

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

<figure><img src="/files/twyaNxbYYOeViZTc9oX6" alt="Fehlermeldungen in Workflows" width="563"><figcaption></figcaption></figure>

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

<figure><img src="/files/Uvb6tCsk7t7Fbd9eDbsH" alt="Workflow-Fehlermeldungen im Log" width="563"><figcaption></figcaption></figure>

</details>

## Zahlungs- und Lieferbedingungen für Angebote ohne Geschäftsbeziehungen

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.

{% hint style="info" %}

#### Voraussetzungen:

Damit die im Beispiel definierte **Zahlungs- und Lieferungsmodalitäten** eingetragen werden können, müssen diese im Vorfeld unter folgenden Bereichen angelegt sein:

* **Einstellungen/Finanzen/Zahlungsmodalitäten:** Zahlungsart **“UEB”** und Zahlungsbedingung **“SN”**
* **Einstellungen/Lager/Lieferungsmodalitäten:** Versandart “**DL”** und Lieferbedingung “**FH”**

Im **Skript des Benutzerskript-Elements** kannst Du die entsprechenden Werte an Deine eigenen **Zahlungs- und Lieferungsmodalitäten** anpassen.
{% endhint %}

Um diesen Workflow anzulegen, gehe wie folgt vor:

{% stepper %}
{% step %}
Lege einen Workflow an und wähle den Auslöser **“Bei Erstellung von Belege”**.
{% endstep %}

{% step %}
Füge dem Start-Element den **Element “Abfrage”** hinzu.
{% endstep %}

{% step %}
Wechsle in den **Reiter “Skript”** des Abfrage-Elements und ersetze den vorhandenen Inhalt durch folgendes Skript:

<details>

<summary><mark style="color:$primary;">Skript</mark> des Abfrage-Element</summary>

{% code title="Skript des Abfrage-Element" %}

```
import workItem from ‘work_item_split_gateway’;

workItem.setSplit((ctx) => {
var category = ctx.parameters[‘targetCategory’];
if (category === ‘CUSTOMER_OFFER’) {
return category;
}
return ‘UNKNOWN’;
});
```

{% endcode %}

</details>

<figure><img src="/files/ylOnwgrk5hYoH4zwocXL" alt="Skript für Workflow Zahlungs- und Lieferbedingungen für Angebote ohne Geschäftsbeziehungen" width="563"><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Füge im **Reiter “Abzweigungen”** die Abzweigungen **CUSTOMER\_OFFER** und **UNKNOWN** hinzu.

<figure><img src="/files/NSqgLQE4UehRs8vW9dcT" alt="Abzweigungen für den Workflow Zahlungs- und Lieferbedingungen für Angebote ohne Geschäftsbeziehungen" width="563"><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Klicke auf “**Speichern**“, um das Abfrage-Element anzulegen.
{% endstep %}

{% step %}
Füge anschließend das **Benutzerskript-Element** hinzu und im **Reiter “Skript”** des Elements das folgende Skript:

<details>

<summary><mark style="color:$primary;">Skript</mark> des Benutzerskript-Elements</summary>

{% code title="" %}

```
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);
});
```

{% endcode %}

</details>

{% hint style="info" %}

#### Anpassung der Zahlungs- und Lieferungsmodalitäten

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\
\&#xNAN;*const DELIVERY\_TERM = ‘**FH**‘; –* statt **FH** kannst Du hier die Bezeichnung der gewünschten **Lieferbedingung** eintragen\
\&#xNAN;*const PAYMENT\_METHOD = ‘**UEB**‘; –* statt **UEB** kannst Du hier die Bezeichnung der gewünschten **Zahlungsart** eintragen\
\&#xNAN;*const PAYMENT\_TERM = ‘**SN**‘; –* statt **UEB** kannst Du hier die Bezeichnung der gewünschten **Zahlungsbedingung** eintragen
{% endhint %}
{% endstep %}

{% step %}
Füge die **Elemente “Warten (eins)” und “Abschließen”** hinzu.
{% endstep %}

{% step %}
Verbinde die Elemente **Start**, **Abfrage, Benutzerskript, Warten** und **Abschließen** miteinander sowie die Elemente **Abfrage** und **Warten (eins)**, so dass eine Darstellung wie im Bild entsteht.

<figure><img src="/files/IemwTFgsNbyPZKhv1SJ3" alt="Workflow Zahlungs- und Lieferbedingungen für Angebote ohne Geschäftsbeziehungen"><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Speichere** und **aktiviere** den Workflow, damit er bei zukünftigen Angeboten automatisch ausgeführt wird.
{% endstep %}
{% endstepper %}

## Zuweisung des Projektleiters in Aufgaben des Projekts

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**“.

{% hint style="info" %}

#### Voraussetzungen:

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:

* **Einstellungen/CRM/Aufgaben:** Aufgabenstatus **“Zugeordnet”**
* **Einstellungen/CRM/Projekte:** Projektstatus **“00 – Angelegt” und “05 – in Vorbereitung für Kick-Off”**

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:

* Die **Bezeichnung “Eigene Adresse”**
* Der **Toggle** “**Für Workflow**” im **Reiter “Allgemein”** muss aktiviert sein
* Die **Spalte** “**ID**“
* Ein **Filter** mit dem **Feld “Geschäftsbeziehung”**, der **Operation “Ist gleich”** und dem **Wert “Eigene Firma”** als **fester Wert**

Weitere Informationen zur **Konfiguration von Selektionen** findest Du [**hier**](https://help.relaunch.vario-software.de/vario-cloud-handbuch/vario-cloud-handbuch/c-units/#Einstellungen-der-C-Unit).
{% endhint %}

{% stepper %}
{% step %}
Lege einen Workflow an und wähle den Auslöser **“Nach dem Speichern von Projekten”** aus.
{% endstep %}

{% step %}
Füge dem Start-Element den **Element “Benutzerskript”** hinzu.
{% endstep %}

{% step %}
Wechsle in den **Reiter “Skript”** des Benutzerskript-Elements und ersetze den vorhandenen Inhalt durch folgendes Skript:

<details>

<summary><mark style="color:$primary;">Skript</mark> des <strong>Benutzerskript-Elements</strong></summary>

{% code title="Skript des Benutzerskript-Elements" %}

```
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,
);
}
```

{% endcode %}

</details>

{% hint style="info" %}

#### Anpassung der Projekt- und Aufgabenstatus

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\
\&#xNAN;*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\
\&#xNAN;*onst AUFGABE\_STATUS\_ZUGEORDNET = ‘**Zugeordnet**‘; –* statt **Zugeordnet** kannst Du hier die Bezeichnung des gewünschten Aufgabenstatus eintragen
{% endhint %}
{% endstep %}

{% step %}
Klicke im **Reiter “Parameter”** auf den Button <img src="/files/tpNBGR2T7Yilv1t59giX" alt="Zuweisung des Projektleiters in Aufgaben des Projekts" data-size="line">, um einen Parameter auf Basis einer Selektion anzulegen.
{% endstep %}

{% step %}
Füge einen neuen Parameter mit den **folgenden Angaben** hinzu und wähle die im Voraus angelegte **Selektion** aus.

<figure><img src="/files/imKIYFzIXUytNq1pXkDx" alt="Parameter für Workflow Zuweisung des Projektleiters in Aufgaben des Projekts"><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Klicke auf “**Speichern**“, um das Benutzerskript-Element anzulegen.
{% endstep %}

{% step %}
Füge das **Element “Abschließen”** hinzu und verbinde die drei Elemente – **Start**, **Benutzerskript** und **Abschließen** – wie im folgenden Bild dargestellt.

<figure><img src="/files/5mwGNkh9cemK7NWtHTcB" alt="Workflow Zuweisung des Projektleiters in Aufgaben des Projekts" width="563"><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Speichere** und **aktiviere** den Workflow, damit er bei zukünftigen Belegen automatisch ausgeführt wird.
{% endstep %}
{% endstepper %}

## Geschenk-Artikel zu Angeboten hinzufügen

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.

{% hint style="info" %}

#### Voraussetzungen

Der im Workflow **angegebene Artikel** muss mit den **entsprechenden Angaben** angelegt werden (als Verkaufsartikel, rabattierbar, mit Verkaufspreis usw.)
{% endhint %}

{% stepper %}
{% step %}
Lege einen Workflow an und wähle den **Auslöser “Vor dem Speichern von Belegen”** aus.
{% endstep %}

{% step %}
Füge dem Start-Element das **Element “Abfrage”** hinzu.
{% endstep %}

{% step %}
Wechsle in den **Reiter “Skript”** des Abfrage-Elements und ersetze den vorhandenen Inhalt durch folgendes Skript:

<details>

<summary><mark style="color:$primary;">Skript</mark> des Abfrage-Elements</summary>

{% code title="Skript des Abfrage-Elements" %}

```
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
});
```

{% endcode %}

</details>
{% endstep %}

{% step %}
Füge im **Reiter “Abzweigungen”** die Abzweigungen **SHOW\_USER\_DECISION** und **DO\_NOTHING** hinzu.
{% endstep %}

{% step %}
Klicke auf “**Speichern**“, um das Abfrage-Element anzulegen.
{% endstep %}

{% step %}
Füge anschließend das **Benutzeraktion-Element** hinzu und aktiviere den Toggle “**Verantwortlicher Benutzer ist ausführender Benutzer**“.
{% endstep %}

{% step %}
Stelle die folgenden Einstellungen im **Reiter “Benutzeraktion”** ein:

<figure><img src="/files/8xaV4kun3Q4QNkv5v7IR" alt="Reiter Benutzeraktionen für Workflow Geschenk-Artikel zu Angeboten hinzufügen" width="563"><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Nach dem **Speichern** des **Elements “Benutzeraktion”** füge ein **Benutzerskript-Element** hinzu.
{% endstep %}

{% step %}
Im **Reiter “Skript”** gib folgenden Skript ein und speichere das Element:

<details>

<summary><mark style="color:$primary;">Skript</mark> des <strong>Benutzerskripts-Element</strong></summary>

{% code title="Skript des Benutzerskripts-Element" %}

```
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);
});
```

{% endcode %}

</details>
{% endstep %}

{% step %}
Füge **zwei Abschließen**–**Elemente** hinzu und **verbinde** die Elemente untereinander, wie im folgenden Bild dargestellt. Die einzelnen Elemente sind anhand der entsprechenden Icons zu erkennen.

<figure><img src="/files/CLRaDzE2nHxoe3jynxXJ" alt="Workflow Geschenk-Artikel zu Angeboten hinzufügen"><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Speichere** den Workflow. Nach **Aktivierung** des Workflows wird dieser nach dem Speichern von zukünftigen Belegen ausgeführt.
{% endstep %}
{% endstepper %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://help.vario-software.de/vario-cloud-handbuch/system/workflows/workflow-beispiele.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
