fix(bug-22a): map missing kn-API fields (flat_number/living_area/wall_type/energy_eff) + backfill #302

Merged
lekss361 merged 1 commit from fix/bug-22a-kn-missing-fields into main 2026-05-17 14:59:02 +00:00
Owner

Summary

Issue #297 sub-task 22a (1.5d, quick-win pre-task до основного catalog scraper'а).

Audit domrf_raw_endpoints payload для obj=65136 + сравнение с _norm_object() / _norm_flat() маппингом в domrf_kn.py. Найдены 4 поля, которые приходят в payload, но не маппятся в БД (flat_number, living_area, wall_type, energy_eff). obj_class уже извлекается через AI desc regex (PR #293 SF#15).

Changes

  • backend/app/services/scrapers/domrf_kn.py (+13 lines):
    • Добавлены mapping'и для 4 missing fields в _norm_object() и _norm_flat() (ON CONFLICT gaps fixed)
  • data/sql/108_bug22a_kn_missing_fields_audit.sql (+85 lines):
    • Backfill из existing raw_obj JSON для historical rows
    • Idempotent UPDATE (WHERE col IS NULL guard)
  • Vault: fixes/Fix_BUG22a_KnApi_Missing_Fields_May17.md

Test plan

  • After deploy + migration: re-run coverage queries для region_cd=66:
    • flat_number coverage > 0% (раньше всегда NULL)
    • living_area coverage увеличивается
    • wall_type, energy_eff — coverage от payload availability
  • obj_id=65136 (эталон) → проверь что новые поля заполнены для existing flats

Related: issue #297 sub-task 22a · pre-task до catalog scraper (BUG #22 main)

## Summary Issue #297 sub-task **22a** (1.5d, quick-win pre-task до основного catalog scraper'а). Audit `domrf_raw_endpoints` payload для obj=65136 + сравнение с `_norm_object()` / `_norm_flat()` маппингом в `domrf_kn.py`. Найдены 4 поля, которые приходят в payload, но не маппятся в БД (`flat_number`, `living_area`, `wall_type`, `energy_eff`). `obj_class` уже извлекается через AI desc regex (PR #293 SF#15). ## Changes - `backend/app/services/scrapers/domrf_kn.py` (+13 lines): - Добавлены mapping'и для 4 missing fields в `_norm_object()` и `_norm_flat()` (ON CONFLICT gaps fixed) - `data/sql/108_bug22a_kn_missing_fields_audit.sql` (+85 lines): - Backfill из existing raw_obj JSON для historical rows - Idempotent UPDATE (WHERE col IS NULL guard) - Vault: `fixes/Fix_BUG22a_KnApi_Missing_Fields_May17.md` ## Test plan - [ ] After deploy + migration: re-run coverage queries для region_cd=66: - `flat_number` coverage > 0% (раньше всегда NULL) - `living_area` coverage увеличивается - `wall_type`, `energy_eff` — coverage от payload availability - [ ] obj_id=65136 (эталон) → проверь что новые поля заполнены для existing flats Related: issue #297 sub-task 22a · pre-task до catalog scraper (BUG #22 main)
lekss361 added 1 commit 2026-05-17 14:55:14 +00:00
Audit of kn-API payload for issue #297 sub-task 22a:

Object-level (/kn/object list endpoint):
- wallType, energyEff, objClass: absent from API payload (0/1516 objects).
  obj_class already fixed in SF#15 via aiDescription regex.
  wall_type/energy_eff: no data source exists.

Flat-level (/portal-kn/api/sales/portal/table):
- number → flat_number: mapped correctly in _norm_flat().
- livingArea → living_area: mapped correctly in _norm_flat().
- Root cause for 0% DB coverage: UPSERT_FLAT_SQL ON CONFLICT did not include
  flat_number, living_area, is_studio, total_area, rooms, floor, num_floors —
  existing rows (hash-id, inserted before direct flatId became available)
  were never updated on subsequent scrapes.

Fix:
- UPSERT_FLAT_SQL ON CONFLICT: add COALESCE updates for all 7 flat fields.
- UPSERT_OBJECT_SQL ON CONFLICT: add COALESCE for wall_type + energy_eff
  (obj_class was already updating, now also COALESCE to preserve existing value).
- Add migration 108 (idempotent DDL guard + coverage NOTICE).

Coverage will improve on next scrape; no backfill possible (flat raw not stored).

Closes #297 sub-task 22a.
lekss361 merged commit 0b12a55eb6 into main 2026-05-17 14:59:02 +00:00
Author
Owner

Merged via deep-code-reviewer — verdict APPROVE.

Проверено:

  • DB schema: все 4 столбца уже существуют (domrf_kn_objects.wall_type/energy_eff, domrf_kn_flats.flat_number/living_area) — миграция 108 это no-op ADD COLUMN IF NOT EXISTS + coverage NOTICE, DDL changes нет.
  • Mapping: _norm_object() line 190-191, _norm_flat() line 233/236 — корректные API keys (wallType, energyEff, number/flatNumber, livingArea).
  • ON CONFLICT root cause: UPSERT_FLAT_SQL не апдейтил flat_number/living_area/is_studio/total_area/rooms/floor/num_floors для existing rows — теперь COALESCE-обновляет. Bonus fix: obj_class тоже теперь COALESCE (раньше overwrite).
  • Vault: fixes/Fix_BUG22a_KnApi_Missing_Fields_May17.md присутствует, payload audit зафиксирован.
  • BUG #22 main (catalog scraper) — отдельный follow-up, payload wallType/energyEff от API 0/1516 → данных нет, не fix scope.

Reminder после deploy:

  • Smoke: coverage queries для region_cd=66 (flat_number/living_area начнут расти после следующего scrape; wall_type/energy_eff останутся 0% — API их не отдаёт).
  • obj_id=65136 — эталон, проверь что новые поля заполнились после re-scrape.
  • BUG #22 main (catalog scraper) — отдельный PR.
Merged via deep-code-reviewer — verdict APPROVE. Проверено: - DB schema: все 4 столбца уже существуют (`domrf_kn_objects.wall_type/energy_eff`, `domrf_kn_flats.flat_number/living_area`) — миграция 108 это no-op `ADD COLUMN IF NOT EXISTS` + coverage NOTICE, **DDL changes нет**. - Mapping: `_norm_object()` line 190-191, `_norm_flat()` line 233/236 — корректные API keys (`wallType`, `energyEff`, `number/flatNumber`, `livingArea`). - ON CONFLICT root cause: `UPSERT_FLAT_SQL` не апдейтил `flat_number/living_area/is_studio/total_area/rooms/floor/num_floors` для existing rows — теперь COALESCE-обновляет. Bonus fix: `obj_class` тоже теперь COALESCE (раньше overwrite). - Vault: `fixes/Fix_BUG22a_KnApi_Missing_Fields_May17.md` присутствует, payload audit зафиксирован. - BUG #22 main (catalog scraper) — отдельный follow-up, payload `wallType/energyEff` от API 0/1516 → данных нет, не fix scope. Reminder после deploy: - Smoke: coverage queries для `region_cd=66` (`flat_number`/`living_area` начнут расти после следующего scrape; `wall_type`/`energy_eff` останутся 0% — API их не отдаёт). - obj_id=65136 — эталон, проверь что новые поля заполнились после re-scrape. - BUG #22 main (catalog scraper) — отдельный PR.
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#302
No description provided.