72 lines
6.9 KiB
Markdown
72 lines
6.9 KiB
Markdown
## Why
|
||
|
||
Панель «Первичные документы» ЮЛ, открытая из версии консолидации, показывает все файлы ЮЛ: `stored_file` не знает,
|
||
в какую консолидацию загружен, `GET /legal-entities/{id}/files` не фильтруется, а `consolidation_version_id` при
|
||
загрузке служит только переходу статуса версии. Решения владельца 09.10.2026 (RSHB/arm-ka-docs#90, сквозной change
|
||
`../docs/openspec/changes/console-files/`, DBML v5.18): файл загружается **в консолидацию** (ГК + период) и образует
|
||
её «рабочий стол», общий для всех версий периода; что использует конкретная версия, по-прежнему определяет
|
||
`consolidation_document`; загрузка и список в контексте консоли — маршрутами от консолидации.
|
||
|
||
Срез: доработка Срезов 2c/4 вне плана `09-delivery-plan.md` (запись в разделе «Срез 2d»). Репозиторий — только
|
||
`arm-core`; фронт — RSHB/arm-web (свой change), документы — RSHB/arm-ka-docs#90. Issue — RSHB/arm-core#96.
|
||
|
||
Правила домена: `05-domain-rules.md` §9.1 (переход при загрузке), §9.5 п. 1, 3, 8 и 11 (редакция v5.18 из docs #90).
|
||
Таблицы DBML v5.18: `stored_file` (новая колонка `consolidation_id`, индекс `(legal_entity_id, consolidation_id)`),
|
||
читаются `consolidation`, `consolidation_version`, `consolidation_member`, `consolidation_document`, `document`.
|
||
|
||
## What Changes
|
||
|
||
- **Модель и миграция.** `StoredFile.consolidation_id` (nullable FK → `consolidation`, последняя колонка), индекс
|
||
`ix_stored_file_legal_entity_id_consolidation_id`; `DBML_VERSION = "5.18"`, `make dbml-check` по
|
||
`../docs/model/data-model-v5.18.dbml`; миграция `0006_dbml_v5_18`: колонка, FK, индекс, backfill по
|
||
`consolidation_document` (при привязках к версиям разных периодов — самый ранний), откат — удаление.
|
||
- **Загрузка в консолидацию.** `POST /consolidations/{consolidation_id}/legal-entities/{legal_entity_id}/files`
|
||
(`DOCUMENT_EDIT`): консолидация и ЮЛ видимы (404), есть версия «в работе» (409 `CONSOLIDATION_NOT_EDITABLE`), ЮЛ в
|
||
периметре хотя бы одной из них (422 `ENTITY_NOT_IN_PERIMETER`); файл получает `consolidation_id`,
|
||
`FILE_UPLOAD.after_value.consolidation_id`; после приёма ≥ 1 файла каждая версия консолидации «в работе» с ЮЛ в
|
||
периметре и статусом `INITIATED` переходит в `DOCUMENTS_PROCESSING` отдельной транзакцией.
|
||
- **Загрузка без контекста.** `POST /legal-entities/{id}/files`: query `consolidation_version_id` удалён, коды
|
||
`VERSION_NOT_FOUND`/`VERSION_NOT_EDITABLE` у загрузки больше не возникают; `consolidation_id = NULL`.
|
||
- **Рабочий стол.** `GET /consolidations/{consolidation_id}/legal-entities/{legal_entity_id}/files` (`DOCUMENT_VIEW`):
|
||
файлы ЮЛ с этим `consolidation_id` ∪ файлы ЮЛ с документом, привязанным к любой версии консолидации; `limit`,
|
||
`offset`, `include_superseded`; та же карточка `FileOut`.
|
||
- **Карточка файла.** `FileOut.consolidation_id: uuid | null` в списках и `GET /files/{id}`.
|
||
- **Автозамена.** Новый файл без контекста наследует `consolidation_id` первого (по `id`) заменённого файла, у которого
|
||
он задан.
|
||
- Спеки `primary-files`, `documents-api`, `data-model`; README («Ошибки API», таблицы маршрутов, §9.1), `CLAUDE.md`.
|
||
|
||
## Non-goals
|
||
|
||
- Несколько рабочих версий одного периода и «новая версия после `VERIFIED`» не реализуются (OQ-160, отдельный срез);
|
||
переход статуса после загрузки написан для N версий, но создаётся по-прежнему одна.
|
||
- Замороженный список первички верифицированной версии (ЕХ, Срез 7) не строится; стол показывается для версии любого
|
||
статуса, загрузка проверяет только наличие версии «в работе».
|
||
- Признак «документ привязан / подходит версии» в `FileOut` не вводится (чек-лист, OQ-120).
|
||
- `consolidation_document`, `fits`, подхват, удаление файла — без изменений.
|
||
- Перенос файла между консолидациями, правка `consolidation_id` через API — нет.
|
||
- Контракт NATS и S3 не меняется.
|
||
|
||
## Capabilities
|
||
|
||
### New Capabilities
|
||
|
||
### Modified Capabilities
|
||
- `primary-files`: загрузка в консолидацию (новый маршрут, коды ошибок, переход N версий), удаление query у загрузки ЮЛ,
|
||
наследование `consolidation_id` при автозамене.
|
||
- `documents-api`: рабочий стол консоли, `consolidation_id` в карточке файла.
|
||
- `data-model`: DBML v5.18, миграция 0006 с backfill.
|
||
|
||
## Impact
|
||
|
||
- `api/src/models/files.py`, `api/src/models/__init__.py`, `api/alembic/versions/0006_dbml_v5_18.py`, `Makefile`
|
||
(`DBML`), `api/scripts/dbml_parity.py` (путь по умолчанию), `api/tests/dbml_helpers.py`.
|
||
- `api/src/repositories/files.py` (стол), `api/src/repositories/consolidations.py` (консолидация по id, версии
|
||
консолидации под `FOR UPDATE`), `api/src/services/primary_files.py` (загрузка в консолидацию, стол),
|
||
`api/src/services/result_mapping.py` (наследование), `api/src/services/documents.py` (`file_out`),
|
||
`api/src/schemas/files.py`, `api/src/api/endpoints/files/upload.py`, новый `consolidation_files.py`,
|
||
`api/src/api/endpoints/files/__init__.py`.
|
||
- Тесты: `test_api_files_upload.py` (раздел «в контексте версии» переписывается под консолидацию),
|
||
`test_api_files_read.py`/новый `test_api_consolidation_files.py`, `test_migrations.py`, `test_models_part_04_06.py`,
|
||
тесты автозамены.
|
||
- Клиент arm-web меняется одновременно (query удалён); стенд обновляется после слияния обоих PR.
|