rails_growth 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +20 -0
  3. data/README.md +28 -0
  4. data/Rakefile +32 -0
  5. data/app/controllers/growth/admin/aim_entities_controller.rb +30 -0
  6. data/app/controllers/growth/admin/aim_logs_controller.rb +21 -0
  7. data/app/controllers/growth/admin/aim_users_controller.rb +30 -0
  8. data/app/controllers/growth/admin/aims_controller.rb +73 -0
  9. data/app/controllers/growth/admin/base_controller.rb +4 -0
  10. data/app/controllers/growth/admin/praise_incomes_controller.rb +61 -0
  11. data/app/controllers/growth/admin/reward_expenses_controller.rb +63 -0
  12. data/app/controllers/growth/admin/reward_incomes_controller.rb +59 -0
  13. data/app/controllers/growth/admin/rewards_controller.rb +65 -0
  14. data/app/controllers/growth/controller/application.rb +77 -0
  15. data/app/controllers/growth/my/aim_logs_controller.rb +45 -0
  16. data/app/controllers/growth/my/aim_users_controller.rb +25 -0
  17. data/app/controllers/growth/my/aims_controller.rb +44 -0
  18. data/app/controllers/growth/my/base_controller.rb +4 -0
  19. data/app/controllers/growth/my/gifts_controller.rb +27 -0
  20. data/app/controllers/growth/my/rewards_controller.rb +28 -0
  21. data/app/models/growth/aim.rb +5 -0
  22. data/app/models/growth/aim_code.rb +5 -0
  23. data/app/models/growth/aim_entity.rb +5 -0
  24. data/app/models/growth/aim_log.rb +5 -0
  25. data/app/models/growth/aim_user.rb +5 -0
  26. data/app/models/growth/model/aim.rb +52 -0
  27. data/app/models/growth/model/aim_code.rb +40 -0
  28. data/app/models/growth/model/aim_entity.rb +74 -0
  29. data/app/models/growth/model/aim_log.rb +79 -0
  30. data/app/models/growth/model/aim_user.rb +60 -0
  31. data/app/models/growth/model/card.rb +25 -0
  32. data/app/models/growth/model/cash.rb +17 -0
  33. data/app/models/growth/model/entity.rb +74 -0
  34. data/app/models/growth/model/praise_compute.rb +70 -0
  35. data/app/models/growth/model/praise_income.rb +82 -0
  36. data/app/models/growth/model/praise_user.rb +47 -0
  37. data/app/models/growth/model/promote.rb +30 -0
  38. data/app/models/growth/model/reward.rb +67 -0
  39. data/app/models/growth/model/reward_expense.rb +98 -0
  40. data/app/models/growth/model/reward_income.rb +35 -0
  41. data/app/models/growth/model/royalty_compute.rb +72 -0
  42. data/app/models/growth/model/user.rb +21 -0
  43. data/app/models/growth/praise_income.rb +7 -0
  44. data/app/models/growth/praise_user.rb +5 -0
  45. data/app/models/growth/reward.rb +5 -0
  46. data/app/models/growth/reward_expense.rb +5 -0
  47. data/app/models/growth/reward_income.rb +5 -0
  48. data/app/models/growth.rb +11 -0
  49. data/app/views/application/_growth_nav.html.erb +12 -0
  50. data/app/views/growth/admin/aim_entities/_filter.html.erb +10 -0
  51. data/app/views/growth/admin/aim_entities/index.html.erb +68 -0
  52. data/app/views/growth/admin/aim_entities/show.html.erb +22 -0
  53. data/app/views/growth/admin/aim_logs/_filter.html.erb +9 -0
  54. data/app/views/growth/admin/aim_logs/index.html.erb +62 -0
  55. data/app/views/growth/admin/aim_logs/show.html.erb +14 -0
  56. data/app/views/growth/admin/aim_users/_filter.html.erb +7 -0
  57. data/app/views/growth/admin/aim_users/index.html.erb +63 -0
  58. data/app/views/growth/admin/aim_users/show.html.erb +30 -0
  59. data/app/views/growth/admin/aims/_filter.html.erb +8 -0
  60. data/app/views/growth/admin/aims/_form.html.erb +14 -0
  61. data/app/views/growth/admin/aims/_item_field.html.erb +3 -0
  62. data/app/views/growth/admin/aims/_item_form.html.erb +24 -0
  63. data/app/views/growth/admin/aims/add_item.js.erb +9 -0
  64. data/app/views/growth/admin/aims/index.html.erb +54 -0
  65. data/app/views/growth/admin/aims/remove_item.js.erb +1 -0
  66. data/app/views/growth/admin/aims/show.html.erb +38 -0
  67. data/app/views/growth/admin/managers/_edit.html.erb +13 -0
  68. data/app/views/growth/admin/managers/_form.html.erb +34 -0
  69. data/app/views/growth/admin/managers/_new.html.erb +13 -0
  70. data/app/views/growth/admin/managers/_search_form.html.erb +8 -0
  71. data/app/views/growth/admin/managers/edit.js.erb +8 -0
  72. data/app/views/growth/admin/managers/index.html.erb +68 -0
  73. data/app/views/growth/admin/managers/new.js.erb +8 -0
  74. data/app/views/growth/admin/managers/show.html.erb +0 -0
  75. data/app/views/growth/admin/managers/update.js.erb +1 -0
  76. data/app/views/growth/admin/praise_incomes/_filter.html.erb +5 -0
  77. data/app/views/growth/admin/praise_incomes/_form.html.erb +3 -0
  78. data/app/views/growth/admin/praise_incomes/edit.html.erb +11 -0
  79. data/app/views/growth/admin/praise_incomes/index.html.erb +59 -0
  80. data/app/views/growth/admin/praise_incomes/new.html.erb +11 -0
  81. data/app/views/growth/admin/praise_incomes/show.html.erb +18 -0
  82. data/app/views/growth/admin/reward_expenses/_filter.html.erb +5 -0
  83. data/app/views/growth/admin/reward_expenses/_form.html.erb +7 -0
  84. data/app/views/growth/admin/reward_expenses/index.html.erb +49 -0
  85. data/app/views/growth/admin/reward_expenses/show.html.erb +26 -0
  86. data/app/views/growth/admin/reward_incomes/_filter.html.erb +10 -0
  87. data/app/views/growth/admin/reward_incomes/_form.html.erb +3 -0
  88. data/app/views/growth/admin/reward_incomes/edit.html.erb +11 -0
  89. data/app/views/growth/admin/reward_incomes/index.html.erb +49 -0
  90. data/app/views/growth/admin/reward_incomes/new.html.erb +11 -0
  91. data/app/views/growth/admin/reward_incomes/show.html.erb +18 -0
  92. data/app/views/growth/admin/rewards/_filter.html.erb +14 -0
  93. data/app/views/growth/admin/rewards/_form.html.erb +27 -0
  94. data/app/views/growth/admin/rewards/index.html.erb +84 -0
  95. data/app/views/growth/admin/rewards/show.html.erb +26 -0
  96. data/app/views/growth/my/aims/_aim.json.jbuilder +6 -0
  97. data/app/views/growth/my/aims/index.json.jbuilder +3 -0
  98. data/app/views/growth/my/aims/show.json.jbuilder +1 -0
  99. data/app/views/growth/my/gifts/_gift.json.jbuilder +1 -0
  100. data/app/views/growth/my/gifts/_praise_income.json.jbuilder +8 -0
  101. data/app/views/growth/my/gifts/give.json.jbuilder +8 -0
  102. data/app/views/growth/my/gifts/index.json.jbuilder +9 -0
  103. data/app/views/growth/my/rewards/_praise_user.json.jbuilder +2 -0
  104. data/app/views/growth/my/rewards/top.json.jbuilder +6 -0
  105. data/config/locales/en.notify.yml +7 -0
  106. data/config/locales/en.yml +29 -0
  107. data/config/locales/zh.controller.yml +24 -0
  108. data/config/locales/zh.notify.yml +7 -0
  109. data/config/locales/zh.yml +11 -0
  110. data/config/routes.rb +57 -0
  111. data/lib/rails_growth/config.rb +13 -0
  112. data/lib/rails_growth/engine.rb +19 -0
  113. data/lib/rails_growth/serial_number_helper.rb +28 -0
  114. data/lib/rails_growth.rb +4 -0
  115. metadata +170 -0
@@ -0,0 +1,11 @@
1
+ <div class="ui segment breadcrumb">
2
+ <%= link_to 'Back', admin_reward_reward_incomes_path(@reward), class: 'section' %>
3
+ <div class="divider">/</div>
4
+ <div class="active section">Add</div>
5
+ </div>
6
+
7
+ <div class="ui segment">
8
+ <%= form_with model: @reward_income, url: admin_reward_reward_incomes_path, local: true do |f| %>
9
+ <%= render partial: 'form', locals: { f: f } %>
10
+ <% end %>
11
+ </div>
@@ -0,0 +1,18 @@
1
+ <div class="ui segment breadcrumb">
2
+ <%= link_to 'Back', admin_reward_incomes_path, class: 'section' %>
3
+ <div class="divider">/</div>
4
+ <div class="active section">Show</div>
5
+ </div>
6
+
7
+ <table class="table is-hoverable is-fullwidth">
8
+ <tbody>
9
+ <tr>
10
+ <td class="has-text-right"><%= RewardIncome.human_attribute_name(:type) %></td>
11
+ <td><%= @reward_income.type %></td>
12
+ </tr>
13
+ <tr>
14
+ <td class="has-text-right"><%= RewardIncome.human_attribute_name(:amount) %></td>
15
+ <td><%= @reward_income.amount %></td>
16
+ </tr>
17
+ </tbody>
18
+ </table>
@@ -0,0 +1,14 @@
1
+ <div class="ui attached segment">
2
+
3
+ <%= form_with theme: 'search', model: Reward.new do |f| %>
4
+ <div class="fields">
5
+ <div class="ui left action input field">
6
+ <%= f.select :entity_type, options_for_select(Reward.entity_types), { on: { wrapper_input: false } } %>
7
+ <%= f.text_field :entity_id, on: { wrapper_input: false } %>
8
+ </div>
9
+ <%= f.submit 'Search' %>
10
+ </div>
11
+ <% end %>
12
+
13
+ </div>
14
+
@@ -0,0 +1,27 @@
1
+ <%= form_with model: [:admin, @reward], local: true do |f| %>
2
+ <%= render 'error_messages', target: @reward %>
3
+ <%= f.text_field :entity_type %>
4
+ <%= f.text_field :entity_id %>
5
+ <%= f.number_field :max_piece %>
6
+ <%= f.number_field :min_piece %>
7
+ <div class="inline fields">
8
+ <%= f.label :start_at %>
9
+ <div class="four wide field">
10
+ <%= f.date_field :'start_at(date)', can: { wrap_input: false, wrap_all: false }, label: false, required: true %>
11
+ </div>
12
+ <div class="three wide field">
13
+ <%= f.time_select :start_at, default: { hour: 8, min: 30 } %>
14
+ </div>
15
+ </div>
16
+ <div class="inline fields">
17
+ <%= f.label :finish_at %>
18
+ <div class="four wide field">
19
+ <%= f.date_field :'finish_at(date)', can: {wrap_input: false, wrap_all: false}, label: false, required: true %>
20
+ </div>
21
+ <div class="three wide field">
22
+ <%= f.time_select :finish_at, default: { hour: 17, min: 30 } %>
23
+ </div>
24
+ </div>
25
+ <%= f.check_box :enabled %>
26
+ <%= f.submit %>
27
+ <% end %>
@@ -0,0 +1,84 @@
1
+ <div class="ui top attached borderless menu">
2
+ <div class="header item">Admin Rewards</div>
3
+ <div class="right menu">
4
+ <div class="item">
5
+ <%= link_to 'New Admin Reward', new_admin_reward_path, class: 'ui teal button' %>
6
+ </div>
7
+ </div>
8
+ </div>
9
+
10
+ <%= render 'filter' %>
11
+
12
+ <table class="table is-hoverable is-fullwidth">
13
+ <thead>
14
+ <tr>
15
+ <th><%= Reward.human_attribute_name(:id) %></th>
16
+ <th><%= Reward.human_attribute_name(:amount) %></th>
17
+ <th>
18
+ <p><%= Reward.human_attribute_name(:income_amount) %></p>
19
+ <p><%= Reward.human_attribute_name(:expense_amount) %></p>
20
+ </th>
21
+ <th>
22
+ <p><%= Reward.human_attribute_name(:entity_type) %></p>
23
+ <p><%= Reward.human_attribute_name(:entity_id) %></p>
24
+ </th>
25
+ <th>
26
+ <p><%= Reward.human_attribute_name(:start_at) %></p>
27
+ <p><%= Reward.human_attribute_name(:finish_at) %></p>
28
+ </th>
29
+ <th>
30
+ <p><%= Reward.human_attribute_name(:max_piece) %></p>
31
+ <p><%= Reward.human_attribute_name(:max_piece) %></p>
32
+ </th>
33
+ <th><%= Reward.human_attribute_name(:enabled) %></th>
34
+ <th>Log</th>
35
+ <th>Actions</th>
36
+ </tr>
37
+ </thead>
38
+ <tbody>
39
+ <% @rewards.each do |reward| %>
40
+ <tr>
41
+ <td><%= reward.id %></td>
42
+ <td><%= reward.amount %></td>
43
+ <td>
44
+ <p><%= reward.income_amount %></p>
45
+ <p><%= reward.expense_amount %></p>
46
+ </td>
47
+ <td>
48
+ <p><%= reward.entity_type %></p>
49
+ <p><%= reward.entity_id %></p>
50
+ </td>
51
+ <td>
52
+ <p><time><%= reward.start_at&.to_s(:rfc822) %></time></p>
53
+ <p><time><%= reward.finish_at&.to_s(:rfc822) %></time></p>
54
+ </td>
55
+ <td>
56
+ <p><%= reward.max_piece %></p>
57
+ <p><%= reward.min_piece %></p>
58
+ </td>
59
+ <td>
60
+ <div class="ui toggle checkbox">
61
+ <%= check_box_tag '[reward]enabled', nil, reward.enabled, data: { method: :patch, remote: true, params: "[reward]enabled=#{!reward.enabled}", url: admin_reward_path(reward), submit: true }, id: nil %>
62
+ </div>
63
+ </td>
64
+ <td>
65
+ <p><%= link_to 'incomes', admin_reward_reward_incomes_path(reward) %></p>
66
+ <p><%= link_to 'expenses', admin_reward_expenses_path(reward_id: reward.id) %></p>
67
+ </td>
68
+ <td class="ui labels">
69
+ <%= link_to admin_reward_path(reward), aria: { label: t('.show') }, class: 'ui blue mini icon button' do %>
70
+ <i class="location arrow icon"></i>
71
+ <% end %>
72
+ <%= link_to edit_admin_reward_path(reward), aria: { label: t('.edit') }, class: 'ui pink mini icon button' do %>
73
+ <i class="pencil alternate icon"></i>
74
+ <% end %>
75
+ <%= link_to admin_reward_path(reward), method: :delete, aria: { label: t('.destroy') }, data: { confrim: t('.confirm') }, class: 'ui red mini icon button' do %>
76
+ <i class="times icon"></i>
77
+ <% end %>
78
+ </td>
79
+ </tr>
80
+ <% end %>
81
+ </tbody>
82
+ </table>
83
+
84
+ <%= paginate @rewards %>
@@ -0,0 +1,26 @@
1
+ <div class="ui segment breadcrumb">
2
+ <%= link_to 'Back', admin_rewards_path, class: 'section' %>
3
+ <div class="divider">/</div>
4
+ <div class="active section">Show</div>
5
+ </div>
6
+
7
+ <table class="table is-hoverable is-fullwidth">
8
+ <tbody>
9
+ <tr>
10
+ <td class="has-text-right"><%= Reward.human_attribute_name(:amount) %></td>
11
+ <td><%= @reward.amount %></td>
12
+ </tr>
13
+ <tr>
14
+ <td class="has-text-right"><%= Reward.human_attribute_name(:entity_type) %></td>
15
+ <td><%= @reward.entity_type %></td>
16
+ </tr>
17
+ <tr>
18
+ <td class="has-text-right"><%= Reward.human_attribute_name(:entity_id) %></td>
19
+ <td><%= @reward.entity_id %></td>
20
+ </tr>
21
+ <tr>
22
+ <td class="has-text-right"><%= Reward.human_attribute_name(:lock_version) %></td>
23
+ <td><%= @reward.lock_version %></td>
24
+ </tr>
25
+ </tbody>
26
+ </table>
@@ -0,0 +1,6 @@
1
+ json.extract! aim, :id, :name, :task_point, :repeat_type
2
+ if current_user
3
+ aim_user = AimUser.find_by(user_id: current_user, aim_id: aim.id)
4
+ json.progress aim_user&.progress || [0, aim.task_point]
5
+ json.done aim_user&.task_done? || false
6
+ end
@@ -0,0 +1,3 @@
1
+ json.aims @aims, partial: 'aim', as: :aim
2
+ json.total_count @aims.total_count
3
+ json.done_count current_user.aim_users.where(state: 'done').count
@@ -0,0 +1 @@
1
+ json.partial! "aims/aim", aim: @aim
@@ -0,0 +1 @@
1
+ json.extract! gift, :id, :name, :code, :amount, :icon_url
@@ -0,0 +1,8 @@
1
+ json.extract! praise_income,
2
+ :id,
3
+ :amount,
4
+ :source_type,
5
+ :source_id,
6
+ :state,
7
+ :state_i18n,
8
+ :created_at
@@ -0,0 +1,8 @@
1
+ json.praise_income @praise_income, partial: 'praise_income', as: :praise_income
2
+ if current_user
3
+ if RailsGrowth.config.gift_purchase == 'Coin'
4
+ json.coin current_user.coin, :id, :amount
5
+ else
6
+ json.wallet current_user.wallet, :id, :amount
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ json.gifts @gifts, partial: 'gift', as: :gift
2
+ json.total_count @gifts.total_count
3
+ if current_user
4
+ if RailsGrowth.config.gift_purchase == 'Coin'
5
+ json.coin current_user.coin, :id, :amount
6
+ else
7
+ json.wallet current_user.wallet, :id, :amount
8
+ end
9
+ end
@@ -0,0 +1,2 @@
1
+ json.extract! praise_user, :id, :amount, :position
2
+ json.user praise_user.user, :id, :name, :avatar_url
@@ -0,0 +1,6 @@
1
+ if @praise_user&.persisted?
2
+ json.praise_user @praise_user, partial: 'praise_user', as: :praise_user
3
+ end
4
+ json.praise_users @praise_users, partial: 'praise_user', as: :praise_user
5
+ json.praise_amount @praise_users.sum(:amount)
6
+ json.partial! 'api/shared/pagination', items: @praise_users
@@ -0,0 +1,7 @@
1
+ en:
2
+ activerecord:
3
+ notify:
4
+ praise_income:
5
+ default:
6
+ title: '@%{user_name}'
7
+ body: 打赏给你一个%{gift_name}礼物
@@ -0,0 +1,29 @@
1
+ en:
2
+ activerecord:
3
+ attributes:
4
+ reward_income/type:
5
+ InhouseIncome: Inhouse Income
6
+ coin_exchange/type:
7
+ CoinWallet: Coin To Wallet
8
+ CoinCash: Coin To Cash
9
+ coin_log:
10
+ expense:
11
+ praise_income:
12
+ title:
13
+ tag_str:
14
+ income:
15
+ aim_user:
16
+ title:
17
+ tag_str:
18
+ praise_income:
19
+ title:
20
+ tag_str:
21
+ wallet_log:
22
+ expense:
23
+ praise_income:
24
+ title:
25
+ tag_str:
26
+ income:
27
+ praise_income:
28
+ title:
29
+ tag_str:
@@ -0,0 +1,24 @@
1
+ zh:
2
+ growth:
3
+ title: 数据增长
4
+ coin_log:
5
+ expense:
6
+ praise_income:
7
+ title: 金币打赏
8
+ tag_str: 打赏
9
+ income:
10
+ aim_user:
11
+ title: 任务奖励
12
+ tag_str: 任务
13
+ praise_income:
14
+ title: 获得打赏
15
+ tag_str: 打赏收入
16
+ wallet_log:
17
+ expense:
18
+ praise_income:
19
+ title: 虚拟币打赏
20
+ tag_str: 打赏
21
+ income:
22
+ praise_income:
23
+ title: 获得打赏
24
+ tag_str: 打赏收入
@@ -0,0 +1,7 @@
1
+ zh:
2
+ activerecord:
3
+ notify:
4
+ praise_income:
5
+ default:
6
+ title: '@%{user_name}'
7
+ body: 打赏给你一个%{gift_name}礼物
@@ -0,0 +1,11 @@
1
+ zh:
2
+ activerecord:
3
+ attributes:
4
+ aim:
5
+ rate: 金币比例
6
+ unit: 单位
7
+ reward_income/type:
8
+ InhouseIncome: 平台运营
9
+ coin_exchange/type:
10
+ CoinWallet: 兑换虚拟币
11
+ CoinCash: 提现
data/config/routes.rb ADDED
@@ -0,0 +1,57 @@
1
+ Rails.application.routes.draw do
2
+
3
+ namespace 'growth', defaults: { business: 'growth' } do
4
+ namespace :admin, defaults: { namespace: 'admin' } do
5
+ resources :aims do
6
+ get 'add_item/:item' => :add_item, on: :collection, as: :add_item
7
+ get 'remove_item/:item' => :remove_item, on: :collection, as: :remove_item
8
+ resources :aim_users, shallow: true, only: [:index, :show, :destroy]
9
+ resources :aim_entities, shallow: true, only: [:index, :show, :destroy] do
10
+ resources :aim_logs, only: [:index, :destroy]
11
+ end
12
+ end
13
+ resources :rewards, shallow: true do
14
+ resources :reward_incomes
15
+ end
16
+ resources :praise_incomes
17
+ resources :reward_expenses
18
+ end
19
+
20
+ namespace :my, defaults: { namespace: 'my' } do
21
+ resources :aim_logs, only: [:create]
22
+ scope ':entity_type/:entity_id' do
23
+ resources :aim_logs, only: [:create]
24
+ end
25
+ resources :rewards, only: [] do
26
+ member do
27
+ get :top
28
+ end
29
+ collection do
30
+ get :top
31
+ end
32
+ end
33
+ scope ':entity_type/:entity_id' do
34
+ resources :rewards, only: [] do
35
+ collection do
36
+ get :top
37
+ end
38
+ end
39
+ end
40
+ resources :gifts, only: [:index] do
41
+ collection do
42
+ get :top
43
+ end
44
+ member do
45
+ post :give
46
+ end
47
+ end
48
+ scope ':entity_type/:entity_id' do
49
+ resources :gifts, only: [] do
50
+ post :give, on: :member
51
+ end
52
+ end
53
+ resources :aims, only: [:index]
54
+ end
55
+ end
56
+
57
+ end
@@ -0,0 +1,13 @@
1
+ require 'active_support/configurable'
2
+
3
+ module RailsGrowth
4
+ include ActiveSupport::Configurable
5
+
6
+ configure do |config|
7
+ config.rate_to_reward = 0.3
8
+ config.rate_to_royalty = 0.5
9
+ config.default_max_piece = 10
10
+ config.default_min_piece = 1
11
+ end
12
+
13
+ end
@@ -0,0 +1,19 @@
1
+ require 'rails_com'
2
+ module RailsGrowth
3
+ class Engine < ::Rails::Engine
4
+
5
+ config.generators do |g|
6
+ g.rails = {
7
+ assets: false,
8
+ stylesheets: false,
9
+ helper: false
10
+ }
11
+ g.test_unit = {
12
+ fixture: true,
13
+ fixture_replacement: :factory_bot
14
+ }
15
+ g.templates.unshift File.expand_path('lib/templates', RailsCom::Engine.root)
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,28 @@
1
+ module RailsGrowth::SerialNumberHelper
2
+ extend self
3
+
4
+ def result(timestamp, repeat_type = nil)
5
+ time = timestamp.to_datetime
6
+ year = time.year
7
+ month = time.month
8
+ day = time.day
9
+ cweek = time.cweek
10
+ seconds = time.seconds_since_midnight
11
+
12
+ case repeat_type
13
+ when 'forever'
14
+ [year, month, cweek, day, seconds, UidHelper.rand_string].join('-')
15
+ when 'daily'
16
+ [year, month, cweek, day].join('-')
17
+ when 'weekly'
18
+ [year, month, cweek].join('-')
19
+ when 'monthly'
20
+ [year, month].join('-')
21
+ when 'yearly'
22
+ year.to_s
23
+ else
24
+ ''
25
+ end
26
+ end
27
+
28
+ end