feat: отдавать сумму иска числом в /extract - #17
Open
Gyxer513 wants to merge 1 commit into
Open
Conversation
Ответ /extract нельзя было передать в /generate/claim как есть. Сумма отдавалась только строкой в том виде, в каком стояла в тексте решения («500 000», «1 234 567,89»), а /generate/claim и /generate/appeal принимают claim_amount как float > 0. То есть клиент обязан был сам убрать пробелы и заменить запятую на точку — при том что весь сценарий продукта состоит ровно из связки «разобрали решение → сгенерировали документ». В ExtractionResult добавлено поле claim_amount_value (float | None) рядом с прежним claim_amount. Строка остаётся нетронутой: она передаёт исходное написание, которое может понадобиться для сверки с текстом. Добавление обратно совместимое, существующие поля не изменились. Разбор вынесен в parse_amount(): пробелы (включая неразрывные) убираются целиком, запятая приводится к точке. Неразобравшаяся строка даёт None, а не ноль — ноль в исковом заявлении хуже пустого поля, и /generate/* его всё равно отклонят валидацией. Тесты: parse_amount параметризованно, включая неразрывный пробел и неположительные значения; сквозной тест в test_api.py прогоняет /extract → /generate/claim и проверяет, что документ отдаётся, — то есть покрывает сам стык, а не разбор суммы в отдельности. Известная неоднозначность, вынесена в описание PR: в «500.000» точка может означать и разделитель разрядов, и копейки. Текущий разбор считает её десятичной, потому что regex claim_amount допускает единственный разделитель и только в конце. В русских актах разряды разделяются пробелом, так что случай редкий, но при желании его можно закрыть отдельным правилом.
Gyxer513
force-pushed
the
feat/numeric-claim-amount
branch
from
August 17, 2026 15:51
b6f2291 to
fc3b6d8
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
feat: отдавать сумму иска числом в /extract
Проблема
Ответ
/extractнельзя передать в/generate/claimкак есть. Сумма отдаётсятолько строкой в том виде, в каком она стояла в тексте решения, а
/generate/claimи/generate/appealпринимаютclaim_amountкакfloat > 0:То есть клиент обязан сам убрать пробелы и заменить запятую на точку — при
том что весь сценарий продукта состоит ровно из связки «разобрали решение →
сгенерировали документ». Две половины сервиса не стыкуются в одном месте, и
именно там, где стык и предполагался.
Что сделано
В
ExtractionResultдобавлено полеclaim_amount_value(float | None)рядом с прежним
claim_amount. Строка остаётся нетронутой: она передаётисходное написание, которое может понадобиться для сверки с текстом решения.
Добавление обратно совместимое — существующие поля не изменились, старые
клиенты ничего не заметят.
Разбор вынесен в
parse_amount(): пробелы, включая неразрывные, убираютсяцеликом, запятая приводится к точке. Не разобравшаяся строка даёт
None, а неноль — ноль в исковом заявлении хуже пустого поля, и
/generate/*его всёравно отклонят валидацией
gt=0.Что стоит обсудить на ревью
Неоднозначность «500.000». Точка здесь может означать и разделитель
разрядов, и копейки. Текущий разбор считает её десятичной и вернёт
500.0.Формально это следует из паттерна
claim_amount, который допускаетединственный разделитель и только в конце. В русских судебных актах разряды
разделяются пробелом, а копейки — запятой, так что случай редкий, но при
желании закрывается отдельным правилом: точка с ровно тремя цифрами после неё
— разряды, с двумя — копейки. Не стал делать, потому что эвристика тоже
ошибается, а тихо ошибиться в сумме иска дороже, чем отдать строку как есть.
Почему отдельное поле, а не смена типа
claim_amount. Смена типа была быbreaking-изменением ради косметики, а исходное написание при этом потерялось
бы. Два поля рядом честнее: одно про то, что написано в документе, другое про
то, что можно посчитать.
Проверка
parse_amount— параметризованные тесты, включая неразрывный пробел,копейки через запятую и через точку, а также ноль и пустую строку.
test_api.pyпрогоняет/extract → /generate/claimнатексте решения из фикстуры и проверяет, что документ отдаётся. Он покрывает
сам стык, а не разбор суммы в отдельности, — то есть регрессия вернётся с
падением именно этого теста.
113 passed, покрытие 96.60% при пороге 90%.ruffиmypyпо затронутым файлам чистые. По репозиторию в целом они даютшесть и одно замечание соответственно, но все унаследованные и ни одно не
связано с этой веткой — их закрывает предыдущий PR про CI.