Offer-страница PDF-отчёта считала выкупную цену как медиана-10% (плоский
хайркат), игнорируя estimate.expected_sold_price_rub — ту же реальную
цифру по ДКП Росреестра, которую cover-страница уже показывает как
«Ожидаемая цена продажи». Из-за этого страницы 1 и 4 одного отчёта могли
показывать разные цифры (расхождение 10%+ на реальных данных). Теперь
offer использует expected_sold_price_rub с fallback на старую эвристику
для старых оценок без sold-данных.
Заодно: актуализированы захардкоженные допущения о расходах при
самопродаже (риэлтор 2-5%, аренда 84-135к/3мес, юр.сопровождение
15-50к, реклама 6-45к, дисконт запрос-сделка 10-18% для ЕКБ 2026) по
данным Циан/УПН/Домклик; и собственная визуальная система вместо копии
референса конкурента (Брусника) — палитра сконвертирована точной
OKLab->sRGB матрицей из живых OKLCH-токенов веб-продукта (trade-in.css),
типографика DejaVu Serif/Sans/Mono (гарантированно установлены в образе,
чинит попутно silent font fallback на Helvetica/Arial, которых там нет).
«Этот отчёт онлайн» и QR-код в PDF вели на
gendsgn.ru/trade-in/trade-in?id=… — двойной /trade-in/: PUBLIC_URL
на проде уже = https://gendsgn.ru/trade-in, а код добавлял /trade-in
ещё раз → ссылка/QR давали 404.
Плюс «Балкон / лоджия» печатался как «1»/«0» (сырое булево) вместо
«Есть»/«Нет».