Shifty Dokumentation
AdministrationCustom configurations

Position Restrictions & User-Customer Relations

Position Restrictions & User-Customer Relations

Diese Anleitung erklärt, wie Position Restrictions und User-Customer Relations die Mitarbeiter-Sichtbarkeit und Einsatzplanung beeinflussen.

Für Admins

Position Restrictions — Schichten nur für passende Positionen

Was sind Positionen?

Positionen sind berufliche Rollen in deinem Team:

  • Rezeptionist
  • Koch
  • Küche-Aushilfe
  • Barkeeper
  • Manager
  • Fahrer
  • etc.

Jede Position kann mit Anforderungen verknüpft werden (z.B. Lizenz, Führerschein, Sprachen).

Restrict Positions — Das Setting

Siehe Team-Konfiguration > Strict Positions für die Basis-Einstellung.

Wenn Restrict Positions aktiviert ist:

  • Admins weisen jeder Schicht eine Position zu (z.B. "Diese Schicht braucht einen Koch")
  • Mitarbeiter sehen nur Schichten, die zu ihrer Position passen
  • Im Kalender werden nur die richtigen Schichten angezeigt

Praktisches Beispiel

Szenario: Dein Restaurant hat 3 Arten von Schichten

SchichtPosition erforderlichMit Restrict Positions
Schicht: Service BerlinRezeptionistNur Rezeptionisten sehen diese
Schicht: Küche MünchenKochNur Köche sehen diese
Schicht: Aushilfe LagernAushilfeNur Aushilfen sehen diese

Ohne Restrict Positions:

  • Alle 3 Schichten sichtbar für alle Mitarbeiter

Mit Restrict Positions:

  • Rezeptionist sieht: "Service Berlin" + nicht "Küche" + nicht "Aushilfe"
  • Koch sieht: "Küche München" + nicht "Service" + nicht "Aushilfe"
  • Aushilfe sieht: "Aushilfe Lagern" + nicht "Service" + nicht "Küche"

Positionen für Mitarbeiter zuweisen

  1. Geh zu Admin > Benutzerverwaltung > Mitarbeiter
  2. Wähle einen Mitarbeiter aus
  3. Im Formular unter Positionen: Wähle eine oder mehrere Positionen
  4. Speichern

Wichtig: Ein Mitarbeiter kann mehrere Positionen haben!

  • Beispiel: Max ist sowohl "Koch" als auch "Manager"
  • Max sieht dann Schichten für "Koch" UND "Manager"

User-Customer Relations — Wer arbeitet für wen?

Was sind User-Customer Relations?

Eine User-Customer Relation verbindet einen Mitarbeiter mit einem Kunden. Das nutzbar bei:

  • Mehrere Außenstelle/Kunden: Mitarbeiter arbeitet z.B. nur für Kunde "Hotel XYZ"
  • Projektbasierte Arbeit: Mitarbeiter arbeitet für mehrere Kunden/Projekte
  • Abrechnungsfilterung: Admin kann Schichten nach Kunde filtern

Konfiguration

  1. Geh zu Admin > Benutzerverwaltung > Mitarbeiter > [Mitarbeiter wählen]
  2. Im Abschnitt Kundenbeziehungen / Customer Relations: Wähle einen oder mehrere Kunden
  3. Speichern

Beispiel:

  • Mitarbeiter "Maria" arbeitet für Kunden: "Gasthof Zur Post", "Hotel am Platz"
  • Mitarbeiter "Klaus" arbeitet für Kunden: "Event-Agentur München"

Auswirkung im System

Derzeit ist die User-Customer Relation hauptsächlich ein Datenverwaltungs-Tool:

  • In Zukunft wird sie für automatische Schicht-Filter und Berichte nutzbar (z.B. "Zeige alle Schichten für Hotel XYZ")
  • Admins können damit schon jetzt filtern und Berichte per API erstellen

Zusammenspiel: Positionen + Restrict Mode + Custom Fields

Wenn du mehrere der folgenden Einstellungen kombinierst, erhältst du sehr genaue Kontrolle über Einsatzplanung:

SzenarioPosition RestrictStrict ModeCustom Fields
Kleine, flexible CrewOFFOFFKeine erforderlich
Spezialisierte RollenONOFFOptional (z.B. Lizenz für Koch)
Strenge Anforderungen (Klinik)ONONErforderlich (z.B. Zertifikat)

Beispiel: Spezialisierte Anwaltskanzlei

Position Restrict: ON
Strict Mode: OFF
Custom Fields:
  - "Rechtsgebiet" (Text, erforderlich) — z.B. "Arbeitsrecht", "Zivilrecht"
  - "Anwaltszulassung" (Boolean, erforderlich) — Ja/Nein

Auswirkung:
1. Mitarbeiter "Anna" hat Position "Anwalt" + Rechtsgebiet "Arbeitsrecht" + Zulassung: ja
   → Anna sieht nur Schichten für Position "Anwalt" mit Anforderung "Arbeitsrecht"

2. Mitarbeiter "Bob" hat Position "Sekretariat"
   → Bob sieht keine Anwalts-Schichten (andere Position)

3. Admin erstellt Schicht für "Zivilrecht" mit Anforderung "Arbeitsrecht"-Feld
   → Anna sieht diese Schicht NICHT (Rechtsgebiet passt nicht)
   → Wenn Admin versucht zuzuweisen: Stark Modus zeigt Warnung

Häufige Fragen

F: Ein Mitarbeiter hat mehrere Positionen — sieht er Schichten für alle Positionen? A: Ja! Mit Restrict Positions sieht der Mitarbeiter alle Schichten, die zu einer seiner Positionen passen.

F: Können wir Position Restrictions für einzelne Mitarbeiter ausnahmsweise deaktivieren? A: Nein, das ist eine Team-weite Einstellung. Aber du kannst individuelle Zuweisung im Strict Mode OFF vornehmen (mit Warnung).

F: Wie unterscheiden sich Positionen von Custom Fields? A:

  • Positionen = berufliche Rolle (Chef, Koch, Aushilfe)
  • Custom Fields = zusätzliche Anforderungen (Lizenz, Sprache, Qualifikation)
  • Positionen filtern sichtbar (wenn Restrict ON), Custom Fields sind ein Kompatibilitäts-Check (Warnung/Blocker)

F: User-Customer Relations — sind diese auch wie Position Restrict? A: Derzeit NEIN — User-Customer Relations sind nur für Datenorganisation (Benutzerto wertung nach Kunde vorbereiten). In Zukunft werden sie möglicherweise auch für Sichtbarkeits-Filter wie Position Restrict genutzt.


For Developers

Position Restrictions Implementation

Key Function: filterShiftsByPosition() in src/sections/events/filter-shifts-by-position.ts

export function filterShiftsByPosition(
    event: DBEvent<true> | undefined,
    user: AuthContextUser | null | undefined,
    restrictPositions: boolean,
): DBShift<true>[] {
    // Returns ALL shifts if restrictPositions is disabled
    if (!restrictPositions) return event.shifts;

    // Returns only shifts matching user's positionIds
    return event.shifts.filter((shift) => user?.positionIds?.includes(shift.positionId));
}

Effect on these components:

  • src/sections/calendar/employee-calendar-view.tsx — Shows only filtered shifts for employee
  • src/sections/kanban-board/ — Shows available shifts based on position filtering
  • src/sections/events/event-detail-view.tsx — Hides shifts employee can't access

Position Assignment to Shifts

Every shift has:

shift.positionId: number  // References a position
shift.position: DBPosition  // Full position object (may contain requirements)

When creating or editing shifts, admins set positionId. The position determines visibility when restrictPositions = true.

User-Customer Relations

Not actively used in shift filtering currently, but data structure exists:

user.userCustomers?: {
  userId: number;
  customerId: number;
  customer: DBCustomer;
}[]

Can be used for future filtering or reporting.

Compatibility Checks & Positions

The compatibility check also validates positions (independent of Restrict Positions):

From src/sections/admin-calendar-v2/daily-planning/utils/compatibility-check.ts (L390):

if (positionIds && positionIds.length > 0 && !positionIds.includes(shift.positionId)) {
    incompatibilities.push({
        id: 'not-qualified',
        summary: 'Position does not match',
        details: 'User has positions: X, Y. Shift requires: Z.',
        severity: '2-warning',
    });
}

Key Difference:

  • Restrict Positions = true: Shifts are HIDDEN from employee (can't see them)
  • Compatibility Check: Shifts are VISIBLE but show WARNINGS when admin tries to assign incompatible position

Both mechanisms enforce role-based assignment, but at different stages (visibility vs assignment).

On this page