Proposal, design (D-1…D-11, решения без обсуждения №1–№11), новая capability statement-parsing, дельта tabular-recognition-service (BookParser, schema_version 1.2), tasks. Решения владельца 06.10.2026: только парсер и контракт; страницы-продолжения без склейки между файлами; единицы как есть; пятизначные подстроки как строки; контракт MINOR 1.2; без запасного пути по именам. Refs #14 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
33 lines
3.4 KiB
Markdown
33 lines
3.4 KiB
Markdown
# Spec Delta: tabular-recognition-service
|
||
|
||
## MODIFIED Requirements
|
||
|
||
### Requirement: Парсер — заменяемый интерфейс
|
||
Разбор файла SHALL выполняться через единый интерфейс «байты + тип файла → документы/метрики/ошибка», не знающий о
|
||
NATS и S3; воркер MUST NOT зависеть от конкретной реализации. Реализация по умолчанию (`get_parser()`) SHALL быть
|
||
оркестратором книги `BookParser`: он читает книгу один раз, классифицирует листы по содержимому и отдаёт листы ОСВ
|
||
конвейеру спеки `osv-parsing`, листы форм и их продолжения — конвейеру спеки `statement-parsing`; прочие листы
|
||
пропускаются с предупреждением. Файл результата SHALL писаться с `schema_version = "1.2"`; документы книги — ОСВ в
|
||
порядке листов, затем формы в порядке листов. Заглушка `NullParser` (`error NOT_IMPLEMENTED`) SHALL использоваться только
|
||
в тестах воркера и MUST NOT быть реализацией по умолчанию. Реализация по умолчанию SHALL создаваться один раз при старте
|
||
приложения (словари читаются и проверяются там же). Каталог `api/rules/` SHALL содержать словари ОСВ (`osv_headers`,
|
||
`osv_groups`, `periods`, `data_types`), словари форм (`statement_headers`, `statement_periods`, `statement_checks`) и README.
|
||
|
||
#### Scenario: Подмена реализации в тесте
|
||
- **WHEN** в тесте воркеру передан парсер, возвращающий один `osvDocument`
|
||
- **THEN** файл результата с этим документом записан в S3, конверт имеет `status = done` и `result_s3` на этот файл
|
||
|
||
#### Scenario: Реальная ОСВ через воркер
|
||
- **WHEN** в интеграционном тесте в S3 лежит `rb/2024-FY/ОСВ_66 за 2024.xls` и опубликован запрос `file_type = XLS`
|
||
- **THEN** после ack публикуется конверт `done` с `result_schema_version = "1.2"`, файл результата проходит схему v1.2 и
|
||
содержит один `osvDocument` с `account_code_raw = "66"`
|
||
|
||
#### Scenario: Реальные формы через воркер
|
||
- **WHEN** в интеграционном тесте в S3 лежит книга `statements-xlsx/npz/2025-Q3/…xlsx` и опубликован запрос `file_type = XLSX`
|
||
- **THEN** после ack публикуется конверт `done` с `result_schema_version = "1.2"`, файл результата содержит два
|
||
`statementDocument` (`BALANCE`, `INCOME`) с `checks.relations_failed = []`
|
||
|
||
#### Scenario: Книга без ОСВ и форм
|
||
- **WHEN** в S3 лежит книга Excel, ни один лист которой не имеет признаков ОСВ или формы
|
||
- **THEN** публикуется конверт `error`, `error.code = INVALID_DOCUMENT`, сообщение называет число просмотренных листов
|