Skip to content

DirectionRate#calculate_rate оставляет rate_value = nil при rate_percent.nil? #63

@dapi

Description

@dapi

Проблема

В методе DirectionRate#calculate_rate (app/models/gera/direction_rate.rb:139-145) если rate_percent равен nil, то rate_value НЕ устанавливается и остаётся nil:

def calculate_rate
  self.base_rate_value = currency_rate.rate_value
  raise UnknownExchangeRate, "No exchange_rate for #{ps_from}->#{ps_to}" unless exchange_rate
  self.rate_percent = exchange_rate.final_rate_percents
  self.rate_value = calculate_finite_rate base_rate_value, rate_percent unless rate_percent.nil?
end

Цепочка возникновения nil

  1. ExchangeRate.value (alias fixed_comission) может быть NULL в БД
  2. Если auto_rate? == false, то final_rate_percents возвращает fixed_comission = nil
  3. rate_percent становится nil
  4. Условие unless rate_percent.nil? пропускает установку rate_value
  5. rate_value остаётся nil

Последствия

При использовании rate_value в делении возникает ошибка:

ArgumentError: must be initialized with a finite value

Потому что 1.0 / nil или Money.from_amount(1.0 / 0, currency) (Infinity) вызывают исключение.

Связанный PR в Mercury: https://github.com/alfagen/mercury/pull/1673
Связанный issue: https://github.com/alfagen/mercury/issues/1671

Предлагаемое решение

def calculate_rate
  self.base_rate_value = currency_rate.rate_value
  raise UnknownExchangeRate, "No exchange_rate for #{ps_from}->#{ps_to}" unless exchange_rate
  self.rate_percent = exchange_rate.final_rate_percents
  self.rate_value = rate_percent.nil? ? 0 : calculate_finite_rate(base_rate_value, rate_percent)
end

Также рекомендуется добавить NOT NULL constraint на колонку gera_exchange_rates.value (alias comission/fixed_comission).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions