{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://docs.processcube.io/contracts/engine/20.10.0-insiders.11/user-task-instance.schema.json",
  "title": "UserTaskInstance",
  "description": "Eine konkrete User Task in einer Prozessinstanz. userTasks.query liefert sie innerhalb von UserTaskList.userTasks.",
  "type": "object",
  "x-doc-use": "Lies userTaskConfig.formFields für die Aufgabenoberfläche und übergib flowNodeInstanceId an finishUserTask. flowNodeId bezeichnet dagegen den Knoten im BPMN-Modell.",
  "required": ["flowNodeInstanceId", "flowNodeId", "flowNodeType", "state", "processDefinitionId", "processModelId", "processInstanceId", "correlationId", "startToken", "ownerId", "userTaskConfig", "userTaskConfigModel"],
  "properties": {
    "flowNodeInstanceId": { "type": "string", "description": "Kennung dieser konkreten Task-Ausführung. Als erstes Argument an finishUserTask übergeben.", "x-doc-group": "wichtig" },
    "flowNodeId": { "type": "string", "description": "ID des User-Task-Knotens im BPMN-Modell. Mehrere Ausführungen dieses Knotens haben unterschiedliche flowNodeInstanceId-Werte.", "x-doc-group": "wichtig" },
    "flowNodeType": { "const": "bpmn:UserTask", "description": "BPMN-Typ des ausgeführten Knotens. Der User-Task-Client filtert Abfragen auf diesen Typ.", "x-doc-group": "wichtig" },
    "state": { "$ref": "#/definitions/FlowNodeInstanceState", "description": "Ausführungszustand. Eine wartende Aufgabe hat den Wert suspended.", "x-doc-group": "wichtig" },
    "processInstanceId": { "type": "string", "description": "ID der Prozessinstanz, zu der diese Aufgabe gehört. Zum Filtern von userTasks.query verwendbar.", "x-doc-group": "wichtig" },
    "userTaskConfig": { "$ref": "#/definitions/UserTaskConfig", "description": "Nach Auswertung der Flow-Node-Ausdrücke gültige Konfiguration. Für die aktuelle Aufgabenoberfläche verwenden.", "x-doc-group": "wichtig" },
    "userTaskConfigModel": { "$ref": "#/definitions/UserTaskConfigModel", "description": "Konfiguration in der Form, in der sie am BPMN-Knoten modelliert wurde. Ausdrücke können hier noch unausgewertet sein.", "x-doc-group": "wichtig" },
    "actualOwnerId": { "type": ["string", "null"], "description": "ID des Benutzers, der die Aufgabe reserviert hat. Fehlt vor einer Reservierung.", "x-doc-group": "wichtig" },
    "assignedUserIds": { "type": ["array", "null"], "items": { "type": "string" }, "description": "Optional zugewiesene Benutzer-IDs der Aufgabe.", "x-doc-group": "wichtig" },
    "finishedByUserId": { "type": ["string", "null"], "description": "ID des Benutzers, der die Aufgabe abgeschlossen hat. Bei einer wartenden Aufgabe nicht vorhanden.", "x-doc-group": "wichtig" },
    "flowNodeName": { "type": ["string", "null"], "description": "Anzeigename des BPMN-Knotens, falls im Modell vorhanden." },
    "flowNodeLane": { "type": ["string", "null"], "description": "Lane des BPMN-Knotens. Sie kann zugleich ein benötigter IAM-Claim für den Zugriff auf die Aufgabe sein." },
    "eventType": { "type": ["string", "null"], "description": "Ereignisart eines Event-Knotens. Bei einer User Task normalerweise nicht vorhanden." },
    "previousFlowNodeInstanceId": { "type": ["string", "null"], "description": "ID der unmittelbar vorher ausgeführten Flow-Node-Instanz, sofern vorhanden." },
    "parentProcessInstanceId": { "type": ["string", "null"], "description": "ID der übergeordneten Prozessinstanz bei einem Subprozess; kann null sein." },
    "processDefinitionId": { "type": "string", "description": "ID der deployten Prozessdefinition, zu der diese Aufgabe gehört." },
    "processModelId": { "type": "string", "description": "ID des ausgeführten Prozessmodells." },
    "embeddedProcessModelId": { "type": ["string", "null"], "description": "ID des eingebetteten Prozessmodells bei einem Subprozess, falls vorhanden." },
    "processModelName": { "type": ["string", "null"], "description": "Anzeigename des Prozessmodells, falls verfügbar." },
    "correlationId": { "type": "string", "description": "Korrelations-ID, über die zusammengehörige Prozessinstanzen verbunden sind." },
    "startToken": { "type": "object", "additionalProperties": true, "description": "Prozessdaten beim Eintritt in die Aufgabe. Die Fachfelder bestimmt das Prozessmodell." },
    "endToken": { "type": ["object", "null"], "additionalProperties": true, "description": "Prozessdaten nach Ausführung der Aufgabe; bei wartenden Aufgaben normalerweise nicht vorhanden." },
    "ownerId": { "type": "string", "description": "ID des Besitzers der Flow-Node-Instanz. Nicht mit actualOwnerId der Reservierung verwechseln." },
    "error": { "type": ["object", "null"], "description": "Fehlerdaten bei einer fehlgeschlagenen Ausführung; im Erfolgsfall möglicherweise null." },
    "startedAt": { "type": ["string", "null"], "format": "date-time", "description": "Startzeit als ISO-Zeitstring im JSON. Der TypeScript Client wandelt diesen Wert in Date um." },
    "finishedAt": { "type": ["string", "null"], "format": "date-time", "description": "Abschlusszeit als ISO-Zeitstring im JSON. Der TypeScript Client wandelt diesen Wert in Date um." },
    "triggeredByFlowNodeInstance": { "type": ["object", "null"], "additionalProperties": true, "description": "Auslösende Flow-Node-Instanz, falls die Aufgabe durch eine andere Instanz gestartet wurde." },
    "multiInstanceMetadataId": { "type": ["string", "null"], "description": "Kennung der Metadaten einer Mehrfachausführung, falls zutreffend." },
    "multiInstanceStartToken": { "type": ["object", "array", "null"], "description": "Startdaten einer Mehrfachausführung; Objekt oder Liste von Objekten." },
    "multiInstanceEndToken": { "type": ["object", "array", "null"], "description": "Ergebnisdaten einer Mehrfachausführung; Objekt oder Liste von Objekten." }
  },
  "definitions": {
    "FlowNodeInstanceState": { "type": "string", "enum": ["running", "suspended", "finished", "terminated", "error", "canceled"], "description": "Mögliche Ausführungszustände einer Flow-Node-Instanz." },
    "UserTaskConfig": {
      "type": "object",
      "description": "Ausgewertete Konfiguration der aktuellen User Task.",
      "required": ["formFields"],
      "properties": {
        "assignedUserIds": { "type": "array", "items": { "type": "string" }, "description": "Nach Auswertung ermittelte Benutzer-IDs für die Aufgabe." },
        "formFields": { "type": "array", "items": { "$ref": "#/definitions/UserTaskFormField" }, "description": "Felder, die für diese Aufgabe angezeigt oder verarbeitet werden können." },
        "customForm": { "type": "string", "description": "Kennung oder Konfiguration eines eigenen Formulars, falls modelliert." },
        "description": { "type": "string", "description": "Beschreibung der Aufgabe für die Anzeige." },
        "finishedMessage": { "type": "string", "description": "Text, der nach Abschluss der Aufgabe angezeigt werden kann." }
      }
    },
    "UserTaskConfigModel": {
      "type": "object",
      "description": "Am BPMN-Knoten modellierte Konfiguration vor Auswertung der Ausdrücke.",
      "required": ["formFields"],
      "properties": {
        "assignedUserIds": { "type": "string", "description": "Modellierter Ausdruck für Benutzer-IDs; anders als in UserTaskConfig noch kein Array." },
        "formFields": { "type": "array", "items": { "$ref": "#/definitions/UserTaskFormField" }, "description": "Im Modell definierte Formularfelder." },
        "customForm": { "type": "string", "description": "Im Modell angegebene Formular-Konfiguration." },
        "description": { "type": "string", "description": "Im Modell angegebene Aufgabenbeschreibung." },
        "finishedMessage": { "type": "string", "description": "Im Modell angegebener Abschlusstext." }
      }
    },
    "UserTaskFormField": {
      "type": "object",
      "description": "Ein Eingabefeld der User Task.",
      "required": ["id", "type", "label"],
      "properties": {
        "id": { "type": "string", "description": "Feld-ID. Unter diesem Schlüssel wird der ausgefüllte Wert im UserTaskResult gesendet." },
        "type": { "type": "string", "description": "Formulartyp, zum Beispiel boolean, text, number, date oder enum. Eigene Typnamen sind möglich." },
        "label": { "type": "string", "description": "Sichtbare Beschriftung des Feldes." },
        "defaultValue": { "description": "Vorbelegter Feldwert. Sein konkreter Typ hängt vom Formularfeld ab." },
        "customForm": { "type": "string", "description": "Zusätzliche Formular-Konfiguration als Text." },
        "parsedCustomForm": { "type": "object", "additionalProperties": true, "description": "Als JSON gelesene Formular-Konfiguration, sofern customForm gültiges JSON enthält." },
        "enumValues": { "type": "array", "items": { "$ref": "#/definitions/UserTaskEnumValue" }, "description": "Auswahlwerte für ein enum-Feld." }
      }
    },
    "UserTaskEnumValue": {
      "type": "object", "required": ["id", "name"],
      "properties": {
        "id": { "type": "string", "description": "Technischer Wert der Auswahloption." },
        "name": { "type": "string", "description": "Angezeigter Name der Auswahloption." }
      }
    }
  }
}
