Перейти к содержимому

Движение средств в системе

Каждая платная операция (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