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
-
#calculate_base_rate(finite_rate, comission) ⇒ Object
Отдает базовую тавку из конечной и комиссии.
-
#calculate_comission(finite_rate, base_rate) ⇒ Object
Отдает комиссию исходя из конечной и базовой ставки.
-
#calculate_finite_rate(base_rate, comission) ⇒ Object
Конечная ставка из базовой.
- #calculate_profits(base_rate:, comission:, ps_interest:, income_amount:) ⇒ Object
-
#calculate_total_using_regular_comission(amount, comission) ⇒ Object
Рассчет суммы с комиссей.
-
#calculate_total_using_reverse_comission(amount, comission) ⇒ Object
Рассчет суммы с обратной комиссей.
-
#diff_percents(a, b) ⇒ Object
На сколько абсолютных процентов отличается число b от числа a.
-
#money_exchange(rate, amount, to_currency) ⇒ Object
Отдает сумму которую получим в результате обмена rate - курсовой мультимликатор amount - входящая сумма to_currency - валютя в которой нужно получить результат.
-
#money_reverse_exchange(rate, amount, to_currency) ⇒ Object
Обратный обмен.
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 |