fix(mera/v2): форма принимала этаж больше этажности дома #3226

Merged
lekss361 merged 2 commits from fix/mera-floor-validation into main 2026-08-29 15:19:25 +00:00
Owner

Что было

Прод-оценка 6d0c268e (пр-кт Академика Сахарова 81, кв 181, 29.08) ушла в расчёт с floor=17 при total_floors=9. Дом 2023 года постройки — девятиэтажным он быть не может. Ни форма, ни бэкенд взаимно противоречивый ввод не отбили, мусор дошёл до этажных коэффициентов.

Что сделано

ParamsPanel (v2) блокирует сабмит по тому же паттерну, что уже работает для адреса и площади — fieldErrors + aria-invalid + aria-describedby + текст ошибки под инпутом:

условие сообщение поле
floor > total_floors (оба заполнены) Этаж не может быть больше числа этажей в доме ЭТАЖ
floor === 0 Этаж не может быть нулевым ЭТАЖ
total_floors === 0 Этажей в доме не может быть 0 ВСЕГО ЭТАЖЕЙ
floor > 100 / total_floors > 100 Проверьте число этажей соответствующее

Оба поля остаются опциональными — пустые значения не блокируют. Правка любого из двух полей сбрасывает обе ошибки: floor > total_floors — ошибка про пару, а не про одно поле.

Проверка

  • npx tsc --noEmit — чисто
  • ParamsPanel.floors.test.tsx — 3/3 (17/9 блокирует и показывает текст; 9/17 проходит; пустые поля проходят с floor/total_floors = null)

Осознанно вне scope

  • Бэкенд-валидация. API принял 17/9 молча — серверная проверка нужна, но отдельным PR.
  • Основная жалоба по 6d0c268e (ожидаемая цена сделки = цене объявления, торг 0%) этой правкой НЕ закрывается. Там другой механизм: asking→sold ratio 0.865 × hedonic-фактор 1.224 = 1.058 > 1 → кламп estimate_expected_sold_le_asking (estimator.py:3600) прибивает expected_sold к headline. Замер по 349 прод-сделкам Росреестра показал, что снятие hedonic или ограничение его сверху единицей делают точность ХУЖЕ — правку туда без отдельного разбора вносить нельзя.
## Что было Прод-оценка `6d0c268e` (пр-кт Академика Сахарова 81, кв 181, 29.08) ушла в расчёт с `floor=17` при `total_floors=9`. Дом 2023 года постройки — девятиэтажным он быть не может. Ни форма, ни бэкенд взаимно противоречивый ввод не отбили, мусор дошёл до этажных коэффициентов. ## Что сделано `ParamsPanel` (v2) блокирует сабмит по тому же паттерну, что уже работает для адреса и площади — `fieldErrors` + `aria-invalid` + `aria-describedby` + текст ошибки под инпутом: | условие | сообщение | поле | |---|---|---| | `floor > total_floors` (оба заполнены) | Этаж не может быть больше числа этажей в доме | ЭТАЖ | | `floor === 0` | Этаж не может быть нулевым | ЭТАЖ | | `total_floors === 0` | Этажей в доме не может быть 0 | ВСЕГО ЭТАЖЕЙ | | `floor > 100` / `total_floors > 100` | Проверьте число этажей | соответствующее | Оба поля остаются опциональными — пустые значения не блокируют. Правка любого из двух полей сбрасывает обе ошибки: `floor > total_floors` — ошибка про пару, а не про одно поле. ## Проверка - `npx tsc --noEmit` — чисто - `ParamsPanel.floors.test.tsx` — 3/3 (17/9 блокирует и показывает текст; 9/17 проходит; пустые поля проходят с `floor`/`total_floors` = `null`) ## Осознанно вне scope - **Бэкенд-валидация.** API принял 17/9 молча — серверная проверка нужна, но отдельным PR. - **Основная жалоба по 6d0c268e** (ожидаемая цена сделки = цене объявления, торг 0%) этой правкой НЕ закрывается. Там другой механизм: `asking→sold ratio` 0.865 × hedonic-фактор 1.224 = 1.058 > 1 → кламп `estimate_expected_sold_le_asking` (estimator.py:3600) прибивает expected_sold к headline. Замер по 349 прод-сделкам Росреестра показал, что снятие hedonic или ограничение его сверху единицей делают точность ХУЖЕ — правку туда без отдельного разбора вносить нельзя.
lekss361 added 1 commit 2026-08-29 13:03:25 +00:00
fix(mera/v2): форма принимала этаж больше этажности дома
Some checks failed
CI Trade-In / 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 / changes (pull_request) Successful in 11s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Failing after 51s
ac5f16abfd
Прод-инцидент 6d0c268e (пр-кт Академика Сахарова 81): оценка ушла в
расчёт с floor=17 при total_floors=9. Ни форма, ни бэкенд не отбили
взаимно противоречивый ввод — мусор дошёл до этажных коэффициентов.

ParamsPanel v2 теперь блокирует сабмит по тому же паттерну, что уже
используется для адреса и площади (fieldErrors + aria-invalid +
aria-describedby + текст под инпутом):

- floor > total_floors (когда заполнены оба)
- нулевой этаж / нулевая этажность
- этаж или этажность > 100

Оба поля остаются опциональными — пустые значения не блокируют.
Правка любого из двух полей сбрасывает обе ошибки: floor > total_floors
— ошибка про пару, а не про одно поле.

Бэкенд не трогали: серверная проверка — отдельным заходом.
bot-backend added 1 commit 2026-08-29 15:17:36 +00:00
fix(mera/v2): debounce-таймер адреса не чистился при размонтировании панели
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI / changes (pull_request) Successful in 10s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Successful in 59s
57531c9f21
Таймер из onAddressChange (200 мс) переживал unmount и дёргал setState уже
мёртвого компонента. В CI это валило frontend-checks у PR #3226 как unhandled
`ReferenceError: window is not defined` — новый тест ParamsPanel.floors
печатает адрес и завершается раньше, чем таймер срабатывает, и тот стрелял
после teardown jsdom. Ассерты при этом были зелёные, падал сам прогон.
lekss361 merged commit ac2633011b into main 2026-08-29 15:19:25 +00:00
lekss361 deleted branch fix/mera-floor-validation 2026-08-29 15:19:25 +00:00
Sign in to join this conversation.
No reviewers
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#3226
No description provided.