Mirror the S5a web dual-display in the WeasyPrint PDF cover: equal-prominence
«Ожидаемая цена продажи» figure (value + range + ₽/м²) next to «Ориентир
запроса», with a −N% discount chip and the ДКП-Росреестра explainer. Graceful
single-asking fallback when expected_sold is None/0; each sold sub-field guarded.
Pure rendering change — no DB/schema/API impact. WeasyPrint import made lazy so
the HTML builders are testable without the native GTK stack.
- trade_in_pdf.py: _dual_price_block / _price_figure_cell / _discount_pct + cover wiring
- tests/services/test_trade_in_pdf_dual_price.py: 10 unit tests
«Этот отчёт онлайн» и QR-код в PDF вели на
gendsgn.ru/trade-in/trade-in?id=… — двойной /trade-in/: PUBLIC_URL
на проде уже = https://gendsgn.ru/trade-in, а код добавлял /trade-in
ещё раз → ссылка/QR давали 404.
Плюс «Балкон / лоджия» печатался как «1»/«0» (сырое булево) вместо
«Есть»/«Нет».