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) der Person, die die Buchung bei subType=MANUAL_OVERTIME angelegt hat — bei markierten Zeitbuchungen, wer sie zuletzt überstundenrelevant geändert hat, also nicht zwingend der Kontoinhaber. Reines Protokollfeld: Der 4-Augen-Check im Approve-/Reject-Pfad prüft seit ADR 0933 gegen `userId` (Kontoinhaber). Bestandsdaten vor ADR 0438 Phase 0 können hier die better-auth-Id tragen.
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.
travelMinutes
Anteil der Fahrzeit an `minutes`, nur bei subType=MANUAL_OVERTIME: `before` = Anfahrt, `after` = Rückfahrt — nach denselben Fensterregeln geschnitten wie die Leistung (`computeOvertimeCategoryMinutes`). Ausgewiesen als „davon Fahrzeit“ an Freigabe, Mitteilung und Export; die Minuten zählen 1:1 in dieselben Kategorien (`categoryMinutes`). Bei einem Nachtrag (`supplementOf`) das Plus gegenüber den genehmigten Anträgen, höchstens `minutes`. null = keine Fahrzeit beantragt oder Zeile vor ADR 0968.
supplementOf
Nachtrag: IDs der bereits GENEHMIGTEN MANUAL_OVERTIME-Transaktionen derselben Zeitbuchung (`sourceRef`), die dieser Antrag ergänzt. `minutes`, `categoryMinutes` und `travelMinutes` sind dann nur das Plus gegenüber deren BEANTRAGTEN Minuten — eine Kürzung durch die Leitung bleibt bestehen. Verhindert, dass erneutes Speichern einer genehmigten Buchung den vollen Betrag ein zweites Mal beantragt. null = Erstantrag.
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