feat(tradein/estimator): регион-скоуп ДКП-коридора — фильтр по deals.region_code (#3051 PR-A) #3423

Merged
lekss361 merged 1 commit from feat/3051-estimator-dkp-region-filter into main 2026-09-08 20:23:22 +00:00
Owner

Предпосылка для включения импорта Росреестра по Москве (77): сегодня ДКП-коридор _fetch_dkp_corridor не фильтрует регион вовсе — _resolve_target_city распознаёт только города Свердловской области, для Москвы city=None, и единственным скоупом остаётся street ILIKE. Как только в deals появятся московские сделки, одноимённая улица чужого региона утечёт в коридор ЕКБ (и наоборот).

Что

  • estimator.py::_fetch_dkp_corridor — параметр region_code: int = regions.DEFAULT_REGION_CODE (66); в оба ДКП-запроса (street-scope и city-wide widen) добавлено AND d.region_code = CAST(:region_code AS int), bind в оба execute.
  • Вызовы: POST /estimate (estimate_quality) и GET-rehydrate (trade_in.py::load_estimate) резолвят регион через regions.region_for_point(lat, lon); не резолвится / нет координат → DEFAULT_REGION_CODE, никогда None (= NULL обнулил бы фильтр).
  • deal_city_price_bands-джойн и _resolve_target_city не тронуты (bands по региону — следующий sub-PR B).

Регрессия ЕКБ

Все текущие сделки region_code=66, дефолт совпадает байт-в-байт → поведение прода не меняется. ruff чисто, полный pytest 5622 passed / 37 skipped (на базе до rebase), таргет-тесты коридора зелёные после rebase. Тесты трека пишутся после живого прогона по 77 (правило от 08.09).

Ревью: code-reviewer APPROVE.

Refs #3051, #2989. Связано: #3422 (импорт по региону, дельта поверх #3421).

🤖 Generated with Claude Code

Предпосылка для включения импорта Росреестра по Москве (77): сегодня ДКП-коридор `_fetch_dkp_corridor` не фильтрует регион вовсе — `_resolve_target_city` распознаёт только города Свердловской области, для Москвы `city=None`, и единственным скоупом остаётся `street ILIKE`. Как только в `deals` появятся московские сделки, одноимённая улица чужого региона утечёт в коридор ЕКБ (и наоборот). ## Что - `estimator.py::_fetch_dkp_corridor` — параметр `region_code: int = regions.DEFAULT_REGION_CODE` (66); в оба ДКП-запроса (street-scope и city-wide widen) добавлено `AND d.region_code = CAST(:region_code AS int)`, bind в оба `execute`. - Вызовы: POST `/estimate` (`estimate_quality`) и GET-rehydrate (`trade_in.py::load_estimate`) резолвят регион через `regions.region_for_point(lat, lon)`; не резолвится / нет координат → `DEFAULT_REGION_CODE`, **никогда None** (`= NULL` обнулил бы фильтр). - `deal_city_price_bands`-джойн и `_resolve_target_city` не тронуты (bands по региону — следующий sub-PR B). ## Регрессия ЕКБ Все текущие сделки `region_code=66`, дефолт совпадает байт-в-байт → поведение прода не меняется. `ruff` чисто, полный `pytest` 5622 passed / 37 skipped (на базе до rebase), таргет-тесты коридора зелёные после rebase. Тесты трека пишутся после живого прогона по 77 (правило от 08.09). Ревью: code-reviewer ✅ APPROVE. Refs #3051, #2989. Связано: #3422 (импорт по региону, дельта поверх #3421). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
lekss361 added 1 commit 2026-09-08 20:14:26 +00:00
feat(tradein/estimator): регион-скоуп ДКП-коридора — фильтр по d.region_code (#3051 PR-A)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 9s
CI Trade-In / frontend-checks (pull_request) Has been skipped
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
CI Trade-In / backend-tests (pull_request) Successful in 5m9s
fbe85fcc75
target_city резолвится ТОЛЬКО для городов Свердловской области
(_resolve_target_city матчит SVERDLOVSK_OBLAST_CITIES) — для Москвы/любого
нового региона city=None, и street ILIKE оставался единственным скоупом
сделки: одноимённая улица чужого региона утекала в коридор. Добавлен
d.region_code = CAST(:region_code AS int) в оба ДКП-запроса
(_fetch_dkp_corridor) + region_code передаётся из обоих вызывающих (POST
/estimate через geo.lat/lon, GET-rehydrate через row.lat/lon) с гарантией
«не резолвится → DEFAULT_REGION_CODE (66)», не NULL (NULL в SQL-параметре
обнулил бы фильтр целиком). Дефолт региона и джойн deal_city_price_bands не
трогаются — следующие PR (B, F).

Regression: 5622 passed, 37 skipped (полный прогон tests/).
lekss361 merged commit c6321c767d into main 2026-09-08 20:23:22 +00:00
lekss361 deleted branch feat/3051-estimator-dkp-region-filter 2026-09-08 20:23:22 +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#3423
No description provided.