---
title: "Проверить правило автоматизации на настоящем факте"
method: POST
path: "/api/v1/automation/rules/test"
tags: ["Automation"]
---

# Проверить правило автоматизации на настоящем факте

`POST /api/v1/automation/rules/test`

## Request

- Base URL: `https://erp.akeda.ru`
- URL: `https://erp.akeda.ru/api/v1/automation/rules/test`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://erp.akeda.ru/oauth2/authorize`, token URL `https://erp.akeda.ru/oauth2/token`, scopes: `akeda:delegate`)

Прогоняет документ правила «когда → если → то» по одному настоящему
факту кабинета и отвечает итогом каждого блока: «когда» — какой факт
и его поля словами; «если» — каждое сравнение с настоящим значением и
отметкой; «то» — что сделало бы каждое действие: входы после подстановки
полей факта, право исполнителя и подключён ли исполнитель действия.

Ничего не исполняется и не записывается: правило не сохраняется,
прогон не заводится, исполнитель действия не вызывается (`executed`
всегда `false`). Исполнитель проверки — вызывающий: после сохранения
правило будет работать с его правами.

Факт выбирается `sample_key` из выборки последних фактов события за 30
дней; без него — последний факт. Факты видны только те, что вызывающий
вправе видеть: письмо — из его ящиков, остальное — при праве чтения
модуля-источника. `payload` — проверить на присланном теле события
(«что если»), без настоящего факта.

Кривое событие или условие — 422 со словами, как у записи правила.
Недозаполненное действие проверке не мешает: итог приходит с `problem`.

## Query parameters

- `locale` 'ru' | 'en'

## Headers

- `X-Tenant` string, required

## Request body

- AutomationRuleTestRequest
  - `rule` object, required: Документ правила в той же форме, что у записи правила; название и исполнитель не нужны.
    - `name` string
    - `event_type` string, required
    - `condition` string
    - `conditions` object[]
      - `field` string, required
      - `op` string, required: equals, not_equals, contains, starts_with, ends_with, is_true, is_false; числа — gt, gte, lt, lte, between; даты — before, on_or_before, after, on_or_after, between
      - `value` string
      - `value_to` string: Верхняя граница «между», включительно
      - `of` string: Числовое поле-основа: value и value_to — проценты от него
      - `group` integer: Группа «или»: сравнения группы — «и», группы между собой — «или»
    - `actions` AutomationRuleBlock[]
      - `id` string
      - `kind` 'action' | 'wait': Пусто — действие
      - `command` string
      - `inputs` object
      - `wait` object: Пауза: after_event — через amount единиц unit от начала паузы; relative_to_field — до даты поля field (± amount); cancel_on — события, факт которых по той же записи прекращает правило
        - `kind` 'after_event' | 'relative_to_field'
        - `amount` integer
        - `unit` 'minutes' | 'hours' | 'days' | 'working_days'
        - `direction` 'before' | 'after'
        - `field` string
        - `at` string
        - `cancel_on` string[]
    - `branches` AutomationRuleBranch[]
      - `id` string
      - `condition` string: Выражение, собранное сервером из conditions
      - `conditions` object[], required
        - `field` string, required
        - `op` string, required
        - `value` string
        - `value_to` string
        - `of` string
        - `group` integer
      - `actions` AutomationRuleBlock[], required
        - `id` string
        - `kind` 'action' | 'wait': Пусто — действие
        - `command` string
        - `inputs` object
        - `wait` object: Пауза: after_event — через amount единиц unit от начала паузы; relative_to_field — до даты поля field (± amount); cancel_on — события, факт которых по той же записи прекращает правило
          - `kind` 'after_event' | 'relative_to_field'
          - `amount` integer
          - `unit` 'minutes' | 'hours' | 'days' | 'working_days'
          - `direction` 'before' | 'after'
          - `field` string
          - `at` string
          - `cancel_on` string[]
    - `otherwise` AutomationRuleBlock[]
      - `id` string
      - `kind` 'action' | 'wait': Пусто — действие
      - `command` string
      - `inputs` object
      - `wait` object: Пауза: after_event — через amount единиц unit от начала паузы; relative_to_field — до даты поля field (± amount); cancel_on — события, факт которых по той же записи прекращает правило
        - `kind` 'after_event' | 'relative_to_field'
        - `amount` integer
        - `unit` 'minutes' | 'hours' | 'days' | 'working_days'
        - `direction` 'before' | 'after'
        - `field` string
        - `at` string
        - `cancel_on` string[]
  - `sample_key` string: Ключ факта из выборки последних фактов события; пусто — последний факт
  - `payload` object: Тело события для проверки «что если» вместо настоящего факта

## Response `200`

Итог проверки по блокам

- object
  - `result` AutomationRuleTestResult, required
    - `sample` object, nullable
      - `key` string, required
      - `event_type` string, required
      - `entity` string, required
      - `entity_id` string, required
      - `title` string: Номер, идентификатор или тема записи
      - `occurred_at` string, date-time, required
      - `payload` object, required
      - `source` 'outbox' | 'direct' | 'payload', required
    - `executor_user_id` integer, required
    - `when` object, required
      - `ok` boolean, required
      - `event_label` string, required
      - `values` object[], required
        - `key` string, required
        - `label` string, required
        - `value` string, required
      - `code` string: no_sample — фактов события за 30 дней нет
      - `message` string
    - `condition` object, required
      - `ok` boolean, required
      - `empty` boolean, required
      - `expression` boolean, required
      - `clauses` object[], required
        - `index` integer, required
        - `field` string, required
        - `field_label` string, required
        - `op` string, required
        - `op_label` string, required
        - `expected` string
        - `expected_to` string
        - `of` string
        - `of_label` string
        - `of_actual` string
        - `group` integer
        - `actual` string, required
        - `present` boolean, required
        - `ok` boolean, required
      - `code` string
      - `message` string
    - `matched` boolean, required
    - `path_id` string: Какой путь выбран бы на этой записи: yes, id «Если ещё», else; пусто — ни один
    - `branches` object[]: Итог условия каждого «Если ещё» по порядку
      - `id` string, required
      - `condition` object, required
    - `actions` object[], required
      - `index` integer, required
      - `block_id` string
      - `path_id` string
      - `kind` 'wait': Пауза «Подождать»; у действия поля нет
      - `command` string, required
      - `label` string, required
      - `permission` string, required
      - `allowed` boolean, required
      - `connected` boolean, required
      - `status` 'would_run' | 'not_reached' | 'blocked', required
      - `code` string
      - `message` string
      - `inputs` object[], required
        - `key` string, required
        - `label` string, required
        - `template` string, required
        - `value` string, required
        - `missing` string[]
    - `problem` AutomationRuleProblem
      - `field` string, required: Путь в документе правила: event_type, conditions[1].op, actions[0].inputs.title
      - `code` string, required
      - `message` string, required
      - `hint` string
      - `params` object
      - `allowed` string[]
    - `selection` object: Отбор записей правила по расписанию (ERP-1939): сколько записей отобрал бы модуль-владелец сегодня под проверяющим, сколько прошли бы «если», пример
      - `key` string, required
      - `label` string, required
      - `count` integer, required
      - `matched` integer, required: Сколько записей прошли бы условие и пути
      - `truncated` boolean, required: Записей больше limit — за запуск возьмутся первые
      - `limit` integer, required
      - `code` string: Почему отбор не прочитан (automation.reason.<код>)
      - `message` string
      - `sample` object[], required
        - `entity_id` string, required
        - `title` string, required
        - `matched` boolean, required
        - `fields` object, required
    - `executed` boolean, required: Всегда false: проверка ничего не делает
  - `problem` AutomationRuleProblem
    - `field` string, required: Путь в документе правила: event_type, conditions[1].op, actions[0].inputs.title
    - `code` string, required
    - `message` string, required
    - `hint` string
    - `params` object
    - `allowed` string[]

## Other responses

- `400`: Некорректный запрос или нарушение бизнес-правила
- `401`: Сессия, ключ или кабинет не подтверждены
- `403`: Текущая роль не имеет требуемого права
- `404`: Запись не найдена или не видима текущему пользователю
- `422`: Событие или условие правила не проходит проверку

---

[API](https://skmtc.dev/akeda/apis/akeda-erp-client-api.md) · [All operations](https://skmtc.dev/akeda/apis/akeda-erp-client-api/llms.txt) · [OpenAPI document](https://skmtc.dev/akeda/apis/akeda-erp-client-api/revisions/3c60ded179f2?raw)
