Hand-rolled детерминированный DCF (без numpy-financial/новых deps): _npv / _irr_monthly (bisection с bracket-guard) / _payback_months над помесячным cashflow, построенным из статического каскада (PR-1) + калиброванной цены (PR-2) по дефолтным нормативам фаз (ПИР 6мес → СМР по development_type 24/36/48 → распродажа, дисконт 15%). - Налоги прорейтятся на признание выручки → Σ недисконтированного cashflow == net_profit (ИНВАРИАНТ, тест — гарантия что DCF не разошёлся со статикой). - IRR настоящий когда есть смена знака; вырожденный поток → fallback на roi-proxy (irr_is_proxy=True). Честно помечено. - График продаж привязан к завершению стройки: sales_end = max(sales_start + длительность, construction_end) — продажи не заканчиваются раньше ввода (РФ ДДУ/эскроу). Без этого high_rise распродавался за 12 мес ДО ввода → двойная смена знака → profitable-проект молча падал в proxy + инверсия NPV. - FinancialModel +npv_rub/payback_months/discount_rate_used/schedule_is_default (additive). development_type проброшен через placement. - UI/PDF: NPV/IRR/PBP + честный caveat «график — типовое допущение, точность зависит от него». api-types регенерён авторитетно. mypy strict clean (generative.*), +15 тестов (DCF helpers на учебных значениях, ИНВАРИАНТ, IRR real-vs-proxy обе ветки, PBP, sales≥construction для всех типов, profitable high_rise → настоящий IRR). 48 passed. Refs #1881 |
||
|---|---|---|
| .. | ||
| public | ||
| src | ||
| .dockerignore | ||
| .env.example | ||
| .eslintrc.json | ||
| Dockerfile | ||
| next-env.d.ts | ||
| next.config.ts | ||
| package-lock.json | ||
| package.json | ||
| sentry.client.config.ts | ||
| sentry.edge.config.ts | ||
| sentry.server.config.ts | ||
| tsconfig.json | ||
| vitest-env.d.ts | ||
| vitest.config.ts | ||
| vitest.setup.ts | ||