Mitarbeiter-Verträge
Zweck
Mitarbeiter-Verträge (EmployeeContract) modellieren das Arbeitsverhaeltnis zwischen Mandant und Mitarbeiter. Pro Vertrag werden Vertragsart, Zeitraum, Branch, Kostenstelle, Office und Arbeitszeitmodell hinterlegt. Der aktive Vertrag wird automatisch in Workorder.beforeCreate ausgelesen — daraus stammen Workorder.branchId, Workorder.costCenterId und Workorder.employeeOfficeId.
Die Verwaltung erfolgt ausschliesslich über die Sub-Route am Mitarbeiter: /employees/:id/contracts. Es gibt keine globale Vertraegeliste.
Voraussetzungen
Berechtigungen (CASL)
| Action | Subject | Wirkung | Keycloak-Rolle |
|---|---|---|---|
view | EmployeeContract | Tab Verträge auf Mitarbeiter-Detailseite | APP_SPEAMCORE_VIEW_EMPLOYEE_CONTRACT |
create/update/delete | EmployeeContract | Pflegen | APP_SPEAMCORE_CREATE/UPDATE/DELETE_EMPLOYEE_CONTRACT |
view | WorkTimeModel, Branch, CostCenter | Auswahl-Selects | APP_SPEAMCORE_VIEW_WORK_TIME_MODEL, BRANCH, COST_CENTER |
Schritt-für-Schritt-Anleitung
Vertrag anlegen
- Mitarbeiter öffnen (
/employees/:id). - Tab Verträge (
/employees/:id/contracts). - + Neu — der Add-Button öffnet ein Menu mit den Vertragsarten.
- Vertragsart wählen —
EmployeeContractwird mit diesercontractTypeangelegt, Sie werden auf die Detail-Seite weitergeleitet. - Felder pflegen: Zeitraum, Branch, Kostenstelle, Office, Arbeitszeitmodell.
Vertragsart wechseln
Erfordert einen neuen Vertrag — die contractType ist nach Anlage festgelegt.

Toolbar (Detail-Seite)
Schlanke Toolbar oben rechts:
| Icon | Aktion (aria-label) | CASL | Wirkung |
|---|---|---|---|
| ← | Zurückgehen | — | Zurück zur Liste. |
| 🏠 | Zur Startseite gehen | — | Springt auf das Dashboard / /. |
| ⏮/◀/▶/⏭ | Pagination | — | Navigation durch die gefilterte Liste — Massen-Bearbeitung ohne Liste-Sprung. |
Globale Floating-Drawer (links)
Wie auf jeder Detail-Seite verfuegbar — siehe Floating-Quickbar:
- KAL. (Mini-Kalender)
- ZEIT (Persoenliche Wochen-Arbeitszeit)
- ARBEIT (Eigene bevorstehende Aufträge)
UI-Elemente
Button: „+ Neu"
Tab Verträge. Erfordert create:EmployeeContract. Öffnet Dropdown mit Vertragsarten.
Felder und Eingaben
| Feldname | Pflicht | Datentyp | Wirkung beim Ausfuellen | Voraussetzung |
|---|---|---|---|---|
employeeId | ja (automatisch) | UUID | Verknuepfung zum Mitarbeiter — wird vom Routing gesetzt. | Mitarbeiter existiert. |
contractType | ja (disabled nach Anlage) | full_time/part_time/freelance/intern/apprentice/other | Bestimmt Arbeitszeit-Konfiguration und ggf. Lohnberechnung. | — |
startDate | ja | DATE | Vertragsbeginn. Bestimmt, wann der Vertrag „aktiv" wird. | — |
endDate | nein | DATE | Vertragsende. Befristete Verträge werden hierüber abgegrenzt. | endDate >= startDate. |
workTimeModelId | konditional | UUID | Verknuepft mit Arbeitszeitmodell — bestimmt Soll-Stunden, Pausen, Kernzeit. | view:WorkTimeModel. |
branchId | nein | UUID | Niederlassung des Mitarbeiters. Wird in Aufträgen als Default übernommen. | view:Branch. |
costCenterId | nein | UUID | Kostenstelle. Wird in Aufträgen und Belegen als Default übernommen. | view:CostCenter. |
employeeOfficeId | nein | UUID | Buero des Mitarbeiters. | — |
salary | nein | Decimal/Currency | Gehalt — für Lohn-Reports. | — |
hoursPerWeek | nein | Decimal | Wochenarbeitszeit. Default aus WorkTimeModel-Aggregation. | — |
Workflows und Zustaende
Verträge haben kein eigenes Status-Feld. Aktivität ergibt sich aus startDate/endDate im Vergleich zum aktuellen Datum:
| Status (impliziert) | Bedingung |
|---|---|
| Zukuenftig | startDate > heute |
| Aktiv | startDate <= heute <= endDate (oder endDate = null) |
| Abgelaufen | endDate < heute |
Wiederverwendbare Konzepte
Verknuepfungen zu anderen Modulen
- Mitarbeiter (
/employees) — Tab Verträge. - Aufträge (
/workorders) —Workorder.beforeCreatezieht den aktiven Vertrag für Branch/Kostenstelle/Office. - Arbeitszeitmodelle (
/work-time-models) —EmployeeContract.workTimeModelId. - Niederlassungen (
/branches) —EmployeeContract.branchId. - Kostenstellen (
/cost-centers) —EmployeeContract.costCenterId. - Zeiterfassung (
/employee-time-trackings) — Soll-/Ist-Berechnung nutzt das aktive Arbeitszeitmodell.
Häufige Fehler und Lösungen
| Fehler | Lösung |
|---|---|
| Auftrag übernimmt nicht die richtige Kostenstelle | Mitarbeiter hat keinen aktiven Vertrag (Datum ausserhalb startDate/endDate). |
contractType wünscht Änderung | Per Design — neuen Vertrag mit korrekter contractType anlegen. |
| Vertragsart fehlt im Menu | Die Liste ist im FE hardcoded — Code-Änderung notwendig. |
API/Schnittstellen
| Methode | Endpoint | Zweck | CASL |
|---|---|---|---|
GET | /api/employees/:id/contracts | Liste | view EmployeeContract |
POST | /api/employees/:id/contracts | Anlegen | create EmployeeContract |
GET | /api/employees/:id/contracts/:contractId | Detail | view EmployeeContract |
PATCH | /api/employees/:id/contracts/:contractId | Ändern | update EmployeeContract |
DELETE | /api/employees/:id/contracts/:contractId | Soft-Delete | delete EmployeeContract |
Versionshinweise
- 2026-04-29: Initiale Veroeffentlichung mit FE-Tiefen-Standard.