GET /api/v1/developer/commission-accruals — Начисления комиссий для застройщика
Постраничный список начислений комиссий, где текущая компания-застройщик — плательщик
(DeveloperCompanyId), с фильтрами по статусу и датам — очередь подтверждения обязательств по
комиссиям.
Назначение
Менеджер застройщика видит, какие комиссии начислены по его сделкам, что ожидает подтверждения и что
уже подтверждено/выплачено. Это cross-tenant чтение: начисления живут в tenant-е агентства
(ADR-0052, решение №2 ../README.md), застройщик читает их по своему явному полю
DeveloperCompanyId. Feature group — developer-accruals.
Metadata
| Поле | Значение |
|---|---|
| Сервис/контекст | rewards |
| API area | developer-admin |
| Feature group | developer-accruals |
| Статус | draft |
| Документ | docs/06-services/rewards/api/admin/list-developer-accruals.md |
Актор и доступ
| Проверка | Значение |
|---|---|
| Actor type | User (менеджер компании-застройщика) |
| Auth policy / Permissions | rewards.accruals.confirm |
| Scope (RBAC) | организация: компания Type = Developer |
| Record-level | фильтр DeveloperCompanyId = CompanyId актора (жёстко на сервере, не из query) |
| Tenant isolation | Cross-tenant чтение: выборка не ограничивается tenant-ом агентства; изоляция — permission + обязательный серверный фильтр DeveloperCompanyId |
| Audit | read-sensitive (суммы комиссий): в trace фиксируется actor + фильтры, суммы не логируются |
HTTP-контракт
| Поле | Значение |
|---|---|
| Method | GET |
| Route | /api/v1/developer/commission-accruals |
| Success status | 200 |
| Idempotency header | не применяется (read) |
| Correlation | сквозной trace через заголовок traceparent |
Входные данные / параметры запроса
| Поле | Источник | Тип | Обязательность | Валидация / Ограничения | Безопасность |
|---|---|---|---|---|---|
DeveloperCompanyId | identity claims (tenant_id актора) | Guid | Да | Required; не принимается из query | record-level фильтр |
Status | query | CommissionAccrualStatus? | Нет | enum PendingConfirmation/Confirmed/Paid/Cancelled | — |
DealCompletedFrom | query | DateTimeOffset? | Нет | — | — |
DealCompletedTo | query | DateTimeOffset? | Нет | > DealCompletedFrom, если обе заданы | — |
AgencyCompanyId | query | Guid? | Нет | фильтр по агентству-получателю | — |
Page / PageSize | query | int | Нет | paging-конвенция — README.md | — |
Модель ответа ListDeveloperAccrualsQueryResult
Страница DeveloperAccrualListItemModel. Дельта от CommissionAccrualModel
(README.md): без Distributions (распределение — внутреннее дело агентства,
Masking-правила реестра) и без AppliedPolicyId.
| Поле | Тип | Обязательность | Источник | Masking | Описание |
|---|---|---|---|---|---|
Items | IReadOnlyList<DeveloperAccrualListItemModel> | Да | projection | Distributions/AppliedPolicyId/InvestorUserId исключены | Страница начислений. |
Page / PageSize / TotalCount | int / int / long | Да | paging | — | Параметры страницы. |
DeveloperAccrualListItemModel = CommissionAccrualModel минус Distributions, AppliedPolicyId.
Алгоритм
- Контекст и доступ. Операцию выполняет менеджер компании-застройщика (тип компании
Developer, иначеFORBIDDEN); scope — организация застройщика; требуется правоrewards.accruals.confirm.DeveloperCompanyIdберётся только из claims актора, не из query. - Проверка входа. Enum
Status, согласованность дат (DealCompletedTo > DealCompletedFrom), параметры paging — иначеValidationError. - Выборка. Постранично отбираются начисления с обязательным фильтром
DeveloperCompanyId= компания актора (cross-tenant чтение, без ограничения по tenant-у агентства) и опциональнымиStatus, диапазономDealCompletedAt,AgencyCompanyId. Сортировка —DealCompletedAt DESC, Id DESC: вторичный ключIdобеспечивает стабильный порядок страниц (без пропусков/дублей при равныхDealCompletedAt). - Проекция и маскирование. Каждая строка отдаётся как
DeveloperAccrualListItemModel;AgencyCompanyId— изTenantIdначисления,AppliedRule.RuleName— из snapshot-а.DistributionsиAppliedPolicyIdзастройщику не отдаются (внутреннее дело агентства);InvestorUserIdне отдаётся никогда. - Результат. Страница начислений (
Items,Page,PageSize,TotalCount) →200.
Диаграмма
Ошибки и failure modes
Общие коды (ValidationError, FORBIDDEN, UNAUTHORIZED) — README.md. Специфичных нет.
Acceptance-критерии
- Happy path. Дано: по сделкам застройщика есть начисления в разных статусах, актор с
rewards.accruals.confirm. Когда:GET /api/v1/developer/commission-accruals. Тогда:200, страница начислений, гдеDeveloperCompanyId= компания актора; сортировка поDealCompletedAt DESC, Id DESC; в каждой строке нетDistributions,AppliedPolicyId,InvestorUserId. - Стабильная пагинация при равных датах. Дано: несколько начислений с одинаковым
DealCompletedAt, выборка разбита на страницы. Когда: последовательныйGETстраниц. Тогда: каждая строка попадает ровно на одну страницу (вторичный ключId DESCисключает пропуски и дубли на границах страниц). - Очередь на подтверждение. Дано:
?status=PendingConfirmation. Когда:GET. Тогда: только начисления, ожидающие подтверждения этим застройщиком. - Cross-tenant изоляция. Дано: начисления живут в tenant-ах разных агентств. Когда:
GET. Тогда: застройщик видит начисления всех агентств по своемуDeveloperCompanyId, но не начисления с чужимDeveloperCompanyId. - Фильтр по агентству. Дано:
?agencyCompanyId=A. Когда:GET. Тогда: только начисления, где агентство-получатель =A. - Некорректный диапазон дат. Дано:
?dealCompletedFrom>?dealCompletedTo. Когда:GET. Тогда:400ValidationError. - Пустой результат. Дано: под фильтр не подходит ни одно начисление. Когда:
GET. Тогда:200,Items = [],TotalCount = 0. - Нет права. Дано: у актора нет
rewards.accruals.confirm. Когда:GET. Тогда:403FORBIDDEN.
Совместимость и наблюдаемость
- Модель — проекция общего
CommissionAccrualModel: изменения additive. - Logs:
DeveloperCompanyId, фильтры,TotalCount(суммы не логируются); metrics:rewards_api_request_duration_seconds{route},rewards_developer_accruals_pending_gauge(для алёрта «зависшие подтверждения»); traces: OTel; dashboardrewards-overview.
Обратные ссылки
Автоссылки: где используется этот документ.
- API (5): GET /api/v1/agency/commission-accruals — Список начислений агентства, POST /api/v1/developer/commission-accruals — Ручное создание начисления застройщиком, POST /api/v1/developer/commission-accruals/{accrualId}/confirm — Подтверждение начисления застройщиком, POST /api/v1/developer/commission-accruals/{accrualId}/reject — Отказ застройщика от начисления, Rewards API — реестр операций и общие контрактные модели
- Use Cases (1): UC-RWD-004. Застройщик подтверждает начисление комиссии
- registries (1): Реестр API-методов PIN
Связанные документы
- Сущность: domain/commission-accrual.md (cross-tenant правило — раздел «Безопасность»); решение №2 — ../README.md.
- Действия по строке: confirm-commission-accrual.md, reject-commission-accrual.md.