gendesign/backend/tests/services
Light1YT b1332d6b55
All checks were successful
CI / frontend-tests (pull_request) Successful in 1m3s
CI / changes (pull_request) Successful in 7s
CI / openapi-codegen-check (pull_request) Successful in 2m0s
CI / backend-tests (pull_request) Successful in 10m6s
feat(generative): calibrate finmodel sale price from Objective market data (epic #1881 PR-2)
Заменяет хардкод-цену продажи жилья (класс-норма) на реальную рыночную
медиану из Objective по локации участка. compute_financial остаётся ЧИСТЫМ
(без БД) — DB-lookup в API-слое, цена прокидывается параметром.

- compute_financial: +optional market_price_per_sqm/price_source; цена =
  рынок если есть, иначе класс-норма. Паркинг/СМР НЕ калибруем (только жильё).
- concepts.py _lookup_market_price(db, lon, lat): центроид → ближайший
  ekb_district (ST_DWithin 5км) → медиана objective_lots.price_per_m2_rub
  (n>=10, фильтр 30k-600k) → fallback ekb_districts.median_price_per_m2 →
  None. try/except → graceful (None, class_norm) при любой ошибке (вне ЕКБ/
  нет гео/SQL) без краха генерации. psycopg3 CAST.
- FinancialModel +price_per_sqm_used/price_is_calibrated/price_source (additive).
- Threading market_price через generate→placement→compute_financial (optional
  kwargs, backward-compat).
- UI/CSV: честный caption источника (рынок Objective / справочник района /
  норматив класса). Старый лживый footnote «не калиброванная модель» → условный.

Prod-verified: калибруется 4 главных ЕКБ-района по name-match (Академический
204k лотов, Ленинский 38k, Кировский, Орджоникидзевский); остальные 5 admin-
районов честно → district_reference. Гео-радиус matching (полное покрытие) —
follow-up.

api-types.ts регенерён авторитетно. mypy strict clean (generative.*), +14
тестов (калибровка/lookup 4 ветки/SQL-ошибки graceful/backward-compat).

Refs #1881
2026-06-23 21:10:25 +05:00
..
analysis_runs feat(parcels): typed AnalyzeResponse + run-history read endpoints (#961) 2026-06-06 18:13:34 +00:00
cadastre fix(#265 review): CRS 3857→4326 + stable zone_id hash + rename 102 + tx comment 2026-05-17 10:45:52 +03:00
chat feat(chat): LLM tool-loop + §19 redaction wiring for #957 (Step 2+3) 2026-06-08 17:45:01 +05:00
exporters fix(exporters): annotate scenario deficit horizon in excel too (#1590 follow-up) 2026-06-17 21:23:57 +03:00
forecasting fix(forecasting): honest scenarios collapse when β rate-sensitivity gate fails (audit #1871 P1) 2026-06-22 19:06:22 +05:00
generative feat(generative): calibrate finmodel sale price from Objective market data (epic #1881 PR-2) 2026-06-23 21:10:25 +05:00
llm fix(llm): word-boundary INN match, tighten edge cases (#1640 follow-up) 2026-06-17 21:24:59 +03:00
scrapers fix(scrapers): narrow domrf Level-1 status badge-class regex (#1609 follow-up) 2026-06-17 21:21:56 +03:00
site_finder feat(site-finder): РИАСУРТ Свердл 14-layer harvest client+schema+task for ЕКБ agglomeration (#108) 2026-06-17 21:49:04 +03:00
__init__.py feat(cadastre): bulk_harvest worker + grid-walker + admin API (#168 PR3/5) (#171) 2026-05-15 13:31:32 +03:00
test_cadastre_bulk.py fix(cadastre): NSPD 500-retry + per-layer skip (#252) + disable dead pzz-beat (#259) + geom backfill (#200) 2026-06-13 20:45:05 +05:00
test_ekburg_permits.py feat(sf): geocode geom для ekburg_construction_permits из МСК-66 (#1124) 2026-06-07 11:16:45 +00:00
test_forecast_request_cache.py perf(forecast): per-request memoization cache for §22 cold build (#1129) 2026-06-08 05:26:27 +00:00
test_functional_zone_lookup.py feat(sf): ingest функц.зон генплана ЕКБ-2045 из ГИСОГД-СО WFS → ekb_genplan_functional_zone (#1137) 2026-06-07 12:03:39 +00:00
test_granddoc_lookup.py feat(sf): граддокументация (статус+ПАГЕ-реквизиты) из planning_projects в analyze (#1154) 2026-06-07 15:15:03 +00:00
test_ird_analyze.py fix(sf): ekb_ppt_tep post-фильтры + врезка в analyze (#1136) 2026-06-13 09:32:52 +00:00
test_ird_overlay_lookup.py fix(site-finder): расширить except в parcel_ird_overlaps до DataError (#1095) 2026-06-13 15:02:50 +05:00
test_job_settings.py fix(admin-jobs): UPSERT в PUT /admin/jobs/settings — не терять изменения (#1223) 2026-06-13 08:36:23 +00:00
test_krt_lookup.py feat(sf): КРТ-реквизиты (ekb_krt_sites) в ИРД-блок analyze (#1131) 2026-06-07 11:50:29 +00:00
test_newbuilding_crossload.py fix(sf): psql stdin-bootstrap пароля gendesign_reader + COALESCE-protect внешних id (review fixup, #976) 2026-06-12 11:26:40 +03:00
test_nspd_denorm.py fix(week-review): backend-аудит v2 — 82 фиксов (#1660) 2026-06-17 17:13:38 +00:00
test_objective_backfill.py test(etl): fix stale assert in objective_backfill dry_run test (#1709) 2026-06-17 22:38:44 +03:00
test_own_developer_ids_config.py feat(site-finder): own-portfolio data source for §25.3 cannibalization (#1169 PR1) 2026-06-08 16:21:53 +05:00
test_planning_lookup.py feat(sf): wire ППТ/ПМТ planning_projects в analyze ird-блок (#1105) 2026-06-06 20:50:34 +00:00
test_ppt_tep_lookup.py fix(sf): ekb_ppt_tep post-фильтры + врезка в analyze (#1136) 2026-06-13 09:32:52 +00:00
test_quarter_dump_lookup.py feat(site_finder): routing POI decay (#41) + OSM utility distances (#44) + ЗОУИТ geom (#255bk) 2026-06-13 22:31:56 +05:00
test_recommend_mix_velocity.py fix(analytics): свежая ипотечная ставка + recommend last_updated + drop dead route (#236 #237 #251) 2026-06-13 15:22:22 +00:00
test_reservation_lookup.py feat(sf): ПАГЕ-парсер изъятия/резервирования → land_reservation (#1118) 2026-06-07 10:15:03 +00:00
test_weather_cache.py fix(weather): wind_d returns None when no valid samples, not fabricated 0.0° (#weather-cache) 2026-06-17 21:22:31 +03:00
test_zone_regulation_extract.py feat(sf): zone_regulation_cache — ПЗЗ-регламент по zone_index + числовой экстракт (#1099) 2026-06-06 19:31:28 +00:00