Andrey Epifancev 2bb0e999c0 openspec: архив сквозного change console-files (#90)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-10 10:06:16 +04:00

75 lines
7.9 KiB
Markdown
Raw Permalink 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.

## Why
Панель «Первичные документы» ЮЛ [39], открытая из версии консолидации, показывает все файлы ЮЛ, в том числе
загруженные в другие консолидации той же ГК. Причина в модели: файл принадлежит ЮЛ (`stored_file.legal_entity_id`),
контекста консолидации у него нет, `GET /legal-entities/{id}/files` ничем не фильтруется. Связь с версией есть только у
подтверждённых документов (`consolidation_document`), поэтому «что версия использует» и «что аналитик загрузил в эту
консоль» сегодня разные множества, и второе нигде не хранится (`consolidation_version_id` при загрузке используется лишь
для перехода статуса версии).
Решения владельца 09.10.2026 (RSHB/arm-ka-docs#90), целевая картина:
- файл загружается **в консолидацию** (ГК + год + квартал) и становится частью её «рабочего стола», общего для всех
рабочих версий периода; рабочие версии одного периода различаются периметром;
- верифицированная версия заморожена: её первичка фиксируется в ЕХ (`ex_snapshot_item.stored_file_id`, Срез 7);
новая версия после `VERIFIED` может менять документы при том же периметре;
- что использует конкретная версия, по-прежнему определяют `consolidation_document` и чек-лист версии;
- загрузка и список файлов в контексте консоли идут по маршрутам от консолидации, а не query-параметром у ЮЛ.
Срез: вне плана `09-delivery-plan.md` — доработка Среза 2d/4 (UI первичных документов в карточке версии).
## What Changes
- **Модель, DBML v5.18:** `stored_file.consolidation_id uuid` (nullable, FK → `consolidation`) — консолидация, в
контексте которой загружен файл; `NULL` — загрузка без контекста (страница ЮЛ, монозаёмщики, API). Индекс
`(legal_entity_id, consolidation_id)`. Пишется один раз при загрузке; при автозамене наследуется заменённым файлом,
если у нового файла контекста нет.
- **API ядра:** новые маршруты `POST /consolidations/{consolidation_id}/legal-entities/{legal_entity_id}/files`
(загрузка в консоль) и `GET /consolidations/{consolidation_id}/legal-entities/{legal_entity_id}/files` (рабочий стол
консоли для ЮЛ). У `POST /legal-entities/{id}/files` query `consolidation_version_id` убирается — маршрут остаётся
для загрузки без контекста. `FileOut.consolidation_id` в списках и карточке файла. Переход `INITIATED →
DOCUMENTS_PROCESSING` после загрузки — у всех версий консоли «в работе», где ЮЛ в периметре.
- **Правила домена, §9.5:** загрузка в консоль (проверки, коды ошибок, переход версий), состав рабочего стола,
наследование при автозамене.
- **Фронт arm-web:** панель [39] и загрузка [40] ходят на маршруты консолидации; переключатель «Все документы
организации» с подписью консолидации у файла; загрузка недоступна, если открытая версия не «в работе».
- **Документы:** `model/data-model-v5.18.dbml`, `model/entities-v5.18.md`, `04-data-model-guide.md`,
`05-domain-rules.md` §9.5, `10-user-journey.md` п. 2.5, `dev/frontend-api-guide.md`,
`dev/api-contract-files-directories.md`, `dev/api-contract-slice-4.md`, `dev/qa-guide.md`, `07-open-questions.md`.
Дочерние change'и `console-files`: RSHB/arm-core (миграция `0006_dbml_v5_18`, сервис, маршруты, спеки `primary-files`
и `documents-api`), RSHB/arm-web (спека `primary-files-ui`). Issue этого репозитория — RSHB/arm-ka-docs#90.
Контракт обмена с сервисами распознавания не меняется, `schema_version` прежняя.
## Non-goals
- Несколько рабочих версий одного периода с разным периметром и «новая версия после `VERIFIED`» ядро пока не создаёт
(`POST /consolidations` создаёт только версию 1); эти правила — отдельный срез (OQ, design «Decisions» №6). Этот
change лишь делает модель файлов совместимой с ними.
- Замороженный список первички верифицированной версии в панели не строится: заморозка — `ex_snapshot` (Срез 7).
Панель из карточки версии не «в работе» показывает рабочий стол консоли как есть, без кнопки загрузки.
- Признак «документ подходит / привязан к версии» в списке файлов не вводится: это чек-лист версии (OQ-120).
- Привязка файла к версии (`consolidation_file`) не вводится: отвергнута на brainstorming 09.10.2026 (design, №1).
- `consolidation_document`, правило `fits`, подхват при создании версии и добавлении ЮЛ в периметр — без изменений.
- Горячие папки scan-gateway файлов в ядре не создают; их контекст не рассматривается.
- Backfill касается только файлов с документами в `consolidation_document`; прочие остаются `NULL`.
## Capabilities
### New Capabilities
### Modified Capabilities
- Спецификации этого репозитория (`dev-environment`, `quality-checks`, `recognition-contract`) не меняются; требования
к API и UI — в дочерних change'ах arm-core (`primary-files`, `documents-api`) и arm-web (`primary-files-ui`).
## Impact
- `arm-core`: миграция с backfill; `services/primary_files.py` (загрузка, `page_files`, автозамена в
`services/result_mapping.py`), `repositories/files.py`, `api/endpoints/files/upload.py`, `read.py`, новый роутер
под `/consolidations/{id}/legal-entities/{le}/files`, `schemas/files.py`; тесты; README «Ошибки API».
- `arm-web`: `services/api/files.ts`, стор `consolidations` (`current_consolidation_id`), `widgets/FilesDrawer/*`,
типы `FileOut`.
- Совместимость: query `consolidation_version_id` у `POST /legal-entities/{id}/files` исчезает — фронт меняется
одновременно с ядром (стенд обновляется после слияния обоих PR). Файлы, загруженные до миграции без привязок,
остаются «вне консолидации» и видны только по переключателю «Все документы организации».