ОСВ: реквизит «Контрагенты.ИНН» строкой под контрагентом — ИНН родителю, без «.0» (#32) #33

Merged
aep merged 2 commits from feat/32-osv-inn-subconto into main 2026-10-13 11:20:52 +03:00
Owner

Closes #32.

Что было

ОСВ 60 ООО «Зерновая компания „Новопетровская“» за 9 мес. 2025 (замечание банка 13.10.2026): шапка варианта 2
«субконто: Контрагенты, Контрагенты.ИНН», ИНН — числом отдельной строкой под контрагентом. Парсер принимал
реквизит за второй уровень контрагентов: в «Контрагент / аналитика» — 2370012036.0, наименования нет, ИНН null
→ нет признака ГК/ГСК/Внешний; в свод ядра попадали обе строки (наименование и ИНН) с одинаковыми суммами.

Что сделано

  • header.py: <группировка>.ИНН (суффикс — словарь service_columns.inn, префикс — имя предыдущей группировки
    COUNTERPARTY) — InnAttribute; в group_schema не попадает, у владельца has_inn = true; GroupSchema.positions
    держит позицию строк для классификатора; build_group_schema — прежний интерфейс.
  • classify.py: строка реквизита — OTHER с ИНН ячейки (column_inn, R-24); glue_inn_attributes отдаёт ИНН
    контрагенту, убирает строку, поднимает её детей (договоры) на уровень, предупреждение «ИНН … отнесён к контрагенту
    в строке …». Не склеилось (несколько строк ИНН, суммы не равны, ИНН не распознан или расходится) — OTHER,
    предупреждение с причиной, needs_check.
  • readers/_common.py: целый float (xls) читается как int — без «.0».
  • Шапка варианта 1 (строка Контрагенты.ИНН в блоке заголовка под Контрагенты) — тот же реквизит (H-1,
    коммит 02ad8be); общая часть вариантов — _attach_inn_attribute, _positions.
  • Фикстура osv-dkb/novopetrovskaya/2025-Q3/60_ 9мес.2025г.xls + golden — arm-ka-fixtures PR (ветка feat/32-osv-inn-subconto).
  • Правило — arm-ka-docs PR (05-domain-rules.md §1.1, §1.3; OQ-162).

Файл банка после правки: done, 713 из 716 контрагентов с ИНН, 3 физлица без ИНН, «Итого» = корню.

Проверки

  • make check — зелёный (2269 passed после варианта 1; golden прочих 138 файлов без изменений).
  • make docker-build — ок.
  • make test-integration — плавает 1 тест (test_request_gets_ack_then_parser_error_and_duplicate_gets_only_ack,
    «лишнее сообщение»): на тот же NATS localhost:4222 подписан контейнер стенда arm-ka-tabular-parser-1 в той же
    queue group и забирает дубль; 2 из 3 прогонов зелёные, сценарий (битый zip) правкой не затронут.

Rulings I made

  • R-1 — пустая ячейка реквизита ИНН (физлицо, 1С выводит строку без значения) — «ИНН не указан»: строка
    склеивается, ИНН контрагента остаётся null, needs_check не ставится. Иначе файл банка целиком уходил бы на
    проверку из-за трёх физлиц. Цена ошибки: если пустая ячейка где-то значит «ИНН потерян», аналитик не получит
    needs_check — но строка контрагента без ИНН и так видна в «Нужно сопоставить» сводной ОСВ.

Находки

Маркер Находка Статус
O-1 Интеграционный тест конкурирует с контейнером стенда за queue group на общем NATS — тест флейкует при поднятом стенде deferred
H-1 Владелец: шапка варианта 1 тоже должна разбираться fixed 02ad8be
H-2 Владелец: ИНН над/под контрагентом, в дереве и нет, с суммами и без — все 8 раскладок по содержимому; сейчас «ИНН под, не в дереве, без сумм» молча отдаёт ИНН следующему контрагенту (механизм OQ-130, уже в main) deferred → отдельная задача
O-2 В строках этого файла extra содержит колонки C/G/K со значениями из объединённых ячеек сумм (поведение до правки, не связано с #32) deferred

🤖 Generated with Claude Code

Closes #32. ## Что было ОСВ 60 ООО «Зерновая компания „Новопетровская“» за 9 мес. 2025 (замечание банка 13.10.2026): шапка варианта 2 «субконто: Контрагенты, Контрагенты.ИНН», ИНН — числом отдельной строкой **под** контрагентом. Парсер принимал реквизит за второй уровень контрагентов: в «Контрагент / аналитика» — `2370012036.0`, наименования нет, ИНН `null` → нет признака ГК/ГСК/Внешний; в свод ядра попадали обе строки (наименование и ИНН) с одинаковыми суммами. ## Что сделано - `header.py`: `<группировка>.ИНН` (суффикс — словарь `service_columns.inn`, префикс — имя предыдущей группировки COUNTERPARTY) — `InnAttribute`; в `group_schema` не попадает, у владельца `has_inn = true`; `GroupSchema.positions` держит позицию строк для классификатора; `build_group_schema` — прежний интерфейс. - `classify.py`: строка реквизита — OTHER с ИНН ячейки (`column_inn`, R-24); `glue_inn_attributes` отдаёт ИНН контрагенту, убирает строку, поднимает её детей (договоры) на уровень, предупреждение «ИНН … отнесён к контрагенту в строке …». Не склеилось (несколько строк ИНН, суммы не равны, ИНН не распознан или расходится) — OTHER, предупреждение с причиной, `needs_check`. - `readers/_common.py`: целый float (xls) читается как int — без «.0». - Шапка **варианта 1** (строка `Контрагенты.ИНН` в блоке заголовка под `Контрагенты`) — тот же реквизит (H-1, коммит 02ad8be); общая часть вариантов — `_attach_inn_attribute`, `_positions`. - Фикстура `osv-dkb/novopetrovskaya/2025-Q3/60_ 9мес.2025г.xls` + golden — arm-ka-fixtures PR (ветка `feat/32-osv-inn-subconto`). - Правило — arm-ka-docs PR (`05-domain-rules.md` §1.1, §1.3; OQ-162). Файл банка после правки: `done`, 713 из 716 контрагентов с ИНН, 3 физлица без ИНН, «Итого» = корню. ## Проверки - `make check` — зелёный (2269 passed после варианта 1; golden прочих 138 файлов без изменений). - `make docker-build` — ок. - `make test-integration` — плавает 1 тест (`test_request_gets_ack_then_parser_error_and_duplicate_gets_only_ack`, «лишнее сообщение»): на тот же NATS `localhost:4222` подписан контейнер стенда `arm-ka-tabular-parser-1` в той же queue group и забирает дубль; 2 из 3 прогонов зелёные, сценарий (битый zip) правкой не затронут. ## Rulings I made - **R-1** — пустая ячейка реквизита ИНН (физлицо, 1С выводит строку без значения) — «ИНН не указан»: строка склеивается, ИНН контрагента остаётся `null`, `needs_check` не ставится. Иначе файл банка целиком уходил бы на проверку из-за трёх физлиц. Цена ошибки: если пустая ячейка где-то значит «ИНН потерян», аналитик не получит `needs_check` — но строка контрагента без ИНН и так видна в «Нужно сопоставить» сводной ОСВ. ## Находки | Маркер | Находка | Статус | |---|---|---| | O-1 | Интеграционный тест конкурирует с контейнером стенда за queue group на общем NATS — тест флейкует при поднятом стенде | deferred | | H-1 | Владелец: шапка варианта 1 тоже должна разбираться | fixed 02ad8be | | H-2 | Владелец: ИНН над/под контрагентом, в дереве и нет, с суммами и без — все 8 раскладок по содержимому; сейчас «ИНН под, не в дереве, без сумм» молча отдаёт ИНН **следующему** контрагенту (механизм OQ-130, уже в main) | deferred → отдельная задача | | O-2 | В строках этого файла `extra` содержит колонки C/G/K со значениями из объединённых ячеек сумм (поведение до правки, не связано с #32) | deferred | 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 1 commit 2026-10-13 10:11:51 +03:00
В шапке варианта 2 «субконто: Контрагенты, Контрагенты.ИНН» 1С выводит ИНН
отдельной строкой на уровень глубже контрагента. Парсер принимал реквизит за
второй уровень контрагентов: строка ИНН становилась контрагентом с именем
«2370012036.0» и без ИНН, у наименования ИНН тоже не было, в свод ядра
попадали обе строки.

- header: элемент «<группировка>.ИНН» — InnAttribute, в group_schema не
  попадает, у владельца has_inn = true; GroupSchema.positions держит позицию
  для классификатора;
- classify: строка реквизита — OTHER с ИНН ячейки (column_inn, R-24);
  glue_inn_attributes отдаёт ИНН контрагенту, убирает строку, поднимает её
  детей; не склеилось (несколько строк, суммы не равны, ИНН не распознан или
  расходится) — OTHER, предупреждение, needs_check; пустая ячейка (физлицо) —
  склейка без ИНН (R-1);
- readers: целый float из xls читается как int — без «.0».

Файл банка: 713 из 716 контрагентов с ИНН, 3 физлица без ИНН, status done.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep added 1 commit 2026-10-13 11:03:25 +03:00
Строка блока заголовка «Контрагенты.ИНН» под «Контрагенты» — тот же реквизит,
что элемент списка субконто варианта 2: в group_schema не попадает, у владельца
has_inn, строки склеиваются glue_inn_attributes. Общая часть вариантов —
_attach_inn_attribute и _positions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep merged commit b342b54002 into main 2026-10-13 11:20:52 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RSHB/arm-tabular-parser#33
No description provided.