GET /api/v1/platform/referral-accruals — Реестр реферальных начислений
Постраничный реестр реферальных начислений платформы для Менеджера ПИН: кому (партнёр), за какую сделку и по какой ставке начислено вознаграждение, в каком статусе жизненного цикла оно находится (domain/referral-accrual.md) — с фильтрами по партнёру, застройщику, статусу и периоду сделок.
Назначение
Менеджер ПИН контролирует реферальную программу: сколько начислено и ожидает получения денег (Pending),
сколько готово к выплате (Approved), выплачено (Paid) и отменено (Cancelled) — и находит начисления
для ручного разбора (отмена по фроду/ошибке —
cancel-referral-accrual.md). Партнёр свои начисления смотрит отдельной
операцией partner-области (rewards.referral.view-own, record-level). Feature group — referral-accruals.
Metadata
| Поле | Значение |
|---|---|
| Сервис/контекст | rewards |
| API area | platform |
| Feature group | referral-accruals |
| Статус | draft |
| Документ | docs/06-services/rewards/api/platform/list-referral-accruals.md |
Актор и доступ
| Проверка | Значение |
|---|---|
| Actor type | User (Менеджер ПИН) |
| Auth policy / Permissions | rewards.accruals.manage (каталог — permission.md) |
| Scope (RBAC) | платформа |
| Tenant isolation | вне tenant-модели — реферальные начисления платформенные (ADR-0052); агентствам и застройщикам не отдаются |
| Audit | read-sensitive (суммы вознаграждений): в trace — actor + фильтры + TotalCount; суммы не логируются |
HTTP-контракт
| Поле | Значение |
|---|---|
| Method | GET |
| Route | /api/v1/platform/referral-accruals |
| Success status | 200 |
| Correlation | сквозной trace через заголовок traceparent |
Входные данные / параметры запроса
| Поле | Источник | Тип | Обязательность | Валидация / Ограничения | Безопасность |
|---|---|---|---|---|---|
PartnerUserId | query | Guid? | Нет | непустой Guid, если задан | — |
DeveloperCompanyId | query | Guid? | Нет | непустой Guid, если задан | — |
Status | query | ReferralAccrualStatus? | Нет | enum Pending/Approved/Paid/Cancelled | — |
DealCompletedFrom | query | DateTimeOffset? | Нет | нижняя граница DealCompletedAt (включительно) | — |
DealCompletedTo | query | DateTimeOffset? | Нет | верхняя граница DealCompletedAt (исключительно); > DealCompletedFrom, если обе заданы | — |
Page / PageSize | query | int | Нет | paging-конвенция — README.md (Page >= 1, PageSize 1..100) | — |
Модель ответа — постраничный список ReferralAccrualModel
Постраничный ответ: Items (список ReferralAccrualModel), Page, PageSize, TotalCount
(paging-конвенция — README.md). ReferralAccrualModel — полная проекция начисления, дом
модели — этот документ (дом полей — domain/referral-accrual.md);
операции области ссылаются сюда и описывают только дельту.
| Поле | Тип | Обязательность | Источник | Masking | Описание |
|---|---|---|---|---|---|
Id | Guid | Да | ReferralAccrualEntity.Id | — | Id начисления. |
DealId | Guid | Да | DealId | — | Сделка crm (одно начисление на сделку, INV-RA-1). |
BondId | Guid | Да | BondId | — | Реферальная связь — основание начисления. |
PartnerUserId | Guid | Да | PartnerUserId | — | Партнёр — получатель вознаграждения. |
DeveloperCompanyId | Guid | Да | DeveloperCompanyId | — | Застройщик сделки. |
CommissionAccrualId | Guid? | Нет | CommissionAccrualId | — | Родительское комиссионное начисление; null — родитель не создан, гейт денег непроходим. |
BaseAmount | MoneyModel | Да | BaseAmount | Sensitive | База расчёта — конечная цена сделки. |
Amount | MoneyModel | Да | Amount | Sensitive | Сумма вознаграждения (INV-RA-2; после first-class корректировки — скорректированная, INV-RA-6). |
OriginalAmount | MoneyModel? | Нет | OriginalAmount | Sensitive | Исходная сумма до корректировок; null — сумма не корректировалась (INV-RA-6). |
AppliedRate | AppliedRateModel | Да | AppliedRateSnapshot (jsonb) | — | Снапшот применённой ставки (модель ниже). |
Status | string (enum ReferralAccrualStatus) | Да | Status | — | Статус жизненного цикла. |
DealCompletedAt | DateTimeOffset | Да | DealCompletedAt | — | Момент завершения сделки (asOf резолюции ставки). |
ApprovedAt | DateTimeOffset? | Нет | ApprovedAt | — | Момент авто-апрува (регистрация акта родителя). |
PaidAt | DateTimeOffset? | Нет | PaidAt | — | Момент выплаты. |
CancelledAt | DateTimeOffset? | Нет | CancelledAt | — | Момент отмены. |
CancelReason | string? (enum ReferralCancelReason) | Нет | CancelReason | — | Причина отмены (DealCancelled/BondRevoked/ManualCorrection). |
PayoutOrderItemId | Guid? | Нет | PayoutOrderItemId | — | Позиция реферального поручения; null — начисление свободно. |
CreatedAt | DateTimeOffset | Да | CreatedAt | — | Момент создания. |
Version | long | Да | Version | — | Для ExpectedVersion мутаций (отмена). |
InvestorUserId в проекцию не выносится (PII приведённого инвестора; трассировка — через DealId в
crm, Masking-правила README.md).
AppliedRateModel (проекция AppliedRateSnapshotDocument)
| Поле | Тип | Обязательность | Источник | Описание |
|---|---|---|---|---|
RateRuleId | Guid | Да | снапшот | Ставка на момент применения (domain/referral-rate-rule.md). |
Scope | string (enum ReferralRateScope) | Да | снапшот | PartnerDeveloper/Partner/Developer/Global. |
Percent | decimal | Да | снапшот | Применённый процент от FinalPrice. |
EffectiveFrom / EffectiveTo | DateTimeOffset / DateTimeOffset? | Да / Нет | снапшот | Период ставки на момент применения. |
Алгоритм
Тривиальное постраничное чтение: проверить право rewards.accruals.manage (иначе FORBIDDEN) и параметры
фильтра (enum Status, DealCompletedTo > DealCompletedFrom, paging — иначе ValidationError); прочитать
страницу начислений по фильтрам PartnerUserId / DeveloperCompanyId / Status / границы
DealCompletedAt (логическое И; опорные индексы — ix_referral_accruals_partner,
ix_referral_accruals_developer, ix_referral_accruals_status,
ix_referral_accruals_deal_completed_at) с сортировкой DealCompletedAt DESC; спроецировать в
ReferralAccrualModel и вернуть 200. Чтение строго согласовано с записью: авто-апрув по регистрации
акта виден в реестре сразу.
Ошибки и failure modes
Специфичных REWARDS_*-кодов у read-операции нет; общие коды (ValidationError 400 — Status вне enum,
границы периода перепутаны, PageSize вне 1..100; FORBIDDEN 403; UNAUTHORIZED 401) — дом
README.md «Общие ошибки».
Acceptance criteria
- AC-1 (реестр). Given есть начисления в разных статусах по нескольким партнёрам; When
Менеджер ПИН запрашивает список без фильтров; Then
200, начисления поDealCompletedAtDESC, у каждого — партнёр, застройщик,Amount, снапшот ставки (Scope,Percent), статус и даты переходов;InvestorUserIdотсутствует. - AC-2 (фильтры). Given те же данные; When заданы
PartnerUserIdи/илиDeveloperCompanyIdи/илиStatus = Approvedи/или границы периода; Then в выдаче только строки под все условия одновременно;DealCompletedFromвключителен,DealCompletedToисключителен. - AC-3 (готовые к выплате). Given фильтр
Status = Approved; Then видны кандидаты в реферальное поручение; у уже включённыхPayoutOrderItemId != null— оператор видит, какие начисления свободны. - AC-4 (пустой результат). Given нет начислений под фильтр или
Pageза последней страницей; Then200,Items = [], корректныйTotalCount(не404). - AC-5 (валидация фильтра). Given
Statusвне enum илиDealCompletedTo <= DealCompletedFrom; ThenValidationError(400). - AC-6 (доступ). Given актор без
rewards.accruals.manage(в т.ч. руководитель агентства, менеджер застройщика, сам партнёр); When запрос; ThenFORBIDDEN(403) — платформенный реестр; партнёру доступна только собственная выборка partner-области (record-levelPartnerUserId). - AC-7 (свежесть). Given только что зарегистрирован акт поступления
(register-platform-receipt.md); When сразу запрошен реестр; Then
апрувнутые рефералки уже в статусе
Approved(строгая согласованность внутриrewards).
Совместимость и наблюдаемость
ReferralAccrualModel— дом этого документа: новые optional-поля — additive; удаление/переименование/ смена типа — breaking. Новые значенияReferralAccrualStatus/ReferralCancelReason— по unknown-enum-правилу.- Logs: фильтры (
PartnerUserId,DeveloperCompanyId,Status, границы),TotalCount(суммы не логируются); metrics:rewards_api_request_duration_seconds{route}; traces: OTel, correlation черезtraceparent; dashboardrewards-overview. - НФТ (ADR-0056): начислений — доли завершённых сделок (десятки тысяч в год); выборка по btree-индексам; целевая латентность p95 < 250 мс; частота обращений низкая (back-office Менеджера ПИН).
Обратные ссылки
Автоссылки: где используется этот документ.
- Домен (CQRS) (1): Entity / Aggregate: ReferralAccrualEntity
- API (3): POST /api/v1/platform/referral-accruals/{accrualId}/adjust — Корректировка суммы реферального начисления, POST /api/v1/platform/referral-accruals/{accrualId}/cancel — Ручная отмена реферального начисления, Rewards API — реестр операций и общие контрактные модели
- Use Cases (3): UC-RWD-009. Жизненный цикл реферального начисления (связь → начисление → гейт → выплата), UC-RWD-014. ПИН корректирует размер реферального вознаграждения партнёра, US-реестр: Финансовый блок ПИН (US-FIN)
- registries (1): Реестр API-методов PIN
Связанные документы
- Сущность, статусы и инварианты: domain/referral-accrual.md (INV-RA-1..5); ставка и резолюция: domain/referral-rate-rule.md.
- Мутации: cancel-referral-accrual.md (ручная отмена); выплата: create-referral-payout-order.md, mark-referral-payout-order-paid.md.
- Гейт апрува: register-platform-receipt.md (
Pending → Approved). - Paging-конвенция, Masking-правила и общие ошибки: README.md.
- ADR-0066 (реферальные ставки и начисления), ADR-0056 (simplicity-first).