diff --git a/README.md b/README.md index 90ce1c7..2f6eadb 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ ``` osv/{rb,schastl}/<ГГГГ-Qn | ГГГГ-FY>/ ОСВ по счетам, исходные имена файлов (разложены по шапке, не по имени) -osv/synthetic/ синтетика для форматов, которых нет в реальных данных (заполняется в Срезе 2) +osv/synthetic/ синтетика s01–s13 для форматов, которых нет в реальных данных (Срез 2a); генератор и описание — osv/synthetic/README.md statements/{rb,schastl}/ ББ/ОФР в PDF (машиночитаемые и сканы) statements-xlsx/ ББ/ОФР в Excel — запросить у аналитиков (пока пусто) ocr/ пары «вход → выход» ИС Сканирование: aep_N.pdf + aep_N.json diff --git a/osv/synthetic/.gitkeep b/osv/synthetic/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/osv/synthetic/README.md b/osv/synthetic/README.md new file mode 100644 index 0000000..efef4b4 --- /dev/null +++ b/osv/synthetic/README.md @@ -0,0 +1,50 @@ +# osv/synthetic — синтетические ОСВ + +Синтетика для форматов шапки, иерархии и колонок, которых нет в реальных файлах `osv/{rb,schastl}/`. Данных реальных +организаций здесь нет: организация «ООО "Тестовая организация"», контрагенты «ООО Альфа», «ООО Бета» и т. п., ИНН +вымышленные. Файлы — **вход** парсера ОСВ (`tabular-parser`), а не эталон: ожидания по каждому файлу выведены из спеки +(`openspec/changes/slice-2a-osv-parser/specs/osv-parsing/spec.md`) и лежат в тесте +`tabular-parser/api/tests/synthetic/test_synthetic_files.py`. + +Суммы согласованы арифметически (сальдо на конец = начало + обороты, родитель = сумма детей по колонкам), поэтому все +файлы, кроме `s10`, сходятся по контрольным суммам §1.4 и дают статус `done`. + +## Генерация + +Файлы собирает детерминированный генератор (openpyxl + минимальный писатель BIFF12 для xlsb); повторный запуск даёт +те же байты (метки времени книги и zip зафиксированы): + +``` +cd tabular-parser/api +.venv/bin/python -m tests.synthetic.generate ../../fixtures/osv/synthetic +``` + +Правка набора — в `tabular-parser/api/tests/synthetic/generate.py`, затем перегенерация и коммит файлов здесь. + +## Набор + +| Файл | Что проверяет | Ожидание | +|---|---|---| +| `s01_variant2_header.xlsx` | шапка варианта 2: «Период: …», «Детализация по субсчетам, субконто: Контрагенты, Договоры», заголовок «Субконто»; данные «Сумма» | `header_variant=2`, `group_schema=[ACCOUNT, COUNTERPARTY, CONTRACT]`, `Q1`/2026, `data_type=SUM`, `hierarchy=outline` | +| `s02_no_outline_indent.xlsx` | уровни только отступами ячеек (без outline level); `Валюта БУ, НУ: руб.`; период «2 квартал 2025 г.» | `hierarchy=indent`, дерево 0/1/2 | +| `s03_no_outline_no_indent.xlsx` | ни outline, ни отступов: уровни по кодам счетов и жирности; период «I кв. 2025 г.» (римский квартал) | `hierarchy=account_pattern`, дерево как у `s02` | +| `s04_currency_quantity_rows.xlsx` | под контрагентом строки «USD», «Кол.» (и «Вал.» у другого) | `data_type` `CURRENCY`/`QUANTITY`, в проверку суммы детей не входят, `done` | +| `s05_text_numbers.xlsx` | суммы текстом: «1 234 567,89», «(1 234,00)», «—»; неразрывные и узкие пробелы, прочерки «–», «-»; период «полугодие 2025 г.» | `1234567.89`, `-1234.00`, `null` | +| `s06_two_osv_and_other_sheet.xlsx` | листы «ОСВ 60», «Справка», «ОСВ 62» | два документа в порядке листов, предупреждение о пропуске «Справка» | +| `s07_no_opening_collapsed_closing.xlsx` | нет группы «Сальдо на начало»; сальдо на конец — одна колонка со знаком; период «9 месяцев 2025 г.» | `opening_* = null`, отрицательное сальдо — в `closing_credit`, предупреждение о свёрнутом сальдо | +| `s08_extra_kpp_column.xlsx` | колонка «КПП» между «ИНН» и суммами; период «с 01.01.2025 по 31.03.2025» | `extra["КПП"]` у контрагентов, суммы не сдвинуты | +| `s09_subaccount_names.xlsx` | «60.01, Расчеты с поставщиками и подрядчиками», буквенный субсчёт «60.АВ, …» | `ACCOUNT`, `account_code_raw` без названия, `row_value` — исходный текст | +| `s10_broken_sum.xlsx` | у «ООО Бета» `closing_debit` увеличен на 1 | `needs_check`, нарушение тождества — строка контрагента, суммы родителя — строка «60.01» | +| `s11_header_repeat.xlsx` | заголовок таблицы повторяется внутри данных (печать по страницам); период «12 месяцев 2025 г.» | строки заголовка пропущены, дерево и суммы не нарушены | +| `s12_statement_and_osv.xlsx` | лист ББ («Бухгалтерский баланс», 0710001) и лист «ОСВ 60»; данные «НУ», период «январь - сентябрь 2025 г.» | один документ, предупреждение «skipped: statement» | +| `s13_no_outline_indent.xlsb` | та же ведомость, что `s02`, в формате xlsb; отступ — ведущими пробелами текста | результат равен `s02` кроме предупреждения «xlsb: outline level недоступен» | + +## О файле xlsb + +`s13_no_outline_indent.xlsb` собран **не Excel и не LibreOffice** (их на машине разработки нет), а минимальным +писателем BIFF12 `tabular-parser/api/tests/synthetic/xlsb_writer.py`: он пишет только то, что читает `pyxlsb` +(workbook, таблица общих строк, лист; без стилей и объединений). Файл читается `pyxlsb` и парсером, но совместимость с +Excel не проверялась и этот файл не доказывает чтение xlsb, сохранённого Excel (другая раскладка записей, стили, +`BrtCellSt` и т. д.). Когда появится возможность — заменить `s13` настоящим: открыть `s02_no_outline_indent.xlsx` в +Excel или LibreOffice, «Сохранить как» → Книга Excel двоичная (`.xlsb`), имя `s13_no_outline_indent.xlsb`; в xlsb нет +outline level и форматирования ячеек, отступ нужно продублировать ведущими пробелами в колонке текста до сохранения. diff --git a/osv/synthetic/s01_variant2_header.xlsx b/osv/synthetic/s01_variant2_header.xlsx new file mode 100644 index 0000000..585b1d0 Binary files /dev/null and b/osv/synthetic/s01_variant2_header.xlsx differ diff --git a/osv/synthetic/s02_no_outline_indent.xlsx b/osv/synthetic/s02_no_outline_indent.xlsx new file mode 100644 index 0000000..d1e1d22 Binary files /dev/null and b/osv/synthetic/s02_no_outline_indent.xlsx differ diff --git a/osv/synthetic/s03_no_outline_no_indent.xlsx b/osv/synthetic/s03_no_outline_no_indent.xlsx new file mode 100644 index 0000000..2525119 Binary files /dev/null and b/osv/synthetic/s03_no_outline_no_indent.xlsx differ diff --git a/osv/synthetic/s04_currency_quantity_rows.xlsx b/osv/synthetic/s04_currency_quantity_rows.xlsx new file mode 100644 index 0000000..8b0c3bc Binary files /dev/null and b/osv/synthetic/s04_currency_quantity_rows.xlsx differ diff --git a/osv/synthetic/s05_text_numbers.xlsx b/osv/synthetic/s05_text_numbers.xlsx new file mode 100644 index 0000000..0feeef4 Binary files /dev/null and b/osv/synthetic/s05_text_numbers.xlsx differ diff --git a/osv/synthetic/s06_two_osv_and_other_sheet.xlsx b/osv/synthetic/s06_two_osv_and_other_sheet.xlsx new file mode 100644 index 0000000..faf21e4 Binary files /dev/null and b/osv/synthetic/s06_two_osv_and_other_sheet.xlsx differ diff --git a/osv/synthetic/s07_no_opening_collapsed_closing.xlsx b/osv/synthetic/s07_no_opening_collapsed_closing.xlsx new file mode 100644 index 0000000..71dba8d Binary files /dev/null and b/osv/synthetic/s07_no_opening_collapsed_closing.xlsx differ diff --git a/osv/synthetic/s08_extra_kpp_column.xlsx b/osv/synthetic/s08_extra_kpp_column.xlsx new file mode 100644 index 0000000..7cc778d Binary files /dev/null and b/osv/synthetic/s08_extra_kpp_column.xlsx differ diff --git a/osv/synthetic/s09_subaccount_names.xlsx b/osv/synthetic/s09_subaccount_names.xlsx new file mode 100644 index 0000000..b588342 Binary files /dev/null and b/osv/synthetic/s09_subaccount_names.xlsx differ diff --git a/osv/synthetic/s10_broken_sum.xlsx b/osv/synthetic/s10_broken_sum.xlsx new file mode 100644 index 0000000..76605bb Binary files /dev/null and b/osv/synthetic/s10_broken_sum.xlsx differ diff --git a/osv/synthetic/s11_header_repeat.xlsx b/osv/synthetic/s11_header_repeat.xlsx new file mode 100644 index 0000000..db3dc2c Binary files /dev/null and b/osv/synthetic/s11_header_repeat.xlsx differ diff --git a/osv/synthetic/s12_statement_and_osv.xlsx b/osv/synthetic/s12_statement_and_osv.xlsx new file mode 100644 index 0000000..1c9c602 Binary files /dev/null and b/osv/synthetic/s12_statement_and_osv.xlsx differ diff --git a/osv/synthetic/s13_no_outline_indent.xlsb b/osv/synthetic/s13_no_outline_indent.xlsb new file mode 100644 index 0000000..7e3e2ba Binary files /dev/null and b/osv/synthetic/s13_no_outline_indent.xlsb differ