Перейти к основному содержимому

GET /api/admin/v1/property-object-types/{groupId}/month-overrides — Помесячные оверрайды типа объекта недвижимости (admin)

Назначение

Отдаёт администратору платформы полный список помесячных оверрайдов PropertyObjectTypeMonthOverride типа объекта недвижимости GroupId для таба «помесячные оверрайды». Оверрайды — child-сущности агрегата PropertyObjectTypeConfig: читаются только в контексте существующего родителя (инвариант INV-MO2 — если тип объекта недвижимости не настроен, ответ 404). Доступ — только администратор платформы через admin API (ADR-0053).

Metadata

ПолеЗначение
Сервис/контекстinvest-analytics
API areaadmin (ADR-0053)
Feature groupadmin-property-object-types
Статусdraft
Документdocs/06-services/invest-analytics/api/admin/get-month-overrides.md

Актор и доступ

ПроверкаЗначение
Actor typeOperator(Admin) — администратор платформы (доступ через admin API, m2m client-credentials)
Auth policy / Permissionspolicy AdminSystemOnly (клиент pin-admin-system); каталожное соответствие — permission invest-analytics.property-object-types.view
Scope (RBAC)платформа
Tenant isolationне применяется — платформенная настройка (ADR-0052 п.3)
Auditread: не аудируется (PII нет)

HTTP-контракт

ПолеЗначение
MethodGET
Route/api/admin/v1/property-object-types/{groupId}/month-overrides
Success status200
Idempotency headerне применяется (safe GET)
Correlationсквозной trace через traceparent; X-Admin-User-Id — обязателен

Входные данные / параметры запроса

ПолеИсточникТипОбязательностьВалидация / ОграниченияБезопасность
GroupIdroutelongДа> 0; существование настройки типа — шаг проверки (404)
AdminUserIdheader X-Admin-User-IdGuidДа!= Guid.Emptyконтекст admin-области

Пагинация не применяется — единицы–десятки строк на тип (../../domain/property-object-type-month-override.md).

Модель ответа MonthOverridesResult

ПолеТипОбязательностьИсточникMaskingОписание
groupIdlongДаecho routeТип объекта недвижимости.
propertyObjectTypeVersionlongДаPropertyObjectTypeConfig.VersionРевизия родителя (для expectedVersion в replace-all PUT).
itemsIReadOnlyList<MonthOverrideItemModel>Да (может быть пуст)children агрегатаОверрайды, сортировка year ASC, month ASC.

MonthOverrideItemModel

Проекция полей дома property-object-type-month-override.md один-в-один (null = «поле месяца не оверрайдится»; семантика/единицы — там и в economic-model-config.md):

ПолеТипОбязательностьИсточникMaskingОписание
yearintДа.YearГод месяца-оверрайда (2000–2100).
monthintДа.MonthМесяц (1–12).
marketPriceM2decimal?Нет.MarketPriceM2Абсолютная рыночная цена м², руб.
priceGrowthMonthlydecimal?Нет.PriceGrowthMonthlyТемп роста цены в месяце.
dailyRentM2decimal?Нет.DailyRentM2Абсолютная аренда руб/м²/сутки.
rentGrowthMonthlydecimal?Нет.RentGrowthMonthlyТемп роста аренды.
occupancydecimal?Нет.OccupancyЗаполняемость месяца.
expenseSharedecimal?Нет.ExpenseShareДоля расходов месяца.
ebitdadecimal?Нет.EbitdaАбсолютный накопленный EBITDA/м².
appreciationTaxMonthlydecimal?Нет.AppreciationTaxMonthlyМесячная ставка налога на прирост (годовая = ×12).
ebitdaTaxMonthlydecimal?Нет.EbitdaTaxMonthlyМесячная ставка налога на EBITDA (годовая = ×12).

Алгоритм

  1. Контекст и доступ. Администратор платформы через admin API (policy AdminSystemOnly); scope — платформа; право invest-analytics.property-object-types.view; заголовок X-Admin-User-Id.
  2. Проверка входа. GroupId > 0, X-Admin-User-Id непустой — иначе ValidationError. Настройка типа объекта недвижимости с этим GroupId должна существовать (INV-MO2 — оверрайды читаются только в контексте родителя); если её нет → ошибка INVEST_ANALYTICS_PROPERTY_OBJECT_TYPE_NOT_FOUND (404).
  3. Что читаем. Полный список помесячных оверрайдов типа по GroupId, отсортированный по year ASC, month ASC (без пагинации — правило загрузки child-а агрегата, ../../domain/property-object-type-month-override.md).
  4. Правила и маппинг. Каждая строка проецируется в MonthOverrideItemModel; propertyObjectTypeVersion — ревизия родителя PropertyObjectTypeConfig.Version (для expectedVersion при replace-all сохранении).
  5. Результат. Список оверрайдов + ревизия родителя; пустой список — валидный ответ (тип настроен, месяцы не переопределены).

Ошибки и failure modes

КодHTTP statusУсловиеСообщениеRetry
ValidationError400GroupId <= 0 / заголовкиОшибка валидации запросаno retry
FORBIDDEN403Клиент не pin-admin-system / нет policyДоступ запрещёнno retry
INVEST_ANALYTICS_PROPERTY_OBJECT_TYPE_NOT_FOUND404Настройка типа не создана (INV-MO2)Настройка типа не найдена — сначала создайте типno retry

Совместимость и наблюдаемость

  • Additive-поля item-модели — без breaking; удаление/переименование — breaking (синхронно с домом сущности и wire-моделью PUT).
  • Logs: admin-month-overrides-read (adminUserId, groupId, count). Metrics: invest_analytics_admin_operations_total{operation="get-month-overrides"}. Traces — сквозной trace через traceparent.

Acceptance Criteria

  • Given тип GroupId настроен и имеет 3 помесячных оверрайда, When администратор шлёт GET, Then 200 с items из 3 строк, отсортированных year ASC, month ASC; propertyObjectTypeVersion = ревизия родителя.
  • Given тип GroupId настроен, но месяцы не переопределены, When GET, Then 200 с items = [] — валидный ответ (не ошибка).
  • Given настройки типа с этим GroupId не существует (INV-MO2), When GET, Then 404 INVEST_ANALYTICS_PROPERTY_OBJECT_TYPE_NOT_FOUND (оверрайды читаются только в контексте родителя).
  • Given GroupId <= 0 или пустой X-Admin-User-Id, When GET, Then 400 ValidationError.
  • Given клиент не pin-admin-system, When GET, Then 403 FORBIDDEN.

Обратные ссылки

Автоссылки: где используется этот документ.

Связанные документы