53 lines
5.3 KiB
Markdown
Raw 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.

# Tasks: Срез 2b — парсер ББ и ОФР из Excel (tabular-parser)
Каждая задача ≤ половины дня, начинается с тестов, заканчивается зелёным `make check`. Пути — от корня репозитория.
Фикстуры — `../fixtures` (worktree `.wt/slice-2b/fixtures`, отдельный PR в arm-ka-fixtures); контракт v1.2 —
`../docs/contracts` (ветка `feat/26-slice-2b-statement-parser`). Детализация шагов и модели исполнителей — в плане
superpowers (`docs/superpowers/plans/`), который пишется после согласования этой спеки.
## 1. Основание
- [x] 1.1 Контракт v1.2: копия `../docs/contracts/recognition-result.schema.json` и примеров в `api/contracts/`;
`StatementDocument.document_type` + `DISCLOSURE`, `StatementChecks`/`FailedRelation`, `OsvHeader.period_start/
period_end/is_from_year_start`; `CONTRACT_VERSION = "1.2"`; тесты контракта и воркера (`result_schema_version`).
- [x] 1.2 Фикстуры форм в тестах: `conftest.py` — параметризация `statement_file` по `../fixtures/statements-xlsx/**`
(кроме `synthetic`), `statement_synthetic_file`; манифест `tests/statements_manifest.yaml`; обобщение
`golden_helpers.py` на каталог `expected_statement_parse/`; `make golden-update`/`golden-check` для обоих каталогов.
- [x] 1.3 Словари форм: `api/rules/statement_headers.yaml`, `statement_periods.yaml`, `statement_checks.yaml`; модели в
`rules.py`; тест на битый словарь; `rules/README.md`.
## 2. Оркестратор книги
- [x] 2.1 `detect.classify_sheet`: `SheetKind.STATEMENT_CONTINUATION`, признаки формы по области до таблицы (D-2); unit
на `gridbuilder`, fixtures-тест классификации всех листов `statements-xlsx/**` и `osv/**` (ОСВ не изменились).
- [x] 2.2 `book.py` (`BookParser`, D-1): перенос лимита/чтения/дедлайна/цикла из `OsvParser`, `OsvParser` без `parse`;
`get_parser` собирает `BookParser`; `test_osv_parser.py` → `test_book_parser.py` + unit на смесь листов; golden ОСВ и
property ОСВ без изменений.
## 3. Конвейер форм
- [x] 3.1 `statements/detect.py`: `find_forms` — заголовок формы, ОКУД, тип, разрез листа на блоки, расшифровки (D-3).
- [x] 3.2 `statements/columns.py`: заголовок таблицы, склейка двухстрочного заголовка, строка нумерации, колонка кодов,
колонка наименований, колонки-периоды и даты (D-4); unit на три раскладки и шаблоны.
- [x] 3.3 `statements/header.py`: шапка по меткам, ИНН не аудитора, организация над меткой, дата из тройки (D-5).
- [x] 3.4 `statements/lines.py`: строки с кодом, значения, прочерки, скобки, дубликаты, предупреждение о единицах (D-6).
- [x] 3.5 `statements/checks.py`: соотношения из словаря, `abs_terms`, допуск, мягкие, подстроки, `StatementChecks` (D-7).
- [x] 3.6 `statements/merge.py` + `statement.py` (`StatementParser.parse_sheets`): склейка продолжений, одиночная
страница, `locator`, критерий `ok` (D-8); unit на книгу из нескольких листов.
## 4. Реальные файлы, синтетика, регрессия
- [x] 4.1 Синтетика `tests/synthetic/generate_statements.py`: `st01_both_forms_one_sheet`, `st02_csv_like`, `st03_no_codes`,
`st04_mixed_book`, `st05_continuation_only`, `st06_header_variants`, `st07_single_code_continuation` → `../fixtures/statements-xlsx/synthetic/`.
- [x] 4.2 Property-тест `tests/fixtures/test_statements_property.py` по манифесту: типы, ИНН, статусы, сходимость §7 для
полных форм, шаблоны не падают; golden для всех файлов `statements-xlsx/**`.
- [x] 4.3 Покрытие словарей форм в `test_rules_coverage.py`; линтер координат на `statements/**` и `book.py`.
- [x] 4.4 Заполнение `period_start/period_end/is_from_year_start` в шапке ОСВ для квартала/года (D-9); для диапазона
месяцев — по результату ветки #11 (одна задача здесь либо follow-up).
- [x] 4.5 Интеграционный тест воркера: книга НПЗ → `needs_check` (OQ-138), два документа, `result_schema_version = "1.2"`; CLI печатает формы.
## 5. Завершение
- [ ] 5.1 README (раздел «Парсер форм»: конвейер, словари, статусы, как запустить на файле), CLAUDE.md сервиса,
`rules/README.md`; `make check-full`; rebase на main (ветки #9–#11), PR с «Rulings I made» и находками.