feat(statements): парсер ББ и ОФР из Excel, контракт v1.2 (Срез 2b) #16
Loading…
x
Reference in New Issue
Block a user
No description provided.
Delete Branch "feat/14-slice-2b-statement-parser"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Код Среза 2b: парсер ББ и ОФР из Excel + контракт v1.2 (ветка раньше содержала только спеку). Refs #14. Сквозной change: RSHB/arm-ka-docs PR #27 (issue #26). Верхнеуровневый план:
docs/superpowers/plans/2026-10-06-slice-2b-statement-parser.mdв ветке docs.Что сделано
BookParser(src/parser/book.py): классификация листов книги (ОСВ / форма / продолжение / прочее),OsvParserстал конвейером листа,get_parserотдаётBookParser. Порядок документов: ОСВ, затем формы; статус книги по худшему документу;INVALID_DOCUMENT— нет ни ОСВ, ни форм.src/parser/statements/(columns, detect, header, lines, checks, merge, statement): колонка кодов (порог 60 %, диапазоны ББ 1100–1799 / ОФР 2100–2999 / расшифровки 5xxx), колонки-периоды, шапка (ИНН не аудитора), строки с кодами (в т.ч. пятизначные), самопроверка соотношений §7 (жёсткие/мягкие, допуск ±1,abs_termsдля знаков 1С), склейка листов-продолжений, критерийok.api/rules/statement_headers.yaml,statement_periods.yaml,statement_checks.yaml(+ модели и валидаторы вrules.py).DISCLOSURE,statementDocument.checks,osvDocument.header.period_start/period_end/is_from_year_start; копия схемы и примеры байт в байт с docs;CONTRACT_VERSIONне менялся.period_start,period_end,is_from_year_start).api/tests/statements_manifest.yaml), property-тест, goldenexpected_statement_parse/(18 реальных + 7 синтетических), синтетика st01–st07, интеграционный тест книги НПЗ через воркер. README «Парсер форм (ББ/ОФР)», CLAUDE.md сервиса.Как проверить
CLI на форме: см. README, раздел «Запуск на файле».
Таблица «файл → статус» (манифест)
Реальные формы — 18 файлов;
doneтолько у Межениновской. Остальное — данные файла, а не дефект разбора: страницы без шапки, «только актив», шаблоны, значения в рублях с копейками при шапке «тыс. руб.» (OQ-138; допуск ±1 не менялся — решение владельца).unagrande-co/2024-FY/Б.Б Лист 1.xlsunagrande-co/2024-FY/Б.Б. Лист 2.xlsunagrande-co/2024-FY/ОФР. Лист 1.xlsunagrande-co/2024-FY/ОФР. Лист 2 .xlsunagrande-group/2024-FY/ББ. Лист 1 .xlsunagrande-group/2024-FY/ББ. Лист 2 (2).xlsunagrande-group/2024-FY/ОФР. Лист 2.xlsunagrande-group/2025-Q3/ББ. Лист 1 3кв.25.xlsunagrande-group/2025-Q3/ББ. Лист 2 3кв.25.xlsunagrande-group/2025-Q3/ОФР. Лист 1 3кв.25.xlsunagrande-group/2025-Q3/ОФР. Лист 2 3кв.25.xlsnpz/2025-Q3/Бухгалтерская отчетность за Январь - Сентябрь 2025 г. (НОВОРОССИЙСКИЙ ПРОКАТНЫЙ ЗАВОД).xlsxmezheninovskaya/2025-Q3/1_Форма1_бух_09.xlsxmezheninovskaya/2025-Q3/1_Форма2_бух_09.xlsxtemplates/ББ до 01.01.2025.xlsxtemplates/ББ после 01.01.2025.xlsxtemplates/ОФР_до 01.01.2025.xlsxtemplates/ОФР_после 01.01.2025.xlsxRulings I made
OsvRow.extra, примерresult-osv-needs-check.json): копия схемы обязана совпадать с docs побайтноOsvRow.extra, откатывается отдельным коммитомschema_version1.1→1.2 (113 файлов) пересозданы сразу в worktree fixtures, симлинк переключён; основной checkout fixtures не тронутdocs/contracts/**после задачи 1 заморожены (копии в arm-core#27 / scan-gateway#5 на ревью); T1.1/T2.1/T2.2/T2.3 — follow-upSTATEMENT_CONTINUATION) закрыт заменойosv.py::parseнаBookParserв задаче 7 (+ тест)statement_checks.yamlне ослаблен (жёсткие 1100…1500, 2100…2300 остаютсяstrict: true); данные теста плана исправлены_RELATION/_TERMдопускают пятизначные коды справа (plan-mandated), явные правила из yaml валидатор ограничивает четырёхзначнымиneeds_checkкниги;OTHER-продолжение по правилам ББ;form_nameне передаётсяneeds_checkна редком листеneeds_check(рубли с копейками при шапке «тыс. руб.»; 1600 = 1700 расходятся на 1.94 / 9.02 / 2.48 руб.) — решение владельца, вариант Аneeds_check(2100 расходится на 17.50 / 9.43 / 1416, единицы), допуск ±1 не менялся; сценарий «Знаки 1С» перенесён на Межениновскуюdoneна реальных ОФР — допуск/нормировка в словареopen -a Docker) дляmake upинтеграционных тестов задачи 15Claude-Sessionкоммитов финальной волны URL сессии вместо UUID; историю не переписывалиНаходки и статусы
Статус каждой находки:
fixed <коммит>/deferred/rejected <причина>. Коммиты — tabular-parser (если не указано иное). Deferred уйдут в follow-up issue при закрытии.$commentсхемы упоминает «1.1» (plan-mandated, R-4)format: dateне проверяется без format_checker в check-скриптеresult-statement-excel.json—needs_checkпри одном мягком нарушении (R-4); плюс M-12: у BALANCE нет 1700 приrelations_failed: []result-statement-minimal.json(OCR) получилchecks, что противоречит «нет объекта = не проверялось»CONTRACT_VERSIONостаётся 1.0make golden-updateв T2 переписал 113 golden в основном checkout fixtures6a3661cany(...); нет проверки lo<=hi;FormTypeне в__all__; нет негативных тестов словарей; неточный комментарий periodsosv.pyне обрабатывалSTATEMENT_CONTINUATION43ee753(R-5)statement_markers(M-6)1abe212_OKUD_CODEлитерал в detect.py, английский комментарий,type: ignore(M-5)1abe212metrics.rowsформf279157bounds_spanслишком широка (= I-2)1abe212cb0bd06aad6310merged_origin; перегруженный тест; минус-знак; RED не показанfractional_share_percent(M-7)1abe212_RELATION72e5656,b9e6e31(R-6…R-9)is_sublineпо равенству моделей; устаревший раздел в fix-отчёте; 1600=1700 на фрагментах1abe212_document; вакуумный тест; docstring; повторform_name; нет теста дубликата в продолженииcan_joinигнорировал тип формы (M-10)1abe212_upper_header_rowfad0c10,e7552dc,4907935(+ fixtures f938255, b63c0a5)_upper_header_row; константа посреди файла_upper_header_row: верхняя строка при склейке хотя бы одной колонки1abe212api/uv.lockпопал в коммит4907935(M-1)336f4d6relations_failed/soft_relations_failedне попадали в wire (exclude_unset)1b17f2eFailedRelation.actualне по ближайшему вариантуabs_termsd82940a(+ fixtures ba600fc)complete: false6cd2ea8sheetsчерезlocator.count(",");document_okне покрываетhas_code_column; слабыйexplained_needs_checkdoneиз блока «Примечания»1abe2121abe212(+ fixtures 9586207)done15fb561be47e82make check-fullконтроллером (ниже)1abe2121abe212line_nameприline_name_confidence = 100у итогов и «в том числе»1abe212(+ fixtures 9586207)336f4d6,1abe212,15fb561, docs 5b34868_subline_rulesmin_codes_continuation = 1) допускает ложные присоединения листов после формы; при совпадении числа колонок строка молча присоединяется и документ может остатьсяdonebook.py:109: «была форма раньше», а не «сразу после листа формы»line_namenot_single_month); конфликт при rebase на #11На что обратить внимание человеку
min_codes_continuation = 1) может присоединить посторонний лист с единственным числом в диапазоне кодов к последнему документу (при совпадении числа колонок — молча). На реальных файлах не проявляется; follow-up с охраной «сразу после листа формы» и негативными тестами.needs_checkиз-за единиц (OQ-138); если нужноdone— решение по допуску/нормировке единиц.make up).Порядок мержа
docs #27 → arm-core #27 и scan-gateway #5 → fixtures (
feat/14-statements-golden; иначеmake test-fixturesна main упадёт) → этот PR. Новые номера вопросов: OQ-138…143 (OQ-137 в main занят горячими папками).Deferred → follow-up issue
См. строки
deferredв таблице находок (при закрытии собираются в «Follow-ups from #14»).🤖 Generated with Claude Code
Обнаружена важная находка (T9.I1): test_inn_skips_auditor_block в ONE_C fixture проходил из-за структуры данных (org INN выше auditor INN), не благодаря guard. Добавлены два явных guard-теста, которые ПАДАЮТ БЕЗ guard и ПРОХОДЯТ с guard: (a) test_inn_from_auditor_block_only_is_none — только block аудитора в шапке: Без guard (last_row): _inn находит auditor INN = 9999999999 ✗ С guard (min(last_row, auditor_from-1)): находит Nothing = None ✓ (b) test_inn_from_auditor_above_organization_inn_line — org INN до auditor block: Оба случая находят org INN = 1234567890, но без guard мог бы найти auditor ✓ Дополнительно: - Удалён импорт приватной _FULL_CONFIDENCE; использован литерал 100 с noqa - Убрана необходимая кавычка в аннотации _report_date (datetime.date | None) - Все 8 тестов зелены: 2085 passed в make check Refs #14 Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com> Claude-Session: cedd7915-2efe-41e5-988c-a9117033598bopenspec: спека Среза 2b — парсер ББ и ОФР из Excel, контракт v1.2 (на ревью)to feat(statements): парсер ББ и ОФР из Excel, контракт v1.2 (Срез 2b)