Entity / Aggregate: ReferralAccrualEntity
Дом полей агрегата «Реферальное начисление» контекста rewards. Проекции (реестр реферальных начислений
platform-API, «мои реферальные начисления» партнёра, payload событий, позиции реферальных поручений)
ссылаются сюда и описывают только дельту.
Назначение
ReferralAccrualEntity — начисление реферального вознаграждения партнёру по завершённой сделке
приведённого им инвестора: фиксирует основание (активная реферальная связь —
../../referral/domain/referral-bond.md), применённую ставку
(referral-rate-rule.md) и сумму Amount = FinalPrice × Percent / 100. Сумма
корректируема first-class путём до выплаты (обязательная причина + append-only аудит-строка
ReferralAccrualAdjustmentEntity, INV-RA-6, ADR-0067
п.4) — не отменой начисления и не правкой ставки на будущее.
Это отдельная сущность, а не kind-дискриминатор на комиссионном начислении
(ADR-0066):
другой получатель (партнёр-пользователь, не агент/агентство), нет распределения по политике агентства,
собственный жизненный цикл. Создаётся consumer-ом события pin.crm.deal-completed.v1
(../consumers/crm-deal-completed.md) в статусе Pending;
переходит в Approved автоматически при переходе родительского комиссионного начисления в
MoneyReceived — регистрация акта поступления средств (platform-receipt.md,
гейт ADR-0067); выплачивается через
реферальное платёжное поручение (PayoutOrderKind = ReferralReward, tenant — ПИН,
payout-order.md).
Классификация
| Поле | Значение |
|---|---|
| Контекст | rewards |
| Kind | AggregateRoot (+ дочерняя Entity ReferralAccrualAdjustmentEntity внутри границы агрегата) |
| Source of truth | rewards (суммы/статусы); связь — реплика referral, сделка — реплика-ссылка на crm |
| Таблица | rewards.referral_accruals |
| Tenant isolation | вне tenant-модели — получатель PartnerUserId может не иметь компании; процесс выплаты ведёт ПИН (платформенный scope, ADR-0052). Партнёр — record-level по PartnerUserId |
Поля
| Поле | Тип | Обязательность | Ограничения (PK/FK/index/constraint) | Источник | Описание |
|---|---|---|---|---|---|
Id | Guid | Да | PK | app | Уникальный идентификатор начисления. |
DealId | Guid | Да | unique ux_referral_accruals_deal_id — одно реферальное начисление на сделку, бизнес-идемпотентность consumer-а (INV-RA-1) | payload deal-completed | Ссылка на сделку crm. Логическая, без FK. |
BondId | Guid | Да | index ix_referral_accruals_bond_id; логическая ссылка на реплику связей rewards.referral_bond_replicas (consumer ../consumers/referral-bond.md — по конвенции) | реплика связей | Реферальная связь — основание начисления. |
PartnerUserId | Guid | Да | index ix_referral_accruals_partner (partner_user_id, status) — record-level «свои начисления» | реплика связей (ReferrerUserId) | Партнёр — получатель вознаграждения. |
InvestorUserId | Guid | Да | — | payload | Приведённый инвестор — покупатель по сделке (= ReferredUserId связи); трассировка. |
DeveloperCompanyId | Guid | Да | index ix_referral_accruals_developer | payload | Застройщик сделки — измерение резолюции ставки. |
CommissionAccrualId | Guid? | Нет | FK fk_referral_accruals_commission_accrual → rewards.commission_accruals.id (restrict), index | consumer | Родительское комиссионное начисление той же сделки (commission-accrual.md). null — родитель не создан (нет правила застройщика); заполняется при появлении родителя (ручное начисление по той же DealId) — без родителя гейт денег непроходим, начисление остаётся Pending. |
AppliedRateSnapshot | AppliedRateSnapshotDocument (jsonb) | Да | jsonb, typed, ContractVersion | резолюция ставки | Снапшот применённой ставки на момент CompletedAt — ставка может быть потом изменена/архивирована. |
BaseAmount | Money (owned) | Да | см. VO | payload (FinalPrice) | База расчёта — конечная цена сделки. |
Amount | Money (owned) | Да | см. VO; check amount_value > 0 | вычисление | BaseAmount.Value × Percent / 100, округление banker's до 2 знаков (INV-RA-2). После first-class корректировки (INV-RA-6) — скорректированное значение (может расходиться с формулой); исходное — в OriginalAmount. |
OriginalAmount | Money? (owned) | Нет | см. VO | app | Исходная автосчитанная сумма до корректировок; фиксируется один раз — при первой корректировке (INV-RA-6). null — сумма не корректировалась. |
Status | ReferralAccrualStatus | Да | хранится как text, varchar(32), index ix_referral_accruals_status (status) | app | Статус начисления (stateDiagram ниже). |
DealCompletedAt | DateTimeOffset | Да | index ix_referral_accruals_deal_completed_at | payload | Момент завершения сделки; момент asOf резолюции ставки. |
ApprovedAt | DateTimeOffset? | Нет | заполняется при Approve | app | Момент авто-апрува (= момент регистрации акта родителя). |
PaidAt | DateTimeOffset? | Нет | заполняется при выплате поручения | app | Момент выплаты. |
CancelledAt | DateTimeOffset? | Нет | — | app | Момент отмены. |
CancelReason | ReferralCancelReason? | Нет (обязателен при Cancelled) | хранится как text, varchar(32) | app/consumer | Причина отмены (enum ниже). |
PayoutOrderItemId | Guid? | Нет | FK fk_referral_accruals_payout_item → rewards.payout_order_items.id (set null), index where not null | payout | Позиция реферального поручения; null — начисление свободно. |
CreatedAt | DateTimeOffset | Да | index | app | Момент создания (аудит). |
UpdatedAt | DateTimeOffset | Да | — | app | Момент изменения. |
Version | long | Да | >= 1 | app | Доменная версия (инкремент при мутации, попадает в события). |
Enum ReferralAccrualStatus
| Значение | Описание |
|---|---|
Pending | Начислено по завершённой сделке; ожидает получения денег от застройщика по родительскому комиссионному начислению. |
Approved | Родительское начисление перешло в MoneyReceived (акт зарегистрирован) — вознаграждение доступно для включения в реферальное поручение; кошелёк партнёра кредитуется (ADR-0065). |
Paid | Выплачено по реферальному поручению. Терминальный. |
Cancelled | Отменено (причина — CancelReason). Терминальный. |
Enum ReferralCancelReason
| Значение | Описание |
|---|---|
DealCancelled | Сделка отменена/расторгнута в CRM (consumer pin.crm.deal-cancelled.v1 — ../consumers/crm-deal-cancelled.md). |
BondRevoked | Связь отозвана в referral (фрод, ошибка привязки) — ручная отмена оператором ПИН по итогам разбора; автоматической отмены по bond-closed нет (созданные начисления остаются, ../../referral/events/bond-closed.md). |
ManualCorrection | Ручная отмена ошибочного начисления целиком оператором ПИН (platform-API, permission rewards.accruals.manage). Не способ поправить сумму: правка суммы — first-class корректировкой (INV-RA-6, ReferralAccrualAdjustmentEntity), не отменой. |
Создание (ветка consumer-а завершения сделки)
- По
InvestorUserIdсделки найти активную связь в реплике связей (rewards.referral_bond_replicas, consumer../consumers/referral-bond.md— по конвенции). Активной связи нет → реферальное начисление не создаётся (штатный случай — сделка без реферала). - Guard самореферала (INV-RA-4):
ReferrerUserIdсвязи совпадает сAgentUserIdсделки → начисление не создаётся, skip + метрикаrewards_referral_self_skip_total(самому себе партнёрка не платится; обход через вторую учётку — осознанное ограничение v1, инструмент разбора — admin-коррекции связей вreferral). - Резолвить ставку на
asOf = CompletedAt(referral-rate-rule.md). Ставки нет → начисление не создаётся, warn-метрикаrewards_referral_accrual_no_rate_total. - Посчитать
Amount = FinalPrice × Percent / 100(banker's, 2 знака), снятьAppliedRateSnapshot, привязать родительское комиссионное начисление той же сделки (CommissionAccrualId), создать начисление вPending. Повтор события упирается в uniqueDealId→ идемпотентный skip (INV-RA-1).
Дочерняя сущность ReferralAccrualAdjustmentEntity (rewards.referral_accrual_adjustments)
Аудит-строка корректировки суммы реферального начисления (ADR-0067 п.4): кто, когда, что и почему изменил.
Append-only — строки не редактируются и не удаляются; каждая корректировка суммы обязана оставить ровно
одну строку. Kind: Entity внутри границы агрегата ReferralAccrualEntity — создаётся только операцией
корректировки корня (../api/platform/adjust-referral-accrual.md,
INV-RA-6).
| Поле | Тип | Обязательность | Ограничения | Источник | Описание |
|---|---|---|---|---|---|
Id | Guid | Да | PK | app | Идентификатор строки корректировки. |
AccrualId | Guid | Да | FK fk_referral_accrual_adjustments_accrual → referral_accruals.id (cascade), index ix_referral_accrual_adjustments_accrual | app | Родительское начисление. |
OldAmount | Money (owned) | Да | см. VO | app | Сумма Amount до корректировки. |
NewAmount | Money (owned) | Да | check new_amount_value > 0 | app | Сумма Amount после корректировки. |
Reason | string | Да | varchar(1000), min 1 — обязательная причина | app | Человекочитаемая причина корректировки (аудит, отчётность). |
ActorUserId | Guid | Да | — | app | Актор — Менеджер ПИН, выполнивший корректировку. |
CreatedAt | DateTimeOffset | Да | index ix_referral_accrual_adjustments_created_at | app | Момент корректировки. |
Value objects
Money (единый VO контекста rewards, дом — commission-accrual.md)
| Поле | Тип | Обязательность | Ограничения | Колонка (пример для Amount) |
|---|---|---|---|---|
Value | decimal | Да | numeric(18,2), >= 0 | amount_value |
CurrencyId | short | Да | ссылка на валюту справочника (../../handbook/domain/snapshots.md); RUB-only (ADR-0048) | amount_currency_id |
BaseAmount и Amount — в одной валюте (CurrencyId), совпадающей с валютой FinalPrice события
(INV-RA-2); операции над Money c разными CurrencyId запрещены (REWARDS_CURRENCY_MISMATCH).
Модели JSONB (versioned)
AppliedRateSnapshotDocument (jsonb, колонка applied_rate_snapshot, ContractVersion = 1)
| Поле | Тип | Обязательность | Ограничения | Since version |
|---|---|---|---|---|
ContractVersion | int | Да | = 1 | v1 |
RateRuleId | Guid | Да | ставка на момент применения (referral-rate-rule.md) | v1 |
Scope | ReferralRateScope (enum-string) | Да | PartnerDeveloper / Partner / Developer / Global | v1 |
Percent | decimal | Да | > 0, <= 100, scale 2 | v1 |
EffectiveFrom | DateTimeOffset | Да | период ставки на момент применения | v1 |
EffectiveTo | DateTimeOffset? | Нет | — | v1 |
RuleVersion | long | Да | Version ставки на момент применения | v1 |
Правила версии: additive-поля — той же версией (nullable); смена семантики — ContractVersion + 1.
Связи
| Связь | Тип | Ключ | Delete behavior |
|---|---|---|---|
ReferralAccrualAdjustmentEntity | owned (внутри агрегата) | AccrualId | cascade |
CommissionAccrualEntity | reference (nullable) | CommissionAccrualId | restrict |
PayoutOrderItemEntity | reference (nullable) | PayoutOrderItemId | set null (отмена поручения освобождает начисление) |
Реплика связей referral | replica-reference | BondId | — |
Сделка crm | external reference (без FK) | DealId | — (данные — из payload события) |
Пользователи (identity) | external reference | PartnerUserId / InvestorUserId | — |
Инварианты и переходы состояний
| Инвариант | Условие | Где проверяется | Ошибка |
|---|---|---|---|
| INV-RA-1 OneAccrualPerDeal | На DealId — не более одного реферального начисления (идемпотентность consumer-а) | unique index + проверка существующего до создания | дубль события — идемпотентный skip |
| INV-RA-2 AmountFormula | Amount = BaseAmount × Percent / 100 (banker's, 2 знака); BaseAmount = FinalPrice сделки; валюта базы и суммы едина (CurrencyId) — на момент создания начисления. Later Amount может быть скорректирован first-class путём (INV-RA-6) и тогда с формулой расходится (исходное — в OriginalAmount); валюта корректировки обязана совпадать (CurrencyId) | создание начисления; корректировка суммы | REWARDS_REFERRAL_ACCRUAL_AMOUNT_MISMATCH / REWARDS_CURRENCY_MISMATCH |
| INV-RA-3 ApprovedOnlyViaMoneyReceived | Pending → Approved выполняется только автоматически при переходе родительского начисления (CommissionAccrualId) в MoneyReceived — атомарно с регистрацией акта (platform-receipt.md, INV-RC-4); прямого API-перевода в Approved нет; без родителя начисление остаётся Pending | регистрация акта (каскад) + guard переходов | REWARDS_REFERRAL_ACCRUAL_INVALID_STATUS_TRANSITION |
| INV-RA-4 NoSelfReferral | ReferrerUserId связи ≠ AgentUserId сделки — иначе начисление не создаётся (skip + метрика rewards_referral_self_skip_total) | создание начисления (consumer, шаг 2) | нет ошибки — задокументированный skip |
| INV-RA-5 TerminalDiscipline | Paid — только каскадом реферального поручения (PayoutOrderKind = ReferralReward) при выплате позиции; Cancel — из Pending, из Approved только пока начисление свободно (PayoutOrderItemId is null); из Paid переходов нет — ошибка компенсируется вручную (ManualCorrection-регламент) | каскад выплаты поручения + guard переходов | REWARDS_REFERRAL_ACCRUAL_PAID_ONLY_VIA_PAYOUT / REWARDS_REFERRAL_ACCRUAL_CANCEL_FORBIDDEN |
| INV-RA-6 AmountAdjustable | Сумма Amount корректируется first-class путём (обязательная Reason + актор + append-only строка ReferralAccrualAdjustmentEntity), статус не меняется; допустимо только пока начисление свободно и не выплачено — Pending или Approved при PayoutOrderItemId is null (из Paid/Cancelled и из включённого в поручение — запрет); при первой корректировке исходная сумма фиксируется в OriginalAmount; из Approved (кошелёк уже кредитован) дельта компенсируется проводкой wallet Correction; NewAmount.Value > 0, валюта совпадает | корректировка суммы (../api/platform/adjust-referral-accrual.md) | REWARDS_REFERRAL_ACCRUAL_ADJUSTMENT_FORBIDDEN / REWARDS_REFERRAL_ACCRUAL_ADJUSTMENT_REASON_REQUIRED / REWARDS_CURRENCY_MISMATCH |
Коды ошибок
| Код | HTTP | Условие |
|---|---|---|
REWARDS_REFERRAL_ACCRUAL_NOT_FOUND | 404 | Начисление не найдено (операции platform/partner-API). |
REWARDS_REFERRAL_ACCRUAL_AMOUNT_MISMATCH | — (consumer) | Сумма не сходится с формулой INV-RA-2 (защита расчёта). |
REWARDS_REFERRAL_ACCRUAL_INVALID_STATUS_TRANSITION | 409 | Недопустимый переход статуса (в т.ч. попытка прямого Approve). |
REWARDS_REFERRAL_ACCRUAL_CANCEL_FORBIDDEN | 409 | Отмена из Approved при занятом поручением начислении или из терминального статуса (INV-RA-5). |
REWARDS_REFERRAL_ACCRUAL_PAID_ONLY_VIA_PAYOUT | 409 | Попытка выставить Paid вне каскада реферального поручения (INV-RA-5). |
REWARDS_REFERRAL_ACCRUAL_ADJUSTMENT_FORBIDDEN | 409 | Корректировка суммы вне Pending/Approved или при занятом поручением начислении (INV-RA-6). |
REWARDS_REFERRAL_ACCRUAL_ADJUSTMENT_REASON_REQUIRED | 400 | Пустая причина корректировки суммы (INV-RA-6). |
REWARDS_CURRENCY_MISMATCH | 400 | Валюты Money-полей не совпадают (INV-RA-2). |
Доменные и интеграционные события
| Событие | Тип | Когда | Snapshot/поля |
|---|---|---|---|
ReferralAccruedEvent | доменное | Успешный Create | Id, DealId, PartnerUserId, Amount |
ReferralAccrualCreatedKafkaEvent | интеграционное (ContractVersion = 1, topic pin.rewards.referral-accruals.v1, key = Id) | После Create | Id, DealId, BondId, PartnerUserId, DeveloperCompanyId, Amount (Value + CurrencyId + CurrencySnapshot — ../../handbook/domain/snapshots.md), Status, DealCompletedAt, Version. Контракт — ../events/referral-accrual-created.md. Потребители: notifications (уведомление партнёру) |
ReferralAccrualStatusChangedKafkaEvent | интеграционное (ContractVersion = 1, тот же topic pin.rewards.referral-accruals.v1, key = Id — строгий порядок per-начисление) | Каждый переход Status | Id, DealId, PartnerUserId, FromStatus, ToStatus, Amount (Value + CurrencyId + CurrencySnapshot), CancelReason?, ApprovedAt?, PaidAt?, Version. Контракт — ../events/referral-accrual-status-changed.md. Потребители: notifications; wallet (Approved → кредит счёта ReferralCommission партнёра; Cancelled после Approved → компенсирующая Correction, ADR-0065) |
ReferralAccrualAmountAdjustedKafkaEvent | интеграционное (ContractVersion = 1, тот же topic pin.rewards.referral-accruals.v1, key = Id) — контракт по конвенции | Корректировка суммы из Approved (из Pending не публикуется — кошелёк ещё не кредитован), INV-RA-6 | Id, DealId, PartnerUserId, OldAmount, NewAmount (Value + CurrencyId + CurrencySnapshot), Version. Потребители: wallet (Correction на дельту NewAmount − OldAmount, ADR-0065); notifications (партнёру — сумма изменена) |
Интеграционные события публикуются атомарно со сменой состояния агрегата.
Конкурентность, идемпотентность и восстановление
- Идемпотентность создания. Повтор
deal-completed/гонка инстансов consumer-а упирается в uniqueux_referral_accruals_deal_id— идемпотентный skip (INV-RA-1). - Гонка авто-апрува и отмены.
Approve(каскад регистрации акта) иCancelстартуют изPending; оптимистическая блокировка (Version) пропускает один переход — проигравший перечитывает статус, повтор отклоняется guard-ом. Отменённое начисление при регистрации акта не апрувится (каскад берёт толькоPending-рефералки родителя); зарегистрированный акт при последующей отмене сделки рефералку уже не спасает — отмена изApprovedидёт с компенсацией кошелька (Correction). - Гонка отмены и включения в поручение.
CancelизApprovedдопустим только покаPayoutOrderItemId is null; захват начисления реферальным поручением идёт под блокировкой — победитель первым проставляетPayoutOrderItemId, проигравший получаетREWARDS_REFERRAL_ACCRUAL_CANCEL_FORBIDDEN. - Гонка корректировки суммы и включения в поручение.
Adjust(INV-RA-6) допустим только покаPayoutOrderItemId is null; захват начисления реферальным поручением идёт под блокировкой — если поручение успело раньше,AdjustполучаетREWARDS_REFERRAL_ACCRUAL_ADJUSTMENT_FORBIDDEN; сверкаExpectedVersionотсекает применение к устаревшему снапшоту (REWARDS_CONCURRENCY_CONFLICT). - Bond-closed не отменяет. Закрытие связи (
bond-closed) прекращает создание новых начислений (реплика связей помечает связь неактивной); созданные начисления остаются — отзыв денег по фроду выполняется явной ручной отменой (BondRevoked). - Компенсация терминального
Paid. ИзPaidпереходов нет; ошибочно выплаченное вознаграждение компенсируется вне статусной машины (регламентManualCorrection+ корректировка кошелька), финансовая история неизменяема.
Индексы, хранение, безопасность
| Аспект | Значение |
|---|---|
| Индексы | PK; ux_referral_accruals_deal_id unique btree; ix_referral_accruals_partner btree (partner_user_id, status); ix_referral_accruals_bond_id btree; ix_referral_accruals_developer btree; ix_referral_accruals_status btree; ix_referral_accruals_deal_completed_at btree; ix_referral_accruals_payout_item btree where not null. Аудит-строки: ix_referral_accrual_adjustments_accrual, ix_referral_accrual_adjustments_created_at |
| Партиционирование / retention | none — доли завершённых сделок (десятки тысяч в год, ADR-0056); retention бессрочный (финансовая история, включая аудит-строки корректировок) |
| Concurrency | оптимистическая блокировка (правка не должна затирать чужую): авто-апрув vs отмена vs корректировка суммы vs включение в поручение |
| Permissions / PII | Партнёр — только свои начисления (record-level PartnerUserId, permission rewards.referral.view-own); реестр и ручная отмена — Менеджер ПИН (rewards.accruals.manage, платформенный scope); корректировка суммы — Менеджер ПИН (rewards.referral-rates.manage / rewards.accruals.adjust); агентству и застройщику реферальные начисления не отдаются. InvestorUserId партнёру не отдаётся (PII приведённого инвестора); суммы — Sensitive-класс, в логи не пишутся |
| Audit | Version + события статусов; причина отмены обязательна (CancelReason); корректировки суммы — append-only строки ReferralAccrualAdjustmentEntity (обязательная Reason + актор) |
Обратные ссылки
Автоссылки: где используется этот документ.
- Домен (CQRS) (7): Entity / Aggregate: CommissionAccrualEntity, Entity / Aggregate: LedgerTransactionEntity (+ LedgerEntryEntity), Entity / Aggregate: PayoutOrderEntity, Entity / Aggregate: PlatformReceiptEntity, Entity / Aggregate: ReferralBondEntity, Entity / Aggregate: ReferralRateRuleEntity, Entity / Aggregate: WalletAccountEntity
- API (17): GET /api/v1/my/referral-accruals — Мои реферальные начисления (партнёр), GET /api/v1/platform/referral-accruals — Реестр реферальных начислений, GET /api/v1/platform/referral-payout-orders — Список реферальных платёжных поручений, GET /api/v1/platform/referral-rate-rules — Реестр ставок реферального вознаграждения, POST /api/v1/developer/commission-accruals — Ручное создание начисления застройщиком, POST /api/v1/platform/receipts/{receiptId}/register — Регистрация акта поступления средств, POST /api/v1/platform/referral-accruals/{accrualId}/adjust — Корректировка суммы реферального начисления, POST /api/v1/platform/referral-accruals/{accrualId}/cancel — Ручная отмена реферального начисления, 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 — Отметка о выплате реферального поручения, POST /api/v1/platform/referral-rate-rules — Создание ставки реферального вознаграждения (черновик) (+5)
- Use Cases (9): UC-RWD-003. Сделка завершена — начисление комиссии (system), UC-RWD-008. Платформа настраивает ставки реферального вознаграждения, UC-RWD-009. Жизненный цикл реферального начисления (связь → начисление → гейт → выплата), UC-RWD-010. Акт поступления средств — гейт получения денег, UC-RWD-014. ПИН корректирует размер реферального вознаграждения партнёра, UC-WLT-001. Получение денег кредитует балансы получателей, UC-WLT-002. Выплата поручения дебетует баланс получателя, US-реестр: Реферальный партнёр (US-PRT), US-реестр: Финансовый блок ПИН (US-FIN)
- События (6): Event Contract: pin.referral.bond-closed (ReferralBondClosedKafkaEvent), Event Contract: pin.referral.bond-created (ReferralBondCreatedKafkaEvent), Event Contract: pin.rewards.payout-order-status-changed (PayoutOrderStatusChangedKafkaEvent), Event Contract: pin.rewards.referral-accrual-created (ReferralAccrualCreatedKafkaEvent), Event Contract: pin.rewards.referral-accrual-status-changed (ReferralAccrualStatusChangedKafkaEvent), Event Contract: pin.wallet.transaction-recorded (WalletTransactionRecordedKafkaEvent)
- Консюмеры (4): Consumer: CRM Deal Cancelled, Consumer: CRM Deal Completed, Consumer: Referral Bond Sync (pin-rewards-referral-bonds), Consumer: Rewards Referral Accrual Status Changed
- Саги (1): Saga «Commission Settlement» (финансовый контур вознаграждений)
- Отчёты (2): Отчет/Export: Реферальные вознаграждения по партнёрам (referral-rewards-by-partner), Отчет/Export: Сводка реферальных вознаграждений за период (referral-rewards-period-summary)
- registries (2): Реестр инвариантов PIN, Реестр сущностей PIN
- index.md (3): Referral Service, Rewards Service, Wallet Service
Связанные документы
- referral-rate-rule.md — резолюция и снапшот ставки.
- commission-accrual.md — родительское начисление (статус
MoneyReceived— гейтApproved); platform-receipt.md — акт, каскад авто-апрува (INV-RC-4). - payout-order.md — реферальное поручение (
PayoutOrderKind = ReferralReward, позиции ←Approved-рефералки, tenant — ПИН). - Операции: ../api/platform/adjust-referral-accrual.md
(first-class корректировка суммы, INV-RA-6),
../api/platform/cancel-referral-accrual.md (отмена),
../api/platform/list-referral-accruals.md (
ReferralAccrualModel). - Основание: ../../referral/domain/referral-bond.md; реплика
связей — consumer
../consumers/referral-bond.md(по конвенции); события связей — ../../referral/events/bond-created.md, ../../referral/events/bond-closed.md. - Consumer-источник: ../consumers/crm-deal-completed.md; отмена — ../consumers/crm-deal-cancelled.md; событие-источник — ../../crm/events/deal-completed.md.
- Snapshot-модели валюты: ../../handbook/domain/snapshots.md.
- ADR-0066
(отдельная сущность, guard самореферала),
ADR-0067 (гейт
MoneyReceived, п.4 — first-class корректировки), ADR-0065 (кошелёк — счётReferralCommission,Correction), ADR-0052 (tenancy), ADR-0048 (RUB-only).