From 3fc8fa7871f23ee4938f33a590155ada3754b739 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Tue, 6 Oct 2026 13:13:42 +0400 Subject: [PATCH] =?UTF-8?q?test(osv):=20=D1=81=D0=B8=D0=BD=D1=82=D0=B5?= =?UTF-8?q?=D1=82=D0=B8=D0=BA=D0=B0=20s17=E2=80=93s19=20(=D0=98=D0=9D?= =?UTF-8?q?=D0=9D=20=D0=B2=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B8,=20=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=BE=D0=B9=20=D0=B2?= =?UTF-8?q?=D1=8B=D1=88=D0=B5,=20=D0=98=D0=9D=D0=9D/=D0=9A=D0=9F=D0=9F)=20?= =?UTF-8?q?=D0=B8=20golden:=20=D0=98=D0=9D=D0=9D=20=D0=B8=D0=B7=20=D1=82?= =?UTF-8?q?=D0=B5=D0=BA=D1=81=D1=82=D0=B0=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Новые: s17_inn_in_name, s18_inn_row_above, s19_inn_kpp_cell + снимки. Изменены 9 снимков (rb 60 ×5, schastl 76 ×4): counterparty_name без ИНН и разделителя, counterparty_inn — извлечённый ИНН; остальное без изменений. Парный PR: RSHB/arm-tabular-parser (feat/9-inn-in-text), issue #9. Co-Authored-By: Claude Sonnet 4.5 Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b --- README.md | 2 +- .../rb/2024-FY/ОСВ_60 за 2024.json | 4 +- .../rb/2024-Q1/сч 60_ 1 кв 2024 г.json | 4 +- .../rb/2024-Q2/сч 60_ 2 кв 2024 г.json | 4 +- .../2025-Q1/ОСВ сч 60 за 1 кв 2025 год.json | 4 +- .../expected_osv_parse/rb/2025-Q2/сч 60.json | 4 +- ...Œдовая ведомость по счету 76 за 1 квартал 2024 г..json | 24 +- ...Œдовая ведомость по счету 76 за 2 квартал 2024 г..json | 28 +-- ...Œдовая ведомость по счету 76 за 3 квартал 2024 г..json | 28 +-- ...Œдовая ведомость по счету 76 за 1 квартал 2025 г..json | 20 +- .../synthetic/s17_inn_in_name.json | 227 +++++++++++++++++ .../synthetic/s18_inn_row_above.json | 210 ++++++++++++++++ .../synthetic/s19_inn_kpp_cell.json | 229 ++++++++++++++++++ osv/synthetic/README.md | 5 +- osv/synthetic/s17_inn_in_name.xlsx | Bin 0 -> 5737 bytes osv/synthetic/s18_inn_row_above.xlsx | Bin 0 -> 5671 bytes osv/synthetic/s19_inn_kpp_cell.xlsx | Bin 0 -> 5770 bytes 17 files changed, 731 insertions(+), 62 deletions(-) create mode 100644 golden/expected_osv_parse/synthetic/s17_inn_in_name.json create mode 100644 golden/expected_osv_parse/synthetic/s18_inn_row_above.json create mode 100644 golden/expected_osv_parse/synthetic/s19_inn_kpp_cell.json create mode 100644 osv/synthetic/s17_inn_in_name.xlsx create mode 100644 osv/synthetic/s18_inn_row_above.xlsx create mode 100644 osv/synthetic/s19_inn_kpp_cell.xlsx diff --git a/README.md b/README.md index 3fb7bd2..01d95e7 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ ``` osv/{rb,schastl}/<ГГГГ-Qn | ГГГГ-FY>/ ОСВ по счетам, исходные имена файлов (разложены по шапке, не по имени) -osv/synthetic/ синтетика s01–s16 для форматов, которых нет в реальных данных (Срез 2a); генератор и описание — osv/synthetic/README.md +osv/synthetic/ синтетика s01–s19 для форматов, которых нет в реальных данных (Срез 2a); генератор и описание — osv/synthetic/README.md osv-dkb//<период>/ ОСВ шести организаций из пакета ДКБ 06.10.2026 (Цимлянский, НКЗ, Новоросметалл, НПЗ, Приманыческий, Агрокомплекс): многолистовые книги, needs_check, 50 тыс. строк — вне тестов osv/**, см. osv-dkb/README.md analysis-reports//<период>/ отчёты 1С «Анализ счета» по контрагентам группы из того же пакета (не ОСВ), см. README diff --git a/golden/expected_osv_parse/rb/2024-FY/ОСВ_60 за 2024.json b/golden/expected_osv_parse/rb/2024-FY/ОСВ_60 за 2024.json index 8bddf05..2eb63a4 100644 --- a/golden/expected_osv_parse/rb/2024-FY/ОСВ_60 за 2024.json +++ b/golden/expected_osv_parse/rb/2024-FY/ОСВ_60 за 2024.json @@ -2998,8 +2998,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты", "account_code_raw": "60.01", - "counterparty_name": "ДОРСЕРВИС ООО ИНН 3523022660", - "counterparty_inn": null, + "counterparty_name": "ДОРСЕРВИС ООО", + "counterparty_inn": "3523022660", "data_type": "BU", "opening_debit": null, "opening_credit": "214640.00", 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 cf83eab..6240ed5 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 @@ -1706,8 +1706,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты", "account_code_raw": "60.01", - "counterparty_name": "ДОРСЕРВИС ООО ИНН 3523022660", - "counterparty_inn": null, + "counterparty_name": "ДОРСЕРВИС ООО", + "counterparty_inn": "3523022660", "data_type": "BU", "opening_debit": null, "opening_credit": "214640.00", diff --git a/golden/expected_osv_parse/rb/2024-Q2/сч 60_ 2 кв 2024 г.json b/golden/expected_osv_parse/rb/2024-Q2/сч 60_ 2 кв 2024 г.json index cc6e49d..0a06404 100644 --- a/golden/expected_osv_parse/rb/2024-Q2/сч 60_ 2 кв 2024 г.json +++ b/golden/expected_osv_parse/rb/2024-Q2/сч 60_ 2 кв 2024 г.json @@ -1630,8 +1630,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты", "account_code_raw": "60.01", - "counterparty_name": "ДОРСЕРВИС ООО ИНН 3523022660", - "counterparty_inn": null, + "counterparty_name": "ДОРСЕРВИС ООО", + "counterparty_inn": "3523022660", "data_type": "BU", "opening_debit": null, "opening_credit": null, diff --git a/golden/expected_osv_parse/rb/2025-Q1/ОСВ сч 60 за 1 кв 2025 год.json b/golden/expected_osv_parse/rb/2025-Q1/ОСВ сч 60 за 1 кв 2025 год.json index 0b75cd8..ed67182 100644 --- a/golden/expected_osv_parse/rb/2025-Q1/ОСВ сч 60 за 1 кв 2025 год.json +++ b/golden/expected_osv_parse/rb/2025-Q1/ОСВ сч 60 за 1 кв 2025 год.json @@ -2067,8 +2067,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты", "account_code_raw": "60.01", - "counterparty_name": "ДОРСЕРВИС ООО ИНН 3523022660", - "counterparty_inn": null, + "counterparty_name": "ДОРСЕРВИС ООО", + "counterparty_inn": "3523022660", "data_type": "BU", "opening_debit": null, "opening_credit": "116660.00", diff --git a/golden/expected_osv_parse/rb/2025-Q2/сч 60.json b/golden/expected_osv_parse/rb/2025-Q2/сч 60.json index 2813dd0..d01ca0f 100644 --- a/golden/expected_osv_parse/rb/2025-Q2/сч 60.json +++ b/golden/expected_osv_parse/rb/2025-Q2/сч 60.json @@ -1972,8 +1972,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты", "account_code_raw": "60.01", - "counterparty_name": "ДОРСЕРВИС ООО ИНН 3523022660", - "counterparty_inn": null, + "counterparty_name": "ДОРСЕРВИС ООО", + "counterparty_inn": "3523022660", "data_type": "BU", "opening_debit": null, "opening_credit": "22240.00", diff --git a/golden/expected_osv_parse/schastl/2024-Q1/Оборотносальдовая ведомость по счету 76 за 1 квартал 2024 г..json b/golden/expected_osv_parse/schastl/2024-Q1/Оборотносальдовая ведомость по счету 76 за 1 квартал 2024 г..json index ca022e8..b3aa409 100644 --- a/golden/expected_osv_parse/schastl/2024-Q1/Оборотносальдовая ведомость по счету 76 за 1 квартал 2024 г..json +++ b/golden/expected_osv_parse/schastl/2024-Q1/Оборотносальдовая ведомость по счету 76 за 1 квартал 2024 г..json @@ -96,8 +96,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты, ИНН", "account_code_raw": "76.04", - "counterparty_name": "Костыгова Наталья Валериевна, 352800390201", - "counterparty_inn": null, + "counterparty_name": "Костыгова Наталья Валериевна", + "counterparty_inn": "352800390201", "data_type": "BU", "opening_debit": null, "opening_credit": "100.00", @@ -153,8 +153,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты, ИНН", "account_code_raw": "76.05", - "counterparty_name": "Межрегиональное операционное УФК (ФТС России), 7730176610", - "counterparty_inn": null, + "counterparty_name": "Межрегиональное операционное УФК (ФТС России)", + "counterparty_inn": "7730176610", "data_type": "BU", "opening_debit": "123189.16", "opening_credit": null, @@ -210,8 +210,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты, ИНН", "account_code_raw": "76.09", - "counterparty_name": "Полиграф, 3528315710", - "counterparty_inn": null, + "counterparty_name": "Полиграф", + "counterparty_inn": "3528315710", "data_type": "BU", "opening_debit": null, "opening_credit": "14852.50", @@ -286,8 +286,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты, ИНН", "account_code_raw": "76.41", - "counterparty_name": "УФК по Вологодской области (ОСП по г.Череповцу №1 УФССП по Вологодской области л/с05301А53990), 3525144985", - "counterparty_inn": null, + "counterparty_name": "УФК по Вологодской области (ОСП по г.Череповцу №1 УФССП по Вологодской области л/с05301А53990)", + "counterparty_inn": "3525144985", "data_type": "BU", "opening_debit": null, "opening_credit": "20039.22", @@ -305,8 +305,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты, ИНН", "account_code_raw": "76.41", - "counterparty_name": "УФК по Вологодской области (ОСП по г.Череповцу №2 УФССП России по Вологодской области л/с05301А54000, 3525144985", - "counterparty_inn": null, + "counterparty_name": "УФК по Вологодской области (ОСП по г.Череповцу №2 УФССП России по Вологодской области л/с05301А54000", + "counterparty_inn": "3525144985", "data_type": "BU", "opening_debit": "35.99", "opening_credit": null, @@ -343,8 +343,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты, ИНН", "account_code_raw": "76.АВ", - "counterparty_name": "Русский бисквит, 3528052718", - "counterparty_inn": null, + "counterparty_name": "Русский бисквит", + "counterparty_inn": "3528052718", "data_type": "BU", "opening_debit": "4016666.70", "opening_credit": null, diff --git a/golden/expected_osv_parse/schastl/2024-Q2/Оборотносальдовая ведомость по счету 76 за 2 квартал 2024 г..json b/golden/expected_osv_parse/schastl/2024-Q2/Оборотносальдовая ведомость по счету 76 за 2 квартал 2024 г..json index ba81e08..53f1b61 100644 --- a/golden/expected_osv_parse/schastl/2024-Q2/Оборотносальдовая ведомость по счету 76 за 2 квартал 2024 г..json +++ b/golden/expected_osv_parse/schastl/2024-Q2/Оборотносальдовая ведомость по счету 76 за 2 квартал 2024 г..json @@ -96,8 +96,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты, ИНН", "account_code_raw": "76.04", - "counterparty_name": "Костыгова Наталья Валериевна, 352800390201", - "counterparty_inn": null, + "counterparty_name": "Костыгова Наталья Валериевна", + "counterparty_inn": "352800390201", "data_type": "BU", "opening_debit": null, "opening_credit": "100.00", @@ -153,8 +153,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты, ИНН", "account_code_raw": "76.05", - "counterparty_name": "Межрегиональное операционное УФК (ФТС России), 7730176610", - "counterparty_inn": null, + "counterparty_name": "Межрегиональное операционное УФК (ФТС России)", + "counterparty_inn": "7730176610", "data_type": "BU", "opening_debit": "123189.16", "opening_credit": null, @@ -210,8 +210,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты, ИНН", "account_code_raw": "76.06", - "counterparty_name": "Русский бисквит, 3528052718", - "counterparty_inn": null, + "counterparty_name": "Русский бисквит", + "counterparty_inn": "3528052718", "data_type": "BU", "opening_debit": null, "opening_credit": null, @@ -267,8 +267,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты, ИНН", "account_code_raw": "76.09", - "counterparty_name": "Полиграф, 3528315710", - "counterparty_inn": null, + "counterparty_name": "Полиграф", + "counterparty_inn": "3528315710", "data_type": "BU", "opening_debit": null, "opening_credit": "11132.00", @@ -343,8 +343,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты, ИНН", "account_code_raw": "76.41", - "counterparty_name": "УФК по Вологодской области (ОСП по г.Череповцу №1 УФССП по Вологодской области л/с05301А53990), 3525144985", - "counterparty_inn": null, + "counterparty_name": "УФК по Вологодской области (ОСП по г.Череповцу №1 УФССП по Вологодской области л/с05301А53990)", + "counterparty_inn": "3525144985", "data_type": "BU", "opening_debit": null, "opening_credit": "23379.18", @@ -362,8 +362,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты, ИНН", "account_code_raw": "76.41", - "counterparty_name": "УФК по Вологодской области (ОСП по г.Череповцу №2 УФССП России по Вологодской области л/с05301А54000, 3525144985", - "counterparty_inn": null, + "counterparty_name": "УФК по Вологодской области (ОСП по г.Череповцу №2 УФССП России по Вологодской области л/с05301А54000", + "counterparty_inn": "3525144985", "data_type": "BU", "opening_debit": "35.99", "opening_credit": null, @@ -400,8 +400,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты, ИНН", "account_code_raw": "76.АВ", - "counterparty_name": "Русский бисквит, 3528052718", - "counterparty_inn": null, + "counterparty_name": "Русский бисквит", + "counterparty_inn": "3528052718", "data_type": "BU", "opening_debit": "3466666.70", "opening_credit": null, diff --git a/golden/expected_osv_parse/schastl/2024-Q3/Оборотносальдовая ведомость по счету 76 за 3 квартал 2024 г..json b/golden/expected_osv_parse/schastl/2024-Q3/Оборотносальдовая ведомость по счету 76 за 3 квартал 2024 г..json index b30ac8f..d0a66c1 100644 --- a/golden/expected_osv_parse/schastl/2024-Q3/Оборотносальдовая ведомость по счету 76 за 3 квартал 2024 г..json +++ b/golden/expected_osv_parse/schastl/2024-Q3/Оборотносальдовая ведомость по счету 76 за 3 квартал 2024 г..json @@ -96,8 +96,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты, ИНН", "account_code_raw": "76.04", - "counterparty_name": "Костыгова Наталья Валериевна, 352800390201", - "counterparty_inn": null, + "counterparty_name": "Костыгова Наталья Валериевна", + "counterparty_inn": "352800390201", "data_type": "BU", "opening_debit": null, "opening_credit": "100.00", @@ -153,8 +153,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты, ИНН", "account_code_raw": "76.05", - "counterparty_name": "Межрегиональное операционное УФК (ФТС России), 7730176610", - "counterparty_inn": null, + "counterparty_name": "Межрегиональное операционное УФК (ФТС России)", + "counterparty_inn": "7730176610", "data_type": "BU", "opening_debit": "123189.16", "opening_credit": null, @@ -210,8 +210,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты, ИНН", "account_code_raw": "76.06", - "counterparty_name": "Русский бисквит, 3528052718", - "counterparty_inn": null, + "counterparty_name": "Русский бисквит", + "counterparty_inn": "3528052718", "data_type": "BU", "opening_debit": "172131.15", "opening_credit": null, @@ -267,8 +267,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты, ИНН", "account_code_raw": "76.09", - "counterparty_name": "Полиграф, 3528315710", - "counterparty_inn": null, + "counterparty_name": "Полиграф", + "counterparty_inn": "3528315710", "data_type": "BU", "opening_debit": null, "opening_credit": "10070.00", @@ -324,8 +324,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты, ИНН", "account_code_raw": "76.41", - "counterparty_name": "УФК по Вологодской области (ОСП по г.Череповцу №1 УФССП по Вологодской области л/с05301А53990), 3525144985", - "counterparty_inn": null, + "counterparty_name": "УФК по Вологодской области (ОСП по г.Череповцу №1 УФССП по Вологодской области л/с05301А53990)", + "counterparty_inn": "3525144985", "data_type": "BU", "opening_debit": null, "opening_credit": "28053.36", @@ -343,8 +343,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты, ИНН", "account_code_raw": "76.41", - "counterparty_name": "УФК по Вологодской области (ОСП по г.Череповцу №2 УФССП России по Вологодской области л/с05301А54000, 3525144985", - "counterparty_inn": null, + "counterparty_name": "УФК по Вологодской области (ОСП по г.Череповцу №2 УФССП России по Вологодской области л/с05301А54000", + "counterparty_inn": "3525144985", "data_type": "BU", "opening_debit": null, "opening_credit": "82314.78", @@ -381,8 +381,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты, ИНН", "account_code_raw": "76.АВ", - "counterparty_name": "Русский бисквит, 3528052718", - "counterparty_inn": null, + "counterparty_name": "Русский бисквит", + "counterparty_inn": "3528052718", "data_type": "BU", "opening_debit": "2916666.69", "opening_credit": null, diff --git a/golden/expected_osv_parse/schastl/2025-Q1/Оборотно-сальдовая ведомость по счету 76 за 1 квартал 2025 г..json b/golden/expected_osv_parse/schastl/2025-Q1/Оборотно-сальдовая ведомость по счету 76 за 1 квартал 2025 г..json index f04867d..98fb3e1 100644 --- a/golden/expected_osv_parse/schastl/2025-Q1/Оборотно-сальдовая ведомость по счету 76 за 1 квартал 2025 г..json +++ b/golden/expected_osv_parse/schastl/2025-Q1/Оборотно-сальдовая ведомость по счету 76 за 1 квартал 2025 г..json @@ -96,8 +96,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты, ИНН", "account_code_raw": "76.04", - "counterparty_name": "Костыгова Наталья Валериевна, 352800390201", - "counterparty_inn": null, + "counterparty_name": "Костыгова Наталья Валериевна", + "counterparty_inn": "352800390201", "data_type": "BU", "opening_debit": null, "opening_credit": "100.00", @@ -153,8 +153,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты, ИНН", "account_code_raw": "76.05", - "counterparty_name": "Межрегиональное операционное УФК (ФТС России), 7730176610", - "counterparty_inn": null, + "counterparty_name": "Межрегиональное операционное УФК (ФТС России)", + "counterparty_inn": "7730176610", "data_type": "BU", "opening_debit": "123189.16", "opening_credit": null, @@ -210,8 +210,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты, ИНН", "account_code_raw": "76.41", - "counterparty_name": "УФК по Вологодской области (ОСП по г.Череповцу №1 УФССП по Вологодской области л/с05301А53990), 3525144985", - "counterparty_inn": null, + "counterparty_name": "УФК по Вологодской области (ОСП по г.Череповцу №1 УФССП по Вологодской области л/с05301А53990)", + "counterparty_inn": "3525144985", "data_type": "BU", "opening_debit": "13.40", "opening_credit": null, @@ -229,8 +229,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты, ИНН", "account_code_raw": "76.41", - "counterparty_name": "УФК по Вологодской области (ОСП по г.Череповцу №2 УФССП России по Вологодской области л/с05301А54000, 3525144985", - "counterparty_inn": null, + "counterparty_name": "УФК по Вологодской области (ОСП по г.Череповцу №2 УФССП России по Вологодской области л/с05301А54000", + "counterparty_inn": "3525144985", "data_type": "BU", "opening_debit": null, "opening_credit": "26801.29", @@ -267,8 +267,8 @@ "group_type": "COUNTERPARTY", "group_name": "Контрагенты, ИНН", "account_code_raw": "76.АВ", - "counterparty_name": "РУССКИЙ БИСКВИТ АО, 3528052718", - "counterparty_inn": null, + "counterparty_name": "РУССКИЙ БИСКВИТ АО", + "counterparty_inn": "3528052718", "data_type": "BU", "opening_debit": "1816666.68", "opening_credit": null, diff --git a/golden/expected_osv_parse/synthetic/s17_inn_in_name.json b/golden/expected_osv_parse/synthetic/s17_inn_in_name.json new file mode 100644 index 0000000..b27b4fa --- /dev/null +++ b/golden/expected_osv_parse/synthetic/s17_inn_in_name.json @@ -0,0 +1,227 @@ +{ + "schema_version": "1.1", + "service": { + "name": "tabular-parser" + }, + "status": "done", + "metrics": { + "rows": 8, + "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, + "data_type": "BU", + "currency": "RUB", + "header_variant": 1 + }, + "group_schema": [ + { + "type": "ACCOUNT", + "name": "Счет" + }, + { + "type": "COUNTERPARTY", + "name": "Контрагенты" + } + ], + "columns": { + "opening_debit": "E", + "opening_credit": "F", + "turnover_debit": "G", + "turnover_credit": "H", + "closing_debit": "I", + "closing_credit": "J" + }, + "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": "254500.50", + "turnover_debit": "303000.25", + "turnover_credit": "560000.00", + "closing_debit": "115000.00", + "closing_credit": "491500.25", + "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": "ООО Альфа, 7701234567", + "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": "ООО Бета (ИНН 7707654321)", + "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": "1500.00", + "turnover_debit": "30000.00", + "turnover_credit": "100000.00", + "closing_debit": "50000.00", + "closing_credit": "1500.00", + "extra": null + }, + { + "row_number": 17, + "level": 2, + "parent_row_number": 16, + "row_value": "ООО Гамма ИНН: 5001234567", + "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": "ИП Сидоров 500100732259", + "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": 19, + "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": "254500.50", + "turnover_debit": "303000.25", + "turnover_credit": "560000.00", + "closing_debit": "115000.00", + "closing_credit": "491500.25", + "extra": null + } + ], + "checks": { + "total_row_matches_root": true, + "balance_identity_violations": [], + "parent_sum_violations": [] + } + } + ] +} diff --git a/golden/expected_osv_parse/synthetic/s18_inn_row_above.json b/golden/expected_osv_parse/synthetic/s18_inn_row_above.json new file mode 100644 index 0000000..f3658d5 --- /dev/null +++ b/golden/expected_osv_parse/synthetic/s18_inn_row_above.json @@ -0,0 +1,210 @@ +{ + "schema_version": "1.1", + "service": { + "name": "tabular-parser" + }, + "status": "done", + "metrics": { + "rows": 7, + "warnings": [ + "sheet=Лист_1 hierarchy=outline", + "строка 13: ИНН 7701234567 над строкой 14 отнесён к ней как к контрагенту", + "строка 18: ИНН 5001234567 над строкой 19 отнесён к ней как к контрагенту" + ] + }, + "documents": [ + { + "document_type": "OSV", + "locator": "sheet:Лист_1", + "header": { + "organization_name": "ООО \"Тестовая организация\"", + "organization_inn": null, + "account_code_raw": "60", + "period_text": "2 квартал 2025 г.", + "period_year": 2025, + "period_quarter": "Q2", + "is_cumulative": false, + "data_type": "BU", + "currency": "RUB", + "header_variant": 1 + }, + "group_schema": [ + { + "type": "ACCOUNT", + "name": "Счет" + }, + { + "type": "COUNTERPARTY", + "name": "Контрагенты" + } + ], + "columns": { + "opening_debit": "E", + "opening_credit": "F", + "turnover_debit": "G", + "turnover_credit": "H", + "closing_debit": "I", + "closing_credit": "J" + }, + "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": "253000.50", + "turnover_debit": "303000.25", + "turnover_credit": "560000.00", + "closing_debit": "115000.00", + "closing_credit": "490000.25", + "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": 14, + "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": 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": "15000.00", + "opening_credit": null, + "turnover_debit": "90000.00", + "turnover_credit": "40000.00", + "closing_debit": "65000.00", + "closing_credit": null, + "extra": null + }, + { + "row_number": 16, + "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": 17, + "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": null, + "turnover_debit": "30000.00", + "turnover_credit": "100000.00", + "closing_debit": "50000.00", + "closing_credit": null, + "extra": null + }, + { + "row_number": 19, + "level": 2, + "parent_row_number": 17, + "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": 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": "253000.50", + "turnover_debit": "303000.25", + "turnover_credit": "560000.00", + "closing_debit": "115000.00", + "closing_credit": "490000.25", + "extra": null + } + ], + "checks": { + "total_row_matches_root": true, + "balance_identity_violations": [], + "parent_sum_violations": [] + } + } + ] +} diff --git a/golden/expected_osv_parse/synthetic/s19_inn_kpp_cell.json b/golden/expected_osv_parse/synthetic/s19_inn_kpp_cell.json new file mode 100644 index 0000000..13d92bb --- /dev/null +++ b/golden/expected_osv_parse/synthetic/s19_inn_kpp_cell.json @@ -0,0 +1,229 @@ +{ + "schema_version": "1.1", + "service": { + "name": "tabular-parser" + }, + "status": "done", + "metrics": { + "rows": 8, + "warnings": [ + "sheet=Лист_1 hierarchy=outline" + ] + }, + "documents": [ + { + "document_type": "OSV", + "locator": "sheet:Лист_1", + "header": { + "organization_name": "ООО \"Тестовая организация\"", + "organization_inn": null, + "account_code_raw": "60", + "period_text": "3 квартал 2025 г.", + "period_year": 2025, + "period_quarter": "Q3", + "is_cumulative": false, + "data_type": "BU", + "currency": "RUB", + "header_variant": 1 + }, + "group_schema": [ + { + "type": "ACCOUNT", + "name": "Счет" + }, + { + "type": "COUNTERPARTY", + "name": "Контрагенты", + "has_inn": true + } + ], + "columns": { + "opening_debit": "F", + "opening_credit": "G", + "turnover_debit": "H", + "turnover_credit": "I", + "closing_debit": "J", + "closing_credit": "K", + "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": "261000.60", + "turnover_debit": "311000.35", + "turnover_credit": "572000.35", + "closing_debit": "115000.00", + "closing_credit": "502000.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": "8000.10", + "turnover_debit": "38000.10", + "turnover_credit": "112000.35", + "closing_debit": "50000.00", + "closing_credit": "12000.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": 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": "261000.60", + "turnover_debit": "311000.35", + "turnover_credit": "572000.35", + "closing_debit": "115000.00", + "closing_credit": "502000.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 69ecdf3..b555ad9 100644 --- a/osv/synthetic/README.md +++ b/osv/synthetic/README.md @@ -41,8 +41,11 @@ cd tabular-parser/api | `s14_statement_forms.xlsx` | три листа форм, каждый опознаётся одним признаком: «Форма по ОКУД 0710001», «Отчет о финансовых результатах», «Форма по ОКУД 0710002»; лист «ОСВ 60» | один документ, три предупреждения «skipped: statement» | | `s15_group_title_synonyms.xlsx` | названия групп сумм: лист «ОСВ 60» — «Входящее сальдо»/«Конечное сальдо», лист «ОСВ 62» — «Начальное сальдо»/«Исходящее сальдо» | два документа, все шесть колонок сумм найдены, `done` | | `s16_header_synonyms.xlsx` | лист «ОСВ 60»: нет названия организации, период «2024», валюта «RUB (код 643)», «Счет» и «Контрагенты» отдельными строками под «Дебет/Кредит»; лист «ОСВ 62» (вариант 2): «Детализация по субсчетам: Номенклатура, Статьи затрат, Нематериальные активы, Валюта» | `organization_name=""` + предупреждение, `Q4`/2024, `currency=RUB`, схема листа 62 — `ACCOUNT` + четыре `OTHER` | +| `s17_inn_in_name.xlsx` | колонки ИНН нет, ИНН записан в текст названия контрагента: «ООО Альфа, 7701234567», «ООО Бета (ИНН 7707654321)», «ООО Гамма ИНН: 5001234567», «ИП Сидоров 500100732259» (OQ-100) | `counterparty_inn` — цифры, `counterparty_name` — без ИНН и разделителя, `row_value` не меняется; физлицо без ИНН — `null`; `done` | +| `s18_inn_row_above.xlsx` | у «ООО Альфа» и «ООО Гамма» ИНН стоит отдельной строкой над названием (без сумм, тот же уровень), колонки ИНН нет (OQ-130) | строка с ИНН в `rows` не попадает и не уходит в `OTHER`; ИНН — у контрагента, предупреждение «ИНН … над строкой … отнесён к ней»; `done` | +| `s19_inn_kpp_cell.xlsx` | колонка «ИНН/КПП»: в ячейках склеенное «7701234567/770101001» (OQ-100) | `counterparty_inn` — только ИНН; колонка распознана как колонка ИНН; `done` | -`s14`–`s16` добавлены тестом покрытия словарей `tabular-parser` (`rules/*.yaml`, решение R-22): каждая запись словаря +`s17`–`s19` — регрессия извлечения ИНН из текста (issue #9). `s14`–`s16` добавлены тестом покрытия словарей `tabular-parser` (`rules/*.yaml`, решение R-22): каждая запись словаря должна сработать на реальных или синтетических файлах; эти файлы закрывают записи, которых нет в реальных ОСВ. ## О файле xlsb diff --git a/osv/synthetic/s17_inn_in_name.xlsx b/osv/synthetic/s17_inn_in_name.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f2e43862c81d7bb59098ecd3c1d5957ce7ea47d9 GIT binary patch literal 5737 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 Z6qb$#HriDL0PxXoS#(PW{}K}5e*jbC{3HMX literal 0 HcmV?d00001 diff --git a/osv/synthetic/s18_inn_row_above.xlsx b/osv/synthetic/s18_inn_row_above.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..55cf1d09804091b94467f1d15f4d498864363821 GIT binary patch literal 5671 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 KKK|1h1pEtIuG`Z9 literal 0 HcmV?d00001 diff --git a/osv/synthetic/s19_inn_kpp_cell.xlsx b/osv/synthetic/s19_inn_kpp_cell.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c0575c7322a8820970ae7937efe6cc80ffc4e568 GIT binary patch literal 5770 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 F;9unS02=@R literal 0 HcmV?d00001