mirror of
https://github.com/maybe-finance/maybe.git
synced 2025-08-05 05:25:24 +02:00
Initial pass at Synth-based ticker selection (#1392)
* Initial pass at Synth-based ticker selection * Update _tickers.turbo_stream.erb * Functional combobox display * A few cleanup steps * Linter * Prevent long strings * Another step towards functional combobox * Deprecated files * Custom Combobox implementation * Lint * Test suite fixes * Lint * Make direct use of mic codes * Update splits * Update trades_test.rb
This commit is contained in:
parent
490f44589e
commit
cd91e66618
20 changed files with 118 additions and 232 deletions
|
@ -1,45 +0,0 @@
|
|||
class Security::Importer
|
||||
def initialize(provider, stock_exchange = nil)
|
||||
@provider = provider
|
||||
@stock_exchange = stock_exchange
|
||||
end
|
||||
|
||||
def import
|
||||
securities = @provider.fetch_tickers(exchange_mic: @stock_exchange)&.tickers
|
||||
|
||||
# Deduplicate securities based on ticker and exchange_mic
|
||||
securities_to_create = securities
|
||||
.map do |security|
|
||||
{
|
||||
name: security[:name],
|
||||
ticker: security[:symbol],
|
||||
country_code: security[:country_code],
|
||||
exchange_mic: security[:exchange_mic],
|
||||
exchange_acronym: security[:exchange_acronym]
|
||||
}
|
||||
end
|
||||
.compact
|
||||
.uniq { |security| [ security[:ticker], security[:exchange_mic] ] }
|
||||
|
||||
# First update any existing securities that only have a ticker
|
||||
Security.where(exchange_mic: nil)
|
||||
.where(ticker: securities_to_create.map { |s| s[:ticker] })
|
||||
.update_all(
|
||||
securities_to_create.map do |security|
|
||||
{
|
||||
name: security[:name],
|
||||
country_code: security[:country_code],
|
||||
exchange_mic: security[:exchange_mic],
|
||||
exchange_acronym: security[:exchange_acronym]
|
||||
}
|
||||
end.first
|
||||
)
|
||||
|
||||
# Then create/update any remaining securities
|
||||
Security.upsert_all(
|
||||
securities_to_create,
|
||||
unique_by: [ :ticker, :exchange_mic ],
|
||||
update_only: [ :name, :country_code, :exchange_acronym ]
|
||||
) unless securities_to_create.empty?
|
||||
end
|
||||
end
|
20
app/models/security/synth_combobox_option.rb
Normal file
20
app/models/security/synth_combobox_option.rb
Normal file
|
@ -0,0 +1,20 @@
|
|||
class Security::SynthComboboxOption
|
||||
include ActiveModel::Model
|
||||
include Providable
|
||||
|
||||
attr_accessor :symbol, :name, :logo_url, :exchange_acronym, :exchange_mic
|
||||
|
||||
class << self
|
||||
def find_in_synth(query)
|
||||
security_prices_provider.search_securities(query:, dataset: "limited", country_code: Current.family.country).securities.map { |attrs| new(**attrs) }
|
||||
end
|
||||
end
|
||||
|
||||
def id
|
||||
"#{symbol}|#{exchange_mic}" # submitted by combobox as value
|
||||
end
|
||||
|
||||
def to_combobox_display
|
||||
"#{symbol} - #{name} (#{exchange_acronym})" # shown in combobox input when selected
|
||||
end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue