Две правки под предзаполнение формы оценки из справочника houses (наполнен из
ГИС ЖКХ + DOM.РФ: total_floors 98.3%, year_built 86.8%).
1. GET /api/v1/geocode/house-facts?lat=&lon=[&fias_id=] отдаёт
{found, total_floors, year_built, house_type, source}. Переиспользует
_lookup_house_facts из estimator (#3234) — тот же поиск, что и при расчёте:
по target_house_id если ФИАС разрезолвился, иначе ближайший дом в 60 м.
Дома нет в справочнике → 200 с found=false, а не 404: это не ошибка запроса,
а честный ответ об отсутствии данных.
Отдельной ручкой, а не полем в /suggest, намеренно: suggest дёргается на
каждое нажатие клавиши, и запрос к houses на каждый из 8 кандидатов на каждый
keystroke был бы неоправданной нагрузкой. house-facts зовётся ОДИН раз, после
выбора конкретного адреса.
Резолв дома по ФИАС обёрнут в try/except с rollback — предзаполнение формы не
должно ронять запрос в 500, а незакрытая ошибка отравила бы сессию для
последующего geo-фолбэка. Тот же best-effort, что у _lookup_house_facts.
2. TradeInEstimateInput отклоняет floor > total_floors, когда заданы ОБА поля.
Частичный ввод легален — пользователь ещё печатает форму. Раньше «12 этаж в
9-этажном доме» уходил в расчёт молча и портил подбор аналогов по этажу.
Тесты: 10 штук в test_3257_house_facts_endpoint.py. Валидатор проверен вручную —
отклоняет 12/9, пропускает 9/9 и частичный ввод.