gendesign/data/sql
lekss361 7c05d0a0d8 feat(objective): full sync pipeline + dynamic admin config
Objective API (api.objctv.ru) интегрирован как новый source of truth для
per-flat данных по новостройкам УрФО. Заменяет промежуточный Anton-SQLite
(legacy bootstrap-ETL остался как fallback в свёрнутом блоке UI).

Schema (data/sql/68_v2 — applied на проде, 6 таблиц):
- objective_lots          (UPSERT по lot_id; 303 677 rows)
- objective_corpus_room_month (long-формат месяц×корпус×room_bucket; 19 738 rows)
- objective_lots_history  (append-only weekly snapshots для elasticity)
- objective_complex_mapping (Objective ComplexName ↔ domrf_kn_objects.obj_id)
- objective_raw_reports   (jsonb страховка на смену схемы API)
- objective_scrape_runs   (журнал прогонов)
+ data/sql/72_objective_sync_config (single-row динамический конфиг)

Backend:
- services/scrapers/objective.py: ObjectiveClient — Bearer-токен (Redis +
  in-memory fallback), retry на 401/429/5xx, Retry-After header support
- services/objective_etl.py: ETL SQLite Антона → PG (legacy)
- services/objective_sync_config.py: read/update single-row config
- workers/tasks/scrape_objective.py:
  * sync_objective_group: 2 рабочих отчёта (corp_sum, lots_pf), inline-парсинг
  * sync_all_groups: wrapper, перебирает группы из БД-конфига с
    inter-group паузой; PATCH-merge explicit args > DB config
- workers/tasks/objective_etl.py: Celery task для legacy bootstrap
- workers/celery_app.py: beat читает cron из БД при старте (fallback на env)
- api/v1/admin_scrape.py: 5 новых endpoints для /objective/*

Frontend (frontend/src/app/admin/scrape/objective/page.tsx):
- PRIMARY blue блок «🌐 Наш sync» с input для override групп
- Collapsible «⚙️ Настройки» с формой (cron + 8 параметров) → PUT в БД
- Coverage-панель с PG counts + строка про SQLite Антона как legacy
- Collapsible «🛠 Bootstrap ETL» — legacy-инструмент

Beat schedule: вторник 06:00 МСК, ~10-15 мин на 4 группы (Свердл.обл +
Челябинск + Тюмень + Пермь = ~700K квартир УрФО). Расписание и параметры
меняются через админку без редеплоя (cron требует restart beat).

Эмпирические находки об API (probe 2026-05-10):
- 13 из 21 проверенных group_name доступны на тарифе (включая «Свердловская
  область», «Челябинск», «Тюмень», «Пермь», но НЕ «Свердловская обл» —
  формат имени строгий)
- ComplexName требует БЕЗ префикса «ЖК» и БЕЗ кавычек
- Поле «Банк» для всех 303k = NULL (тариф не отдаёт), но «Тип обременения»
  работает (36% строк = ипотека) → ipoteka_share возможен, банковская
  атрибуция — нет

Docker:
- bind-mount /opt/gendesign/site-finder:/data/anton-sqlite:ro в worker

GitHub backlog: добавлены #22-25 (recommend_mix v3 — 4 сабтаска по
улучшению алгоритма на основе фидбэка про POI / границы районов /
конкурентов / окно данных / success-driven mix).

Knowledge graph (memory/memory-gendesign.jsonl): обновлены entities
Objective_Integration_May07_2026, Schema_Objective_v2_May07,
Objective_API_Findings_May07, Module_Objective_Client + новый
Session_End_May07_2026.

TODO для прода: прописать OBJECTIVE_API_KEY=<key> в backend/.env +
docker compose restart worker beat.
2026-05-10 19:54:15 +03:00
..
01_schema_rosreestr_deals.sql add data 2026-04-26 22:30:52 +03:00
02_load_all_quarters.sh fix 2026-04-30 22:16:44 +03:00
02b_load_via_tunnel.py fix 2026-04-30 22:16:44 +03:00
03_materialized_views.sql add data 2026-04-26 22:30:52 +03:00
10_schema_domrf.sql add data 2026-04-26 22:30:52 +03:00
11_load_domrf.py add data 2026-04-26 22:30:52 +03:00
20_schema_domrf_extras.sql add data 2026-04-26 22:30:52 +03:00
21_load_domrf_extras.py add data 2026-04-26 22:30:52 +03:00
30_scrape_domrf.py add anal 2 2026-04-27 13:05:36 +03:00
31_schema_domrf_full.sql add data 2026-04-26 22:30:52 +03:00
31_schema_domrf_raw.sql add data 2026-04-26 22:30:52 +03:00
32_load_domrf_full.py add data 2026-04-26 22:30:52 +03:00
32_load_domrf_raw.py add data 2026-04-26 22:30:52 +03:00
33_schema_domrf_lazy.sql add anal 2 2026-04-27 13:05:36 +03:00
34_load_domrf_lazy.py add anal 2 2026-04-27 13:05:36 +03:00
35_schema_domrf_stats.sql add anal 2 2026-04-27 13:05:36 +03:00
36_parse_xlsx_stats.py add anal 2 2026-04-27 13:05:36 +03:00
37_cleanup_redundant.sql add anal 2 2026-04-27 13:05:36 +03:00
38_relations_fix.sql add anal 2 2026-04-27 13:05:36 +03:00
39_territory_aliases.sql add anal 2 2026-04-27 13:05:36 +03:00
40_relations.sql add data 2026-04-26 22:30:52 +03:00
40_scrape_history.py add anal 2 2026-04-27 13:05:36 +03:00
41_load_history.py add anal 2 2026-04-27 13:05:36 +03:00
42_schema_breakdown_widen.sql add anal 2 2026-04-27 13:05:36 +03:00
43_anton_import.sql add anal 2 2026-04-27 13:05:36 +03:00
44_import_anton_db.py add anal 2 2026-04-27 13:05:36 +03:00
45_relations_v2.sql add anal 2 2026-04-27 13:05:36 +03:00
50_schema_kn_extensions.sql add interactive parser of наш.дом.рф ЖК+flats with stealth Playwright 2026-04-27 17:58:40 +03:00
50_scrape_kn_flats.py add domrf extras parser (sale_graph + sales_agg + infra + photos) + 2026-04-27 18:35:46 +03:00
51_schema_kn_extras.sql add domrf extras parser (sale_graph + sales_agg + infra + photos) + 2026-04-27 18:35:46 +03:00
52_import_prinzip_crm.py ship #13-16: multi-target Dockerfile, per-object drill-in, CRM pipeline, 2026-04-27 19:32:37 +03:00
52_schema_prinzip_crm.sql ship #13-16: multi-target Dockerfile, per-object drill-in, CRM pipeline, 2026-04-27 19:32:37 +03:00
53_schema_kn_thumbs.sql fix ui lag 2026-04-27 20:26:55 +03:00
54_schema_scrape_log.sql add logs 2026-04-27 20:51:44 +03:00
55_schema_scrape_resume.sql add log scrapper 2026-04-27 21:50:44 +03:00
56_fetch_ekb_districts.py feat(geo): ЖК → district mapping через PostGIS-полигоны OSM (Limit_District_Geometry closed) 2026-04-29 08:03:38 +03:00
56_schema_ekb_districts_geom.sql feat(geo): ЖК → district mapping через PostGIS-полигоны OSM (Limit_District_Geometry closed) 2026-04-29 08:03:38 +03:00
57_kn_objects_district.sql feat(geo): ЖК → district mapping через PostGIS-полигоны OSM (Limit_District_Geometry closed) 2026-04-29 08:03:38 +03:00
58_fetch_cad_quarters_nspd.py sprint1: nspd scraper industrialization, per-bucket elasticity, cadastre cross-check, sentry releases 2026-04-30 21:51:19 +03:00
58_schema_cad_quarters.sql sprint1: nspd scraper industrialization, per-bucket elasticity, cadastre cross-check, sentry releases 2026-04-30 21:51:19 +03:00
59_backfill_obj_cad_quarter.sql sprint1: nspd scraper industrialization, per-bucket elasticity, cadastre cross-check, sentry releases 2026-04-30 21:51:19 +03:00
60_v_zk_rosreestr_velocity.sql sprint1: nspd scraper industrialization, per-bucket elasticity, cadastre cross-check, sentry releases 2026-04-30 21:51:19 +03:00
61_import_nspd_batch.py sprint1: nspd scraper industrialization, per-bucket elasticity, cadastre cross-check, sentry releases 2026-04-30 21:51:19 +03:00
62_scrape_nspd_full.py sprint1: nspd scraper industrialization, per-bucket elasticity, cadastre cross-check, sentry releases 2026-04-30 21:51:19 +03:00
63_schema_nspd_runs.sql fix 2026-04-30 22:16:44 +03:00
64_v_zk_rosreestr_velocity.sql fix 2026-04-30 22:16:44 +03:00
65_partitions_rosreestr_2024_h1.sql fix 2026-04-30 22:16:44 +03:00
66_indexes_recommend.sql audit-fix: 27mo окно, MODE bucket, индексы recommend_mix 2026-04-30 22:41:43 +03:00
67_refresh_ekb_districts_median.sql fix(scrape): SQLAlchemy text() парсил ':00:' regex как named-param 2026-04-30 23:16:11 +03:00
68_schema_objective.sql feat(objective): integrate api.objctv.ru — auth, schema, weekly sync 2026-05-07 21:04:00 +03:00
69_objective_smoke.py ignore 2026-05-07 21:04:38 +03:00
69b_objective_minimal.py ignore 2026-05-07 21:04:38 +03:00
70_parse_objective_raw.py feat(objective): integrate api.objctv.ru — auth, schema, weekly sync 2026-05-07 21:04:00 +03:00
71_etl_anton_sqlite_to_pg.py feat(objective): full sync pipeline + dynamic admin config 2026-05-10 19:54:15 +03:00
72_objective_sync_config.sql feat(objective): full sync pipeline + dynamic admin config 2026-05-10 19:54:15 +03:00
decode_to_file.py add data 2026-04-26 22:30:52 +03:00
upload_server.py add data 2026-04-26 22:30:52 +03:00