{
  "schemaVersion": 1,
  "id": "6b1f2a3c-4d5e-4f60-9b7c-8d9e0f1a0206",
  "name": "Демо: обработка заявок из очереди",
  "description": "Берёт заявки из очереди «Заявки», подаёт каждую в веб-форме form.html (из своей папки) и кладёт номер заявки в результат элемента. Данные со словом «ПЛОХО» — бизнес-ошибка; failFirstAttemptOf — ссылка заявки, первая попытка которой падает системной ошибкой (для проверки повторов)",
  "variables": [
    { "name": "queue", "type": "string", "default": "Заявки", "isArgument": true },
    { "name": "failFirstAttemptOf", "type": "string", "default": "", "isArgument": true },
    { "name": "headless", "type": "boolean", "default": false, "isArgument": true },
    { "name": "item", "type": "object", "default": null, "isArgument": false },
    { "name": "found", "type": "boolean", "default": false, "isArgument": false },
    { "name": "stop", "type": "boolean", "default": false, "isArgument": false },
    { "name": "requestNumber", "type": "string", "default": null, "isArgument": false },
    { "name": "processed", "type": "number", "default": 0, "isArgument": false },
    { "name": "error", "type": "object", "default": null, "isArgument": false }
  ],
  "steps": [
    {
      "id": "s_open0001",
      "type": "browser.open",
      "displayName": "Открыть форму заявки",
      "props": { "browser": "msedge", "url": "form.html", "headless": "{{ headless }}" }
    },
    {
      "id": "s_loop0001",
      "type": "control.while",
      "displayName": "Пока в очереди есть заявки",
      "props": { "condition": "true" },
      "children": {
        "body": [
          {
            "id": "s_get00001",
            "type": "orch.queueGetItem",
            "displayName": "Взять заявку",
            "props": { "queue": "{{ queue }}" },
            "out": { "item": "item", "found": "found" }
          },
          {
            "id": "s_empty001",
            "type": "control.if",
            "displayName": "Заявок больше нет?",
            "props": { "condition": "!found" },
            "children": {
              "then": [ { "id": "s_break001", "type": "control.break", "props": {} } ]
            }
          },
          {
            "id": "s_try00001",
            "type": "control.tryCatch",
            "displayName": "Подать заявку",
            "props": { "errorVariable": "error" },
            "children": {
              "try": [
                {
                  "id": "s_bad00001",
                  "type": "control.if",
                  "displayName": "Данные неверны?",
                  "props": { "condition": "JSON.stringify(item.payload).includes('ПЛОХО')" },
                  "children": {
                    "then": [
                      { "id": "s_throw001", "type": "control.throw", "props": { "message": "Заявка {{ item.reference }}: в данных «ПЛОХО» — исправьте данные в источнике" } }
                    ]
                  }
                },
                {
                  "id": "s_fail0001",
                  "type": "control.if",
                  "displayName": "Сбой первой попытки (проверка повторов)",
                  "props": { "condition": "failFirstAttemptOf !== '' && item.reference === failFirstAttemptOf && item.attempt === 1" },
                  "children": {
                    "then": [
                      {
                        "id": "s_sysfail1",
                        "type": "browser.waitElement",
                        "displayName": "Ждать ответа сайта (не дождётся)",
                        "props": { "selector": "#siteIsDown", "state": "visible", "timeoutMs": 1000, "throwOnTimeout": true }
                      }
                    ]
                  }
                },
                {
                  "id": "s_fio00001",
                  "type": "browser.typeInto",
                  "props": { "selector": "#fio", "text": "{{ item.payload['ФИО'] }}", "clearBefore": true }
                },
                {
                  "id": "s_phone001",
                  "type": "browser.typeInto",
                  "props": { "selector": "#phone", "text": "{{ item.payload['Телефон'] }}", "clearBefore": true }
                },
                {
                  "id": "s_city0001",
                  "type": "browser.selectOption",
                  "props": { "selector": "#city", "value": "{{ item.payload['Город'] }}" }
                },
                {
                  "id": "s_submit01",
                  "type": "browser.click",
                  "displayName": "Отправить заявку",
                  "props": { "selector": "#submit" }
                },
                {
                  "id": "s_wait0001",
                  "type": "browser.waitElement",
                  "displayName": "Дождаться результата",
                  "props": { "selector": "#result", "state": "visible", "timeoutMs": 10000 }
                },
                {
                  "id": "s_number01",
                  "type": "browser.getText",
                  "displayName": "Прочитать номер заявки",
                  "props": { "selector": "#requestNumber" },
                  "out": { "text": "requestNumber" }
                },
                {
                  "id": "s_done0001",
                  "type": "orch.queueSetResult",
                  "displayName": "Заявка подана",
                  "props": { "itemId": "{{ item.id }}", "status": "succeeded", "output": "({ номерЗаявки: requestNumber })" }
                },
                {
                  "id": "s_count001",
                  "type": "control.assign",
                  "props": { "variable": "processed", "value": "processed + 1" }
                },
                {
                  "id": "s_logok001",
                  "type": "control.log",
                  "props": { "level": "info", "message": "Заявка {{ item.reference }} подана, номер {{ requestNumber }}" }
                },
                {
                  "id": "s_new00001",
                  "type": "browser.click",
                  "displayName": "Новая заявка",
                  "props": { "selector": "#newRequest" }
                }
              ],
              "catch": [
                {
                  "id": "s_failed01",
                  "type": "orch.queueSetResult",
                  "displayName": "Заявка не подана",
                  "props": {
                    "itemId": "{{ item.id }}",
                    "status": "failed",
                    "errorType": "{{ error.code === 'UserThrow' ? 'business' : 'system' }}",
                    "message": "{{ error.message }}"
                  }
                },
                {
                  "id": "s_logerr01",
                  "type": "control.log",
                  "props": { "level": "warn", "message": "Заявка {{ item.reference }} не подана: {{ error.message }}" }
                },
                {
                  "id": "s_reset001",
                  "type": "browser.navigate",
                  "displayName": "Открыть пустую форму заново",
                  "props": { "url": "form.html" }
                }
              ]
            }
          },
          {
            "id": "s_stop0001",
            "type": "orch.shouldStop",
            "displayName": "Нужно ли остановиться",
            "out": { "stop": "stop" },
            "props": {}
          },
          {
            "id": "s_stopif01",
            "type": "control.if",
            "displayName": "Остановка после текущей заявки?",
            "props": { "condition": "stop" },
            "children": {
              "then": [ { "id": "s_break002", "type": "control.break", "props": {} } ]
            }
          }
        ]
      }
    },
    {
      "id": "s_output01",
      "type": "orch.setOutput",
      "displayName": "Результат: сколько подано",
      "props": { "name": "подано", "value": "processed" }
    },
    {
      "id": "s_close001",
      "type": "browser.close",
      "props": {}
    },
    {
      "id": "s_logend01",
      "type": "control.log",
      "props": { "level": "info", "message": "Готово: подано заявок {{ processed }}" }
    }
  ]
}
