Module: Gera::Mathematic

Included in:
DirectionRate, DirectionRateDecorator, ExchangeRate, PaymentSystem, RateFromMultiplicator
Defined in:
lib/gera/mathematic.rb

Defined Under Namespace

Classes: Result

Instance Method Summary collapse

Instance Method Details

#calculate_base_rate(finite_rate, comission) ⇒ Object

Отдает базовую тавку из конечной и комиссии



51
52
53
54
55
56
57
# File 'lib/gera/mathematic.rb', line 51

def calculate_base_rate(finite_rate, comission)
  if finite_rate >= 1
    100.0 * finite_rate / (100.0 - comission.to_f)
  else
    100.0 * finite_rate / (100.0 - comission.to_f)
  end
end

#calculate_comission(finite_rate, base_rate) ⇒ Object

Отдает комиссию исходя из конечной и базовой ставки



61
62
63
64
65
66
67
68
# File 'lib/gera/mathematic.rb', line 61

def calculate_comission(finite_rate, base_rate)
  if finite_rate <= 1
    a = 1.0 / finite_rate.to_f - 1.0 / base_rate.to_f
    (a.as_percentage_of(1.0 / finite_rate.to_f).to_f * 100)
  else
    (base_rate.to_f - finite_rate.to_f).as_percentage_of(base_rate.to_f).to_f * 100
  end
end

#calculate_finite_rate(base_rate, comission) ⇒ Object

Конечная ставка из базовой



72
73
74
75
76
77
78
# File 'lib/gera/mathematic.rb', line 72

def calculate_finite_rate(base_rate, comission)
  if base_rate <= 1
    base_rate.to_f * (1.0 - comission.to_f/100)
  else
    base_rate - comission.to_percent
  end
end

#calculate_profits(base_rate:, comission:, ps_interest:, income_amount:) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/gera/mathematic.rb', line 24

def calculate_profits(base_rate:,
                      comission:,
                      ps_interest:,
                      income_amount:
                     )

  finite_rate     = calculate_finite_rate base_rate, comission
  finite_amount   = income_amount * finite_rate
  ps_amount       = ps_interest.percent_of finite_amount
  outcome_amount  = ps_amount + finite_amount

  Result.new(
    base_rate:       base_rate,
    comission:       comission,
    ps_interest:     ps_interest,
    income_amount:   income_amount,

    finite_rate:     finite_rate,
    finite_amount:   finite_amount, # сумма которую получет пользователь на счет
    ps_amount:       ps_amount,
    outcome_amount:  outcome_amount, # сумма которую нужно перевести чтобы хватило и платежной системе и пользователю сколько обещали
    profit_amount:   income_amount - outcome_amount / base_rate
  ).freeze
end

#calculate_total_using_regular_comission(amount, comission) ⇒ Object

Рассчет суммы с комиссей. Процент комиссии считается от изначальной суммы. Комиссия указывается в процентах.



122
123
124
# File 'lib/gera/mathematic.rb', line 122

def calculate_total_using_regular_comission(amount, comission)
  amount + (amount * comission / 100.0)
end

#calculate_total_using_reverse_comission(amount, comission) ⇒ Object

Рассчет суммы с обратной комиссей. Процент комиссии считается от итоговой суммы Комиссия указывается в процентах.



129
130
131
# File 'lib/gera/mathematic.rb', line 129

def calculate_total_using_reverse_comission(amount, comission)
  100.0 / (100 - comission) * amount
end

#diff_percents(a, b) ⇒ Object

На сколько абсолютных процентов отличается число b от числа a



82
83
84
85
86
87
# File 'lib/gera/mathematic.rb', line 82

def diff_percents(a, b)
  percent_value = (a.to_d / 100.0)
  res = 100.0 - (b.to_d / percent_value)
  res = -res if res < 0
  res.to_percent
end

#money_exchange(rate, amount, to_currency) ⇒ Object

Отдает сумму которую получим в результате обмена rate - курсовой мультимликатор amount - входящая сумма to_currency - валютя в которой нужно получить результат



94
95
96
97
98
99
100
101
102
103
# File 'lib/gera/mathematic.rb', line 94

def money_exchange(rate, amount, to_currency)
  fractional = BigDecimal(amount.fractional.to_s) / (
    BigDecimal(amount.currency.subunit_to_unit.to_s) /
    BigDecimal(to_currency.subunit_to_unit.to_s)
  )

  res = fractional * rate
  res = res.round(0, BigDecimal::ROUND_DOWN)
  Money.new(res, to_currency)
end

#money_reverse_exchange(rate, amount, to_currency) ⇒ Object

Обратный обмен. Когда у нас есть курс и сумма которую мы хотим получить и мы вычисляем из какой суммы на входе она получится



108
109
110
111
112
113
114
115
116
117
# File 'lib/gera/mathematic.rb', line 108

def money_reverse_exchange(rate, amount, to_currency)
  fractional = BigDecimal(amount.fractional.to_s) / (
    BigDecimal(amount.currency.subunit_to_unit.to_s) /
    BigDecimal(to_currency.subunit_to_unit.to_s)
  )

  res = fractional / rate
  res = res.round(0, BigDecimal::ROUND_UP)
  Money.new(res, to_currency)
end