{
  "schemaVersion": 1,
  "id": "8d2a3b4c-5e6f-4a70-9c8d-9e0f1a2b0308",
  "name": "Демо: платежи в отчёт",
  "description": "Пишет 100 платежей в отчёт «Платежи» (ключ payments: номер — ключ записи, сумма, дата, статус Новый/Оплачен/Ошибка) одним вызовом, повторно записывает 5 из них с режимом upsert (без дублей — обновляются), затем пробует сумму «12,5 сом»: это бизнес-ошибка ReportValidation. По умолчанию она перехватывается и пишется в журнал; strict = true — задание завершается этой ошибкой",
  "variables": [
    { "name": "report", "type": "string", "default": "payments", "isArgument": true },
    { "name": "count", "type": "number", "default": 100, "isArgument": true },
    { "name": "strict", "type": "boolean", "default": false, "isArgument": true },
    { "name": "payments", "type": "list", "default": [], "isArgument": false },
    { "name": "added", "type": "number", "default": 0, "isArgument": false },
    { "name": "updated", "type": "number", "default": 0, "isArgument": false },
    { "name": "paid", "type": "list", "default": [], "isArgument": false },
    { "name": "changed", "type": "boolean", "default": false, "isArgument": false },
    { "name": "badValue", "type": "string", "default": null, "isArgument": false },
    { "name": "error", "type": "object", "default": null, "isArgument": false }
  ],
  "steps": [
    {
      "id": "s_data0001",
      "type": "control.assign",
      "displayName": "Подготовить платежи",
      "props": {
        "variable": "payments",
        "value": "Array.from({ length: count }, (_, i) => ({ number: 'П-' + String(i + 1).padStart(4, '0'), amount: 100 + i + 0.5, paid_on: '09.11.2026', status: 'Новый' }))"
      }
    },
    {
      "id": "s_many0001",
      "type": "orch.reportAddMany",
      "displayName": "Записать все платежи",
      "props": { "report": "{{ report }}", "records": "payments", "mode": "upsert" },
      "out": { "inserted": "added" }
    },
    {
      "id": "s_logmany1",
      "type": "control.log",
      "props": { "level": "info", "message": "В отчёт «{{ report }}» добавлено записей: {{ added }}" }
    },
    {
      "id": "s_upsert01",
      "type": "orch.reportAddMany",
      "displayName": "Отметить первые 5 оплаченными (upsert)",
      "props": {
        "report": "{{ report }}",
        "records": "payments.slice(0, 5).map(p => ({ ...p, status: 'Оплачен' }))",
        "mode": "upsert"
      },
      "out": { "updated": "updated" }
    },
    {
      "id": "s_logups01",
      "type": "control.log",
      "props": { "level": "info", "message": "Повторно записано по ключу (обновлено, без дублей): {{ updated }}" }
    },
    {
      "id": "s_find0001",
      "type": "orch.reportFind",
      "displayName": "Найти оплаченные",
      "props": { "report": "{{ report }}", "where": "({ status: 'Оплачен' })", "sort": "number:asc", "limit": 1000 },
      "out": { "records": "paid" }
    },
    {
      "id": "s_logfind1",
      "type": "control.log",
      "props": { "level": "info", "message": "Оплачено: {{ paid.length }}, первый — {{ paid[0].values.number }}" }
    },
    {
      "id": "s_update01",
      "type": "orch.reportUpdate",
      "displayName": "Платёж с ошибкой",
      "props": { "report": "{{ report }}", "key": "({ number: 'П-' + String(count).padStart(4, '0') })", "values": "({ status: 'Ошибка' })" },
      "out": { "updated": "changed" }
    },
    {
      "id": "s_badval01",
      "type": "control.assign",
      "displayName": "Сумма текстом — так в отчёт не записать",
      "props": { "variable": "badValue", "value": "'12,5 сом'" }
    },
    {
      "id": "s_strict01",
      "type": "control.if",
      "displayName": "Строгий режим?",
      "props": { "condition": "strict" },
      "children": {
        "then": [
          {
            "id": "s_badadd01",
            "type": "orch.reportAdd",
            "displayName": "Записать неверную сумму (задание упадёт бизнес-ошибкой)",
            "props": { "report": "{{ report }}", "values": "({ number: 'П-9999', amount: badValue, paid_on: '09.11.2026', status: 'Новый' })", "mode": "insert" }
          }
        ],
        "else": [
          {
            "id": "s_try00001",
            "type": "control.tryCatch",
            "displayName": "Записать неверную сумму и перехватить ошибку",
            "props": { "errorVariable": "error" },
            "children": {
              "try": [
                {
                  "id": "s_badadd02",
                  "type": "orch.reportAdd",
                  "displayName": "Записать неверную сумму",
                  "props": { "report": "{{ report }}", "values": "({ number: 'П-9999', amount: badValue, paid_on: '09.11.2026', status: 'Новый' })", "mode": "insert" }
                }
              ],
              "catch": [
                {
                  "id": "s_biz00001",
                  "type": "control.if",
                  "props": { "condition": "error.code === 'ReportValidation'" },
                  "children": {
                    "then": [
                      { "id": "s_logbiz01", "type": "control.log", "props": { "level": "warn", "message": "Бизнес-ошибка {{ error.code }}: {{ error.message }}" } }
                    ],
                    "else": [
                      { "id": "s_rethrow1", "type": "control.throw", "props": { "message": "Отчёт недоступен: {{ error.code }} — {{ error.message }}" } }
                    ]
                  }
                }
              ]
            }
          }
        ]
      }
    },
    {
      "id": "s_output01",
      "type": "orch.setOutput",
      "displayName": "Результат: сколько записано",
      "props": { "name": "платежи", "value": "({ добавлено: added, обновлено: updated, оплачено: paid.length, ошибка: changed })" }
    },
    {
      "id": "s_done0001",
      "type": "control.log",
      "props": { "level": "info", "message": "Готово: добавлено {{ added }}, обновлено {{ updated }}" }
    }
  ]
}
