gendesign/backend/app/services
bot-backend 9a4acb67d1
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI / 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 Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m0s
CI / backend-tests (pull_request) Successful in 17m13s
fix(ptica): act_date — дата акта об изъятии, а не первой попавшейся ссылки (#2464)
`_extract_act_date` брал ПЕРВОЕ «от DD.MM.YYYY» во всём OCR-тексте.
«Сообщение о планируемом изъятии» открывается списком оснований, и первой
строкой там стоит

    «Решение Екатеринбургской городской Думы от 06.07.2004 № 60/1
     «Об утверждении Генерального плана города»»

— Генплан, а не акт об изъятии. На проде это дало 11 строк из 27 с датой
2004-07-06 при проектах 2020 и 2022 годов, причём одну и ту же дату
получили ДВА разных документа (развязка на Сибирском тракте и улица
Энергостроителей). Совпадение даты у несвязанных актов и было первым
признаком, что дата не своя.

Дата принимается, только если в 120 символах перед ней стоит слово
«постановлени». Ссылки-помехи в этих документах — «Решение … Думы» и
«Приказ Министерства» — его не содержат. Окно шире самой фразы, потому
что OCR перемешивает колонки таблицы и вклинивает в неё чужой текст
(«…Администрации города документами) Екатеринбурга от 19.04.2019…»).

Если подходящей даты нет — None. Дата чужого документа хуже пустоты: по
ней нельзя ни отфильтровать актуальные изъятия, ни сверить срок, и она
неотличима от настоящей.

Калибровка не на одном образце: все пять исходных PDF загружены и
распознаны тем же трактом, что использует загрузчик (ocr_pdf_text в
прод-контейнере). Окна 80/120/160 дают одинаковые 5 из 5. Более узкое
правило (плюс «администраци») давало те же 5 из 5, но ломало законный
случай «Постановление № 509-ПП» — областной акт без слова «администрация»,
уже закреплённый тестом test_act_date_extracted_from_text; взято широкое.

Сквозная проверка: патченный код прогнан по всем пяти распознанным
текстам целиком — 27 записей, ровно столько же, сколько строк в
land_reservation; 11 меняют 2004-07-06 на настоящую дату, 16 не двигаются.

Двусторонне: против origin/main три теста красные с реальным неверным
значением ('2004-07-06'), ни одного TypeError — тесты идут через
extract_izyatie_records, чья сигнатура одинакова на обеих сторонах.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 21:24:32 +05:00
..
analysis_runs fix(week-review): backend-аудит v2 — 82 фиксов (#1660) 2026-06-17 17:13:38 +00:00
analytics fix(week-review): backend-аудит v2 — 82 фиксов (#1660) 2026-06-17 17:13:38 +00:00
cadastre fix(ptica): WAF-блок прерывает backfill_parcel_geom, а не гонит его дальше по кварталам (#2464) (#2969) 2026-08-20 10:34:26 +00:00
chat feat(chat): tool get_parcel_info — курируемый градрегламент/ЗОУИТ/ЕГРН в контекст чата (#2366) 2026-07-04 01:24:42 +00:00
etl fix(ptica): гео-проход не тратит геокод на занятых кандидатов и не «подтверждает» их (#2464) (#2929) 2026-08-19 11:52:07 +00:00
exporters fix(ptica): число ЗОУИТ перестаёт подписываться как число типов (#2464) (#2961) 2026-08-20 09:17:06 +00:00
forecasting docs(ptica): шесть мест, где документация расходилась с кодом (#2464) (#2968) 2026-08-20 10:25:22 +00:00
generative fix(ptica): сноска концепт-PDF печатает фактический срок распродажи, а не «30 мес» (#2464) (#2945) 2026-08-19 17:39:37 +00:00
llm feat(chat): tool get_parcel_info — курируемый градрегламент/ЗОУИТ/ЕГРН в контекст чата (#2366) 2026-07-04 01:24:42 +00:00
photos merge: resolve conflicts with main (#1660) into week-review-finish 2026-06-17 20:21:06 +03:00
scrapers fix(ptica): act_date — дата акта об изъятии, а не первой попавшейся ссылки (#2464) 2026-08-20 21:24:32 +05:00
site_finder fix(ptica): у пользователя не может быть двух дефолтных профилей весов (#2464) 2026-08-20 16:58:48 +05:00
__init__.py init 2026-04-25 13:45:19 +03:00
analytics_queries.py docs(ptica): шесть мест, где документация расходилась с кодом (#2464) (#2968) 2026-08-20 10:25:22 +00:00
analytics_refresh.py fix(scrape): SQLAlchemy text() парсил ':00:' regex как named-param 2026-04-30 23:16:11 +03:00
auth_session.py feat(sitefinder): «Птица» принимает сессию общего реестра [PR-2c/6] 2026-08-02 17:00:54 +03:00
dadata_client.py fix(ptica): дрейф формы ответа DaData не роняет весь гео-проход (#2464) (#2942) 2026-08-19 16:59:49 +00:00
forecast_request_cache.py perf(forecast): per-request memoization cache for §22 cold build (#1129) 2026-06-08 05:26:27 +00:00
insights.py feat(insights): manual-entry Insight entity CRUD + §19 audit (#948 part A) 2026-06-08 12:41:39 +05:00
job_settings.py fix(ptica): job_settings не отравляет чужую сессию при сбое БД (#2464 кластер A) (#2937) 2026-08-19 15:42:39 +00:00
objective_etl.py fix(week-review): backend-аудит v2 — 82 фиксов (#1660) 2026-06-17 17:13:38 +00:00
objective_sync_config.py fix(objective-sync): log seed failure вместо bare except pass (#1226) 2026-06-13 15:03:34 +05:00
own_projects.py feat(site-finder): own-portfolio data source for §25.3 cannibalization (#1169 PR1) 2026-06-08 16:21:53 +05:00
weather_cache.py fix(ptica): «0 мм осадков» перестаёт означать «данных нет» (#2464) (#2947) 2026-08-20 07:00:01 +00:00