docs(2b): контракт v1.2, §12 и OQ-138…143, формы ББ/ОФР (Срез 2b) #27
@ -801,7 +801,7 @@ OQ-92 (пустые «Организация»/«Группа компаний»
|
||||
(«Изменение», «%») **не читаются** (одно предупреждение на документ): у `statementDocument` поля `extra` нет.
|
||||
5. **Значения**: `Decimal`, скобки → минус, «–»/пусто → `null`, нечисловой текст → `string_value`,
|
||||
`is_recognized = false`. **Единицы не нормализуются**: `amount` как в ячейке, `header.units` — текст шапки; при «тыс.» и
|
||||
≥ 10 % значений с дробной частью — предупреждение «N значений с дробной частью при единице тыс. руб.» (OQ-137,
|
||||
≥ 10 % значений с дробной частью — предупреждение «значений с дробной частью при единице тыс. руб.: N из M» (OQ-137,
|
||||
решение владельца). Строки без кода (разделы, «в том числе:», «Реализация иного имущества…» у НПЗ) не отдаются
|
||||
(`ASSUMPTION(OQ-36)`, OQ-140); повтор кода — остаётся первая строка, код в `checks.duplicate_line_codes`, `needs_check`.
|
||||
Пятизначные подстроки (11101, 12301…) отдаются как обычные строки.
|
||||
|
||||
@ -203,7 +203,7 @@ fixtures/
|
||||
osv/
|
||||
rb/ 2024-Q1/ 2024-Q2/ 2024-Q3/ 2024-FY/ 2025-Q1/ 2025-Q2/ 2025-Q3/ # файлы с исходными именами
|
||||
schastl/ ...
|
||||
synthetic/ README.md + s01…s16 (генератор в tabular-parser, §7)
|
||||
synthetic/ README.md + s01…s19 (генератор в tabular-parser, §7)
|
||||
statements/
|
||||
rb/ schastl/ gir-bo/ # pdf
|
||||
statements-xlsx/<org>/<период>/ # ББ/ОФР в Excel (§12, §4а): unagrande-co, unagrande-group, npz,
|
||||
@ -219,7 +219,8 @@ fixtures/
|
||||
# буквально)
|
||||
golden/
|
||||
Консолидация_Группа РБ.xlsx # эталон КФО по датам
|
||||
expected_osv_parse/<зеркало osv/ без расширения>.json # golden-снимки парсера ОСВ: 88 файлов (72 реальных + 16 синтетических)
|
||||
expected_osv_parse/<зеркало osv/ без расширения>.json # golden-снимки парсера ОСВ: 113 файлов (94 реальных: 72 в osv/ + 22 в osv-dkb/; + 19 синтетических)
|
||||
expected_statement_parse/<зеркало statements-xlsx/ без расширения>.json # golden-снимки парсера форм ББ/ОФР: 24 файла (18 реальных + 6 синтетических), §4б
|
||||
directories/
|
||||
ecp-export-russkiy-biskvit.xlsx # срез выгрузки ЕЦП CRM по ГК «Русский Бисквит» (Срез 1)
|
||||
chart-of-accounts-1c.xlsx # план счетов 1С заказчика, 488 строк (пакет ДКБ, OQ-113)
|
||||
@ -292,7 +293,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/` лежит
|
||||
результат разбора (113 файлов, из них 19 синтетических `s01`–`s19`): файл результата контракта v1.2 (v1.1 — до Среза 2b) без `job_id`, `file_id`,
|
||||
результат разбора (113 файлов: 94 реальных и 19 синтетических `s01`–`s19`): файл результата контракта v1.2 (v1.1 — до Среза 2b) без `job_id`, `file_id`,
|
||||
`service.version`, `metrics.duration_ms`. Снимок — **регрессия, не оракул**: он фиксирует, что парсер выдаёт сейчас.
|
||||
Обновление — только `make golden-update` в `tabular-parser` с просмотром diff и отдельным коммитом в `fixtures`;
|
||||
`make golden-check` (код возврата 1 при расхождении) — без записи. Оракулы корректности — property-тест
|
||||
|
||||
@ -145,7 +145,7 @@
|
||||
| OQ-137 | Единицы «тыс. руб.» в шапке против значений в рублях с копейками в выгрузках 1С (Унагранде Компани/Групп, НПЗ) и тысяч с дробями (Межениновская): кто и где приводит единицы. Примеры: книга НПЗ (`npz/2025-Q3`) — ББ `needs_check`, `1600 = 1700` расходится на 1.94 / 9.02 / 2.48 руб.; ОФР НПЗ и ОФР Унагранде (стр. 1) — `needs_check` по 2100/2200/2300 по той же причине; полные формы по факту сходятся только у Межениновской | `fixtures/statements-xlsx/README.md`, tabular-parser design 2b D-6, D-7, решения №22–24 (R-11, R-13, R-14) | Срез 3 (маппинг форм), §8 (КФО в тыс. руб.) | допущение принято (решение владельца 06.10.2026, вариант А): парсер отдаёт значения и `units` как в файле, при «тыс.» и ≥ 10 % значений с дробной частью — предупреждение; допуск ±1 не меняется, не нормализуем; приведение единиц — ядро/аналитик (Срез 3) |
|
||||
| OQ-138 | Форма без колонки кодов: сопоставление по именам строк из шаблонов 66н/ФСБУ (словарь `statement_lines.yaml`, `line_code_confidence < 100`)? Сейчас документ без строк и `needs_check` («колонка кодов не найдена») | решение владельца 06.10.2026 (вопрос 6), tabular-parser design 2b D-4 | §12 п. 2, Срез 3 | открыт: нужен реальный файл без колонки кодов; допущение — не сопоставлять по именам |
|
||||
| OQ-139 | Страница-продолжение в отдельном файле (1С печатает ББ/ОФР постранично, один файл = страница): склейка в ядре по ЮЛ + период + тип формы; признак `is_continuation` / `form_page` в контракте (MINOR, две необязательных поля) | решение владельца 06.10.2026 (вопрос 2), design 2b D-8 | §12 п. 9, Срез 3, контракт v1.x | допущение принято: страницы разных файлов не склеиваются; страница 2 без шапки — документ с пустой шапкой и `needs_check`, «загрузите форму одним файлом» |
|
||||
| OQ-140 | Строка без кода, но с суммами в ОФР ФСБУ 4/2023 (НПЗ «Реализация иного имущества…»): хранить ли (OQ-36 расширяется с расшифровочных строк на строки с суммами) | `fixtures/statements-xlsx/npz`, design 2b D-6 | Срез 3, DBML `financial_statement_line` (хранит только строки с кодом) | допущение принято: строки без кода не отдаются, при наличии сумм — предупреждение «строк без кода пропущено: N» |
|
||||
| OQ-140 | Строка без кода, но с суммами в ОФР ФСБУ 4/2023 (НПЗ «Реализация иного имущества…»): хранить ли (OQ-36 расширяется с расшифровочных строк на строки с суммами) | `fixtures/statements-xlsx/npz`, design 2b D-6 | Срез 3, DBML `financial_statement_line` (хранит только строки с кодом) | допущение принято: строки без кода не отдаются, при наличии сумм — предупреждение «строк без кода с суммами пропущено: N» |
|
||||
| OQ-141 | Образец ФСБУ 4/2023 (`templates/ББ после 01.01.2025.xlsx`): «АКТИВ» и код 1110 в одной строке из-за объединённых ячеек; шаблоны (коды есть, сумм и шапки нет) не данные. Нужен ли их разбор вообще | `fixtures/statements-xlsx/templates`, design 2b D-8 | §12 п. 10, тесты | допущение принято: шаблоны дают `needs_check` (шапка пустая, значения `null`); разбор шаблонов как источника данных не планируется, пока владелец не скажет иначе |
|
||||
| OQ-142 | Лист продолжения с **единственной** кодовой строкой (книга НПЗ: лист ОФР с одной строкой 2400): `min_codes` = 3 → лист не распознаётся как форма и пропускается, строка 2400 теряется при `needs_check` документа. Понизить порог / принимать лист по близости к открытому документу ОФР / маркеру продолжения | tabular-parser design 2b: решение №25, O-9 | §12 п. 2, п. 9; полнота ОФР НПЗ | открыт: отложено на финальное ревью 2b; допущение — строка 2400 листа продолжения НПЗ в результате отсутствует |
|
||||
|
||||
|
||||
@ -123,7 +123,7 @@ Change'и: `tabular-parser/openspec/changes/slice-2a-osv-parser` (issue arm-tabu
|
||||
«тыс. руб.», страницы без шапки, шаблоны) — OQ-137, OQ-139.
|
||||
- **Не сделано / риски:** единицы не нормализуются (OQ-137); форма без колонки кодов не разбирается (OQ-138); страницы
|
||||
в разных файлах не склеиваются (OQ-139); строки без кода не хранятся (OQ-140); лист ОФР НПЗ с единственной строкой 2400
|
||||
теряется (OQ-142); после контракта v1.2 `docs/contracts/**` заморожены (копии схемы в arm-core и scan-gateway равны им байт в байт); косметика T1.1/T2.x уходит в следующий MINOR.
|
||||
теряется (OQ-142); после контракта v1.2 `docs/contracts/**` заморожены (копии схемы в arm-core и scan-gateway должны совпадать с ними; в tabular-parser версия закреплена тестом `api/tests/unit/test_contract_v12.py`, побайтное сравнение копий — вручную через `diff` при раскатке); косметика T1.1/T2.x уходит в следующий MINOR.
|
||||
|
||||
### Срез 2c — Загрузка файлов и маппинг результата в ядре (`arm-core`) — реализован, ожидает ревью и merge
|
||||
|
||||
|
||||
@ -358,8 +358,8 @@ ENV_FILE=.env.test .venv/bin/python -m src.parser.cli "/путь/к/файлу.x
|
||||
(`document_type` = `BALANCE` / `INCOME` / `DISCLOSURE`, ОСВ идут первыми), с `header`, `columns[]`, `lines[]`, `checks`.
|
||||
Что смотреть: `document_type` соответствует форме на листе; `columns[].period_date` — даты колонок слева направо (для ОФР —
|
||||
конец периода); `checks.relations_failed` (жёсткие соотношения §7 с `expected`/`actual` по колонкам — причина `needs_check`),
|
||||
`checks.soft_relations_failed` и `duplicate_line_codes`; в `metrics.warnings` — предупреждение об единицах («N значений с
|
||||
дробной частью при единице тыс. руб.»: значения как в файле, не нормализованы, OQ-137), «колонка кодов не найдена»,
|
||||
`checks.soft_relations_failed` и `duplicate_line_codes`; в `metrics.warnings` — предупреждение об единицах («значений с
|
||||
дробной частью при единице тыс. руб.: N из M»: значения как в файле, не нормализованы, OQ-137), «колонка кодов не найдена»,
|
||||
«страница-продолжение без шапки». Ожидания по реальным файлам — `../tabular-parser/api/tests/statements_manifest.yaml` и
|
||||
таблица «файл → статус» в README `tabular-parser`; файлы — `../fixtures/statements-xlsx/` (синтетика `st01…st06`).
|
||||
Постраничные xls из 1С (страница 2 отдельным файлом, ББ только актив) и формы в рублях при шапке «тыс. руб.» дают
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user