fix(report): EGRN площадь/обновлено + forecast-confidence dedup + ЗОУИТ типизация (#1954 #1958 #1957) #1973

Merged
bot-backend merged 2 commits from fix/report-quickwins-1953 into main 2026-06-27 09:34:45 +00:00
Collaborator

Батч 1 аудита отчёта Site Finder (эпик #1953). 4 бэкенд-фикса без миграций, каждый проверен на проде (read-only), code-reviewer APPROVE.

Фиксы

#1954 Объект-карточка

  • Площадь «—»: parcels.py EGRN-блок → COALESCE(land_record_area, specified_area, declared_area) AS area_m2. Прод-verify 66:41:0205010:287: area_m2=106378 (было NULL; все 3 колонки NUMERIC, одни единицы м², загружаются из одного NSPD raw_opts). Чинит ~12 800 участков.
  • «Обновлено» сломано для ВСЕХ: last_egrn_update_date с мёртвой cost_registration_date (0/42233) → updated_at (42233/42233, NOT NULL + trigger). Прод-verify: 2026-06-19 11:50. Ключ ответа не менялся.

#1958 Уверенность

  • Фактор «Прогноз спрос/предложение» дублировался ×4 (по горизонту) → свёрнут в ОДИН weakest-link (MIN rank) в report_assembler._component_confidences. 4 новых теста пинят ×4→×1.

#1957 ЗОУИТ (бэкенд)

  • _get_cad_zouit_overlaps: дедуп DISTINCT ON (reg_numb_border) ORDER BY reg_numb_border, id (4→2 строки для участка); group_key cad_zouit→protected; добавлен top-level reg_numb_border. source остался cad_zouit (gate_verdict ветвится по нему, НЕ по group_key — проверено).
  • dump-путь _get_zouit_overlaps: добавлен _ZOUIT_SUBCATEGORY_TYPE (26→«Санитарно-защитная зона» + ~20 кодов, кросс-валидированы dump↔cad_zouit на проде); type_zone из карты; reg из props.options.reg_numb_border; subcategory нормализован в int (надёжнее для gate sub-17). Было 3 пустые строки → теперь типизированные СЗЗ.

Безопасность / контракт

  • Аддитивно: type_zone/reg_numb_border/subcategory(int) — фронт-типы совместимы (subcategory: string|number|null, type_zone?). group_key сузил набор значений (убран cad_zouit), но ни один консьюмер не кейсится по этому литералу; фронт NspdZouitOverlapsBlock уже маппит protected + graceful fallback. gate_verdict ветвится по source (не тронут) — блокер sub-17 цел.
  • ruff чисто, :name::type-cast grep пусто, targeted suite 441 passed / 0 failed (+10 new/updated тестов).

Фронт-follow-up (часть #1957/#1962): вывести type_zone/reg_numb_border + СЗЗ-баннер «жильё ограничено».

Батч 1 аудита отчёта Site Finder (эпик #1953). 4 бэкенд-фикса без миграций, каждый проверен на проде (read-only), code-reviewer ✅ APPROVE. ## Фиксы **#1954 Объект-карточка** - Площадь «—»: `parcels.py` EGRN-блок → `COALESCE(land_record_area, specified_area, declared_area) AS area_m2`. Прод-verify 66:41:0205010:287: `area_m2=106378` (было NULL; все 3 колонки NUMERIC, одни единицы м², загружаются из одного NSPD raw_opts). Чинит ~12 800 участков. - «Обновлено» сломано для ВСЕХ: `last_egrn_update_date` с мёртвой `cost_registration_date` (0/42233) → `updated_at` (42233/42233, NOT NULL + trigger). Прод-verify: `2026-06-19 11:50`. Ключ ответа не менялся. **#1958 Уверенность** - Фактор «Прогноз спрос/предложение» дублировался ×4 (по горизонту) → свёрнут в ОДИН weakest-link (MIN rank) в `report_assembler._component_confidences`. 4 новых теста пинят ×4→×1. **#1957 ЗОУИТ (бэкенд)** - `_get_cad_zouit_overlaps`: дедуп `DISTINCT ON (reg_numb_border) ORDER BY reg_numb_border, id` (4→2 строки для участка); `group_key` cad_zouit→protected; добавлен top-level `reg_numb_border`. `source` остался `cad_zouit` (gate_verdict ветвится по нему, НЕ по group_key — проверено). - dump-путь `_get_zouit_overlaps`: добавлен `_ZOUIT_SUBCATEGORY_TYPE` (26→«Санитарно-защитная зона» + ~20 кодов, кросс-валидированы dump↔cad_zouit на проде); `type_zone` из карты; `reg` из `props.options.reg_numb_border`; `subcategory` нормализован в int (надёжнее для gate sub-17). Было 3 пустые строки → теперь типизированные СЗЗ. ## Безопасность / контракт - Аддитивно: `type_zone`/`reg_numb_border`/`subcategory(int)` — фронт-типы совместимы (`subcategory: string|number|null`, `type_zone?`). `group_key` сузил набор значений (убран `cad_zouit`), но ни один консьюмер не кейсится по этому литералу; фронт `NspdZouitOverlapsBlock` уже маппит `protected` + graceful fallback. `gate_verdict` ветвится по `source` (не тронут) — блокер sub-17 цел. - ruff чисто, `:name::type`-cast grep пусто, targeted suite 441 passed / 0 failed (+10 new/updated тестов). Фронт-follow-up (часть #1957/#1962): вывести `type_zone`/`reg_numb_border` + СЗЗ-баннер «жильё ограничено».
bot-backend added 2 commits 2026-06-27 09:21:59 +00:00
#1954 — площадь «—»: COALESCE(land_record_area, specified_area, declared_area)
в EGRN-блоке analyze (land_record_area NULL у 12809/42233 участков, но
specified_area заполнена). area_m2 для 66:41:0205010:287 теперь 106378 (был NULL).

#1954 — «Обновлено» сломано: cost_registration_date — мёртвая колонка (0/42233);
репойнт на updated_at (42233/42233 заполнено). Ключ ответа last_egrn_update_date
не меняется (additive value fix).

#1958 — confidence-фактор «Прогноз спрос/предложение» дублировался ×4
(по фактору на горизонт). Сворачиваем в один weakest-link'ом (MIN ранга
по горизонтам) в _component_confidences до confidence-движка (#990).

#1957 — ЗОУИТ backend:
- _get_cad_zouit_overlaps: DISTINCT ON (reg_numb_border) — дедуп дубль-строк
  (одна физ. зона 2× с разным category_name). group_key cad_zouit→protected.
- _get_zouit_overlaps (dump path): subcategory→RU-тип карта (26→СЗЗ и др.,
  коды сверены кросс-джойном dump↔cad_zouit на проде); type_zone из карты,
  reg из props.options.reg_numb_border. Раньше отдавал blank-строки.
- унификация group_key (protected/engineering/okn/natural/other) + top-level
  reg_numb_border в обоих путях.

UP038-модернизация isinstance в report_assembler (pre-commit ruff 0.7.4).

Frontend note (#1957): nspd_zouit_overlaps теперь всегда group_key из набора
{protected,engineering,okn,natural,other} — сырой 'cad_zouit' больше не отдаётся;
оба пути несут type_zone + reg_numb_border.

Tests: +4 _component_confidences collapse, +6 ЗОУИТ (subcategory map, dump
typing, DISTINCT ON), schema-test обновлён на protected. 451 passed targeted.
docs(zouit): уточнить DISTINCT ON-комментарий + убрать stale cad_zouit из FE-типа (#1957)
All checks were successful
CI / changes (pull_request) Successful in 6s
CI / frontend-tests (pull_request) Successful in 1m0s
CI / openapi-codegen-check (pull_request) Successful in 1m51s
CI / backend-tests (pull_request) Successful in 12m4s
bd1ed4861c
Code-review nits (без изменения поведения):
- quarter_dump_lookup.py: комментарий про дедуп ошибочно утверждал, что зоны без
  рег-номера не схлопываются. На деле reg_numb_border — TEXT NOT NULL (0 NULL на
  проде), а DISTINCT ON в PG считает NULL равными. Переформулировано на точное.
- frontend/types/nspd.ts: убран устаревший 'cad_zouit' из списка возможных
  group_key (бэкенд теперь эмитит только protected/engineering/okn/natural/other).
bot-backend merged commit ebdbedcabb into main 2026-06-27 09:34:45 +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#1973
No description provided.