Urlaubstage automatisch berechnen mit Nintex Workflow 2013 – Teil 2

Im ersten Teil des Beitrags habe ich eine Möglichkeit vorgestellt, um mit Nintex Workflow bundeslandspezifische Feiertage abzurufen. In diesem zweiten Teil möchte ich euch nun zeigen, wie die Anzahl der Arbeitstage innerhalb eines fest definierten Zeitraums (in der Regel Urlaub) mit Hilfe der Feiertage berechnet werden kann.

Du hast den ersten Teil nicht gelesen? Klick hier, um Teil 1 aufzurufen.

Daten anreichern

Wir hatten zuletzt alle Feiertage in die Variable collFeiertage geschrieben. Sie beinhaltet alle Feiertage als Zeichenkette formatiert. Diese müssen in einem späteren Schritt noch umgewandelt werden, doch dazu später. Um die einzelnen Tage im Urlaub am Ende mit den Feiertagen zu verrechnen, müssen wir in einem ersten Schritt alle Urlaubstage als Datum aus dem Start- und Enddatum berechnen. Die Workflowaktionen in Nintex sehen hierfür wie folgt aus:

sharepointjungs-urlaub-in-collection

Urlaubstage in Collection speichern

  1. Für alle Urlaubstage innerhalb des Urlaubs erstellen wir eine Collection collUrlaubsdatenDesUrlaubs.
  2. Für den aktuellen Urlaubstag in der Iteration erstellen wir eine Variable dateDatumDesUrlaubs. Diese Variable belegen wir direkt mit dem Startdatum und fügen Sie der Collection hinzu.
  3. Innerhalb der Schleife addieren wir einen Tag auf das aktuelle Datum, bis der letzte Tag des Urlaubs erreicht ist (Enddatum <= dateDatumDesUrlaubs). Dieses Datum fügen wir der Collection hinzu, sodass am Ende alle Urlaubstage (inklusive Feiertage und Wochenenden) als Variable in der Collection vorhanden sind.

Achtung: In Nintex Workflow wird die Schleife ausgeführt, solange die aufgeführte Bedingung gilt. In der Schleife muss deswegen die Bedingung Enddatum > dateDatumDesUrlaubs hinterlegt werden

Feiertage (und Wochenenden) berechnen

Nachdem wir die Urlaubstage in eine Collection gespeichert haben, kommt nun sicherlich der spannendere Teil. Wie können Feiertage (und Wochenenden) herausgefiltert werden? Hier bin ich auf zwei besondere Herausforderungen gestoßen:

  1. Feiertage und Wochenenden können auf den gleichen Tag fallen
  2. Wie können die Urlaubstage am besten gefiltert werden? Sollen die Feiertage und Wochenenden einfach das jeweilige Datum aus der Urlaubscollection löschen? Oder gibt es eine bessere Lösung?

Am Ende habe ich mich entschieden, nicht mit irgendwelchen Vorgängen auf Collections zu arbeiten. Der Hauptvorteil, den ich sehe, ist der Zugriff in Nintex per Index der Collection. Sobald ein Element gelöscht wird, werden alle folgenden Elemente verschoben. Von einem Array aus der Programmierung kann man also leider nicht sprechen. Dies hat Auswirkungen auf die Schleife, sodass ich von dieser Vorgehensweise eher abraten würde. Bei der Unterscheidung zwischen Feiertagen und Wochenenden hat mir ein einfaches Flag am Ende geholfen:

Für die Berechnung der Feiertage brauchen wir zunächst folgende Variablen:

  • chBereitsAbgezogen: Variable, um Urlaubstage nicht abzuziehen, wenn bereits für einen Tag am Wochenende ein Tag abgezogen wurde
  • txtWochentag: Wochentag des aktuellen Urlaubstages
  • numVonUrlaubstagenAbziehen: Anzahl an Matches von Feiertagen und Wochenenden mit den Urlaubstagen
  • dateFeiertag: Feiertag in Datumsformat
sharepoint-jungs-fuer-jeden-urlaubstag

Für jeden Urlaubstag iterieren

Zunächst konfigurieren wir eine Schleife, die durch die im Voraus erstellte Collection mit Urlaubstagen iteriert. Für jeden neuen Urlaubstag setzen wir dann am Anfang die Variable chBereitsAbgezogen zurück und lesen den Wochentag  nach folgendem Muster aus:

fn-FormatDatum({WorkflowVariable:dateDatumDesUrlaubs},“dddd“)

Im nächsten Schritt muss der Urlaubstag jeweils auf ein Wochenende sowie auf einen Feiertag geprüft werden:

Prüfung auf Wochenende

sharepoint-jungs-wochende-berechnen

Auf Wochenende prüfen

 

Die Prüfung auf ein Wochenende ist unten dargestellt. Ist der aktuelle Urlaubstag ein Wochenende, dann wird auf die Variable numVomUrlaubAbziehen eine eins addiert. Dies ist wichtig für die finale Berechnung am Ende.  Damit am Ende kein Feiertag abgezogen wird, sperren wir das aktuelle Datum, indem die Variable chBereitsAbgezogen auf „ja“ gesetzt wird.

 

sharepoint-jungs-pruefung-auf-wochenende

Prüfung auf Wochenende

 

Prüfung auf Feiertag

sharepoint-jungs-feiertage-berechnen

Auf Feiertag prüfen

 

Für den Feiertag gestaltet sich das Ganze ähnlich. Nach der Konvertierung des Feiertags aus dem Textformat ins Datumsformat können wir jeden Feiertag gegen das aktuelle Datum prüfen. Auch hier wird bei einem Match die Variable numVomUrlaubAbziehen hochgezählt und im nachhinein das aktuelle Datum für folgende Abfragen gesperrt.

Abschließend müssen nur noch die Anzahl an Urlaubstagen (Funktion Zählen einer Collection) mit den gefundenen Matches (numVomUrlaubAbziehen) verrechnet werden. Übrig bleiben am Ende die bereinigten Urlaubstage.

Gesamturlaub berechnen

Gesamturlaub berechnen

Achtet am Ende darauf, dass wir in dem Workflow ineinander geschachtelte Schleifen nutzen! Gerade im Produktivsystem mit Safe Looping kann die Berechnung deswegen sehr lange dauern.

 

 

Leave a Comment

Your email address will not be published. Required fields are marked *