Отчет/Export: Сводка реферальных вознаграждений за период (referral-rewards-period-summary)
XLSX-выгрузка реферальных вознаграждений: строка = один партнёр за период — число начислений, начислено
(всего), ожидает подтверждения (Pending), одобрено к выплате (Approved), выплачено (Paid); плюс
итоговая строка по всем партнёрам выборки. Генерируется асинхронной задачей
(../api/partner/create-referral-rewards-export.md,
ReportType = PeriodSummary) по конвейеру
ADR-0041.
Назначение
Даёт сводную картину реферальных вознаграждений за период: кто из партнёров сколько заработал и на какой
стадии находятся суммы (ожидает денег застройщика / одобрено / выплачено). Аудитория двойная: партнёр видит
свою единственную строку (личный итог за период), Менеджер ПИН — все строки (планирование
реферальных выплат, оценка эффективности партнёрской программы). Детальная раскладка по сделкам — парный
отчёт referral-rewards-by-partner.md. Owning service — rewards.
Классификация
| Поле | Значение |
|---|---|
| Тип отчета | XLSX |
| Аудитория | реферальный партнёр (свой итог) / Менеджер ПИН (все партнёры) |
| Чувствительность | Financial/Sensitive — суммы вознаграждений и персональные итоги партнёров; PII приведённых инвесторов не выгружается |
| Freshness SLA | состояние rewards на момент генерации (строго согласованный снапшот OLTP) |
| Retention | файл — 7 дней в приватном объектном хранилище; данные-источник — бессрочно (финансовая история) |
Доступ
Реферальные начисления вне tenant-модели (../domain/referral-accrual.md): scope разрешается по permission актора.
| Actor | Permission | Область выборки | Audit |
|---|---|---|---|
| реферальный партнёр | rewards.referral.view-own | record-level: только PartnerUserId = ActorUserId (одна строка) | ExportSensitive — постановка, выдача ссылки, исход генерации |
| Менеджер ПИН | rewards.commission.view-all | платформенный scope: все партнёры; опциональный фильтр PartnerUserId | ExportSensitive — постановка, выдача ссылки, исход генерации |
Исходные Source Data
| Источник | Владелец | Тип | Freshness | Join key |
|---|---|---|---|---|
rewards.referral_accruals | rewards | source of truth | строго согласовано | DealCompletedAt (период), группировка по PartnerUserId |
Пользователи identity (ФИО партнёров) | identity | enrichment при генерации (не хранится в rewards) | на момент генерации | PartnerUserId |
Фильтры ReferralRewardsPeriodSummaryFilterModel
Снимаются с задачи выгрузки (../api/partner/create-referral-rewards-export.md);
фильтр Status к сводному отчёту не применяется (строка и так раскладывает суммы по стадиям) — заданный
Status игнорируется с warn-логом.
| Поле | Тип | Обязательность | Default | Ограничения |
|---|---|---|---|---|
ActorUserId | Guid | Да | identity claims | Required; не из UI |
Scope | string (own/all) | Да | по permission актора | own для rewards.referral.view-own; all для rewards.commission.view-all |
PeriodFrom | DateTimeOffset | Да | — | начисления: DealCompletedAt >= PeriodFrom |
PeriodTo | DateTimeOffset | Да | — | > PeriodFrom (исключительно); диапазон ≤ 1 года |
PartnerUserId | Guid? | Нет | все партнёры (только Scope = all) | при Scope = own игнорируется и жёстко замещается ActorUserId |
Строка Отчета ReferralRewardsPeriodSummaryRowModel
Одна строка = один партнёр (PartnerUserId), по которому за период есть хотя бы одно начисление.
Отменённые начисления (Cancelled) в суммы не входят — только в справочный счётчик. Все суммы — в валюте
начислений (CurrencyId, RUB-only по ADR-0048).
| Поле | Тип | Обязательность | Расчет | Masking |
|---|---|---|---|---|
PartnerFullName | string | Да | enrichment identity по PartnerUserId (на момент генерации) | — |
AccrualsCount | int | Да | count начислений партнёра за период со статусом ≠ Cancelled | — |
CancelledCount | int | Да | count отменённых начислений (справочно) | — |
AccruedTotal | decimal | Да | Σ Amount начислений (≠ Cancelled) — «начислено всего» | Financial |
PendingTotal | decimal | Да | Σ Amount начислений в Pending — «ожидает подтверждения» (деньги от застройщика ещё не получены) | Financial |
ApprovedTotal | decimal | Да | Σ Amount начислений в Approved — «одобрено к выплате» (гейт ADR-0067 пройден, ещё не выплачено) | Financial |
PaidTotal | decimal | Да | Σ Amount начислений в Paid — «выплачено» | Financial |
Контроль сходимости строки: PendingTotal + ApprovedTotal + PaidTotal = AccruedTotal (каждое неотменённое
начисление ровно в одной стадии).
Модель Totals ReferralRewardsPeriodSummaryTotalsModel
Итог по выборке = суммирование колонок всех строк (строка «Итого» под таблицей).
| Поле | Тип | Обязательность | Расчет | Precision |
|---|---|---|---|---|
PartnersCount | int | Да | count строк (партнёров с начислениями за период) | целое |
AccrualsCount | int | Да | Σ AccrualsCount | целое |
AccruedTotal | decimal | Да | Σ AccruedTotal | scale 2, banker's |
PendingTotal | decimal | Да | Σ PendingTotal | scale 2 |
ApprovedTotal | decimal | Да | Σ ApprovedTotal | scale 2 |
PaidTotal | decimal | Да | Σ PaidTotal | scale 2 |
CancelledCount | int | Да | Σ CancelledCount | целое |
Контроль сходимости totals: PendingTotal + ApprovedTotal + PaidTotal = AccruedTotal.
Формат Export-а
Лист XLSX summary; заголовки русские; суммы — числовой формат scale 2; шапка листа — период, область
выборки (свои / все партнёры), время генерации (UTC).
| Column | Заголовок | Тип | Формат | Nullable | Источник |
|---|---|---|---|---|---|
PartnerFullName | Партнёр | string | текст | Нет | ReferralRewardsPeriodSummaryRowModel.PartnerFullName |
AccrualsCount | Начислений | int | # ##0 | Нет | .AccrualsCount |
AccruedTotal | Начислено всего | decimal | # ##0.00 | Нет | .AccruedTotal |
PendingTotal | Ожидает подтверждения | decimal | # ##0.00 | Нет | .PendingTotal |
ApprovedTotal | Одобрено к выплате | decimal | # ##0.00 | Нет | .ApprovedTotal |
PaidTotal | Выплачено | decimal | # ##0.00 | Нет | .PaidTotal |
CancelledCount | Отменено (шт.) | int | # ##0 | Нет | .CancelledCount |
Сортировка строк: AccruedTotal DESC (самые результативные партнёры сверху), затем PartnerFullName ASC.
Для партнёра (Scope = own) выборка — ровно одна строка.
Процесс Генерации
- Постановка задачи, разрешение scope по permission, лимиты, audit — ../api/partner/create-referral-rewards-export.md.
- Фоновый исполнитель читает начисления за период (record-level
PartnerUserIdприown; опциональныйPartnerUserIdприall), агрегирует поPartnerUserId— согласованный снапшот. - Обогащение ФИО партнёров из
identity(batch по уникальным id; не найден — id в ячейку, warn-лог). - Проверка лимита строк (≤ 100 000 — для сводки практически недостижим: строк ≤ числа партнёров).
- Формирование строк и totals; контроль сходимости каждой строки и totals (расхождение — дефект
целостности, задача →
Failed, алерт). - Сериализация XLSX → приватное объектное хранилище (retention 7 дней); задача →
Completed; финальная audit-запись. Скачивание — ../api/partner/get-referral-rewards-export-job.md.
Лимиты
| Лимит | Значение | Ошибка |
|---|---|---|
| Max rows | 100 000 строк | REWARDS_EXPORT_ROW_LIMIT_EXCEEDED (задача Failed) |
| Max date range | 1 год | REWARDS_EXPORT_PERIOD_TOO_WIDE (400 на постановке) |
| Concurrent exports | 2 активные задачи на актора | REWARDS_EXPORT_CONCURRENCY_LIMIT (429 на постановке) |
| Форматы | XLSX | — |
Наблюдаемость
| Тип | Правило |
|---|---|
| Metrics | rewards_export_duration_seconds, rewards_export_rows, rewards_export_jobs_total{report_type=referral_period_summary,result} |
| Logs | постановка / генерация / выдача ссылки / истечение / отказ — с актором, scope и фильтрами; суммы не логируются (Financial) |
| Traces | traceparent, ActorUserId, JobId |
| Audit | ExportSensitive на постановку, выдачу ссылки и исход генерации |
Обратные ссылки
Автоссылки: где используется этот документ.
- API (3): GET /api/v1/my/referral-accruals — Мои реферальные начисления (партнёр), GET /api/v1/referral-rewards-exports/{jobId} — Статус выгрузки и ссылка на скачивание, POST /api/v1/referral-rewards-exports — Постановка Excel-выгрузки реферальных вознаграждений
- Use Cases (1): US-реестр: Реферальный партнёр (US-PRT)
- Отчёты (1): Отчет/Export: Реферальные вознаграждения по партнёрам (referral-rewards-by-partner)
- index.md (1): Rewards Service
Связанные документы
- Операции конвейера: ../api/partner/create-referral-rewards-export.md, ../api/partner/get-referral-rewards-export-job.md.
- Детальный отчёт: referral-rewards-by-partner.md.
- Дом полей и статусная модель: ../domain/referral-accrual.md; онлайн-аналог для партнёра — ../api/partner/list-my-referral-accruals.md.
- ADR-0041, ADR-0066, ADR-0067
(гейт
MoneyReceived→Approved), ADR-0048 (RUB-only), ADR-0052 (tenancy — платформенная сущность).