{
  "schemaVersion": 1,
  "id": "2b6c0e7a-91d4-4f3a-a8e5-5d0c3f7b1a20",
  "name": "Урок: проверка клиентов в Excel",
  "description": "Читает clients.xlsx из папки процесса, проверяет телефоны, пишет результат в колонку «Статус» копии clients_result.xlsx и сводку по городам на лист «Города»",
  "variables": [
    {
      "name": "clients",
      "type": "list",
      "default": [],
      "isArgument": false
    },
    {
      "name": "status",
      "type": "string",
      "default": null,
      "isArgument": false
    },
    {
      "name": "good",
      "type": "number",
      "default": 0,
      "isArgument": false
    },
    {
      "name": "cities",
      "type": "list",
      "default": [],
      "isArgument": false
    }
  ],
  "steps": [
    {
      "id": "s_copy0001",
      "type": "file.copy",
      "displayName": "Копия таблицы для результатов",
      "props": {
        "source": "clients.xlsx",
        "destination": "clients_result.xlsx",
        "overwrite": true
      }
    },
    {
      "id": "s_read0001",
      "type": "excel.readRange",
      "displayName": "Прочитать клиентов",
      "props": {
        "path": "clients_result.xlsx",
        "sheet": "",
        "range": "",
        "hasHeaders": true
      },
      "out": {
        "rows": "clients"
      }
    },
    {
      "id": "s_log00001",
      "type": "control.log",
      "props": {
        "level": "info",
        "message": "Клиентов в таблице: {{ clients.length }}"
      }
    },
    {
      "id": "s_loop0001",
      "type": "control.forEach",
      "displayName": "Для каждого клиента",
      "props": {
        "items": "clients",
        "itemVariable": "client",
        "indexVariable": "i"
      },
      "children": {
        "body": [
          {
            "id": "s_check001",
            "type": "control.assign",
            "displayName": "Проверить телефон",
            "props": {
              "variable": "status",
              "value": "/^\\+996 \\d{3} \\d{3} \\d{3}$/.test(client['Телефон']) ? 'Проверен' : 'Ошибка в телефоне'"
            }
          },
          {
            "id": "s_count001",
            "type": "control.assign",
            "displayName": "Посчитать проверенных",
            "props": {
              "variable": "good",
              "value": "status === 'Проверен' ? good + 1 : good"
            }
          },
          {
            "id": "s_write001",
            "type": "excel.writeCell",
            "displayName": "Статус в колонку D",
            "props": {
              "path": "clients_result.xlsx",
              "sheet": "",
              "cell": "D{{ i + 2 }}",
              "value": "{{ status }}"
            }
          },
          {
            "id": "s_logrow01",
            "type": "control.log",
            "props": {
              "level": "info",
              "message": "{{ i + 1 }}. {{ client['ФИО'] }} ({{ client['Город'] }}) — {{ status }}"
            }
          }
        ]
      }
    },
    {
      "id": "s_cities01",
      "type": "control.assign",
      "displayName": "Сводка по городам",
      "props": {
        "variable": "cities",
        "value": "Object.entries(clients.reduce((acc, c) => { acc[c['Город']] = (acc[c['Город']] || 0) + 1; return acc }, {})).map(([city, n]) => ({ 'Город': city, 'Клиентов': n }))"
      }
    },
    {
      "id": "s_range001",
      "type": "excel.writeRange",
      "displayName": "Сводка на лист «Города»",
      "props": {
        "path": "clients_result.xlsx",
        "sheet": "Города",
        "startCell": "A1",
        "data": "cities",
        "writeHeaders": true
      }
    },
    {
      "id": "s_done0001",
      "type": "control.log",
      "props": {
        "level": "info",
        "message": "Готово: проверено {{ good }} из {{ clients.length }}, результат — clients_result.xlsx"
      }
    }
  ]
}
