mirror of
https://github.com/we-promise/sure.git
synced 2026-04-19 03:54:08 +00:00
* FIX prefer provider rate always - add debugging also * Move logic from securities over * FIXes * Review fixes * Update provided.rb --------- Signed-off-by: soky srm <sokysrm@gmail.com>
43 lines
1.5 KiB
Ruby
43 lines
1.5 KiB
Ruby
class ExchangeRatePair < ApplicationRecord
|
|
validates :from_currency, :to_currency, presence: true
|
|
|
|
def self.for_pair(from:, to:, provider_name: nil)
|
|
pair = find_or_create_by!(from_currency: from, to_currency: to)
|
|
current_provider = provider_name || resolve_provider_name
|
|
|
|
if pair.provider_name != current_provider && pair.first_provider_rate_on.present?
|
|
ExchangeRatePair
|
|
.where(id: pair.id)
|
|
.where.not(provider_name: current_provider)
|
|
.update_all(first_provider_rate_on: nil, provider_name: current_provider, updated_at: Time.current)
|
|
pair.reload
|
|
end
|
|
|
|
pair
|
|
rescue ActiveRecord::RecordNotUnique
|
|
find_by!(from_currency: from, to_currency: to)
|
|
end
|
|
|
|
# Resolves the runtime provider name the same way as ExchangeRate::Provided.provider:
|
|
# ENV takes precedence over the DB Setting.
|
|
def self.resolve_provider_name
|
|
(ENV["EXCHANGE_RATE_PROVIDER"].presence || Setting.exchange_rate_provider).to_s
|
|
end
|
|
|
|
def self.record_first_provider_rate_on(from:, to:, date:, provider_name: nil)
|
|
return if date.blank?
|
|
|
|
current_provider = provider_name || resolve_provider_name
|
|
pair = for_pair(from: from, to: to, provider_name: current_provider)
|
|
|
|
ExchangeRatePair
|
|
.where(id: pair.id)
|
|
.where("first_provider_rate_on IS NULL OR first_provider_rate_on > ?", date)
|
|
.update_all(
|
|
first_provider_rate_on: date,
|
|
provider_name: current_provider,
|
|
updated_at: Time.current
|
|
)
|
|
end
|
|
end
|