gera 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +674 -0
- data/README.md +67 -0
- data/Rakefile +43 -0
- data/app/assets/config/gera_manifest.js +2 -0
- data/app/assets/javascripts/gera/application.js +14 -0
- data/app/assets/stylesheets/gera/application.css +15 -0
- data/app/authorizers/gera/application_authorizer.rb +6 -0
- data/app/authorizers/gera/currency_rate_authorizer.rb +9 -0
- data/app/authorizers/gera/currency_rate_mode_authorizer.rb +7 -0
- data/app/authorizers/gera/direction_rate_authorizer.rb +8 -0
- data/app/authorizers/gera/exchange_rate_authorizer.rb +8 -0
- data/app/authorizers/gera/payment_system_authorizer.rb +13 -0
- data/app/authorizers/gera/rate_source_authorizer.rb +7 -0
- data/app/controllers/gera/application_controller.rb +30 -0
- data/app/controllers/gera/currencies_controller.rb +8 -0
- data/app/controllers/gera/currency_rate_history_intervals_controller.rb +53 -0
- data/app/controllers/gera/currency_rate_mode_snapshots_controller.rb +83 -0
- data/app/controllers/gera/currency_rate_modes_controller.rb +60 -0
- data/app/controllers/gera/currency_rates_controller.rb +70 -0
- data/app/controllers/gera/direction_rate_history_intervals_controller.rb +62 -0
- data/app/controllers/gera/direction_rates_controller.rb +28 -0
- data/app/controllers/gera/exchange_rates_controller.rb +25 -0
- data/app/controllers/gera/external_rate_snapshots_controller.rb +35 -0
- data/app/controllers/gera/external_rates_controller.rb +28 -0
- data/app/controllers/gera/payment_systems_controller.rb +78 -0
- data/app/controllers/gera/rate_sources_controller.rb +8 -0
- data/app/decorators/gera/currency_rate_decorator.rb +148 -0
- data/app/decorators/gera/direction_rate_decorator.rb +47 -0
- data/app/decorators/gera/payment_system_decorator.rb +19 -0
- data/app/helpers/gera/application_helper.rb +110 -0
- data/app/helpers/gera/currency_rate_helper.rb +19 -0
- data/app/helpers/gera/currency_rate_modes_helper.rb +73 -0
- data/app/helpers/gera/direction_rate_helper.rb +36 -0
- data/app/helpers/gera/exchange_rates_helper.rb +21 -0
- data/app/jobs/gera/application_job.rb +6 -0
- data/app/models/concerns/gera/currency_pair_generator.rb +14 -0
- data/app/models/concerns/gera/currency_pair_support.rb +42 -0
- data/app/models/concerns/gera/currency_rate_mode_builder_support.rb +35 -0
- data/app/models/concerns/gera/direction_support.rb +14 -0
- data/app/models/concerns/gera/history_interval_concern.rb +46 -0
- data/app/models/gera/application_record.rb +8 -0
- data/app/models/gera/cbr_external_rate.rb +13 -0
- data/app/models/gera/cross_rate_mode.rb +13 -0
- data/app/models/gera/currency_rate.rb +78 -0
- data/app/models/gera/currency_rate_history_interval.rb +25 -0
- data/app/models/gera/currency_rate_history_interval_filter.rb +30 -0
- data/app/models/gera/currency_rate_mode.rb +20 -0
- data/app/models/gera/currency_rate_mode_snapshot.rb +26 -0
- data/app/models/gera/currency_rate_snapshot.rb +12 -0
- data/app/models/gera/direction.rb +44 -0
- data/app/models/gera/direction_rate.rb +136 -0
- data/app/models/gera/direction_rate_history_interval.rb +33 -0
- data/app/models/gera/direction_rate_history_interval_filter.rb +30 -0
- data/app/models/gera/direction_rate_snapshot.rb +7 -0
- data/app/models/gera/exchange_rate.rb +130 -0
- data/app/models/gera/external_rate.rb +38 -0
- data/app/models/gera/external_rate_snapshot.rb +20 -0
- data/app/models/gera/payment_system.rb +98 -0
- data/app/models/gera/rate_source.rb +77 -0
- data/app/models/gera/rate_source_auto.rb +25 -0
- data/app/models/gera/rate_source_bitfinex.rb +9 -0
- data/app/models/gera/rate_source_cbr.rb +13 -0
- data/app/models/gera/rate_source_cbr_avg.rb +6 -0
- data/app/models/gera/rate_source_exmo.rb +9 -0
- data/app/models/gera/rate_source_manual.rb +13 -0
- data/app/views/application/_exchange_rate_monitor.slim +1 -0
- data/app/views/gera/application/_attributes_table.slim +5 -0
- data/app/views/gera/application/_currencies_table.slim +18 -0
- data/app/views/gera/application/_currency_rate_mode_snapshots.slim +6 -0
- data/app/views/gera/application/_direction_rate.slim +6 -0
- data/app/views/gera/application/_directions_submenu.slim +11 -0
- data/app/views/gera/application/_directions_table.slim +15 -0
- data/app/views/gera/application/_exchange_rate.slim +6 -0
- data/app/views/gera/application/_external_rate.slim +6 -0
- data/app/views/gera/application/_header.slim +12 -0
- data/app/views/gera/application/_table.slim +28 -0
- data/app/views/gera/application/_topnav.slim +21 -0
- data/app/views/gera/application/direction_details.slim +75 -0
- data/app/views/gera/application/page.html.slim +1 -0
- data/app/views/gera/currencies/index.html.slim +20 -0
- data/app/views/gera/currency_rate_history_intervals/_filter.slim +11 -0
- data/app/views/gera/currency_rate_history_intervals/index.slim +39 -0
- data/app/views/gera/currency_rate_mode_snapshots/_snapshot.slim +20 -0
- data/app/views/gera/currency_rate_mode_snapshots/edit.html.slim +30 -0
- data/app/views/gera/currency_rate_modes/_cross_rate_mode_fields.slim +21 -0
- data/app/views/gera/currency_rate_modes/_currency_rate_mode.slim +7 -0
- data/app/views/gera/currency_rate_modes/_form.slim +29 -0
- data/app/views/gera/currency_rate_modes/edit.slim +11 -0
- data/app/views/gera/currency_rate_modes/index.html.slim +12 -0
- data/app/views/gera/currency_rates/_currency_rate.slim +22 -0
- data/app/views/gera/currency_rates/_currency_rate_humanized.slim +35 -0
- data/app/views/gera/currency_rates/diff.slim +12 -0
- data/app/views/gera/currency_rates/index.slim +27 -0
- data/app/views/gera/currency_rates/modes.slim +14 -0
- data/app/views/gera/currency_rates/show.slim +4 -0
- data/app/views/gera/direction_rate_history_intervals/_filter.slim +11 -0
- data/app/views/gera/direction_rate_history_intervals/index.slim +41 -0
- data/app/views/gera/direction_rates/_direction_rate_example_calculator.slim +28 -0
- data/app/views/gera/direction_rates/diff.slim +19 -0
- data/app/views/gera/direction_rates/index.slim +26 -0
- data/app/views/gera/direction_rates/legacy.html.slim +5 -0
- data/app/views/gera/direction_rates/minimals.slim +5 -0
- data/app/views/gera/direction_rates/show.slim +14 -0
- data/app/views/gera/external_rate_snapshots/index.slim +25 -0
- data/app/views/gera/external_rate_snapshots/show.slim +22 -0
- data/app/views/gera/external_rates/_flat_list.slim +22 -0
- data/app/views/gera/external_rates/index.html.slim +28 -0
- data/app/views/gera/external_rates/show.slim +1 -0
- data/app/views/gera/payment_systems/_fields.slim +4 -0
- data/app/views/gera/payment_systems/_fields_table.slim +18 -0
- data/app/views/gera/payment_systems/_form.slim +9 -0
- data/app/views/gera/payment_systems/edit.slim +7 -0
- data/app/views/gera/payment_systems/index.slim +3 -0
- data/app/views/gera/payment_systems/new.slim +9 -0
- data/app/views/gera/payment_systems/show.slim +1 -0
- data/app/views/gera/rate_sources/_list.slim +13 -0
- data/app/views/gera/rate_sources/_rate_source.slim +23 -0
- data/app/views/gera/rate_sources/index.html.slim +6 -0
- data/app/views/layouts/application.html.slim +15 -0
- data/app/views/layouts/gera/blank.html.slim +10 -0
- data/app/workers/concerns/gera/rates_worker.rb +87 -0
- data/app/workers/gera/bitfinex_rates_worker.rb +65 -0
- data/app/workers/gera/cbr_avg_rates_worker.rb +42 -0
- data/app/workers/gera/cbr_rates_worker.rb +192 -0
- data/app/workers/gera/create_history_intervals_worker.rb +38 -0
- data/app/workers/gera/currency_rates_worker.rb +64 -0
- data/app/workers/gera/directions_rates_worker.rb +51 -0
- data/app/workers/gera/exmo_rates_worker.rb +62 -0
- data/app/workers/gera/purge_currency_rates_worker.rb +21 -0
- data/app/workers/gera/purge_direction_rates_worker.rb +30 -0
- data/config/currencies.yml +559 -0
- data/config/routes.rb +30 -0
- data/db/migrate/20180912130000_setup.rb +228 -0
- data/db/migrate/20190314114844_add_is_available_to_payment_systems.rb +7 -0
- data/db/migrate/20190315113046_add_icon_url_to_payment_systems.rb +7 -0
- data/db/migrate/20190315132137_add_commission_to_payment_systems.rb +7 -0
- data/lib/banks/currency_exchange.rb +12 -0
- data/lib/builders/currency_rate_auto_builder.rb +38 -0
- data/lib/builders/currency_rate_builder.rb +60 -0
- data/lib/builders/currency_rate_cross_builder.rb +70 -0
- data/lib/builders/currency_rate_direct_builder.rb +26 -0
- data/lib/gera.rb +32 -0
- data/lib/gera/bitfinex_fetcher.rb +36 -0
- data/lib/gera/configuration.rb +47 -0
- data/lib/gera/currencies_purger.rb +28 -0
- data/lib/gera/currency_pair.rb +93 -0
- data/lib/gera/engine.rb +14 -0
- data/lib/gera/mathematic.rb +156 -0
- data/lib/gera/money_support.rb +89 -0
- data/lib/gera/numeric.rb +25 -0
- data/lib/gera/railtie.rb +8 -0
- data/lib/gera/rate.rb +22 -0
- data/lib/gera/rate_from_multiplicator.rb +54 -0
- data/lib/gera/repositories/currency_rate_modes_repository.rb +37 -0
- data/lib/gera/repositories/currency_rates_repository.rb +25 -0
- data/lib/gera/repositories/direction_rates_repository.rb +46 -0
- data/lib/gera/repositories/exchange_rates_repository.rb +23 -0
- data/lib/gera/repositories/payment_systems_repository.rb +21 -0
- data/lib/gera/repositories/universe.rb +47 -0
- data/lib/gera/version.rb +3 -0
- data/lib/tasks/auto_generate_diagram.rake +6 -0
- data/lib/tasks/gera_tasks.rake +4 -0
- metadata +765 -0
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Gera
|
4
|
+
class RateSourceCBR < RateSource
|
5
|
+
def self.supported_currencies
|
6
|
+
%i[RUB KZT USD EUR UAH].map { |m| Money::Currency.find! m }
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.available_pairs
|
10
|
+
['KZT/RUB', 'USD/RUB', 'EUR/RUB', 'UAH/RUB'].map { |cp| Gera::CurrencyPair.new cp }.freeze
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
pre rate monitor (replace) for exchange_rate #{exchange_rate_id}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
- currencies ||= Money::Currency.all
|
2
|
+
- min_width ||= 80
|
3
|
+
|
4
|
+
.table-sticky-container
|
5
|
+
table.table.table-condensed.table-narrow.text-right.table-cross
|
6
|
+
thead.bg-white
|
7
|
+
tr
|
8
|
+
th.text-center colspan=currencies.count+1 Отдаем →
|
9
|
+
tr
|
10
|
+
th.text-nowrap Получаем ↓
|
11
|
+
- currencies.each do |cur|
|
12
|
+
th.text-right style="min-width: #{min_width}px"= cur
|
13
|
+
tbody
|
14
|
+
- currencies.each do |cur2|
|
15
|
+
tr
|
16
|
+
th.text-right= cur2
|
17
|
+
- currencies.each do |cur1|
|
18
|
+
= yield Gera::CurrencyPair.new cur2, cur1
|
@@ -0,0 +1,6 @@
|
|
1
|
+
= link_to 'Создать новый', currency_rate_mode_snapshots_path, method: :post, class: 'btn btn-success'
|
2
|
+
ul.nav.nav-pills.nav-stacked.m-t-lg
|
3
|
+
- Gera::CurrencyRateModeSnapshot.ordered.each do |crms|
|
4
|
+
= active_link_to currency_rate_mode_snapshot_path(crms), wrap_tag: :li, active: current_snapshot == crms do
|
5
|
+
= crms.title
|
6
|
+
span.m-l-md= crms_status_label crms.status
|
@@ -0,0 +1,6 @@
|
|
1
|
+
- object = Gera::DirectionRateDecorator.decorate (direction_rate)
|
2
|
+
|
3
|
+
h2= t '.title', id: direction_rate.id
|
4
|
+
- columns = %i(direction inverse_direction created_at base_rate_value rate_percent ps_comission rate_value)
|
5
|
+
|
6
|
+
= render 'attributes_table', object: object, columns: columns
|
@@ -0,0 +1,11 @@
|
|
1
|
+
h1.m-b-md Управление обменом
|
2
|
+
hr
|
3
|
+
ul.nav.nav-tabs
|
4
|
+
-# TODO
|
5
|
+
-# = active_link_to 'Управление обменом', operator_exchange_managers_url, wrap_tag: :li
|
6
|
+
- if Gera::DirectionRate.readable_by? current_user
|
7
|
+
= active_link_to 'Конечные курсы', direction_rates_url, wrap_tag: :li, active: controller_name == 'direction_rates' && action_name == 'index'
|
8
|
+
|
9
|
+
-# TODO minimals
|
10
|
+
/- if Gera::DirectionRate.readable_by? current_user
|
11
|
+
/= active_link_to 'Минималки', minimals_direction_rates_url, wrap_tag: :li, active: controller_name == 'direction_rates' && action_name == 'minimals'
|
@@ -0,0 +1,15 @@
|
|
1
|
+
.container-scrollable
|
2
|
+
.table-sticky-container
|
3
|
+
table.table-condensed.table-comission.table-cross.table-bordered.table-directions
|
4
|
+
thead.bg-white
|
5
|
+
tr
|
6
|
+
th
|
7
|
+
- payment_systems.each do |ps_to|
|
8
|
+
th.text-center title="(#{ps_to.id}) #{ps_to.name}"
|
9
|
+
= ps_icon ps_to
|
10
|
+
tbody
|
11
|
+
- payment_systems.each do |ps_from|
|
12
|
+
tr
|
13
|
+
th.text-center title="(#{ps_from.id}) #{ps_from.name}"= ps_icon ps_from
|
14
|
+
- payment_systems.each do |ps_to|
|
15
|
+
= yield Gera::Direction.new(ps_from: ps_from, ps_to: ps_to).freeze
|
@@ -0,0 +1,12 @@
|
|
1
|
+
= render 'topnav' do
|
2
|
+
= active_link_to 'Базовый курс', currency_rates_path, wrap_tag: :li
|
3
|
+
= active_link_to 'Конечный курс', direction_rates_path, wrap_tag: :li
|
4
|
+
li.dropdown
|
5
|
+
= link_to '#', class: 'dropdown-toggle', data: { toggle: :dropdown }, role: :button, 'aria-haspopup' => true, 'aria-expanded' => false do
|
6
|
+
| Настройки
|
7
|
+
.m-l-sm.span.caret
|
8
|
+
ul.dropdown-menu
|
9
|
+
= active_link_to 'Валюты', currencies_path, wrap_tag: :li
|
10
|
+
= active_link_to 'Платежные системы', payment_systems_path, wrap_tag: :li
|
11
|
+
= active_link_to 'Методы расчета', currency_rate_mode_snapshots_path, wrap_tag: :li
|
12
|
+
= active_link_to 'Источники курсов', rate_sources_path, wrap_tag: :li
|
@@ -0,0 +1,28 @@
|
|
1
|
+
- allow_edit = false unless defined? :allow_edit
|
2
|
+
- parent = nil unless defined? :parent
|
3
|
+
- if scope.empty?
|
4
|
+
p.text-info Пусто
|
5
|
+
- else
|
6
|
+
.table-sticky-container
|
7
|
+
table.table.table-condensed.table-striped.table-narrow
|
8
|
+
thead.bg-white
|
9
|
+
tr
|
10
|
+
- columns.each do |column|
|
11
|
+
th title=column
|
12
|
+
= decorator_class.attribute_title column
|
13
|
+
- if params[:show_attribute]
|
14
|
+
br
|
15
|
+
code.text-small= column
|
16
|
+
tbody
|
17
|
+
- scope.each do |record|
|
18
|
+
- decorated = decorator_class.decorate record
|
19
|
+
tr class=decorated.try(:row_class)
|
20
|
+
- columns.each do |column|
|
21
|
+
td class=(decorated.try(:column_class, column) || 'text-nowrap')
|
22
|
+
- if allow_edit && allow_edit_column?(record, column)
|
23
|
+
- value = record.send column
|
24
|
+
= smart_best_in_place [namespace, parent, decorated].compact, column, value
|
25
|
+
- else
|
26
|
+
= decorated.send column
|
27
|
+
|
28
|
+
= paginate scope if scope.respond_to? :total_pages
|
@@ -0,0 +1,21 @@
|
|
1
|
+
nav.navbar.navbar-default.navbar-fixed-top
|
2
|
+
.container-fluid
|
3
|
+
.navbar-header
|
4
|
+
button.navbar-toggle.collapsed aria-controls="navbar" aria-expanded="false" data-target="#navbar" data-toggle="collapse" type="button"
|
5
|
+
span.sr-only Toggle navigation
|
6
|
+
span.icon-bar
|
7
|
+
span.icon-bar
|
8
|
+
span.icon-bar
|
9
|
+
= link_to app_title, root_path, class: 'navbar-brand'
|
10
|
+
#navbar.collapse.navbar-collapse
|
11
|
+
ul.nav.navbar-nav
|
12
|
+
= yield
|
13
|
+
|
14
|
+
- if logged_in?
|
15
|
+
ul.nav.navbar-nav.navbar-right
|
16
|
+
li.dropdown
|
17
|
+
= link_to '#', class: 'dropdown-toggle', data: { toggle: 'dropdown' }, role: :button, 'aria-haspopup' => true, 'aria-expanded' => false do
|
18
|
+
= ion_icon :user, text: current_user.email
|
19
|
+
.m-l-sm.span.caret
|
20
|
+
ul.dropdown-menu
|
21
|
+
li= link_to t('.exit'), main_app.sessions_path, method: :delete
|
@@ -0,0 +1,75 @@
|
|
1
|
+
- ps_from = direction.ps_from
|
2
|
+
- ps_to = direction.ps_to
|
3
|
+
- exchange_rate = direction.exchange_rate
|
4
|
+
- direction_rate = direction.direction_rate
|
5
|
+
.row
|
6
|
+
.col-md-3
|
7
|
+
dl
|
8
|
+
dt Конечный курс
|
9
|
+
dd= rate_humanized_description(direction_rate.rate_value, ps_from.currency, ps_to.currency)
|
10
|
+
dt Направление
|
11
|
+
dd
|
12
|
+
= direction_with_icons direction
|
13
|
+
dt Статус
|
14
|
+
dd
|
15
|
+
- if exchange_rate.is_enabled?
|
16
|
+
.label.label-success Включено
|
17
|
+
- else
|
18
|
+
.label.label-default Отключено
|
19
|
+
|
20
|
+
/- if legacy_rate.present?
|
21
|
+
/dt В пыхе
|
22
|
+
/= rate_humanized_description(legacy_rate, ps_from.currency, ps_to.currency)
|
23
|
+
|
24
|
+
.col-md-3
|
25
|
+
dl
|
26
|
+
dt Базовый курс
|
27
|
+
dd= rate_humanized_description direction_rate.base_rate_value, ps_from.currency, ps_to.currency
|
28
|
+
dt Комиссия
|
29
|
+
dd= '%.3f%' % direction_rate.rate_percent
|
30
|
+
|
31
|
+
dt Обратный конечный курс: #{direction_with_icons direction_rate.inverse_direction_rate}
|
32
|
+
dd= rate_humanized_description(direction_rate.inverse_direction_rate.rate_value, ps_from.currency, ps_to.currency)
|
33
|
+
.col-md-3
|
34
|
+
- status = BestChangeService.new( exchange_rate: exchange_rate ).status
|
35
|
+
dt
|
36
|
+
dt На bestchange.ru
|
37
|
+
- if status.present?
|
38
|
+
dd
|
39
|
+
span.m-r-md = '%.3f%' % status.bestchange_base_percent_rate
|
40
|
+
- if status.state == BestChangeStatus::STATE_ACTUAL
|
41
|
+
span.label.label.success OK
|
42
|
+
- else
|
43
|
+
span.label.label-danger Комиссия отличается (#{status.state})
|
44
|
+
=
|
45
|
+
dt Позиция
|
46
|
+
dd= status.position + 1
|
47
|
+
dt Курс
|
48
|
+
dd= status.finite_rate
|
49
|
+
- else
|
50
|
+
dd
|
51
|
+
span.label.label-warning В списке отсутствует
|
52
|
+
.col-md-3
|
53
|
+
dl
|
54
|
+
dt Публичные резервы
|
55
|
+
dd= humanized_money_with_currency ps_to.reserve_amount
|
56
|
+
|
57
|
+
dt Минимальная сумма на обмен (расчет)
|
58
|
+
dd= humanized_money_with_currency direction_rate.minimal_income_amount
|
59
|
+
|
60
|
+
dt Максимальная сумма на обмен (расчет)
|
61
|
+
dd= humanized_money_with_currency direction_rate.maximal_income_amount
|
62
|
+
|
63
|
+
/dt Минималка на прием (#{direction.currency_from})
|
64
|
+
/dd
|
65
|
+
/= humanized_money_with_currency direction.minimal_income_amount
|
66
|
+
/span.m-l-md= "(#{humanized_money_with_currency direction.minimal_income_amount.exchange_to(direction.currency_to)})".html_safe
|
67
|
+
|
68
|
+
/dt Минималка на отдачу (#{direction.currency_to})
|
69
|
+
/dd
|
70
|
+
/= humanized_money_with_currency direction.minimal_out_amount
|
71
|
+
/span.m-l-md= "(#{humanized_money_with_currency direction.minimal_out_amount.exchange_to(direction.currency_from)})".html_safe
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
div.text-small.text-muted Расчет за #{l direction_rate.created_at, format: :long}, direction_rate_snapshot_id=#{Gera::Universe.direction_rates_repository.snapshot.id}
|
@@ -0,0 +1 @@
|
|
1
|
+
p= message
|
@@ -0,0 +1,20 @@
|
|
1
|
+
h1 Валюта
|
2
|
+
|
3
|
+
table.table.table-narrow.table-striped.table-condensed
|
4
|
+
thead.bg-white
|
5
|
+
tr
|
6
|
+
th Валюта
|
7
|
+
th iso number
|
8
|
+
th Локальный ID
|
9
|
+
th Минимальная сумма на ввод
|
10
|
+
th Минимальная сумма на вывод
|
11
|
+
th Знаков после запятой для хранения
|
12
|
+
th Разрешенное округление
|
13
|
+
- Money::Currency.each do |c|
|
14
|
+
tr
|
15
|
+
td= c
|
16
|
+
td= c.iso_numeric
|
17
|
+
td= c.local_id
|
18
|
+
td= c.minimal_input_value.format
|
19
|
+
td= c.minimal_output_value.format
|
20
|
+
td= c.decimal_places
|
@@ -0,0 +1,11 @@
|
|
1
|
+
= simple_form_for filter, url: currency_rate_history_intervals_path, method: :GET do |f|
|
2
|
+
.row
|
3
|
+
.col-md-3
|
4
|
+
= f.input :cur_from, collection: currencies_enum, include_blank: false, label: false, hint: 'Входящая валюты'
|
5
|
+
.col-md-3
|
6
|
+
= f.input :cur_to, collection: currencies_enum, include_blank: false, label: false, hint: 'Исходящая валюта'
|
7
|
+
.col-md-3
|
8
|
+
= f.input :value_type, collection: [['Значение курса','rate']], include_blank: false, label: false, hint: 'Что смотрим?'
|
9
|
+
.col-md-3
|
10
|
+
= f.button :submit, 'Обновить', class: 'btn btn-primary'
|
11
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
= render 'filter'
|
2
|
+
|
3
|
+
#container style="height: 400px; min-width: 310px"
|
4
|
+
|
5
|
+
= javascript_include_tag 'https://code.highcharts.com/stock/highstock.js'
|
6
|
+
= javascript_include_tag 'https://code.highcharts.com/stock/modules/exporting.js'
|
7
|
+
|
8
|
+
javascript:
|
9
|
+
$.getJSON('#{currency_rate_history_intervals_path(format: :json, currency_rate_history_interval_filter: filter.to_param)}', function (data) {
|
10
|
+
// create the chart
|
11
|
+
Highcharts.stockChart('container', {
|
12
|
+
rangeSelector: {
|
13
|
+
buttons: [{
|
14
|
+
type: 'hour',
|
15
|
+
count: 1,
|
16
|
+
text: '1ч'
|
17
|
+
}, {
|
18
|
+
type: 'day',
|
19
|
+
count: 1,
|
20
|
+
text: '1д'
|
21
|
+
}, {
|
22
|
+
type: 'all',
|
23
|
+
count: 1,
|
24
|
+
text: 'Всё'
|
25
|
+
}],
|
26
|
+
selected: 1,
|
27
|
+
inputEnabled: false
|
28
|
+
},
|
29
|
+
|
30
|
+
series: [{
|
31
|
+
name: 'Базовый курс',
|
32
|
+
type: 'candlestick',
|
33
|
+
data: data,
|
34
|
+
tooltip: {
|
35
|
+
valueDecimals: #{value_decimals}
|
36
|
+
}
|
37
|
+
}]
|
38
|
+
});
|
39
|
+
});
|
@@ -0,0 +1,20 @@
|
|
1
|
+
= render layout: 'currencies_table', locals: { min_width: 50 } do |pair|
|
2
|
+
- currency_rate_mode = snapshot.currency_rate_modes.find_by_currency_pair(pair) || snapshot.currency_rate_modes.build(currency_pair: pair)
|
3
|
+
td.rate-popover data=crms_cell_data_attr(currency_rate_mode) class=(currency_rate_mode.build_result.error? ? 'text-danger' : '')
|
4
|
+
- if currency_rate_mode.currency_pair.same?
|
5
|
+
.text-muted 1
|
6
|
+
- elsif currency_rate_mode.persisted?
|
7
|
+
- if view_mode == :calculations
|
8
|
+
- if currency_rate_mode.build_result.error?
|
9
|
+
.text-danger= currency_rate_mode.build_result.error
|
10
|
+
- else
|
11
|
+
- buffer = currency_rate_mode_detailed(currency_rate_mode.build_result.currency_rate).html_safe
|
12
|
+
- if currency_rate_mode.mode_auto?
|
13
|
+
.text-success
|
14
|
+
= buffer
|
15
|
+
- else
|
16
|
+
= buffer
|
17
|
+
- else
|
18
|
+
= render currency_rate_mode
|
19
|
+
- else
|
20
|
+
| авто
|
@@ -0,0 +1,30 @@
|
|
1
|
+
.row
|
2
|
+
.col-md-10
|
3
|
+
.row.m-b-md
|
4
|
+
.col-md-6
|
5
|
+
h2
|
6
|
+
| Матрица методов расчета
|
7
|
+
|
8
|
+
p Название:
|
9
|
+
= best_in_place snapshot, :title
|
10
|
+
hr
|
11
|
+
p Описание:
|
12
|
+
= best_in_place snapshot, :details
|
13
|
+
.col-md-3
|
14
|
+
= crms_status_label snapshot.status
|
15
|
+
.col-md-3
|
16
|
+
- unless snapshot.status_active?
|
17
|
+
= link_to 'Активировать', activate_currency_rate_mode_snapshot_path(snapshot), method: :post, class: 'btn btn-primary'
|
18
|
+
|
19
|
+
ul.nav.nav-tabs
|
20
|
+
= active_link_to 'Режимы', url_for(view_mode: :methods), wrap_tag: :li, active: view_mode == :methods
|
21
|
+
= active_link_to 'Расчеты', url_for(view_mode: :calculations), wrap_tag: :li, active: view_mode == :calculations
|
22
|
+
|
23
|
+
= render 'snapshot', snapshot: snapshot
|
24
|
+
.col-md-2
|
25
|
+
= render 'currency_rate_mode_snapshots', current_snapshot: snapshot
|
26
|
+
ul
|
27
|
+
- if view_mode == :calculations
|
28
|
+
li.text-success Зеленым цветом автоматический расчет
|
29
|
+
li.text-muted Создан: #{l snapshot.created_at, format: :long}
|
30
|
+
li.text-muted Изменен: #{l snapshot.updated_at, format: :long}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
.nested-fields
|
2
|
+
.row
|
3
|
+
.col-md-3
|
4
|
+
= f.input "cur_from",
|
5
|
+
collection: currencies_enum,
|
6
|
+
label: 'Вход',
|
7
|
+
include_blank: false
|
8
|
+
.col-md-3
|
9
|
+
= f.input "cur_to",
|
10
|
+
collection: currencies_enum,
|
11
|
+
label: 'Выход',
|
12
|
+
include_blank: false
|
13
|
+
|
14
|
+
.col-md-3
|
15
|
+
= f.input "rate_source_id",
|
16
|
+
collection: Gera::RateSource.all,
|
17
|
+
label: 'Из источника',
|
18
|
+
include_blank: 'Авто'
|
19
|
+
|
20
|
+
.col-md-3
|
21
|
+
= link_to_remove_association "Удалить", f, class: 'btn btn-sm btn-danger'
|