fix(best-layouts): avg_area_m2 = NULL вместо 0 при пустом окне сделок (#2867) #3018

Merged
bot-backend merged 1 commit from fix/2867-avg-area-nullable into main 2026-08-21 10:27:03 +00:00
Collaborator

Summary

  • deals_per_bucket.avg_area_m2: убран COALESCE(SUM/NULLIF(...),0) — при нуле сделок за окно было «0.0 м²» как измеренное значение, и этот же 0 тянул вниз взвешенную среднюю по room_bucket (mix). Выравнено с соседней avg_price_per_m2_rub, которая уже NULL (#2464-B).
  • Схема TopLayoutRow.avg_area_m2: float | None; сборка строк и mix-взвешивание пропускают None (свой знаменатель rb_area_total_deals); PDF-ТЗ рисует «—»; фронт null → «—»; api-types.ts регенерирован (ровно 1 строка).
  • Второй пункт issue (area_bin 'н/д') уже был починен ранее — остался только контракт avg_area_m2.

Test plan

  • tests/test_2867_avg_area_nullable.py: 5/5 красных на origin/main по значению (COALESCE в SQL, float-схема, 0 в сборке, 0 в mix, 0.0 в PDF) → 5/5 зелёных с правкой. Гейт по SQL смотрит только код (строки-комментарии -- вырезаны — иначе спорил бы с собственным объяснением правки).
  • -k "best_layouts or layout_tz or 2867" — 102 passed, 1 skipped.
  • tsc --noEmit — 0 ошибок; prettier/ruff чистые.
  • post-deploy: /analyze участка с пустым окном по какому-то бакету → avg_area_m2: null в ответе, «—» в таблице.

Closes #2867

## Summary - `deals_per_bucket.avg_area_m2`: убран `COALESCE(SUM/NULLIF(...),0)` — при нуле сделок за окно было «0.0 м²» как измеренное значение, и этот же 0 тянул вниз взвешенную среднюю по room_bucket (mix). Выравнено с соседней `avg_price_per_m2_rub`, которая уже NULL (#2464-B). - Схема `TopLayoutRow.avg_area_m2: float | None`; сборка строк и mix-взвешивание пропускают None (свой знаменатель `rb_area_total_deals`); PDF-ТЗ рисует «—»; фронт `null → «—»`; `api-types.ts` регенерирован (ровно 1 строка). - Второй пункт issue (area_bin `'н/д'`) уже был починен ранее — остался только контракт avg_area_m2. ## Test plan - [x] `tests/test_2867_avg_area_nullable.py`: 5/5 красных на origin/main **по значению** (COALESCE в SQL, float-схема, 0 в сборке, 0 в mix, 0.0 в PDF) → 5/5 зелёных с правкой. Гейт по SQL смотрит только код (строки-комментарии `--` вырезаны — иначе спорил бы с собственным объяснением правки). - [x] `-k "best_layouts or layout_tz or 2867"` — 102 passed, 1 skipped. - [x] `tsc --noEmit` — 0 ошибок; prettier/ruff чистые. - [ ] post-deploy: `/analyze` участка с пустым окном по какому-то бакету → `avg_area_m2: null` в ответе, «—» в таблице. Closes #2867
bot-backend added 1 commit 2026-08-21 10:08:01 +00:00
fix(best-layouts): avg_area_m2 = NULL вместо 0 при пустом окне сделок
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 9s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Successful in 1m13s
CI / openapi-codegen-check (pull_request) Successful in 2m7s
CI / backend-tests (pull_request) Successful in 17m20s
fe7d9d757b
Почему: в deals_per_bucket средняя площадь считалась через
COALESCE(SUM/NULLIF(...),0) — при нуле сделок за окно строка показывала
«0.0 м²» как измеренное значение, и это же 0 участвовал во взвешенной
средней по room_bucket (mix), занижая её. Соседняя avg_price_per_m2_rub
уже отдаёт NULL (#2464-B) — выравниваем контракт.

Что: SQL без COALESCE(...,0); схема TopLayoutRow.avg_area_m2: float|None;
сборка строк и mix-взвешивание пропускают None (свой знаменатель
rb_area_total_deals); PDF-ТЗ рисует «—»; фронт null → «—»; api-types.ts
регенерирован (1 строка).

Тест test_2867_avg_area_nullable.py: 5/5 красных на origin/main по значению
(COALESCE в SQL, float-схема, 0 в сборке, 0 в mix, 0.0 в PDF), 5/5 зелёных
с правкой; смежные best_layouts/layout_tz — 102 passed.

Closes #2867
bot-backend merged commit ccf84b4adc into main 2026-08-21 10:27:03 +00:00
bot-backend deleted branch fix/2867-avg-area-nullable 2026-08-21 10:27:04 +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#3018
No description provided.