38 lines
1.6 KiB
Ruby
38 lines
1.6 KiB
Ruby
module Jobs
|
|
module Cron
|
|
class ReferralBonus
|
|
def self.process
|
|
irt_currency = Currency.find('irt')
|
|
Operations::Revenue.h24.where(reference_type: 'Trade').find_in_batches(batch_size: 1000).each do |group|
|
|
group.each do |revenue|
|
|
referral_user = revenue.member.referral_user
|
|
next unless referral_user.present?
|
|
|
|
next unless revenue.credit.positive?
|
|
|
|
referral_account = referral_user.get_account('irt')
|
|
referral_account.lock!
|
|
trade = Trade.find(revenue.reference_id)
|
|
referral_bonus = if revenue.currency_id.in? %w[irt usdt]
|
|
revenue.credit * ENV.fetch('REFERRAL_FEE').to_d * trade.irt_price
|
|
else
|
|
(revenue.credit * ENV.fetch('REFERRAL_FEE').to_d) * (trade.price * trade.irt_price)
|
|
end
|
|
begin
|
|
ActiveRecord::Base.transaction do
|
|
referral_account.balance += referral_bonus
|
|
referral_account.save!
|
|
bonus = Bonus.create(trade: trade, sender_member: revenue.member, bonus_member: referral_user, amount: referral_bonus, state: 'payed')
|
|
Operations::Revenue.debit!(amount: referral_bonus, member_id: referral_user, currency: irt_currency, reference_type: 'bonus', reference_id: bonus.id)
|
|
end
|
|
rescue StandardError
|
|
Bonus.create(trade: trade, sender_member: revenue.member, bonus_member: referral_user, amount: referral_bonus, state: 'pending')
|
|
end
|
|
end
|
|
end
|
|
sleep 86400
|
|
end
|
|
end
|
|
end
|
|
end
|