API до сводной ОСВ: периметр при создании, ячейки чек-листа, участник периметра (#42) #46

Merged
aep merged 10 commits from feat/42-front-api-gaps into main 2026-10-07 17:21:36 +03:00
Owner

Closes #42. Документы — RSHB/arm-ka-docs#51 (мержить вместе).

Что сделано

  1. POST /consolidations + необязательное legal_entity_ids (модалка [42]: все ЮЛ ГК, отмечены члены ГСК). Без поля/null — периметр из ГСК, как раньше; со списком — ровно эти ЮЛ ГК (422 ENTITY_NOT_IN_GROUP с перечнем, PERIMETER_TOO_SMALL по выбранным, [] — 422). Проверка периметра — одна функция _validate_perimeter для создания и PUT …/members. Одна транзакция, одно событие CONSOLIDATION_CREATE, ГСК не хранится (П-2).
  2. Самоописывающие ячейки чек-листа — ChecklistCellOut.document_type/account в карточке версии и GET …/checklist (CSV не изменился).
  3. Участник периметра — MemberOut.entity_type (ЮЛ/ИП/null) и osv_accounts (счета ОСВ за год версии с кварталом ≤ версии, любой статус кроме ERROR, файл не SUPERSEDED/ERROR; один запрос на карточку).

Спека — openspec/changes/front-api-gaps/ (design D-1…D-4, решения №1–12). Миграций и изменений DBML нет; ответы только расширяются.

Проверки

make check-full (9cdcb9c): EXIT 0 — unit 1199 passed, integration 796 passed, e2e 1 skipped (профиль services не поднят), mypy/ruff чисто, docker-build и web-check OK. После исправления I-1 (9d187f2): unit 1199 passed, integration 797 passed, lint чисто. openspec validate front-api-gaps --strict — valid.

Финальное ревью (opus) — находки

Маркер Находка Статус
I-1 MemberOut.entity_type не-nullable при nullable колонке → 500 на карточке/создании fixed 9d187f2 (test_card_member_without_entity_type_is_served RED→GREEN)
I-2 docs: в RecognitionStatus нет timeout/dlq fixed arm-ka-docs 2851e30
I-3 docs: multipart-поле files, а не files[] fixed arm-ka-docs 2851e30
I-4 docs: подписи статусов drawer [39] расходились с чек-листом fixed arm-ka-docs 2851e30 (решение №12)
M-1 тест osv_accounts на NULL-квартал и пустой код deferred
M-2 тест подхвата документов ЮЛ вне ГСК при явном периметре; порядок 422 периметра раньше 409 deferred
M-3 OpenAPI-тест maxItems/nullable у legal_entity_ids deferred
M-4 docs: 10-user-journey 2.1, колонка «БД» — периметр из отмеченных ЮЛ deferred
M-5 docs: вычисляемые outside_group/closed у LegalEntityOut deferred
M-6 docs: FILE_TOO_LARGE — «по умолчанию 50 МиБ» (UPLOAD_MAX_BYTES) deferred
M-7 docs: модалка [42] — дочитывать ЮЛ по offset (limit ≤ 200) deferred
M-8 design D-3: сигнатура osv_accounts(quarters) deferred (при архивации)
M-9 нумерация tasks.md ≠ плану deferred
O-1 docs make check: validate-openspec ссылается на заархивированный slice-0-skeleton (и на main) deferred
O-2 PATCH /directories/legal-entities/{id} с entity_type: null → 500 (INN_LENGTH[None]), существовало до ветки deferred

Rulings I made

  • Task 1: E501 в docstring после коммита исправлен отдельным коммитом 61bbe78 (не amend) — цена: лишний коммит.
  • Task 4 (решение №9): «неархивные ЮЛ ГК» в контракте = legal-entities?closed=false — цена: правка строки контракта.
  • Task 4 (решение №10): интервал опроса файлов 3–5 с — рекомендация — цена: правка контракта.
  • Final (решение №11): MemberOut.entity_type nullable — фронт показывает «—» для null.
  • Final (решение №12): подписи статусов drawer как в чек-листе (RECOGNIZED/NEEDS_CHECK — «Требуется проверка», CONFIRMED — «Загружен») — цена: правка контракта, если решите иначе.
  • Решения спеки без обсуждения №1–8 — openspec/changes/front-api-gaps/design.md.

Решения владельца (07.10.2026)

П-1: «Осталось: N» = все несопоставленные; П-2: ГСК в версии не хранится; П-3: OQ-43 пересмотрен — «К отчетности» во всех статусах; фильтр файлов по версии не делается; osv_accounts — вариант B; ячейки — подход B.

🤖 Generated with Claude Code

https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2

Closes #42. Документы — **RSHB/arm-ka-docs#51** (мержить вместе). ## Что сделано 1. **`POST /consolidations` + необязательное `legal_entity_ids`** (модалка [42]: все ЮЛ ГК, отмечены члены ГСК). Без поля/`null` — периметр из ГСК, как раньше; со списком — ровно эти ЮЛ ГК (422 `ENTITY_NOT_IN_GROUP` с перечнем, `PERIMETER_TOO_SMALL` по выбранным, `[]` — 422). Проверка периметра — одна функция `_validate_perimeter` для создания и `PUT …/members`. Одна транзакция, одно событие `CONSOLIDATION_CREATE`, ГСК не хранится (П-2). 2. **Самоописывающие ячейки чек-листа** — `ChecklistCellOut.document_type/account` в карточке версии и `GET …/checklist` (CSV не изменился). 3. **Участник периметра** — `MemberOut.entity_type` (`ЮЛ`/`ИП`/`null`) и `osv_accounts` (счета ОСВ за год версии с кварталом ≤ версии, любой статус кроме ERROR, файл не SUPERSEDED/ERROR; один запрос на карточку). Спека — `openspec/changes/front-api-gaps/` (design D-1…D-4, решения №1–12). Миграций и изменений DBML нет; ответы только расширяются. ## Проверки `make check-full` (9cdcb9c): EXIT 0 — unit 1199 passed, integration 796 passed, e2e 1 skipped (профиль `services` не поднят), mypy/ruff чисто, docker-build и web-check OK. После исправления I-1 (9d187f2): unit 1199 passed, integration 797 passed, lint чисто. `openspec validate front-api-gaps --strict` — valid. ## Финальное ревью (opus) — находки | Маркер | Находка | Статус | |---|---|---| | I-1 | `MemberOut.entity_type` не-nullable при nullable колонке → 500 на карточке/создании | fixed 9d187f2 (test_card_member_without_entity_type_is_served RED→GREEN) | | I-2 | docs: в `RecognitionStatus` нет `timeout`/`dlq` | fixed arm-ka-docs 2851e30 | | I-3 | docs: multipart-поле `files`, а не `files[]` | fixed arm-ka-docs 2851e30 | | I-4 | docs: подписи статусов drawer [39] расходились с чек-листом | fixed arm-ka-docs 2851e30 (решение №12) | | M-1 | тест `osv_accounts` на NULL-квартал и пустой код | deferred | | M-2 | тест подхвата документов ЮЛ вне ГСК при явном периметре; порядок 422 периметра раньше 409 | deferred | | M-3 | OpenAPI-тест `maxItems`/nullable у `legal_entity_ids` | deferred | | M-4 | docs: `10-user-journey` 2.1, колонка «БД» — периметр из отмеченных ЮЛ | deferred | | M-5 | docs: вычисляемые `outside_group`/`closed` у `LegalEntityOut` | deferred | | M-6 | docs: `FILE_TOO_LARGE` — «по умолчанию 50 МиБ» (`UPLOAD_MAX_BYTES`) | deferred | | M-7 | docs: модалка [42] — дочитывать ЮЛ по `offset` (`limit ≤ 200`) | deferred | | M-8 | design D-3: сигнатура `osv_accounts(quarters)` | deferred (при архивации) | | M-9 | нумерация tasks.md ≠ плану | deferred | | O-1 | docs `make check`: `validate-openspec` ссылается на заархивированный `slice-0-skeleton` (и на main) | deferred | | O-2 | `PATCH /directories/legal-entities/{id}` с `entity_type: null` → 500 (`INN_LENGTH[None]`), существовало до ветки | deferred | ## Rulings I made - Task 1: E501 в docstring после коммита исправлен отдельным коммитом 61bbe78 (не amend) — цена: лишний коммит. - Task 4 (решение №9): «неархивные ЮЛ ГК» в контракте = `legal-entities?closed=false` — цена: правка строки контракта. - Task 4 (решение №10): интервал опроса файлов 3–5 с — рекомендация — цена: правка контракта. - Final (решение №11): `MemberOut.entity_type` nullable — фронт показывает «—» для `null`. - Final (решение №12): подписи статусов drawer как в чек-листе (`RECOGNIZED`/`NEEDS_CHECK` — «Требуется проверка», `CONFIRMED` — «Загружен») — цена: правка контракта, если решите иначе. - Решения спеки без обсуждения №1–8 — `openspec/changes/front-api-gaps/design.md`. ## Решения владельца (07.10.2026) П-1: «Осталось: N» = все несопоставленные; П-2: ГСК в версии не хранится; П-3: OQ-43 пересмотрен — «К отчетности» во всех статусах; фильтр файлов по версии не делается; `osv_accounts` — вариант B; ячейки — подход B. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
aep added 10 commits 2026-10-07 17:18:44 +03:00
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
aep merged commit a6fae0b151 into main 2026-10-07 17:21:36 +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#46
No description provided.