fix(financial): парковка price/cost по классу — econom наземная, business=Excel (#1881) #1893

Merged
bot-backend merged 1 commit from fix/parking-economics-by-class into main 2026-06-24 12:21:24 +00:00
Collaborator

Контекст

Финмодель брала плоские parking-константы для всех классов (price 1.9М/cost 1.8М = Excel «Авангардная 13» premium подземная, near break-even). Норма парковки уже class-dependent (econom 0.8/comfort 1.0/business 1.5 м/м на кв.). Econom заряжался 1.8М/м/м подземной застройки → break-even капитал раздувает пиковый долг/проценты. По РФ econom = наземная дешёвая парковка.

Фикс

_PARKING_PRICE_PER_SPOT / _PARKING_COST_PER_SPOTdict[HousingClass]:

класс price cost маржа/м/м тип
econom 800k 350k +450k наземная
comfort 1.3М 1.0М +300k частично подземная
business 1.9М 1.8М +100k подземная (= Excel, unchanged)
  • Норма (_PARKING_PER_APARTMENT) не тронута (возможно ПЗЗ-норматив).
  • Константы — TUNABLE ASSUMPTIONS (паттерн _SALE_PRICE_PER_SQM), правятся в одном месте.

⚠️ Честная оценка эффекта

Парковка — вторичный драйвер. Hand-recompute econom Ж-5: улучшает ~−148→−57М (в основном через peak-debt/проценты), НЕ переворачивает знак. Доминирующий рычаг — себестоимость СМР жилья к выручке (econom 72k на GFA vs выручка на sellable = 87%) — отдельное продуктовое решение, в этот PR НЕ входит.

Test plan

  • +6 тестов (по классам, маржа +450/+300/+100k, инвариант econom+parking) + 3 существующих исправлены (хардкод comfort 1.9/1.8 → 1.3/1.0).
  • Полный бэкенд: 3465 passed, 0 failed, coverage 70.35%. ruff + mypy(strict financial.py) чисто. Repo-wide grep: нет уцелевших scalar-консьюмеров (dict*int TypeError-риск снят).
  • Схема не менялась (revenue_parking_rub остаётся float) → api-types regen не нужен.
  • Инвариант Σ cashflow == net_profit сохранён.
  • code-review: 2× approve, 0 majors.
  • Прод-валидация после деплоя: econom Ж-5 → улучшение net/peak_debt (ожидаю всё ещё отрицательный → подтвердит что СМР — главный рычаг).

Хозяйственное: untrack + gitignore backend/.coverage.

Refs #1881

🤖 Generated with Claude Code

## Контекст Финмодель брала **плоские** parking-константы для всех классов (price 1.9М/cost 1.8М = Excel «Авангардная 13» premium подземная, near break-even). Норма парковки уже class-dependent (econom 0.8/comfort 1.0/business 1.5 м/м на кв.). Econom заряжался 1.8М/м/м **подземной** застройки → break-even капитал раздувает пиковый долг/проценты. По РФ econom = наземная дешёвая парковка. ## Фикс `_PARKING_PRICE_PER_SPOT` / `_PARKING_COST_PER_SPOT` → `dict[HousingClass]`: | класс | price | cost | маржа/м/м | тип | |---|---|---|---|---| | econom | 800k | 350k | +450k | наземная | | comfort | 1.3М | 1.0М | +300k | частично подземная | | business | 1.9М | 1.8М | +100k | подземная (= Excel, unchanged) | - Норма (`_PARKING_PER_APARTMENT`) **не тронута** (возможно ПЗЗ-норматив). - Константы — TUNABLE ASSUMPTIONS (паттерн `_SALE_PRICE_PER_SQM`), правятся в одном месте. ## ⚠️ Честная оценка эффекта Парковка — **вторичный** драйвер. Hand-recompute econom Ж-5: улучшает ~−148→−57М (в основном через peak-debt/проценты), **НЕ переворачивает знак**. **Доминирующий рычаг** — себестоимость СМР жилья к выручке (econom 72k на GFA vs выручка на sellable = 87%) — отдельное продуктовое решение, в этот PR НЕ входит. ## Test plan - [x] +6 тестов (по классам, маржа +450/+300/+100k, инвариант econom+parking) + 3 существующих исправлены (хардкод comfort 1.9/1.8 → 1.3/1.0). - [x] **Полный бэкенд: 3465 passed, 0 failed**, coverage 70.35%. ruff + mypy(strict financial.py) чисто. Repo-wide grep: нет уцелевших scalar-консьюмеров (dict*int TypeError-риск снят). - [x] Схема не менялась (`revenue_parking_rub` остаётся float) → api-types regen не нужен. - [x] Инвариант Σ cashflow == net_profit сохранён. - [x] code-review: **2× approve, 0 majors**. - [ ] Прод-валидация после деплоя: econom Ж-5 → улучшение net/peak_debt (ожидаю всё ещё отрицательный → подтвердит что СМР — главный рычаг). Хозяйственное: untrack + gitignore `backend/.coverage`. Refs #1881 🤖 Generated with [Claude Code](https://claude.com/claude-code)
bot-backend added 1 commit 2026-06-24 12:09:15 +00:00
fix(financial): парковка price/cost по классу (econom наземная, business Excel)
All checks were successful
CI / changes (pull_request) Successful in 7s
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 1m57s
CI / backend-tests (pull_request) Successful in 11m44s
4eeda46cfa
Финмодель брала ПЛОСКИЕ parking-константы для ВСЕХ классов: price 1.9М/cost 1.8М
(Excel «Авангардная 13» premium — подземная, near break-even). Но норма парковки
уже class-dependent (econom 0.8/comfort 1.0/business 1.5 м/м на квартиру). Econom
(дешёвое жильё) заряжался 1.8М/м/м ПОДЗЕМНОЙ застройки → огромный break-even капитал,
раздувающий пиковый долг/проценты. По РФ econom = наземная дешёвая парковка.

Фикс: _PARKING_PRICE_PER_SPOT / _PARKING_COST_PER_SPOT → dict[HousingClass]:
- econom 800k/350k (наземная), comfort 1.3М/1.0М (частично подземная),
  business 1.9М/1.8М (подземная, = Excel, unchanged).
- маржа/м/м: econom +450k, comfort +300k, business +100k.
- НОРМА парковки (_PARKING_PER_APARTMENT) НЕ тронута (возможно ПЗЗ-норматив).
- Константы помечены как TUNABLE ASSUMPTIONS (РФ-рынок), правятся в одном месте
  (паттерн _SALE_PRICE_PER_SQM / _CONSTRUCTION_COST_PER_SQM).

ВАЖНО (честно): парковка — ВТОРИЧНЫЙ драйвер. Улучшает econom в основном через
снижение peak-debt/процентов, НЕ переворачивает знак. ДОМИНИРУЮЩИЙ рычаг —
себестоимость СМР жилья к выручке (econom 72k на GFA vs выручка на sellable = 87%)
— отдельное продуктовое решение (не трогаю без согласования).

Инвариант Σ cashflow == net_profit сохранён (меняются только величины
revenue_parking/construction_parking в том же каскаде). Тесты: +6 (по классам,
маржа, инвариант econom+parking) + 3 существующих исправлены (хардкод comfort
1.9/1.8 → 1.3/1.0). tests/services/generative 90 passed. ruff+mypy(strict) чисто.
Схема не менялась.

Хозяйственное: untrack + gitignore backend/.coverage (артефакт блокировал checkout).

Refs #1881
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
bot-backend merged commit c13ab32aa2 into main 2026-06-24 12:21:24 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
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#1893
No description provided.