fix: квантование суммы «лучшей догадки» до 0,01 (T20.1)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
This commit is contained in:
Andrey Epifancev 2026-10-18 14:14:12 +04:00
parent 2da7bff71a
commit aa46e7ad4a
3 changed files with 11 additions and 2 deletions

View File

@ -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)

View File

@ -241,7 +241,7 @@
"values": [
{
"column_index": 2,
"amount": "428311",
"amount": "428311.00",
"string_value": null,
"text": "42831 1",
"confidence": 90.0,

View File

@ -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"