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)