From aa46e7ad4ae0519ec714fd15cc9e05a19268fa1a Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Sun, 18 Oct 2026 14:14:12 +0400 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=BA=D0=B2=D0=B0=D0=BD=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=81=D1=83=D0=BC=D0=BC=D1=8B?= =?UTF-8?q?=20=C2=AB=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=B9=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=B3=D0=B0=D0=B4=D0=BA=D0=B8=C2=BB=20=D0=B4=D0=BE=200,01=20(T?= =?UTF-8?q?20.1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W --- arm_statements/amounts.py | 2 +- arm_statements/tests/golden/aep3_income.expected.json | 2 +- arm_statements/tests/test_amounts.py | 9 +++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/arm_statements/amounts.py b/arm_statements/amounts.py index 208eab6..c89c711 100644 --- a/arm_statements/amounts.py +++ b/arm_statements/amounts.py @@ -73,7 +73,7 @@ def _guess(digits: str, text: str, sign_form: SignForm, *, negative: bool) -> Am """«Лучшая догадка»: цифры подряд, не длиннее 16, иначе значение не число.""" if not digits or len(digits) > MAX_INTEGER_DIGITS: return AmountParse(None, text, False, sign_form) - amount = Decimal(digits) + amount = _quantize(Decimal(digits)) return AmountParse(-amount if negative else amount, None, False, sign_form) diff --git a/arm_statements/tests/golden/aep3_income.expected.json b/arm_statements/tests/golden/aep3_income.expected.json index 4c8973e..781405e 100644 --- a/arm_statements/tests/golden/aep3_income.expected.json +++ b/arm_statements/tests/golden/aep3_income.expected.json @@ -241,7 +241,7 @@ "values": [ { "column_index": 2, - "amount": "428311", + "amount": "428311.00", "string_value": null, "text": "42831 1", "confidence": 90.0, diff --git a/arm_statements/tests/test_amounts.py b/arm_statements/tests/test_amounts.py index 859880f..c27a407 100644 --- a/arm_statements/tests/test_amounts.py +++ b/arm_statements/tests/test_amounts.py @@ -117,3 +117,12 @@ def test_sign_inside_parentheses_is_invalid(rules: Rules) -> None: def test_leading_comma_is_edge_trash(rules: Rules) -> None: parsed = parse_amount(",5", OCR, rules) assert (parsed.amount, parsed.is_recognized) == (D("5"), False) + + +def test_guess_amount_is_quantized_to_cents(rules: Rules) -> None: + """T20.1: «лучшая догадка» квантуется как прочие пути; в контракте — две цифры после точки.""" + parsed = parse_amount("42831 1", Source.OCR, rules) + assert parsed.amount == D("428311.00") and parsed.amount.as_tuple().exponent == -2 # noqa: PLR2004 — знаков после запятой + assert format(parsed.amount, "f") == "428311.00" + negative = parse_amount("(42831 1)", Source.OCR, rules) + assert negative.amount is not None and format(negative.amount, "f") == "-428311.00"