parent_code у строк формы ББ/ОФР, общая subline_parents (#118, AURORA-1527) #119

Merged
aep merged 2 commits from feat/118-subline-parent into main 2026-10-16 18:35:19 +03:00
Owner

Closes #118. Связано: AURORA-1527, arm-web #34/#35, docs #114/#115, arm-tabular-parser #45/#46, arm-ka-fixtures #21/#22.

Что сделано

  • domain/statement_checks.py: правило родителя пятизначной подстроки — в чистой subline_parents(codes); _subline_rules использует её (поведение проверки не менялось).
  • GET /documents/{id}/statement (и ответы PATCH, …/checks/accept): lines[].parent_code: str | null — вычисляемое, не хранится; у шаблонных строк и строк без родителя null. Родители считаются в StatementService.checks_report по тем же кодам и в том же порядке (statement_amounts), что и проверка.
  • Новое правило (решение владельца 16.10.2026): мягкая «родитель = Σ подстрок» по колонке проверяется, только если хотя бы одна подстрока родителя в ней имеет значение (amount не null; ноль — значение). Все пусты — не проверяется (ни нарушения, ни предупреждения). Правило в коде run_checks (подстроки генерируются кодом, словарь yaml не менялся). Остальные соотношения и «пустая сумма = 0» не менялись.
  • README обновлён. Парсеры, миграции, DBML — без изменений.

Проверка

  • TDD: тесты domain (+9) и API (+4); новые тесты правила были красными до правки. Регрессия на ББ Унагранде «Лист 1 3кв.25»: в soft_failed нет 1150/1170/1210; существующий тест подстрок обновлён (подстрока заполняется, иначе проверки по колонке нет).
  • make check-full — exit 0 (ruff, mypy, unit, dbml-check, check-infra, test-integration 948 passed, docker-build, web-check); e2e — 1 skipped (нет профиля services).

Rulings I made

  • R-1: родитель считается по строкам проверки; подстрока под пустым шаблонным родителем — null.
  • R-2: subline_parents порядок не сортирует (порядок задаёт вызывающий).
  • R-3: checks_report возвращает (report, cross, parents) — без второго запроса.
  • R-4: правило «пустая детализация» — в коде, а не в yaml; значение = amount is not None; идентично tabular-parser #46.
  • O-1: ORDER BY line_code в SQL vs сортировка Python — для цифровых кодов совпадают, не менялось.

🤖 Generated with Claude Code

Closes #118. Связано: AURORA-1527, arm-web #34/#35, docs #114/#115, arm-tabular-parser #45/#46, arm-ka-fixtures #21/#22. ## Что сделано - `domain/statement_checks.py`: правило родителя пятизначной подстроки — в чистой `subline_parents(codes)`; `_subline_rules` использует её (поведение проверки не менялось). - `GET /documents/{id}/statement` (и ответы `PATCH`, `…/checks/accept`): `lines[].parent_code: str | null` — вычисляемое, не хранится; у шаблонных строк и строк без родителя `null`. Родители считаются в `StatementService.checks_report` по тем же кодам и в том же порядке (`statement_amounts`), что и проверка. - Новое правило (решение владельца 16.10.2026): мягкая «родитель = Σ подстрок» по колонке проверяется, только если хотя бы одна подстрока родителя в ней имеет значение (`amount` не `null`; ноль — значение). Все пусты — не проверяется (ни нарушения, ни предупреждения). Правило в коде `run_checks` (подстроки генерируются кодом, словарь yaml не менялся). Остальные соотношения и «пустая сумма = 0» не менялись. - README обновлён. Парсеры, миграции, DBML — без изменений. ## Проверка - TDD: тесты domain (+9) и API (+4); новые тесты правила были красными до правки. Регрессия на ББ Унагранде «Лист 1 3кв.25»: в `soft_failed` нет 1150/1170/1210; существующий тест подстрок обновлён (подстрока заполняется, иначе проверки по колонке нет). - `make check-full` — exit 0 (ruff, mypy, unit, dbml-check, check-infra, test-integration 948 passed, docker-build, web-check); `e2e` — 1 skipped (нет профиля `services`). ## Rulings I made - R-1: родитель считается по строкам проверки; подстрока под пустым шаблонным родителем — `null`. - R-2: `subline_parents` порядок не сортирует (порядок задаёт вызывающий). - R-3: `checks_report` возвращает `(report, cross, parents)` — без второго запроса. - R-4: правило «пустая детализация» — в коде, а не в yaml; значение = `amount is not None`; идентично tabular-parser #46. - O-1: `ORDER BY line_code` в SQL vs сортировка Python — для цифровых кодов совпадают, не менялось. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 1 commit 2026-10-16 17:49:08 +03:00
Правило «подстрока относится к ближайшей четырёхзначной строке выше с теми же тремя цифрами,
иначе к строке из первых четырёх цифр» вынесено в subline_parents; им пользуются проверка
«сумма подстрок = родитель» и ответ GET /documents/{id}/statement (поле lines[].parent_code,
вычисляется, в БД не хранится).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep added 1 commit 2026-10-16 18:26:43 +03:00
По колонке соотношение считается, только если хотя бы одна подстрока родителя имеет значение
(amount не null; ноль — значение). Прочие соотношения и «пустая сумма = 0» не менялись.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep merged commit 423929ce64 into main 2026-10-16 18:35:19 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RSHB/arm-core#119
No description provided.