feat(financial): ground-floor нежилое (office/commercial) tranche #1905

Merged
bot-backend merged 2 commits from feat/offices-in-teap into main 2026-06-25 11:40:02 +00:00
Collaborator

Закрывает «офисы в TEAP» из остатка #1881. По сути — realism-фикс: раньше ВСЯ непаркинговая GFA считалась жильём, завышая жилую площадь.

Модель

  • _OFFICE_SHARE_OF_GFA (teap.py): econom 0%, comfort/business 5% (нижняя граница RU-нормы 3-8% встроенно-пристроенных нежилых 1-го этажа). Office GFA вырезается из жилья до efficiency; total_floor_area_sqm не меняется.
  • Нет double-count: т.к. office GFA остаётся в total_floor_area → СМР (total_floor_area × cost) уже её покрывает. Office = чисто additive выручка (+15% премия к классовой норме жилья), без новой статьи затрат. (Тест test_office_construction_not_double_counted: равная GFA → равный construction_rub.)
  • НДС: нежилое облагается (в отличие от жилья по ст.149) → база НДС = parking_value_added + office_value_added, консистентно с #1898.
  • Инвариант Σ cashflow == net_profit держится (office-выручка в общий revenue).

Пример (comfort high-rise, 20000 GFA)

residential 15600→14820 м², revenue +35.5М (office 166.75М − ушедшее жильё), vat 14.15М→26.58М, net_profit −79.5М→−44.0М (office-премия > потерянное жильё даже с НДС).

Презентация (deep-review P2 — исправлено)

Office-выручка contributed в GDV/net_profit, но была невидима → жильё+паркинг < GDV. Добавлены строки «Выручка — нежилое (1-й этаж)» в PDF-таблицу и concept-каскад (сходятся к GDV); PDF VAT relabel «НДС (нежилое: паркинг + коммерция)»; hand-types concept-api обновлены.

Schema/codegen

Additive TEAP.office_area_sqm + FinancialModel.revenue_office_rub (default 0, back-compat). api-types.ts регенерён точной CI-цепочкой (byte-identical, только 2 поля). Contract-key тест обновлён (оба ключа — не повторяем levered-IRR-промах).

Тесты / качество

559 passed, mypy strict clean, ruff clean, tsc clean, ptica 23 passed. Deep-review (no-double-count подтверждён трейсом cost+vat; carve-out; НДС; инвариант; codegen byte-identical; 5% default признан defensible realism-фиксом).

Default обратим: _OFFICE_SHARE_OF_GFA → 0 нейтрализует без revert (плумбинг остаётся корректным).

Refs #1881

Закрывает «офисы в TEAP» из остатка #1881. **По сути — realism-фикс**: раньше ВСЯ непаркинговая GFA считалась жильём, завышая жилую площадь. ## Модель - `_OFFICE_SHARE_OF_GFA` (teap.py): econom 0%, comfort/business **5%** (нижняя граница RU-нормы 3-8% встроенно-пристроенных нежилых 1-го этажа). Office GFA **вырезается из жилья** до efficiency; `total_floor_area_sqm` не меняется. - **Нет double-count:** т.к. office GFA остаётся в `total_floor_area` → СМР (`total_floor_area × cost`) уже её покрывает. Office = чисто additive **выручка** (+15% премия к классовой норме жилья), без новой статьи затрат. (Тест `test_office_construction_not_double_counted`: равная GFA → равный `construction_rub`.) - **НДС:** нежилое облагается (в отличие от жилья по ст.149) → база НДС = `parking_value_added + office_value_added`, консистентно с #1898. - Инвариант `Σ cashflow == net_profit` держится (office-выручка в общий `revenue`). ## Пример (comfort high-rise, 20000 GFA) residential 15600→14820 м², revenue +35.5М (office 166.75М − ушедшее жильё), vat 14.15М→26.58М, net_profit −79.5М→−44.0М (office-премия > потерянное жильё даже с НДС). ## Презентация (deep-review P2 — исправлено) Office-выручка contributed в GDV/net_profit, но была невидима → жильё+паркинг < GDV. Добавлены строки «Выручка — нежилое (1-й этаж)» в PDF-таблицу и concept-каскад (сходятся к GDV); PDF VAT relabel «НДС (нежилое: паркинг + коммерция)»; hand-types concept-api обновлены. ## Schema/codegen Additive `TEAP.office_area_sqm` + `FinancialModel.revenue_office_rub` (default 0, back-compat). `api-types.ts` регенерён точной CI-цепочкой (byte-identical, только 2 поля). Contract-key тест обновлён (оба ключа — не повторяем levered-IRR-промах). ## Тесты / качество 559 passed, mypy strict clean, ruff clean, tsc clean, ptica 23 passed. **Deep-review ✅** (no-double-count подтверждён трейсом cost+vat; carve-out; НДС; инвариант; codegen byte-identical; 5% default признан defensible realism-фиксом). Default обратим: `_OFFICE_SHARE_OF_GFA` → 0 нейтрализует без revert (плумбинг остаётся корректным). Refs #1881
bot-backend added 2 commits 2026-06-25 11:27:45 +00:00
Carve a documented office share out of GFA before residential (fixes prior
overstatement where all non-parking GFA = residential). total_floor_area
unchanged → СМР already covers office GFA (no double-count): office is pure
additive revenue at +15% premium. Offices нежилое → VAT-able: vat base =
parking_value_added + office_value_added (consistent with #1898). Σ invariant
holds. Additive schema (office_area_sqm, revenue_office_rub) → api-types regen.

Refs #1881
feat(financial): surface office revenue in PDF + concept UI (offices presentation)
All checks were successful
CI / changes (pull_request) Successful in 7s
CI / frontend-tests (pull_request) Successful in 1m4s
CI / openapi-codegen-check (pull_request) Successful in 1m56s
CI / backend-tests (pull_request) Successful in 11m10s
6b4b081c44
Office tranche was computed but invisible in both export surfaces (жильё+паркинг
< GDV with an unexplained gap). Add «Выручка — нежилое (1-й этаж)» row to the PDF
financial table + concept cascade; relabel PDF VAT row «НДС (нежилое: паркинг +
коммерция)». Add office_area_sqm/revenue_office_rub to hand-maintained
concept-api types; make teap_synth.office_area_sqm optional in site-finder types
(dev mock on main lacks it). Fix ptica finance fixture for required
revenue_office_rub.

Refs #1881
bot-backend merged commit b82963d12e into main 2026-06-25 11:40:02 +00:00
bot-backend deleted branch feat/offices-in-teap 2026-06-25 11:40:02 +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#1905
No description provided.