5.3 KiB
Raw Blame History

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. Основание

  • 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).
  • 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 для обоих каталогов.
  • 1.3 Словари форм: api/rules/statement_headers.yaml, statement_periods.yaml, statement_checks.yaml; модели в rules.py; тест на битый словарь; rules/README.md.

2. Оркестратор книги

  • 2.1 detect.classify_sheet: SheetKind.STATEMENT_CONTINUATION, признаки формы по области до таблицы (D-2); unit на gridbuilder, fixtures-тест классификации всех листов statements-xlsx/** и osv/** (ОСВ не изменились).
  • 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. Конвейер форм

  • 3.1 statements/detect.py: find_forms — заголовок формы, ОКУД, тип, разрез листа на блоки, расшифровки (D-3).
  • 3.2 statements/columns.py: заголовок таблицы, склейка двухстрочного заголовка, строка нумерации, колонка кодов, колонка наименований, колонки-периоды и даты (D-4); unit на три раскладки и шаблоны.
  • 3.3 statements/header.py: шапка по меткам, ИНН не аудитора, организация над меткой, дата из тройки (D-5).
  • 3.4 statements/lines.py: строки с кодом, значения, прочерки, скобки, дубликаты, предупреждение о единицах (D-6).
  • 3.5 statements/checks.py: соотношения из словаря, abs_terms, допуск, мягкие, подстроки, StatementChecks (D-7).
  • 3.6 statements/merge.py + statement.py (StatementParser.parse_sheets): склейка продолжений, одиночная страница, locator, критерий ok (D-8); unit на книгу из нескольких листов.

4. Реальные файлы, синтетика, регрессия

  • 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/.
  • 4.2 Property-тест tests/fixtures/test_statements_property.py по манифесту: типы, ИНН, статусы, сходимость §7 для полных форм, шаблоны не падают; golden для всех файлов statements-xlsx/**.
  • 4.3 Покрытие словарей форм в test_rules_coverage.py; линтер координат на statements/** и book.py.
  • 4.4 Заполнение period_start/period_end/is_from_year_start в шапке ОСВ для квартала/года (D-9); для диапазона месяцев — по результату ветки #11 (одна задача здесь либо follow-up).
  • 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» и находками.