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