feat(tradein): второй % «за 45 дней» + zhkh-знаменатель slot (146) #2071

Merged
lekss361 merged 1 commit from feat/tradein-sale-share-45d into main 2026-06-28 17:51:39 +00:00
Owner

Summary

По уточнению (Макс): к текущему % «активных ÷ квартиры» добавлен второй % — «за 45 дней» (объявления в окне, вкл. закрытые ÷ квартиры). Дом в выдаче, если любой из двух % ≥ порога.

  • Миграция 146: houses.zhkh_flat_count/zhkh_house_guid/zhkh_matched_at (slot 2-го источника знаменателя) + CREATE OR REPLACE VIEW v_building_sale_share:
    • listings_45d = count(DISTINCT dedup_hash) FILTER (vtorichka AND last_seen_at ≥ now()-45d).
    • sale_share_pct_45d под тем же guard'ом правдоподобности.
    • flat_count_effective = COALESCE(gar, **zhkh**, total_units, flat_count).
    • WHERE расширен: active_secondary>0 OR listings_45d>0 (churn-only дома видны).
  • API: фильтр (sale_share_pct ≥ :min OR sale_share_pct_45d ≥ :min); сорты share_45d_desc/count_45d_desc; в ответе listings_45d + sale_share_pct_45d; summary — coverage по любому % + histogram_45d.

Validation (prod ROLLBACK-tx)

  • View компилируется, оба % считаются, over_100=0.
  • total_rows 7662 (churn-only теперь видны); 232 дома качаются только по 45д (active=0) — net-new сигнал.
  • 24 pytest passed; ruff clean.

Test plan

  • ROLLBACK-валидация на проде + 24 теста.
  • Авто-apply миграции на деплое.
  • Frontend (переключатель «Сейчас/За 45д») — отдельно.

NB: zhkh_flat_count пока пуст (COALESCE падает на ГАР как раньше). Покрытие знаменателя поднимет отдельный PR-A (фикс канона матчера, 38%→~70-78%) — оказалось это баг нормализации адреса, а не дыра ГАР.

## Summary По уточнению (Макс): к текущему % «активных ÷ квартиры» добавлен **второй % — «за 45 дней»** (объявления в окне, вкл. закрытые ÷ квартиры). Дом в выдаче, если **любой** из двух % ≥ порога. - **Миграция 146:** `houses.zhkh_flat_count/zhkh_house_guid/zhkh_matched_at` (slot 2-го источника знаменателя) + `CREATE OR REPLACE VIEW v_building_sale_share`: - `listings_45d = count(DISTINCT dedup_hash) FILTER (vtorichka AND last_seen_at ≥ now()-45d)`. - `sale_share_pct_45d` под тем же guard'ом правдоподобности. - `flat_count_effective = COALESCE(gar, **zhkh**, total_units, flat_count)`. - WHERE расширен: `active_secondary>0 OR listings_45d>0` (churn-only дома видны). - **API:** фильтр `(sale_share_pct ≥ :min OR sale_share_pct_45d ≥ :min)`; сорты `share_45d_desc`/`count_45d_desc`; в ответе `listings_45d` + `sale_share_pct_45d`; summary — coverage по любому % + `histogram_45d`. ## Validation (prod ROLLBACK-tx) - View компилируется, оба % считаются, `over_100=0`. - `total_rows` 7662 (churn-only теперь видны); **232 дома качаются только по 45д** (active=0) — net-new сигнал. - 24 pytest passed; ruff clean. ## Test plan - [x] ROLLBACK-валидация на проде + 24 теста. - [ ] Авто-apply миграции на деплое. - [ ] Frontend (переключатель «Сейчас/За 45д») — отдельно. NB: `zhkh_flat_count` пока пуст (COALESCE падает на ГАР как раньше). Покрытие знаменателя поднимет отдельный PR-A (фикс канона матчера, 38%→~70-78%) — оказалось это баг нормализации адреса, а не дыра ГАР.
lekss361 added 1 commit 2026-06-28 17:27:27 +00:00
feat(tradein): второй % «за 45 дней» + zhkh-знаменатель slot — оба метрика в /buildings/sale-share
All checks were successful
CI / changes (pull_request) Successful in 7s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
a2f4b62974
lekss361 merged commit 2a38561175 into main 2026-06-28 17:51:39 +00:00
lekss361 deleted branch feat/tradein-sale-share-45d 2026-06-28 17:51:39 +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#2071
No description provided.