docs: пакет ДКБ 06.10.2026 — §4а в 06-test-data, osv-dkb/statements-xlsx/analysis-reports в раскладке, 72 ОСВ / 88 снимков, OQ-113 частично, OQ-131…136, QA §6.7
Refs #24 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
This commit is contained in:
parent
57c8f8d01d
commit
6e27259cb5
@ -66,8 +66,8 @@
|
||||
| 67 | — | — | — | xlsx | xlsx | xlsx | xlsx |
|
||||
| 76 | xls | xls | xls | — | xlsx | xlsx | — |
|
||||
|
||||
(17 файлов Счастливочной за 2025 и 2024 г. — 62/67/66/58/76 — лежат в Project claude.ai, но в эту сессию не попали
|
||||
из-за лимита доставки; они есть у пользователя.)
|
||||
Набор 2025 г. неполный: во 2 кв. нет 62/67/76, в 3 кв. — 58/62/66/67/76. 1 кв. 2025 дополнен пакетом ДКБ
|
||||
06.10.2026 (02, 58, 62, 66, 67, 76; имена новых файлов — с дефисом «Оборотно-сальдовая …»). Реальных ОСВ в `osv/` — 72.
|
||||
|
||||
## 3. Что показали реальные файлы (требования к парсеру)
|
||||
|
||||
@ -131,6 +131,24 @@ JSON `aep_*.json` — реальные ответы Content AI: структур
|
||||
процентах (100.0), поле организации может называться иначе, чем в ТЗ — нормализацию делать по этим файлам, а не по ТЗ.
|
||||
В фикстурах встречаются файлы с ББ **и** ОФР в одном PDF (→ два `document` из одного `stored_file`).
|
||||
|
||||
## 4а. Пакет ДКБ 06.10.2026: организации вне группы РБ, ББ/ОФР в Excel, план счетов 1С
|
||||
|
||||
Один zip «Документы по дкб в формате xls» + отдельные файлы, разложены в `fixtures/` (PR arm-ka-fixtures#7):
|
||||
|
||||
| Что | Где | Состав |
|
||||
|---|---|---|
|
||||
| ОСВ шести организаций (29 файлов, 34 МБ) | `osv-dkb/<org>/<период>/` | АО «Цимлянский» (7 ОСВ за 9 мес. 2025), ООО «Новороссийский Кислородный завод» (2 книги по 3 листа), ООО «Новоросметалл» (2 книги по 3 листа + ОСВ 63; вариант 2, «сумма»), ООО «Новороссийский прокатный завод» (2 книги; одна за окт. 2024 – сент. 2025), ООО «Приманыческий» (7 ОСВ), АО фирма «Агрокомплекс» им. Ткачева (4 ОСВ по 50 тыс. строк, 9–14 МБ) |
|
||||
| «Анализ счета» (3 книги) | `analysis-reports/<org>/2025-Q3/` | отчёт 1С по корреспонденции счетов с отбором по контрагентам группы; не ОСВ, парсер отвечает `INVALID_DOCUMENT` |
|
||||
| ББ/ОФР в Excel (15 файлов) | `statements-xlsx/<org>/<период>/` | АО «Унагранде Ко» и «Унагранде Групп» (постраничные xls из 1С, 2024 г. и 9 мес. 2025), ООО НПЗ (одна книга ФСБУ 4/2023 с подстроками «в том числе»), ООО «Агрофирма Межениновская» (TDSheet, 66н); `templates/` — пустые формы 66н и ФСБУ 4/2023 |
|
||||
| План счетов 1С заказчика | `directories/chart-of-accounts-1c.xlsx` | 488 строк: код, наименование, субконто 1–3, вид; в seed 122 кода, все есть в выгрузке; 366 кодов выгрузки в seed нет (OQ-113, arm-core#23) |
|
||||
|
||||
`osv-dkb/` намеренно вне `osv/`: fixtures-тесты парсера и ядра требуют один лист `Лист_1`, `done`, период = каталогу и
|
||||
golden-снимок на каждый файл, а здесь многолистовые книги, `needs_check`, скользящий период и файлы по 14 МБ. Обобщение
|
||||
тестов — arm-tabular-parser#10. Что показали файлы (8 находок: скользящий период «Октябрь 2024 г. – Сентябрь 2025 г.»,
|
||||
тождество сальдо на счёте 91, несколько корней без строки счёта, шапка ОСВ 63 с кодом и названием в двух колонках,
|
||||
«Итого развернутое», листы с именем кода счёта, нет валюты в шапке, объём) — `fixtures/osv-dkb/README.md`,
|
||||
arm-tabular-parser#11, OQ-131…OQ-135. ИНН организаций в шапках ОСВ нет (OQ-136).
|
||||
|
||||
## 5. Прочее
|
||||
|
||||
- `Форма расшифровки к отчетности 01 10 24 / 01 04 25 / 01 07 25.xlsx` — расшифровки АО РБ (кредиты и займы, дебиторы и
|
||||
@ -154,8 +172,10 @@ fixtures/
|
||||
synthetic/ README.md + s01…s16 (генератор в tabular-parser, §7)
|
||||
statements/
|
||||
rb/ schastl/ gir-bo/ # pdf
|
||||
statements-xlsx/ # ББ/ОФР в Excel (§12): лист «Отчетность» из Анализ*.xlsx,
|
||||
# рекомендуемые формы банка, выгрузки 1С — собрать у аналитиков
|
||||
statements-xlsx/<org>/<период>/ # ББ/ОФР в Excel (§12, §4а): unagrande-co, unagrande-group, npz,
|
||||
# mezheninovskaya, templates/ (пустые формы 66н и ФСБУ 4/2023)
|
||||
osv-dkb/<org>/<период>/ # ОСВ пакета ДКБ вне тестов osv/** (§4а)
|
||||
analysis-reports/<org>/<период>/ # отчёты «Анализ счета» (не ОСВ)
|
||||
ocr/
|
||||
aep_N.pdf|PDF + aep_N.json # пары вход/выход ИС Сканирование (эмулятор ИС
|
||||
# в scan-gateway ищет `<stem>.json` по имени входного
|
||||
@ -165,9 +185,10 @@ fixtures/
|
||||
# буквально)
|
||||
golden/
|
||||
Консолидация_Группа РБ.xlsx # эталон КФО по датам
|
||||
expected_osv_parse/<зеркало osv/ без расширения>.json # golden-снимки парсера ОСВ: 82 файла (66 реальных + 16 синтетических)
|
||||
expected_osv_parse/<зеркало osv/ без расширения>.json # golden-снимки парсера ОСВ: 88 файлов (72 реальных + 16 синтетических)
|
||||
directories/
|
||||
ecp-export-russkiy-biskvit.xlsx # срез выгрузки ЕЦП CRM по ГК «Русский Бисквит» (Срез 1)
|
||||
chart-of-accounts-1c.xlsx # план счетов 1С заказчика, 488 строк (пакет ДКБ, OQ-113)
|
||||
```
|
||||
`directories/` содержит срез выгрузки ЕЦП CRM по группе «Русский бисквит» (Срез 1, §6.1).
|
||||
|
||||
@ -196,7 +217,7 @@ fixtures/
|
||||
`required_document_rules.yaml`) и `arm-core/api/seed/dev/` (только `python -m scripts.seed --dev`: dev-пользователи и
|
||||
примеры РФ). Загрузчик — `python -m scripts.seed [--dev]` из `arm-core/api/` (идемпотентен, upsert по натуральному ключу;
|
||||
в compose его выполняет одноразовый сервис `arm-core-migrate`). Здесь остаются только тестовые данные группы.
|
||||
Полный план счетов 1С из бандла макета не передан — seed строится на Плане счетов 94н и типовых субсчетах 1С (OQ-47).
|
||||
План счетов 1С заказчика получен 06.10.2026 (`directories/chart-of-accounts-1c.xlsx`, 488 строк); seed пока на Плане счетов 94н и типовых субсчетах (OQ-47, OQ-113 → arm-core#23).
|
||||
Первый прогон парсера на `osv/**` сохранён как `expected_osv_parse/*.json` после ручной сверки итогов со строкой «Итого»
|
||||
(§7) — дальше это regression-набор.
|
||||
|
||||
@ -236,7 +257,7 @@ BIFF12 `tabular-parser/api/tests/synthetic/xlsb_writer.py`: он пишет то
|
||||
файл из Excel (OQ-102). Инструкция замены — в README `fixtures/osv/synthetic/`.
|
||||
|
||||
**Golden-снимки.** Для каждого файла `fixtures/osv/**` (включая синтетику) в `fixtures/golden/expected_osv_parse/` лежит
|
||||
результат разбора (82 файла = 66 реальных + 16 синтетических): файл результата контракта v1.1 без `job_id`, `file_id`,
|
||||
результат разбора (88 файлов = 72 реальных + 16 синтетических): файл результата контракта v1.1 без `job_id`, `file_id`,
|
||||
`service.version`, `metrics.duration_ms`. Снимок — **регрессия, не оракул**: он фиксирует, что парсер выдаёт сейчас.
|
||||
Обновление — только `make golden-update` в `tabular-parser` с просмотром diff и отдельным коммитом в `fixtures`;
|
||||
`make golden-check` (код возврата 1 при расхождении) — без записи. Оракулы корректности — property-тест
|
||||
|
||||
@ -118,7 +118,7 @@
|
||||
| OQ-110 | Удаление файла после консолидаций: у `document` появятся FK из `financial_statement_meta`, `consolidation_document`, `ex_snapshot_item`, а `DELETE /files/{id}` Среза 2c их не чистит (в 2c строк в этих таблицах нет). ANL-020 запрещает физическое удаление после INITIATED. Что делать: запретить удаление файла, документ которого входит в версию консолидации, и/или каскадно чистить служебные таблицы (`financial_statement_meta` — в Срезе 3) | arm-core Срез 2c: Task 10 (R-23, design №36, №48) | Срезы 3, 4 (расширить удаление или запрет) | **закрыт для Среза 4 (06.10.2026):** привязываются к версии только `CONFIRMED` документы незаменённых файлов, а файл с `CONFIRMED` документом удалить нельзя (`FILE_HAS_CONFIRMED_DOCUMENTS`) — удаление файла с документом в версии невозможно, расширять `DELETE /files/{id}` не нужно; автозамена снимает привязки документов заменённого файла (`FILE_REPLACE.unbound_version_ids`). Остаток: FK из `financial_statement_meta` и `ex_snapshot_item` — Срезы 3 и 7 |
|
||||
| OQ-111 | Ретеншн S3-объектов при удалении файла: сейчас `DELETE` лишь ставит `s3_object.expires_at = now()`, объекты `uploads`/`results` физически не стираются (дополняет OQ-22). Кто и когда их удаляет — lifecycle-правило бакета по метаданным, фоновая задача ядра, ручная очистка? Объект, записанный в S3 до сбоя БД, остаётся сиротой | arm-core Срез 2c: design D-10, №36 | платформа (lifecycle), Срез 2 → эксплуатация | допущение принято: бакет растёт; очистка — вне среза |
|
||||
| OQ-112 | Остаточные объекты e2e-прогона: каждый запуск `make e2e` оставляет в MinIO dev-стенда ~2 объекта (`uploads/…`, `results/…` — следствие OQ-111) | arm-core Срез 2c: Task 11 (O-5) | dev-стенд | допущение принято: чистить бакет `arm-ka` вручную (раздел «Сброс стенда» `dev/qa-guide.md`) |
|
||||
| OQ-113 | Полнота плана счетов seed: 19 нормализованных кодов строк-счетов golden ОСВ отсутствуют в `chart_of_account` (`01.01`, `66.01`, `76.01`, `60.АВ`, `76.ОТ` и др.), поэтому у их строк `account_id = NULL`. Достаточно ли «администратор добавит» или seed должен включать полный набор субсчетов (включая буквенные) до Среза ВГО (§4–§5) | arm-core Срез 2c: Task 8 (O-3) | Срезы 4–5 (пары счетов элиминации) | открыт: допущение — `account_id = NULL` легален (§1.3), `account_code`/`account_root` заполнены |
|
||||
| OQ-113 | Полнота плана счетов seed: 19 нормализованных кодов строк-счетов golden ОСВ отсутствуют в `chart_of_account` (`01.01`, `66.01`, `76.01`, `60.АВ`, `76.ОТ` и др.), поэтому у их строк `account_id = NULL`. Достаточно ли «администратор добавит» или seed должен включать полный набор субсчетов (включая буквенные) до Среза ВГО (§4–§5) | arm-core Срез 2c: Task 8 (O-3) | Срезы 4–5 (пары счетов элиминации) | **частично решён 06.10.2026:** план счетов 1С заказчика получен (`fixtures/directories/chart-of-accounts-1c.xlsx`, 488 строк, все 122 кода seed в нём есть); перенос в seed — arm-core#23; подтверждение владельца, что это полный план — ждём |
|
||||
| OQ-114 | `EntryOut` (API строк ОСВ) не отдаёт `is_modified`/`original_*`: панели правки подсреза 2d нужен признак правки аналитика (инвариант «первичка не мутируется»: правка — рядом, с аудитом). Добавить поля в схему и контракт API при проектировании 2d | arm-core Срез 2c: Task 9 (T9.7) | подсрез 2d | открыт: в 2c строк не правят, `is_modified = false` у всех |
|
||||
| OQ-115 | Автозамена: если новый файл содержит лишь часть документов прежнего (прежний — ОСВ 60 и 51, новый — только 60), прежний уходит в `SUPERSEDED` **целиком**, документ 51 пропадает из списка файлов; в `FILE_REPLACE.description` о нём ничего нет. Подтвердить «замена файлом целиком» (OQ-06) для этого случая или заменять по документам | arm-core Срез 2c: Task 8 (T8.4) | Срез 2d (список файлов), Срез 4 (комплект документов) | допущение принято: замена файлом целиком, документы заменённого файла сохраняются в БД |
|
||||
| OQ-116 | ОСВ Q2–Q4, признанная нарастающей по данным Q1 (сальдо на начало корня равно сальдо Q1, §1.5), получает предупреждение маппинга и поэтому остаётся `NEEDS_CHECK`, а не `RECOGNIZED` (буквально D-7/D-9 спеки: `RECOGNIZED` только без предупреждений). Верно ли, что аналитик подтверждает такие документы вручную, или нарастающая по данным — штатный случай без предупреждения (OQ-02, OQ-05) | arm-core Срез 2c: Task 7 (R-17, design №30) | Срез 2d (нагрузка на аналитика), §9.3 | допущение принято: `NEEDS_CHECK`; снять предупреждение — одна правка в `result_mapping.py` и правило статуса |
|
||||
@ -136,6 +136,12 @@
|
||||
| OQ-128 | Неоднозначность дорезолва на лету при тёзке по имени: после ручного сопоставления создаётся алиас, но `CounterpartyIndex.resolve` на шаге «нормализованное имя/алиас» возвращает контрагента только при единственном кандидате — если ЮЛ-тёзка (по нормализованному `name`) есть рядом с владельцем нового алиаса, кандидатов двое, резолв неоднозначен и строки без сохранённого `counterparty_id` остаются несопоставленными. ТЗ DOC-221278: «алиас однозначен» — решает ли это, или алиас должен иметь приоритет над именем | arm-core Срез 4: Task 11 (T11.9) | дорезолв свода (D-3), `CounterpartyIndex` | открыт: допущение — резолв по Срезу 2c (неоднозначность → `NULL`); спасает автоприменение `PROPAGATED` (сохраняет `counterparty_id`) |
|
||||
| OQ-129 | Формулировка сценария «сопоставление и автоприменение» (spec consolidated-osv): «`unmapped_total` падает на 1 + propagated» неверна на реальных данных. `propagated` считает записи `osv_entry` (включая пары-пробелы и строки, не дающие строк свода), а свод склеивает кварталы, поэтому `unmapped_total` падает на число **склеенных** строк свода (R-15, design №80). Уточнить текст spec при архивации | arm-core Срез 4: Task 13 (T13.M1, R-15) | spec `consolidated-osv` при архивации change | допущение принято: тест сверяет обе величины отдельно; текст spec уточнён в change, `openspec/specs/` — при архивации |
|
||||
| OQ-130 | ОСВ произвольного формата: ИНН в ячейке **на строку выше** названия контрагента (строка только с ИНН, без сумм). Сейчас такая строка уходит в OTHER, ИНН для резолва теряется. Решение владельца 07.10.2026: склеивать со следующей строкой контрагента; синтетические фикстуры на этот случай, на ИНН в тексте и на «ИНН/КПП» в одной ячейке | владелец, 07.10.2026 | tabular-parser §1.0 п. 4, §1.3; резолв контрагента в ядре | **решено:** RSHB/arm-tabular-parser#9 (bounded), ждёт реализации |
|
||||
| OQ-131 | Скользящий период ОСВ «Октябрь 2024 г. – Сентябрь 2025 г.» (НПЗ 60/62/76, Агрокомплекс 76, `osv-dkb/`): парсер берёт первый месяц → `2024 Q4`, нарастающий. Нужен разбор диапазона дат и признак «не с начала года»; как ядру относиться к такому документу при привязке к версии (не нарастающий и не квартальный) | пакет ДКБ 06.10.2026, прогон парсера | tabular-parser `periods.yaml`/`header.py`; ядро `fits` (D-5 Среза 4) | открыт: arm-tabular-parser#11 п. 1; допущение — не привязывать, показывать в чек-листе как «период не соответствует» |
|
||||
| OQ-132 | Тождество сальдо по строкам (§1.4) на счёте 91 (и, вероятно, 90, 99): строки аналитики доходов/расходов несут только обороты, сальдо закрывается на 91.09 → `needs_check` на каждой ОСВ 91 (Цимлянский, Приманыческий). Исключать ли счета без сальдо по аналитике из проверки тождества строк | пакет ДКБ 06.10.2026 | tabular-parser `checks.py`, статус документа | открыт: допущение — оставить `needs_check`, аналитик подтверждает вручную; arm-tabular-parser#11 п. 2 |
|
||||
| OQ-133 | ОСВ варианта 2 без строки корневого счёта: верхний уровень — субсчета (58.01, 58.03), «Итого» = их сумме, парсер сверяет «Итого» с первым корнем → `needs_check` на каждом листе (Новоросметалл, Агрокомплекс; уточняет OQ-106). Сверять «Итого» с суммой строк уровня 0 | пакет ДКБ 06.10.2026 | tabular-parser `checks.py` | открыт: arm-tabular-parser#11 п. 3 |
|
||||
| OQ-134 | Шапка ОСВ без строки организации и с кодом/названием счёта в двух колонках («Счет: Код / Наименование», строка «Бухгалтерский \| 9 месяцев 2025 г.»; Новоросметалл ОСВ 63): парсер не находит организацию, счёт, период, тип данных. Новый вариант заголовка — словарь или код | пакет ДКБ 06.10.2026 | tabular-parser `detect.py`/`header.py`, `osv_headers.yaml` | открыт: arm-tabular-parser#11 п. 4 |
|
||||
| OQ-135 | Отчёт 1С «Анализ счета» с отбором по контрагентам группы (`fixtures/analysis-reports/`, в именах файлов «ОСВ_…ПоКомпаниямГруппы»): не ОСВ, но содержит ВГО по корреспонденции счетов. Нужен ли отдельный тип документа для Среза 5, или ВГО считаются только из ОСВ | пакет ДКБ 06.10.2026 | `document_type`, Срез 5 | открыт: допущение — не разбирать; парсер отвечает `INVALID_DOCUMENT` |
|
||||
| OQ-136 | ИНН организаций пакета ДКБ (Цимлянский, НКЗ, Новоросметалл, Приманыческий, Агрокомплекс) в шапках ОСВ отсутствуют; для теста консолидации по этим группам нужны ИНН и состав ГК/ГСК (выгрузка ЕЦП или список от ДКБ) | пакет ДКБ 06.10.2026 | seed/фикстуры справочников, тесты Среза 4–5 на новых группах | открыт |
|
||||
|
||||
Служебные идентификаторы в DBML/аналитике: `ANL-nnn` — замечания аналитика к макету; `ARCH-nnn` — архитектурные решения;
|
||||
`DECISION-n` — решения по модели; `FIX-nn` — исправления дефектов v4.
|
||||
|
||||
@ -346,7 +346,9 @@ ENV_FILE=.env.test .venv/bin/python -m src.parser.cli "/путь/к/файлу.x
|
||||
| P9 | Контрольные суммы | `status = done`: сальдо строки сходится (начало + обороты = конец), «сумма детей = родитель», «Итого» = корень. `needs_check` при расхождении, в `checks` — какие строки; «подгонки» под сходимость быть не должно |
|
||||
| P10 | Лишние колонки | «КПП», «Код», «Количество» и прочие попали в `extra` строки, суммы не сдвинулись |
|
||||
|
||||
**Готовые кейсы нестандартных форматов** — синтетика `../fixtures/osv/synthetic/s01…s16` с описанием каждого файла и
|
||||
**Реальные нестандартные файлы** — `../fixtures/osv-dkb/` (пакет ДКБ 06.10.2026: шесть организаций, многолистовые книги,
|
||||
вариант 2 «сумма», скользящий период, 50 тыс. строк; ожидаемые статусы и находки — `osv-dkb/README.md`) и
|
||||
`../fixtures/analysis-reports/` («Анализ счета», ожидается `INVALID_DOCUMENT`). **Готовые кейсы синтетики** — синтетика `../fixtures/osv/synthetic/s01…s16` с описанием каждого файла и
|
||||
ожиданием в `../fixtures/osv/synthetic/README.md`: шапка варианта 2 («Период: …», «Субконто»), уровни без outline (только
|
||||
отступами, только по кодам счетов), строки валюты и количества, числа текстом, два листа ОСВ и посторонний лист, нет
|
||||
сальдо на начало и свёрнутое сальдо на конец, колонка КПП, названия субсчетов, сломанная сумма (`needs_check`), повтор
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user