Zum Hauptinhalt springen

Subunternehmer (Contractors)

Zweck

Contractor ist eine Sonderform des Mitarbeiter-Modells (Employee mit employeeType = contractor). Subunternehmer werden separat verwaltet, haben eigene Sub-Listen für Stundensaetze (/contractors/:id/cost-rates), Dokumente und Zeiterfassungen, koennen aber bei Bedarf einen Keycloak-User (Login) erhalten.

Hinter den Kulissen verwendet `/contractors` das gleiche Datenmodell wie [/employees](/employees) — der Filter `employeeType = contractor` trennt sie. Die FE-Page bietet jedoch ein vereinfachtes Form mit nur den Subunternehmer-relevanten Feldern.

Voraussetzungen

- Berechtigung `view:Employee` und `create:Employee`. - Optional Keycloak-Realm aktiv, falls Login für Subunternehmer gewünscht. - Sub-Listen erfordern `view:ContractorEmployeeCostRate`, `view:EmployeeTimeTracking`, `view:Document`.

Berechtigungen (CASL)

ActionSubjectWirkungKeycloak-Rolle
viewFE_Contractor, EmployeeListe/Detail aufrufbar
create/update/deleteEmployeePflegenAPP_SPEAMCORE_CREATE/UPDATE/DELETE_EMPLOYEE
viewContractorEmployeeCostRateStundensatz-Sub-ListeAPP_SPEAMCORE_VIEW_CONTRACTOR_EMPLOYEE_COST_RATE
viewEmployeeTimeTrackingZeit-Sub-ListeAPP_SPEAMCORE_VIEW_EMPLOYEE_TIME_TRACKING
viewDocumentDokument-Sub-ListeAPP_SPEAMCORE_VIEW_DOCUMENT

Schritt-für-Schritt-Anleitung

  1. Subunternehmer (/contractors) → + Neu.
  2. employeeNumber (interne Nummer) und name pflegen.
  3. email ergaenzen — falls gesetzt, wird beim Backend-Save ein Keycloak-User ohne Rollen angelegt.
  4. Service-Typ (Switches): fieldService (Aussendienst), backOffice (Innendienst).
  5. language wählen — bestimmt die Spracheinstellung im Login.
  6. status = active.

Sub-Listen (Tabs auf der Detail-Seite)

Sub-RouteInhaltAnlege-Pattern
/contractors/:id/cost-ratesStundensaetze pro Service-Typ und Datum (ContractorEmployeeCostRate)Inline-Row-Editing — neue Zeile, Service wählen, Tagessatz/Stundensatz, validFrom/validTo. Sich ueberlappende Zeitraeume sind nicht zulässig (Backend-Validierung).
/contractors/:id/employee-time-trackingsErfasste Arbeitszeit (EmployeeTimeTracking mit contractorId)Inline-Row-Editing analog Auftrag-Arbeitszeit — Service-Auswahl, Start/Ende, Abrechenbar-Toggle. Wichtig für Subunternehmer-Abrechnung.
/contractors/:id/documentsVerträge, Bescheinigungen, Versicherungs-NachweiseStandard-Document-Pattern (siehe Dokumente und Anhaenge). Typische Inhalte: Werkvertrag, A1-Bescheinigung, Berufshaftpflicht-Nachweis, Branchen-Zertifikate.
**Subunternehmer-Abrechnung-Workflow:** Der `Contractor` erfasst Arbeitszeit auf einem Auftrag (entweder via `/workorders/:id/working-times` mit Auswahl als Mitarbeiter, oder direkt am Auftrag via Quick-Button). Der Stundensatz wird **nicht aus dem Mitarbeiter-Vertrag** gezogen, sondern aus `ContractorEmployeeCostRate.rate` zum Zeitpunkt der Erfassung (Datum-Match auf `validFrom`/`validTo`). Bei der Beleg-Erstellung erscheinen Subunternehmer-Stunden in einer separaten Position-Gruppe.

Listenansicht — contractors

Toolbar (Detail-Seite)

Schlanke Toolbar oben rechts:

IconAktion (aria-label)CASLWirkung
ZurückgehenZurück zur Liste.
🏠Zur Startseite gehenSpringt auf das Dashboard / /.
⏮/◀/▶/⏭PaginationNavigation durch die gefilterte Liste — Massen-Bearbeitung ohne Liste-Sprung.

Wie auf jeder Detail-Seite verfuegbar — siehe Floating-Quickbar:

  • KAL. (Mini-Kalender)
  • ZEIT (Persoenliche Wochen-Arbeitszeit)
  • ARBEIT (Eigene bevorstehende Aufträge)

Felder und Eingaben

FeldnamePflichtDatentypWirkung beim AusfuellenVoraussetzung
employeeNumberneinStringInterne Nummer für Reports und Rechnungen.
statusjaENUM (active, inactive)Steuert Sichtbarkeit.
emailneinStringEmail des Subunternehmers. Bei gesetzt: Keycloak-User wird angelegt.
nameneinStringAnzeigename.
fieldServiceneinBooleanSubunternehmer hat Aussendienst-Aufgaben.
backOfficeneinBooleanSubunternehmer hat Innendienst-Aufgaben.
languageneinString (BCP-47 Locale)Login-Sprache und Mail-Default.

Wiederverwendbare Konzepte

Verknuepfungen zu anderen Modulen

Häufige Fehler und Lösungen

FehlerLösung
Subunternehmer erscheint in Mitarbeiter-ListeFilter employeeType = contractor greift nur auf /contractors. In /employees werden alle Typen angezeigt.
Keycloak-User wurde nicht angelegtemail muss beim Anlegen gesetzt sein.

API/Schnittstellen

MethodeEndpointZweckCASL
GET/api/contractorsListe (filtert auf employeeType = contractor)view Employee
POST/api/contractorsAnlegencreate Employee
GET/api/contractors/:idDetailview Employee
PATCH/api/contractors/:idÄndernupdate Employee
DELETE/api/contractors/:idSoft-Deletedelete Employee
GET/api/contractor-employee-cost-rates?filter[employeeId]Stundensaetzeview ContractorEmployeeCostRate
GET/api/employee-time-trackings?filter[employeeId]Zeit-Sub-Listeview EmployeeTimeTracking

Versionshinweise

  • 2026-04-30: Initiale Veroeffentlichung.