feat(exporters): PURE HTML §4–§7 полного PDF-отчёта (#2259 PR-B Sections) #2285
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2285
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/full-report-html-b"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что
PR-B Sections эпика #2259, поверх смерженного PR-A (#2284).
build_full_report_html_part_b(forecast_result, concept_result, cad):ConceptOutput.variants[].financial(опорный вариант = max NPV; полный каскад revenue→NPV/IRR/levered IRR), рыночный контекст цены изscoring.special_indices.scenarios_collapsed.buildings_geojson.features[].properties(находка ревью:building_programна выходном ConceptVariant не существует — прежний код молча не рисовал бы таблицу; 1b-стратегии без section_type честно без таблицы) +{{MAP_CONCEPT}}для PR-C. concept=None → «не рассчитана»._normalize/_as_dict/_future_supply_pairs/_level_ruиз report_pdf (третий набор форматтеров не плодим). Один общий<style>, PURE-гарантия сохранена (weasyprint не тянется импортом).Вход для PR-D (зафиксировано)
_FORECAST_SCHEMA_VERSIONв parcels.py.meta.generated_atв форсайт-payload = None — дату даёт вызывающий.Тесты
125 passed / 6 skipped (весь exporters-каталог; 15 в part B, включая 2 регресс-гарда программы из фич). ruff clean (+UP).
Ревью
code-reviewer: ⚠️ MINOR → исправлено в этом же PR (переисточник программы из реальных properties продюсера placement.py, фикстуры без впрыска несуществующего поля).
Refs #2259
build_full_report_html_part_b(forecast_result, concept_result, cad): §4 рынок (market_now/velocity/конкуренты/confidence), §5 финмодель (DCF из ConceptOutput.variants[].financial, опорный вариант = max NPV; рыночный контекст из scoring.special_indices), §6 риски/дефицит (future_market + честная плашка при scenarios_collapsed), §7 концепция (ТЭП + программа, переисточенная из buildings_geojson.features[].properties — поле building_program на выходном ConceptVariant НЕ существует; 1b-стратегии без section_type таблицу программы не рисуют). Плейсхолдер {{MAP_CONCEPT}} для PR-C; concept=None → «не рассчитана» без падения. Нормализация forecast-словаря — импорт _normalize/_as_dict/ _future_supply_pairs/_level_ru из report_pdf (без третьего набора форматтеров). Один общий <style>. ВАЖНО для PR-D: реальная schema форсайта = "1.0" (не forecast-1.0); концепция НЕ персистится — server-side вызов POST /concepts обязателен, без него §5 деградирует в рыночный контекст, §7 в заглушку. Refs #2259