Перейти к содержанию

Бизнес-правила

Expecto валидирует данные на двух уровнях, и их полезно различать.

Правила валидации Entity

Entity несёт правила валидации построчного уровня. Каждое правило — выражение, которому должна удовлетворять каждая строка; строки, которые не прошли, сообщаются как нарушения (violations). Правила компилируются в DuckDB-запрос поиска нарушений вида SELECT ... WHERE NOT (expression).

Правила поддерживают:

  • Операторы: ==, !=, >, <, and, or, not.
  • Ссылки на поля: d.field_name для проверяемой строки, c.context_field для контекста сессии.
  • Lookup по каталогам: Каталоги сессии доступны как таблицы cat_<name> (cat_<name>__org, cat_<name>__project, cat_<name>__provider по скоупу) — те же имена, что в трансформерах и бизнес-правилах; например, отметить налоговый код, которого нет в cat_steuerkennzeichen__provider поставщика.
  • Lookup по таблицам контекста: таблицы из контекста сессии (_tables, например подтянутые context source) доступны как ctx_<name> — те же имена, что в трансформерах и бизнес-правилах.
  • Функции: len(), matches(), in(), is_empty(), abs(), nz(), round() и другие.
  • Severity: ERROR, WARNING или INFO.
  • Preconditions и локализованные сообщения (текст по локалям).

Редактирование в интерфейсе. Редактор правил Entity использует ту же SQL-среду, что и бизнес-правила проекта: слева обозреватель схемы показывает data с колонками Entity, а также каталоги и таблицы контекста, которые видят проекты этой Entity (cat_*, ctx, ctx_<name>); редактор дополняет их имена. Клик по таблице или колонке вставляет её в позицию курсора.

Бизнес-правила проекта

Project несёт сквозные бизнес-правила в отдельной таблице (не JSONB). Каждое — либо выражение, либо SQL-правило, упорядочено и может включаться/выключаться. Они покрывают проверки уровня поставки, а не отдельной строки — включая межсущностную reconciliation:

  • Keyed reconciliation — FULL OUTER JOIN по ключу группировки (например, файл проводок должен сходиться с файлом итогов по каждому счёту).
  • Global reconciliation — CROSS JOIN скалярных агрегатов.

Исход not_applicable

Правило может разрешиться в not applicable вместо pass/fail, когда его preconditions не выполняются для данной поставки — например правило про VAT-source, когда эта опциональная source не была прислана. Предпочитайте этот семантический исход технической ошибке (вроде «unknown table»): он говорит проверяющему, что правило просто не применилось, а не выглядит как провал.

Severity и блокировка

Блокирующий severity проекта определяет, какие нарушения мешают одобрить сессию. Нарушения WARNING и INFO показываются для ознакомления, не обязательно блокируя; нарушения ERROR обычно блокируют до устранения.

Связанное