6.9 KiB
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), есть версия «в работе» (409CONSOLIDATION_NOT_EDITABLE), ЮЛ в периметре хотя бы одной из них (422ENTITY_NOT_IN_PERIMETER); файл получаетconsolidation_id,FILE_UPLOAD.after_value.consolidation_id; после приёма ≥ 1 файла каждая версия консолидации «в работе» с ЮЛ в периметре и статусомINITIATEDпереходит вDOCUMENTS_PROCESSINGотдельной транзакцией. - Загрузка без контекста.
POST /legal-entities/{id}/files: queryconsolidation_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.