gendesign/backend/app
Light1YT 1a07af028a
All checks were successful
CI / changes (pull_request) Successful in 6s
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 1m51s
CI / backend-tests (pull_request) Successful in 11m6s
fix(site-finder): harden flats_sold sold-count SQL — fan-out, premise_kind, predicate (#1926)
Code-review #1927 found 2 MAJOR bugs in the initial fix:

1. JOIN fan-out: objective_complex_mapping UNIQUE is (objective_complex_name,
   objective_group), NOT domrf_obj_id (68_schema:321) — one obj_id can map to
   multiple rows (same name, different group), so COUNT(*) over cm JOIN ol
   double-counts lots (GROUP BY collapses output rows but not dups inside the
   aggregate). Fixed with COUNT(DISTINCT ol.objective_lot_id).

2. Missing premise_kind: MarketMetrics._STOCK_SQL filters premise_kind='квартира';
   the new SQL did not, so sold parking/storage/non-residential lots counted as
   sold flats (over-count). Added AND ol.premise_kind = :premise_kind.

3. Aligned the sold predicate to MarketMetrics exactly:
   is_sold IS TRUE OR contract_date IS NOT NULL OR LOWER(status)='продан'
   (Objective populates these inconsistently — OR mirrors _STOCK_SQL:285-289),
   not contract_date alone.

Tests: added static SQL-structure guards (fan-out-safe COUNT(DISTINCT),
premise_kind filter, full predicate) since mock-based API tests bypass real SQL
and cannot detect fan-out; the live-DB fan-out/EXPLAIN check lives in
test_phantom_columns (skipped without TEST_DATABASE_URL). Updated phantom EXPLAIN
to the new SQL.

Full suite: 3530 passed, 51 skipped, 0 failed. Ruff clean.
2026-06-26 23:21:55 +05:00
..
api fix(freshness): repoint nspd source to live nspd_quarter_dumps (data-table mode) 2026-06-26 06:51:00 +00:00
core fix(site-finder): optimize zone-regulation resolve in /analyze (#1850) 2026-06-25 09:12:41 +00:00
models merge: resolve conflicts with main (#1660) into week-review-finish 2026-06-17 20:21:06 +03:00
observability feat(backend): sentry-sdk init для FastAPI + Celery (#204 backend) (#207) 2026-05-16 15:09:16 +00:00
schemas feat(financial): ground-floor нежилое (office/commercial) tranche 2026-06-25 11:40:01 +00:00
scrapers fix(week-review): backend-аудит v2 — 82 фиксов (#1660) 2026-06-17 17:13:38 +00:00
services fix(site-finder): harden flats_sold sold-count SQL — fan-out, premise_kind, predicate (#1926) 2026-06-26 23:21:55 +05:00
templates fix(site-finder): 5 дефектов из боевого фидбека analyze (#1736 #1737 #1738 #1739 #1740) 2026-06-18 11:47:21 +05:00
workers feat(workers): data-freshness monitor (Celery beat → GlitchTip) 2026-06-25 11:29:34 +00:00
__init__.py init 2026-04-25 13:45:19 +03:00
main.py fix(week-review): backend-аудит v2 — 82 фиксов (#1660) 2026-06-17 17:13:38 +00:00