Merge pull request 'fix(sf-08): room_bucket euro-1/euro-2 classification' (#281) from fix/sf-08-room-bucket-euro into main
All checks were successful
Deploy / changes (push) Successful in 5s
Deploy / build-backend (push) Successful in 1m35s
Deploy / build-frontend (push) Has been skipped
Deploy / build-worker (push) Successful in 2m35s
Deploy / deploy (push) Successful in 57s

This commit is contained in:
lekss361 2026-05-17 11:42:42 +00:00
commit d6a9824473
2 changed files with 18 additions and 5 deletions

View file

@ -143,6 +143,11 @@ _SUPPLY_BATCH_SQL = text("""
CASE
WHEN f.is_studio = TRUE OR f.flat_type = 'Квартира-студия' THEN 'studio'
WHEN f.rooms = 0 THEN 'studio'
-- Fix SF-08: euro-форматы DOM.РФ маркирует малогабаритные квартиры как 2-комн.
-- rooms=2 + area<35 euro-1 (студия с отдельной кухней ~26м²)
-- rooms=2 + area<50 euro-2 (~35-50м², евро-двушка)
WHEN f.rooms = 2 AND f.total_area < 35 THEN 'euro-1'
WHEN f.rooms = 2 AND f.total_area < 50 THEN 'euro-2'
WHEN f.rooms IN (1, 2, 3) THEN f.rooms::text
WHEN f.rooms >= 4 THEN '4+'
ELSE '1'

View file

@ -7,7 +7,7 @@ from __future__ import annotations
from typing import Literal
RoomBucket = Literal["studio", "1", "2", "3", "4+"]
RoomBucket = Literal["studio", "euro-1", "euro-2", "1", "2", "3", "4+"]
AreaBin = Literal["<25", "25-40", "40-60", "60-80", "80-100", "100+"]
@ -15,15 +15,18 @@ def room_bucket_from_flat(
rooms: int | None,
flat_type: str | None,
is_studio: bool | None,
total_area: float | None = None,
) -> RoomBucket:
"""Determine room_bucket из kn_flats полей.
Priority:
1. is_studio=True OR flat_type='Квартира-студия' "studio"
2. rooms IN (1, 2, 3) str(rooms)
3. rooms >= 4 "4+"
4. rooms = 0 (без is_studio) "studio"
5. fallback на "1" (rooms is None и не studio)
2. rooms=0 (без is_studio) "studio"
3. Fix SF-08: rooms=2 + area<35 "euro-1" (DOM.РФ маркирует малогабаритные как 2-комн)
4. Fix SF-08: rooms=2 + area<50 "euro-2" (евро-двушки 35-50м²)
5. rooms IN (1, 2, 3) str(rooms)
6. rooms >= 4 "4+"
7. fallback на "1" (rooms is None и не studio)
"""
if is_studio is True or flat_type == "Квартира-студия":
return "studio"
@ -31,6 +34,11 @@ def room_bucket_from_flat(
return "1"
if rooms == 0:
return "studio"
if rooms == 2 and total_area is not None:
if total_area < 35.0:
return "euro-1"
if total_area < 50.0:
return "euro-2"
if rooms >= 4:
return "4+"
if rooms in (1, 2, 3):