Andrey Epifancev dc374a54a4 AURORA-1864: группа альтернатив соотношений 2400, знак 2410 не определяем (RSHB/pylib_ai_arm_statements#3)
§7: правило group в statement_checks.yaml, соотношения 2400 полного и
упрощённого наборов — альтернативы; OQ-12 закрыт в части 2410.
Change statement-checks-alternatives: требование «Шаг 7» спеки
statement-normalization.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 22:57:45 +04:00

75 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 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`, на статус и подсветку не влияет