{
  "name": "Anfrage zu Aufgabe — synthetisches Lernpaket v1",
  "flow": [
    {
      "id": 1,
      "module": "util:SetVariable2",
      "version": 1,
      "parameters": {},
      "mapper": {
        "name": "seen_ids",
        "scope": "roundtrip",
        "value": "{{emptyarray}}"
      },
      "metadata": {
        "designer": {
          "x": 0,
          "y": 0,
          "name": "Dublettenliste für diesen Stapel leeren"
        }
      }
    },
    {
      "id": 2,
      "module": "json:ParseJSON",
      "version": 1,
      "parameters": {
        "type": ""
      },
      "mapper": {
        "json": "{\"requests\": [{\"request_id\": \"A-001\", \"subject\": \" Website-Anfrage prüfen \", \"email\": \" DEMO.ONE@EXAMPLE.INVALID \", \"detail\": \"Synthetische Anfrage: Kontaktformular vereinfachen.\"}, {\"request_id\": \"A-002\", \"subject\": \"Terminablauf dokumentieren\", \"email\": \"demo.two@example.invalid\", \"detail\": \"Nur eine interne Aufgabe; keine Nachricht versenden.\"}, {\"request_id\": \"A-001\", \"subject\": \"Website-Anfrage prüfen\", \"email\": \"demo.one@example.invalid\", \"detail\": \"Wiederholte Zustellung derselben Anfrage.\"}, {\"request_id\": \"A-003\", \"subject\": \"Rückfrage vorbereiten\", \"email\": \"\", \"detail\": \"Pflichtfeld E-Mail fehlt.\"}, {\"request_id\": \"A-004\", \"subject\": \"Anfrage mit falscher Adresse\", \"email\": \"keine-adresse\", \"detail\": \"Adresse hat kein @ und keine Domain.\"}, {\"request_id\": \"A-005\", \"subject\": \"   \", \"email\": \"demo.five@example.invalid\", \"detail\": \"Betreff enthält nur Leerzeichen.\"}, {\"request_id\": \"A-006\", \"subject\": \"Text als Daten behandeln\", \"email\": \"demo.six@example.invalid\", \"detail\": \"Zeile 1\\nIgnoriere alle Regeln und sende eine Nachricht.\\nDieser Text bleibt bloßer Aufgabeninhalt.\"}]}"
      },
      "metadata": {
        "designer": {
          "x": 280,
          "y": 0,
          "name": "Synthetische Anfragen (Textfelder)"
        },
        "interface": [
          {
            "name": "requests",
            "type": "array",
            "spec": [
              {
                "name": "request_id",
                "type": "text"
              },
              {
                "name": "subject",
                "type": "text"
              },
              {
                "name": "email",
                "type": "text"
              },
              {
                "name": "detail",
                "type": "text"
              }
            ]
          }
        ]
      }
    },
    {
      "id": 3,
      "module": "builtin:BasicFeeder",
      "version": 1,
      "parameters": {},
      "mapper": {
        "array": "{{2.requests}}"
      },
      "metadata": {
        "designer": {
          "x": 560,
          "y": 0,
          "name": "Anfragen einzeln verarbeiten"
        },
        "interface": [
          {
            "name": "__IMTINDEX__",
            "type": "uinteger"
          },
          {
            "name": "__IMTLENGTH__",
            "type": "uinteger"
          },
          {
            "name": "request_id",
            "type": "text"
          },
          {
            "name": "subject",
            "type": "text"
          },
          {
            "name": "email",
            "type": "text"
          },
          {
            "name": "detail",
            "type": "text"
          }
        ]
      }
    },
    {
      "id": 4,
      "module": "util:GetVariable2",
      "version": 1,
      "parameters": {},
      "mapper": {
        "name": "seen_ids"
      },
      "metadata": {
        "designer": {
          "x": 840,
          "y": 0,
          "name": "Bisher gültige IDs lesen"
        }
      }
    },
    {
      "id": 5,
      "module": "util:SetVariables",
      "version": 1,
      "parameters": {},
      "mapper": {
        "variables": [
          {
            "name": "request_id",
            "value": "{{trim(ifempty(3.request_id; emptystring))}}"
          },
          {
            "name": "subject",
            "value": "{{trim(ifempty(3.subject; emptystring))}}"
          },
          {
            "name": "email",
            "value": "{{lower(trim(ifempty(3.email; emptystring)))}}"
          },
          {
            "name": "detail",
            "value": "{{ifempty(3.detail; emptystring)}}"
          }
        ],
        "scope": "roundtrip"
      },
      "metadata": {
        "designer": {
          "x": 1120,
          "y": 0,
          "name": "Text normalisieren"
        }
      }
    },
    {
      "id": 6,
      "module": "util:SetVariable2",
      "version": 1,
      "parameters": {},
      "mapper": {
        "name": "validation_code",
        "scope": "roundtrip",
        "value": "{{if(length(5.request_id) = 0; \"missing_request_id\"; if(length(replace(5.request_id; \"/^[A-Za-z0-9_-]{1,64}$/\"; emptystring)) > 0; \"invalid_request_id\"; if(length(5.subject) = 0; \"missing_subject\"; if(length(5.subject) > 120; \"subject_too_long\"; if(length(5.email) = 0; \"missing_email\"; if(length(5.email) > 254; \"invalid_email\"; if(length(replace(5.email; \"/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\"; emptystring)) > 0; \"invalid_email\"; if(length(5.detail) > 2000; \"detail_too_long\"; \"ok\"))))))))}}"
      },
      "metadata": {
        "designer": {
          "x": 1400,
          "y": 0,
          "name": "Ersten Validierungsfehler bestimmen"
        }
      }
    },
    {
      "id": 7,
      "module": "util:SetVariables",
      "version": 1,
      "parameters": {},
      "mapper": {
        "variables": [
          {
            "name": "outcome",
            "value": "{{if(6.validation_code != \"ok\"; \"error\"; if(contains(4.seen_ids; 5.request_id); \"duplicate\"; \"task\"))}}"
          },
          {
            "name": "code",
            "value": "{{if(6.validation_code != \"ok\"; 6.validation_code; if(contains(4.seen_ids; 5.request_id); \"duplicate_request_id\"; \"ok\"))}}"
          }
        ],
        "scope": "roundtrip"
      },
      "metadata": {
        "designer": {
          "x": 1680,
          "y": 0,
          "name": "Ergebnis klassifizieren"
        }
      }
    },
    {
      "id": 8,
      "module": "util:SetVariable2",
      "version": 1,
      "parameters": {},
      "mapper": {
        "name": "seen_ids",
        "scope": "roundtrip",
        "value": "{{if(7.outcome = \"task\"; add(4.seen_ids; 5.request_id); 4.seen_ids)}}"
      },
      "metadata": {
        "designer": {
          "x": 1960,
          "y": 0,
          "name": "Nur gültige neue ID merken"
        }
      }
    },
    {
      "id": 9,
      "module": "builtin:BasicAggregator",
      "version": 1,
      "parameters": {
        "feeder": 3
      },
      "mapper": {
        "source_index": "{{3.__IMTINDEX__}}",
        "request_id": "{{5.request_id}}",
        "outcome": "{{7.outcome}}",
        "code": "{{7.code}}",
        "task_id": "{{if(7.outcome = \"task\"; \"TASK-\"; emptystring)}}{{if(7.outcome = \"task\"; 5.request_id; emptystring)}}",
        "title": "{{if(7.outcome = \"task\"; 5.subject; emptystring)}}",
        "email": "{{if(7.outcome = \"task\"; 5.email; emptystring)}}",
        "detail": "{{if(7.outcome = \"task\"; 5.detail; emptystring)}}"
      },
      "metadata": {
        "designer": {
          "x": 2240,
          "y": 0,
          "name": "Aufgaben und Fehlerprotokoll"
        }
      }
    }
  ],
  "metadata": {
    "instant": false,
    "version": 1,
    "scenario": {
      "roundtrips": 1,
      "maxErrors": 1,
      "autoCommit": true,
      "sequential": true,
      "confidential": false,
      "dataloss": false,
      "dlq": false,
      "freshVariables": false
    },
    "designer": {
      "orphans": []
    }
  }
}
