Open Source Dokumentenmanagement
Dokumentation

Durchsuchbare Dokumentation aufrufen | Zurück zur Dokumentationsübersicht

Navigation: Dokumentationen agorum core > agorum core workflow 3.0 > Workflows anhand von Beispielen entwickeln


Workflow "Positionen splitten"

Mit dem folgenden Workflow splitten Sie Positionen, zum Beispiel für Rechnungen und die Kontierung.

Das gewünschte Ergebnis können Sie durch verschiedene Knoten erreichen. In diesem Workflow werden Ihnen drei Möglichkeiten gezeigt. Es verändert sich dabei nur der letzte Knoten im Workflow.

Dieser Workflow enthält ein Beispiel für die Anwendung von agorum.composite.form.element.splitList und agorum.metadata.collection.form.

Der Workflow besteht aus folgenden Knoten (in dieser Reihenfolge):

Diese Dokumentation beschreibt die Anlage und Parameter / Werte jedes Knotens. Anschließend folgt eine Beschreibung der Funktionsweise jedes Knotens, damit Sie verstehen, welche Aufgaben der jeweilige Knoten erfüllt und wie er im abgebildeten Workflow funktioniert.

Hinweis: Bei allen nachfolgend aufgeführten Bezeichnungen / Variablen / Werten handelt es sich um Beispiele. Sie müssen diese Beispiele nicht 1:1 übernehmen, sondern können eigene Bezeichnungen / Variablen / Werten verwenden.

Beispiel


In diesem Video wird eine funktionsfähige Oberfläche zum Splitten von Positionen gezeigt, die mit diesem Workflow erstellt werden kann.

Aufbau des Workflows


Übersicht: Workflow Positionen splitten

Voraussetzungen


Zum korrekten Ausführen des Workflows benötigen Sie folgende Beispieldateien:

Die Beispieldateien enthalten eine metadata-collection und Angaben zum Splitten. Sie finden die Beispiele im Ordner agorum.samples.collection.form. Dieser wird automatisch beim Aktualisieren Ihrer agorum core-Version installiert. Sie finden den Ordner in der Standardeinstellung unter:

/agorum/roi/customers/agorum.samples.collection.form/

Die Beispieldateien benötigen Sie für den Knoten metadata collection form, der in diesem Workflow zweimal Anwendung findet. Die Informationen der Dateien rufen Sie über die Parameter usage und metadata collection auf.

metadata-invoice.yml

Diese Datei bietet die Grundlage für die metadata-collection-invoice.yml. In diesem Beispiel werden die Bezeichnungen der Rechnungsdaten festgelegt. 

# -- global
_group: agorum.samples.collection.form.invoice
_prefix: agorum_samples_collection_form_invoice_
_dataPrefix: MAIN_MODULE_MANAGEMENT/customers/agorum.samples.collection.form.invoice/Data/
_csvPrefix: /agorum/roi/customers/agorum.samples.collection.form.invoice/csv/
_encoding: UTF-8

_default:
  # string, long, double, date, boolean
  type: string
  # inherited, notInherited, builtIn
  kind: notInherited

# Invoice Record Header
number:
  displayName: 'Rechnungsnummer'
date:
  displayName: 'Rechnungsdatum'
  type: date
currency:
  displayName: 'Währung'

# Invoice Supplier Information
supplier_name:
  displayName: 'Lieferantenname'

# Invoice Order Information
order_number:
  displayName: 'Bestellnummer'

order_date:
  displayName: 'Bestelldatum'
  type: date

# Invoice Item List
item_list:
  displayName: 'Positionen'
  list:
    number:
      displayName: 'Position'
    description:
      displayName: 'Beschreibung'
    quantity:
      displayName: 'Menge'
      type: double
    cost_center:
      displayName: 'Kostenstelle'
    net_price:
      displayName: 'Einzelpreis netto'
      type: double
    net_amount:
      displayName: 'Nettobetrag'
      type: double
    tax_amount:
      displayName: 'Steuerbetrag'
      type: double
    tax_rate:
      displayName: 'Steuersatz'
      type: double

# Invoice Totals
total_net_amount:
  displayName: 'Summe Nettobetrag'
  type: double
total_gross_amount:
  displayName: 'Summe Bruttobetrag'
  type: double
total_tax_amount:
  displayName: 'Summe Steuerbetrag'
  type: double
total_tax_rate:
  displayName: 'Steuersatz'
  type: double

metadata-collection-invoice.yml

In diesem Beispiel wird die metadata-collection verwendet, um durch den Einsatz des Knotens metadata collection form ein Dialog zu erzeugen. Dabei wird der obere Abschnitt (ab #test invoice) für Schritt 3 und der untere Abschnitt (ab #test invoice with split information) für die Möglichkeit 1 benötigt.

# global
_group: agorum.samples.collection.form.invoice
_prefix: agorum_samples_collection_form_invoice_

# defaults
_default:
  type: string

# test invoice
test:
  displayName: Rechnung
  
  usage:
    - form
  
  items:
    - number:
    - date:
    - currency:
    - supplier_name:
    - order_number:
    - order_date:
    - total_net_amount:
    - total_gross_amount:
    - total_tax_amount:
    - total_tax_rate:
    - item_list:
      form:
        aon:
          showAppend: true
          showRowDelete: true
      items:
        - number:
        - description:
        - quantity:
        - cost_center:
        - net_price:
        - net_amount:
        - tax_amount:
        - tax_rate:

# test invoice with split information
test_split:
  displayName: Rechnung mit Split
  
  usage:
    - form_split
  
  items:
    - number:
      form_split:
        aon:
          readOnly: true
          
    - date:
      form_split:
        aon:
          readOnly: true
          
    - currency:
      form_split:
        aon:
          readOnly: true
          
    - supplier_name:
      form_split:
        aon:
          readOnly: true
          
    - order_number:
      form_split:
        aon:
          readOnly: true
          
    - order_date:
      form_split:
        aon:
          readOnly: true
          
    - total_net_amount:
      form_split:
        aon:
          readOnly: true
          
    - total_gross_amount:
      form_split:
        aon:
          readOnly: true
          
    - total_tax_amount:
      form_split:
        aon:
          readOnly: true
          
    - total_tax_rate:
      form_split:
        aon:
          readOnly: true
          
    - item_list:
      form_split:
        aon:
          type: agorum.composite.form.element.splitList
      items:
        - number:
          form_split:
            aon:
              readOnly: true
          
        - description:
          form_split:
            aon:
              readOnly: true
              
        - quantity:
          form_split:
            aon:
              split: sum

        - cost_center:
          form_split:
            aon:
              split: diff
              
        - net_price:
          form_split:
            aon:
              readOnly: true
              
        - net_amount:
          form_split:
            aon:
              readOnly: true
              split: sum
              
        - tax_amount:
          form_split:
            aon:
              readOnly: true
              split: sum
              
        - tax_rate:
          form_split:
            aon:
              readOnly: true

Knoten „Aktuellen Benutzer zuordnen“ erstellen


Im 1. Schritt erstellen Sie den Knoten Aktuellen Benutzer zuordnen.

Aussehen des Knotens

Funktionsweise des Knotens

Dieser Knoten ist der Startknoten für den Workflow. Er weist den aktuellen Benutzer dem Workflow zu.

Knoten „Skript“ erstellen


Im 2. Schritt erstellen Sie den Knoten Skript.

Aussehen des Knotens

Parameter befüllen

Im Knoten befüllen Sie folgenden Parameter:

  1. Ersetzen Sie den Code durch den im folgenden Beispiel angegebenen Code.

Beispiel

Der einzufügende Code sieht etwa folgendermaßen aus:

/* global sc, sca, token, instance, outlets, inlet, parameters */

// add test data to token variables

Object.assign(token.variables, {
  "agorum_samples_collection_form_invoice_total_tax_amount": 19,
  "agorum_samples_collection_form_invoice_number": "Re1",
  "agorum_samples_collection_form_invoice_currency": "EUR",
  "agorum_samples_collection_form_invoice_total_net_amount": 100,
  "agorum_samples_collection_form_invoice_total_gross_amount": 119,
  "agorum_samples_collection_form_invoice_order_number": "B1",
  "agorum_metadata_collection_outlet": "next",
  "agorum_samples_collection_form_invoice_date": "2021-11-01T23:00:00.000Z",
  "agorum_samples_collection_form_invoice_item_list": [
    {
      "tax_amount": 1190,
      "number": "1",
      "quantity": 10,
      "cost_center": "K1",
      "description": "Pos 1",
      "net_price": 100,
      "net_amount": 1000,
      "tax_rate": 19
    },
    {
      "tax_amount": 1190,
      "number": "2",
      "quantity": 10,
      "cost_center": "K2",
      "description": "Pos 2",
      "net_price": 100,
      "net_amount": 1000,
      "tax_rate": 19
    }
  ],
  "agorum_samples_collection_form_invoice_supplier_name": "agorum",
  "agorum_samples_collection_form_invoice_order_date": "2021-11-01T23:00:00.000Z",
  "agorum_samples_collection_form_invoice_total_tax_rate": 19
});

// Send the token through the default outlet
token.leave('');

Funktionsweise des Knotens

Dieser Knoten erstellt ein JavaScript, in dem Beispieldaten angegeben werden. Mit diesen Beispieldaten können die folgenden Knoten weitere Funktionen ausführen.

Knoten „metadata collection form" erstellen


Im 3. Schritt erstellen Sie den Knoten metadata collection form

Aussehen des Knotens

Parameter befüllen

Im Knoten befüllen Sie folgende Parameter:

  1. Wählen Sie bei Usage den Wert form.
  2. Wählen Sie bei metadata collection den Wert Rechnung (agorum_samples_collection_form_invoice_test).

    Hinweis: Der Wert setzt sich aus dem displayName Rechnung, dem Präfix agorum_samples_collection_form_invoice_ und dem Parameter test zusammen (siehe metadata-collection-invoice.yml).

  3. Geben Sie bei Beschreibungstext eine Beschreibung ein. Im Beispiel wird die Beschreibung Bitte Rechnungsdaten erfassen verwendet.
  4. Legen Sie ein Outlet an und benennen Sie dieses. Im Beispiel wird es next genannt.
  5. Klicken Sie bei Buttons auf  .
  6. Geben Sie in der Tabelle bei Outlet next (oder den gewählten Namen) ein. 
  7. Geben Sie in der Tabelle bei Text Weiter ein.
  8. Wählen Sie Validieren?.
  9. Stellen Sie die Ausrichtung ein. In diesem Beispiel wird die Ausrichtung rechts gewählt.

Funktionsweise des Knotens

Dieser Knoten ermöglicht es, eine Oberfläche aufzurufen, die Rechnungsdaten erfasst. Es werden die Ausgangsdaten vom Knoten Skript verwendet. Diese können in der Oberfläche dann entsprechend angepasst werden. 

Im nächsten Schritt sollen die Rechnungspositionen durch die Verwendung eines weiteren Knotens gesplittet werden. Dazu gibt es drei verschiedene Möglichkeiten:

Möglichkeiten zum Splitten


Möglichkeit 1: Knoten „metadata collection form“ erstellen

Bei dieser Möglichkeit wird die Oberfläche zum Splitten von Positionen durch den Knoten metadata collection form erzeugt. Diese Möglichkeit können Sie am einfachsten anwenden, da Sie zum Ausführen dieser Möglichkeit nicht programmieren müssen. Allerdings können Sie kaum individuelle Anpassungen für die Funktionen vornehmen.

Dazu erstellen Sie den Knoten metadata collection form.

Aussehen des Knotens


Parameter befüllen

Im Knoten befüllen Sie folgende Parameter:

  1. Wählen Sie bei Usage den Wert form_split aus.
  2. Wählen Sie bei metadata collection den Wert Rechnung mit Split (agorum_samples_collection_form_invoice_test_split) aus.

    Hinweis: Der Wert setzt sich aus dem displayName Rechnung mit Split, dem Präfix agorum_samples_collection_form_invoice_ und dem Parameter test_split zusammen (siehe metadata-collection-invoice.yml).

  3. Legen Sie ein Outlet an und benennen Sie dieses. Im Beispiel wird es finish genannt.
  4. Klicken Sie bei Buttons auf  .
  5. Geben Sie in der Tabelle bei Outlet finish (oder den gewählten Namen) ein. 
  6. Geben Sie in der Tabelle bei Text Fertig ein.
  7. Wählen Sie Validieren?
  8. Stellen Sie die Ausrichtung ein. In diesem Beispiel wird die Ausrichtung Rechts gewählt.


Funktionsweise des Knotens

Dieser Knoten ermöglicht es, eine Oberfläche aufzurufen, die Rechnungspositionen splitten kann. Hierfür verbinden Sie den angelegten Knoten metadata collection form aus Schritt 3 mit diesem Knoten.

Möglichkeit 2: Knoten „UI“ erstellen

Bei dieser Möglichkeit wird die Oberfläche zum Splitten von Positionen durch ein Oberflächenskript erzeugt, das das Element agorum.metadata.collection.form verwendet. Hier werden die aguila-form und die collection-form kombiniert. Dadurch lassen sich zusätzlich Felder ergänzen. Allerdings müssen Sie hierfür programmieren.

Dazu erstellen Sie den Knoten UI.

Ausehen des Knotens


Parameter befüllen

Im Knoten befüllen Sie folgenden Parameter:

  1. Fügen Sie ein Oberflächenskript hinzu.
  2. Ersetzen Sie den in dem Oberflächenskript verwendeten Code durch den Code aus dem folgenden Beispiel.
  3. Legen Sie ein Outlet an und benennen Sie dieses. Im Beispiel wird es finished genannt.


Beispiel

Der einzufügende Code sieht etwa folgendermaßen aus:

let aguila = require('common/aguila');

let repeater = aguila.create({
  type: 'agorum.composite.form.repeater',
  labelPosition: 'top',
  elements:  [
    // form für Anweisung und Beschreibung
    {
      type: 'agorum.composite.form.basic',
      elements: [
        {
          type: 'agorum.textDisplay',
          text: 'Bitte Positionen splitten'
        },

        {
          type: 'agorum.composite.form.element.text',
          label: 'Beschreibung',
          name: 'description'
        }
      ]
    },
    // collection form für die Rechnungs-Metadaten
    {
      type: 'agorum.metadata.collection.form',
      usage: 'form_split',
      collection: 'agorum_samples_collection_form_invoice_test_split'      
    },
    // form für Buttons
    {
      type: 'agorum.composite.form.basic',
      elements: [
        {
          type: 'agorum.spacer',
          height: 24
        },
        {
          type: 'agorum.hbox',
          items: [
            {
              type: 'agorum.spacer',
              flexible: true
            },
            {
              type: 'agorum.composite.form.element.button',
              name: 'finish',
              text: 'Ende',
              icon: 'aguila-icon check'
            }
          ]
        }
      ]
    }
  ]
});

// Listen for actions on the widget
repeater.on('action', action => {
  // find out, which button has been pressed
  // and leave the ui node through the associated outlet
  switch (action.name) {
    case 'finish':
      // the form has to be valid, before the ui can be left through the "ok"-outlet
      if (repeater.validate()) {
        repeater.fire('leave', 'finish');
      }
      break;
  }  
});

repeater;


Funktionsweise des Knotens

Dieser Knoten ermöglicht es, eine Oberfläche aufzurufen, die Rechnungspositionen splitten kann. Hierfür verbinden Sie den angelegten Knoten metadata collection form aus Schritt 3 mit diesem Knoten UI.

Möglichkeit 3: Knoten „UI“ erstellen

Bei dieser Möglichkeit wird die Oberfläche zum Splitten von Positionen durch ein Oberflächenskript erzeugt, dass das Element agorum.composite.form.element.splitList verwendet. Hier haben Sie den größten Anpassungsspielraum. Dadurch können Sie die Metadaten beliebig nach Ihren individuellen Wünschen anordnen. Allerdings haben Sie hier den höchsten Programmieraufwand.

Dazu erstellen Sie den Knoten UI.

Aussehen des Knotens


Parameter befüllen

Im Knoten befüllen Sie folgenden Parameter:

  1. Fügen Sie ein Oberflächenskript hinzu.
  2. Ersetzen Sie den in dem Oberflächenskript verwendeten Code durch den Code aus dem folgenden Beispiel.
  3. Legen Sie ein Outlet an und benennen Sie dieses. Im Beispiel wird es finish genannt.


Beispiel

Der einzufügende Code sieht etwa folgendermaßen aus:

let aguila = require('common/aguila');

let PREFIX = 'agorum_samples_collection_form_invoice_';

// Create form for workflow step.
// This sample contains some common elements, feel free to use or remove them
let form = aguila.create({
  type: 'agorum.composite.form.basic',
  name: 'form',
  labelPosition: 'top',
  elements: [
    // Einen Text oben anzeigen
    {
      type: 'agorum.textDisplay',
      text: 'Bitte Positionen splitten'
    },

    {
      type: 'agorum.composite.form.element.text',
      label: 'Beschreibung',
      name: 'description'
    },

    // form selbst erstellen
    // zum Beispiel mit 2 Spalten für die Kopfdaten
    {
      type: 'agorum.hbox',
      items: [
        {
          type: 'agorum.vbox',
          flexible: true,
          items: [
            {
              name: PREFIX + 'number',
              readOnly: true
            },
            {
              name: PREFIX + 'date',
              readOnly: true
            },
            {
              name: PREFIX + 'currency',
              readOnly: true
            },
            {
              name: PREFIX + 'supplier_name',
              readOnly: true
            },
            {
              name: PREFIX + 'order_number',
              readOnly: true
            },
            {
              name: PREFIX + 'order_date',
              readOnly: true
            }
          ]
        },
        {
          type: 'agorum.vbox',
          flexible: true,
          items: [
            {
              name: PREFIX + 'total_net_amount',
              readOnly: true
            },
            {
              name: PREFIX + 'total_gross_amount',
              readOnly: true
            },
            {
              name: PREFIX + 'total_tax_amount',
              readOnly: true
            },
            {
              name: PREFIX + 'total_tax_rate',
              readOnly: true
            }
          ]
        }
      ]
    },
    {
      type: 'agorum.composite.form.element.splitList',
      name: PREFIX + 'item_list',
      template: [
        {
          name: 'number',
          readOnly: true
        },
        {
          name: 'description',
          readOnly: true
        },
        {
          name: 'quantity',
          split: 'sum'
        },
        {
          name: 'cost_center',
          split: 'diff'
        },
        {
          name: 'net_price',
          readOnly: true
        },
        {
          name: 'net_amount',
          readOnly: true,
          split: 'sum'
        },
        {
          name: 'tax_amount',
          readOnly: true,
          split: 'sum'
        },
        {
          name: 'tax_rate',
          readOnly: true
        }
      ]
    },
    

    // buttons
    {
      type: 'agorum.spacer',
      height: 24
    },
    {
      type: 'agorum.hbox',
      items: [
        {
          type: 'agorum.spacer',
          flexible: true
        },

        // buttons on right side
        {
          type: 'agorum.composite.form.element.button',
          name: 'finish',
          text: 'Ende',
          icon: 'aguila-icon check'
        }
      ]
    }
  ]
});

// Listen for actions on the widget
form.on('action', action => {
  // find out, which button has been pressed
  // and leave the ui node through the associated outlet
  switch (action.name) {
    case 'finish':
      // the form has to be valid, before the ui can be left through the "ok"-outlet
      if (form.validate()) {
        form.fire('leave', 'finish');
      }
      break;
  }  
});

form;


Funktionsweise des Knotens

Dieser Knoten ermöglicht es, eine Oberfläche aufzurufen, die Rechnungspositionen splitten kann. Hierfür verbinden Sie den angelegten Knoten metadata collection form aus Schritt 3 mit diesem Knoten UI.

Ergebnis


Sie können Rechnungspositionen anpassen und diese anschließend über eine der drei Möglichkeiten splitten.