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
| Gearbeitet | Ergebnis |
|---|---|
| 22:00–04:00 | 01:00 |
| 22:00–23:00 | 00:00 |
| 01:00–03:00 | 00:00 |
IS_NEXT_DAY = FALSE
| Gearbeitet | Ergebnis |
|---|---|
| 22:00–04:00 | 00:00 |
| 22:00–23:00 | 00:00 |
| 01:00–03:00 | 01:00 |
2️⃣ Zeitintervall 22:00–04:00
IS_NEXT_DAY = FALSE
| Gearbeitet | Ergebnis |
|---|---|
| 22:00–04:00 | 06:00 |
| 22:00–23:00 | 01:00 |
| 01:00–03:00 | 00:00 |
IS_NEXT_DAY = TRUE
| Gearbeitet | Ergebnis |
|---|---|
| 22:00–04:00 | 00:00 |
| 22:00–23:00 | 00:00 |
| 01:00–03:00 | 00: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