GET /api/v1/platform/referral-payout-orders — Список реферальных платёжных поручений
Постраничная история реферальных выплат платформы: поручения Kind = ReferralReward (tenant — компания
ПИН) с номерами, периодами, суммами и статусами (ожидается / выплачено / отклонено) —
domain/payout-order.md. Агентский аналог —
../agency/list-payout-orders.md.
Назначение
Оператор ПИН просматривает реферальные поручения: черновики в работе, переданные в бухгалтерию
(PendingPayment), выплаченные (Paid) и отклонённые (Rejected) — с фильтрами по статусу и периоду.
Партнёр видит только свои начисления и выплаты по rewards.referral.view-own (record-level, partner-область).
Feature group — referral-payouts.
Metadata
| Поле | Значение |
|---|---|
| Сервис/контекст | rewards |
| API area | platform |
| Feature group | referral-payouts |
| Статус | draft |
| Документ | docs/06-services/rewards/api/platform/list-referral-payout-orders.md |
Актор и доступ
| Проверка | Значение |
|---|---|
| Actor type | User (оператор ПИН) |
| Auth policy / Permissions | rewards.payouts.manage (платформенный scope) |
| Scope (RBAC) | платформа |
| Tenant isolation | выборка ограничена tenant-ом компании ПИН и Kind = ReferralReward — агентские поручения в этой области не отдаются (и наоборот: реферальные не видны agency-области) |
| Audit | read-sensitive (суммы выплат): в trace — actor + фильтры + TotalCount; суммы не логируются |
HTTP-контракт
| Поле | Значение |
|---|---|
| Method | GET |
| Route | /api/v1/platform/referral-payout-orders |
| Success status | 200 |
| Correlation | сквозной trace через заголовок traceparent |
Входные данные / параметры запроса
| Поле | Источник | Тип | Обязательность | Валидация / Ограничения | Безопасность |
|---|---|---|---|---|---|
Status | query | PayoutOrderStatus? | Нет | enum Draft/PendingPayment/Paid/Rejected/Cancelled | — |
CreatedFrom | query | DateTimeOffset? | Нет | нижняя граница CreatedAt (включительно) | — |
CreatedTo | query | DateTimeOffset? | Нет | верхняя граница CreatedAt (исключительно); > CreatedFrom, если обе заданы | — |
PeriodTo | query | DateTimeOffset? | Нет | фильтр по концу расчётного периода: PayoutOrder.PeriodTo <= PeriodTo | — |
Page / PageSize | query | int | Нет | paging-конвенция — README.md (Page >= 1, PageSize 1..100) | — |
Модель ответа — постраничный список PayoutOrderModel
Постраничный ответ: Items (список PayoutOrderModel), Page, PageSize, TotalCount. Проекция
PayoutOrderModel — дом README.md «Общие контрактные модели».
Дельта проекции для списка: у всех строк Kind = ReferralReward; позиции (PayoutOrderItemModel,
RecipientUserId = партнёр) в списке отдаются пустой коллекцией — детализация состава загружается
запросом одного поручения (используется операциями утверждения/выплаты:
approve-referral-payout-order.md,
mark-referral-payout-order-paid.md).
Алгоритм
Тривиальное постраничное чтение: проверить право rewards.payouts.manage платформенного scope (иначе
FORBIDDEN) и параметры фильтра (enum Status, CreatedTo > CreatedFrom, paging — иначе
ValidationError); прочитать страницу поручений tenant-а ПИН с Kind = ReferralReward по фильтрам
(Status, границы CreatedAt, PeriodTo) с сортировкой CreatedAt DESC (опорные индексы —
ix_payout_orders_tenant_kind, ix_payout_orders_tenant_status, ix_payout_orders_created_at);
спроецировать в PayoutOrderModel (Items = []) и вернуть 200. Чтение строго согласовано с записью:
только что утверждённое/выплаченное поручение сразу видно с новым статусом.
Ошибки и failure modes
Специфичных REWARDS_*-кодов у read-операции нет; общие коды (ValidationError 400 — Status вне enum,
CreatedTo <= CreatedFrom, PageSize вне 1..100; FORBIDDEN 403; UNAUTHORIZED 401) — дом
README.md «Общие ошибки».
Acceptance criteria
- AC-1 (история реферальных выплат). Given у платформы есть реферальные поручения в разных
статусах; When оператор запрашивает список без фильтра; Then
200, поручения поCreatedAtDESC, у каждого —Number,Kind = ReferralReward,Status,PeriodFrom/To,TotalAmount,ItemsCount, даты переходов;Items = []. - AC-2 (фильтры). Given те же данные; When
Status = Paidи/или границыCreatedFrom/CreatedTo(илиPeriodTo); Then в выдаче только строки под все условия;CreatedFromвключителен,CreatedToисключителен. - AC-3 (изоляция видов). Given есть агентские поручения (
Kind = AgencyCommission) разных агентств; When запрошен список; Then их в выдаче нет — область отдаёт только реферальные поручения tenant-а ПИН. - AC-4 (детализация — отдельным запросом). Given строка с
ItemsCount = 7; When оператор открывает поручение; Then позиции по партнёрам грузятся запросом одного поручения (в спискеItems = []). - AC-5 (пустой результат / валидация). Given нет поручений под фильтр или
Pageза последней —200,Items = [], корректныйTotalCount; GivenStatusвне enum илиCreatedTo <= CreatedFrom—ValidationError(400). - AC-6 (доступ). Given актор без
rewards.payouts.manageплатформенного scope (в т.ч. руководитель агентства, партнёр); When запрос; ThenFORBIDDEN(403); партнёру — только его собственные начисления/выплаты через partner-область (record-levelPartnerUserId). - AC-7 (свежесть). Given поручение только что выплачено
(mark-referral-payout-order-paid.md); When сразу запрошен
список; Then статус
Paidуже виден (строгая согласованность чтения внутриrewards).
Совместимость и наблюдаемость
PayoutOrderModel— общая проекция из README.md: новые optional-поля — additive; новые значенияPayoutOrderStatus/PayoutOrderKind— по unknown-enum-правилу.- Logs: фильтры (
Status, границы дат),TotalCount(суммы не логируются); metrics:rewards_api_request_duration_seconds{route}; traces: OTel, correlation черезtraceparent; dashboardrewards-overview. - НФТ (ADR-0056): единицы реферальных поручений в месяц — история измеряется десятками строк в год; выборка без джойна позиций; целевая латентность p95 < 250 мс.
Обратные ссылки
Автоссылки: где используется этот документ.
- API (4): POST /api/v1/platform/referral-payout-orders — Создание реферального платёжного поручения, POST /api/v1/platform/referral-payout-orders/{orderId}/approve — Утверждение реферального поручения, POST /api/v1/platform/referral-payout-orders/{orderId}/mark-paid — Отметка о выплате реферального поручения, Rewards API — реестр операций и общие контрактные модели
- Use Cases (1): US-реестр: Финансовый блок ПИН (US-FIN)
- registries (1): Реестр API-методов PIN
Связанные документы
- Сущность и статусная модель: domain/payout-order.md
(
PayoutOrderKind = ReferralReward). - Создание и переходы: create-referral-payout-order.md (+ cancel), approve-referral-payout-order.md, mark-referral-payout-order-paid.md (+ reject).
- Источник строк: domain/referral-accrual.md.
- Агентский аналог: ../agency/list-payout-orders.md.
- Проекция и paging-конвенция: README.md.