Event Contract: pin.rewards.commission-money-received (CommissionMoneyReceivedKafkaEvent)
Версионируемый контракт интеграционного события «деньги по начислению получены». Consumer-документы
ссылаются сюда, не переописывая payload. Дом полей — entity: CommissionAccrualEntity
(включая строки распределения CommissionDistributionEntity); источник перехода —
entity: PlatformReceiptEntity.
Назначение
Фиксирует прохождение гейта получения денег
(ADR-0067): оператор ПИН
зарегистрировал акт поступления средств, и начисление комиссии перешло Confirmed → MoneyReceived —
деньги от застройщика фактически получены, все денежные следствия разблокированы. Producer — rewards
(регистрация акта, platform-receipt.md); событие публичное, потому что
wallet кредитует счета получателей по строкам распределения без синхронного запроса в rewards
(ADR-0065), а notifications уведомляет агента и агентство о доступности выплаты. Payload несёт полное
распределение тремя строками (Platform/Agency/Agent) — единственный контракт, публикующий строки
распределения наружу.
Metadata
| Поле | Значение |
|---|---|
| Event type | pin.rewards.commission-money-received |
| C# type | CommissionMoneyReceivedKafkaEvent |
| Topic | pin.rewards.commission-money-received.v1 |
| Partitions / key | 3 / key = Id начисления (объём — число завершённых сделок, ADR-0056) |
| ContractVersion | 1 |
| Producer | rewards: регистрация акта поступления средств (platform-API api/platform/register-platform-receipt.md — по конвенции; атомарный каскад INV-RC-4 platform-receipt.md) — по одному событию на каждое начисление акта |
| Статус | draft |
Метаданные события: идентификатор сообщения (
MessageId, ключ дедупликации), время (CreatedAt),Version(=ContractVersion),AggregateId = Id,AggregateType = "CommissionAccrual". Событие публикуется атомарно с регистрацией акта и переходом начисления вMoneyReceived.
Payload CommissionMoneyReceivedKafkaEvent
Snapshot-поля ссылаются на дом commission-accrual.md —
перечисляется только то, что реально в событии. Реквизиты акта (Number, PaymentReference),
InvestorUserId, цены объекта недвижимости и снапшоты правил/условий платформы в payload
не входят (см. «Безопасность»).
| Поле | Тип | Обязательность | Источник (поле агрегата) | Compatibility | Описание |
|---|---|---|---|---|---|
Id | Guid | Да | CommissionAccrualEntity.Id | Immutable | Ключ агрегата (= Kafka key); ключ идемпотентности кредитов wallet. |
TenantId | Guid | Да | CommissionAccrualEntity.TenantId | Immutable | Агентство-получатель комиссии — держатель счёта AgencyCommission (строка Agency). |
DealId | Guid | Да | CommissionAccrualEntity.DealId | Immutable | Сделка crm — контекст уведомления и трассировка проводок. |
DeveloperCompanyId | Guid | Да | CommissionAccrualEntity.DeveloperCompanyId | Immutable | Застройщик-плательщик (сторона акта). |
PlatformReceiptId | Guid | Да | CommissionAccrualEntity.PlatformReceiptId | Immutable | Акт поступления средств, подтвердивший получение денег (platform-receipt.md). |
MoneyReceivedAt | DateTimeOffset | Да | CommissionAccrualEntity.MoneyReceivedAt | Immutable | Момент регистрации акта (= RegisteredAt акта). |
CommissionAmount | MoneyModel | Да | CommissionAccrualEntity.CommissionAmount | Additive only | Gross-сумма комиссии (после корректировок, если были — INV-11). |
Distributions | IReadOnlyList<DistributionModel> | Да (ровно 3 элемента) | CommissionDistributionEntity начисления | Additive only | Распределение комиссии тремя строками Platform/Agency/Agent (INV-5/9 commission-accrual.md); Σ строк = CommissionAmount. Bounded по построению. |
Version | long | Да | CommissionAccrualEntity.Version после перехода | Immutable semantics | Доменная версия — монотонный guard потребителя. |
Вложенная модель DistributionModel
Проекция CommissionDistributionEntity (commission-accrual.md).
| Поле | Тип | Обязательность | Ограничения | Описание |
|---|---|---|---|---|
RecipientType | string (enum CommissionRecipientType) | Да | Platform / Agency / Agent; по одной строке каждого типа (INV-9) | Тип получателя доли — определяет кредитуемый счёт wallet (ADR-0065). |
RecipientUserId | Guid? | Да для Agent, null для Platform и Agency | — | Пользователь-получатель доли: агент-исполнитель сделки (= адресат уведомления notifications). |
Amount | MoneyModel | Да | Value >= 0 | Сумма доли. |
Вложенная модель MoneyModel
Проекция VO Money (commission-accrual.md, раздел «Value objects»);
валюта всех сумм payload едина (INV-6).
| Поле | Тип | Обязательность | Ограничения | Описание |
|---|---|---|---|---|
Value | decimal | Да | >= 0, scale 2 | Сумма. |
CurrencyId | short | Да | ссылка на валюту справочника; RUB-only (ADR-0048) | Типизированная ссылка на валюту. |
CurrencySnapshot | CurrencySnapshot | Да | ../../handbook/domain/snapshots.md | Display-снапшот валюты на момент публикации. |
Когда публикуется
| Условие | Переход состояния | Согласованность |
|---|---|---|
Оператор ПИН зарегистрировал акт поступления средств (api/platform/register-platform-receipt.md — по конвенции): по одному событию на каждое начисление-позицию акта | Confirmed → MoneyReceived | Акт Draft → Registered, переходы всех позиций, авто-Approve связанных реферальных начислений и публикация — в одном согласованном изменении (INV-RC-4) |
Переход Confirmed → MoneyReceived достижим для начисления ровно один раз (акт Registered
неизменяем, начисление — максимум в одном не-отменённом акте, INV-RC-3), поэтому на один Id
публикуется ровно одно событие.
Потребители (consumers)
| Потребитель | Эффект (событие → действие) | Идемпотентность | Задержка (SLA) |
|---|---|---|---|
wallet | Кредит счетов получателей по строкам Distributions (ADR-0065): Agent → счёт AgentCommission пользователя RecipientUserId; Agency → счёт AgencyCommission компании TenantId; Platform → счёт PlatformRevenue платформы. Consumer — ../../wallet/consumers/rewards-commission-money-received.md (по конвенции) | MessageId + бизнес-ключ операции (вид операции + Id начисления) — повтор события не удваивает проводки | < 5 мин |
notifications | Уведомления «деньги по комиссии получены, доступна выплата»: агенту (RecipientUserId строки Agent) и руководителю агентства (TenantId, роль с rewards.commission.view-all) | MessageId | < 5 мин |
Гарантии доставки и порядка
- Доставка — at-least-once;
walletдедуплицирует поMessageIdи бизнес-ключу операции (повторная доставка не создаёт вторую проводку),notifications— поMessageId. - Единственность. На одно начисление — ровно одно событие (единственная точка публикации — регистрация акта; повторная регистрация структурно невозможна).
- Между топиками порядок не гарантирован. В одном коммите с этим событием публикуются
commission-accrual-status-changed (
→ MoneyReceived) и события авто-апрува реферальных начислений (referral-accrual-status-changed,→ Approved) — топики разные, взаимного порядка нет; потребители независимы и идемпотентны. Кредит реферального счётаwalletвыполняет по реферальному топику, не по этому. - Уведомление о
MoneyReceivedотправляется только из этого события; в commission-accrual-status-changed переход→ MoneyReceivedдляnotifications— no-op (дубль уведомления исключён по построению). - Неизвестные поля у потребителя игнорируются (additive-политика ниже).
Версионирование и совместимость
- Версия — один
ContractVersion = 1; consumer при несовпадении версии логирует warning и продолжает (upcasting нет). - Additive-only для minor: новые optional-поля с безопасным default — без bump.
- Breaking (удаление/переименование/смена типа/смысла) —
ContractVersion = 2+ новый топикpin.rewards.commission-money-received.v2+ dual-publish на период миграции + deadline миграции consumers + sunset старого топика. - Unknown enum
RecipientTypeу потребителя:wallet— строка в DLQ + алерт (кредит неизвестного типа получателя не выполняется, деньги не «теряются» молча);notifications— строка игнорируется с warning. - Deprecation — по общему sunset-правилу событийного реестра.
Безопасность
| Поле | Класс данных | Правило |
|---|---|---|
Id, TenantId, DealId, DeveloperCompanyId, PlatformReceiptId, MoneyReceivedAt, Version | Internal | include |
CommissionAmount, Distributions[].Amount | Sensitive (суммы комиссий и долей) | include (внутренний топик, m2m ACL Kafka — wallet/notifications); в логи потребителей не пишутся; в уведомлении агент видит только факт получения денег, доли — только ролям агентства с rewards.payouts.manage |
Distributions[].RecipientType, Distributions[].RecipientUserId | Internal | include (адресация кредитов и уведомлений) |
Реквизиты акта (Number, PaymentReference, Comment) | Internal | exclude — акт — платформенный документ, агентствам не показывается (platform-receipt.md) |
InvestorUserId, цены объекта недвижимости, снапшоты правила и условий платформы | Sensitive/Internal | exclude |
Событие НЕ содержит secrets, PII (ФИО/телефоны), платёжные реквизиты, unbounded-вложения
(Distributions — ровно 3 строки).
Обратные ссылки
Автоссылки: где используется этот документ.
- Домен (CQRS) (2): Entity / Aggregate: CommissionAccrualEntity, Entity / Aggregate: PlatformReceiptEntity
- API (1): POST /api/v1/platform/receipts/{receiptId}/register — Регистрация акта поступления средств
- Use Cases (2): UC-RWD-010. Акт поступления средств — гейт получения денег, US-реестр: Финансовый блок ПИН (US-FIN)
- События (6): Event Contract: pin.rewards.commission-accrual-created, Event Contract: pin.rewards.commission-accrual-status-changed (CommissionAccrualStatusChangedKafkaEvent), Event Contract: pin.rewards.commission-distribution-adjusted (CommissionDistributionAdjustedKafkaEvent), 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)
- Консюмеры (1): Consumer: Rewards Commission Money Received
- registries (1): Реестр событий PIN
- index.md (1): Rewards Service
Связанные документы
- Сущность: commission-accrual.md (статус
MoneyReceived, строки распределения, INV-5/9/10); акт: platform-receipt.md (атомарный каскад регистрации INV-RC-4). - Соседние контракты того же коммита:
commission-accrual-status-changed.md (
→ MoneyReceived), referral-accrual-status-changed.md (→ Approved). - Дебет счетов при выплате: payout-order-status-changed.md.
- Кошелёк:
../../wallet/consumers/rewards-commission-money-received.md(по конвенции), ADR-0065. - Snapshot-модели валюты: ../../handbook/domain/snapshots.md.
- ADR-0067 (гейт получения денег), ADR-0066 (три строки распределения).
- Шаблон: event-contract-template.md.