fix(tradein/pdf): честность отчёта — убрать фейк-сроки, хардкод EKБ, противоречивый дисконт (R2) #2494

Merged
bot-backend merged 2 commits from fix/tradein-pdf-honesty into main 2026-07-12 19:19:09 +00:00
Collaborator

R2 PDF-честность (3 фикса, exporters/trade_in_pdf.py)

[HIGH] Выдуманный «срок продажи 4–118 дней»_days_on_market_range возвращал хардкод (4,118) при отсутствии реальных days_on_market (~48% оценок), обложка+listings печатали его как измеренный срок. Fix: возвращает None → оба call-site show_days=False (как уже делает страница сделок). График цен рисуется, исчезает только выдуманная аннотация.

[MED] № отчёта хардкодил «EKБ» для КАЖДОЙ оценки — Серов/Н.Тагил брендились как екатеринбургская оценка. Fix: _report_city_prefix() выводит буквенный префикс из адреса (ЕКБ/НТ/КУ/…, ё→е norm); неизвестный/вне-региона город → «МЕРА», не «EKБ». Числовая часть сохранена.

[MED] Статичное «сделки на 10–18% ниже» противоречило вычисленному «−N%» в том же PDF. Fix: обложка + deals-баннер используют реальный _discount_pct(estimate) (тот же, что chip «−N%»); нейтральная формулировка когда дисконта нет; убран ложный хвост «(Екатеринбург, 2026)».

Тесты

test_trade_in_pdf_dual_price.py +11 кейсов (suppression (4,118); city-aware/МЕРА/canonical-fallback/никогда-не-«EK»; computed-discount на обложке и баннере). 23 passed, ruff clean, pre-commit зелёный.

## R2 PDF-честность (3 фикса, exporters/trade_in_pdf.py) **[HIGH] Выдуманный «срок продажи 4–118 дней»** — `_days_on_market_range` возвращал хардкод `(4,118)` при отсутствии реальных `days_on_market` (~48% оценок), обложка+listings печатали его как измеренный срок. Fix: возвращает `None` → оба call-site `show_days=False` (как уже делает страница сделок). График цен рисуется, исчезает только выдуманная аннотация. **[MED] № отчёта хардкодил «EKБ»** для КАЖДОЙ оценки — Серов/Н.Тагил брендились как екатеринбургская оценка. Fix: `_report_city_prefix()` выводит буквенный префикс из адреса (ЕКБ/НТ/КУ/…, ё→е norm); неизвестный/вне-региона город → «МЕРА», не «EKБ». Числовая часть сохранена. **[MED] Статичное «сделки на 10–18% ниже» противоречило вычисленному «−N%»** в том же PDF. Fix: обложка + deals-баннер используют реальный `_discount_pct(estimate)` (тот же, что chip «−N%»); нейтральная формулировка когда дисконта нет; убран ложный хвост «(Екатеринбург, 2026)». ## Тесты `test_trade_in_pdf_dual_price.py` +11 кейсов (suppression (4,118); city-aware/МЕРА/canonical-fallback/никогда-не-«EK»; computed-discount на обложке и баннере). **23 passed**, ruff clean, pre-commit зелёный.
bot-backend added 1 commit 2026-07-12 19:05:51 +00:00
fix(trade-in-pdf): убрать три ложных утверждения из PDF-отчёта
Some checks failed
CI / changes (pull_request) Successful in 12s
CI Trade-In / changes (pull_request) Successful in 12s
CI / frontend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Failing after 1m0s
27d1b09c72
Отчёт печатал измерения, которых не делал:

1. Выдуманный «срок продажи 4–118 дней». _days_on_market_range при
   отсутствии реальных days_on_market (~48% оценок) возвращал хардкод
   (4, 118), а обложка и страница объявлений рисовали его как
   измеренный срок экспозиции. Теперь функция возвращает None, и оба
   call-site'а не рисуют срок (show_days=False) — как уже делает
   страница сделок.

2. № отчёта хардкодил «EKБ» для любой оценки — объект в Серове /
   Нижнем Тагиле получал екатеринбургский код на обложке, в шапках и
   футере. Префикс теперь выводится из target_address (ЕКБ / НТ / СЕР /
   …); неизвестный город → нейтральный «МЕРА», а не ложный «EKБ».

3. Статичный «сделки на 10–18% ниже» противоречил рассчитанному в том
   же PDF «−N%». Совет на обложке и баннер на странице сделок теперь
   ссылаются на реальный _discount_pct (тот же, что chip «−N%»), с
   нейтральной формулировкой когда дисконт неизвестен. Удалён ложный
   хвост «(Екатеринбург, 2026)».

Тесты: +11 кейсов (suppression (4,118), city-aware № отчёта,
computed-discount вместо «10–18%»). Все 23 проходят, ruff чисто.
bot-backend added 1 commit 2026-07-12 19:12:48 +00:00
test(tradein/pdf): обновить insufficient-page тест под city-aware № отчёта
All checks were successful
CI / frontend-tests (pull_request) Has been skipped
CI Trade-In / changes (pull_request) Successful in 12s
CI / changes (pull_request) Successful in 12s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 56s
20bdc7dec8
test_insufficient_data_page_contains_address_and_report_num ассертил старый
захардкоженный «EKБ-» (mixed-script баг). Оценка без target_address → город не
распознан → нейтральный префикс «МЕРА» (#pdf-honesty). Обновлён ассерт: «МЕРА-»
присутствует, «EKБ-» отсутствует.
bot-backend merged commit a3dfa2a99f into main 2026-07-12 19:19:09 +00:00
bot-backend deleted branch fix/tradein-pdf-honesty 2026-07-12 19:19:09 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2494
No description provided.