Time Account Transaction Schema
Felder
Time Account Transaction Schema
Einzelbuchung im Stundenkonto (append-only, Hash-Kette)
accountId
Referenz auf time_account._id
userId
Denormalisiert für schnelle Per-User-Queries
date
Fachliches Datum der Buchung (nicht Insert-Zeitpunkt)
type
DAILY_BALANCE = tägliche Materialisierung (berechnet Soll/Ist, ändert Saldo NICHT direkt); PERIOD_CLOSING (als sourceType) bucht den Monats-Saldo. CORRECTION_CARRIED_FORWARD dokumentiert retroaktive Korrekturen, die nach Payroll-Export im aktuellen Monat nachgebucht werden.
CREDITDEBITCARRY_OVERPAYOUTCORRECTIONCORRECTION_CARRIED_FORWARDEXPIRYOPENING_BALANCEDAILY_BALANCEsubType
Klassifiziert PERIOD_CLOSING-Buchungen (CREDIT/DEBIT). FLEX = Saldo aus Stunden innerhalb des Gleitzeitrahmens; OVERTIME_OUTSIDE_FLEX = Stunden außerhalb des Rahmens (auf OVERTIME-Konto, ADR 0050a). MANUAL_OVERTIME = manuell beantragte/markierte Überstunden-Gutschrift, läuft PENDING durch die Freigabe-Queue (ADR 0438). War vor ADR 0438 Phase 0 undeklariert im Einsatz.
FLEXOVERTIME_OUTSIDE_FLEXMANUAL_OVERTIMEapprovalStatus
Nur bei subType=OVERTIME_OUTSIDE_FLEX befüllt, wenn das Modell `overtimeRules.outsideFlexRequiresApproval=true` setzt. PENDING = Buchung saldo-neutral bis zur Entscheidung; APPROVED = saldo-wirksam gebucht; REJECTED = bleibt saldo-neutral, geleistete Stunden im Audit erhalten. Siehe ADR 0050a.
PENDINGAPPROVEDREJECTEDapprovalDecisionAt
Zeitstempel der Approve-/Reject-Entscheidung. Phase 2 (ADR 0050a).
approvalDecisionBy
userId des Approvers/Rejectors. Phase 2 (ADR 0050a).
approvalNote
Freitext-Begründung. Pflicht bei REJECTED, optional bei APPROVED. Phase 2 (ADR 0050a).
submittedBy
userId (users._id) des Antragstellers bei subType=MANUAL_OVERTIME — Grundlage des 4-Augen-Checks im Approve-/Reject-Pfad. Bestandsdaten vor ADR 0438 Phase 0 können hier die better-auth-Id tragen; die Prüfung vergleicht deshalb tolerant gegen beide ID-Räume.
submittedAt
Zeitpunkt der Antragstellung bei subType=MANUAL_OVERTIME. Siehe ADR 0438.
creditedMinutes
Saldo-wirksam gutgeschriebene Minuten nach Freigabe — ggf. vom Teamleiter angepasst und/oder gegen `limits.maxBalanceMinutes` gekappt. Bewusst getrennt von `minutes` (beantragter Betrag): `minutes` ist Teil des gehashten Inhalts und darf nach dem Insert nicht mutiert werden (ADR 0438 / Befund B14). null = noch nicht entschieden oder Alt-Zeile vor Phase 3 (dann gilt `minutes` als gutgeschriebener Betrag).
overtimeFlags
Kategorie-Flags der markierten Zeitbuchung (1:1 vom time_record kopiert), nur bei subType=MANUAL_OVERTIME. Bewusst die drei Flags statt einer abgeleiteten Einzelkategorie — Kombinationen (z. B. Sonntags-Notdienst) bleiben verlustfrei; die Satz-/Stacking-Regel wird erst bei Auszahlung/Payroll angewendet. Siehe ADR 0438.
categoryMinutes
Beantragte Minuten je Kategorie nach den Tenant-Fensterregeln (ADR 0441), nur bei subType=MANUAL_OVERTIME. `minutes` ist die VEREINIGUNG der Fenster-Schnitte (eine Minute zählt nie doppelt als Zeit) — die Summe dieser Felder kann daher größer sein als `minutes` (So 19–21 h bei „Wochenende ganztägig" + „Überstunden ab 18": minutes=120, weekend=120, overtime=120). Grundlage der späteren kategoriegetrennten Sätze in der Payroll. null = Zeile vor ADR 0441.
windowFallback
true = die Zeitbuchung hatte keine verwertbaren Uhrzeiten, eine WINDOWS-Regel fiel deshalb auf die volle Buchungsdauer zurück (bewusster PO-Entscheid, ADR 0441). Wird in der Freigabe-Queue als Warnhinweis angezeigt — der Teamleiter korrigiert per Minuten-Feld.
minutes
Buchungsbetrag in Minuten. Positiv = Gutschrift; negativ = Abzug. Für DAILY_BALANCE: delta (actual - effective), ändert aber nicht den Saldo.
balanceAfter
Saldo nach dieser Buchung. Pflicht für saldo-wirksame Transaktionen; null für DAILY_BALANCE (nicht saldo-wirksam).
dailyBalance
Nur bei type === DAILY_BALANCE befüllt.
flexDeltaMinutes
Mehrstunden über Soll, geleistet INNERHALB des Gleitzeitrahmens. Fließt in das FLEX-Konto. Siehe ADR 0050a.
overtimeDeltaMinutes
Stunden geleistet AUSSERHALB des Gleitzeitrahmens (vor Multiplikator). Fließt in das OVERTIME-Konto. Siehe ADR 0050a.
shortfallMinutes
Minus-Stunden: max(0, Soll − Ist). Fließt als Abzug in das FLEX-Konto. Siehe ADR 0050a.
absenceType
z.B. VACATION, SICK, TIME_IN_LIEU, HOLIDAY
isHoliday
holidayRegion
holidaySurchargeMinutes
surchargeBreakdown
Vorberechneter Zuschlag für diese Buchung. Für Payroll-Export.
baseMinutes
nightMinutes
weekendMinutes
holidayMinutes
overtimeMinutes
insideFlexWindowMinutes
Ist-Minuten innerhalb des Gleitzeitrahmens (`flexWindow`). Nur bei FLEXTIME-Modellen mit gesetztem flexWindow befüllt, sonst 0.
outsideFlexWindowMinutes
Ist-Minuten außerhalb des Gleitzeitrahmens (`flexWindow`). Quelle für `dailyBalance.overtimeDeltaMinutes` — fließt ab ADR 0050a in das OVERTIME-Konto und nicht mehr in den Gleitzeit-Saldo.
surchargeAmountCents
sourceType
PERIOD_CLOSINGMANUALSYSTEMVACATION_CONVERSIONOVERTIME_TRANSFERPAYROLL_EXPORTRETRO_CORRECTIONsourceRef
collection
documentId
reason
Freitext. Pflicht bei CORRECTION und sourceType=MANUAL (Service erzwingt das).
approvedBy
userId des Genehmigers bei MANUAL/CORRECTION (4-Augen)
previousHash
SHA-256 des vorherigen Eintrags in derselben User-Kette
entryHash
SHA-256 dieses Eintrags (kanonisiert) inkl. previousHash
Keine Felder passen zum Filter.
Standard-Endpoints
Diese Resource folgt dem generischen CRUD-Vertrag der Plattform. Lesen Sie die Konventionen für Pagination, Idempotenz, Optimistic Locking und Audit. Die wichtigsten Endpoints:
GET /api/v1/time_account_transactions— Liste, paginiert + filterbarGET /api/v1/time_account_transactions/<id>— Einzelne EntityPOST /api/v1/time_account_transactions— AnlegenPATCH /api/v1/time_account_transactions/<id>— Teil-UpdateDELETE /api/v1/time_account_transactions/<id>— Soft-DeleteGET /api/v1/time_account_transactions/<id>/timeline— Audit + Aktivitäten