Zum Inhalt

Arbeitskalender

Der Arbeitskalender legt einmal je Konto fest, welche Tage frei sind: die gesetzlichen Feiertage des Bundeslandes, örtliche Feiertage und freie Tage, die die Firma schenkt. Prozesse zählen damit Arbeitstage, zum Beispiel beim Urlaubsantrag, die Planungstafel zeigt die freien Tage an, und ein Formular kann schon beim Ausfüllen anzeigen, wie viele Arbeitstage ein Zeitraum kostet. Feiertage werden dabei nicht gepflegt, sondern nach Regeln berechnet – für jedes Jahr, ohne Nachtragen.


Wofür wird der Arbeitskalender genutzt?

  • Urlaubsantrag: Die Tage eines Antrags werden ohne Feiertage gezählt, mit halben Tagen am Anfang oder Ende und mit den Arbeitstagen der Person (etwa Montag bis Donnerstag bei einer Vier-Tage-Woche).
  • Krankmeldung, Fortbildung, Dienstreise: Dieselbe Zählung für jede Abwesenheit, die in Arbeitstagen gemessen wird.
  • Fristen und Lieferzeiten: Prüfen, ob ein Datum ein Arbeitstag ist, oder Arbeitstage zwischen zwei Daten zählen.
  • Planungstafel: Feiertage und halbe freie Tage erscheinen als nicht verfügbare Zeit, ohne dass im Widget ein Bundesland gepflegt werden muss.
  • Formulare: Ein Anzeigefeld zeigt beim Ausfüllen „5 Arbeitstage“ und auf Wunsch „Danach bleiben 6 verfügbar“.
  • KI-Assistenten: Ein verbundener Assistent zählt Arbeitstage und nennt Feiertage und Brückentage, zum Beispiel auf die Frage „Wie viele Urlaubstage kostet der 22.12. bis 9.1. bei einer Vier-Tage-Woche?“.

Einrichten

Der Arbeitskalender wird unter Administration → System → Arbeitskalender eingerichtet, von Administratoren. Die Seite hat fünf Abschnitte:

  1. Bundesland – bestimmt die gesetzlichen Feiertage. Maßgeblich ist der Arbeitsort, nicht der Wohnort der Mitarbeiter.
  2. Örtliche Feiertage – Feiertage, die nur in Teilen des Bundeslandes gelten, als Schalter. Angezeigt werden nur die Schalter des gewählten Bundeslandes, zum Beispiel Mariä Himmelfahrt und das Augsburger Friedensfest in Bayern oder Fronleichnam in Sachsen und Thüringen.
  3. Heiligabend und Silvester – je „Arbeitstag“, „Halber Tag frei“ oder „Ganzer Tag frei“. Ein geschenkter Tag kostet keinen Urlaub.
  4. Weitere freie Tage der Firma – zum Beispiel ein Brückentag oder ein Betriebsfest am Nachmittag, mit Datum, „Jedes Jahr“ und ganzem oder halbem Tag.
  5. Vorschau – alle freien Tage des laufenden und des nächsten Jahres mit Herkunft (Gesetz, örtlich, Firma). Die Vorschau folgt jeder Änderung, auch vor dem Speichern.

Gespeichert wird mit Speichern. Ändern zwei Personen den Kalender gleichzeitig, wird die zweite Änderung abgewiesen und die aktuelle Fassung geladen.

Ohne Einrichtung

Solange kein Arbeitskalender gespeichert ist, gelten nur die bundesweiten Feiertage: Neujahr, Karfreitag, Ostermontag, Tag der Arbeit, Christi Himmelfahrt, Pfingstmontag, Tag der Deutschen Einheit, 1. und 2. Weihnachtstag. Prozesse laufen trotzdem; die Seite zeigt den Hinweis „noch nicht eingerichtet“.

Betriebsurlaub gehört nicht in den Arbeitskalender

Betriebsurlaub kostet Urlaub und wird als Abwesenheit je Mitarbeiter angelegt. In den Arbeitskalender gehören nur Tage, die keinen Urlaub kosten.


Was zählt als Arbeitstag?

Für jeden Tag eines Zeitraums gilt:

  • Der Tag zählt 1, wenn er einer der Arbeitstage der Person ist (Standard: Montag bis Freitag).
  • Ein ganzer Feiertag oder ein ganzer freier Tag der Firma zählt 0, ein halber freier Tag 0,5.
  • Ist der erste oder letzte Tag als halber Tag markiert, zählt er höchstens 0,5.

Das Ergebnis ist immer ein Vielfaches von 0,5. Fällt ein Feiertag auf einen Samstag, zählt er für eine Person mit Arbeitstagen Montag bis Freitag nicht – es war ohnehin kein Arbeitstag.

Gesetzliche Feiertage

Feiertag Datum Bundesländer
Neujahr 01.01. alle
Heilige Drei Könige 06.01. BW, BY, ST
Internationaler Frauentag 08.03. BE (ab 2019), MV (ab 2023)
Karfreitag, Ostermontag beweglich alle
Tag der Arbeit 01.05. alle
Christi Himmelfahrt, Pfingstmontag beweglich alle
Fronleichnam beweglich BW, BY, HE, NW, RP, SL
Mariä Himmelfahrt 15.08. SL; in BY je Gemeinde (Schalter)
Weltkindertag 20.09. TH (ab 2019)
Tag der Deutschen Einheit 03.10. alle
Reformationstag 31.10. BB, MV, SN, ST, TH; HB, HH, NI, SH (ab 2018)
Allerheiligen 01.11. BW, BY, NW, RP, SL
Buß- und Bettag Mittwoch vor dem 23.11. SN
1. und 2. Weihnachtstag 25./26.12. alle

Einmalige Feiertage wie der 31.10.2017 (500 Jahre Reformation) oder der 8. Mai 2020 und 2025 in Berlin sind hinterlegt, damit auch vergangene Zeiträume richtig gezählt werden.


Arbeitstage im Prozess zählen

Im Prozess stehen vier Funktionen bereit, in JSONata-Ausdrücken ebenso wie in Texten mit $(…)-Platzhaltern (siehe Template-Funktionen). Sie nutzen immer den Arbeitskalender des Kontos.

Funktion Ergebnis Beispiel
date_workdays(von, bis, arbeitstage?, halbStart?, halbEnde?) Arbeitstage als Zahl, z. B. 4.5 $fn('date_workdays', antrag.von, antrag.bis, mitarbeiter.arbeitstage, antrag.erster_tag_halb, antrag.letzter_tag_halb)
date_workdaysByYear(von, bis, arbeitstage?, halbStart?, halbEnde?) Arbeitstage je Jahr, z. B. { "2026": 4, "2027": 4 } Antrag über den Jahreswechsel in zwei Abwesenheiten teilen
date_isWorkday(datum, arbeitstage?) true oder false $fn('date_isWorkday', $now())
date_freeDays(von, bis) Liste der freien Tage [{ "date", "name", "fraction" }] Feiertage in einer E-Mail nennen

Argumente:

  • von, bis: Daten als JJJJ-MM-TT, beide Tage zählen mit. Ein Zeitstempel wird auf das Datum gekürzt. Der Zeitraum darf höchstens drei Jahre lang sein.
  • arbeitstage: die Wochentage der Person als Liste oder Text, zum Beispiel [1,2,3,4,5], "1,3,5" oder "Mo,Di,Mi". Dabei ist 1 = Montag … 6 = Samstag, 0 oder 7 = Sonntag. Fehlt die Angabe, gilt Montag bis Freitag.
  • halbStart, halbEnde: true, wenn der erste bzw. letzte Tag nur halb zählt.

Ein Beispiel für das Input-Mapping eines Schritts, der den Antrag speichert:

{
  "mitarbeiter": antrag.mitarbeiter.id,
  "von": antrag.von,
  "bis": antrag.bis,
  "tage": $fn('date_workdays', antrag.von, antrag.bis, antrag.mitarbeiter.arbeitstage, antrag.erster_tag_halb, antrag.letzter_tag_halb)
}

Ungültige Eingaben stoppen den Schritt mit einer lesbaren Meldung, zum Beispiel „Das Ende liegt vor dem Beginn. Bitte ‚Bis‘ anpassen.“ Die Reihenfolge der Daten wird deshalb am besten schon im Formular sichergestellt (siehe „Bis“ an „Von“ binden) oder mit einer Bedingung geprüft.

Gezählte Tage speichern

Die Tage werden beim Antrag gezählt und am Datensatz gespeichert. Auswertungen und Resturlaub rechnen dann nur noch mit den gespeicherten Tagen. Ändern sich später die Arbeitstage einer Person, bleiben alte Anträge unverändert.


Planungstafel

In der Planungstafel legt die Einstellung Feiertage im Reiter „Zeilen“ fest, woher die Feiertage kommen:

  • Arbeitskalender des Kontos – Feiertage, örtliche Feiertage und freie Tage der Firma aus dem Arbeitskalender; halbe Tage als halbe Verfügbarkeit. Standard für neue Tafeln.
  • Bundesland der Tafel (eingebaute Regeln) – nur die gesetzlichen Feiertage des im Widget gewählten Bundeslandes. Tafeln, die vor dem Arbeitskalender angelegt wurden, behalten diese Einstellung.
  • Keine Feiertage

Zeilen mit eigenem Bundesland (Spalte region in der Zeilen-Abfrage) bekommen die gesetzlichen Feiertage dieses Bundeslandes, wenn es vom Konto abweicht. Beim Ziehen eines Zeitraums zählt die Tafel die Arbeitstage wie der Prozess; ein halber freier Tag zählt 0,5.


Im Formular anzeigen: „kostet 5 Tage“

Der Feldtyp workday-count zeigt in einem Formular die Arbeitstage zwischen zwei Datumsfeldern, während ausgefüllt wird – mit dem Arbeitskalender, den Arbeitstagen der Person und halben Tagen. Das Feld ist nicht auf Urlaub festgelegt; es passt ebenso für Krankmeldungen, Fortbildungen oder Mietzeiträume. Die Einstellungen des Felds stehen unter Formulare → Arbeitstage.

Eigenschaft (props) Bedeutung
fromKey, toKey Schlüssel der beiden Datumsfelder (Pflicht), auch verschachtelt wie antrag.bis
halfStartKey, halfEndKey Ja/Nein-Felder: erster bzw. letzter Tag zählt halb
workdaysKey oder workdays Feld mit den Wochentagen der Person (Liste oder Text) oder feste Liste; ohne Angabe Montag bis Freitag
remainingKey Feld mit den verfügbaren Tagen, zum Beispiel Resturlaub: zeigt „Danach bleiben 6 verfügbar“, bei Überschreitung einen Hinweis
remainingByYearKey Feld mit den verfügbaren Tagen je Jahr, zum Beispiel {"2026": 8, "2027": 28}. Ein Antrag über den Jahreswechsel zieht die Tage jedes Jahres vom eigenen Jahr ab: „Danach bleiben 4 für 2026, 26 für 2027 verfügbar“; reicht ein Jahr nicht, steht ein Hinweis für dieses Jahr da. Hat das Feld einen Wert, gilt es statt remainingKey
showFreeDays Freie Tage im Zeitraum auflisten (Standard an)
label, unit, unitOne, description Texte des Feldes

Mit einem key landet die Zahl als Vorschlag im Formularergebnis. Der Prozess zählt beim Speichern trotzdem selbst mit date_workdays – dem Browser wird nicht vertraut.

[
  { "key": "von", "type": "dateInput", "defaultValue": "today", "props": { "label": "Von", "required": true } },
  { "key": "bis", "type": "dateInput", "defaultValue": "today", "props": { "label": "Bis", "required": true, "minKey": "von", "followMin": true } },
  { "key": "erster_tag_halb", "type": "toggle", "props": { "label": "Erster Tag halb" } },
  { "key": "letzter_tag_halb", "type": "toggle", "props": { "label": "Letzter Tag halb" } },
  {
    "key": "tage",
    "type": "workday-count",
    "props": {
      "label": "Urlaubstage",
      "fromKey": "von",
      "toKey": "bis",
      "halfStartKey": "erster_tag_halb",
      "halfEndKey": "letzter_tag_halb",
      "workdaysKey": "mitarbeiter.arbeitstage",
      "remainingKey": "resturlaub"
    }
  }
]

mitarbeiter.arbeitstage und resturlaub liefert der Prozess als Input des Formulars. Fehlen sie, zählt das Feld Montag bis Freitag und lässt „Danach bleiben“ weg. Wer Anträge über den Jahreswechsel erlaubt, liefert statt einer Zahl den Resturlaub je Jahr und nimmt remainingByYearKey. Bei einer externen Aufgabe ohne Anmeldung bleibt das Feld leer; der Prozess zählt ohnehin selbst.

„Bis“ an „Von“ binden

Stehen „Von“ und „Bis“ beide auf heute und der Nutzer setzt „Von“ auf einen späteren Tag, läge „Bis“ zunächst davor. Das Feld workday-count würde dann „Das Ende liegt vor dem Beginn“ melden, obwohl der Nutzer nur noch nicht fertig ist. Dafür haben die Datumsfelder (dateInput, ebenso dateTimeInput) eigene Eigenschaften:

Eigenschaft (props) Bedeutung
minKey, maxKey Schlüssel eines anderen Datumsfelds auf derselben Ebene (in einer Wiederholung: im selben Eintrag). Sein Wert ist der früheste bzw. späteste erlaubte Tag.
min, max Feste Grenze: JJJJ-MM-TT, today, today+N oder today-N; bei Datum mit Uhrzeit auch now
followMin true: Rückt das Feld aus minKey über dieses hinaus, übernimmt dieses Feld seinen Wert. Ein leeres Feld bleibt leer; wird „Von“ früher gesetzt, bleibt „Bis“, wo es ist.

Im Kalender sind Tage außerhalb der Grenzen gesperrt. Wird ein Datum außerhalb eingetippt, steht unter dem Feld zum Beispiel „Darf nicht vor ‚Von‘ liegen.“ oder „Frühestens am 05.11.2026.“, und das Formular lässt sich nicht absenden. Die Eigenschaften gelten für eigene Formulare (Formly-JSON), zum Beispiel ein eigenes Startformular; im Data Designer werden sie nicht eingestellt.


Häufige Fragen

Gelten Änderungen am Arbeitskalender rückwirkend? Nein. Gespeicherte Tage an Abwesenheiten bleiben, wie sie gezählt wurden. Neue Zählungen nutzen sofort die geänderten Einstellungen.

Gibt es mehrere Standorte mit verschiedenen Bundesländern? Je Konto gilt ein Arbeitskalender. In der Planungstafel können einzelne Zeilen über die Spalte region ein anderes Bundesland tragen; im Prozess kann das Bundesland der Person vorerst nicht einzeln angegeben werden.

Woher kommen die Feiertage? Aus Regeln in Pantarey: feste Daten, die Osterformel für bewegliche Feiertage und die Zuordnung zu den Bundesländern, einschließlich der Jahre, ab denen ein Feiertag gilt. Es muss nichts jährlich nachgetragen werden.