Отчет/Export: Сводка вознаграждений агентства за период (agency-rewards-period-summary)
XLSX-выгрузка агентства: строка = один агент за период — число сделок, начислено (gross), доля агента,
удержано агентством, разбивка доли агента по стадиям (подтверждено / получено / выплачено), ожидает
подтверждения; плюс итоговая строка по агентству. Генерируется асинхронной задачей
(../api/agency/create-rewards-export.md,
ReportType = PeriodSummary) по конвейеру
ADR-0041.
Назначение
Даёт владельцу/руководителю агентства сводную картину за период: кто из агентов сколько принёс и
сколько ему причитается/выплачено, сколько агентство удержало себе. Decision value — расчёт зарплатных
итогов, оценка эффективности агентов, планирование выплат. Детальная раскладка по сделкам — парный отчёт
agency-rewards-by-employee-per-deal.md. Owning service —
rewards.
Классификация
| Поле | Значение |
|---|---|
| Тип отчета | XLSX |
| Аудитория | владелец/руководитель агентства |
| Чувствительность | Financial/Sensitive — суммы вознаграждений и персональные итоги агентов; PII инвесторов не выгружается |
| Freshness SLA | состояние rewards на момент генерации (строго согласованный снапшот OLTP) |
| Retention | файл — 7 дней в приватном объектном хранилище; данные-источник — бессрочно (финансовая история) |
Доступ
| Actor | Permission | Tenant/Brand scope | Audit |
|---|---|---|---|
| владелец/руководитель агентства | rewards.commission.view-all | TenantId = CompanyId агентства из claims; fail-closed | ExportSensitive — постановка, выдача ссылки, исход генерации |
Исходные Source Data
| Источник | Владелец | Тип | Freshness | Join key |
|---|---|---|---|---|
rewards.commission_accruals | rewards | source of truth | строго согласовано | TenantId + DealCompletedAt (период), группировка по AgentUserId |
rewards.commission_distributions | rewards | source of truth (строки Agent/Agency — ../domain/commission-accrual.md) | строго согласовано | AccrualId |
Пользователи identity (ФИО агентов) | identity | enrichment при генерации (не хранится в rewards) | на момент генерации | AgentUserId |
Фильтры AgencyRewardsPeriodSummaryFilterModel
Снимаются с задачи выгрузки (../api/agency/create-rewards-export.md);
фильтр Status к сводному отчёту не применяется (строка и так раскладывает суммы по стадиям) — заданный
Status игнорируется с warn-логом.
| Поле | Тип | Обязательность | Default | Ограничения |
|---|---|---|---|---|
TenantId | Guid | Да | identity claims | Required; не из UI |
PeriodFrom | DateTimeOffset | Да | — | начисления: DealCompletedAt >= PeriodFrom |
PeriodTo | DateTimeOffset | Да | — | > PeriodFrom (исключительно); диапазон ≤ 1 года |
AgentUserId | Guid? | Нет | все агенты | сводка только по этому агенту (одна строка) |
Строка Отчета AgencyRewardsPeriodSummaryRowModel
Одна строка = один агент (AgentUserId), по которому за период есть хотя бы одно начисление.
Отменённые начисления (Cancelled) в суммы не входят — только в справочный счётчик. Все суммы — в валюте
начислений (CurrencyId, RUB-only по ADR-0048).
| Поле | Тип | Обязательность | Расчет | Masking |
|---|---|---|---|---|
AgentFullName | string | Да | enrichment identity по AgentUserId (на момент генерации) | — |
DealsCount | int | Да | count начислений агента за период со статусом ≠ Cancelled | — |
CancelledCount | int | Да | count отменённых начислений (справочно) | — |
GrossTotal | decimal | Да | Σ CommissionAmount начислений (≠ Cancelled) — «начислено» | Financial |
AgentShareTotal | decimal | Да | Σ Amount строк Agent (начисления Confirmed/MoneyReceived/Paid) — причитается агенту | Financial |
AgencyRetainedTotal | decimal | Да | Σ Amount строк Agency — «удержано агентством» | Financial |
PendingConfirmationTotal | decimal | Да | Σ CommissionAmount начислений в PendingConfirmation (gross; распределения ещё нет) — «ожидает подтверждения» | Financial |
ConfirmedShareTotal | decimal | Да | Σ Amount строк Agent начислений в Confirmed — «подтверждено, деньги не получены» | Financial |
MoneyReceivedShareTotal | decimal | Да | Σ Amount строк Agent начислений в MoneyReceived — «получено, готово к выплате» (гейт ADR-0067 пройден) | Financial |
PaidShareTotal | decimal | Да | Σ Amount строк Agent начислений в Paid — «выплачено» | Financial |
Контроль сходимости строки: ConfirmedShareTotal + MoneyReceivedShareTotal + PaidShareTotal = AgentShareTotal (доля агента существует только с Confirmed).
Модель Totals AgencyRewardsPeriodSummaryTotalsModel
Итог по агентству = суммирование колонок всех строк (строка «Итого по агентству» под таблицей).
| Поле | Тип | Обязательность | Расчет | Precision |
|---|---|---|---|---|
AgentsCount | int | Да | count строк (агентов с начислениями за период) | целое |
DealsCount | int | Да | Σ DealsCount | целое |
GrossTotal | decimal | Да | Σ GrossTotal | scale 2, banker's |
AgentShareTotal | decimal | Да | Σ AgentShareTotal | scale 2 |
AgencyRetainedTotal | decimal | Да | Σ AgencyRetainedTotal | scale 2 |
PendingConfirmationTotal | decimal | Да | Σ PendingConfirmationTotal | scale 2 |
ConfirmedShareTotal | decimal | Да | Σ ConfirmedShareTotal | scale 2 |
MoneyReceivedShareTotal | decimal | Да | Σ MoneyReceivedShareTotal | scale 2 |
PaidShareTotal | decimal | Да | Σ PaidShareTotal | scale 2 |
Формат Export-а
Лист XLSX summary; заголовки русские; суммы — числовой формат scale 2; шапка листа — период, агентство,
время генерации (UTC).
| Column | Заголовок | Тип | Формат | Nullable | Источник |
|---|---|---|---|---|---|
AgentFullName | Агент | string | текст | Нет | AgencyRewardsPeriodSummaryRowModel.AgentFullName |
DealsCount | Сделок | int | # ##0 | Нет | .DealsCount |
GrossTotal | Начислено (gross) | decimal | # ##0.00 | Нет | .GrossTotal |
AgentShareTotal | Доля агента | decimal | # ##0.00 | Нет | .AgentShareTotal |
AgencyRetainedTotal | Удержано агентством | decimal | # ##0.00 | Нет | .AgencyRetainedTotal |
PendingConfirmationTotal | Ожидает подтверждения | decimal | # ##0.00 | Нет | .PendingConfirmationTotal |
ConfirmedShareTotal | Подтверждено | decimal | # ##0.00 | Нет | .ConfirmedShareTotal |
MoneyReceivedShareTotal | Получено | decimal | # ##0.00 | Нет | .MoneyReceivedShareTotal |
PaidShareTotal | Выплачено | decimal | # ##0.00 | Нет | .PaidShareTotal |
CancelledCount | Отменено (шт.) | int | # ##0 | Нет | .CancelledCount |
Сортировка строк: AgentShareTotal DESC (самые результативные агенты сверху), затем AgentFullName ASC.
Процесс Генерации
- Постановка задачи, permission
rewards.commission.view-all, tenant scope, лимиты, audit — ../api/agency/create-rewards-export.md. - Фоновый исполнитель читает начисления tenant-а за период со строками распределения (согласованный
снапшот), агрегирует по
AgentUserId. - Обогащение ФИО агентов из
identity(batch по уникальным id; не найден — id в ячейку, warn-лог). - Проверка лимита строк (≤ 100 000 — для сводки практически недостижим: строк ≤ числа агентов агентства).
- Формирование строк и totals; контроль сходимости каждой строки и totals (расхождение — дефект
целостности, задача →
Failed, алерт). - Сериализация XLSX → приватное объектное хранилище (retention 7 дней); задача →
Completed; финальная audit-запись. Скачивание — ../api/agency/get-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=period_summary,result} |
| Logs | постановка / генерация / выдача ссылки / истечение / отказ — с актором и фильтрами; суммы не логируются (Financial) |
| Traces | traceparent, TenantId, JobId |
| Audit | ExportSensitive на постановку, выдачу ссылки и исход генерации |
Обратные ссылки
Автоссылки: где используется этот документ.
- API (2): GET /api/v1/agency/rewards-exports/{jobId} — Статус выгрузки и ссылка на скачивание, POST /api/v1/agency/rewards-exports — Постановка Excel-выгрузки вознаграждений агентства
- Use Cases (2): UC-RWD-012. Владелец агентства выгружает отчёты по вознаграждениям в Excel, US-реестр: Владелец агентства (US-OWN-AG)
- Отчёты (1): Отчет/Export: Вознаграждения агентства по сотрудникам и сделкам (agency-rewards-by-employee-per-deal)
- index.md (1): Rewards Service
Связанные документы
- Операции конвейера: ../api/agency/create-rewards-export.md, ../api/agency/get-rewards-export-job.md.
- Детальный отчёт: agency-rewards-by-employee-per-deal.md.
- Дом полей и статусная модель: ../domain/commission-accrual.md; онлайн-аналог сводки — ../api/agency/get-agency-commission-summary.md.
- ADR-0041, ADR-0066, ADR-0067, ADR-0048 (RUB-only), ADR-0052 (tenancy).