7.1 KiB
Raw Blame History

Spec Delta

MODIFIED Requirements

Requirement: Соотношения §7 по колонкам

Проверки SHALL считаться чистой функцией по текущим financial_statement_value.amount документа для каждой колонки отдельно по словарю §7 установленной библиотеки arm_statements (statement-normalization; своей копии словаря ядро не держит): соотношение посчитано, если непуста цель (левая часть) или хотя бы один член (есть строка ok с кодом и непустой суммой); если пусто всё — соотношение пропускается. В посчитанном соотношении отсутствующий код и пустая сумма в арифметике — 0, но пустая цель при непустых членах и непустая цель при пустых членах — нарушение (пустая цель даёт expected = null, P1-21 пакета). Выполнено, если |левая − правая| ≤ tolerance (1, в единицах формы) хотя бы в одном варианте правой части — как записано или с кодами abs_terms по модулю. Нарушение жёсткого (strict) соотношения, не превышающее rounding_tolerance_percent (0,001 %) от наибольшего по модулю числа соотношения, SHALL считаться мягким («в пределах округления»). Мягкие: соотношения strict: false и «сумма пятизначных подстрок = четырёхзначный родитель». Результат — {failed: [...], soft_failed: [...]}, элемент — {column_index, relation, expected, actual}, где expected и actual могут быть null (expected = null — пустая цель); не хранится как есть: нарушения при приёме и пересчёте записываются в document_issue.

Присутствующими SHALL считаться суммы агрегата формы по коду (требование «Агрегат формы по коду»): строки ok формы из БД, кроме строк, созданных правкой аналитика (row_index IS NULL), у которых все суммы пустые; строки detail, unreadable, missing и строки, достроенные в ответе по справочнику (documents-api, id = null), в проверках MUST NOT участвовать. Созданная правкой строка с хотя бы одной непустой суммой проверяется по всем колонкам; в колонке, где её сумма пуста, она — пустая цель (или член с суммой 0). Повтор кода в форме суммируется. Результат нарушения несёт codes (коды цели и членов соотношения) и line_ids (все строки ok этих кодов). Соотношения считает точка входа пакета для пересчёта по агрегату формы; запись в БД — только в виде document_issue при приёме и пересчёте, api/rules/statement_checks.yaml и код его загрузки в ядре MUST NOT существовать.

Scenario: Сходящийся баланс

  • WHEN проверяется форма mezheninovskaya/2025-Q3/1_Форма1_бух_09
  • THEN failed пуст

Scenario: Нарушение жёсткого соотношения

  • WHEN у баланса 1600 = 1000, 1100 = 300, 1200 = 600 в колонке 0
  • THEN failed содержит {column_index: 0, relation: "1600 = 1100 + 1200", expected: 1000, actual: 900}

Scenario: Расходы со знаком минус

  • WHEN ОФР 2110 = 100, 2120 = −60, 2100 = 40
  • THEN 2100 = 2110 − 2120 выполнено через вариант с abs_terms

Scenario: Правка исправляет нарушение

  • WHEN аналитик правит 1200 с 600 на 700 в форме из предыдущего сценария
  • THEN проверка по текущим суммам: failed пуст

Scenario: Пустая шаблонная строка не проверяется

  • WHEN в форме нет строки 1700 (в ответе она достроена пустой и как значение в проверках не участвует), 1300 + 1400 + 1500 = 2 371 333 в колонке 0
  • THEN сама строка 1700 не проверяется, но соотношение 1700 = 1300 + 1400 + 1500 посчитано и нарушено: expected = null, actual = 2371333; 1600 = 1700 (цель 1600 есть в форме, 1700 пуста) тоже нарушено; потерявшая итоговую строку форма блокирует подтверждение (CHECKS_NOT_PASSED) до правки строки или акцепта (P3-30)

Scenario: Все стороны пусты

  • WHEN в колонке нет ни цели, ни членов соотношения
  • THEN соотношение пропускается, нарушения нет

Scenario: Заполненная шаблонная строка проверяется

  • WHEN аналитик заполнил 1700 = 2 371 333 только в колонке 0, а в колонке 1 1300 + 1400 + 1500 = 2 000 000
  • THEN в колонке 0 соотношение выполнено; в колонке 1 failed содержит 1700 = 1300 + 1400 + 1500 с expected = null (1700 в колонке 1 пуста), actual = 2000000

Scenario: Очищенная шаблонная строка

  • WHEN затем аналитик очищает 1700 в колонке 0 (amount = null)
  • THEN строка 1700 снова не участвует в проверках как значение: пустая цель при непустых членах — нарушение expected = null в каждой колонке (прежнее «очищенная строка не цель» не действует, P3-30)

Scenario: Повтор кода суммируется

  • WHEN в ББ две строки 1230 со значениями 100 и 50 в колонке 0
  • THEN соотношения берут 1230 = 150

Scenario: Копии словаря §7 в ядре нет

  • WHEN проверяется репозиторий ядра после перехода на пакет
  • THEN файла api/rules/statement_checks.yaml нет, load_check_rules / run_checks в api/src не встречаются; допуск tolerance берётся из правил пакета