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
data/README.md ADDED
@@ -0,0 +1,67 @@
1
+ # Gera
2
+
3
+ [![Build Status](https://travis-ci.org/finfex/gera.svg?branch=master)](https://travis-ci.org/finfex/gera)
4
+
5
+ Multiple rates generator for crypto changers and markets.
6
+
7
+ ## Осуществляет
8
+
9
+ * Регулярный (ежесекундный) сбор и хранение курсов (`ExternalRate`) из внешних источников (`RateSource`)
10
+ * Построение и хранение матрицы базовых курсов (`CurrencyRate`) для поддерживаемых валют из курсов внешних истичников (`ExternalRate`) на основе установленного метода расчета (`CurrencyRateMode`) автоматически или через кросс-курсы.
11
+ * Построение и хранение матрицы конечных курсов (`DirectionRate`) для поддерживаемых платежных сервисов (`PaymentSystem`) с установленной комиссией (`ExchangeRate`)
12
+ * Регулярная группировка базовых и конечных курсов в N-минутные отрезки со свечками для истории (`CurrencyRateHistoryInterval` и `DirectionRateHistoryInterval`)
13
+ * Регулярная очистка матриц ежесекундных курсов (за сутки накапливается несколько гигабайт)
14
+
15
+ ## Installation
16
+
17
+ Add this line to your application's Gemfile:
18
+
19
+ ```ruby
20
+ gem 'gera'
21
+ ```
22
+
23
+ And then execute:
24
+ ```bash
25
+ $ bundle
26
+ ```
27
+
28
+ Or install it yourself as:
29
+ ```bash
30
+ $ gem install gera
31
+ ```
32
+
33
+ ## Configuration
34
+
35
+ Add `./config/initializers/gera.rb` with this content:
36
+
37
+ ```
38
+ Gera.configure do |config|
39
+ config.cross_pairs = { kzt: :rub, eur: :rub }
40
+ end
41
+ ```
42
+
43
+ ## Supported external sources of basic rates
44
+
45
+ * EXMO, Russian Central Bank, Bitfinex, Manual
46
+
47
+ ## Supported currencies
48
+
49
+ * RUB, USD, BTC, LTC, ETH, DSH, KZT, XRP, ETC, XMR, BCH, EUR, NEO, ZEC
50
+
51
+ ## Database
52
+
53
+ SQL tables diagram - https://github.com/finfex/gera/blob/master/doc/erd.pdf
54
+
55
+ ## TODO
56
+
57
+ * move Authority to application level
58
+ * Remove STI from RateSource
59
+
60
+ ## Contributing
61
+
62
+ * Fork
63
+ * Create Pull Request
64
+
65
+ ## License
66
+
67
+ The gem is available as open source under the terms of the [GPLv3](https://opensource.org/licenses/GPL-3.0).
data/Rakefile ADDED
@@ -0,0 +1,43 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'Gera'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.md')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path("spec/dummy/Rakefile", __dir__)
18
+ load 'rails/tasks/engine.rake'
19
+
20
+ load 'rails/tasks/statistics.rake'
21
+
22
+ require 'bundler/gem_tasks'
23
+
24
+ begin
25
+ require 'rspec/core/rake_task'
26
+
27
+ RSpec::Core::RakeTask.new(:spec)
28
+
29
+ task :default => :spec
30
+ rescue LoadError
31
+ puts 'no rspec available'
32
+ end
33
+
34
+ load 'lib/tasks/auto_generate_diagram.rake'
35
+
36
+ require "yard"
37
+ if defined? YARD
38
+ YARD::Rake::YardocTask.new do |t|
39
+ t.files = ['lib/**/*.rb', 'app/**/*.rb'] # optional
40
+ t.options = ['--any', '--extra', '--opts'] # optional
41
+ t.stats_options = ['--list-undoc'] # optional
42
+ end
43
+ end
@@ -0,0 +1,2 @@
1
+ //= link_directory ../javascripts/gera .js
2
+ //= link_directory ../stylesheets/gera .css
@@ -0,0 +1,14 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file. JavaScript code in this file should be added after the last require_* statement.
9
+ //
10
+ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require rails-ujs
14
+ //= require_tree .
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gera
4
+ class ApplicationAuthorizer < ::ApplicationAuthorizer
5
+ end
6
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'application_authorizer'
4
+
5
+ module Gera
6
+ class CurrencyRateAuthorizer < ApplicationAuthorizer
7
+ self.adjectives = %i[readable]
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'application_authorizer'
4
+ module Gera
5
+ class CurrencyRateModeAuthorizer < ApplicationAuthorizer
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'application_authorizer'
4
+ module Gera
5
+ class DirectionRateAuthorizer < ApplicationAuthorizer
6
+ self.adjectives = %i[readable]
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'application_authorizer'
4
+ module Gera
5
+ class ExchangeRateAuthorizer < ApplicationAuthorizer
6
+ self.adjectives = %i[readable updatable]
7
+ end
8
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'application_authorizer'
4
+ module Gera
5
+ class PaymentSystemAuthorizer < ApplicationAuthorizer
6
+ # Для изменения не админами запрещено менять все кроме разрешенных
7
+ WHITE_LIST = %w[income_enabled outcome_enabled referal_output_enabled].freeze
8
+
9
+ def self.restricted_attributes
10
+ (Gera::PaymentSystem.attribute_names - WHITE_LIST).freeze
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'application_authorizer'
4
+ module Gera
5
+ class RateSourceAuthorizer < ApplicationAuthorizer
6
+ end
7
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gera
4
+ class ApplicationController < ::ApplicationController
5
+ helper Gera::ApplicationHelper
6
+ helper Gera::CurrencyRateModesHelper
7
+ helper Gera::DirectionRateHelper
8
+
9
+ protect_from_forgery with: :exception
10
+
11
+ ensure_authorization_performed
12
+
13
+ helper_method :payment_systems
14
+ helper_method :query_params
15
+
16
+ private
17
+
18
+ def query_params
19
+ params.fetch(:q, {}).permit!
20
+ end
21
+
22
+ def app_title
23
+ "GERA #{VERSION}"
24
+ end
25
+
26
+ def payment_systems
27
+ @payment_systems ||= Universe.payment_systems.available
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'application_controller'
4
+ module Gera
5
+ class CurrenciesController < ApplicationController
6
+ authorize_actions_for CurrencyRate
7
+ end
8
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'application_controller'
4
+ module Gera
5
+ class CurrencyRateHistoryIntervalsController < ApplicationController
6
+ authorize_actions_for CurrencyRate
7
+ helper_method :filter
8
+
9
+ def index
10
+ respond_to do |format|
11
+ format.html { render locals: { title: title, value_decimals: value_decimals } }
12
+ format.json { render json: intervals }
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def value_decimals
19
+ 4
20
+ end
21
+
22
+ def title
23
+ "График базового курса для направление #{filter.cur_from}->#{filter.cur_to}"
24
+ end
25
+
26
+ def filter
27
+ @filter ||= CurrencyRateHistoryIntervalFilter.new params.fetch(:currency_rate_history_interval_filter, {}).permit!
28
+ end
29
+
30
+ def prepare_rate_value(value)
31
+ inverse? ? 1.0 / value : value
32
+ end
33
+
34
+ def inverse?
35
+ false
36
+ end
37
+
38
+ def intervals
39
+ scope = Gera::CurrencyRateHistoryInterval
40
+ .where(cur_to_id: filter.currency_to.local_id, cur_from_id: filter.currency_from.local_id)
41
+ .order(:interval_from)
42
+
43
+ case filter.value_type
44
+ when 'rate'
45
+ scope
46
+ .pluck(:interval_from, :min_rate, :max_rate)
47
+ .map { |time, min, max| [time.to_f * 1000, prepare_rate_value(min), prepare_rate_value(max), prepare_rate_value(min), prepare_rate_value(max)] }
48
+ else
49
+ raise "Unknown value_type #{filter.value_type}"
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'application_controller'
4
+ module Gera
5
+ class CurrencyRateModeSnapshotsController < ApplicationController
6
+ authorize_actions_for CurrencyRateMode
7
+ authority_actions activate: :create
8
+
9
+ helper_method :view_mode
10
+
11
+ def index
12
+ redirect_to edit_currency_rate_mode_snapshot_path Universe.currency_rate_modes_repository.snapshot
13
+ end
14
+
15
+ def edit
16
+ if snapshot.status_draft?
17
+ render :edit, locals: {
18
+ snapshot: snapshot
19
+ }
20
+ else
21
+ redirect_to currency_rate_mode_snapshot_path snapshot
22
+ end
23
+ end
24
+
25
+ def show
26
+ if snapshot.status_draft?
27
+ redirect_to edit_currency_rate_mode_snapshot_path snapshot
28
+ else
29
+ render :edit, locals: {
30
+ snapshot: snapshot
31
+ }
32
+ end
33
+ end
34
+
35
+ def activate
36
+ snapshot.transaction do
37
+ CurrencyRateModeSnapshot.status_active.update_all status: :deactive
38
+ snapshot.update status: :active
39
+ end
40
+ CurrencyRatesWorker.perform_async if Rails.env.production?
41
+ flash[:success] = 'Режимы активированы'
42
+ redirect_to currency_rate_mode_snapshot_path snapshot
43
+ end
44
+
45
+ def update
46
+ snapshot.update permitted_params
47
+ respond_to do |format|
48
+ format.json { respond_with_bip(snapshot) }
49
+ end
50
+ end
51
+
52
+ def create
53
+ flash[:success] = 'Создана новая матрица методов расчета'
54
+ redirect_to edit_currency_rate_mode_snapshot_path(create_draft_snapshot)
55
+ end
56
+
57
+ private
58
+
59
+ def view_mode
60
+ if params[:view_mode] == 'calculations'
61
+ :calculations
62
+ else
63
+ :methods
64
+ end
65
+ end
66
+
67
+ def snapshot
68
+ CurrencyRateModeSnapshot.find params[:id]
69
+ end
70
+
71
+ def find_last_draft_snapshot
72
+ CurrencyRateModeSnapshot.status_draft.last
73
+ end
74
+
75
+ def create_draft_snapshot
76
+ CurrencyRateModeSnapshot.create!
77
+ end
78
+
79
+ def permitted_params
80
+ params.require(:currency_rate_mode_snapshot).permit!
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'application_controller'
4
+ module Gera
5
+ class CurrencyRateModesController < ApplicationController
6
+ authorize_actions_for CurrencyRateMode
7
+
8
+ helper_method :success_url
9
+
10
+ def new
11
+ render :edit, locals: {
12
+ currency_rate_mode: snapshot.currency_rate_modes.build(permitted_params)
13
+ }
14
+ end
15
+
16
+ def create
17
+ CurrencyRateMode.create! permitted_params
18
+
19
+ flash[:success] = 'Метод создан'
20
+ redirect_to success_url
21
+ rescue ActiveRecord::RecordInvalid => e
22
+ render :edit, locals: { currency_rate_mode: e.record }
23
+ end
24
+
25
+ def edit
26
+ render :edit, locals: { currency_rate_mode: currency_rate_mode }
27
+ end
28
+
29
+ def update
30
+ currency_rate_mode.update! permitted_params
31
+
32
+ flash[:success] = 'Метод изменен'
33
+ redirect_to success_url
34
+ rescue ActiveRecord::RecordInvalid => e
35
+ render :edit, locals: { currency_rate_mode: e.record }
36
+ end
37
+
38
+ private
39
+
40
+ def snapshot
41
+ @snapshot ||= CurrencyRateModeSnapshot.find permitted_params[:currency_rate_mode_snapshot_id]
42
+ end
43
+
44
+ def success_url
45
+ params[:back] || edit_currency_rate_mode_snapshot_path(currency_rate_mode.snapshot)
46
+ end
47
+
48
+ def currency_rate_mode
49
+ CurrencyRateMode.find params[:id]
50
+ end
51
+
52
+ def current_snapshot
53
+ Universe.currency_rate_modes_repository.snapshot
54
+ end
55
+
56
+ def permitted_params
57
+ params.require(:currency_rate_mode).permit!
58
+ end
59
+ end
60
+ end