feat(financial): DCF-график продаж по реальному темпу поглощения (rank 1, #1881) #1890
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#1890
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/dcf-velocity-schedule"
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?
Summary
Финмодель брала фиксированное окно продаж 30 мес независимо от рынка (
schedule_is_defaultвсегдаtrue). Теперь окно считается из локального темпа поглощения, который уже вычисляется в том же/analyze(compute_velocity), но финмодель его игнорировала — единственный потребитель, который его не использовал.Корректность абсорбции (ключевое — легко сделать неправильно)
velocity.monthly_velocity_sqm= Σ поглощения ВСЕГО конкурентного набора в радиусе (м²/мес), НЕ темп одного проекта. Наивноеresidential / monthly_velocity_sqmозначало бы, что новый проект забирает весь рыночный темп → дико оптимистично.→ per-project absorption =
monthly_velocity / max(n_with_sales, 1)(темп одного типичного локального продавца). Полеproject_absorption_sqm_per_monthдобавлено вVelocityResult(objective-путь); rosreestr-fallback и вырожденные пути →None(поквартальный count без по-проектной декомпозиции не должен задавать график).Изменения (11 файлов, +404/−21)
velocity.py:project_absorption_sqm_per_month(+as_dict).financial.py: окно =clamp(ceil(residential/velocity), MIN=6, MAX=120); эскроу-инвариантsales_end=max(sales_start+base, constr_end)сверху;_build_monthly_cashflow→_CashflowResult(cashflow, realized, schedule_is_market);schedule_is_defaultфлипается; новое полеsales_duration_months.parcel_financial.py/parcels.py: проброс velocity в финмост.concept.py:sales_duration_months(additive).placement.py/concepts.py): передаётNone→ дефолт 30 мес (out of scope, follow-up).api-types.ts(regen) +site-finder.ts+ mock.Инвариант
Σ undiscounted cashflow == net_profit держится (перенос выручки во времени не меняет сумму; маркетинг+НДС+налог прорейтятся на признание выручки). Чистая функция.
Test plan
financial.py) чисто. psycopg3-grep чист (SQL не трогал).⚠️ Контекст видимости (важно)
Прод-замер показал:
financial_estimateсейчас фаерит ~0% (резолв ПЗЗ-зоны проваливается на ~96% участков — разрывы тер-зон 45–86 м). Этот PR корректен и улучшает точность когда финмодель показывается, но реальный рычаг видимости — фикс резолва зоны (отдельная задача, выше приоритетом). См. vaultinbox/2026-06-24-...zoning-rootcause.Refs #1881
🤖 Generated with Claude Code