HR & Payroll
Das HR-Modul deckt den Mitarbeiter-Lebenszyklus ab — Stammdaten, Skills, Abwesenheiten, Zertifikate, Onboarding und Offboarding. Payroll integriert sich mit DATEV LODAS.
Resources – HR
| Resource | Pfad | Permission-Präfix |
|---|---|---|
| Mitarbeiter-Profile | /api/v1/employee_profiles | employee_profile |
| Zertifikate | /api/v1/employee_certifications | employee_certification |
| Personalakte | /api/v1/employee_documents | employee_document |
| Skill-Definitionen | /api/v1/skill_definitions | skill_definition |
| Urlaubs-Anträge | /api/v1/vacation_requests | vacation_request |
| Krankmeldungen | /api/v1/sick_leaves | sick_leave |
Resources – Schichten & Arbeitszeit
| Resource | Pfad | Permission-Präfix |
|---|---|---|
| Schicht-Templates | /api/v1/shift_templates | shift_template |
| Schicht-Zuweisungen | /api/v1/shift_assignments | shift_assignment |
| Schicht-Constraints | /api/v1/shift_constraint_sets | shift_constraint_set |
| Schicht-Präferenzen | /api/v1/shift_preferences | shift_preference |
| Tausch-Anfragen | /api/v1/shift_swap_requests | shift_swap_request |
| Fairness-Verlauf | /api/v1/shift_fairness_records | shift_fairness_record |
| Arbeitszeit-Modelle | /api/v1/working_time_models | working_time_model |
| Arbeitszeit-Zuweisungen | /api/v1/working_time_assignments | working_time_assignment |
Resources – Payroll
| Resource | Pfad | Permission-Präfix | Sequenz |
|---|---|---|---|
| Lohnabrechnungen | /api/v1/payroll_records | payroll_record | PAY- |
| Abrechnungs-Perioden | /api/v1/payroll_periods | payroll_period | — |
| Rückforderungs-Settings | /api/v1/payroll_recovery_configs | payroll_recovery_config | — |
| Export-Logs | /api/v1/payroll_exports | payroll_export | — |
| LODAS-Settings | /api/v1/payroll_lodas_settings | payroll_lodas_settings | — |
| Payroll-Audit | /api/v1/payroll_audit_events | payroll_audit_event | — |
Schemas
Employee
Schema for validating employee profile entities (Personalstammdaten)
userId
User UUID (optional link to users collection)
firstName
First name (Vorname) — used when no user is linked
lastName
Last name (Nachname) — used when no user is linked
employeeNumber
Auto-generated employee number (e.g. MA-2026-00001)
email
Work email address. Used as the matching key for telephony integrations (Starface userlist → starfaceAccountId) so employees WITHOUT a linked user account can still be attributed in call analytics. Plain string (no strict format validation) to keep imports forgiving.
orgUnitId
Primary org unit UUID (legacy — use primaryOrgUnitId going forward, ADR 0036b)
primaryOrgUnitId
Arbeitsrechtlich maßgebliche Org-Unit (ADR 0036b). Wird vom Working-Time-Resolver für die Hierarchie-Auflösung benutzt. Bei Matrix-Orgs: eindeutig die primäre. Falls nicht gesetzt, fällt der Resolver auf orgUnitId zurück.
managerId
Direct manager user UUID
employmentType
Type of employment (Beschäftigungsart)
FULL_TIMEPART_TIMEMINI_JOBWORKING_STUDENTINTERNFREELANCER employmentStatus
Current employment status
ACTIVEONBOARDINGON_LEAVEOFFBOARDINGTERMINATED hireDate
First day of employment (ISO 8601 date: YYYY-MM-DD)
probationEndDate
End of probation period (Probezeit)
terminationDate
Last day of employment
terminationReason
Reason for termination
vacationDaysPerYear
Annual vacation entitlement in days
vacationDaysRemaining
Remaining vacation days for current year
vacationDaysCarryOver
Carried over vacation days from previous year (Resturlaub)
weeklySchedule
Per-weekday work schedule (Arbeitszeitplanung)
day
ISO weekday (1=Mon, 7=Sun)
startTime
Work start time (e.g. "08:00")
endTime
Work end time (e.g. "17:00")
breakMinutes
Break duration in minutes
workingTimeModelId
Reference to working_time_model entity
skills
Structured skill entries with levels
skillId
UUID of the skill definition
level
Proficiency level. INTERESTED is a level-0 interest marker (no proficiency, no XP, never satisfies a scheduling minimum). BEGINNER..EXPERT is the legacy 4-tier enum kept in sync with currentLevel. Prefer currentXp/currentLevel for new proficiency logic.
INTERESTEDBEGINNERINTERMEDIATEADVANCEDEXPERT currentXp
Accumulated XP for this skill. Awarded on ticket/task completion or via manual grant. Drives currentLevel.
currentLevel
Numeric level (1–400) across 4 tiers of 100 levels each. Derived from currentXp on XP award, but stored for efficient queries.
verifiedAt
When the skill was last verified
verifiedBy
User UUID of the person who verified the skill
source
How the skill was assigned. PERFORMANCE_REVIEW marks interests carried over from a completed Mitarbeitergespräch.
SELF_ASSESSEDMANAGER_ASSIGNEDCERTIFICATIONAUTO_DETECTEDPERFORMANCE_REVIEW addedAt
When the skill entry was first added
updatedAt
When the skill entry was last updated (level change, re-verification)
languageSkills
Spoken/written languages with CEFR proficiency level, used for language-aware ticket dispatch
code
ISO 639-1 language code
aaabaeafakamanarasavayazbabebgbhbibmbnbo brbscacechcocrcscucvcydadedvdzeeeleneoeseteufafffifjfofrfygagdglgngugvhahehihohrhthuhyhziaidieigiiikioisitiujajvkakgkikjkkklkmknkokrkskukvkwkylalblglilnloltlulvmgmhmimkmlmnmrmsmtmynanbndnengnlnnnonrnvnyocojomorospapiplpsptqurmrnrorurwsascsdsesgsiskslsmsnsosqsrssstsusvswtatetgthtitktltntotrtstttwtyugukuruzvevivowawoxhyiyozazhzu level
CEFR proficiency level (A1–C2) or NATIVE
A1A2B1B2C1C2NATIVE addedAt
updatedAt
karma
ADR 0224: running karma total (engagement/fairness score). Server-managed: awarded on verified task completion when tenant.features.karmaEnabled. Audit trail in karma_ledger.
skillUpdateLog
Audit trail of automatic skill-level changes triggered by survey responses or other sources
responseId
survey_response UUID that triggered this update (idempotency key)
source
satisfaction-surveymanualcertificationticket-closetask-donemanual-grantsurveynull phone
Personal phone number
dateOfBirth
Date of birth
emergencyContactName
Emergency contact name
emergencyContactPhone
Emergency contact phone number
timeZone
IANA-Zeitzone (z.B. "Europe/Berlin"). Override gegenüber org_unit.timeZone / tenant default. Wird u.a. für Zuschlag-Zeitfenster und DST-Handling genutzt.
holidayRegion
ISO 3166-2 Feiertagsregion (z.B. "DE-NW"). Override gegenüber org_unit.holidayRegion / tenant.settings.defaultHolidayRegion. Relevant für MA im Homeoffice in anderem Bundesland.
mentorUserId
Assigned mentor for trainees / juniors
isMentor
Marked as available mentor in the picker
isSuitableForInterns
Marked as senior who can supervise intern-grade work
defaultSubstituteUserId
Fallback user for sick-leave auto-reassign
isApprentice
Auszubildender: befindet sich in der Ausbildung und hat noch keinen Abschluss. Dient als Gate für den (separat gebauten) Berichtsheft-/Ausbildungsnachweis-Bereich, der nur für Auszubildende sichtbar ist.
isAusbilder
Markiert den Mitarbeiter als Ausbilder (kann Auszubildende ausbilden / ist im Ausbilder-Picker eines Auszubildenden wählbar).
ausbilderEmployeeId
employee_profiles-UUID des diesem Auszubildenden zugewiesenen Ausbilders. Referenziert einen Mitarbeiter (nicht user), damit auch Ausbilder ohne Login zuordenbar sind.
legalEntityId
Rechtliche Einheit (party UUID — typically the operating company, e.g. ITF or Codemeta).
workLocationId
Primary work location (asset/site UUID; references the company address/site).
qualification
Berufs- oder Studienabschluss. `kind: "ausbildung"` referenziert einen Eintrag aus dem BIBB-Verzeichnis (apps/api/src/data/ausbildungsberufe-2026.jsonl); `kind: "hochschule"` erfasst Abschlussgrad + freies Studienfach.
kind
ausbildunghochschule ausbildungName
Berufsbezeichnung aus dem BIBB-Verzeichnis (z. B. "Tierwirt/Tierwirtin")
fachrichtung
Fachrichtung der Ausbildung, falls anwendbar (z. B. "Imkerei")
berufsgattungCode
BIBB-Berufsgattung (5-stellige Nummer)
kategorie
Kategorie aus dem BIBB-Verzeichnis (s. Reference-Data-Endpoint)
ausbildung-bbigausbildung-ausserhalb-bbigausbildung-gesundheit-bundesrechtausbildung-gesundheit-landesrechtausbildung-zustaendige-stelleumschulung-zustaendige-stelle hochschulabschluss
Akademischer Abschlussgrad
BACHELORMASTERDIPLOMMAGISTERSTAATSEXAMENPROMOTIONHABILITATIONBERUFSAKADEMIEOTHER fach
Studienfach (Freitext, z. B. "Wirtschaftsinformatik")
safetyRoles
Arbeitsrechtliche Sicherheitsrollen (Ersthelfer, Brandschutzhelfer, Sicherheitsbeauftragter, Datenschutzbeauftragter, ...). Mehrfachzuweisung erlaubt; freie Werte sind zugelassen, damit nicht-katalogisierte Rollen gepflegt werden können.
key
Stabiler Bezeichner (für Standardrollen einer aus SAFETY_ROLE_CATALOG; für Sonstige der frei eingegebene Rollenname).
assignedAt
Datum der Bestellung / Beauftragung
validUntil
Gültig bis — triggert escalation_rule-Reminder vor Ablauf
notes
educationCertificates
Studienbescheinigungen / Ausbildungsnachweise. The actual file lives in the DMS; this is metadata + expiry.
_id
title
issuer
issuedAt
validUntil
Ablaufdatum — when set, an escalation_rule reminder fires before expiry.
documentId
Reference to dms_document holding the certificate file
assignedAssetIds
UUIDs of assets handed out to the employee (laptop, phone, keycard, …). Asset entity carries the canonical assignment record; this is a denormalised quick-access list.
idDocumentVerifications
Append-only Liste der HR-Sichtprüfungen des Ausweisdokuments. Jede Verifikation speichert wer und wann geprüft hat — Dokumentennummer wird DSGVO-konform nicht erfasst.
_id
verifiedAt
Zeitpunkt der Sichtprüfung (server-issued)
verifiedBy
User-UUID der prüfenden HR-Person
verifiedByName
Anzeigename zum Zeitpunkt der Prüfung (Snapshot)
documentType
Dokumenttyp zum Zeitpunkt der Prüfung (PERSONALAUSWEIS, REISEPASS, AUFENTHALTSTITEL, …) — Snapshot, damit Typänderungen die Historie nicht verfälschen.
documentCountry
ISO 3166-1 alpha-2 Ausstellerstaat zum Zeitpunkt der Prüfung — Snapshot.
notes
encryptedFields
Map of field-name → encrypted envelope (AES-256-GCM, employee DEK). See EMPLOYEE_PROFILE_ZK_FIELDS for the registered field set and visibility category.
starfaceAccountId
Starface ACCOUNT_ID this employee maps to (matched by email).
starfaceLoginId
Starface LOGIN_ID (informational).
starfaceInternalNumber
Starface primary internal number (informational).
starfaceExternalNumber
Starface primary external number (informational).
notes
Free-text notes for HR admin
Keine Felder passen zum Filter.
Certification
Tracks formal certifications and qualifications for scheduling (Zertifikate)
skillId
UUID of the skill_definition this certification validates
issuedAt
Certification issue date
expiresAt
Expiry date. Null = does not expire
certifyingBody
Issuing authority (e.g. "DGUV", "Ärztekammer Berlin")
certificationNumber
Certificate ID/number
documentId
UUID of the DMS document with the certificate scan
status
VALIDEXPIRING_SOONEXPIREDREVOKED notes
Keine Felder passen zum Filter.
Document
Schema for validating employee document entities (Personalakte-Dokumente)
employeeId
UUID of the employee profile
userId
User UUID of the employee
title
Document title
category
Document category for the personnel file
CONTRACTCERTIFICATESICK_NOTEEVALUATIONTRAININGID_DOCUMENTOTHER fileId
UUID of the uploaded file
fileName
Original file name
mimeType
MIME type of the file
validFrom
Document validity start date
validUntil
Document expiry date (for certification tracking)
isConfidential
Whether only HR admins can access this document
notes
Additional notes
Keine Felder passen zum Filter.
Skill
Schema for validating skill definition entities (Skill-Katalog)
name
Display name of the skill (e.g. "Windows Server", "Netzwerktechnik")
slug
URL-safe slug, also used as tag value for dispatch compatibility
parentId
Parent skill UUID for tree nesting. Null = root node. Arbitrary depth allowed.
category
Legacy flat category. Prefer parentId hierarchy. Auto-computed from root ancestor name.
description
Detailed description of the skill
isActive
Whether this skill is currently active and selectable
schedulingCategory
Category for scheduling qualification matching
TECHNICALSOFTCERTIFICATIONLANGUAGEOTHERnull requiresCertification
If true, valid employee_certifications entry required for scheduling
requiredForScheduling
If true, this skill can be required in shift template position slots
minimumLevelForScheduling
Minimum proficiency level required when used in scheduling
BEGINNERINTERMEDIATEADVANCEDEXPERTnull isBinary
If true, skill is presence-only (have it or not) — e.g. formal qualifications like Rettungssanitäter. No XP/level tracked; auto-XP awards skip this skill.
impliedSkillIds
Skills that are automatically covered when an employee holds this skill. Example: Notfallsanitäter implies Rettungssanitäter. Only meaningful for isBinary=true; targets must also be isBinary. Cycles are rejected. Resolved transitively by the solver and replacement search.
aiManaged
If true, automatic XP awards from ticket/task completion and survey-driven level steps are applied to this skill. If false, the skill level is curated manually only (certifications, manager assignment, self-assessment). Ignored when isBinary is true.
assetMatchRules
Rules that auto-derive this skill as a ticket requirement from a customer's assets (CMDB). When a ticket is dispatched, the customer's assets are matched against these rules; each match adds this skill to the ticket's requiredSkills (source ASSET_DERIVED), so dispatch prefers technicians who hold it. Empty = the skill is never asset-derived. Example: a "WatchGuard" skill with a rule { manufacturers: ["WatchGuard"], assetSchemaPatterns: ["asset.network.firewall"] }.
manufacturers
Manufacturer names matched case-insensitively (substring) against the asset manufacturer (or its asset_template manufacturer). Empty = any manufacturer.
assetSchemaPatterns
Asset schema prefixes matched via prefix against the asset schema, e.g. "asset.network.firewall" or "asset.network" (all network assets). Empty = any asset type.
minimumLevel
Minimum proficiency the derived requirement demands when this rule matches. Null = any level.
BEGINNERINTERMEDIATEADVANCEDEXPERTnull Keine Felder passen zum Filter.
Vacation
Schema for validating vacation request entities (Abwesenheitsanträge)
employeeId
ADR 0123 — employee_profile._id der freistellungsbedürftigen Person. Kanonischer Schlüssel, funktioniert auch ohne verknüpften Login.
requesterId
User UUID des Antragstellers — denormalisiert für Self-Service-Reads. Null bei HR-erfassten Anträgen für Mitarbeitende ohne Login-Account.
approverId
User UUID of the designated approver
substituteId
User UUID of the substitute during leave (Vertretung)
startDate
First day of leave (ISO 8601 date: YYYY-MM-DD)
endDate
Last day of leave (ISO 8601 date: YYYY-MM-DD)
daysRequested
Number of working days requested (0.5 for half-day)
halfDayStart
Whether the first day is a half day (afternoon only)
halfDayEnd
Whether the last day is a half day (morning only)
leaveType
Abwesenheitsart. Nur VACATION zieht vom Jahresurlaub ab. ADR 0036b: TIME_IN_LIEU (Gleitzeit, FLEX), OVERTIME_COMPENSATION (Überstunden, OVERTIME), LONG_TERM_WITHDRAWAL (Langzeitkonto). Gesetzliche Freistellungen: VOCATIONAL_SCHOOL, EDUCATION_LEAVE, QUARANTINE, PAID_RELEASE, CARE_LEAVE.
VACATIONSPECIAL_LEAVECOMPENSATORYUNPAIDOTHERTIME_IN_LIEUOVERTIME_COMPENSATIONLONG_TERM_WITHDRAWALVOCATIONAL_SCHOOLEDUCATION_LEAVEQUARANTINEPAID_RELEASECARE_LEAVE specialLeaveReason
Anlass für SPECIAL_LEAVE: WEDDING (Hochzeit), BEREAVEMENT (Todesfall naher Angehöriger), CHILD_BIRTH (Geburt eigenes Kind), RELOCATION (Umzug), JUBILEE (Dienstjubiläum), OTHER (sonstiger Anlass).
nullWEDDINGBEREAVEMENTCHILD_BIRTHRELOCATIONJUBILEEOTHER accountTransactionId
UUID der time_account_transaction, die bei Genehmigung des Freizeitausgleichs gebucht wurde. Nur bei leaveType ∈ {TIME_IN_LIEU, OVERTIME_COMPENSATION, LONG_TERM_WITHDRAWAL}.
status
Current request status
PENDINGAPPROVEDREJECTEDWITHDRAWN reason
Reason for the leave request
approverComment
Approver comment on approval or rejection
eventId
UUID of the CalendarEvent created on approval
Keine Felder passen zum Filter.
Sick-Leave
Schema for validating sick leave entities (Krankmeldungen)
employeeId
UUID of the employee profile (ADR 0123 — kanonisch)
userId
User UUID des erkrankten Mitarbeitenden — denormalisiert. Null bei Mitarbeitenden ohne Login-Account (HR erfasst dann manuell).
startDate
First day of sick leave (ISO 8601 date: YYYY-MM-DD)
endDate
Last day of sick leave (null = open-ended)
status
Current sick leave status
REPORTEDCERTIFICATE_RECEIVEDEAU_CONFIRMEDCLOSED type
Type of sick leave
ILLNESSCHILD_SICKWORK_ACCIDENTREHABILITATION certificateFileId
UUID of the uploaded AU certificate file
eauReference
Reference from electronic AU system (eAU)
reportedAt
When the sick leave was reported
reportedBy
User UUID of the person who reported the sick leave (self or manager)
workingDaysLost
Calculated number of working days lost
eventId
UUID of the calendar event created for this sick leave
notes
Additional notes
autoReassignProcessedAt
When sick-leave auto-reassign of open tickets was processed
autoReassignedTicketCount
How many tickets were auto-reassigned from the sick employee
Keine Felder passen zum Filter.
Shift-Assignment
A concrete staffing entry: one employee occupies one role-slot of one coverage-demand using one shift-block on one date. Together with the coverage-demand.coverageWindow, the set of assignments determines whether the demand is fully covered.
employeeId
UUID of the employee profile — canonical key (ADR 0122). Shifts can be planned for employees without a linked user account (Aushilfen, Subunternehmer, Azubis ohne IT-Konto).
userId
Linked user UUID (denormalised from `employee_profile.userId` for fast personal-calendar lookups). `null` when the employee has no login. Writers must keep it in sync.
shiftBlockId
UUID of the shift-block (time bucket). Required — the time + ArbZG semantics of the assignment come from this block.
coverageDemandId
UUID of the coverage-demand this assignment fills. Null for ad-hoc shifts that do not belong to any demand (e.g. Springer, training time blocked off as a shift).
roleSlotId
When coverageDemandId is set, this is the slotId of the role within coverage-demand.roles[] that the employee occupies. Null when coverageDemandId is null.
date
Date of the shift (YYYY-MM-DD)
startTimeOverride
Override start time for this specific assignment
endTimeOverride
Override end time for this specific assignment
status
Assignment status
PLANNEDCONFIRMEDSWAPPEDCANCELLEDOPEN swappedWithUserId
User UUID if this shift was swapped
notes
schedulePeriodId
UUID of the schedule period this assignment belongs to
solverGenerated
True if generated by the scheduling solver (CP-SAT / greedy fallback). Manually-created or manually-edited assignments stay false.
aiExplanation
LLM-rendered German-language explanation of why the solver made this assignment (generated post-solve by schedule-evaluation.service via Claude).
preferenceScore
Normalised employee preference for this employee × shift-block combination, in [-1, 1]. Mapping: LOVE=1.0, PREFER=0.7, NEUTRAL=0.5, AVOID=0.1, NEVER=-1.0. NEVER is a soft penalty, not a veto — the solver may still assign a NEVER block when no feasible alternative exists (such cases are reported in qualityReport.neverViolations).
confirmedByEmployee
confirmedAt
Keine Felder passen zum Filter.
Constraints
Configurable labor law constraint sets (Tarifverträge)
name
E.g. "TVöD 2024", "TV-Ärzte 2024", "Haustarif Muster GmbH"
description
orgUnitId
Null = applies to all org units in this tenant
maxDailyHours
Max working hours per day (ArbZG § 3 default: 10)
maxWeeklyHours
Max working hours per week (ArbZG default: 48)
minRestHours
Min rest between shifts in hours (ArbZG § 5 default: 11)
maxConsecutiveDays
Max consecutive working days
nightShiftCompensationRule
Night shift compensation configuration
holidayCompensationRule
Holiday shift compensation configuration
onCallRatio
On-call attendance time ratio (Bereitschaftsdienst Anrechnungsquote, e.g. 0.25)
isActive
extraRules
Additional free-text rules, LLM-interpretable for conflict detection
Keine Felder passen zum Filter.
Preference
Schema for employee shift preferences (Wunschzettel)
status
DRAFTSUBMITTEDLOCKED submittedBy
llmParseConfirmedBy
shiftPreferences
colleaguePreferences
References target employees by employeeId (not userId) so colleagues without a user account can be picked.
timePreferences
preferMornings
preferEvenings
preferNights
preferWeekends
avoidWeekends
maxShiftsPerWeek
preferBlocks
Prefer consecutive shift blocks
avoidShortChangeovers
Avoid late-then-early sequences beyond the legal ArbZG §5 minimum
tradeoffs
Conditional wishes (if-then tradeoffs)
ifCondition
thenAccept
customWishes
Free-text wishes, parsed by LLM
preferenceWeights
Relative importance of each preference dimension (1-10)
availability
shiftType
colleague
time
submittedAt
lockedAt
lockedBy
llmParseResult
Parsed structured constraints from customWishes
llmParseConfirmedAt
When employee confirmed the LLM parse result
Keine Felder passen zum Filter.
Swap
Schema for shift exchange requests between employees (Schichttausch)
requesterId
User UUID of requesting employee
requesterAssignmentId
UUID of the shift assignment to swap away
targetUserId
Target employee UUID. Null = open marketplace request
targetAssignmentId
Target assignment UUID. Null until counterpart selects a shift
status
PENDING_MATCHPENDING_TARGET_ACCEPTPENDING_APPROVALAPPROVEDREJECTEDCANCELLEDEXPIRED requesterNote
managerNote
approvedById
approvedAt
rejectedReason
expiresAt
When the open request expires automatically
Keine Felder passen zum Filter.
Fairness
Per-period fairness tracking for an employee (Fairness-Ledger)
schedulePeriodName
generatedBy
totalShiftsAssigned
desirableShiftCount
undesirableShiftCount
neutralShiftCount
weekendShiftCount
holidayShiftCount
nightShiftCount
onCallShiftCount
totalScheduledHours
contractualHours
overtimeHours
Positive = overtime, negative = undertime
preferenceScore
How well preferences were satisfied (0-100)
fairnessScore
Composite fairness score (0-100, higher = more fairly treated)
neverViolationCount
colleaguePreferenceSatisfied
colleaguePreferenceViolated
qualificationUtilization
How often qualified for assigned shifts (0-100)
Keine Felder passen zum Filter.
WT-Model
Policy-Vorlage für Arbeitszeitberechnung (ADR 0036b)
name
modelType
Basistyp. TRUST entfernt (BAG 2022 / EuGH CCOO — Zeiterfassungspflicht).
FIXEDFLEXTIMESHIFTANNUAL_HOURSKAPOVAZPROJECT_BASED isDefault
isActive
workingDays
defaultWorkingHoursPerDay
weeklyHoursTarget
Modell-Wochensoll (Stunden). Genutzt, wenn das Modell direkt in Wochenstunden definiert ist (z. B. „30h/Woche, Verteilung egal"). Wird durch `working_time_assignment.weeklyHours` pro Mitarbeiter übersteuerbar.
monthlyHoursTarget
Modell-Monatssoll (Stunden). Genutzt für Mitarbeiter, deren Vertrag in Monatsstunden geführt wird (z. B. Minijob mit „40h/Monat"). Sollberechnung skaliert linear über die Periodenlänge.
dailyHoursTargets
Tagesindividuelles Stundensoll pro ISO-Wochentag (1=Mo..7=So). Fehlende Tage gelten als frei. Wenn gesetzt, überschreibt dieses Feld `defaultWorkingHoursPerDay` für den jeweiligen Tag und liefert das Wochensoll (Σ hours). Orthogonal zu `fixedSchedule` (das zusätzlich Start/Endzeit vorgibt).
planningDeadline
notes
fixedSchedule
Tagesfester Plan (nur bei modelType FIXED). Pro ISO-Wochentag.
day
startTime
endTime
breakMinutes
breakStartTime
breakEndTime
shiftTypes
Schichttypen (nur bei modelType SHIFT).
id
name
startTime
endTime
breakMinutes
breakStartTime
breakEndTime
prepTimeMinutes
Rüst-/Umkleidezeit (BAG-Rspr.), zählt als Arbeitszeit
surchargePercent
crossesMidnight
shiftRotation
Rotationsmuster für SHIFT-Modelle.
pattern
Sequenz von shiftTypes[].id oder "OFF"
cycleWeeks
annualHours
Jahresarbeitszeitkonto (nur bei modelType ANNUAL_HOURS).
targetHours
Jahressoll in Stunden (z.B. 1720)
quarterlyBalancingRequired
kappiRules
KAPOVAZ-Regeln (Abrufarbeit, § 12 TzBfG).
minWeeklyHours
§ 12 TzBfG: mind. 10h wenn nicht vereinbart
maxWeeklyHours
callInNoticePeriodHours
§ 12 TzBfG: mind. 4 Tage Vorlauf
minConsecutiveHours
§ 12 TzBfG: mind. 3h pro Einsatz
projectRules
Projektbasierte Arbeitszeit.
maxDailyHours
maxWeeklyHours
requiresProjectRef
Zeitbuchung braucht Projekt-Referenz
overtimeRules
flexOvertimeAutoCredit
outsideFlexRequiresApproval
outsideFlexMultiplier
weekendMultiplier
holidayMultiplier
overtimeSurchargePercent
Zuschlag auf Mehrarbeit über Soll (ADDITIVE oben drauf)
maxFlexBalanceMinutes
monthlyCarryOverLimitMinutes
breakRules
Pausenregeln (ArbZG § 4). Gilt auf allen Modelltypen.
after6HoursMinutes
Pflichtpause bei >6h Arbeit (ArbZG: ≥30 Min)
after9HoursMinutes
Pflichtpause bei >9h Arbeit (ArbZG: ≥45 Min)
minSegmentMinutes
Mindestdauer einer einzelnen Pause (ArbZG: 15 Min)
maxConsecutiveWorkMinutes
Max. ununterbrochene Arbeit ohne Pause (ArbZG: 6h = 360 Min)
restPeriod
Ruhezeit zwischen Schichten (ArbZG § 5). Gilt für alle Modelle.
minHoursBetweenShifts
Reguläre Mindestruhezeit in Stunden (ArbZG § 5 Abs. 1)
reducedToHours
Reduzierte Ruhezeit (ArbZG § 5 Abs. 2: bestimmte Branchen)
reducedAllowed
Ob reduzierte Ruhezeit (z.B. Gastgewerbe, Krankenhäuser) erlaubt ist
maxWorkHours
Höchstarbeitszeit (ArbZG § 3). Gilt für alle Modelle.
maxDailyHours
Tageshöchstarbeitszeit (ArbZG: 8h regulär, 10h max)
maxWeeklyHoursAveraged
Wochenhöchstarbeitszeit im Durchschnitt (ArbZG: 48h)
averagingPeriodMonths
Ausgleichszeitraum für Wochendurchschnitt (ArbZG: 6 Monate)
nightWorkLimits
Nachtarbeitsgrenzen (ArbZG § 6). Nur bei Modellen mit Nachtschicht.
maxHoursPerNight
Max. Stunden pro Nachtschicht (ArbZG § 6 Abs. 2)
averagingPeriodMonths
nightWindowStart
Beginn Nachtzeitfenster (ArbZG § 2 Abs. 3)
nightWindowEnd
medicalExamRequired
Arbeitsmedizinische Untersuchungspflicht (§ 6 Abs. 3)
partTime
Teilzeit-Modifier. Konkreter Prozentsatz auf dem Assignment.
distributionMode
FEWER_HOURSFEWER_DAYSCUSTOM compressedWeek
Komprimierte Woche (z.B. 4×10h). Exklusiv zu partTime.
workDaysPerWeek
dailyHoursTarget
onCall
Rufbereitschaft. Exklusiv zu standby.
compensationMode
FLAT_RATEPER_HOUR flatRateAmountCents
perHourAmountCents
nightSurchargePercent
weekendSurchargePercent
holidaySurchargePercent
activationCountsAsWork
standby
Bereitschaftsdienst (am AG-bestimmten Ort). Exklusiv zu onCall.
countAsWorkPercent
z.B. 50 = halbe Stunde pro Stunde Bereitschaft
locationRequired
surchargePercent
jobSharing
Zwei MA teilen eine Vollzeitstelle. Partner-Zuordnung auf Assignment-Ebene.
splitMode
WEEKLY_ALTERNATINGDAILY_SPLITCUSTOM bandwidth
Variable Wochenstunden innerhalb Min/Max-Korridor.
travelTimeRules
Reisezeit-Regeln (BAG 17.10.2018 – 5 AZR 553/17). MSP-relevant.
defaultCountAsWorkPercent
excludeCommute
Weg Wohnung↔Hauptarbeitsort zählt nicht als Arbeitszeit
customerTripCountsFromDoor
Anfahrt Kunde ab Haustür/Homeoffice (MSP-Praxis)
maxDailyTravelMinutes
Optionale ArbZG-Anrechnungs-Obergrenze
surchargeStackingMode
Wie Zeit-Zuschläge (Nacht/Wochenende/Feiertag) kombinieren. MAX = Maximum gewinnt (TV-Praxis); ADDITIVE = alle addieren.
MAXADDITIVE approvalState
DRAFTPENDING_WORKS_COUNCILAPPROVEDREJECTED submittedForApprovalAt
submittedBy
approvedAt
approvedBy
worksCouncilCaseRef
rejectionReason
Keine Felder passen zum Filter.
WT-Assignment
Hierarchische Zuweisung eines Arbeitszeitmodells an einen Scope mit Gültigkeit
scope
Auflösungs-Ebene: Tenant (Fallback), Org-Unit (Vererbung), Employee (Override)
TENANTORG_UNITEMPLOYEE scopeId
Ziel-ID passend zum Scope: tenantId | org_unit._id | employee_profile._id. Für EMPLOYEE-Scope ist `employee_profile._id` der kanonische Schlüssel (ADR 0036b, Folge-Update 2026-05). Damit lassen sich Arbeitszeitmodelle auch Mitarbeitern ohne verknüpften User-Account zuweisen.
workingTimeModelId
Referenz auf working_time_models._id
validFrom
ISO 8601 Beginn der Zuweisung
validTo
ISO 8601 Ende; "9999-12-31" = unbefristet (Sentinel)
weeklyHours
Individuelle Wochenstunden (Instanz-Parameter). Nicht gesetzt = Modell-Default.
partTimePercent
Teilzeit-Prozentsatz auf dem partTime-Modifier des Modells. Nur sinnvoll, wenn Model partTime definiert.
collectiveAgreementId
Optionale Tarifvertragsbindung (collective_agreements._id)
approvalState
Freigabestatus. Resolver berücksichtigt nur APPROVED für scope ∈ {TENANT, ORG_UNIT}.
DRAFTPENDING_WORKS_COUNCILAPPROVEDREJECTED submittedForApprovalAt
Zeitpunkt der BR-Vorlage
submittedBy
userId der Person, die die Freigabe angefragt hat
approvedAt
Zeitpunkt der BR-Freigabe oder Ablehnung
approvedBy
userId des freigebenden BR-Mitglieds (muss != submittedBy sein)
worksCouncilCaseRef
BR-Beschluss-Referenz (Nummer/Datum), frei formatiert
rejectionReason
Begründung bei approvalState === "REJECTED"
notes
Zusätzliche Notizen zur Zuweisung
Keine Felder passen zum Filter.
Payroll-Record
Per-employee encrypted master data for payroll preparation (Lohnstammdaten). Tier 1 zero-knowledge.
employeeProfileId
UUID of the linked employee_profile
ciphertext
Base64-encoded AES-256-GCM ciphertext of the payload JSON
iv
Base64-encoded 12-byte random IV
alg
Symmetric encryption algorithm identifier
AES-256-GCM keyId
Identifier of the payroll group key version that encrypted this record. Used to detect re-encryption needs after key rotation.
completionStatus
Whether all mandatory fields are filled. Cleartext flag, computed on save by the HR client.
DRAFTCOMPLETENEEDS_REVIEW lastEditedBy
User UUID of the HR member who last edited this record
lastEditedAt
When the encrypted payload was last updated
Keine Felder passen zum Filter.
Payroll-Period
Per-employee, per-month encrypted variable payroll data. Tier 1 zero-knowledge.
employeeProfileId
UUID of the linked employee_profile
period
Payroll period in YYYY-MM format (e.g. "2026-04")
status
DRAFT: in preparation. READY: HR marked it complete. EXPORTED: at least one DATEV export ran. LOCKED: no further edits without correction workflow.
DRAFTREADYEXPORTEDLOCKED lockedAt
When this period was locked
lockedBy
User UUID of the HR member who locked the period
ciphertext
Base64-encoded AES-256-GCM ciphertext of the payload JSON
iv
Base64-encoded 12-byte random IV
alg
Symmetric encryption algorithm identifier
AES-256-GCM keyId
Identifier of the group key version used for encryption
timeTrackingSyncedAt
When this period last imported hours from the time-tracking module. Used to detect stale data.
lastEditedBy
lastEditedAt
Keine Felder passen zum Filter.
Recovery
Tenant-level payroll module configuration and recovery metadata.
activated
Whether the payroll module has been activated for this tenant
activatedAt
When the activation wizard was completed
activatedBy
User UUID of the GF/Owner who activated the module
currentKeyId
Current group key version identifier (e.g. UUID v7)
keyRotatedAt
When the group key was last rotated
checksumPepper
Tenant-specific HMAC pepper (32 random bytes, base64url) for shareChecksum. Generated at activation; absent for tenants activated before the pepper rollout (legacy SHA-256 path).
hrMembers
HR team members with access to payroll data
wrappedGroupKey
Base64url-encoded payroll group key wrapped with this user ECDH public key. AES-KW of a 32-byte key produces 40 bytes → ~54 base64url chars; 128 leaves headroom but blocks DoS payloads.
ephemeralPublicKey
Sender ephemeral ECDH public key used during ECDH-ES wrap
keyId
Group key version this wrapped key corresponds to
addedBy
removedAt
When this member was removed (kept for audit)
steuerberater
firmName
contactName
email
phone
datevAdvisorNumber
DATEV-Berater-Nummer
datevClientNumber
DATEV-Mandanten-Nummer
recoveryHistory
Audit trail of recovery events (cleartext, no secrets)
Keine Felder passen zum Filter.
Export
Audit log entry for a payroll period export to the Steuerberater.
period
Exported payroll period (YYYY-MM)
format
Export format used
DATEV_LODAS_CSVDATEV_ASCIIDATEV_XML employeeCount
Number of employees included in the export
sha256
SHA-256 hash of the generated file (lowercase hex)
fileSize
Size of the generated file in bytes
exportedBy
User UUID of the HR member who triggered the export
exportedAt
deliveryMethod
How the file left the browser
DOWNLOADEMAIL recipientEmail
Steuerberater email address (only for EMAIL deliveries)
notes
Optional notes attached to the export
Keine Felder passen zum Filter.
LODAS
Tenant-level LODAS code mapping and format options.
datumsformat
Date format used in the LODAS file. Day/month always 2-digit, year 4-digit.
TT.MM.JJJJTT/MM/JJJJJJJJ-MM-TTJJJJ/MM/TT stringbegrenzer
String delimiter character (LODAS: " ` allowed).
"'` feldtrennzeichen
Field separator. LODAS allows ; * | \ ~ $ &.
;*|\~$& zahlenkomma
Decimal separator (German comma by default).
,. versionSst
LODAS-Schnittstellenversion (Version_SST).
lohnartMapping
Maps internal payroll fields to mandant-specific Lohnart codes.
grossSalary
Bruttogehalt (Festbezug)
hourlyWage
Stundenlohn
overtime
Überstunden
bonus
Boni / Einmalzahlungen
commission
Provisionen
expensesTaxFree
Spesen steuerfrei
expensesTaxable
Spesen steuerpflichtig
jobTicket
Jobticket
mealVoucher
Essensgutschein
sachbezug
Sachbezug Sonstige
vwl
VWL-Betrag
bavEmployee
BAV-AN-Anteil
bavEmployer
BAV-AG-Zuschuss
pfaendung
Pfändungs-Summe
bsMapping
Bearbeitungsschlüssel codes for u_lod_bwd_buchung_standard.bs_nr.
defaultTaetigkeitsschluessel
Default Tätigkeitsschlüssel applied when the employee has none set.
notes
Free-text notes about the mapping (e.g. StB conventions, special cases).
lastValidatedAt
When the mapping was last confirmed against the StB-Mandant.
lastValidatedBy
User who last validated the mapping with the StB.
Keine Felder passen zum Filter.
Payroll-Audit
Append-only audit log of payroll data access events.
action
Type of action performed
DECRYPT_RECORDDECRYPT_PERIODENCRYPT_RECORDENCRYPT_PERIODEXPORT_DATEVMEMBER_ADDEDMEMBER_REMOVEDKEY_ROTATEDRECOVERY_PERFORMEDPERIOD_LOCKEDUNLOCK_SESSION actorUserId
User UUID of the HR member who performed the action
targetType
Kind of resource the action targeted
employee_profilepayroll_recordpayroll_periodpayroll_exporttenant_membertenant_confignull targetId
UUID of the affected resource (record/period/user/export)
targetEmployeeProfileId
When the action concerns a specific employee, their profile UUID — supports per-employee audit queries (DSGVO-Auskunftsrecht).
period
YYYY-MM payroll period if the action is period-scoped
occurredAt
When the action happened (client clock — server stores its own createdAt)
sourceIp
Client IP captured by the server (filled by route handler, not client)
userAgent
User-Agent header captured by the server
notes
Free-text context (e.g. recovery reason, export filename hash, member-removal justification)
Keine Felder passen zum Filter.
Custom-Endpoints (/api/v1/hr/...)
Über CRUD hinaus gibt es dedizierte HR-Endpoints. Auszug:
| Operation | Hinweis |
|---|---|
POST /api/v1/hr/employees/<id>/onboard | Onboarding-Workflow starten |
POST /api/v1/hr/employees/<id>/offboard | Offboarding-Workflow starten |
GET /api/v1/hr/vacation-balance/<userId> | Aktuelle Urlaubsstände |
POST /api/v1/vacation_requests/<id>/approve | Urlaubs-Antrag genehmigen |
Abwesenheiten
Urlaub und Krankmeldung laufen über zwei getrennte Entities. Anträge haben
typischerweise Status requested, approved, rejected, cancelled.
Vorlauf-, Vertretungs- und Approver-Regeln liegen pro Mandant als
typisierte Konfiguration am working_time_model.
POST /api/v1/vacation_requests
{
"employeeProfileId": "0193…",
"startDate": "2026-07-01",
"endDate": "2026-07-14",
"reason": "Familienurlaub"
}
Payroll-Export
Der LODAS-Export läuft über einen async Job:
POST /api/v1/payroll_exports
{ "periodId": "0193…", "format": "lodas" }
Ergebnis wird als File-Storage-Pointer im payroll_export-Datensatz
hinterlegt. Aktuelle Konfiguration kommt aus payroll_lodas_settings.
Verwandt
- Konventionen
- LMS — Pflicht-Schulungen verbinden sich mit Zertifikaten
- Compliance / GRC — Schulungs-Nachweise als Evidence