## MODIFIED Requirements ### Requirement: Шаг 7 — самопроверки §7 Шаг 7 SHALL считаться у обоих источников одним словарём `statement_checks.yaml` и выдавать `StatementChecks {relations_failed[], soft_relations_failed[]}`; каждое нарушение — `{column_index, relation, codes, expected, actual}`, где `codes` — коды цели и членов соотношения. Правила: - значение кода в колонке — сумма по всем строкам `ok` с этим кодом; строки `detail`, `unreadable`, `missing` в соотношения не входят; нарушение относится ко всем строкам его кодов; - соотношение **посчитано**, если непуста цель или хотя бы один член (есть строка `ok` с кодом и `amount` не `null`); пусто всё — соотношение пропускается; пустая цель при непустых членах и непустая цель при пустых членах — нарушение; - жёсткое соотношение не сошлось, если расхождение больше допуска ±1 в единицах формы **и** больше 0,001 % наибольшего по модулю числа соотношения — тогда оно в `relations_failed`; расхождение в пределах округления и мягкие соотношения — в `soft_relations_failed`; - члены `abs_terms` (2120, 2210, 2220, 2330, 2350, 2410) сравниваются и как записаны, и по модулю; такое соотношение подтверждает величину, но не знак (шаг 8); - набор соотношений — по `form_variant` (полный или упрощённый); `form_variant = null` — полный. В упрощённом наборе соотношения ББ жёсткие, а `2400 = 2110 − 2120 − 2330 + 2340 − 2350 − 2410` и `2400 = 2110 − 2120 − 2330 + 2340 − 2350 + 2410` ОФР — мягкие, как `2400` полного набора; - **группа альтернатив** (`group` в словаре, только у мягких соотношений одной формы и варианта): в колонке сошлась хоть одна альтернатива — ни одна не попадает в `soft_relations_failed`; не сошлась ни одна — в `soft_relations_failed` одно нарушение, ближайшая к цели альтернатива (меньшее расхождение; при пустой цели или пустых членах — первая по словарю). `group` у жёсткого соотношения и разные цели в одной группе — ошибка загрузки словаря. Соотношения 2400 каждого набора — одна группа: полный — `2400 = 2300 − 2410 + 2420` и `2400 = 2300 + 2410 + 2460`, упрощённый — два варианта выше. Знак 2410 (расход или доход по налогу, ФСБУ 4/2023) не определяется — принимается любая альтернатива (OQ-12). Группа не меняет жёстких проверок, подсветки, `needs_check` и подтверждения значений (шаг 8, Р-21); - родитель пятизначной подстроки — ближайшая четырёхзначная строка выше с теми же первыми тремя цифрами, иначе код из первых четырёх цифр; «сумма подстрок = родитель» (мягкое) — только если хотя бы одна подстрока в колонке непуста. `checks` SHALL быть у каждого `BALANCE` / `INCOME` со строками и отсутствовать у документа без строк. `duplicate_line_codes` MUST NOT выдаваться. #### Scenario: «БАЛАНС» без кода - **WHEN** строка «БАЛАНС» ушла в `detail` (код потерян), в колонке есть 1100 и 1200 - **THEN** соотношение `1600 = 1100 + 1200` посчитано и нарушено (пустая цель при непустых членах), в `relations_failed` #### Scenario: Лист только с активом - **WHEN** в ББ заполнены 1100, 1200, 1600, а 1300–1700 отсутствуют - **THEN** `1600 = 1700` нарушено (непустая цель при пустых членах), документ `needs_check` #### Scenario: Повтор кода в соотношении - **WHEN** две строки 2410 с суммами 100 и 649 - **THEN** в соотношениях код 2410 равен 749 #### Scenario: Упрощённый ОФР с доходом по налогу - **WHEN** у упрощённого ОФР 2410 записан со знаком дохода, 2400 с ним сходится только по `2400 = 2110 − 2120 − 2330 + 2340 − 2350 + 2410` - **THEN** нарушений по 2400 в `soft_relations_failed` нет #### Scenario: Доход по налогу в полной форме (AURORA-1864) - **WHEN** в колонке ОФР 2300 = 100, 2410 = 20 (без минуса и скобок), 2400 = 120 - **THEN** `2400 = 2300 − 2410 + 2420` не сошлось, но сошлось `2400 = 2300 + 2410 + 2460` из той же группы — нарушений по 2400 в `soft_relations_failed` нет #### Scenario: Расход по налогу в полной форме - **WHEN** 2300 = 100, 2410 = −20 или (20) или 20, 2400 = 80 - **THEN** сходится `2400 = 2300 − 2410 + 2420` — нарушений по 2400 в `soft_relations_failed` нет #### Scenario: Неверная чистая прибыль — одно нарушение - **WHEN** 2300 = 100, 2410 = 20, 2400 = 150 — не сходится ни одна альтернатива группы - **THEN** в `soft_relations_failed` одно нарушение по 2400 — `2400 = 2300 + 2410 + 2460` (`actual` 120 ближе к 150, чем 80); документ из-за него не `needs_check` #### Scenario: Группа считается по колонке - **WHEN** в первой колонке 2400 сходится с одной из альтернатив, во второй — ни с одной - **THEN** нарушение по 2400 одно и только у второй колонки #### Scenario: Группа у жёсткого соотношения - **WHEN** в `statement_checks.yaml` у соотношения со `strict: true` указан `group` - **THEN** словарь не загружается (ошибка загрузки `statement_checks.yaml`) #### Scenario: Округление итогов - **WHEN** `1600 = 1700` расходится на 9,02 при итогах ~17 млрд - **THEN** нарушение в `soft_relations_failed`, на статус и подсветку не влияет