gera 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+