-- 176_domrf_kapremont.sql -- -- CONTEXT: issue #2013 — houses.year_built заполнен только на 38%, houses.material_walls -- на 0%. Существующий ГИС-ЖКХ loader (app/tasks/zhkh_flats_load.py, мигр. 146/149) -- заполняет houses.zhkh_year (70% = 5002/7128) и houses.zhkh_floors (70%), НО НИКОГДА -- не копирует их в houses.year_built/total_floors — это основной пробел. material_walls -- вообще ни разу не заполнялся никаким источником (0%). Estimator -- (app/services/estimator.py) фильтрует когорту по `year_built BETWEEN ...` — реальные -- годы напрямую двигают точность оценки. Это REAL fix для #2013 (взамен запаркованного -- когорт-исключения PR #2474). -- -- Источник: ДОМ.РФ капремонт open data (free, no auth), region 66 (Свердловская обл.): -- КР1.1 house registry (export/190) — zip → CSV. mkd_code, houseguid (ФИАС GUID дома), -- address, commission_year (год ввода, int), total_sq, number_floors_max. -- КР1.2 constructive elements (export/275) — zip → CSV, LONG FORMAT (строка на -- конструктивный элемент на mkd_code); wall_material заполнен только на строке -- элемента «фасад». -- listings→houses линковка через listings.house_id_fk (avito 52.5% linked, year_built -- 0% на avito → backfill поднимет до ~36-52% через houses.year_built propagation). -- -- WHAT: -- Таблица domrf_kapremont — staging-приёмник КР1.1+КР1.2 (region 66), ключ mkd_code. -- Заполняется отдельным loader'ом (app/services/domrf_kapremont_loader.py, -- app/tasks/domrf_kapremont_load.py). Backfill houses.year_built/material_walls/ -- total_floors и propagation listings.year_built — отдельный код-путь той же таски, -- НЕ в этой миграции (только схема здесь, никакого DML над houses/listings). -- -- DEPENDENCIES (existing prod objects): houses (gar_house_guid, house_fias_id, -- zhkh_house_guid, zhkh_year, zhkh_floors, year_built, material_walls, total_floors — -- все уже существуют: мигр. 009/010/070/146/149/152), listings (house_id_fk, year_built — -- мигр. 002/130). -- -- SAFETY / IDEMPOTENCY: только CREATE TABLE/INDEX IF NOT EXISTS + COMMENT. Повторный -- прогон — no-op. Деплой-раннер гонит файл через psql -v ON_ERROR_STOP=on БЕЗ -- --single-transaction → транзакцию открывает САМ файл (BEGIN/COMMIT ниже), как 143/149. -- -- NB по нумерации: последний занятый = 175 (ls data/sql | grep '^17[0-9]'); следующий -- свободный sequential = 176. -- -- Deploy order: после 175_scrape_schedules_seed_domclick_detail_backfill.sql. BEGIN; CREATE TABLE IF NOT EXISTS domrf_kapremont ( mkd_code text PRIMARY KEY, -- ДОМ.РФ код МКД (КР1.1/КР1.2 join-ключ) houseguid text, -- ФИАС GUID дома (КР1.1 houseguid) address text, commission_year smallint, -- год ввода в эксплуатацию (КР1.1 commission_year) number_floors_max int, -- этажность (КР1.1 number_floors_max) total_sq numeric(10, 2), -- общая площадь дома, м² (КР1.1 total_sq) wall_material text, -- материал стен (КР1.2, строка «фасад»; wall_material) loaded_at timestamptz NOT NULL DEFAULT now() ); CREATE INDEX IF NOT EXISTS domrf_kapremont_houseguid_idx ON domrf_kapremont (houseguid) WHERE houseguid IS NOT NULL; COMMENT ON TABLE domrf_kapremont IS 'ДОМ.РФ капремонт open data (КР1.1 house registry export/190 + КР1.2 constructive ' 'elements export/275), region 66 (Свердловская обл.). Ключ mkd_code. houseguid — ФИАС ' 'GUID дома, матчится к houses через COALESCE(gar_house_guid, house_fias_id, ' 'zhkh_house_guid) (app/services/domrf_kapremont_loader.py). wall_material берётся из ' 'КР1.2 со строки конструктивного элемента «фасад» (единственная строка на mkd_code, ' 'где это поле непустое). Заполняется app/tasks/domrf_kapremont_load.py (issue #2013).'; COMMIT;