Движение средств в системе
Каждая платная операция (payin, payout, dispute, refund) несёт сумму транзакции и сумму комиссии. Мерчант всегда платит сумму комиссии оперделенную в сервисе flexy-commission, но эта сумма не хранится в одном месте — она распределяется между платформой, (опционально) трейдером, обработавшим транзакцию, и (опционально) реферальным агентом.
Балансы перемещаются между кошельками в виде проводок (entries),
и каждая проводка имеет debit_wallet_id (источник), credit_wallet_id
(назначение) и operation_code. Каждый кошелёк отслеживает две величины:
- available — средства, которые можно потратить.
- held — средства, зарезервированные (например, во время удержания), но ещё не рассчитанные.
Системный профиль
Заголовок раздела «Системный профиль»ReactivePay имеет специальный системный профиль, определяется по
profiles.wallet_type = 100. Это обычный профиль с обычными кошельками, по одному на
валюту, но он играет уникальную роль: это клиринговый счёт для всей
комиссии.
Движение комиссии
Заголовок раздела «Движение комиссии»Когда транзакция одобрена, полная commission_amount мерчанта поступает
на системный кошелёк, и системный кошелёк сразу же перенаправляет
доли трейдера и агента.
- Доля провайдера (
commission_provider_amount) — это заработок провайдера за обработку транзакции. Она перенаправляется на кошелёк прибыли трейдера только для транзакции, с трейдером. Когда трейдера нет, это поле есть в feed, но ни одна проводка его не перемещает, поэтому сумма остаётся на системном кошельке как выручка платформы. - Доля агента (
agent_commission_amount) — это реферальное отчисление, выплачиваемое на комиссионный кошелёк агента. - Всё остальное — это выручка платформы, она накапливается на кошельке системного профиля для каждой валюты.
выручка = commission_amount − commission_provider_amount(трейдер) − agent_commission_amountИсключение: период холдирования трейдера
Заголовок раздела «Исключение: период холдирования трейдера»Для payout, находящегося внутри периода удержания трейдера (amount_in_hold > 0),
комиссия провайдера не перенаправляется в момент подтверждения — она откладывается до истечения времени trader_payout_hold_period.
До этого момента доля провайдера всё ещё
находится на системном кошельке, поэтому чистый остаток системного кошелька равен
commission_amount − agent_commission_amount и опускается до итогового
остатка только после истечении настроенного на трейдере времени.
Состояние баланса по каждому кошельку
Заголовок раздела «Состояние баланса по каждому кошельку»Таблицы ниже описывают ожидаемое чистое изменение для каждого кошелька по
available и held для заданного типа и статуса транзакции.
Обозначения:
- A =
target_amount(сумма транзакции) - C =
commission_amount(комиссия мерчанта) - Cp =
commission_provider_amount(комиссия трейдера/провайдера) - Ca =
agent_commission_amount(комиссия агента)
Кошелёк мерчанта
Заголовок раздела «Кошелёк мерчанта»Мерчант платит сумму транзакции и комиссию.
| Тип | Статус | available | held |
|---|---|---|---|
| PayinRequest | approved / refunded | A − C |
0 |
| init / declined | 0 |
0 |
|
| PayoutRequest | init | −A − C |
A + C |
| approved | −A − C |
0 |
|
| declined | 0 |
0 |
|
| DisputeRequest | approved | A − C |
0 |
| init / declined | 0 |
0 |
|
| RefundRequest | init | −A − C |
A + C |
| approved | −A − C |
0 |
|
| declined | 0 |
0 |
Системный кошелёк
Заголовок раздела «Системный кошелёк»Клиринговый счёт. held всегда равен 0.
Поскольку доля провайдера используется только для транзакции, инициированной трейдером, в таблице используется:
Cp* = Cp когда транзакция инициирована трейдеромCp* = 0 в остальных случаях| Тип | Статус | available | held |
|---|---|---|---|
| PayinRequest | approved / refunded | C − Cp* − Ca |
0 |
| init / declined | 0 |
0 |
|
| PayoutRequest | approved (amount_in_hold = 0) |
C − Cp* − Ca |
0 |
approved (amount_in_hold > 0) |
C − Ca |
0 |
|
| init / declined | 0 |
0 |
|
| DisputeRequest | approved | C − Cp* − Ca |
0 |
| init / declined | 0 |
0 |
|
| RefundRequest | approved | C − Ca |
0 |
| init / declined | 0 |
0 |
Операция возврата не поддерживается трейдером
Основной кошелёк трейдера
Заголовок раздела «Основной кошелёк трейдера»Трейдер авансирует сумму транзакции.
| Тип | Статус | available | held |
|---|---|---|---|
| PayinRequest | init | −A |
A |
| approved | −A |
0 |
|
| declined / refunded | 0 |
0 |
|
| PayoutRequest | approved (amount_in_hold > 0) |
0 |
A |
approved (amount_in_hold = 0) |
A |
0 |
|
| init / declined | 0 |
0 |
|
| DisputeRequest | init | −A |
A |
| approved | −A |
0 |
|
| declined | 0 |
0 |
Кошелёк дохода трейдера
Заголовок раздела «Кошелёк дохода трейдера»Получает комиссию провайдера.
| Тип | Статус | available | held |
|---|---|---|---|
| PayinRequest | approved | Cp |
0 |
| в остальных случаях | 0 |
0 |
|
| PayoutRequest | approved (amount_in_hold > 0) |
0 |
0 |
approved (amount_in_hold = 0) |
Cp |
0 |
|
| в остальных случаях | 0 |
0 |
|
| DisputeRequest | approved | Cp |
0 |
| в остальных случаях | 0 |
0 |
Когда payout находится внутри периода удержания трейдера (
amount_in_hold > 0), комиссия провайдера ещё не зачислена, поэтому ожидаемое изменение равно0.
Комиссионный кошелёк агента
Заголовок раздела «Комиссионный кошелёк агента»Получает комиссию агента, независимо от типа транзакции.
| Статус | available | held |
|---|---|---|
| approved | Ca |
0 |
| в остальных случаях | 0 |
0 |
