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