Files
sure/app/models/exchange_rate_pair.rb
soky srm e40811b1ee Add improvements from security providers to FX providers also (#1445)
* 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>
2026-04-13 00:51:23 +02:00

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