# Job JSON Struktur

Diese Dokumentation beschreibt die JSON-Struktur eines Jobs mit allen zugehörigen Tasks.

## Job Objekt

```json
{
  "id": "507f1f77bcf86cd799439011",
  "jobNumber": "JOB-2024-001",
  "status": "CREATED",
  "createdAt": "2024-01-15T10:30:00",
  "updatedAt": "2024-01-15T14:45:00",
  "createdBy": "admin@example.com",
  "isDraft": false,

  "customerSelection": "Kunde01",

  "pickupCompany": "Absender GmbH",
  "pickupSalutation": "Herr",
  "pickupFirstName": "Max",
  "pickupLastName": "Mustermann",
  "pickupPhone": "+49 123 456789",
  "pickupStreet": "Musterstraße",
  "pickupHouseNumber": "42",
  "pickupAddressAddition": "2. OG",
  "pickupZip": "12345",
  "pickupCity": "Musterstadt",

  "deliveryCompany": "Empfänger AG",
  "deliverySalutation": "Frau",
  "deliveryFirstName": "Erika",
  "deliveryLastName": "Musterfrau",
  "deliveryPhone": "+49 987 654321",
  "deliveryStreet": "Beispielweg",
  "deliveryHouseNumber": "7",
  "deliveryAddressAddition": null,
  "deliveryZip": "54321",
  "deliveryCity": "Beispielstadt",

  "digitalProcessing": true,
  "appUser": "fahrer01",

  "pickupDate": "2024-01-20",
  "deliveryDate": "2024-01-21",

  "remark": "Bitte zwischen 9-12 Uhr liefern",
  "price": 150.00
}
```

## Job Status Werte

| Status | Display Name | Beschreibung |
|--------|-------------|--------------|
| `CREATED` | Erstellt | Job wurde angelegt |
| `IN_PROGRESS` | In Bearbeitung | Job wird bearbeitet |
| `PICKUP_SCHEDULED` | Abholung geplant | Abholtermin wurde festgelegt |
| `PICKED_UP` | Abgeholt | Ware wurde abgeholt |
| `IN_TRANSIT` | Unterwegs | Ware ist auf dem Transportweg |
| `DELIVERED` | Zugestellt | Ware wurde zugestellt |
| `COMPLETED` | Abgeschlossen | Job vollständig abgeschlossen |
| `CANCELLED` | Storniert | Job wurde storniert |

## Task Struktur

Tasks sind polymorph und haben eine gemeinsame Basisstruktur plus typspezifische Daten.

### Basis Task Felder

```json
{
  "id": "507f1f77bcf86cd799439012",
  "jobId": "507f1f77bcf86cd799439011",
  "taskType": "PHOTO",
  "taskOrder": 1,
  "description": "Fotos der Ware bei Abholung",
  "completed": false,
  "completedAt": null,
  "completedBy": null,
  "taskSpecificData": { ... }
}
```

### Task Typen

| TaskType | Display Name | Beschreibung |
|----------|-------------|--------------|
| `CONFIRMATION` | Bestätigung | Einfache Bestätigung per Button |
| `SIGNATURE` | Unterschrift | Unterschrift erfassen |
| `TODOLIST` | To-Do Liste | Checkliste mit Punkten |
| `PHOTO` | Foto | Fotos aufnehmen |
| `BARCODE` | Barcode | Barcodes scannen |
| `COMMENT` | Kommentar | Textkommentar eingeben |

---

## Task Beispiele nach Typ

### CONFIRMATION Task

```json
{
  "id": "507f1f77bcf86cd799439012",
  "jobId": "507f1f77bcf86cd799439011",
  "taskType": "CONFIRMATION",
  "taskOrder": 1,
  "description": "Bitte bestätigen Sie die Übernahme der Ware",
  "completed": false,
  "completedAt": null,
  "completedBy": null,
  "taskSpecificData": {
    "taskType": "CONFIRMATION",
    "buttonText": "Ware übernommen"
  }
}
```

### SIGNATURE Task

```json
{
  "id": "507f1f77bcf86cd799439013",
  "jobId": "507f1f77bcf86cd799439011",
  "taskType": "SIGNATURE",
  "taskOrder": 2,
  "description": "Unterschrift des Empfängers",
  "completed": false,
  "completedAt": null,
  "completedBy": null,
  "taskSpecificData": {
    "taskType": "SIGNATURE"
  }
}
```

### PHOTO Task

```json
{
  "id": "507f1f77bcf86cd799439014",
  "jobId": "507f1f77bcf86cd799439011",
  "taskType": "PHOTO",
  "taskOrder": 3,
  "description": "Fotos der Ware bei Abholung",
  "completed": false,
  "completedAt": null,
  "completedBy": null,
  "taskSpecificData": {
    "taskType": "PHOTO",
    "minPhotoCount": 1,
    "maxPhotoCount": 5
  }
}
```

### BARCODE Task

```json
{
  "id": "507f1f77bcf86cd799439015",
  "jobId": "507f1f77bcf86cd799439011",
  "taskType": "BARCODE",
  "taskOrder": 4,
  "description": "Scannen Sie alle Pakete",
  "completed": false,
  "completedAt": null,
  "completedBy": null,
  "taskSpecificData": {
    "taskType": "BARCODE",
    "minBarcodeCount": 1,
    "maxBarcodeCount": 10
  }
}
```

### TODOLIST Task

```json
{
  "id": "507f1f77bcf86cd799439016",
  "jobId": "507f1f77bcf86cd799439011",
  "taskType": "TODOLIST",
  "taskOrder": 5,
  "description": "Checkliste vor Auslieferung",
  "completed": false,
  "completedAt": null,
  "completedBy": null,
  "taskSpecificData": {
    "taskType": "TODOLIST",
    "todoItems": [
      "Verpackung auf Beschädigungen prüfen",
      "Anzahl der Pakete kontrollieren",
      "Lieferschein beiliegen"
    ]
  }
}
```

### COMMENT Task

```json
{
  "id": "507f1f77bcf86cd799439017",
  "jobId": "507f1f77bcf86cd799439011",
  "taskType": "COMMENT",
  "taskOrder": 6,
  "description": "Anmerkungen zur Lieferung",
  "completed": false,
  "completedAt": null,
  "completedBy": null,
  "taskSpecificData": {
    "taskType": "COMMENT",
    "commentText": null,
    "required": false
  }
}
```

---

## Vollständiges Beispiel: Job mit Tasks

```json
{
  "job": {
    "id": "507f1f77bcf86cd799439011",
    "jobNumber": "JOB-2024-001",
    "status": "IN_PROGRESS",
    "createdAt": "2024-01-15T10:30:00",
    "updatedAt": "2024-01-15T14:45:00",
    "createdBy": "admin@example.com",
    "isDraft": false,
    "customerSelection": "Kunde01",
    "pickupCompany": "Absender GmbH",
    "pickupSalutation": "Herr",
    "pickupFirstName": "Max",
    "pickupLastName": "Mustermann",
    "pickupPhone": "+49 123 456789",
    "pickupStreet": "Musterstraße",
    "pickupHouseNumber": "42",
    "pickupAddressAddition": "2. OG",
    "pickupZip": "12345",
    "pickupCity": "Musterstadt",
    "deliveryCompany": "Empfänger AG",
    "deliverySalutation": "Frau",
    "deliveryFirstName": "Erika",
    "deliveryLastName": "Musterfrau",
    "deliveryPhone": "+49 987 654321",
    "deliveryStreet": "Beispielweg",
    "deliveryHouseNumber": "7",
    "deliveryAddressAddition": null,
    "deliveryZip": "54321",
    "deliveryCity": "Beispielstadt",
    "digitalProcessing": true,
    "appUser": "fahrer01",
    "pickupDate": "2024-01-20",
    "deliveryDate": "2024-01-21",
    "remark": "Bitte zwischen 9-12 Uhr liefern",
    "price": 150.00
  },
  "tasks": [
    {
      "id": "507f1f77bcf86cd799439012",
      "jobId": "507f1f77bcf86cd799439011",
      "taskType": "CONFIRMATION",
      "taskOrder": 1,
      "description": "Ware übernommen bestätigen",
      "completed": true,
      "completedAt": "2024-01-20T09:15:00",
      "completedBy": "fahrer01",
      "taskSpecificData": {
        "taskType": "CONFIRMATION",
        "buttonText": "Ware übernommen"
      }
    },
    {
      "id": "507f1f77bcf86cd799439013",
      "jobId": "507f1f77bcf86cd799439011",
      "taskType": "PHOTO",
      "taskOrder": 2,
      "description": "Fotos bei Abholung",
      "completed": true,
      "completedAt": "2024-01-20T09:20:00",
      "completedBy": "fahrer01",
      "taskSpecificData": {
        "taskType": "PHOTO",
        "minPhotoCount": 2,
        "maxPhotoCount": 5
      }
    },
    {
      "id": "507f1f77bcf86cd799439014",
      "jobId": "507f1f77bcf86cd799439011",
      "taskType": "BARCODE",
      "taskOrder": 3,
      "description": "Pakete scannen",
      "completed": false,
      "completedAt": null,
      "completedBy": null,
      "taskSpecificData": {
        "taskType": "BARCODE",
        "minBarcodeCount": 1,
        "maxBarcodeCount": 3
      }
    },
    {
      "id": "507f1f77bcf86cd799439015",
      "jobId": "507f1f77bcf86cd799439011",
      "taskType": "SIGNATURE",
      "taskOrder": 4,
      "description": "Unterschrift Empfänger",
      "completed": false,
      "completedAt": null,
      "completedBy": null,
      "taskSpecificData": {
        "taskType": "SIGNATURE"
      }
    }
  ]
}
```

---

## Feldtypen Referenz

| Feld | Typ | Nullable | Beschreibung |
|------|-----|----------|--------------|
| `id` | String (ObjectId) | Nein | MongoDB ObjectId als String |
| `jobNumber` | String | Nein | Eindeutige Auftragsnummer |
| `status` | String (Enum) | Nein | Siehe Job Status Werte |
| `createdAt` | ISO DateTime | Nein | Erstellungszeitpunkt |
| `updatedAt` | ISO DateTime | Ja | Letzter Änderungszeitpunkt |
| `createdBy` | String | Nein | Benutzername des Erstellers |
| `isDraft` | Boolean | Nein | Entwurf-Kennzeichen |
| `pickupDate` | ISO Date | Ja | Abholdatum |
| `deliveryDate` | ISO Date | Ja | Lieferdatum |
| `price` | Decimal | Ja | Preis in EUR (netto) |
| `taskOrder` | Integer | Nein | Reihenfolge der Tasks (0-basiert) |
| `completed` | Boolean | Nein | Task abgeschlossen |
| `completedAt` | ISO DateTime | Ja | Abschlusszeitpunkt |
| `completedBy` | String | Ja | App-User der den Task abgeschlossen hat |
