Zum Inhalt

Shift Pool Modul

Zweck

Das Shift Pool Modul bietet eine umfassende Schichtplanungslösung für Unternehmen. Es ermöglicht die Erstellung von Schichten, Veröffentlichung im Pool, Bewerbungssystem für Freelancer, Annahme/Ablehnung von Bewerbungen, Schicht-Verwaltung, Standort-Integration und einen Freelancer-Pool für Sicherheitsfirmen.

Verantwortlichkeiten

Was gehört zum Modul

  • Schicht-Erstellung: Erstellen, Bearbeiten und Löschen von Schichten
  • Schicht-Veröffentlichung: Schichten im Pool veröffentlichen oder zurückziehen
  • Bewerbungssystem: Freelancer können sich auf Schichten bewerben
  • Annahme/Ablehnung: Admins können Bewerbungen annehmen oder ablehnen
  • Schicht-Zuweisung: Direkte Zuweisung von Mitarbeitern zu Schichten
  • Schicht-Verwaltung: Status-Verwaltung (Draft, Published, Closed, Cancelled, Completed)
  • Standort-Integration: Schichten mit Standorten/Objekten verknüpfen
  • Öffentlicher Pool: Öffentliche Schichten für alle Freelancer sichtbar
  • Schicht-Dokumente: Upload und Verwaltung von Schicht-Dokumenten
  • Zeiterfassung für Schichten: Zeiteinträge für Schichten erstellen

Was gehört nicht zum Modul

Implementierung

Backend- und Frontend-API sind modular aufgebaut; Details siehe interne Entwickler-Dokumentation.

Konfiguration

Entitlement

Das Modul erfordert das Entitlement module.shift_pool. Dieses wird pro Tenant aktiviert/deaktiviert.

Entitlement-Key: module.shift_pool

Environment Variables

Keine modulspezifischen ENV-Variablen erforderlich.

Defaults

  • Schicht-Status: DRAFT (beim Erstellen)
  • Maximale Dateigröße für Dokumente: 10MB
  • Öffentlicher Pool: Standardmäßig deaktiviert (isPublicPool: false)

Abhängigkeiten

Optionale Abhängigkeiten

  • projects: Für Standort-Integration (Schichten mit Objekten verknüpfen)
  • time-tracking: Für Zeiterfassung in Schichten

Core-Abhängigkeiten

  • calendar-core: Schichten werden als Events im Kalender angezeigt
  • members: Für Rollenprüfung (Admin/Manager für Schicht-Verwaltung)
  • notifications: Für Benachrichtigungen bei Bewerbungen

API-Endpoints

Authentifizierung

Alle Endpoints erfordern Authentifizierung. Zwei Methoden werden unterstützt:

  1. Firebase ID Token (Standard für Web-App)
  2. API-Token (für externe Nutzung)

Header: Authorization: Bearer <token>

Admin-Endpoints

Schicht erstellen

POST /api/shift-pool/shifts

Erstellt eine neue Schicht (Draft).

Request Body:

{
  "title": "Schicht-Titel",
  "description": "Beschreibung",
  "startsAt": "2024-01-15T08:00:00Z",
  "endsAt": "2024-01-15T17:00:00Z",
  "locationId": "Optional: Standort-ID",
  "requiredSkills": ["skill1", "skill2"],
  "maxApplications": 5,
  "isPublicPool": false
}

Response:

{
  "shift": {
    "id": "shift123",
    "title": "Schicht-Titel",
    "status": "DRAFT",
    "startsAt": "2024-01-15T08:00:00Z",
    "endsAt": "2024-01-15T17:00:00Z"
  },
  "message": "Shift created successfully"
}

Schichten auflisten (Admin)

GET /api/shift-pool/admin/shifts

Listet alle Schichten für Admin.

Response:

{
  "shifts": [...],
  "count": 10
}

Schicht aktualisieren

PUT /api/shift-pool/shifts/:shiftId

Aktualisiert eine Schicht. Nur DRAFT-Schichten können vollständig bearbeitet werden.

Request Body:

{
  "title": "Aktualisierter Titel",
  "description": "Aktualisierte Beschreibung",
  "startsAt": "2024-01-15T08:00:00Z",
  "endsAt": "2024-01-15T17:00:00Z",
  "locationId": "location123",
  "requiredSkills": ["skill1"],
  "maxApplications": 10
}

Response:

{
  "shift": {
    "id": "shift123",
    "title": "Aktualisierter Titel",
    "status": "DRAFT",
    "startsAt": "2024-01-15T08:00:00Z",
    "endsAt": "2024-01-15T17:00:00Z"
  },
  "message": "Shift updated successfully"
}

Fehler: - 404 NOT_FOUND: Schicht nicht gefunden - 409 INVALID_STATUS: Schicht kann nicht bearbeitet werden (z.B. bereits veröffentlicht) - 422 VALIDATION_ERROR: Ungültige Eingabedaten

Schicht löschen

DELETE /api/shift-pool/shifts/:shiftId

Löscht eine Schicht. Nur DRAFT-Schichten können gelöscht werden.

Response:

{
  "success": true,
  "message": "Shift deleted successfully"
}

Fehler: - 404 NOT_FOUND: Schicht nicht gefunden - 409 INVALID_STATUS: Nur Draft-Schichten können gelöscht werden

Schicht veröffentlichen

POST /api/shift-pool/shifts/:shiftId/publish

Veröffentlicht eine Schicht im Pool. Die Schicht wird für Bewerbungen verfügbar.

Response:

{
  "shift": {
    "id": "shift123",
    "status": "PUBLISHED",
    "startsAt": "2024-01-15T08:00:00Z",
    "endsAt": "2024-01-15T17:00:00Z"
  },
  "message": "Shift published successfully"
}

Fehler: - 404 NOT_FOUND: Schicht nicht gefunden - 409 INVALID_STATUS: Schicht kann nicht veröffentlicht werden (z.B. bereits veröffentlicht oder abgesagt)

Schicht zurückziehen

POST /api/shift-pool/shifts/:shiftId/unpublish

Zieht eine veröffentlichte Schicht zurück und setzt sie auf DRAFT-Status.

Response:

{
  "shift": {
    "id": "shift123",
    "status": "DRAFT",
    "startsAt": "2024-01-15T08:00:00Z",
    "endsAt": "2024-01-15T17:00:00Z"
  },
  "message": "Shift unpublished successfully"
}

Fehler: - 404 NOT_FOUND: Schicht nicht gefunden - 409 INVALID_STATUS: Schicht kann nicht zurückgezogen werden (z.B. bereits geschlossen)

Schicht schließen

POST /api/shift-pool/shifts/:shiftId/close

Schließt eine veröffentlichte Schicht für weitere Bewerbungen.

Response:

{
  "shift": {
    "id": "shift123",
    "status": "CLOSED",
    "startsAt": "2024-01-15T08:00:00Z",
    "endsAt": "2024-01-15T17:00:00Z"
  },
  "message": "Shift closed successfully"
}

Fehler: - 404 NOT_FOUND: Schicht nicht gefunden - 409 INVALID_STATUS: Nur veröffentlichte Schichten können geschlossen werden

Schicht abbrechen

POST /api/shift-pool/shifts/:shiftId/cancel

Sagt eine Schicht ab.

Response:

{
  "shift": {
    "id": "shift123",
    "status": "CANCELLED",
    "startsAt": "2024-01-15T08:00:00Z",
    "endsAt": "2024-01-15T17:00:00Z"
  },
  "message": "Shift cancelled successfully"
}

Fehler: - 404 NOT_FOUND: Schicht nicht gefunden - 409 INVALID_STATUS: Schicht ist bereits abgesagt

Pool-Endpoints

Pool-Liste abrufen

GET /api/shift-pool/pool?from=2024-01-01&to=2024-01-31

Listet verfügbare Schichten (nur PUBLISHED).

Query-Parameter: - from (optional): Start-Datum (ISO 8601) - to (optional): End-Datum (ISO 8601) - location (optional): Standort-Filter - q (optional): Suchbegriff

Bewerbungs-Endpoints

Auf Schicht bewerben

POST /api/shift-pool/shifts/:shiftId/apply

Bewirbt sich auf eine Schicht.

Request Body:

{
  "message": "Optional: Nachricht"
}

Bewerbungen abrufen

GET /api/shift-pool/shifts/:shiftId/applications

Lädt alle Bewerbungen für eine Schicht (nur Admin).

Bewerbung annehmen

POST /api/shift-pool/applications/:applicationId/accept

Nimmt eine Bewerbung an (nur Admin).

Bewerbung ablehnen

POST /api/shift-pool/applications/:applicationId/reject

Lehnt eine Bewerbung ab (nur Admin).

Response:

{
  "application": {
    "id": "app123",
    "status": "REJECTED",
    "reviewedAt": "2024-01-15T10:00:00Z",
    "reviewedBy": "admin123"
  },
  "message": "Application rejected"
}

Fehler: - 404 NOT_FOUND: Bewerbung nicht gefunden - 409 INVALID_STATUS: Bewerbung kann nicht abgelehnt werden (z.B. bereits angenommen)

Bewerbung ablehnung zurückziehen

POST /api/shift-pool/applications/:applicationId/unreject

Zieht eine Ablehnung zurück und setzt den Status auf PENDING.

Response:

{
  "application": {
    "id": "app123",
    "status": "PENDING"
  },
  "message": "Rejection undone - application is pending again"
}

Fehler: - 404 NOT_FOUND: Bewerbung nicht gefunden - 409 INVALID_STATUS: Bewerbung kann nicht zurückgesetzt werden

Bewerbung widerrufen

POST /api/shift-pool/applications/:applicationId/revoke

Macht eine akzeptierte Bewerbung rückgängig und storniert die Zuweisung.

Response:

{
  "application": {
    "id": "app123",
    "status": "WITHDRAWN"
  },
  "message": "Application revoked - assignment cancelled"
}

Fehler: - 404 NOT_FOUND: Bewerbung oder Schicht nicht gefunden - 409 INVALID_STATUS: Bewerbung kann nicht widerrufen werden

Öffentliche Endpoints

Öffentliche Pool-Liste

GET /api/shift-pool/public/pool

Öffentliche Pool-Liste (alle Schichten mit isPublicPool: true). Kein Auth erforderlich.

Query-Parameter: - from (optional): Start-Datum - to (optional): End-Datum - location (optional): Standort-Filter - q (optional): Suchbegriff

User-Endpoints

Meine Schichten

GET /api/shift-pool/my-shifts?includeCompleted=false

Lädt zugewiesene Schichten des aktuellen Users.

Query-Parameter: - includeCompleted (optional): Auch abgeschlossene Schichten einbeziehen (Standard: false)

Response:

{
  "shifts": [
    {
      "id": "shift123",
      "title": "Schicht-Titel",
      "status": "PUBLISHED",
      "startsAt": "2024-01-15T08:00:00Z",
      "endsAt": "2024-01-15T17:00:00Z"
    }
  ],
  "count": 1
}

Schicht-Details

GET /api/shift-pool/shifts/:shiftId

Lädt Details einer Schicht.

Response:

{
  "shift": {
    "id": "shift123",
    "title": "Schicht-Titel",
    "description": "Beschreibung",
    "status": "PUBLISHED",
    "startsAt": "2024-01-15T08:00:00Z",
    "endsAt": "2024-01-15T17:00:00Z",
    "locationId": "location123",
    "requiredSkills": ["skill1"],
    "maxApplications": 5,
    "isPublicPool": false
  }
}

Fehler: - 404 NOT_FOUND: Schicht nicht gefunden

Firestore Collections

Shifts

Pfad: /tenants/{tenantId}/shifts/{shiftId}

{
  title: string;
  description?: string;
  startsAt: Timestamp;
  endsAt: Timestamp;
  status: 'DRAFT' | 'PUBLISHED' | 'CLOSED' | 'CANCELLED' | 'COMPLETED';
  locationId?: string;
  requiredSkills?: string[];
  maxApplications?: number;
  isPublicPool: boolean;
  createdAt: Timestamp;
  updatedAt: Timestamp;
  createdBy: string; // UID
}

Applications

Pfad: /tenants/{tenantId}/applications/{applicationId}

{
  shiftId: string;
  uid: string;
  email: string;
  status: 'PENDING' | 'ACCEPTED' | 'REJECTED' | 'WITHDRAWN';
  message?: string;
  appliedAt: Timestamp;
  reviewedAt?: Timestamp;
  reviewedBy?: string; // UID
}

Wird dokumentiert: Detaillierte Datenbank-Struktur folgt.

Fehlerfälle

HTTP-Status-Codes

  • 200 OK: Erfolgreich
  • 201 Created: Ressource erstellt
  • 400 Bad Request: Validierungsfehler
  • 401 Unauthorized: Nicht authentifiziert
  • 403 Forbidden: Keine Berechtigung
  • 404 Not Found: Ressource nicht gefunden
  • 409 Conflict: Konflikt (z.B. bereits beworben)
  • 500 Internal Server Error: Server-Fehler

Fehlercodes

Assignment-Endpoints

Zuweisungen abrufen

GET /api/shift-pool/shifts/:shiftId/assignments

Lädt alle Zuweisungen für eine Schicht (Admin).

Response:

{
  "assignments": [
    {
      "id": "assign123",
      "shiftId": "shift123",
      "memberUid": "user123",
      "status": "CONFIRMED",
      "assignedAt": "2024-01-15T10:00:00Z"
    }
  ],
  "count": 1
}

Mitarbeiter zuweisen

POST /api/shift-pool/shifts/:shiftId/assign

Weist einen Mitarbeiter direkt einer Schicht zu (Admin).

Request Body:

{
  "memberUid": "user123"
}

Response:

{
  "assignment": {
    "id": "assign123",
    "shiftId": "shift123",
    "memberUid": "user123",
    "status": "CONFIRMED",
    "assignedAt": "2024-01-15T10:00:00Z"
  },
  "message": "Member assigned to shift"
}

Fehler: - 400 Bad Request: memberUid fehlt - 404 NOT_FOUND: Schicht oder Mitglied nicht gefunden - 409 ALREADY_ASSIGNED: Mitglied ist bereits zugewiesen - 409 NO_SLOTS: Keine freien Plätze verfügbar

Zuweisung entfernen

DELETE /api/shift-pool/assignments/:assignmentId

Entfernt eine Zuweisung (Admin).

Response:

{
  "success": true,
  "message": "Assignment removed"
}

Fehler: - 404 NOT_FOUND: Zuweisung oder Schicht nicht gefunden

Absageanfrage stellen

POST /api/shift-pool/assignments/:assignmentId/request-cancellation

Mitarbeiter stellt eine Absageanfrage für eine Zuweisung.

Request Body:

{
  "reason": "Optional: Grund für Absage"
}

Response:

{
  "assignment": {
    "id": "assign123",
    "status": "PENDING_CANCELLATION",
    "requestReason": "Grund für Absage"
  },
  "message": "Cancellation request submitted successfully"
}

Fehler: - 404 NOT_FOUND: Zuweisung nicht gefunden - 403 FORBIDDEN: Zuweisung gehört nicht zum User - 409 NOT_ACTIVE: Zuweisung ist nicht aktiv

Verschiebungsanfrage stellen

POST /api/shift-pool/assignments/:assignmentId/request-transfer

Mitarbeiter stellt eine Verschiebungsanfrage für eine Zuweisung.

Request Body:

{
  "suggestedUid": "user456",
  "reason": "Optional: Grund für Verschiebung"
}

Response:

{
  "assignment": {
    "id": "assign123",
    "status": "PENDING_TRANSFER",
    "suggestedUid": "user456",
    "requestReason": "Grund für Verschiebung"
  },
  "message": "Transfer request submitted successfully"
}

Fehler: - 400 Bad Request: suggestedUid fehlt - 404 NOT_FOUND: Zuweisung oder vorgeschlagenes Mitglied nicht gefunden - 403 FORBIDDEN: Zuweisung gehört nicht zum User - 409 CONFLICT: Zuweisung ist nicht aktiv oder vorgeschlagenes Mitglied ist bereits zugewiesen

Ablehnungsanfrage stellen

POST /api/shift-pool/assignments/:assignmentId/request-decline

Mitarbeiter stellt eine Ablehnungsanfrage für eine Zuweisung.

Request Body:

{
  "reason": "Optional: Grund für Ablehnung"
}

Response:

{
  "assignment": {
    "id": "assign123",
    "status": "PENDING_DECLINE",
    "requestReason": "Grund für Ablehnung"
  },
  "message": "Decline request submitted successfully"
}

Fehler: - 404 NOT_FOUND: Zuweisung nicht gefunden - 403 FORBIDDEN: Zuweisung gehört nicht zum User - 409 NOT_ACTIVE: Zuweisung ist nicht aktiv

Anfrage genehmigen/ablehnen

POST /api/shift-pool/assignments/:assignmentId/approve-request

Admin/Manager genehmigt oder lehnt eine Anfrage ab.

Request Body:

{
  "approved": true
}

Response:

{
  "assignment": {
    "id": "assign123",
    "status": "CANCELLED"
  },
  "newAssignment": {
    "id": "assign456",
    "status": "CONFIRMED"
  },
  "message": "Request approved successfully"
}

Fehler: - 400 Bad Request: approved muss ein Boolean sein - 404 NOT_FOUND: Zuweisung oder Schicht nicht gefunden - 403 FORBIDDEN: Admin- oder Manager-Rolle erforderlich - 409 CONFLICT: Keine ausstehende Anfrage oder keine freien Plätze

Vorschlag annehmen

POST /api/shift-pool/assignments/:assignmentId/accept-suggestion

Vorgeschlagener Kollege nimmt die Zuweisung an.

Response:

{
  "assignment": {
    "id": "assign123",
    "status": "CONFIRMED"
  },
  "message": "Suggestion accepted successfully"
}

Fehler: - 404 NOT_FOUND: Zuweisung nicht gefunden - 403 FORBIDDEN: Zuweisung gehört nicht zum User - 409 NOT_PENDING_SUGGESTION: Zuweisung ist keine ausstehende Vorschlag

Vorschlag ablehnen

POST /api/shift-pool/assignments/:assignmentId/reject-suggestion

Vorgeschlagener Kollege lehnt die Zuweisung ab.

Response:

{
  "assignment": {
    "id": "assign123",
    "status": "REJECTED"
  },
  "message": "Suggestion rejected successfully"
}

Fehler: - 404 NOT_FOUND: Zuweisung nicht gefunden - 403 FORBIDDEN: Zuweisung gehört nicht zum User - 409 NOT_PENDING_SUGGESTION: Zuweisung ist keine ausstehende Vorschlag

Shift Completion-Endpoints

Schicht abschließen

POST /api/shift-pool/shifts/:shiftId/complete

Beendet eine Schicht (nur Crew-Leiter).

Response:

{
  "shift": {
    "id": "shift123",
    "status": "COMPLETED",
    "completedAt": "2024-01-15T17:00:00Z"
  },
  "message": "Shift completed successfully"
}

Fehler: - 404 NOT_FOUND: Schicht nicht gefunden - 403 FORBIDDEN: Nur Crew-Leiter, Manager oder Admin können Schichten abschließen - 409 INVALID_STATUS: Schicht ist bereits abgeschlossen oder kann nicht abgeschlossen werden

Schicht wieder öffnen

POST /api/shift-pool/shifts/:shiftId/reopen

Öffnet eine beendete Schicht wieder (nur Crew-Leiter, nur innerhalb von 24 Stunden).

Response:

{
  "shift": {
    "id": "shift123",
    "status": "CLOSED",
    "reopenedAt": "2024-01-15T18:00:00Z"
  },
  "message": "Shift reopened successfully"
}

Fehler: - 404 NOT_FOUND: Schicht nicht gefunden - 403 FORBIDDEN: Nur Crew-Leiter, Manager oder Admin können Schichten wieder öffnen - 409 INVALID_STATUS: Nur abgeschlossene Schichten können wieder geöffnet werden (innerhalb von 24 Stunden)

Pausen-Vorschau

GET /api/shift-pool/shifts/:shiftId/preview-breaks?date=2024-01-15

Zeigt eine Vorschau der automatischen Pausen, die für alle Mitarbeiter erstellt werden würden.

Query-Parameter: - date (optional): Datum für die Vorschau (ISO 8601, Standard: heute)

Response:

{
  "preview": [
    {
      "memberUid": "user123",
      "breaks": [
        {
          "start": "2024-01-15T12:00:00Z",
          "end": "2024-01-15T12:30:00Z",
          "durationMinutes": 30
        }
      ]
    }
  ],
  "count": 1
}

Shift Time Entries-Endpoints

Zeiteinträge abrufen

GET /api/shift-pool/shifts/:shiftId/time-entries

Lädt alle Zeiteinträge einer Schicht.

Response:

{
  "entries": [
    {
      "id": "entry123",
      "shiftId": "shift123",
      "memberUid": "user123",
      "clockIn": "2024-01-15T08:00:00Z",
      "clockOut": "2024-01-15T17:00:00Z",
      "durationMinutes": 540
    }
  ],
  "count": 1
}

Zeiteintrag erstellen

POST /api/shift-pool/shifts/:shiftId/time-entries

Erstellt einen Zeiteintrag für eine Schicht. Nur zugewiesene Mitglieder oder Crew-Leiter können Zeiteinträge erstellen.

Request Body:

{
  "memberUid": "user123",
  "clockIn": "2024-01-15T08:00:00Z",
  "clockOut": "2024-01-15T17:00:00Z",
  "note": "Optional: Notiz"
}

Response:

{
  "entry": {
    "id": "entry123",
    "shiftId": "shift123",
    "memberUid": "user123",
    "clockIn": "2024-01-15T08:00:00Z",
    "clockOut": "2024-01-15T17:00:00Z",
    "durationMinutes": 540
  },
  "message": "Time entry created successfully"
}

Fehler: - 404 NOT_FOUND: Schicht nicht gefunden - 403 FORBIDDEN: User ist nicht der Schicht zugewiesen oder kein Crew-Leiter - 422 VALIDATION_ERROR: Ungültige Zeiten oder Dauer

Zeiteintrag aktualisieren

PUT /api/shift-pool/shifts/:shiftId/time-entries/:entryId

Aktualisiert einen Zeiteintrag. Nur Crew-Leiter, Manager oder Admin können Zeiteinträge aktualisieren.

Request Body:

{
  "clockIn": "2024-01-15T08:00:00Z",
  "clockOut": "2024-01-15T17:00:00Z",
  "note": "Aktualisierte Notiz"
}

Response:

{
  "entry": {
    "id": "entry123",
    "clockIn": "2024-01-15T08:00:00Z",
    "clockOut": "2024-01-15T17:00:00Z",
    "durationMinutes": 540
  },
  "message": "Time entry updated successfully"
}

Fehler: - 404 NOT_FOUND: Zeiteintrag oder Schicht nicht gefunden - 409 INVALID_SHIFT: Zeiteintrag gehört nicht zu dieser Schicht - 403 FORBIDDEN: Nur Crew-Leiter, Manager oder Admin können Zeiteinträge aktualisieren - 422 SHIFT_COMPLETED: Schicht ist bereits abgeschlossen (mehr als 24 Stunden) - 422 VALIDATION_ERROR: Ungültige Zeiten oder Dauer

Shift Documents-Endpoints

Dokument hochladen

POST /api/shift-pool/shifts/:shiftId/documents

Lädt ein Dokument für eine Schicht hoch. Nur zugewiesene Mitglieder können Dokumente hochladen.

Request: Multipart Form-Data - file (required): Die Datei (max. 10MB)

Response:

{
  "document": {
    "id": "doc123",
    "shiftId": "shift123",
    "fileName": "dokument.pdf",
    "fileSize": 1024000,
    "uploadedBy": "user123",
    "uploadedAt": "2024-01-15T10:00:00Z"
  },
  "message": "Document uploaded successfully"
}

Fehler: - 400 MISSING_FILE: Keine Datei hochgeladen - 404 NOT_FOUND: Schicht nicht gefunden - 403 FORBIDDEN: Nur zugewiesene Mitglieder können Dokumente hochladen - 422 VALIDATION_ERROR: Ungültiger Dateityp oder Dateigröße überschreitet 10MB

Dokumente abrufen

GET /api/shift-pool/shifts/:shiftId/documents

Lädt alle Dokumente einer Schicht (nur Admin, Manager oder Crew-Leiter).

Response:

{
  "documents": [
    {
      "id": "doc123",
      "shiftId": "shift123",
      "fileName": "dokument.pdf",
      "fileSize": 1024000,
      "uploadedBy": "user123",
      "uploadedAt": "2024-01-15T10:00:00Z"
    }
  ],
  "count": 1
}

Fehler: - 403 FORBIDDEN: Nur Crew-Leiter, Manager oder Admin können Dokumente abrufen

Dokument herunterladen

GET /api/shift-pool/shifts/:shiftId/documents/:documentId/download

Generiert eine Download-URL für ein Dokument.

Response:

{
  "downloadUrl": "https://storage.googleapis.com/...",
  "expiresAt": "2024-01-15T11:00:00Z"
}

Fehler: - 404 NOT_FOUND: Dokument nicht gefunden - 409 INVALID_SHIFT: Dokument gehört nicht zu dieser Schicht - 403 FORBIDDEN: Nur Crew-Leiter, Manager oder Admin können Dokumente herunterladen

Dokument löschen

DELETE /api/shift-pool/shifts/:shiftId/documents/:documentId

Löscht ein Dokument. Nur Crew-Leiter, Manager oder Admin können Dokumente löschen.

Response:

{
  "success": true,
  "message": "Document deleted successfully"
}

Fehler: - 404 NOT_FOUND: Dokument nicht gefunden - 409 INVALID_SHIFT: Dokument gehört nicht zu dieser Schicht - 403 FORBIDDEN: Nur Crew-Leiter, Manager oder Admin können Dokumente löschen

Freelancer-Endpoints

Freelancer-Bewerbungen abrufen

GET /api/shift-pool/freelancer/applications

Lädt alle Bewerbungen des eingeloggten Freelancers.

Response:

{
  "applications": [
    {
      "id": "app123",
      "shiftId": "shift456",
      "status": "PENDING",
      "appliedAt": "2024-01-15T10:00:00Z"
    }
  ],
  "count": 1
}

Fehler: - 403 FORBIDDEN: Nur Freelancer können auf diesen Endpunkt zugreifen

Freelancer-Schichten abrufen

GET /api/shift-pool/freelancer/shifts?includeCompleted=false

Lädt alle Schichten des eingeloggten Freelancers (angenommene Bewerbungen).

Query-Parameter: - includeCompleted (optional): Auch abgeschlossene Schichten einbeziehen (Standard: false)

Response:

{
  "shifts": [
    {
      "id": "shift456",
      "title": "Schicht-Titel",
      "status": "PUBLISHED",
      "startsAt": "2024-01-15T08:00:00Z",
      "endsAt": "2024-01-15T17:00:00Z"
    }
  ],
  "count": 1
}

Fehler: - 403 FORBIDDEN: Nur Freelancer können auf diesen Endpunkt zugreifen

Auf öffentliche Schicht bewerben

POST /api/shift-pool/public/shifts/:shiftId/apply

Bewerbung auf öffentliche Schicht als Freelancer.

Request Body:

{
  "note": "Optional: Nachricht"
}

Response:

{
  "application": {
    "id": "app123",
    "shiftId": "shift456",
    "status": "PENDING",
    "appliedAt": "2024-01-15T10:00:00Z"
  },
  "message": "Application submitted successfully"
}

Fehler: - 404 NOT_FOUND: Schicht nicht gefunden oder nicht verfügbar - 422 VALIDATION_ERROR: Bewerbungsfrist abgelaufen oder bereits beworben - 403 FORBIDDEN: Nur Freelancer können sich auf öffentliche Schichten bewerben

Fehlercodes

Die folgenden Fehlercodes werden von den API-Endpunkten zurückgegeben:

  • NOT_FOUND: Ressource nicht gefunden
  • INVALID_STATUS: Ungültiger Status für die Operation
  • VALIDATION_ERROR: Validierungsfehler bei Eingabedaten
  • ALREADY_APPLIED: Bereits auf diese Schicht beworben
  • NOT_AVAILABLE: Schicht ist nicht für Bewerbungen verfügbar
  • DEADLINE_PASSED: Bewerbungsfrist abgelaufen
  • NO_SLOTS: Keine freien Plätze verfügbar
  • ALREADY_ASSIGNED: Mitglied ist bereits zugewiesen
  • FORBIDDEN: Keine Berechtigung für die Operation
  • NOT_ACTIVE: Zuweisung ist nicht aktiv
  • NOT_PENDING_SUGGESTION: Zuweisung ist keine ausstehende Vorschlag
  • INVALID_SHIFT: Ressource gehört nicht zu dieser Schicht
  • SHIFT_COMPLETED: Schicht ist bereits abgeschlossen (mehr als 24 Stunden)
  • MISSING_FILE: Keine Datei hochgeladen
  • CONFLICT: Konflikt bei der Operation

FAQ / Troubleshooting

Wird dokumentiert: Häufige Fragen und Lösungen folgen.