From 326793ea472e2408efad67f8f8fcea5b7d17e7dd Mon Sep 17 00:00:00 2001 From: Aleksey Kurepin Date: Tue, 9 Sep 2025 02:57:09 +0300 Subject: [PATCH 01/17] fully updated code for new T-Bank API --- .gitignore | 1 + .rubocop.yml | 4 +-- .ruby-version | 2 +- Gemfile.lock | 76 ++++++++++++++++++++++++++------------------- lib/tinky.rb | 49 ++++++++++++----------------- lib/tinky/client.rb | 32 ++++++++++++++----- 6 files changed, 93 insertions(+), 71 deletions(-) diff --git a/.gitignore b/.gitignore index 9797a6c..00785ed 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .env.local .env.*.local +.DS_Store diff --git a/.rubocop.yml b/.rubocop.yml index 44f5863..a74fa5f 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,4 +1,4 @@ -require: +plugins: - rubocop-performance AllCops: @@ -31,7 +31,7 @@ Style/Documentation: Enabled: false Layout/LineLength: - Max: 80 + Max: 100 Metrics/MethodLength: Max: 15 diff --git a/.ruby-version b/.ruby-version index fd2a018..4f5e697 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -3.1.0 +3.4.5 diff --git a/Gemfile.lock b/Gemfile.lock index 0d18b34..011d76c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,14 +1,15 @@ GEM remote: https://rubygems.org/ specs: - ast (2.4.2) + ast (2.4.3) awesome_print (1.9.2) awesome_pry (0.0.1) awesome_print pry-rails + bigdecimal (3.2.3) coderay (1.1.3) - dotenv (2.7.6) - faraday (0.17.4) + dotenv (3.1.8) + faraday (0.17.6) multipart-post (>= 1.2, < 3) faraday_middleware (0.14.0) faraday (>= 0.7.4, < 1.0) @@ -16,55 +17,66 @@ GEM faraday (~> 0.9) faraday_middleware (>= 0.9.1, < 1.0) oj (>= 2.0, < 4.0) - method_source (1.0.0) - multipart-post (2.1.1) - oj (3.13.10) - parallel (1.21.0) - parser (3.0.3.2) + json (2.13.2) + language_server-protocol (3.17.0.5) + lint_roller (1.1.0) + method_source (1.1.0) + multipart-post (2.4.1) + oj (3.16.11) + bigdecimal (>= 3.0) + ostruct (>= 0.2) + ostruct (0.6.3) + parallel (1.27.0) + parser (3.3.9.0) ast (~> 2.4.1) + racc pastel (0.8.0) tty-color (~> 0.5) - pry (0.14.1) + prism (1.4.0) + pry (0.15.2) coderay (~> 1.1) method_source (~> 1.0) - pry-rails (0.3.9) - pry (>= 0.10.4) - rainbow (3.0.0) - regexp_parser (2.2.0) - rexml (3.2.5) - rubocop (1.24.0) + pry-rails (0.3.11) + pry (>= 0.13.0) + racc (1.8.1) + rainbow (3.1.1) + regexp_parser (2.11.2) + rubocop (1.80.2) + json (~> 2.3) + language_server-protocol (~> 3.17.0.2) + lint_roller (~> 1.1.0) parallel (~> 1.10) - parser (>= 3.0.0.0) + parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) - regexp_parser (>= 1.8, < 3.0) - rexml - rubocop-ast (>= 1.15.0, < 2.0) + regexp_parser (>= 2.9.3, < 3.0) + rubocop-ast (>= 1.46.0, < 2.0) ruby-progressbar (~> 1.7) - unicode-display_width (>= 1.4.0, < 3.0) - rubocop-ast (1.15.0) - parser (>= 3.0.1.1) - rubocop-performance (1.13.0) - rubocop (>= 1.7.0, < 2.0) - rubocop-ast (>= 0.4.0) - ruby-progressbar (1.11.0) + unicode-display_width (>= 2.4.0, < 4.0) + rubocop-ast (1.46.0) + parser (>= 3.3.7.2) + prism (~> 1.4) + rubocop-performance (1.26.0) + lint_roller (~> 1.1) + rubocop (>= 1.75.0, < 2.0) + rubocop-ast (>= 1.44.0, < 2.0) + ruby-progressbar (1.13.0) strings (0.2.1) strings-ansi (~> 0.2) unicode-display_width (>= 1.5, < 3.0) unicode_utils (~> 1.4) strings-ansi (0.2.0) tty-color (0.6.0) - tty-screen (0.8.1) + tty-screen (0.8.2) tty-table (0.12.0) pastel (~> 0.8) strings (~> 0.2.0) tty-screen (~> 0.8) - unicode-display_width (2.1.0) + unicode-display_width (2.6.0) unicode_utils (1.4.0) PLATFORMS - arm64-darwin-21 - x86_64-darwin-19 - x86_64-linux + arm64-darwin-24 + ruby DEPENDENCIES awesome_pry @@ -77,4 +89,4 @@ DEPENDENCIES tty-table BUNDLED WITH - 2.2.22 + 2.7.1 diff --git a/lib/tinky.rb b/lib/tinky.rb index 193d3a2..6d207c4 100644 --- a/lib/tinky.rb +++ b/lib/tinky.rb @@ -13,9 +13,9 @@ module Tinky # rubocop:disable Metrics/ModuleLength CURRENCIES = { - RUB: { symbol: '₽', ticker: nil }, - USD: { symbol: '$', ticker: 'USD000UTSTOM' }, - EUR: { symbol: '€', ticker: 'EUR_RUB__TOM' } + rub: { symbol: '₽', ticker: nil }, + usd: { symbol: '$', ticker: 'USD000UTSTOM' }, + eur: { symbol: '€', ticker: 'EUR_RUB__TOM' } }.freeze class << self @@ -27,9 +27,9 @@ def portfolio puts "\nTotal amount summary:" - rates = exchange_rates(items) - summary_data = full_summary(items, rates).values - puts summary_table(summary_data) + # rates = exchange_rates(items) + # summary_data = full_summary(items, rates).values + # puts summary_table(summary_data) print_timestamp end @@ -180,46 +180,36 @@ def portfolio_data client.portfolio end - def sell_price(item) - balance = item[:balance].to_d - avg_buy_price = item[:averagePositionPrice][:value].to_d - expected_yield = item[:expectedYield][:value].to_d - - { - value: ((balance * avg_buy_price) + expected_yield) / balance, - currency: item[:averagePositionPrice][:currency] - } - end - def row_data(item) + currency = item[:averagePositionPrice][:currency] [ item[:instrumentType].upcase, - decorate_name(item[:name]), - { value: decorate_amount(item[:balance]), alignment: :right }, + decorate_name(item[:ticker]), + { value: decorate_amount(item[:quantity][:units]), alignment: :right }, { value: decorate_price(item[:averagePositionPrice]), alignment: :right }, { - value: decorate_price(sell_price(item)), + value: decorate_price(item[:currentPrice]), alignment: :right }, - { value: decorate_yield(item[:expectedYield]), alignment: :right }, + { value: decorate_yield(item[:expectedYield], currency), alignment: :right }, { value: decorate_yield_percent(item), alignment: :right } ] end - def decorate_yield(expected_yield) - value = expected_yield[:value] - currency = CURRENCIES[expected_yield[:currency].to_sym] + def decorate_yield(expected_yield, currency = 'usd') + value = expected_yield[:units].to_f + currency = CURRENCIES[currency.to_sym] - formatted_value = format('%+.2f %s', value, currency[:symbol]) + formatted_value = format('%+.2f %s', value.round(2), currency[:symbol]) pastel.decorate(formatted_value, yield_color(value)) end def decorate_yield_percent(item) - total = item.dig(:averagePositionPrice, :value).to_d * item[:balance].to_d - value = item.dig(:expectedYield, :value).to_d / total.to_d * 100 + total = item.dig(:averagePositionPrice, :units).to_d * item[:quantity][:units].to_d + value = item.dig(:expectedYield, :units).to_d / total.to_d * 100 formatted_value = format('%+.2f %%', value.round(2)) pastel.decorate(formatted_value, yield_color(value)) @@ -254,8 +244,9 @@ def decorate_name(name) end def decorate_price(price) + value = price[:units].to_d + (price[:nano].to_d / (10**9)) currency = CURRENCIES[price[:currency].to_sym] - format('%.2f %s', price[:value], currency[:symbol]) + format('%.2f %s', value.to_f, currency[:symbol]) end def print_timestamp @@ -267,7 +258,7 @@ def currency_by_ticker(ticker) end def positions - portfolio_data.dig(:payload, :positions) + portfolio_data[:positions] end # select only currencies positions (wallet) diff --git a/lib/tinky/client.rb b/lib/tinky/client.rb index 58102bf..8b153c8 100644 --- a/lib/tinky/client.rb +++ b/lib/tinky/client.rb @@ -4,27 +4,45 @@ module Tinky class Client + NAMESPACE = 'tinkoff.public.invest.api.contract.v1'.freeze attr_reader :connection def initialize - @connection = Client.make_connection(ENV['TINKOFF_OPENAPI_URL']) + @connection = Client.make_connection(ENV.fetch('TINKOFF_OPENAPI_URL', + nil)) end def portfolio - get_data('portfolio') + request_data('OperationsService/GetPortfolio', + { accountId: '2000377503', currency: 'RUB' }) end def portfolio_currencies - get_data('portfolio/currencies') + request_data('portfolio/currencies') end def market_candles(params = {}) get_data('market/candles', params) end + def currencies + request_data('InstrumentsService/Currencies', + { instrumentStatus: 'INSTRUMENT_STATUS_UNSPECIFIED', + instrumentExchange: 'INSTRUMENT_EXCHANGE_UNSPECIFIED' }) + end + + def user_info + request_data('UsersService/GetInfo', {}) + end + + def accounts + request_data('UsersService/GetAccounts', + { status: 'ACCOUNT_STATUS_UNSPECIFIED' }) + end + private - def get_data(url, params = {}) - request(:get, url, params) + def request_data(url, params = {}) + request(:post, [NAMESPACE, url].join('.'), params) end def request(method, url, params = {}) @@ -46,9 +64,9 @@ def handle_error(response) class << self def make_connection(url) - Faraday.new(url:) do |builder| + Faraday.new(url:, ssl: { verify: false }) do |builder| builder.request :json - builder.authorization :Bearer, ENV['TINKOFF_OPENAPI_TOKEN'] + builder.authorization :Bearer, ENV.fetch('TINKOFF_OPENAPI_TOKEN', nil) builder.response :oj, content_type: 'application/json' builder.adapter Faraday.default_adapter end From 1b378dc26355c4f26fbcc9c608be21c225ce74f2 Mon Sep 17 00:00:00 2001 From: Aleksey Kurepin Date: Tue, 9 Sep 2025 02:58:57 +0300 Subject: [PATCH 02/17] Dockerfile updated, TINKOFF_OPENAPI_URL updated --- .env | 2 +- Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.env b/.env index de1008f..1b3dece 100644 --- a/.env +++ b/.env @@ -1,2 +1,2 @@ -TINKOFF_OPENAPI_URL=https://api-invest.tinkoff.ru/openapi +TINKOFF_OPENAPI_URL=https://invest-public-api.tbank.ru/rest/ TINKOFF_OPENAPI_TOKEN= diff --git a/Dockerfile b/Dockerfile index 02f12f7..2a23ea5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.1.0 +FROM ruby:3.4.5 WORKDIR /opt/app COPY Gemfile* ./ From e7bd1bae169c84af744250f903593ffc68a07184 Mon Sep 17 00:00:00 2001 From: Aleksey Kurepin Date: Tue, 9 Sep 2025 03:00:17 +0300 Subject: [PATCH 03/17] GitHub workflow updated --- .github/workflows/rubocop.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rubocop.yml b/.github/workflows/rubocop.yml index a9762d3..03e7f03 100644 --- a/.github/workflows/rubocop.yml +++ b/.github/workflows/rubocop.yml @@ -26,7 +26,7 @@ jobs: # uses: ruby/setup-ruby@v1 uses: ruby/setup-ruby@v1 with: - ruby-version: 3.1.0 + ruby-version: 3.4.5 - name: Install dependencies run: bundle install - name: Run rubocop From 5b47e48d5c826aec0ecca62c9f084f4f4a8bbd88 Mon Sep 17 00:00:00 2001 From: Aleksey Kurepin Date: Tue, 9 Sep 2025 11:53:03 +0300 Subject: [PATCH 04/17] wip --- lib/tinky.rb | 47 ++++++++++++++++++++++++--------------------- lib/tinky/client.rb | 17 +++------------- 2 files changed, 28 insertions(+), 36 deletions(-) diff --git a/lib/tinky.rb b/lib/tinky.rb index 6d207c4..9ad270a 100644 --- a/lib/tinky.rb +++ b/lib/tinky.rb @@ -20,16 +20,16 @@ module Tinky # rubocop:disable Metrics/ModuleLength class << self def portfolio - items = positions + items = positions.sort_by { |i| i[:type] } # .select{|i| i[:ticker] == 'TIPO2'} puts "\nPortfolio:" puts portfolio_table(items) puts "\nTotal amount summary:" - # rates = exchange_rates(items) - # summary_data = full_summary(items, rates).values - # puts summary_table(summary_data) + # exchange_rates(items) + binding.pry + puts summary_table(full_summary.values) print_timestamp end @@ -48,9 +48,7 @@ def watch_portfolio puts 'Total amount summary:' - rates = exchange_rates(items) - summary_data = full_summary(items, rates).values - puts summary_table(summary_data) + puts summary_table(full_summary.values) print_timestamp @@ -75,8 +73,7 @@ def portfolio_table(items) prev_type = items.first[:instrumentType] table = TTY::Table.new( - header: ['Type', 'Name', 'Amount', 'Avg. buy', 'Current price', - 'Yield', 'Yield %'] + header: ['Type', 'Name', 'Amount', 'Avg. buy', 'Current price', 'Yield', 'Yield %'] ) items.each do |item| @@ -158,13 +155,14 @@ def summary(items, rates) # rubocop:disable Metrics/AbcSize end end - def full_summary(items, rates) - result = summary(items, rates) - - result.merge( - yield_percent: [result[:yield][0] / result[:price][0] * 100, '%'], - total_with_rub: [result[:total][0] + rub_balance, '₽'] - ) + def full_summary + { + total_purchases: [1, '₽'], + expected_yield: [1, '₽'], + expected_total: [1, '₽'], + total_yield: decorate_price(portfolio_data[:expectedYield]), + total_with_rub: decorate_price(portfolio_data[:totalAmountPortfolio]) + } end private @@ -177,7 +175,7 @@ def pastel end def portfolio_data - client.portfolio + @portfolio_data ||= client.portfolio end def row_data(item) @@ -187,11 +185,11 @@ def row_data(item) decorate_name(item[:ticker]), { value: decorate_amount(item[:quantity][:units]), alignment: :right }, { - value: decorate_price(item[:averagePositionPrice]), + value: decorate_price(item[:averagePositionPrice]).join(' '), alignment: :right }, { - value: decorate_price(item[:currentPrice]), + value: decorate_price(item[:currentPrice]).join(' '), alignment: :right }, { value: decorate_yield(item[:expectedYield], currency), alignment: :right }, @@ -209,7 +207,12 @@ def decorate_yield(expected_yield, currency = 'usd') def decorate_yield_percent(item) total = item.dig(:averagePositionPrice, :units).to_d * item[:quantity][:units].to_d - value = item.dig(:expectedYield, :units).to_d / total.to_d * 100 + + value = if item[:averagePositionPrice][:units].to_d.zero? || item[:quantity][:units].to_d.zero? + 0.0 + else + item.dig(:expectedYield, :units).to_d / total.to_d * 100 + end formatted_value = format('%+.2f %%', value.round(2)) pastel.decorate(formatted_value, yield_color(value)) @@ -245,8 +248,8 @@ def decorate_name(name) def decorate_price(price) value = price[:units].to_d + (price[:nano].to_d / (10**9)) - currency = CURRENCIES[price[:currency].to_sym] - format('%.2f %s', value.to_f, currency[:symbol]) + currency_symbol = price.key?(:currency) ? CURRENCIES[price[:currency].to_sym][:symbol] : '%' + [value.to_f.round(2), currency_symbol] end def print_timestamp diff --git a/lib/tinky/client.rb b/lib/tinky/client.rb index 8b153c8..da9ad68 100644 --- a/lib/tinky/client.rb +++ b/lib/tinky/client.rb @@ -8,21 +8,11 @@ class Client attr_reader :connection def initialize - @connection = Client.make_connection(ENV.fetch('TINKOFF_OPENAPI_URL', - nil)) + @connection = Client.make_connection(ENV.fetch('TINKOFF_OPENAPI_URL', nil)) end def portfolio - request_data('OperationsService/GetPortfolio', - { accountId: '2000377503', currency: 'RUB' }) - end - - def portfolio_currencies - request_data('portfolio/currencies') - end - - def market_candles(params = {}) - get_data('market/candles', params) + request_data('OperationsService/GetPortfolio', { accountId: '2000377503', currency: 'RUB' }) end def currencies @@ -36,8 +26,7 @@ def user_info end def accounts - request_data('UsersService/GetAccounts', - { status: 'ACCOUNT_STATUS_UNSPECIFIED' }) + request_data('UsersService/GetAccounts', { status: 'ACCOUNT_STATUS_UNSPECIFIED' }) end private From 3d5272c4f3c8bc0352cabd612019c7c211ae1fcf Mon Sep 17 00:00:00 2001 From: Aleksey Kurepin Date: Tue, 9 Sep 2025 13:38:43 +0300 Subject: [PATCH 05/17] wip --- lib/tinky.rb | 43 +++++++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/lib/tinky.rb b/lib/tinky.rb index 9ad270a..c52e078 100644 --- a/lib/tinky.rb +++ b/lib/tinky.rb @@ -18,9 +18,9 @@ module Tinky # rubocop:disable Metrics/ModuleLength eur: { symbol: '€', ticker: 'EUR_RUB__TOM' } }.freeze - class << self + class << self # rubocop:disable Metrics/ClassLength def portfolio - items = positions.sort_by { |i| i[:type] } # .select{|i| i[:ticker] == 'TIPO2'} + items = positions #.select { |i| i[:ticker] == 'AAPL' } puts "\nPortfolio:" puts portfolio_table(items) @@ -28,7 +28,6 @@ def portfolio puts "\nTotal amount summary:" # exchange_rates(items) - binding.pry puts summary_table(full_summary.values) print_timestamp @@ -156,12 +155,18 @@ def summary(items, rates) # rubocop:disable Metrics/AbcSize end def full_summary + total_yield = decorate_price(portfolio_data[:expectedYield]) + total_amount_currencies = decorate_price(portfolio_data[:totalAmountCurrencies]) + expected_total = decorate_price(portfolio_data[:totalAmountPortfolio]) + total_without_currencies = expected_total[0] - total_amount_currencies[0] + expected_yield = total_without_currencies / (100 + total_yield[0]) * total_yield[0] + { - total_purchases: [1, '₽'], - expected_yield: [1, '₽'], - expected_total: [1, '₽'], - total_yield: decorate_price(portfolio_data[:expectedYield]), - total_with_rub: decorate_price(portfolio_data[:totalAmountPortfolio]) + total_purchases: [0, '₽'], + expected_yield: [expected_yield, '₽'], + expected_total: [total_without_currencies, '₽'], + total_yield: total_yield, + total_with_rub: expected_total } end @@ -178,7 +183,7 @@ def portfolio_data @portfolio_data ||= client.portfolio end - def row_data(item) + def row_data(item) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength currency = item[:averagePositionPrice][:currency] [ item[:instrumentType].upcase, @@ -198,24 +203,30 @@ def row_data(item) end def decorate_yield(expected_yield, currency = 'usd') - value = expected_yield[:units].to_f + value = expected_yield[:units].to_d + (expected_yield[:nano].to_d / (10**9)) currency = CURRENCIES[currency.to_sym] formatted_value = format('%+.2f %s', value.round(2), currency[:symbol]) pastel.decorate(formatted_value, yield_color(value)) end - def decorate_yield_percent(item) - total = item.dig(:averagePositionPrice, :units).to_d * item[:quantity][:units].to_d + def zero_item?(item) + item[:averagePositionPrice][:units].to_d.zero? || item[:quantity][:units].to_d.zero? + end - value = if item[:averagePositionPrice][:units].to_d.zero? || item[:quantity][:units].to_d.zero? + def total_buy(item) + decorate_price(item[:averagePositionPrice])[0] * item[:quantity][:units].to_d + end + + def decorate_yield_percent(item) + yield_percent = if zero_item?(item) 0.0 else - item.dig(:expectedYield, :units).to_d / total.to_d * 100 + decorate_price(item[:expectedYield])[0].to_d / total_buy(item).to_d * 100 end - formatted_value = format('%+.2f %%', value.round(2)) - pastel.decorate(formatted_value, yield_color(value)) + formatted_value = format('%+.2f %%', yield_percent.round(2)) + pastel.decorate(formatted_value, yield_color(yield_percent)) end def yield_color(value) From 5f53a117e469c3a576129b8e2e0b1e10aa03a170 Mon Sep 17 00:00:00 2001 From: Aleksey Kurepin Date: Tue, 9 Sep 2025 14:13:52 +0300 Subject: [PATCH 06/17] wip --- lib/tinky.rb | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/lib/tinky.rb b/lib/tinky.rb index c52e078..d8f65e8 100644 --- a/lib/tinky.rb +++ b/lib/tinky.rb @@ -13,14 +13,15 @@ module Tinky # rubocop:disable Metrics/ModuleLength CURRENCIES = { - rub: { symbol: '₽', ticker: nil }, + rub: { symbol: '₽', ticker: 'RUB000UTSTOM' }, usd: { symbol: '$', ticker: 'USD000UTSTOM' }, - eur: { symbol: '€', ticker: 'EUR_RUB__TOM' } + eur: { symbol: '€', ticker: 'EUR_RUB__TOM' }, + cny: { symbol: '¥', ticker: 'CNYRUB_TOM_CETS' } }.freeze class << self # rubocop:disable Metrics/ClassLength def portfolio - items = positions #.select { |i| i[:ticker] == 'AAPL' } + items = positions # .select { |i| i[:ticker] == 'AAPL' } puts "\nPortfolio:" puts portfolio_table(items) @@ -60,7 +61,7 @@ def restore_tty end def wallet - items = client.portfolio_currencies.dig(:payload, :currencies) + items = portfolio_data[:positions].select { |i| i[:instrumentType] == 'currency' } puts "\nWallet:" puts wallet_table(items) @@ -88,8 +89,9 @@ def wallet_table(items) table = TTY::Table.new(header: %w[Currencies]) items.each do |item| - currency = CURRENCIES[item[:currency].to_sym] - formatted_value = format('%.2f %s', item[:balance], currency[:symbol]) + currency_symbol = symbol_by_ticker(item[:ticker]) + value = decorate_price(item[:quantity])[0] + formatted_value = format('%.2f %s', value, currency_symbol) table << [ { @@ -156,9 +158,8 @@ def summary(items, rates) # rubocop:disable Metrics/AbcSize def full_summary total_yield = decorate_price(portfolio_data[:expectedYield]) - total_amount_currencies = decorate_price(portfolio_data[:totalAmountCurrencies]) expected_total = decorate_price(portfolio_data[:totalAmountPortfolio]) - total_without_currencies = expected_total[0] - total_amount_currencies[0] + total_without_currencies = expected_total[0] - rub_balance[0] expected_yield = total_without_currencies / (100 + total_yield[0]) * total_yield[0] { @@ -166,6 +167,7 @@ def full_summary expected_yield: [expected_yield, '₽'], expected_total: [total_without_currencies, '₽'], total_yield: total_yield, + rub_balance: rub_balance, total_with_rub: expected_total } end @@ -299,6 +301,7 @@ def summary_table(items) 'Expected Yield', 'Expected Total', 'Yield %', + 'RUB balance', 'Total + RUB balance' ] ) @@ -307,10 +310,12 @@ def summary_table(items) end def rub_balance - client - .portfolio_currencies - .dig(:payload, :currencies) - .find { |i| i[:currency] == 'RUB' }[:balance].to_d + decorate_price(portfolio_data[:totalAmountCurrencies]) + end + + def symbol_by_ticker(ticker) + pair = CURRENCIES.values.find { |c| c[:ticker] == ticker.to_s } + pair&.fetch(:symbol, nil) end end end From ec45e6bc1c443f1c353c775a8aba7c3c946b7d07 Mon Sep 17 00:00:00 2001 From: Aleksey Kurepin Date: Tue, 9 Sep 2025 14:49:10 +0300 Subject: [PATCH 07/17] finished! --- lib/tinky.rb | 129 +++++++++++++++------------------------------------ 1 file changed, 37 insertions(+), 92 deletions(-) diff --git a/lib/tinky.rb b/lib/tinky.rb index d8f65e8..93d6517 100644 --- a/lib/tinky.rb +++ b/lib/tinky.rb @@ -21,14 +21,10 @@ module Tinky # rubocop:disable Metrics/ModuleLength class << self # rubocop:disable Metrics/ClassLength def portfolio - items = positions # .select { |i| i[:ticker] == 'AAPL' } - puts "\nPortfolio:" - puts portfolio_table(items) + puts portfolio_table(positions) puts "\nTotal amount summary:" - - # exchange_rates(items) puts summary_table(full_summary.values) print_timestamp @@ -38,16 +34,13 @@ def watch_portfolio print `tput smcup` loop do - items = positions - print `clear` puts 'Portfolio:' - puts portfolio_table(items) + puts portfolio_table(positions) puts puts 'Total amount summary:' - puts summary_table(full_summary.values) print_timestamp @@ -61,10 +54,8 @@ def restore_tty end def wallet - items = portfolio_data[:positions].select { |i| i[:instrumentType] == 'currency' } - puts "\nWallet:" - puts wallet_table(items) + puts wallet_table(currency_positions) print_timestamp end @@ -73,7 +64,8 @@ def portfolio_table(items) prev_type = items.first[:instrumentType] table = TTY::Table.new( - header: ['Type', 'Name', 'Amount', 'Avg. buy', 'Current price', 'Yield', 'Yield %'] + header: ['Type', 'Name', 'Amount', 'Avg. buy', 'Current price', 'Buy sum', 'Current sum', + 'Yield', 'Yield %'] ) items.each do |item| @@ -104,71 +96,16 @@ def wallet_table(items) table.render(:unicode, padding: [0, 1, 0, 1]) end - def total_amount(positions) # rubocop:disable Metrics/AbcSize - total = Hash.new do |h, k| - h[k] = { price: 0, yield: 0, total: 0 } - end - - positions.each_with_object(total) do |item, result| - currency = item.dig(:averagePositionPrice, :currency).to_sym - avg_price = item.dig(:averagePositionPrice, :value).to_d - price = avg_price * item[:balance].to_d - expected_yield = item.dig(:expectedYield, :value).to_d - - result[currency][:price] += price - result[currency][:yield] += expected_yield - result[currency][:total] += price + expected_yield - end - end - - def exchange_rates(positions) - # calculate exchange rate in RUB by currency - currencies(positions).reduce({}) do |result, c| - last_currency_candle = client.market_candles(candles_params(c[:figi])) - rate = last_currency_candle.dig(:payload, :candles).last[:c] - - # get currency code by ticker - currency = currency_by_ticker(c[:ticker]) - - result.merge(currency => rate) - end - end - - def candles_params(figi) - current_time = Time.now - { - figi:, - from: (current_time - (24 * 3600 * 3)).iso8601, - to: current_time.iso8601, - interval: 'hour' - } - end - - def summary(items, rates) # rubocop:disable Metrics/AbcSize - total = Hash.new { |h, k| h[k] = [0, '₽'] } - - total_amount(items).each_with_object(total) do |(key, value), memo| - rate = rates.fetch(key, 1) - - memo[:price][0] += value[:price] * rate - memo[:yield][0] += value[:yield] * rate - memo[:total][0] += value[:total] * rate - end - end - def full_summary - total_yield = decorate_price(portfolio_data[:expectedYield]) - expected_total = decorate_price(portfolio_data[:totalAmountPortfolio]) - total_without_currencies = expected_total[0] - rub_balance[0] expected_yield = total_without_currencies / (100 + total_yield[0]) * total_yield[0] { - total_purchases: [0, '₽'], + total_purchases: [total_purchases, '₽'], expected_yield: [expected_yield, '₽'], expected_total: [total_without_currencies, '₽'], total_yield: total_yield, rub_balance: rub_balance, - total_with_rub: expected_total + total_with_rub: decorate_price(portfolio_data[:totalAmountPortfolio]) } end @@ -187,18 +124,20 @@ def portfolio_data def row_data(item) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength currency = item[:averagePositionPrice][:currency] + amount = decorate_amount(item[:quantity][:units]).to_i + avg_buy_price = decorate_price(item[:averagePositionPrice]) + current_price = decorate_price(item[:currentPrice]) + buy_sum = [(avg_buy_price[0] * amount).round(2), avg_buy_price[1]] + current_sum = [(current_price[0] * amount).round(2), current_price[1]] + [ item[:instrumentType].upcase, decorate_name(item[:ticker]), - { value: decorate_amount(item[:quantity][:units]), alignment: :right }, - { - value: decorate_price(item[:averagePositionPrice]).join(' '), - alignment: :right - }, - { - value: decorate_price(item[:currentPrice]).join(' '), - alignment: :right - }, + { value: amount, alignment: :right }, + { value: avg_buy_price.join(' '), alignment: :right }, + { value: current_price.join(' '), alignment: :right }, + { value: buy_sum.join(' '), alignment: :right }, + { value: current_sum.join(' '), alignment: :right }, { value: decorate_yield(item[:expectedYield], currency), alignment: :right }, { value: decorate_yield_percent(item), alignment: :right } ] @@ -269,19 +208,12 @@ def print_timestamp puts "\nLast updated: #{Time.now}\n\n" end - def currency_by_ticker(ticker) - CURRENCIES.select { |_, v| v[:ticker] == ticker }.keys.first - end - def positions portfolio_data[:positions] end - # select only currencies positions (wallet) - def currencies(positions) - positions.select do |position| - position[:instrumentType] == 'Currency' - end + def currency_positions + portfolio_data[:positions].select { |i| i[:instrumentType] == 'currency' } end def decorate_summary(items) @@ -309,14 +241,27 @@ def summary_table(items) table.render(:unicode, padding: [0, 1, 0, 1]) end - def rub_balance - decorate_price(portfolio_data[:totalAmountCurrencies]) - end - def symbol_by_ticker(ticker) pair = CURRENCIES.values.find { |c| c[:ticker] == ticker.to_s } pair&.fetch(:symbol, nil) end + + def total_yield + @total_yield ||= decorate_price(portfolio_data[:expectedYield]) + end + + def total_purchases + total_without_currencies / (100 + total_yield[0]) * 100 + end + + def total_without_currencies + @total_without_currencies ||= + decorate_price(portfolio_data[:totalAmountPortfolio])[0] - rub_balance[0] + end + + def rub_balance + decorate_price(portfolio_data[:totalAmountCurrencies]) + end end end From f6d85c2eb05eee3ada7b58aee1beb5bb700e2b4b Mon Sep 17 00:00:00 2001 From: Aleksey Kurepin Date: Tue, 9 Sep 2025 14:53:46 +0300 Subject: [PATCH 08/17] fix dotenv config --- config/dotenv.rb | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/config/dotenv.rb b/config/dotenv.rb index 8bc88ee..e2f9bbb 100644 --- a/config/dotenv.rb +++ b/config/dotenv.rb @@ -1,7 +1,2 @@ require 'dotenv' -Dotenv.load( - ".env.#{ENV['APP_ENV']}.local", - '.env.local', - ".env.#{ENV['APP_ENV']}", - '.env' -) +Dotenv.load('.env.local', '.env') From 1106890807c224543b8ed68e7b321a0b8c8b5278 Mon Sep 17 00:00:00 2001 From: Aleksey Kurepin Date: Tue, 9 Sep 2025 15:16:13 +0300 Subject: [PATCH 09/17] styling --- lib/tinky.rb | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/lib/tinky.rb b/lib/tinky.rb index 93d6517..19c9f34 100644 --- a/lib/tinky.rb +++ b/lib/tinky.rb @@ -1,13 +1,9 @@ require './config/dotenv' require './config/oj' - require 'bigdecimal/util' - require 'tty/table' - require 'pry' require 'awesome_print' - require './lib/tinky/client' require './lib/tinky/client_error' @@ -25,7 +21,7 @@ def portfolio puts portfolio_table(positions) puts "\nTotal amount summary:" - puts summary_table(full_summary.values) + puts summary_table(summary_data.values) print_timestamp end @@ -41,7 +37,7 @@ def watch_portfolio puts puts 'Total amount summary:' - puts summary_table(full_summary.values) + puts summary_table(summary_data.values) print_timestamp @@ -96,7 +92,7 @@ def wallet_table(items) table.render(:unicode, padding: [0, 1, 0, 1]) end - def full_summary + def summary_data expected_yield = total_without_currencies / (100 + total_yield[0]) * total_yield[0] { From 1037adc499cc3d613cd8b3433ee3ca66f3e3eb6f Mon Sep 17 00:00:00 2001 From: Aleksey Kurepin Date: Tue, 9 Sep 2025 15:16:31 +0300 Subject: [PATCH 10/17] README.md updated --- README.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 81d86ab..2c68444 100644 --- a/README.md +++ b/README.md @@ -2,17 +2,17 @@ # TinkyClient — tiny client for Tinkoff OpenAPI -Предлагаю вашему вниманию небольшой консольный Ruby-клиент для доступа к брокерскому аккаунту Тинькофф Инвестиции. -На данный момент это очень ранняя пре-альфа-версия, реализовано только отображение портфолио. -Цель проекта — сделать удобный консольный клиент для контроля своих активов, дополняющий официальное мобильное приложение [Инвестиции](https://www.tinkoff.ru/invest/). +Предлагаю вашему вниманию небольшой консольный Ruby-клиент для доступа к брокерскому аккаунту Т-Инвестиции. +На данный момент реализовано только отображение портфолио. +Цель проекта — сделать удобный консольный клиент для контроля своих активов, дополняющий официальное мобильное приложение [Т-Инвестиции](https://tbank.ru/invest/). ![Portfolio](/examples/portfolio.png) # Быстрый старт Требования: -- установленный Ruby 2.7.1 и новее -- наличие [токена Tinkoff OpenAPI](https://tinkoffcreditsystems.github.io/invest-openapi/auth/) +- установленный Ruby 3.4.5 и новее +- наличие [токена Tinkoff OpenAPI](https://developer.tbank.ru/invest/intro/intro/token) ```sh $ bundle @@ -34,13 +34,15 @@ $ bin/portfolio ### Колонки таблицы - `Type` — тип актива. - - `STOCK` — акции. + - `SHARE` — акции. - `BOND` — облигации. - `ETF` — инвестиционный фонд. - `Name` — название актива. - `Amount` — количество в штуках или сумма в валюте. - `Avg. buy` — средняя цена покупки актива. Показатель берётся напрямую из OpenAPI. Например: если вы купили 2 акции за 10 и 20 рублей, то средняя цена покупки будет 15 рублей. От этой стоимости и текущей цены считается ожидаемый доход. - `Current price` — текущая цена актива. Не отдаётся напрямую из OpenAPI, поэтому программа вычисляет цену по формуле: `((balance * avg_buy_price) + expected_yield) / balance`. Возможно небольшое отличие от тикеров на сервере брокера. +- `Buy sum` — начальная стоимость актива по средней цене на момент покупки. +- `Current sum` — текущая стоимость актива по текущей рыночной цене. - `Yield` — ожидаемый доход в валюте. Показатель берётся напрямую из OpenAPI. - `Yield %` — ожидаемый доход в процентах. Не отдаётся напрямую из OpenAPI, поэтому программа вычисляет процент по формуле: `expected_yield / (avg_buy_price * balance) * 100`. @@ -67,8 +69,7 @@ $ bin/console ```sh pry(Tinky)> portfolio pry(Tinky)> wallet -pry(Tinky)> exchange_rates(positions) -pry(Tinky)> total_amount(positions) +pry(Tinky)> puts summary_table(summary_data.values) ``` ## Запуск в Docker @@ -95,7 +96,7 @@ pry(Tinky)> total_amount(positions) Если вы хотите вывести портфолио в отдельное окно, чтобы оно при этом автоматически обновлялось, попробуйте команду: ```sh -$ watch bin/portfolio +$ bin/portfolio --watch ``` В зависимости от системы, `watch` надо устанавливать отдельно. Однако, на macOS вывод работает некорректно. Я устанавливал через `brew install watch`. Оказалось, что она некорректно показывает символы валют и убирает цвет. Пользователи также сообщали, что табличная вёрстка ломается. @@ -110,7 +111,7 @@ $ while sleep 2; do bin/portfolio > /tmp/portfolio; clear; cat /tmp/portfolio; d 1. Используя этот проект, никакие персональные данные НЕ ПЕРЕДАЮТСЯ никаким третьим лицам скрыто или явно. 2. Использование этого проекта не требует от пользователя никаких логинов, паролей, номеров телефона и других персональных данных. -3. Для доступа к вашем брокерскому счёту вы используете только ваш персональный токен из личного кабинета Тинькофф Инвестиций. +3. Для доступа к вашем брокерскому счёту вы используете только ваш персональный токен из личного кабинета Т-Инвестиций. 4. Этот токен вы генерируете самостоятельно. 5. Для нормальной работы этой программы вы самостоятельно записываете токен в текстовый файл, который сохраняется только на вашем устройстве. 6. Вы можете в любой момент отозвать (деактивировать) свой токен, если у вас возникнут подозрения в компрометации. @@ -125,8 +126,7 @@ MIT License. Используйте как хотите и где хотите # Ссылки -- https://www.tinkoff.ru/invest/ -- https://www.tinkoff.ru/invest/web-terminal/ -- https://github.com/TinkoffCreditSystems/invest-openapi/ -- https://tinkoffcreditsystems.github.io/invest-openapi/ +- https://tbank.ru/invest/ +- https://developer.tbank.ru/invest/api/t-invest-api +- https://github.com/RussianInvestments/investAPI - https://t.me/tinkoffinvestopenapi From 5a1e165c9980b87ac54b78cb353647adb1a074f6 Mon Sep 17 00:00:00 2001 From: Aleksey Kurepin Date: Tue, 9 Sep 2025 18:21:23 +0300 Subject: [PATCH 11/17] available_currencies method added --- README.md | 1 + lib/tinky.rb | 12 ++++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2c68444..730755f 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,7 @@ $ bin/console ```sh pry(Tinky)> portfolio pry(Tinky)> wallet +pry(Tinky)> available_currencies pry(Tinky)> puts summary_table(summary_data.values) ``` diff --git a/lib/tinky.rb b/lib/tinky.rb index 19c9f34..57d500c 100644 --- a/lib/tinky.rb +++ b/lib/tinky.rb @@ -12,7 +12,8 @@ module Tinky # rubocop:disable Metrics/ModuleLength rub: { symbol: '₽', ticker: 'RUB000UTSTOM' }, usd: { symbol: '$', ticker: 'USD000UTSTOM' }, eur: { symbol: '€', ticker: 'EUR_RUB__TOM' }, - cny: { symbol: '¥', ticker: 'CNYRUB_TOM_CETS' } + cny: { symbol: '¥', ticker: 'CNYRUB_TOM_CETS' }, + try: { symbol: '₺', ticker: 'TRYRUB_TOM_CETS' } }.freeze class << self # rubocop:disable Metrics/ClassLength @@ -105,6 +106,13 @@ def summary_data } end + def available_currencies + @available_currencies ||= client.currencies[:instruments].reduce({}) do |memo, currency| + data = currency.slice(:ticker, :name) + memo.merge!(currency[:isoCurrencyName].to_sym => data) + end + end + private def client Client.new @@ -239,7 +247,7 @@ def summary_table(items) def symbol_by_ticker(ticker) pair = CURRENCIES.values.find { |c| c[:ticker] == ticker.to_s } - pair&.fetch(:symbol, nil) + pair&.fetch(:symbol, nil) || '?' end def total_yield From 7789d2ff69c7d4148676120459b706d58540eeb7 Mon Sep 17 00:00:00 2001 From: Aleksey Kurepin Date: Tue, 9 Sep 2025 18:37:08 +0300 Subject: [PATCH 12/17] wallet.png update --- examples/wallet.png | Bin 18640 -> 46945 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/examples/wallet.png b/examples/wallet.png index 4eef95f021c8388328fd76d5e645405aa79f0ca1..fc88d1bf4d2748100c935eb6ebc27c24d77adefb 100644 GIT binary patch literal 46945 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 C5pt{m From 1d21967b442fd837e1dd562788c0f5d2693f5ae3 Mon Sep 17 00:00:00 2001 From: Aleksey Kurepin Date: Tue, 9 Sep 2025 18:39:04 +0300 Subject: [PATCH 13/17] wallet.png update --- examples/wallet.png | Bin 46945 -> 23419 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/examples/wallet.png b/examples/wallet.png index fc88d1bf4d2748100c935eb6ebc27c24d77adefb..d52fa5f13e685496badba8cc7217b9ce056263c9 100644 GIT binary patch delta 20233 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 HB{Ts5B~Shf literal 46945 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 Date: Tue, 9 Sep 2025 18:51:02 +0300 Subject: [PATCH 14/17] README.md updated --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 730755f..a6aef15 100644 --- a/README.md +++ b/README.md @@ -40,11 +40,11 @@ $ bin/portfolio - `Name` — название актива. - `Amount` — количество в штуках или сумма в валюте. - `Avg. buy` — средняя цена покупки актива. Показатель берётся напрямую из OpenAPI. Например: если вы купили 2 акции за 10 и 20 рублей, то средняя цена покупки будет 15 рублей. От этой стоимости и текущей цены считается ожидаемый доход. -- `Current price` — текущая цена актива. Не отдаётся напрямую из OpenAPI, поэтому программа вычисляет цену по формуле: `((balance * avg_buy_price) + expected_yield) / balance`. Возможно небольшое отличие от тикеров на сервере брокера. -- `Buy sum` — начальная стоимость актива по средней цене на момент покупки. -- `Current sum` — текущая стоимость актива по текущей рыночной цене. -- `Yield` — ожидаемый доход в валюте. Показатель берётся напрямую из OpenAPI. -- `Yield %` — ожидаемый доход в процентах. Не отдаётся напрямую из OpenAPI, поэтому программа вычисляет процент по формуле: `expected_yield / (avg_buy_price * balance) * 100`. +- `Current price` — текущая цена актива. Отдаётся напрямую из API. +- `Buy sum` — начальная стоимость актива по средней цене на момент покупки. Не отдаётся напрямую из API, поэтому программа вычисляет сумму по формуле: `avg_buy_price * amount`. +- `Current sum` — текущая стоимость актива по текущей рыночной цене. Не отдаётся напрямую из API, поэтому программа вычисляет сумму по формуле: `current_price * amount`. +- `Yield` — ожидаемый доход в валюте. Показатель берётся напрямую из API. +- `Yield %` — ожидаемый доход в процентах. Не отдаётся напрямую из API, поэтому программа вычисляет процент по формуле: `expected_yield / (avg_buy_price * amount) * 100`. ## Валюта From 1786b836415b89084e190357f9dc25a6cd6c75c1 Mon Sep 17 00:00:00 2001 From: Aleksey Kurepin Date: Tue, 9 Sep 2025 19:11:12 +0300 Subject: [PATCH 15/17] CURRENCY_MODE added --- lib/tinky.rb | 12 +++++++----- lib/tinky/client.rb | 5 +++-- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/tinky.rb b/lib/tinky.rb index 57d500c..9cbf483 100644 --- a/lib/tinky.rb +++ b/lib/tinky.rb @@ -16,6 +16,8 @@ module Tinky # rubocop:disable Metrics/ModuleLength try: { symbol: '₺', ticker: 'TRYRUB_TOM_CETS' } }.freeze + CURRENCY_MODE = :rub # NOTE: for further development + class << self # rubocop:disable Metrics/ClassLength def portfolio puts "\nPortfolio:" @@ -95,11 +97,11 @@ def wallet_table(items) def summary_data expected_yield = total_without_currencies / (100 + total_yield[0]) * total_yield[0] - + symbol = CURRENCIES[CURRENCY_MODE][:symbol] { - total_purchases: [total_purchases, '₽'], - expected_yield: [expected_yield, '₽'], - expected_total: [total_without_currencies, '₽'], + total_purchases: [total_purchases, symbol], + expected_yield: [expected_yield, symbol], + expected_total: [total_without_currencies, symbol], total_yield: total_yield, rub_balance: rub_balance, total_with_rub: decorate_price(portfolio_data[:totalAmountPortfolio]) @@ -123,7 +125,7 @@ def pastel end def portfolio_data - @portfolio_data ||= client.portfolio + @portfolio_data ||= client.portfolio(currency_mode: CURRENCY_MODE) end def row_data(item) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength diff --git a/lib/tinky/client.rb b/lib/tinky/client.rb index da9ad68..fa99927 100644 --- a/lib/tinky/client.rb +++ b/lib/tinky/client.rb @@ -11,8 +11,9 @@ def initialize @connection = Client.make_connection(ENV.fetch('TINKOFF_OPENAPI_URL', nil)) end - def portfolio - request_data('OperationsService/GetPortfolio', { accountId: '2000377503', currency: 'RUB' }) + def portfolio(currency_mode:) + account_id = accounts[:accounts].first[:id] + request_data('OperationsService/GetPortfolio', { accountId: account_id, currency: currency_mode }) end def currencies From 863f19c4217dedb605b9ba0fee90dda4682c142b Mon Sep 17 00:00:00 2001 From: Aleksey Kurepin Date: Tue, 9 Sep 2025 19:54:26 +0300 Subject: [PATCH 16/17] Client methods refactoring --- lib/tinky/client.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/tinky/client.rb b/lib/tinky/client.rb index fa99927..14bd1a1 100644 --- a/lib/tinky/client.rb +++ b/lib/tinky/client.rb @@ -13,7 +13,8 @@ def initialize def portfolio(currency_mode:) account_id = accounts[:accounts].first[:id] - request_data('OperationsService/GetPortfolio', { accountId: account_id, currency: currency_mode }) + request_data('OperationsService/GetPortfolio', + { accountId: account_id, currency: currency_mode }) end def currencies @@ -23,11 +24,11 @@ def currencies end def user_info - request_data('UsersService/GetInfo', {}) + request_data('UsersService/GetInfo') end def accounts - request_data('UsersService/GetAccounts', { status: 'ACCOUNT_STATUS_UNSPECIFIED' }) + request_data('UsersService/GetAccounts', { status: 'ACCOUNT_STATUS_OPEN' }) end private From d3834eadac8c62fc5f9871c7a2446af09d56ba8e Mon Sep 17 00:00:00 2001 From: Aleksey Kurepin Date: Tue, 9 Sep 2025 19:54:51 +0300 Subject: [PATCH 17/17] User info and Account info added --- lib/tinky.rb | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/lib/tinky.rb b/lib/tinky.rb index 9cbf483..380185f 100644 --- a/lib/tinky.rb +++ b/lib/tinky.rb @@ -26,6 +26,12 @@ def portfolio puts "\nTotal amount summary:" puts summary_table(summary_data.values) + puts "\nUser info:" + puts user_info_table + + puts "\nAccount info:" + puts account_table + print_timestamp end @@ -95,6 +101,22 @@ def wallet_table(items) table.render(:unicode, padding: [0, 1, 0, 1]) end + def user_info_table + table = TTY::Table.new + user_info_rows.each do |row| + table << row + end + table.render(:unicode, padding: [0, 1, 0, 1]) + end + + def account_table + table = TTY::Table.new + account_rows.each do |row| + table << row + end + table.render(:unicode, padding: [0, 1, 0, 1]) + end + def summary_data expected_yield = total_without_currencies / (100 + total_yield[0]) * total_yield[0] symbol = CURRENCIES[CURRENCY_MODE][:symbol] @@ -128,6 +150,14 @@ def portfolio_data @portfolio_data ||= client.portfolio(currency_mode: CURRENCY_MODE) end + def user_data + @user_data ||= client.user_info + end + + def account_data + @account_data ||= client.accounts[:accounts].first + end + def row_data(item) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength currency = item[:averagePositionPrice][:currency] amount = decorate_amount(item[:quantity][:units]).to_i @@ -268,6 +298,26 @@ def total_without_currencies def rub_balance decorate_price(portfolio_data[:totalAmountCurrencies]) end + + def user_info_rows # rubocop:disable Metrics/AbcSize + [ + [pastel.bold('User ID'), user_data[:userId]], + [pastel.bold('Premium status'), user_data[:premStatus] ? '✅' : '❌'], + [pastel.bold('Qual status'), user_data[:qualStatus] ? '✅' : '❌'], + [pastel.bold('Tariff'), user_data[:tariff].capitalize], + [pastel.bold('Risk level'), user_data[:riskLevelCode].capitalize] + ] + end + + def account_rows # rubocop:disable Metrics/AbcSize + [ + [pastel.bold('Account ID'), account_data[:id]], + [pastel.bold('Type'), account_data[:type]], + [pastel.bold('Name'), account_data[:name]], + [pastel.bold('Opened at'), Time.parse(account_data[:openedDate]).strftime('%d %b %Y')], + [pastel.bold('Access level'), account_data[:accessLevel]] + ] + end end end