FUNCTION
NAME: ap_wage_item_time_type_stamp
SYSTEM: Lohnengine
CATEGORY: Zeitarten-Ermittlung
LEVEL: Zeitdauer
GROUP: Stempelzeiten / Arbeitszeitintervalle

PURPOSE
Ermittelt die Arbeitszeit eines Mitarbeiters innerhalb eines angegebenen Zeitintervalls (z.B. 01:00–03:00, 20–22 Uhr, 22–24 Uhr, 00–06 Uhr).
Die Berechnung erfolgt auf Zeitbasis und liefert die Zeit in Sekunden.

Die Funktion kann spezielle Regeln berücksichtigen:

  • Nacht-/Spätarbeit
  • Wochenendzeiten
  • optionale Feiertagslogik
  • optionale Einbeziehung von Sonntagen

RETURN_TYPE
INTEGER — Dauer in Sekunden

PARAMETERS
employee → Mitarbeiter-ID
date_from → Startdatum des Zeitraums
date_to → Enddatum des Zeitraums
WAGE_TYPE_BLOCK_ITEM → Strukturparameter zur Steuerung der Berechnung
INCLUDE_SUNDAYS (optional) → TRUE = Sonntage einbeziehen, FALSE = ausschließen

Relevante Felder im WAGE_TYPE_BLOCK_ITEM:

  • TIME_TYPE = ‚STAMP‘ → Stempelzeit
  • FROM_TIME (optional) → Beginn Intervall (z. B. ’01:00:00′)
  • TO_TIME (optional) → Ende Intervall (z. B. ’03:00:00′)
  • IS_NEXT_DAY (optional) → TRUE, wenn Arbeit am Vortag begonnen wurde und Intervall nach Mitternacht geht
  • OPERATOR = ‚+‘ → Zeit addieren
  • UNIT → wird nicht ausgewertet
  • WEEKDAY_FILTER → optional für bestimmte Tage (z.B. 6 = Samstag, 7 = Sonntag)

SYSTEM LOGIC

  • Liest Stempelzeiten des Mitarbeiters
  • Filtert nach FROM_TIME / TO_TIME Intervall
  • Berücksichtigt IS_NEXT_DAY für Nachtarbeit
  • Summiert ggf. mehrere Intervalle
  • Optional: INCLUDE_SUNDAYS = TRUE → Sonntage einbeziehen
  • Liefert die Dauer in Sekunden

IS_NEXT_DAY – Details

  • TRUE → Zeit wird nur gezählt, wenn Arbeit am Vortag vor 00:00 begonnen hat
  • FALSE → Zeit wird nur gezählt, wenn Arbeit am selben Tag begonnen hat
  • Intervalle, die nach Mitternacht beginnen, aber nicht am Vortag gestartet wurden, liefern 0
  • Essenziell für Nachtarbeit über Mitternacht

EXAMPLES

— 1. Spätschicht 20:00–22:00 Uhr, Montag–Samstag
SELECT ap_wage_item_time_type_stamp(
%employee%, %date%, %date%,
(SELECT (1,1,’STAMP‘,NULL,’20:00:00′,’22:00:00′,FALSE,NULL,’DAY‘,NULL,NULL,NULL,NULL,’+‘,NULL,NULL,NULL,NULL,NULL,NULL,NULL,FALSE,NULL,NULL)::WAGE_TYPE_BLOCK_ITEM)
) AS Zeit_20_22;

— 2. Nachtarbeit 22:00–24:00 Uhr
SELECT ap_wage_item_time_type_stamp(
%employee%, %date%, %date%,
(SELECT (1,1,’STAMP‘,NULL,’22:00:00′,’00:00:00′,FALSE,NULL,’DAY‘,NULL,NULL,NULL,NULL,’+‘,NULL,NULL,NULL,NULL,NULL,NULL,NULL,FALSE,NULL,NULL)::WAGE_TYPE_BLOCK_ITEM)
) AS Zeit_22_24;

— 3. Nachtarbeit 00:00–06:00 Uhr, Arbeit am Vortag begonnen
SELECT ap_wage_item_time_type_stamp(
%employee%, %date%, %date%,
(SELECT (1,1,’STAMP‘,NULL,’00:00:00′,’06:00:00′,TRUE,NULL,’DAY‘,NULL,NULL,NULL,NULL,’+‘,NULL,NULL,NULL,NULL,NULL,NULL,NULL,FALSE,NULL,NULL)::WAGE_TYPE_BLOCK_ITEM)
) AS Zeit_00_06;

— 4. Nachtarbeit 00:00–06:00 Uhr, Arbeit am selben Tag begonnen
SELECT ap_wage_item_time_type_stamp(
%employee%, %date%, %date%,
(SELECT (1,1,’STAMP‘,NULL,’00:00:00′,’06:00:00′,FALSE,NULL,’DAY‘,NULL,NULL,NULL,NULL,’+‘,NULL,NULL,NULL,NULL,NULL,NULL,NULL,FALSE,NULL,NULL)::WAGE_TYPE_BLOCK_ITEM)
) AS Zeit_00_06;

— 5. Arbeitszeiten 01:00–03:00, Montag–Samstag, keine Sonntage
SELECT
(
SELECT ap_wage_item_time_type_stamp(
%employee%, CAST(‚%date%‘ AS date), CAST(‚%date%‘ AS date),
(SELECT (1,1,’STAMP‘,NULL,’01:00:00′,’03:00:00′,FALSE,NULL,’DAY‘,NULL,NULL,NULL,NULL,’+‘,NULL,NULL,NULL,NULL,NULL,NULL,NULL,FALSE,NULL,NULL)::WAGE_TYPE_BLOCK_ITEM)
)
WHERE EXTRACT(DOW FROM CAST(‚%date%‘ AS date)) != 0
)
+
(
SELECT ap_wage_item_time_type_stamp(
%employee%, CAST(‚%date%‘ AS date), CAST(‚%date%‘ AS date),
(SELECT (1,1,’STAMP‘,NULL,’01:00:00′,’03:00:00′,TRUE,NULL,’DAY‘,NULL,NULL,NULL,NULL,’+‘,NULL,NULL,NULL,NULL,NULL,NULL,NULL,FALSE,NULL,NULL)::WAGE_TYPE_BLOCK_ITEM)
)
WHERE EXTRACT(DOW FROM CAST(‚%date%‘ AS date)) != 0
) AS Zeit_01_03;

— 6. Sonntags-Kombination: alle Zeiten am Sonntag inkl. Nachtarbeit vom Samstag
SELECT
(
(SELECT ap_wage_item_time_type_stamp(
%employee%,
CAST(‚%date%‘ AS date),
CAST(‚%date%‘ AS date),
(SELECT (1,1,’STAMP‘,NULL,’00:00:00′,’23:59:00′,FALSE,7,’DAY‘,NULL,NULL,NULL,NULL,’+‘,NULL,NULL,NULL,NULL,NULL,NULL,NULL,FALSE,NULL,NULL)::WAGE_TYPE_BLOCK_ITEM)
)) +
(SELECT ap_wage_item_time_type_stamp(
%employee%,
CAST(‚%date%‘ AS date),
CAST(‚%date%‘ AS date),
(SELECT (1,1,’STAMP‘,NULL,’23:58:00′,’23:59:00′,FALSE,7,’DAY‘,NULL,NULL,NULL,NULL,’+‘,NULL,NULL,NULL,NULL,NULL,NULL,NULL,FALSE,NULL,NULL)::WAGE_TYPE_BLOCK_ITEM)
)) +
(SELECT ap_wage_item_time_type_stamp(
%employee%,
CAST(‚%date%‘ AS date),
CAST(‚%date%‘ AS date),
(SELECT (1,1,’STAMP‘,NULL,’00:00:00′,’23:59:00′,TRUE,6,’DAY‘,TRUE,NULL,NULL,NULL,’+‘,NULL,NULL,NULL,NULL,NULL,NULL,NULL,FALSE,NULL,NULL)::WAGE_TYPE_BLOCK_ITEM)
))
) AS Sonntag_Kombiniert;

EXAMPLE BEHAVIOR – ZEITINTERVALLE

1️⃣ Zeitintervall 02:00–03:00
IS_NEXT_DAY = TRUE

GearbeitetErgebnis
22:00–04:0001:00
22:00–23:0000:00
01:00–03:0000:00

IS_NEXT_DAY = FALSE

GearbeitetErgebnis
22:00–04:0000:00
22:00–23:0000:00
01:00–03:0001:00

2️⃣ Zeitintervall 22:00–04:00
IS_NEXT_DAY = FALSE

GearbeitetErgebnis
22:00–04:0006:00
22:00–23:0001:00
01:00–03:0000:00

IS_NEXT_DAY = TRUE

GearbeitetErgebnis
22:00–04:0000:00
22:00–23:0000:00
01:00–03:0000:00

BUSINESS CONTEXT

  • Nachtzuschläge
  • Spätarbeitszuschläge
  • Sonntagszuschläge (inklusive optional)
  • Abgrenzung verschiedener Zeitintervalle in der Lohnabrechnung

IMPORTANT FOR AI

  • Liefert immer Sekunden
  • IS_NEXT_DAY prüft, ob Arbeit am Vortag begonnen wurde
  • SUMs über mehrere Funktionsaufrufe für Intervalle über Mitternacht
  • INCLUDE_SUNDAYS = TRUE → KI kann Sonntage berücksichtigen
  • Keine Umrechnung in Tage oder Stunden