From 2a6a49811e03e4ec1f66a9f20424786666a8dde4 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Tue, 20 Oct 2026 13:06:35 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=A1=D0=92:=20=C2=AB=D0=9A=D0=BE=D0=BB-?= =?UTF-8?q?=D0=B2=D0=BE,=20<=D0=B5=D0=B4=D0=B8=D0=BD=D0=B8=D1=86=D0=B0>?= =?UTF-8?q?=C2=BB=20=D0=B8=20=C2=AB=D0=9A=D0=BE=D0=BB.=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=BF.=C2=BB=20=E2=80=94=20=D1=81=D1=82=D1=80=D0=BE=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=BA=D0=BE=D0=BB=D0=B8=D1=87=D0=B5=D1=81=D1=82=D0=B2?= =?UTF-8?q?=D0=B0=20(#66,=20AURORA-1709)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Словарь data_types.yaml: row допускает единицу измерения после запятой («Кол-во, га» в ОСВ 43.1), indicator_column — «Кол. доп.» в колонке «Показатели» (сч. 11). Код не меняется. Co-Authored-By: Claude Opus 5.5 --- api/rules/data_types.yaml | 7 ++++--- api/tests/unit/parser/test_classify.py | 7 +++++++ api/tests/unit/parser/test_indicators.py | 14 ++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/api/rules/data_types.yaml b/api/rules/data_types.yaml index 7b5d623..618b432 100644 --- a/api/rules/data_types.yaml +++ b/api/rules/data_types.yaml @@ -14,10 +14,10 @@ standalone_header: # Строки под контрагентом: «Вал.» и «Кол.» помечают строку как валютную / количественную. «Вал» без точки — не метка: # так называется материал (счёт 10); валютная строка — «Вал.» с точкой или код валюты из `currency_codes` (AURORA-1663). -# «Кол-во»: нормализация текста превращает дефис в пробел +# «Кол-во»: нормализация текста превращает дефис в пробел; после запятой — единица измерения («Кол-во, га», AURORA-1709) row: - ['^вал\.$', CURRENCY] - - ['^кол(ичество|\s?во)?\.?$', QUANTITY] + - ['^кол(ичество|\s?во)?\.?(\s*,\s*[^,]+)?$', QUANTITY] # строка суммы в валюте под «Валюта <код>» (AURORA-1661); сама «Валюта USD» — обычная строка в рублях - ['^в\s+валюте$', CURRENCY] @@ -26,7 +26,8 @@ row: indicator_column: - ['^бу$', BU] - ['^ну$', NU] - - ['^кол\.?$', QUANTITY] + # «Кол. доп.» — дополнительное количество (сч. 11, животные на выращивании; AURORA-1709) + - ['^кол(\.?|(\.\s*|\s+)доп\.?)$', QUANTITY] - ['^вал\.?$', CURRENCY] # Метки-показатели без значения data_type в контракте (постоянные и временные разницы): data_type = null. diff --git a/api/tests/unit/parser/test_classify.py b/api/tests/unit/parser/test_classify.py index 3a5dabd..467396b 100644 --- a/api/tests/unit/parser/test_classify.py +++ b/api/tests/unit/parser/test_classify.py @@ -420,6 +420,13 @@ def test_currency_and_quantity_rows(rules: Rules) -> None: ("Количество", "QUANTITY"), ("Кол-во", "QUANTITY"), # AURORA-1663, O-5 ("кол-во.", "QUANTITY"), + # единица измерения после запятой (AURORA-1709, ОСВ 43.1: строка под позицией) + ("Кол-во, га", "QUANTITY"), + ("Кол-во, кг", "QUANTITY"), + ("Количество, шт.", "QUANTITY"), + ("Колхоз, ОАО", None), + ("Колос", None), + ("Кол-во, га, кг", None), ("Вал.", "CURRENCY"), ("USD", "CURRENCY"), ("Вал", None), # AURORA-1663, O-6: «Вал» без точки — наименование материала (ОСВ 10.1), не метка валюты diff --git a/api/tests/unit/parser/test_indicators.py b/api/tests/unit/parser/test_indicators.py index e8b1412..66bc944 100644 --- a/api/tests/unit/parser/test_indicators.py +++ b/api/tests/unit/parser/test_indicators.py @@ -53,6 +53,20 @@ def test_untyped_label_has_no_data_type_and_no_warning(rules: Rules) -> None: assert (result.indicator, result.data_type, result.text, result.warning) == (True, None, "ПР", None) +@pytest.mark.parametrize("label", ["Кол.", "Кол", "Кол. доп.", "Кол.доп."]) +def test_quantity_labels_including_additional_quantity(rules: Rules, label: str) -> None: + """«Кол. доп.» — дополнительное количество (сч. 11, животные на выращивании; AURORA-1709).""" + result, _ = _read(label, rules) + assert (result.indicator, result.data_type, result.text, result.warning) == (True, "QUANTITY", label, None) + + +@pytest.mark.parametrize("label", ["Колдоп", "Кол. доп. ед.", "Колос"]) +def test_quantity_label_needs_exact_form(rules: Rules, label: str) -> None: + result, _ = _read(label, rules) + assert (result.indicator, result.data_type) == (True, None) + assert result.warning is not None + + def test_unknown_label_warns_with_row_number(rules: Rules) -> None: result, row = _read("Ед.", rules) assert (result.indicator, result.data_type) == (True, None)