From bb828be8ad5a1b603bba9a8a22bde7ff73767fe5 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Sun, 18 Oct 2026 11:50:44 +0400 Subject: [PATCH 1/2] =?UTF-8?q?Golden=20=D0=B8=20=D1=81=D0=B8=D0=BD=D1=82?= =?UTF-8?q?=D0=B5=D1=82=D0=B8=D0=BA=D0=B0=20s29=E2=80=93s31=20(tabular-par?= =?UTF-8?q?ser=20#47,=20AURORA-1662,=201663,=201664)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Синтетика: xls без CODEPAGE, «Вал»/«Кол-во», строки ниже «Итого» + описание в README. Golden: три новых снимка; изменён один реальный — rb/2024-Q1 «сч 60_ 1 кв 2024 г»: добавлено предупреждение о числах под «Итого» (контрольные суммы правее таблицы). Co-Authored-By: Claude Sonnet 5.5 --- .../rb/2024-Q1/сч 60_ 1 кв 2024 г.json | 3 +- .../synthetic/s29_xls_no_codepage.json | 252 ++++++++++++++++++ .../synthetic/s30_val_kol_vo_materials.json | 193 ++++++++++++++ .../synthetic/s31_rows_below_total.json | 252 ++++++++++++++++++ osv/synthetic/README.md | 5 + osv/synthetic/s29_xls_no_codepage.xls | Bin 0 -> 5632 bytes osv/synthetic/s30_val_kol_vo_materials.xlsx | Bin 0 -> 5550 bytes osv/synthetic/s31_rows_below_total.xlsx | Bin 0 -> 5891 bytes 8 files changed, 704 insertions(+), 1 deletion(-) create mode 100644 golden/expected_osv_parse/synthetic/s29_xls_no_codepage.json create mode 100644 golden/expected_osv_parse/synthetic/s30_val_kol_vo_materials.json create mode 100644 golden/expected_osv_parse/synthetic/s31_rows_below_total.json create mode 100644 osv/synthetic/s29_xls_no_codepage.xls create mode 100644 osv/synthetic/s30_val_kol_vo_materials.xlsx create mode 100644 osv/synthetic/s31_rows_below_total.xlsx diff --git a/golden/expected_osv_parse/rb/2024-Q1/сч 60_ 1 кв 2024 г.json b/golden/expected_osv_parse/rb/2024-Q1/сч 60_ 1 кв 2024 г.json index 17f7610..63dfa1e 100644 --- a/golden/expected_osv_parse/rb/2024-Q1/сч 60_ 1 кв 2024 г.json +++ b/golden/expected_osv_parse/rb/2024-Q1/сч 60_ 1 кв 2024 г.json @@ -7,7 +7,8 @@ "metrics": { "rows": 612, "warnings": [ - "sheet=Лист_1 hierarchy=outline" + "sheet=Лист_1 hierarchy=outline", + "строки 625–626: ниже таблицы (после «Итого») есть числа — строки ниже «Итого» вне документа и не разобраны" ] }, "documents": [ diff --git a/golden/expected_osv_parse/synthetic/s29_xls_no_codepage.json b/golden/expected_osv_parse/synthetic/s29_xls_no_codepage.json new file mode 100644 index 0000000..074cdea --- /dev/null +++ b/golden/expected_osv_parse/synthetic/s29_xls_no_codepage.json @@ -0,0 +1,252 @@ +{ + "schema_version": "1.2", + "service": { + "name": "tabular-parser" + }, + "status": "done", + "metrics": { + "rows": 9, + "warnings": [ + "xls без кодовой страницы — строки прочитаны как cp1251", + "sheet=Лист_1 hierarchy=indent" + ] + }, + "documents": [ + { + "document_type": "OSV", + "locator": "sheet:Лист_1", + "header": { + "organization_name": "ООО \"Тестовая организация\"", + "organization_inn": null, + "account_code_raw": "60", + "period_text": "1 квартал 2025 г.", + "period_year": 2025, + "period_quarter": "Q1", + "is_cumulative": true, + "period_start": "2025-01-01", + "period_end": "2025-03-31", + "is_from_year_start": true, + "data_type": "BU", + "currency": "RUB", + "header_variant": 1 + }, + "group_schema": [ + { + "type": "ACCOUNT", + "name": "Счет" + }, + { + "type": "COUNTERPARTY", + "name": "Контрагенты", + "has_inn": true + } + ], + "columns": { + "opening_debit": "G", + "opening_credit": "H", + "turnover_debit": "I", + "turnover_credit": "J", + "closing_debit": "K", + "closing_credit": "L", + "inn": "E" + }, + "rows": [ + { + "row_number": 11, + "level": 0, + "parent_row_number": null, + "row_value": "60", + "group_type": "ACCOUNT", + "group_name": "Счет", + "account_code_raw": "60", + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "135000.00", + "opening_credit": "262500.60", + "turnover_debit": "311000.35", + "turnover_credit": "572000.35", + "closing_debit": "115000.00", + "closing_credit": "503500.60", + "extra": null + }, + { + "row_number": 12, + "level": 1, + "parent_row_number": 11, + "row_value": "60.01", + "group_type": "ACCOUNT", + "group_name": "Счет", + "account_code_raw": "60.01", + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "15000.00", + "opening_credit": "253000.50", + "turnover_debit": "273000.25", + "turnover_credit": "460000.00", + "closing_debit": "65000.00", + "closing_credit": "490000.25", + "extra": null + }, + { + "row_number": 13, + "level": 2, + "parent_row_number": 12, + "row_value": "ООО Альфа", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.01", + "counterparty_name": "ООО Альфа", + "counterparty_inn": "7701234567", + "data_type": "BU", + "opening_debit": null, + "opening_credit": "250000.50", + "turnover_debit": "180000.25", + "turnover_credit": "420000.00", + "closing_debit": null, + "closing_credit": "490000.25", + "extra": null + }, + { + "row_number": 14, + "level": 2, + "parent_row_number": 12, + "row_value": "ООО Бета", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.01", + "counterparty_name": "ООО Бета", + "counterparty_inn": "7707654321", + "data_type": "BU", + "opening_debit": "15000.00", + "opening_credit": null, + "turnover_debit": "90000.00", + "turnover_credit": "40000.00", + "closing_debit": "65000.00", + "closing_credit": null, + "extra": null + }, + { + "row_number": 15, + "level": 2, + "parent_row_number": 12, + "row_value": "Иванов Иван", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.01", + "counterparty_name": "Иванов Иван", + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": null, + "opening_credit": "3000.00", + "turnover_debit": "3000.00", + "turnover_credit": null, + "closing_debit": null, + "closing_credit": null, + "extra": null + }, + { + "row_number": 16, + "level": 1, + "parent_row_number": 11, + "row_value": "60.02", + "group_type": "ACCOUNT", + "group_name": "Счет", + "account_code_raw": "60.02", + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "120000.00", + "opening_credit": "9500.10", + "turnover_debit": "38000.10", + "turnover_credit": "112000.35", + "closing_debit": "50000.00", + "closing_credit": "13500.35", + "extra": null + }, + { + "row_number": 17, + "level": 2, + "parent_row_number": 16, + "row_value": "ООО Гамма", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.02", + "counterparty_name": "ООО Гамма", + "counterparty_inn": "5001234567", + "data_type": "BU", + "opening_debit": "120000.00", + "opening_credit": null, + "turnover_debit": "30000.00", + "turnover_credit": "100000.00", + "closing_debit": "50000.00", + "closing_credit": null, + "extra": null + }, + { + "row_number": 18, + "level": 2, + "parent_row_number": 16, + "row_value": "ООО Дельта", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.02", + "counterparty_name": "ООО Дельта", + "counterparty_inn": "7812345678", + "data_type": "BU", + "opening_debit": null, + "opening_credit": "8000.10", + "turnover_debit": "8000.10", + "turnover_credit": "12000.35", + "closing_debit": null, + "closing_credit": "12000.35", + "extra": null + }, + { + "row_number": 19, + "level": 2, + "parent_row_number": 16, + "row_value": "ИП Сидоров", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.02", + "counterparty_name": "ИП Сидоров", + "counterparty_inn": "500100732259", + "data_type": "BU", + "opening_debit": null, + "opening_credit": "1500.00", + "turnover_debit": null, + "turnover_credit": null, + "closing_debit": null, + "closing_credit": "1500.00", + "extra": null + }, + { + "row_number": 20, + "level": 0, + "parent_row_number": null, + "row_value": "Итого", + "group_type": "TOTAL", + "group_name": null, + "account_code_raw": null, + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "135000.00", + "opening_credit": "262500.60", + "turnover_debit": "311000.35", + "turnover_credit": "572000.35", + "closing_debit": "115000.00", + "closing_credit": "503500.60", + "extra": null + } + ], + "checks": { + "total_row_matches_root": true, + "balance_identity_violations": [], + "parent_sum_violations": [] + } + } + ] +} diff --git a/golden/expected_osv_parse/synthetic/s30_val_kol_vo_materials.json b/golden/expected_osv_parse/synthetic/s30_val_kol_vo_materials.json new file mode 100644 index 0000000..c9f3731 --- /dev/null +++ b/golden/expected_osv_parse/synthetic/s30_val_kol_vo_materials.json @@ -0,0 +1,193 @@ +{ + "schema_version": "1.2", + "service": { + "name": "tabular-parser" + }, + "status": "done", + "metrics": { + "rows": 6, + "warnings": [ + "sheet=Лист_1 hierarchy=outline", + "валюта в шапке не найдена" + ] + }, + "documents": [ + { + "document_type": "OSV", + "locator": "sheet:Лист_1", + "header": { + "organization_name": "ООО \"Тестовая организация\"", + "organization_inn": null, + "account_code_raw": "10", + "period_text": "2 квартал 2025 г.", + "period_year": 2025, + "period_quarter": "Q2", + "is_cumulative": false, + "period_start": "2025-04-01", + "period_end": "2025-06-30", + "is_from_year_start": false, + "data_type": "BU", + "currency": null, + "header_variant": 2 + }, + "group_schema": [ + { + "type": "ACCOUNT", + "name": "Субконто" + }, + { + "type": "OTHER", + "name": "Номенклатура" + } + ], + "columns": { + "opening_debit": "C", + "opening_credit": "D", + "turnover_debit": "E", + "turnover_credit": "F", + "closing_debit": "G", + "closing_credit": "H" + }, + "rows": [ + { + "row_number": 9, + "level": 0, + "parent_row_number": null, + "row_value": "10", + "group_type": "ACCOUNT", + "group_name": "Субконто", + "account_code_raw": "10", + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "1700.00", + "opening_credit": null, + "turnover_debit": "350.00", + "turnover_credit": "100.00", + "closing_debit": "1950.00", + "closing_credit": null, + "extra": null + }, + { + "row_number": 10, + "level": 1, + "parent_row_number": 9, + "row_value": "10.1", + "group_type": "ACCOUNT", + "group_name": "Субконто", + "account_code_raw": "10.1", + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "1700.00", + "opening_credit": null, + "turnover_debit": "350.00", + "turnover_credit": "100.00", + "closing_debit": "1950.00", + "closing_credit": null, + "extra": null + }, + { + "row_number": 11, + "level": 2, + "parent_row_number": 10, + "row_value": "Вал", + "group_type": "OTHER", + "group_name": "Номенклатура", + "account_code_raw": "10.1", + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "1500.00", + "opening_credit": null, + "turnover_debit": "300.00", + "turnover_credit": "100.00", + "closing_debit": "1700.00", + "closing_credit": null, + "extra": null + }, + { + "row_number": 12, + "level": 3, + "parent_row_number": 11, + "row_value": "Кол-во", + "group_type": "OTHER", + "group_name": null, + "account_code_raw": "10.1", + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "QUANTITY", + "opening_debit": "10.00", + "opening_credit": null, + "turnover_debit": "2.00", + "turnover_credit": "1.00", + "closing_debit": "11.00", + "closing_credit": null, + "extra": null + }, + { + "row_number": 13, + "level": 2, + "parent_row_number": 10, + "row_value": "Болт М8", + "group_type": "OTHER", + "group_name": "Номенклатура", + "account_code_raw": "10.1", + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "200.00", + "opening_credit": null, + "turnover_debit": "50.00", + "turnover_credit": null, + "closing_debit": "250.00", + "closing_credit": null, + "extra": null + }, + { + "row_number": 14, + "level": 3, + "parent_row_number": 13, + "row_value": "Кол-во", + "group_type": "OTHER", + "group_name": null, + "account_code_raw": "10.1", + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "QUANTITY", + "opening_debit": "400.00", + "opening_credit": null, + "turnover_debit": "100.00", + "turnover_credit": null, + "closing_debit": "500.00", + "closing_credit": null, + "extra": null + }, + { + "row_number": 15, + "level": 0, + "parent_row_number": null, + "row_value": "Итого", + "group_type": "TOTAL", + "group_name": null, + "account_code_raw": null, + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "1700.00", + "opening_credit": null, + "turnover_debit": "350.00", + "turnover_credit": "100.00", + "closing_debit": "1950.00", + "closing_credit": null, + "extra": null + } + ], + "checks": { + "total_row_matches_root": true, + "balance_identity_violations": [], + "parent_sum_violations": [] + } + } + ] +} diff --git a/golden/expected_osv_parse/synthetic/s31_rows_below_total.json b/golden/expected_osv_parse/synthetic/s31_rows_below_total.json new file mode 100644 index 0000000..8cfff18 --- /dev/null +++ b/golden/expected_osv_parse/synthetic/s31_rows_below_total.json @@ -0,0 +1,252 @@ +{ + "schema_version": "1.2", + "service": { + "name": "tabular-parser" + }, + "status": "done", + "metrics": { + "rows": 9, + "warnings": [ + "sheet=Лист_1 hierarchy=outline", + "строки 24–25: ниже таблицы (после «Итого») есть числа — строки ниже «Итого» вне документа и не разобраны" + ] + }, + "documents": [ + { + "document_type": "OSV", + "locator": "sheet:Лист_1", + "header": { + "organization_name": "ООО \"Тестовая организация\"", + "organization_inn": null, + "account_code_raw": "60", + "period_text": "1 квартал 2025 г.", + "period_year": 2025, + "period_quarter": "Q1", + "is_cumulative": true, + "period_start": "2025-01-01", + "period_end": "2025-03-31", + "is_from_year_start": true, + "data_type": "BU", + "currency": "RUB", + "header_variant": 1 + }, + "group_schema": [ + { + "type": "ACCOUNT", + "name": "Счет" + }, + { + "type": "COUNTERPARTY", + "name": "Контрагенты", + "has_inn": true + } + ], + "columns": { + "opening_debit": "G", + "opening_credit": "H", + "turnover_debit": "I", + "turnover_credit": "J", + "closing_debit": "K", + "closing_credit": "L", + "inn": "E" + }, + "rows": [ + { + "row_number": 11, + "level": 0, + "parent_row_number": null, + "row_value": "60", + "group_type": "ACCOUNT", + "group_name": "Счет", + "account_code_raw": "60", + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "135000.00", + "opening_credit": "262500.60", + "turnover_debit": "311000.35", + "turnover_credit": "572000.35", + "closing_debit": "115000.00", + "closing_credit": "503500.60", + "extra": null + }, + { + "row_number": 12, + "level": 1, + "parent_row_number": 11, + "row_value": "60.01", + "group_type": "ACCOUNT", + "group_name": "Счет", + "account_code_raw": "60.01", + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "15000.00", + "opening_credit": "253000.50", + "turnover_debit": "273000.25", + "turnover_credit": "460000.00", + "closing_debit": "65000.00", + "closing_credit": "490000.25", + "extra": null + }, + { + "row_number": 13, + "level": 2, + "parent_row_number": 12, + "row_value": "ООО Альфа", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.01", + "counterparty_name": "ООО Альфа", + "counterparty_inn": "7701234567", + "data_type": "BU", + "opening_debit": null, + "opening_credit": "250000.50", + "turnover_debit": "180000.25", + "turnover_credit": "420000.00", + "closing_debit": null, + "closing_credit": "490000.25", + "extra": null + }, + { + "row_number": 14, + "level": 2, + "parent_row_number": 12, + "row_value": "ООО Бета", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.01", + "counterparty_name": "ООО Бета", + "counterparty_inn": "7707654321", + "data_type": "BU", + "opening_debit": "15000.00", + "opening_credit": null, + "turnover_debit": "90000.00", + "turnover_credit": "40000.00", + "closing_debit": "65000.00", + "closing_credit": null, + "extra": null + }, + { + "row_number": 15, + "level": 2, + "parent_row_number": 12, + "row_value": "Иванов Иван", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.01", + "counterparty_name": "Иванов Иван", + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": null, + "opening_credit": "3000.00", + "turnover_debit": "3000.00", + "turnover_credit": null, + "closing_debit": null, + "closing_credit": null, + "extra": null + }, + { + "row_number": 16, + "level": 1, + "parent_row_number": 11, + "row_value": "60.02", + "group_type": "ACCOUNT", + "group_name": "Счет", + "account_code_raw": "60.02", + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "120000.00", + "opening_credit": "9500.10", + "turnover_debit": "38000.10", + "turnover_credit": "112000.35", + "closing_debit": "50000.00", + "closing_credit": "13500.35", + "extra": null + }, + { + "row_number": 17, + "level": 2, + "parent_row_number": 16, + "row_value": "ООО Гамма", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.02", + "counterparty_name": "ООО Гамма", + "counterparty_inn": "5001234567", + "data_type": "BU", + "opening_debit": "120000.00", + "opening_credit": null, + "turnover_debit": "30000.00", + "turnover_credit": "100000.00", + "closing_debit": "50000.00", + "closing_credit": null, + "extra": null + }, + { + "row_number": 18, + "level": 2, + "parent_row_number": 16, + "row_value": "ООО Дельта", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.02", + "counterparty_name": "ООО Дельта", + "counterparty_inn": "7812345678", + "data_type": "BU", + "opening_debit": null, + "opening_credit": "8000.10", + "turnover_debit": "8000.10", + "turnover_credit": "12000.35", + "closing_debit": null, + "closing_credit": "12000.35", + "extra": null + }, + { + "row_number": 19, + "level": 2, + "parent_row_number": 16, + "row_value": "ИП Сидоров", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.02", + "counterparty_name": "ИП Сидоров", + "counterparty_inn": "500100732259", + "data_type": "BU", + "opening_debit": null, + "opening_credit": "1500.00", + "turnover_debit": null, + "turnover_credit": null, + "closing_debit": null, + "closing_credit": "1500.00", + "extra": null + }, + { + "row_number": 20, + "level": 0, + "parent_row_number": null, + "row_value": "Итого", + "group_type": "TOTAL", + "group_name": null, + "account_code_raw": null, + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "135000.00", + "opening_credit": "262500.60", + "turnover_debit": "311000.35", + "turnover_credit": "572000.35", + "closing_debit": "115000.00", + "closing_credit": "503500.60", + "extra": null + } + ], + "checks": { + "total_row_matches_root": true, + "balance_identity_violations": [], + "parent_sum_violations": [] + } + } + ] +} diff --git a/osv/synthetic/README.md b/osv/synthetic/README.md index 2520b2c..9ae48cc 100644 --- a/osv/synthetic/README.md +++ b/osv/synthetic/README.md @@ -53,10 +53,15 @@ cd tabular-parser/api | `s26_inn_below_sibling_sums.xlsx` | ИНН строкой **под** наименованием, сосед, с суммами | ИНН — своему контрагенту, `done` | | `s27_inn_below_sibling_blank.xlsx` | ИНН строкой под наименованием, сосед, без сумм (дефект main: ИНН уходил следующему контрагенту) | ИНН — своему контрагенту; направление — по блоку 60.02, кончающемуся строкой ИНН; `done` | | `s28_inn_bad_checksum.xlsx` | раскладка `s20` («над, не в дереве, без сумм»), но у ООО Альфа строка ИНН `7701234567` с неверной контрольной суммой (#35) | строка остаётся обычной, у Альфы ИНН нет, предупреждение «похожа на ИНН … контрольная сумма не сходится», `needs_check`; остальные контрагенты — со своими ИНН (направление «над» — по блоку 60.02) | +| `s29_xls_no_codepage.xls` | xls BIFF5 без записи CODEPAGE, строки в cp1251 (собран `tests/synthetic/xls_writer.py`); отступ — ведущими пробелами (AURORA-1662) | кириллица читается как cp1251, предупреждение «xls без кодовой страницы — строки прочитаны как cp1251», `done` | +| `s30_val_kol_vo_materials.xlsx` | счёт 10 (вариант 2, номенклатура): материал «Вал» без точки, под материалами строки «Кол-во» (AURORA-1663) | «Вал» — обычная строка (`data_type` шапки, `OTHER`), «Кол-во» — `QUANTITY`, `done` | +| `s31_rows_below_total.xlsx` | под «Итого» дописаны «Ответственный:», блок «ООО Альфа (ГК)» с числами и строка «Итого по ГК» (AURORA-1664) | таблица кончается на первой «Итого», хвост вне документа, предупреждение «ниже таблицы … есть числа», `done` | `s17`–`s19` — регрессия извлечения ИНН из текста (issue #9). `s14`–`s16` добавлены тестом покрытия словарей `tabular-parser` (`rules/*.yaml`, решение R-22): каждая запись словаря должна сработать на реальных или синтетических файлах; эти файлы закрывают записи, которых нет в реальных ОСВ. +`s29`–`s31` — tabular-parser#47 (кодировка xls без CODEPAGE, «Вал»/«Кол-во», строки ниже «Итого»). + `s20`–`s27` — восемь раскладок строки ИНН рядом с контрагентом (issue tabular-parser#35); ИНН с верной контрольной суммой — без подсказки в шапке другие не склеиваются. ## О файле xlsb diff --git a/osv/synthetic/s29_xls_no_codepage.xls b/osv/synthetic/s29_xls_no_codepage.xls new file mode 100644 index 0000000000000000000000000000000000000000..c36c8abb915539d9c08b8b0c26f9b36d988b01f9 GIT binary patch literal 5632 zcmeHIO>7%g5T34glg9t{rY(sIJaPi5t?YFjmq?(dqPKFXgv5!e7bIE)QPm4v=%JN3 zRftO!ZsmeFB8~`=hDul=P6$0Cy{x^e72BKjhV(~vYi8cQU9VeJrD`vron*bc^XAPr z^Ub{3Kh|^n`VZ5a@QAz(F?cwbfU%H%4?fc+Bn!Ac7|^qSr)N|}@*iU00me%8i(&0l zyfnP1=Hqzn#cKjDT94%a$-rs&6#p&)gOl(H-Y>vsSn+=^`$5~|GZV~)r)&?;ixUF> z{8M&3c{vVBfKPEe*>bp|&?C;T7bMS&|AKIRH_wGXu@_Idrh$8Kb-W0ZP(`nUFTRqc z)aEaIboOH|$=VIEdj(SPu83gl_h#2UQ;g$_=PWCndE;XewMkHw8DR=A4Qp#_Z01j^ z>)IwCFx#o~PV+Xu(;UpG%1QZoc?;GyZO3*y_TesX^&7&}v>JBX?z(-pZL{uO%iUqK z1$LXWBHJ>#u243K~oyW={%Zgt$Asw7ZNqdW%HT1{0__)3vzaMRkP(9)=&@jeDCj@4+Q zhD<1s5fhsHqb3y2h)H6^Brf6wBx$w~LzK9HMH5*19OgX@;eLqnwU(6{!X?ewUS4Vl zxKt|rxODL~sUcvJOM3sf=ZBDKm+{jp^Qw|T3P{F*VNV<>6v-$Nz{9DU*p?7!li@pN zTDVS#v`KUQdoLg&&y!2~L22W|!_V8&j|T@Z-+US2_hE~Zq!6AlYVf62|8FdCo_Ze_ z;!vp+ibm;ZdA35KC4)dNU-km=+XvaZuL;=XFpzJjq-GR$5&=n)0qhOzUqVd{Q7g0M zqa{NSl6s7gRFFR0-xaA*CrJ6SE;ZrwRpkJrg+WH3R!!cqO-46LEFB~U3*U+D=^+Ga zs8kuT-7l3v+cKfZ9*Auj;i$H{x|+PYEH%_A*cYYPRa0sx)^8RU7q$0$QWL~_t|>Ld z8TmQ%!3x6flcQ`{s$Y4#ElA5s(#nN!sj`oSmK|nv>MsG39g=qLp45Z`QI-98#!1pa zscu@WzE`ZAU#w%YLyi$8IY9s=H+B3M;WH<2M>Rx%NN(XbX%nQ28p6$oaI5QVquId0 zYO2a4u25?xf$}XBDkZ}xze&jXPz|pMuX%aA(0t($-45 zXVgFIx=4UD{#o}1Soo~#a)v-~)^!0+yXdS3w2AKfrx>Kfrx>KfoEpm EA2Ho?761SM literal 0 HcmV?d00001 diff --git a/osv/synthetic/s30_val_kol_vo_materials.xlsx b/osv/synthetic/s30_val_kol_vo_materials.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e37b220fee04efe3a691d1de63d2d82f51dd4f22 GIT binary patch literal 5550 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 W>KI7B69B+Ler1s@9rjB|fd2t=lsypu literal 0 HcmV?d00001 From 0268b5343c26c21aaae84d4c6cc8fedef60a722e Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Sun, 18 Oct 2026 12:04:48 +0400 Subject: [PATCH 2/2] =?UTF-8?q?Golden:=20rb/2024-Q1=20=D0=B1=D0=B5=D0=B7?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B5=D0=B4=D1=83=D0=BF=D1=80=D0=B5=D0=B6=D0=B4?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BE=20=D1=85=D0=B2=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B5,=20=D1=81=D0=B8=D0=BD=D1=82=D0=B5=D1=82=D0=B8?= =?UTF-8?q?=D0=BA=D0=B0=20s32=20(tabular-parser=20#47,=20AURORA-1664)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5.5 --- .../rb/2024-Q1/сч 60_ 1 кв 2024 г.json | 3 +- .../synthetic/s32_total_with_suffix.json | 251 ++++++++++++++++++ osv/synthetic/README.md | 3 +- osv/synthetic/s32_total_with_suffix.xlsx | Bin 0 -> 5810 bytes 4 files changed, 254 insertions(+), 3 deletions(-) create mode 100644 golden/expected_osv_parse/synthetic/s32_total_with_suffix.json create mode 100644 osv/synthetic/s32_total_with_suffix.xlsx diff --git a/golden/expected_osv_parse/rb/2024-Q1/сч 60_ 1 кв 2024 г.json b/golden/expected_osv_parse/rb/2024-Q1/сч 60_ 1 кв 2024 г.json index 63dfa1e..17f7610 100644 --- a/golden/expected_osv_parse/rb/2024-Q1/сч 60_ 1 кв 2024 г.json +++ b/golden/expected_osv_parse/rb/2024-Q1/сч 60_ 1 кв 2024 г.json @@ -7,8 +7,7 @@ "metrics": { "rows": 612, "warnings": [ - "sheet=Лист_1 hierarchy=outline", - "строки 625–626: ниже таблицы (после «Итого») есть числа — строки ниже «Итого» вне документа и не разобраны" + "sheet=Лист_1 hierarchy=outline" ] }, "documents": [ diff --git a/golden/expected_osv_parse/synthetic/s32_total_with_suffix.json b/golden/expected_osv_parse/synthetic/s32_total_with_suffix.json new file mode 100644 index 0000000..a16d888 --- /dev/null +++ b/golden/expected_osv_parse/synthetic/s32_total_with_suffix.json @@ -0,0 +1,251 @@ +{ + "schema_version": "1.2", + "service": { + "name": "tabular-parser" + }, + "status": "done", + "metrics": { + "rows": 9, + "warnings": [ + "sheet=Лист_1 hierarchy=outline" + ] + }, + "documents": [ + { + "document_type": "OSV", + "locator": "sheet:Лист_1", + "header": { + "organization_name": "ООО \"Тестовая организация\"", + "organization_inn": null, + "account_code_raw": "60", + "period_text": "1 квартал 2025 г.", + "period_year": 2025, + "period_quarter": "Q1", + "is_cumulative": true, + "period_start": "2025-01-01", + "period_end": "2025-03-31", + "is_from_year_start": true, + "data_type": "BU", + "currency": "RUB", + "header_variant": 1 + }, + "group_schema": [ + { + "type": "ACCOUNT", + "name": "Счет" + }, + { + "type": "COUNTERPARTY", + "name": "Контрагенты", + "has_inn": true + } + ], + "columns": { + "opening_debit": "G", + "opening_credit": "H", + "turnover_debit": "I", + "turnover_credit": "J", + "closing_debit": "K", + "closing_credit": "L", + "inn": "E" + }, + "rows": [ + { + "row_number": 11, + "level": 0, + "parent_row_number": null, + "row_value": "60", + "group_type": "ACCOUNT", + "group_name": "Счет", + "account_code_raw": "60", + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "135000.00", + "opening_credit": "262500.60", + "turnover_debit": "311000.35", + "turnover_credit": "572000.35", + "closing_debit": "115000.00", + "closing_credit": "503500.60", + "extra": null + }, + { + "row_number": 12, + "level": 1, + "parent_row_number": 11, + "row_value": "60.01", + "group_type": "ACCOUNT", + "group_name": "Счет", + "account_code_raw": "60.01", + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "15000.00", + "opening_credit": "253000.50", + "turnover_debit": "273000.25", + "turnover_credit": "460000.00", + "closing_debit": "65000.00", + "closing_credit": "490000.25", + "extra": null + }, + { + "row_number": 13, + "level": 2, + "parent_row_number": 12, + "row_value": "ООО Альфа", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.01", + "counterparty_name": "ООО Альфа", + "counterparty_inn": "7701234567", + "data_type": "BU", + "opening_debit": null, + "opening_credit": "250000.50", + "turnover_debit": "180000.25", + "turnover_credit": "420000.00", + "closing_debit": null, + "closing_credit": "490000.25", + "extra": null + }, + { + "row_number": 14, + "level": 2, + "parent_row_number": 12, + "row_value": "ООО Бета", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.01", + "counterparty_name": "ООО Бета", + "counterparty_inn": "7707654321", + "data_type": "BU", + "opening_debit": "15000.00", + "opening_credit": null, + "turnover_debit": "90000.00", + "turnover_credit": "40000.00", + "closing_debit": "65000.00", + "closing_credit": null, + "extra": null + }, + { + "row_number": 15, + "level": 2, + "parent_row_number": 12, + "row_value": "Иванов Иван", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.01", + "counterparty_name": "Иванов Иван", + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": null, + "opening_credit": "3000.00", + "turnover_debit": "3000.00", + "turnover_credit": null, + "closing_debit": null, + "closing_credit": null, + "extra": null + }, + { + "row_number": 16, + "level": 1, + "parent_row_number": 11, + "row_value": "60.02", + "group_type": "ACCOUNT", + "group_name": "Счет", + "account_code_raw": "60.02", + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "120000.00", + "opening_credit": "9500.10", + "turnover_debit": "38000.10", + "turnover_credit": "112000.35", + "closing_debit": "50000.00", + "closing_credit": "13500.35", + "extra": null + }, + { + "row_number": 17, + "level": 2, + "parent_row_number": 16, + "row_value": "ООО Гамма", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.02", + "counterparty_name": "ООО Гамма", + "counterparty_inn": "5001234567", + "data_type": "BU", + "opening_debit": "120000.00", + "opening_credit": null, + "turnover_debit": "30000.00", + "turnover_credit": "100000.00", + "closing_debit": "50000.00", + "closing_credit": null, + "extra": null + }, + { + "row_number": 18, + "level": 2, + "parent_row_number": 16, + "row_value": "ООО Дельта", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.02", + "counterparty_name": "ООО Дельта", + "counterparty_inn": "7812345678", + "data_type": "BU", + "opening_debit": null, + "opening_credit": "8000.10", + "turnover_debit": "8000.10", + "turnover_credit": "12000.35", + "closing_debit": null, + "closing_credit": "12000.35", + "extra": null + }, + { + "row_number": 19, + "level": 2, + "parent_row_number": 16, + "row_value": "ИП Сидоров", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.02", + "counterparty_name": "ИП Сидоров", + "counterparty_inn": "500100732259", + "data_type": "BU", + "opening_debit": null, + "opening_credit": "1500.00", + "turnover_debit": null, + "turnover_credit": null, + "closing_debit": null, + "closing_credit": "1500.00", + "extra": null + }, + { + "row_number": 20, + "level": 0, + "parent_row_number": null, + "row_value": "Итого по счету 60", + "group_type": "TOTAL", + "group_name": null, + "account_code_raw": null, + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "135000.00", + "opening_credit": "262500.60", + "turnover_debit": "311000.35", + "turnover_credit": "572000.35", + "closing_debit": "115000.00", + "closing_credit": "503500.60", + "extra": null + } + ], + "checks": { + "total_row_matches_root": true, + "balance_identity_violations": [], + "parent_sum_violations": [] + } + } + ] +} diff --git a/osv/synthetic/README.md b/osv/synthetic/README.md index 9ae48cc..96289ea 100644 --- a/osv/synthetic/README.md +++ b/osv/synthetic/README.md @@ -56,11 +56,12 @@ cd tabular-parser/api | `s29_xls_no_codepage.xls` | xls BIFF5 без записи CODEPAGE, строки в cp1251 (собран `tests/synthetic/xls_writer.py`); отступ — ведущими пробелами (AURORA-1662) | кириллица читается как cp1251, предупреждение «xls без кодовой страницы — строки прочитаны как cp1251», `done` | | `s30_val_kol_vo_materials.xlsx` | счёт 10 (вариант 2, номенклатура): материал «Вал» без точки, под материалами строки «Кол-во» (AURORA-1663) | «Вал» — обычная строка (`data_type` шапки, `OTHER`), «Кол-во» — `QUANTITY`, `done` | | `s31_rows_below_total.xlsx` | под «Итого» дописаны «Ответственный:», блок «ООО Альфа (ГК)» с числами и строка «Итого по ГК» (AURORA-1664) | таблица кончается на первой «Итого», хвост вне документа, предупреждение «ниже таблицы … есть числа», `done` | +| `s32_total_with_suffix.xlsx` | итоговая строка подписана «Итого по счету 60», точного «Итого» нет (I-1: правило `total_row` — запасное после `total_row_exact`) | `TOTAL` — последняя строка, `done` | `s17`–`s19` — регрессия извлечения ИНН из текста (issue #9). `s14`–`s16` добавлены тестом покрытия словарей `tabular-parser` (`rules/*.yaml`, решение R-22): каждая запись словаря должна сработать на реальных или синтетических файлах; эти файлы закрывают записи, которых нет в реальных ОСВ. -`s29`–`s31` — tabular-parser#47 (кодировка xls без CODEPAGE, «Вал»/«Кол-во», строки ниже «Итого»). +`s29`–`s32` — tabular-parser#47 (кодировка xls без CODEPAGE, «Вал»/«Кол-во», строки ниже «Итого», итог «Итого по счету»). `s20`–`s27` — восемь раскладок строки ИНН рядом с контрагентом (issue tabular-parser#35); ИНН с верной контрольной суммой — без подсказки в шапке другие не склеиваются. diff --git a/osv/synthetic/s32_total_with_suffix.xlsx b/osv/synthetic/s32_total_with_suffix.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..af171c2bb0a6ae284b7590165ae28c1ba161c70a GIT binary patch literal 5810 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 literal 0 HcmV?d00001