gera 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (164) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +674 -0
  3. data/README.md +67 -0
  4. data/Rakefile +43 -0
  5. data/app/assets/config/gera_manifest.js +2 -0
  6. data/app/assets/javascripts/gera/application.js +14 -0
  7. data/app/assets/stylesheets/gera/application.css +15 -0
  8. data/app/authorizers/gera/application_authorizer.rb +6 -0
  9. data/app/authorizers/gera/currency_rate_authorizer.rb +9 -0
  10. data/app/authorizers/gera/currency_rate_mode_authorizer.rb +7 -0
  11. data/app/authorizers/gera/direction_rate_authorizer.rb +8 -0
  12. data/app/authorizers/gera/exchange_rate_authorizer.rb +8 -0
  13. data/app/authorizers/gera/payment_system_authorizer.rb +13 -0
  14. data/app/authorizers/gera/rate_source_authorizer.rb +7 -0
  15. data/app/controllers/gera/application_controller.rb +30 -0
  16. data/app/controllers/gera/currencies_controller.rb +8 -0
  17. data/app/controllers/gera/currency_rate_history_intervals_controller.rb +53 -0
  18. data/app/controllers/gera/currency_rate_mode_snapshots_controller.rb +83 -0
  19. data/app/controllers/gera/currency_rate_modes_controller.rb +60 -0
  20. data/app/controllers/gera/currency_rates_controller.rb +70 -0
  21. data/app/controllers/gera/direction_rate_history_intervals_controller.rb +62 -0
  22. data/app/controllers/gera/direction_rates_controller.rb +28 -0
  23. data/app/controllers/gera/exchange_rates_controller.rb +25 -0
  24. data/app/controllers/gera/external_rate_snapshots_controller.rb +35 -0
  25. data/app/controllers/gera/external_rates_controller.rb +28 -0
  26. data/app/controllers/gera/payment_systems_controller.rb +78 -0
  27. data/app/controllers/gera/rate_sources_controller.rb +8 -0
  28. data/app/decorators/gera/currency_rate_decorator.rb +148 -0
  29. data/app/decorators/gera/direction_rate_decorator.rb +47 -0
  30. data/app/decorators/gera/payment_system_decorator.rb +19 -0
  31. data/app/helpers/gera/application_helper.rb +110 -0
  32. data/app/helpers/gera/currency_rate_helper.rb +19 -0
  33. data/app/helpers/gera/currency_rate_modes_helper.rb +73 -0
  34. data/app/helpers/gera/direction_rate_helper.rb +36 -0
  35. data/app/helpers/gera/exchange_rates_helper.rb +21 -0
  36. data/app/jobs/gera/application_job.rb +6 -0
  37. data/app/models/concerns/gera/currency_pair_generator.rb +14 -0
  38. data/app/models/concerns/gera/currency_pair_support.rb +42 -0
  39. data/app/models/concerns/gera/currency_rate_mode_builder_support.rb +35 -0
  40. data/app/models/concerns/gera/direction_support.rb +14 -0
  41. data/app/models/concerns/gera/history_interval_concern.rb +46 -0
  42. data/app/models/gera/application_record.rb +8 -0
  43. data/app/models/gera/cbr_external_rate.rb +13 -0
  44. data/app/models/gera/cross_rate_mode.rb +13 -0
  45. data/app/models/gera/currency_rate.rb +78 -0
  46. data/app/models/gera/currency_rate_history_interval.rb +25 -0
  47. data/app/models/gera/currency_rate_history_interval_filter.rb +30 -0
  48. data/app/models/gera/currency_rate_mode.rb +20 -0
  49. data/app/models/gera/currency_rate_mode_snapshot.rb +26 -0
  50. data/app/models/gera/currency_rate_snapshot.rb +12 -0
  51. data/app/models/gera/direction.rb +44 -0
  52. data/app/models/gera/direction_rate.rb +136 -0
  53. data/app/models/gera/direction_rate_history_interval.rb +33 -0
  54. data/app/models/gera/direction_rate_history_interval_filter.rb +30 -0
  55. data/app/models/gera/direction_rate_snapshot.rb +7 -0
  56. data/app/models/gera/exchange_rate.rb +130 -0
  57. data/app/models/gera/external_rate.rb +38 -0
  58. data/app/models/gera/external_rate_snapshot.rb +20 -0
  59. data/app/models/gera/payment_system.rb +98 -0
  60. data/app/models/gera/rate_source.rb +77 -0
  61. data/app/models/gera/rate_source_auto.rb +25 -0
  62. data/app/models/gera/rate_source_bitfinex.rb +9 -0
  63. data/app/models/gera/rate_source_cbr.rb +13 -0
  64. data/app/models/gera/rate_source_cbr_avg.rb +6 -0
  65. data/app/models/gera/rate_source_exmo.rb +9 -0
  66. data/app/models/gera/rate_source_manual.rb +13 -0
  67. data/app/views/application/_exchange_rate_monitor.slim +1 -0
  68. data/app/views/gera/application/_attributes_table.slim +5 -0
  69. data/app/views/gera/application/_currencies_table.slim +18 -0
  70. data/app/views/gera/application/_currency_rate_mode_snapshots.slim +6 -0
  71. data/app/views/gera/application/_direction_rate.slim +6 -0
  72. data/app/views/gera/application/_directions_submenu.slim +11 -0
  73. data/app/views/gera/application/_directions_table.slim +15 -0
  74. data/app/views/gera/application/_exchange_rate.slim +6 -0
  75. data/app/views/gera/application/_external_rate.slim +6 -0
  76. data/app/views/gera/application/_header.slim +12 -0
  77. data/app/views/gera/application/_table.slim +28 -0
  78. data/app/views/gera/application/_topnav.slim +21 -0
  79. data/app/views/gera/application/direction_details.slim +75 -0
  80. data/app/views/gera/application/page.html.slim +1 -0
  81. data/app/views/gera/currencies/index.html.slim +20 -0
  82. data/app/views/gera/currency_rate_history_intervals/_filter.slim +11 -0
  83. data/app/views/gera/currency_rate_history_intervals/index.slim +39 -0
  84. data/app/views/gera/currency_rate_mode_snapshots/_snapshot.slim +20 -0
  85. data/app/views/gera/currency_rate_mode_snapshots/edit.html.slim +30 -0
  86. data/app/views/gera/currency_rate_modes/_cross_rate_mode_fields.slim +21 -0
  87. data/app/views/gera/currency_rate_modes/_currency_rate_mode.slim +7 -0
  88. data/app/views/gera/currency_rate_modes/_form.slim +29 -0
  89. data/app/views/gera/currency_rate_modes/edit.slim +11 -0
  90. data/app/views/gera/currency_rate_modes/index.html.slim +12 -0
  91. data/app/views/gera/currency_rates/_currency_rate.slim +22 -0
  92. data/app/views/gera/currency_rates/_currency_rate_humanized.slim +35 -0
  93. data/app/views/gera/currency_rates/diff.slim +12 -0
  94. data/app/views/gera/currency_rates/index.slim +27 -0
  95. data/app/views/gera/currency_rates/modes.slim +14 -0
  96. data/app/views/gera/currency_rates/show.slim +4 -0
  97. data/app/views/gera/direction_rate_history_intervals/_filter.slim +11 -0
  98. data/app/views/gera/direction_rate_history_intervals/index.slim +41 -0
  99. data/app/views/gera/direction_rates/_direction_rate_example_calculator.slim +28 -0
  100. data/app/views/gera/direction_rates/diff.slim +19 -0
  101. data/app/views/gera/direction_rates/index.slim +26 -0
  102. data/app/views/gera/direction_rates/legacy.html.slim +5 -0
  103. data/app/views/gera/direction_rates/minimals.slim +5 -0
  104. data/app/views/gera/direction_rates/show.slim +14 -0
  105. data/app/views/gera/external_rate_snapshots/index.slim +25 -0
  106. data/app/views/gera/external_rate_snapshots/show.slim +22 -0
  107. data/app/views/gera/external_rates/_flat_list.slim +22 -0
  108. data/app/views/gera/external_rates/index.html.slim +28 -0
  109. data/app/views/gera/external_rates/show.slim +1 -0
  110. data/app/views/gera/payment_systems/_fields.slim +4 -0
  111. data/app/views/gera/payment_systems/_fields_table.slim +18 -0
  112. data/app/views/gera/payment_systems/_form.slim +9 -0
  113. data/app/views/gera/payment_systems/edit.slim +7 -0
  114. data/app/views/gera/payment_systems/index.slim +3 -0
  115. data/app/views/gera/payment_systems/new.slim +9 -0
  116. data/app/views/gera/payment_systems/show.slim +1 -0
  117. data/app/views/gera/rate_sources/_list.slim +13 -0
  118. data/app/views/gera/rate_sources/_rate_source.slim +23 -0
  119. data/app/views/gera/rate_sources/index.html.slim +6 -0
  120. data/app/views/layouts/application.html.slim +15 -0
  121. data/app/views/layouts/gera/blank.html.slim +10 -0
  122. data/app/workers/concerns/gera/rates_worker.rb +87 -0
  123. data/app/workers/gera/bitfinex_rates_worker.rb +65 -0
  124. data/app/workers/gera/cbr_avg_rates_worker.rb +42 -0
  125. data/app/workers/gera/cbr_rates_worker.rb +192 -0
  126. data/app/workers/gera/create_history_intervals_worker.rb +38 -0
  127. data/app/workers/gera/currency_rates_worker.rb +64 -0
  128. data/app/workers/gera/directions_rates_worker.rb +51 -0
  129. data/app/workers/gera/exmo_rates_worker.rb +62 -0
  130. data/app/workers/gera/purge_currency_rates_worker.rb +21 -0
  131. data/app/workers/gera/purge_direction_rates_worker.rb +30 -0
  132. data/config/currencies.yml +559 -0
  133. data/config/routes.rb +30 -0
  134. data/db/migrate/20180912130000_setup.rb +228 -0
  135. data/db/migrate/20190314114844_add_is_available_to_payment_systems.rb +7 -0
  136. data/db/migrate/20190315113046_add_icon_url_to_payment_systems.rb +7 -0
  137. data/db/migrate/20190315132137_add_commission_to_payment_systems.rb +7 -0
  138. data/lib/banks/currency_exchange.rb +12 -0
  139. data/lib/builders/currency_rate_auto_builder.rb +38 -0
  140. data/lib/builders/currency_rate_builder.rb +60 -0
  141. data/lib/builders/currency_rate_cross_builder.rb +70 -0
  142. data/lib/builders/currency_rate_direct_builder.rb +26 -0
  143. data/lib/gera.rb +32 -0
  144. data/lib/gera/bitfinex_fetcher.rb +36 -0
  145. data/lib/gera/configuration.rb +47 -0
  146. data/lib/gera/currencies_purger.rb +28 -0
  147. data/lib/gera/currency_pair.rb +93 -0
  148. data/lib/gera/engine.rb +14 -0
  149. data/lib/gera/mathematic.rb +156 -0
  150. data/lib/gera/money_support.rb +89 -0
  151. data/lib/gera/numeric.rb +25 -0
  152. data/lib/gera/railtie.rb +8 -0
  153. data/lib/gera/rate.rb +22 -0
  154. data/lib/gera/rate_from_multiplicator.rb +54 -0
  155. data/lib/gera/repositories/currency_rate_modes_repository.rb +37 -0
  156. data/lib/gera/repositories/currency_rates_repository.rb +25 -0
  157. data/lib/gera/repositories/direction_rates_repository.rb +46 -0
  158. data/lib/gera/repositories/exchange_rates_repository.rb +23 -0
  159. data/lib/gera/repositories/payment_systems_repository.rb +21 -0
  160. data/lib/gera/repositories/universe.rb +47 -0
  161. data/lib/gera/version.rb +3 -0
  162. data/lib/tasks/auto_generate_diagram.rake +6 -0
  163. data/lib/tasks/gera_tasks.rake +4 -0
  164. metadata +765 -0
@@ -0,0 +1,7 @@
1
+ - if currency_rate_mode.present?
2
+ - if currency_rate_mode.mode_cross?
3
+ = currency_rate_mode.cross_rate_modes.map(&:title).join(' * ')
4
+ - else
5
+ = currency_rate_mode.mode
6
+ - else
7
+ .text-warning не установлен
@@ -0,0 +1,29 @@
1
+ = simple_form_for currency_rate_mode do |f|
2
+ = back_field
3
+ = f.input :currency_rate_mode_snapshot_id, as: :hidden
4
+ .row
5
+ .col-md-3
6
+ = f.input :cur_from, as: :hidden
7
+ = f.input :cur_to, as: :hidden
8
+
9
+ - key = f.object.currency_pair.to_a.join('-').downcase
10
+
11
+ = f.input :mode,
12
+ label: 'Режим',
13
+ collection: currency_rate_modes_enum,
14
+ include_blank: false,
15
+ wrapper_html: { data: { autoshow: key } }
16
+
17
+ .col-md-6
18
+ - cc_data = {}
19
+ - cc_data["autoshow-#{key}"] = :cross
20
+ div data=cc_data style=currency_rate_mode_autoshow_style(currency_rate_mode)
21
+ = f.simple_fields_for :cross_rate_modes do |crm|
22
+ = render 'cross_rate_mode_fields', f: crm
23
+ .links
24
+ = link_to_add_association 'Добавить кросс-курс', f, :cross_rate_modes, class: 'btn btn-sm btn-primary'
25
+
26
+ .row
27
+ .col-md-6
28
+ = f.button :submit, value: 'Сохранить', class: 'btn btn-primary'
29
+ .col-md-6
@@ -0,0 +1,11 @@
1
+ = link_to "← Назад в матрицу '#{currency_rate_mode.snapshot.title}'".html_safe, success_url
2
+
3
+ h2.m-b-md Изменяем метод расчета для #{currency_rate_mode.currency_pair}
4
+ hr
5
+
6
+ .row
7
+ .col-md-9
8
+ = render 'form', currency_rate_mode: currency_rate_mode, success_url: success_url
9
+ .col-md-3
10
+ .alert class=(currency_rate_mode.build_result.error? ? 'alert-danger' : 'alert-success')
11
+ = currency_rate_mode_build_result_details currency_rate_mode.build_result
@@ -0,0 +1,12 @@
1
+ h2 Методы расчета (#{snapshot.status})
2
+
3
+ h3= l snapshot.created_at, format: :long
4
+
5
+ .row
6
+ .col-md-9
7
+ = render 'currency_rate_mode_snapshots/snapshot', snapshot: snapshot
8
+ .col-md-3
9
+ = render 'currency_rate_mode_snapshots', current_snapshot: snapshot
10
+ hr
11
+ p
12
+ = link_to 'Методы расчетов курсов', 'https://docs.google.com/spreadsheets/d/1ySSUNaQRO5Fthg1QUTnnrfBFreWErH3585HalFBlONI/edit?usp=sharing', target: '_blank'
@@ -0,0 +1,22 @@
1
+ - object = Gera::CurrencyRateDecorator.decorate currency_rate
2
+ h3
3
+ = t '.title', title: object.title
4
+ hr
5
+ .row
6
+ .col-md-6
7
+ = render 'attributes_table', object: object, columns: currency_rate_columns(currency_rate)
8
+
9
+ - if currency_rate.direction_rates.any?
10
+ h4= t '.used_direction_rates', count: currency_rate.direction_rates.count
11
+ - currency_rate.direction_rates.each do |direction_rate|
12
+ - object = Gera::DirectionRateDecorator.decorate (direction_rate)
13
+
14
+ - columns = %i(created_at rate_percent ps_comission rate_value )
15
+
16
+ = render 'attributes_table', object: object, columns: columns
17
+ - else
18
+ h4= t '.not_used_in_direction_rates'
19
+ .col-md-6
20
+ .panel.panel-default
21
+ .panel-heading Calculation
22
+ .panel-body= currency_rate_mode_detailed currency_rate
@@ -0,0 +1,35 @@
1
+ tr
2
+ th= cur.to_s
3
+ - cp1 = Gera::CurrencyPair.new cur, cur2
4
+ - cr1 = Gera::Universe.currency_rates_repository.get_currency_rate_by_pair cp1
5
+ - r1 = cr1.rate_value
6
+
7
+ - cp2 = Gera::CurrencyPair.new cur2, cur
8
+ - cr2 = Gera::Universe.currency_rates_repository.get_currency_rate_by_pair cp2
9
+ - r2 = cr2.rate_value
10
+
11
+ td.text-right title=r1
12
+ - if cr1.persisted?
13
+ = link_to currency_rate_path(cr1) do
14
+ = humanized_currency_rate r1, cp1, cur2
15
+ br
16
+ - else
17
+ p.text-small Значение не найдено
18
+ .text-muted.text-small покупка
19
+
20
+ - if cr1.persisted? && cr2.persisted?
21
+ - if r1 < 1.0 / r2
22
+ td.bg-success= ' < '
23
+ - elsif r1 == 1.0 / r2
24
+ td.bg-warning= '='
25
+ - else
26
+ td.bg-danger= '>'
27
+ - else
28
+ td
29
+ td.text-right title=r2
30
+ - if cr2.persisted?
31
+ = link_to currency_rate_path(cr2) do
32
+ = humanized_currency_rate 1.0 / r2, cp2, cur2
33
+ - else
34
+ p.text-small Значение не найдено
35
+ .text-muted.text-small продажа
@@ -0,0 +1,12 @@
1
+ = render 'menu'
2
+
3
+ = render layout: 'currencies_table' do |pair|
4
+ - rate_value2 = rates1.find_by_currency_pair(pair)
5
+ - rate_value1 = rates2.find_by_currency_pair(pair).rate_value
6
+ td.text-nowrap.text-right.v-middle
7
+ - if pair.same?
8
+ .text-muted &middot;
9
+ - else
10
+ = rate_diff rate_value1, rate_value2
11
+
12
+ p.text-muted От текущего отнимаем курсы Gera
@@ -0,0 +1,27 @@
1
+ = link_to 'История', currency_rate_history_intervals_path
2
+ .container-fluid
3
+ = "Курс актуален на #{l created_at, format: :long}"
4
+ .row
5
+ .col-md-12
6
+ .text-small= render layout: 'currencies_table' do |pair|
7
+ - rate = rates.find_by_currency_pair pair
8
+ - rate_d = Gera::CurrencyRateDecorator.decorate rate
9
+ - if rate.present?
10
+ td.text-nowrap.text-right.v-middle.rate-popover class=currency_rate_class(rate) data=currency_rate_cell_data_attr(rate) title=rate_d.title
11
+ - if pair.same?
12
+ .text-muted &middot;
13
+ - else
14
+ = link_to currency_rate_path(rate) do
15
+ = humanized_rate rate.rate_value, rate.currency_to
16
+ - else
17
+ td.text-nowrap.text-right.v-middle data-toggle=:tooltip data-container=:body data-html='true' title='курс отсутсвует'
18
+ .text-muted &middot;
19
+
20
+
21
+
22
+ .panel.panel-default.m-t-md
23
+ .panel-body
24
+ p
25
+ span.text-success Зеленым
26
+ span.m-l-md отмечены кросс-курсы
27
+ p Наведите или нажмите чтобы увидеть метод расчета
@@ -0,0 +1,14 @@
1
+ - currencies = Money::Currency.all
2
+
3
+ h2 Методы расчета
4
+
5
+ = render layout: 'currencies_table' do |pair|
6
+ - rate = snapshot.rates.find_by_currency_pair pair
7
+ - if rate.present?
8
+ - rate_d = Gera::CurrencyRateDecorator.decorate rate
9
+ td.v-middle data-toggle=:tooltip data-container=:body data-html='true' title=rate_d.tooltip data-href=currency_rate_path(rate)
10
+ - unless pair.same?
11
+ .text-small
12
+ = rate_d.detailed
13
+ - else
14
+ td.text-muted &middot;
@@ -0,0 +1,4 @@
1
+ .container-fluid
2
+ -# = link_to '&larr; в матрицу базовых курсов'.html_safe, currency_rates_path
3
+ = link_to t('.back_to_currency_rates').html_safe, currency_rates_path
4
+ = render currency_rate
@@ -0,0 +1,11 @@
1
+ = simple_form_for filter, url: direction_rate_history_intervals_path, method: :GET do |f|
2
+ .row
3
+ .col-md-3
4
+ = f.input :payment_system_from_id, collection: Gera::PaymentSystem.ordered, include_blank: false, label: false, hint: 'Входящая ПС'
5
+ .col-md-3
6
+ = f.input :payment_system_to_id, collection: Gera::PaymentSystem.ordered, include_blank: false, label: false, hint: 'Исходящая ПС'
7
+ .col-md-3
8
+ = f.input :value_type, collection: [['Значение курса','rate'],['Комиссия','comission']], include_blank: false, label: false, hint: 'Что смотрим?'
9
+ .col-md-3
10
+ = f.button :submit, 'Обновить', class: 'btn btn-primary'
11
+
@@ -0,0 +1,41 @@
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('#{direction_rate_history_intervals_path(format: :json, direction_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
+ });
40
+
41
+
@@ -0,0 +1,28 @@
1
+ - income_amount = direction_rate.rate_value.to_rate.in_amount
2
+ - profit = direction_rate.get_profit_result income_amount
3
+ table.table.table-narrow
4
+ thead
5
+ tr
6
+ th Базовый курс
7
+ th Комиссия обменника
8
+ th Конечный курс
9
+ th Сумма на входе
10
+ th Сумма на выходе (клиент получит на счете, сумма к отправке)
11
+ th Комиссия ПС (%)
12
+ th Комиссия ПС (абс.)
13
+ th Сумма которая уйдет с выходящего кошелька (что получит клиент + комиссия ПС)
14
+ th Чистая прибыль системы
15
+ tbody
16
+ tr
17
+ td= profit.base_rate.to_rate.format direction_rate.payment_system_from.currency, direction_rate.payment_system_to.currency
18
+ td= profit.comission.to_percent
19
+ td= profit.finite_rate.to_rate.format direction_rate.payment_system_from.currency, direction_rate.payment_system_to.currency
20
+
21
+ td= humanized_money_with_currency Money.from_amount(profit.income_amount, direction_rate.payment_system_from.currency)
22
+ td= humanized_money_with_currency Money.from_amount(profit.finite_amount, direction_rate.payment_system_to.currency)
23
+
24
+ td= profit.ps_interest.to_percent
25
+ td= humanized_money_with_currency Money.from_amount(profit.ps_amount, direction_rate.payment_system_to.currency)
26
+
27
+ td= humanized_money_with_currency Money.from_amount(profit.outcome_amount, direction_rate.payment_system_to.currency)
28
+ td= humanized_money_with_currency Money.from_amount(profit.profit_amount, direction_rate.payment_system_from.currency)
@@ -0,0 +1,19 @@
1
+ = render 'directions_submenu'
2
+
3
+ = render layout: 'directions_table' do |direction|
4
+ - dr = Gera::Universe.direction_rates_repository.get_by_direction direction
5
+ - ps_from = direction.ps_from; ps_to = direction.ps_to
6
+ - drl = (legacy_direction_rates[ps_from.id] || {})[ps_to.id]
7
+ td.text-nowrap.text-right.rate-popover.v-middle data=direction_rate_cell_data_attr(dr, ps_from, ps_to, drl)
8
+ - if dr.present? && dr.exchange_rate.available?
9
+ - if drl.present?
10
+ - diff = dr.rate_value - drl
11
+ - res = (diff * 100.0 / dr.rate_value).round(2)
12
+ = "#{res}%"
13
+ - else
14
+ .text-danger Нет в PHP
15
+ - else
16
+ - if drl.present?
17
+ .text-danger Нет в Gera
18
+ - else
19
+ .text-muted= ion_icon 'ios-close-empty'
@@ -0,0 +1,26 @@
1
+ = link_to 'history', direction_rate_history_intervals_path
2
+ .container-fluid
3
+ .row
4
+ .col-md-12
5
+ - snapshot = Gera::Universe.direction_rates_repository.snapshot
6
+ = "Дата расчета матрицы (##{snapshot.id}) #{l snapshot.created_at, format: :long}"
7
+
8
+ = render layout: 'directions_table' do |direction|
9
+ - dr = Gera::Universe.direction_rates_repository.find_by_direction direction
10
+ - er = Gera::Universe.exchange_rates_repository.find_by_direction direction
11
+ td.text-nowrap.cell-small.text-center.rate-popover.v-middle data=direction_rate_cell_data_attr(direction)
12
+ - if dr.nil?
13
+ - if er.nil?
14
+ .text-muted title='no direction and exchange rates'
15
+ = ion_icon 'ios-close-empty'
16
+ - else
17
+ = link_to exchange_rate_path(er) do
18
+ .text-muted title='direction rate is unknown'
19
+ = ion_icon 'ios-close-empty'
20
+ - elsif !er.available?
21
+ = link_to exchange_rate_path(er) do
22
+ .text-muted title='exchange rate is unavailable'
23
+ = ion_icon 'ios-close-empty'
24
+ - else
25
+ = link_to direction_rate_path(dr.id) do
26
+ = humanized_rate dr.rate_value
@@ -0,0 +1,5 @@
1
+ h1 Курсы на PHP (legacy)
2
+
3
+ iframe src='https://kassa.cc/psps.php' width="100%" height="1000px"
4
+
5
+ p= link_to 'Прямая ссылка', 'https://kassa.cc/psps.php', target: '_blank'
@@ -0,0 +1,5 @@
1
+ = render 'directions_submenu'
2
+
3
+ = render layout: 'directions_table' do |direction|
4
+ td.text-nowrap.cell-small.text-center.rate-popover.v-middle data=direction_rate_cell_data_attr(direction)
5
+ = humanized_money_with_currency direction.minimal_income_amount
@@ -0,0 +1,14 @@
1
+ = link_to 'refresh', last_direction_rate_path(direction_rate), class: 'btn btn-success'
2
+ .row
3
+ .col-md-6
4
+ = render 'direction_rate', direction_rate: direction_rate
5
+ .col-md-6
6
+ = render 'exchange_rate_monitor', exchange_rate: direction_rate.exchange_rate
7
+
8
+ .m-t-lg
9
+ hr
10
+ = render 'direction_rate_example_calculator', direction_rate: direction_rate
11
+
12
+ .m-t-lg
13
+ hr
14
+ = render 'currency_rate', currency_rate: direction_rate.currency_rate
@@ -0,0 +1,25 @@
1
+ h2 Журнал курсов #{rate_source}
2
+
3
+ .table-sticky-container
4
+ table.table-condensed.table-comission.table-cross.text-small
5
+ thead.bg-white
6
+ tr
7
+ th Дата съема
8
+ - rate_source.available_pairs.each do |cp|
9
+ th.text-right style="font-size: 125%"= cp
10
+
11
+ tbody
12
+ - snapshots.each do |s|
13
+ tr
14
+ th.text-nowrap
15
+ = link_to external_rate_snapshot_path(s) do
16
+ = l s.created_at, format: :long
17
+ - rate_source.available_pairs.each do |cp|
18
+ - rate = s.external_rates.find_by_currency_pair(cp)
19
+ - if rate
20
+ td.text-right
21
+ = humanized_rate_detailed rate.rate_value, '<br/>'
22
+ - else
23
+ td
24
+
25
+ = paginate snapshots
@@ -0,0 +1,22 @@
1
+ h1 Снимок внешних курсов (#{snapshot.rate_source}) от #{l snapshot.created_at, format: :long}
2
+
3
+ table.table.table-condensed.table-striped.table-narrow
4
+ thead
5
+ tr
6
+ th Вход
7
+ th Выход
8
+ th Значение курса источника
9
+ th Человеческое значение
10
+ th Расшифровочка
11
+ tbody
12
+ - snapshot.external_rates.ordered.each do |er|
13
+ tr
14
+ th= er.cur_from
15
+ th= er.cur_to
16
+ th= er.rate_value
17
+ th= humanized_rate er.rate_value
18
+ th
19
+ - if er.rate_value < 1
20
+ span Продаем #{er.cur_to} за #{1.0/er.rate_value} #{er.cur_from}
21
+ - else
22
+ span Покупаем #{er.cur_from} за #{er.rate_value} #{er.cur_to}
@@ -0,0 +1,22 @@
1
+ table.table.table-condensed.table-hover.table-striped.table-narrow
2
+ thead
3
+ tr
4
+ th Источник
5
+ th Дата курса
6
+ th Валютная пара
7
+ th Курс продажи
8
+ th Курс средний
9
+ th Курс покупки
10
+ th Время загрузки
11
+ tbody
12
+ - external_rates.each do |er|
13
+ tr
14
+ td= er.source
15
+ td= l er.actual_for
16
+ td
17
+ = currency_rate_pair er.cur_from, er.cur_to
18
+ td.text-right= er.sell_price || '-'
19
+ td.text-right= er.rate || '-'
20
+ td.text-right= er.buy_price || '-'
21
+ td
22
+ .text-muted= l er.created_at
@@ -0,0 +1,28 @@
1
+ .page-header
2
+ h1 Журнал приема курсов
3
+
4
+ table.table.table-condensed.table-hover.table-striped.table-narrow
5
+ thead
6
+ tr
7
+ th Источник
8
+ th Дата курса
9
+ - available_pairs.each do |pair|
10
+ th= pair.to_s
11
+ tbody
12
+ - timestamps.each do |ts|
13
+ tr
14
+ td= ts[:source]
15
+ td.text-nowrap= l ts[:snapshot].actual_for, format: :long
16
+ - available_pairs.each do |pair|
17
+ td
18
+ - er = ts[:rates][pair.key]
19
+ - if er.present?
20
+ - if er.same_rates?
21
+ .text-nowrap= er.rate
22
+ - else
23
+ .text-nowrap= er.sell_price
24
+ .text-nowrap.text-muted= er.rate
25
+ .text-nowrap= er.buy_price
26
+ - else
27
+ = '-'
28
+