GET /api/v1/my/referral-accruals — Мои реферальные начисления (партнёр)
Постраничный список реферальных начислений текущего пользователя-партнёра (../../domain/referral-accrual.md): сколько и по каким сделкам приведённых им инвесторов начислено, что уже одобрено к выплате (деньги от застройщика получены) и что выплачено.
Назначение
Реферальный партнёр в личном кабинете видит свои вознаграждения и их статусы: «начислено» (Pending),
«одобрено» (Approved — гейт получения денег пройден, ADR-0067), «выплачено» (Paid), «отменено»
(Cancelled). Личные данные приведённых инвесторов партнёру не раскрываются. Feature group —
my-referral.
Metadata
| Поле | Значение |
|---|---|
| Сервис/контекст | rewards |
| API area | partner |
| Feature group | my-referral |
| Статус | draft |
| Документ | docs/06-services/rewards/api/partner/list-my-referral-accruals.md |
Актор и доступ
| Проверка | Значение |
|---|---|
| Actor type | User (реферальный партнёр — любой авторизованный пользователь с реферальными начислениями; компания не требуется) |
| Auth policy / Permissions | rewards.referral.view-own |
| Scope (RBAC) | платформа (реферальные начисления — вне tenant-модели, ../../domain/referral-accrual.md) |
| Record-level | PartnerUserId = ActorUserId — выборка жёстко ограничена начислениями самого актора (фильтр из claims, не из query) |
| Audit | none (read собственных данных; суммы — Sensitive, не логируются) |
HTTP-контракт
| Поле | Значение |
|---|---|
| Method | GET |
| Route | /api/v1/my/referral-accruals |
| Success status | 200 |
| Idempotency header | не применяется (read) |
| Correlation | сквозной trace через заголовок traceparent |
Входные данные / параметры запроса
| Поле | Источник | Тип | Обязательность | Валидация / Ограничения | Безопасность |
|---|---|---|---|---|---|
ActorUserId | identity claims (sub) | Guid | Да | Required; используется как PartnerUserId выборки | record-level |
Status | query | string? (enum ReferralAccrualStatus) | Нет | Pending/Approved/Paid/Cancelled; пусто = все | — |
PeriodFrom | query | DateTimeOffset? | Нет | фильтр по DealCompletedAt >= PeriodFrom | — |
PeriodTo | query | DateTimeOffset? | Нет | PeriodTo > PeriodFrom, если оба заданы; DealCompletedAt < PeriodTo | — |
Page / PageSize | query | int | Нет | paging-конвенция — README.md | — |
Модель ответа — постраничный список ReferralAccrualModel
Постраничный ответ (Items, Page, PageSize, TotalCount — paging-конвенция
README.md); дом модели ReferralAccrualModel — README.md («Общие
контрактные модели»). Masking для партнёра: InvestorUserId не отдаётся (PII приведённого инвестора —
../../domain/referral-accrual.md, «Permissions / PII»); партнёр видит
основание (BondId), сделку (DealId — без деталей), застройщика, применённый процент из снапшота
ставки, сумму и статусные даты.
Алгоритм
Тривиальное постраничное чтение: проверить Status/PeriodFrom/PeriodTo/Page/PageSize (иначе
ValidationError); выбрать начисления с PartnerUserId = ActorUserId (record-level из claims), применить
опциональные фильтры по статусу и периоду DealCompletedAt; сортировка — DealCompletedAt DESC (свежие
сделки выше); спроецировать в ReferralAccrualModel (применённый процент — из AppliedRateSnapshot;
InvestorUserId не проецируется). Пустая страница у пользователя без начислений — валидный ответ
(Items = [], TotalCount = 0), не ошибка. Данные строго согласованы внутри rewards: статусы отражают
последнюю регистрацию акта/выплату немедленно (агрегатное чтение OLTP, без eventual-consistency).
Ошибки и failure modes
Специфичных REWARDS_*-кодов у read-операции нет. Применяются общие коды — дом
README.md «Общие ошибки»:
| Код | HTTP status | Условие | Сообщение | Retry |
|---|---|---|---|---|
ValidationError | 400 | Status вне enum; PeriodTo <= PeriodFrom; PageSize вне 1..100 | «Проверьте параметры фильтра» | no retry |
UNAUTHORIZED | 401 | нет/просрочен JWT | «Требуется авторизация» | no retry |
FORBIDDEN | 403 | нет rewards.referral.view-own | «Недостаточно прав» | no retry |
Acceptance criteria
- AC-1 (мои начисления). Given у партнёра есть начисления в разных статусах; When
GETбез фильтров; Then200, только начисления сPartnerUserId = актор, отсортированы поDealCompletedAtDESC; в каждой строке —Amount, применённыйPercent, статус и даты (ApprovedAt/PaidAt/CancelledAt);InvestorUserIdотсутствует в payload. - AC-2 (фильтр по статусу). Given те же данные; When
GETсStatus = Approved; Then только начисления, одобренные к выплате (деньги от застройщика получены). - AC-3 (фильтр по периоду, границы). Given начисления с
DealCompletedAt == PeriodFromи== PeriodTo; WhenGETс периодом; Then первое в выдаче (нижняя граница включительна), второе — нет (верхняя исключительна). - AC-4 (record-level). Given в системе есть начисления других партнёров; When
GET; Then чужие начисления не возвращаются ни при каких параметрах query —PartnerUserIdберётся из claims. - AC-5 (пусто). Given у пользователя нет начислений; When
GET; Then200,Items = [],TotalCount = 0(не404). - AC-6 (свежесть). Given только что зарегистрирован акт поступления средств по родительскому
начислению; When сразу
GET; Then начисление ужеApprovedcApprovedAt(строгая согласованность внутриrewards).
Совместимость и наблюдаемость
- Новые optional поля
ReferralAccrualModel— additive; новые значенияReferralAccrualStatusв фильтре — по unknown-enum-правилу (ValidationError); удаление/переименование полей — breaking. - Logs:
ActorUserId, применённые фильтры,TotalCount(суммы не логируются — Sensitive); metrics:rewards_api_request_duration_seconds{route}; traces: OTel, correlation черезtraceparent. - НФТ (ADR-0056): выборка по
ix_referral_accruals_partner(partner_user_id, status); единицы–десятки строк на партнёра; целевая латентность p95 < 200 мс.
Обратные ссылки
Автоссылки: где используется этот документ.
- API (2): POST /api/v1/referral-rewards-exports — Постановка Excel-выгрузки реферальных вознаграждений, Rewards API — реестр операций и общие контрактные модели
- Use Cases (3): UC-RWD-009. Жизненный цикл реферального начисления (связь → начисление → гейт → выплата), UC-RWD-014. ПИН корректирует размер реферального вознаграждения партнёра, US-реестр: Реферальный партнёр (US-PRT)
- Отчёты (2): Отчет/Export: Реферальные вознаграждения по партнёрам (referral-rewards-by-partner), Отчет/Export: Сводка реферальных вознаграждений за период (referral-rewards-period-summary)
- registries (1): Реестр API-методов PIN
- index.md (1): Rewards Service
Связанные документы
- Сущность, статусы и PII-правила: ../../domain/referral-accrual.md; ставка и снапшот — ../../domain/referral-rate-rule.md.
- Гейт получения денег (
Approved): ../../domain/platform-receipt.md, ADR-0067; выплата — ../../domain/payout-order.md (PayoutOrderKind = ReferralReward). - Основание — реферальная связь: ../../../referral/domain/referral-bond.md.
- Excel-выгрузка своих реферальных вознаграждений: create-referral-rewards-export.md, get-referral-rewards-export-job.md; контракты отчётов — ../../reports/referral-rewards-by-partner.md, ../../reports/referral-rewards-period-summary.md.
- Общие модели/ошибки/paging: README.md.