91 lines
2.9 KiB
Ruby
91 lines
2.9 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class WithdrawLimit < ApplicationRecord
|
|
|
|
# Default value for kyc_level, group name and currency_id in WithdrawLimit table;
|
|
ANY = 'any'
|
|
|
|
enum kind: { fiat: 0, crypto: 1, both: 2 }
|
|
# == Attributes ===========================================================
|
|
|
|
# == Extensions ===========================================================
|
|
|
|
# == Relationships ========================================================
|
|
|
|
belongs_to :currency, optional: true
|
|
|
|
# == Validations ==========================================================
|
|
|
|
validates :kyc_level,
|
|
presence: true,
|
|
uniqueness: { scope: %i[group kind] }
|
|
|
|
validates :group,
|
|
presence: true
|
|
|
|
validates :limit_24_hour,
|
|
:limit_1_month,
|
|
presence: true
|
|
|
|
# == Scopes ===============================================================
|
|
|
|
# == Callbacks ============================================================
|
|
|
|
before_create { self.group = self.group.strip.downcase }
|
|
after_commit :wipe_cache
|
|
|
|
# == Class Methods ========================================================
|
|
class << self
|
|
# Get withdrawal limit for specific withdraw that based on member kyc_level and group.
|
|
# WithdrawLimit record selected with the next priorities:
|
|
# 1. kyc_level, group match
|
|
# 2. kyc_level match
|
|
# 3. group match
|
|
# 5. kyc_level, group are 'any'
|
|
# 6. default (zero limits)
|
|
def for(kyc_level:, group:, kind:)
|
|
WithdrawLimit
|
|
.where(kyc_level: [kyc_level, ANY], group: [group, ANY], kind: kind)
|
|
.max_by(&:weight) || WithdrawLimit.new
|
|
end
|
|
end
|
|
|
|
# == Instance Methods =====================================================
|
|
|
|
# Withdraw limit suitability expressed in weight.
|
|
# Withdraw limit with the greatest weight selected.
|
|
# Kyc_level has greater weight then group match.
|
|
# E.g Withdrawal for member with kyc_level 2, group 'vip-0''
|
|
# (kyc_level == 2 && group == 'vip-0') >
|
|
# (kyc_level == 2 && group == 'any') >
|
|
# (kyc_level == 'any' && group == 'vip-0') >
|
|
# (kyc_level == 'any' && group == 'any') >
|
|
def weight
|
|
(kyc_level == 'any' ? 0 : 10) + (group == 'any' ? 0 : 1)
|
|
end
|
|
|
|
def wipe_cache
|
|
::Rails.cache.delete_matched("withdraw_limits_fees*")
|
|
end
|
|
end
|
|
|
|
# == Schema Information
|
|
# Schema version: 20201125134745
|
|
#
|
|
# Table name: withdraw_limits
|
|
#
|
|
# id :bigint not null, primary key
|
|
# group :string(32) default("any"), not null
|
|
# kyc_level :string(32) default("any"), not null
|
|
# limit_24_hour :decimal(32, 16) default(0.0), not null
|
|
# limit_1_month :decimal(32, 16) default(0.0), not null
|
|
# created_at :datetime not null
|
|
# updated_at :datetime not null
|
|
#
|
|
# Indexes
|
|
#
|
|
# index_withdraw_limits_on_group (group)
|
|
# index_withdraw_limits_on_group_and_kyc_level (group,kyc_level) UNIQUE
|
|
# index_withdraw_limits_on_kyc_level (kyc_level)
|
|
#
|