Срез 2c: загрузка файлов ОСВ, цикл маппинга результата в document/osv_entry, API документов, DBML v5.15 #15

Merged
aep merged 35 commits from feat/14-slice-2c-osv-ingest into main 2026-10-06 00:56:15 +03:00
2 changed files with 11 additions and 0 deletions
Showing only changes of commit 96525f1ace - Show all commits

View File

@ -544,6 +544,12 @@ docker compose -f ../docs/dev/docker-compose.yml -p arm-ka --profile services st
Образ собирается из `../tabular-parser` (main соседнего репозитория workspace).
**Перед e2e остановите другие экземпляры ядра, подписанные на `recognition.result`** (контейнер `arm-core` из профиля
`services`, локальный `make run`/`run_server.py` с `NATS_ENABLED=true`): тест подписывается на реальный subject в боевой
queue group `arm-core`, подписчики группы получают сообщения по очереди (round-robin), и ack/результат парсера уйдут
чужому экземпляру (он отбросит их как `unknown_job`, у него другая БД) — тест упадёт по таймауту 60 с. Поднимайте только
`tabular-parser` (`--no-deps`), как в команде выше.
### Проверка ORM и DBML
Модель данных — `../docs/model/data-model-v5.15.dbml`. ORM обязана совпадать с ней один в один:

View File

@ -5,6 +5,10 @@
tabular-parser (читает файл из MinIO, пишет результат в MinIO) → inbox (ack, результат) → цикл маппинга → файл
`PROCESSED`, документ и строки ОСВ. Предусловие — профиль `services` (`tests/e2e/conftest.py`); иначе тест пропускается.
Очистка: `DELETE /files/{id}` через API и удаление временной БД (фикстура `committed_sessionmaker`).
ВНИМАНИЕ: приложение подписывается на реальный `recognition.result` в боевой queue group `arm-core`; если в это время
работает другой экземпляр ядра (контейнер `arm-core` профиля `services`, локальный сервер с `NATS_ENABLED=true`),
часть ack/результатов уйдёт ему и тест упадёт по таймауту. Перед прогоном остановите такие экземпляры (README).
"""
import asyncio
@ -135,6 +139,7 @@ async def test_real_osv_is_parsed_end_to_end(
(brief,) = card["documents"]
assert (brief["document_type"], brief["osv_account_code"]) == ("OSV", "66")
assert (brief["period_year"], brief["period_quarter"], brief["is_cumulative"]) == (2024, "Q4", True)
# MATCH достигается именно по имени: ИНН в шапке ОСВ нет (D-8), имя ЮЛ совпадает с шапкой
assert brief["counterparty_check"] == "MATCH"
assert brief["status"] == "RECOGNIZED"