feat(sf): ППТ/ПМТ ТЭП-парсер (Табл.11/12/13) → ekb_ppt_tep MVP (#1085) #1133

Merged
bot-reviewer merged 1 commit from feat/ekb-ppt-tep into main 2026-06-07 11:54:41 +00:00
Owner

Что

MVP-парсер ТЭП из пояснительных записок ППТ/ПМТ (pdfplumber). Геометрия ППТ/ПМТ уже в planning_projects (1170, WFS) — добавляет ТЭП-контент. Часть #1085/#1067.

Состав

  • data/sql/138_ekb_ppt_tep.sqlekb_ppt_tep(doc_ref UNIQUE, project_type, zone_balance JSONB, tep JSONB, phasing JSONB, raw_tables JSONB, …), idempotent.
  • ekb_ppt_tep_parser.pyparse_ppt_tep(pdf_bytes): pdfplumber → Табл.11 (баланс зон), Табл.12 (ТЭП), Табл.13 (очередность) по caption «Таблица N». ⚠️ кириллица только через pdfplumber (poppler = mojibake).
  • ekb_ppt_tep_sync.py — Celery ingest_ppt_tep(docs), seed-doc (URL placeholder), verify=False. Ручной/редкий, beat нет.
  • 30/30 тестов (24 синтетических + 6 на реальном образце).

Что извлеклось из образца (ppt2018_22823, 131 стр)

Таблица Строк Качество
Табл.12 ТЭП 72 🟢 полный набор (территория/жилфонд/соц/транспорт/инженерия)
Табл.11 баланс зон 15 🟡 12 зон + 2 преамбульных артефакта (нужен post-filter zone_name!='')
Табл.13 очередность 364 🟡 ~30-40 реальных + continuation-шум от merged-cells (post-filter/dedup)

Исправлен баг: _TABLE_HINT_RE матчил оглавление → tep пуст; оставлен только явный caption «Таблица N».

VERIFY перед прод-прогоном (не блокер)

  • _SEED_DOCS URL = # VERIFY URL (уточнить реальный URL пояснительной записки на екатеринбург.рф/ГИСОГД); пока ingest скипает с WARNING.
  • Структура ППТ разнится между проектами → raw_tables в БД для отладки; пост-фильтры Табл.11/13 — follow-up.

MVP #1085.

## Что MVP-парсер ТЭП из пояснительных записок ППТ/ПМТ (pdfplumber). Геометрия ППТ/ПМТ уже в `planning_projects` (1170, WFS) — добавляет ТЭП-контент. Часть #1085/#1067. ## Состав - `data/sql/138_ekb_ppt_tep.sql` — `ekb_ppt_tep(doc_ref UNIQUE, project_type, zone_balance JSONB, tep JSONB, phasing JSONB, raw_tables JSONB, …)`, idempotent. - `ekb_ppt_tep_parser.py` — `parse_ppt_tep(pdf_bytes)`: pdfplumber → Табл.11 (баланс зон), Табл.12 (ТЭП), Табл.13 (очередность) по caption «Таблица N». ⚠️ кириллица только через pdfplumber (poppler = mojibake). - `ekb_ppt_tep_sync.py` — Celery `ingest_ppt_tep(docs)`, seed-doc (URL placeholder), verify=False. Ручной/редкий, beat нет. - 30/30 тестов (24 синтетических + 6 на реальном образце). ## Что извлеклось из образца (ppt2018_22823, 131 стр) | Таблица | Строк | Качество | |---|---|---| | Табл.12 ТЭП | 72 | 🟢 полный набор (территория/жилфонд/соц/транспорт/инженерия) | | Табл.11 баланс зон | 15 | 🟡 12 зон + 2 преамбульных артефакта (нужен post-filter `zone_name!=''`) | | Табл.13 очередность | 364 | 🟡 ~30-40 реальных + continuation-шум от merged-cells (post-filter/dedup) | Исправлен баг: `_TABLE_HINT_RE` матчил оглавление → tep пуст; оставлен только явный caption «Таблица N». ## VERIFY перед прод-прогоном (не блокер) - `_SEED_DOCS` URL = `# VERIFY URL` (уточнить реальный URL пояснительной записки на екатеринбург.рф/ГИСОГД); пока ingest скипает с WARNING. - Структура ППТ разнится между проектами → `raw_tables` в БД для отладки; пост-фильтры Табл.11/13 — follow-up. MVP #1085.
lekss361 added 1 commit 2026-06-07 11:49:52 +00:00
feat(sf): ППТ/ПМТ ТЭП-парсер (Табл.11/12/13) → ekb_ppt_tep MVP (#1085)
All checks were successful
CI / changes (push) Successful in 7s
CI / changes (pull_request) Successful in 7s
CI / backend-tests (push) Successful in 6m33s
CI / backend-tests (pull_request) Successful in 6m36s
3e86975762
lekss361 added the
GG-форсайт
scope/backend
scrapers
site-finder
labels 2026-06-07 11:50:00 +00:00
bot-reviewer approved these changes 2026-06-07 11:54:33 +00:00
bot-reviewer left a comment
Collaborator

APPROVE — ТЭП-parser MVP (inert scaffold, как #1118).

Verified prod (deploy-safety): миграция 138_ekb_ppt_tep.sql — таблица отсутствует, 138 не в _schema_migrations → применится один раз. Idempotent (BEGIN/COMMIT, CREATE TABLE/INDEX IF NOT EXISTS, guarded UNIQUE(doc_ref) DO-block, partial GIN на zone_balance). 138 — координированный номер (см. NB в 137). Merge-risk = миграция only.

Task инертен: beat НЕ зарегистрирован, seed-URL = placeholder # VERIFYingest_ppt_tep явно скипает placeholder (if url.startswith("# VERIFY")). На проде не запустится до ручного вызова с реальным URL.

Проверил байты (verify-don't-trust): _norm_value re.sub(r"[-]", ...) — это range Private-Use-Area (PDF-garbage-глифы), а не ASCII-hyphen (- = range-оператор между PUA-кодпойнтами). Не баг — корректная чистка.

ОК: verify=False + #242-комментарий (урок из #1126) ✓; pdfplumber уже в deps (#1118), lock не трогается ✓; UPSERT ON CONFLICT(doc_ref)+SAVEPOINT per-doc+CAST jsonb psycopg v3 ✓; graceful (таблица не найдена → [], не исключение); raw_tables (cap 10 rows) для отладки; 24 синтетических + 6 real-skipif тестов.

🟡 MINOR → consolidated follow-up (не блокеры, до прод-прогона): Табл.11 post-filter zone_name != '' (2 преамбульных артефакта), Табл.13 dedup/post-filter (continuation-шум merged-cells), уточнение seed-URL, врезка в analyze (join doc_ref↔planning_projects.source_key), vault-запись.

Merging (squash).

<!-- gendesign-review-bot: sha=3e86975 verdict=approve --> ✅ **APPROVE** — ТЭП-parser MVP (inert scaffold, как #1118). **Verified prod (deploy-safety):** миграция `138_ekb_ppt_tep.sql` — таблица отсутствует, `138` не в `_schema_migrations` → применится один раз. Idempotent (BEGIN/COMMIT, CREATE TABLE/INDEX IF NOT EXISTS, guarded UNIQUE(doc_ref) DO-block, partial GIN на zone_balance). 138 — координированный номер (см. NB в 137). **Merge-risk = миграция only.** **Task инертен:** beat НЕ зарегистрирован, seed-URL = placeholder `# VERIFY` → `ingest_ppt_tep` явно скипает placeholder (`if url.startswith("# VERIFY")`). На проде не запустится до ручного вызова с реальным URL. **Проверил байты (verify-don't-trust):** `_norm_value` `re.sub(r"[-]", ...)` — это range Private-Use-Area (PDF-garbage-глифы), а **не** ASCII-hyphen (`-` = range-оператор между PUA-кодпойнтами). Не баг — корректная чистка. **ОК:** `verify=False` + #242-комментарий (урок из #1126) ✓; pdfplumber уже в deps (#1118), lock не трогается ✓; UPSERT ON CONFLICT(doc_ref)+SAVEPOINT per-doc+CAST jsonb psycopg v3 ✓; graceful (таблица не найдена → [], не исключение); raw_tables (cap 10 rows) для отладки; 24 синтетических + 6 real-skipif тестов. **🟡 MINOR → consolidated follow-up (не блокеры, до прод-прогона):** Табл.11 post-filter `zone_name != ''` (2 преамбульных артефакта), Табл.13 dedup/post-filter (continuation-шум merged-cells), уточнение seed-URL, врезка в analyze (join doc_ref↔planning_projects.source_key), vault-запись. Merging (squash).
bot-reviewer merged commit 1e53416277 into main 2026-06-07 11:54:41 +00:00
bot-reviewer deleted branch feat/ekb-ppt-tep 2026-06-07 11:54:41 +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#1133
No description provided.