(medium) VelocityBlock.tsx/VelocityBlock: «Топ продавцов» показывает «Продано 0 м²» при отсутствии данных velocity #1458

Closed
opened 2026-06-15 05:55:57 +00:00 by bot-backend · 1 comment
Collaborator

Severity: medium · Категория: report · Файл: frontend/src/components/site-finder/VelocityBlock.tsx:256-355

VelocityBlock.tsx:256-355. Таблица «Топ продавцов» рендерится по условию velocity.sample_competitors.length > 0 (стр. 256) без проверки dataAvailable. В none/partial-fallback backend (backend/app/services/site_finder/velocity.py: sample_no_data стр. 256-268 с total_sqm_period: 0.0, sample_partial стр. 402-410 с total_sqm_period: 0.0) кладёт в sample_competitors реальные ЖК с нулевыми продажами. Колонка «Продано м²» (стр. 345-353, Math.round(c.total_sqm_period)) тогда показывает 0 для каждого ЖК. При velocity_data_available===false бэкенд возвращает нули как заглушку (нет маппинга в Objective), но таблица перечисляет конкретные ЖК с «Продано 0», создавая впечатление реальных нулевых продаж вместо «данных нет». Бейдж «нет данных velocity» (стр. 70-74) частично смягчает. Medium. Фикс: скрывать «Топ продавцов» (или колонку «Продано м²» / ставить «—») при dataAvailable===false.

Почему баг: При velocity_data_available === false (нет маппинга в Objective) бэкенд возвращает нулевые продажи как заглушку, но таблица всё равно выводит конкретные ЖК с «Продано 0», создавая впечатление, что у них реально 0 продаж за период, тогда как данных просто нет. Бейдж «нет данных velocity» частично смягчает, но цифра 0 в табличной колонке всё равно вводит в заблуждение.

Как чинить: Скрывать колонку «Продано м²» (или всю таблицу/выводить «—») когда dataAvailable === false, как это уже сделано для gauge (строка 97).


deep-audit «армия ботов 2» · verify+harden, confidence 0.82 · unit U94

**Severity:** medium · **Категория:** report · **Файл:** `frontend/src/components/site-finder/VelocityBlock.tsx:256-355` VelocityBlock.tsx:256-355. Таблица «Топ продавцов» рендерится по условию `velocity.sample_competitors.length > 0` (стр. 256) без проверки dataAvailable. В none/partial-fallback backend (backend/app/services/site_finder/velocity.py: sample_no_data стр. 256-268 с `total_sqm_period: 0.0`, sample_partial стр. 402-410 с `total_sqm_period: 0.0`) кладёт в sample_competitors реальные ЖК с нулевыми продажами. Колонка «Продано м²» (стр. 345-353, `Math.round(c.total_sqm_period)`) тогда показывает 0 для каждого ЖК. При velocity_data_available===false бэкенд возвращает нули как заглушку (нет маппинга в Objective), но таблица перечисляет конкретные ЖК с «Продано 0», создавая впечатление реальных нулевых продаж вместо «данных нет». Бейдж «нет данных velocity» (стр. 70-74) частично смягчает. Medium. Фикс: скрывать «Топ продавцов» (или колонку «Продано м²» / ставить «—») при dataAvailable===false. **Почему баг:** При `velocity_data_available === false` (нет маппинга в Objective) бэкенд возвращает нулевые продажи как заглушку, но таблица всё равно выводит конкретные ЖК с «Продано 0», создавая впечатление, что у них реально 0 продаж за период, тогда как данных просто нет. Бейдж «нет данных velocity» частично смягчает, но цифра 0 в табличной колонке всё равно вводит в заблуждение. **Как чинить:** Скрывать колонку «Продано м²» (или всю таблицу/выводить «—») когда `dataAvailable === false`, как это уже сделано для gauge (строка 97). --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.82 · unit U94</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:55:57 +00:00
bot-backend added the
scope/frontend
label 2026-06-15 11:02:08 +00:00
Owner

🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)

Текущее состояние кода: frontend/src/components/site-finder/VelocityBlock.tsx:256 — таблица «Топ продавцов» рендерится по условию velocity.sample_competitors.length > 0 БЕЗ проверки dataAvailable. Колонка «Продано м²» (:345-353, Math.round(c.total_sqm_period)) показывает 0 для каждого ЖК. Gauge выше (:97) корректно gated на dataAvailable; бейдж «нет данных velocity» (:70-74) гейтнут на !dataAvailable. Backend в fallback кладёт реальные ЖК с нулевыми продажами: velocity.py sample_partial (:403-416, total_sqm_period: 0.0) и sample_no_data (через _compute_rosreestr_fallback), при velocity_data_available=False (:428).

Корень: при velocity_data_available === false (нет маппинга в Objective) backend возвращает нули как заглушку, но таблица всё равно выводит конкретные ЖК с «Продано 0», создавая впечатление реальных нулевых продаж вместо «данных нет». Бейдж частично смягчает, но цифра 0 в колонке вводит в заблуждение. Не crash.

Что править:

  • Скрывать «Топ продавцов» (или колонку «Продано м²» / ставить «—») при dataAvailable === false, как уже сделано для gauge (:97). Минимальный вариант: добавить && dataAvailable к условию :256, либо в ячейке :352 рендерить dataAvailable ? Math.round(c.total_sqm_period).toLocaleString("ru") : "—".
  • Учесть rosreestr-fallback: при isRosreestrFallback (:75) данные есть из квартальных сделок — там колонку не прятать. Гейт должен быть именно на dataAvailable, не на отсутствии fallback.

Что посмотреть:

  • Код: VelocityBlock.tsx (:256-355, переменная dataAvailable — найти её определение в начале компонента, :97/:70); velocity.py ветки sample_partial/sample_no_data/_compute_rosreestr_fallback. Проверить, что dataAvailable маппится на velocity.velocity_data_available.
  • Vault: релевантных заметок не найдено (code/modules/Module_Velocity_Service.md — общий модуль, не про этот UI-кейс).
**🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)** **Текущее состояние кода:** `frontend/src/components/site-finder/VelocityBlock.tsx:256` — таблица «Топ продавцов» рендерится по условию `velocity.sample_competitors.length > 0` БЕЗ проверки `dataAvailable`. Колонка «Продано м²» (`:345-353`, `Math.round(c.total_sqm_period)`) показывает 0 для каждого ЖК. Gauge выше (`:97`) корректно gated на `dataAvailable`; бейдж «нет данных velocity» (`:70-74`) гейтнут на `!dataAvailable`. Backend в fallback кладёт реальные ЖК с нулевыми продажами: `velocity.py` `sample_partial` (`:403-416`, `total_sqm_period: 0.0`) и `sample_no_data` (через `_compute_rosreestr_fallback`), при `velocity_data_available=False` (`:428`). **Корень:** при `velocity_data_available === false` (нет маппинга в Objective) backend возвращает нули как заглушку, но таблица всё равно выводит конкретные ЖК с «Продано 0», создавая впечатление реальных нулевых продаж вместо «данных нет». Бейдж частично смягчает, но цифра 0 в колонке вводит в заблуждение. Не crash. **Что править:** - Скрывать «Топ продавцов» (или колонку «Продано м²» / ставить «—») при `dataAvailable === false`, как уже сделано для gauge (`:97`). Минимальный вариант: добавить `&& dataAvailable` к условию `:256`, либо в ячейке `:352` рендерить `dataAvailable ? Math.round(c.total_sqm_period).toLocaleString("ru") : "—"`. - Учесть rosreestr-fallback: при `isRosreestrFallback` (`:75`) данные есть из квартальных сделок — там колонку не прятать. Гейт должен быть именно на `dataAvailable`, не на отсутствии fallback. **Что посмотреть:** - Код: `VelocityBlock.tsx` (`:256-355`, переменная `dataAvailable` — найти её определение в начале компонента, `:97`/`:70`); `velocity.py` ветки `sample_partial`/`sample_no_data`/`_compute_rosreestr_fallback`. Проверить, что `dataAvailable` маппится на `velocity.velocity_data_available`. - Vault: релевантных заметок не найдено (`code/modules/Module_Velocity_Service.md` — общий модуль, не про этот UI-кейс).
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
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#1458
No description provided.