decidim-budgets 0.20.1 → 0.23.1

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 (188) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +38 -3
  3. data/app/assets/images/decidim/budgets/icon.svg +1 -11
  4. data/app/assets/javascripts/decidim/budgets/projects.js.es6 +26 -4
  5. data/app/assets/stylesheets/decidim/budgets/budget/_budget-list.scss +152 -24
  6. data/app/cells/decidim/budgets/base_cell.rb +22 -0
  7. data/app/cells/decidim/budgets/budget_cell.rb +21 -0
  8. data/app/cells/decidim/budgets/budget_information_modal/show.erb +28 -0
  9. data/app/cells/decidim/budgets/budget_information_modal_cell.rb +22 -0
  10. data/app/cells/decidim/budgets/budget_list_item/show.erb +22 -0
  11. data/app/cells/decidim/budgets/budget_list_item_cell.rb +40 -0
  12. data/app/cells/decidim/budgets/budget_m/data.erb +12 -0
  13. data/app/cells/decidim/budgets/budget_m/footer.erb +5 -0
  14. data/app/cells/decidim/budgets/budget_m_cell.rb +16 -0
  15. data/app/cells/decidim/budgets/budgets_header/show.erb +7 -0
  16. data/app/cells/decidim/budgets/budgets_header_cell.rb +14 -0
  17. data/app/cells/decidim/budgets/budgets_list/card_list.erb +7 -0
  18. data/app/cells/decidim/budgets/budgets_list/highlighted.erb +11 -0
  19. data/app/cells/decidim/budgets/budgets_list/show.erb +20 -0
  20. data/app/cells/decidim/budgets/budgets_list/voted.erb +43 -0
  21. data/app/cells/decidim/budgets/budgets_list_cell.rb +39 -0
  22. data/app/cells/decidim/budgets/limit_announcement_cell.rb +52 -0
  23. data/app/cells/decidim/budgets/project_list_item/project_data.erb +19 -0
  24. data/app/cells/decidim/budgets/project_list_item/project_data_vote_button.erb +15 -0
  25. data/app/cells/decidim/budgets/project_list_item/project_image.erb +5 -0
  26. data/app/cells/decidim/budgets/project_list_item/project_text.erb +23 -0
  27. data/app/cells/decidim/budgets/project_list_item/show.erb +5 -0
  28. data/app/cells/decidim/budgets/project_list_item_cell.rb +66 -0
  29. data/app/cells/decidim/budgets/project_m/data.erb +3 -3
  30. data/app/cells/decidim/budgets/project_m/footer.erb +1 -1
  31. data/app/cells/decidim/budgets/project_m_cell.rb +4 -0
  32. data/app/cells/decidim/budgets/project_selected_status_cell.rb +28 -0
  33. data/app/cells/decidim/budgets/project_tags/show.erb +5 -0
  34. data/app/cells/decidim/budgets/project_tags_cell.rb +18 -0
  35. data/app/cells/decidim/budgets/project_voted_hint_cell.rb +33 -0
  36. data/app/cells/decidim/budgets/project_votes_count_cell.rb +44 -0
  37. data/app/commands/decidim/budgets/add_line_item.rb +7 -10
  38. data/app/commands/decidim/budgets/admin/create_budget.rb +48 -0
  39. data/app/commands/decidim/budgets/admin/create_project.rb +26 -11
  40. data/app/commands/decidim/budgets/admin/destroy_budget.rb +42 -0
  41. data/app/commands/decidim/budgets/admin/import_proposals_to_budgets.rb +26 -25
  42. data/app/commands/decidim/budgets/admin/update_budget.rb +48 -0
  43. data/app/commands/decidim/budgets/admin/update_project.rb +20 -2
  44. data/app/commands/decidim/budgets/checkout.rb +7 -6
  45. data/app/commands/decidim/budgets/remove_line_item.rb +3 -2
  46. data/app/controllers/concerns/decidim/budgets/needs_current_order.rb +18 -2
  47. data/app/controllers/concerns/decidim/budgets/orderable.rb +57 -0
  48. data/app/controllers/decidim/budgets/admin/application_controller.rb +10 -2
  49. data/app/controllers/decidim/budgets/admin/attachment_collections_controller.rb +1 -1
  50. data/app/controllers/decidim/budgets/admin/attachments_controller.rb +2 -2
  51. data/app/controllers/decidim/budgets/admin/budgets_controller.rb +82 -0
  52. data/app/controllers/decidim/budgets/admin/projects_controller.rb +15 -12
  53. data/app/controllers/decidim/budgets/admin/proposals_imports_controller.rb +10 -2
  54. data/app/controllers/decidim/budgets/application_controller.rb +23 -0
  55. data/app/controllers/decidim/budgets/budgets_controller.rb +24 -0
  56. data/app/controllers/decidim/budgets/line_items_controller.rb +10 -6
  57. data/app/controllers/decidim/budgets/orders_controller.rb +20 -6
  58. data/app/controllers/decidim/budgets/projects_controller.rb +28 -7
  59. data/app/forms/decidim/budgets/admin/budget_form.rb +39 -0
  60. data/app/forms/decidim/budgets/admin/component_form.rb +44 -0
  61. data/app/forms/decidim/budgets/admin/project_form.rb +25 -9
  62. data/app/forms/decidim/budgets/admin/project_import_proposals_form.rb +4 -0
  63. data/app/helpers/decidim/budgets/admin/application_helper.rb +13 -0
  64. data/app/helpers/decidim/budgets/application_helper.rb +11 -0
  65. data/app/helpers/decidim/budgets/projects_helper.rb +13 -0
  66. data/app/jobs/decidim/budgets/send_order_summary_job.rb +15 -0
  67. data/app/mailers/decidim/budgets/order_summary_mailer.rb +36 -0
  68. data/app/models/decidim/budgets/budget.rb +34 -0
  69. data/app/models/decidim/budgets/line_item.rb +4 -4
  70. data/app/models/decidim/budgets/order.rb +46 -16
  71. data/app/models/decidim/budgets/project.rb +37 -4
  72. data/app/permissions/decidim/budgets/admin/permissions.rb +23 -10
  73. data/app/permissions/decidim/budgets/permissions.rb +28 -6
  74. data/app/presenters/decidim/budgets/admin_log/budget_presenter.rb +42 -0
  75. data/app/queries/decidim/budgets/filtered_projects.rb +9 -1
  76. data/app/queries/decidim/budgets/metrics/budget_followers_metric_measure.rb +3 -2
  77. data/app/queries/decidim/budgets/metrics/budget_participants_metric_measure.rb +6 -5
  78. data/app/serializers/decidim/budgets/data_portability_budgets_order_serializer.rb +3 -2
  79. data/app/services/decidim/budgets/project_search.rb +13 -17
  80. data/app/types/decidim/budgets/budget_type.rb +24 -0
  81. data/app/types/decidim/budgets/budgets_type.rb +32 -0
  82. data/app/types/decidim/budgets/project_type.rb +26 -0
  83. data/app/views/decidim/budgets/admin/budgets/_form.html.erb +23 -0
  84. data/app/views/decidim/budgets/admin/budgets/edit.html.erb +7 -0
  85. data/app/views/decidim/budgets/admin/budgets/index.html.erb +58 -0
  86. data/app/views/decidim/budgets/admin/budgets/new.html.erb +7 -0
  87. data/app/views/decidim/budgets/admin/projects/_form.html.erb +15 -10
  88. data/app/views/decidim/budgets/admin/projects/edit.html.erb +2 -2
  89. data/app/views/decidim/budgets/admin/projects/index.html.erb +20 -7
  90. data/app/views/decidim/budgets/admin/projects/new.html.erb +2 -2
  91. data/app/views/decidim/budgets/admin/projects/proposals_picker.html.erb +1 -0
  92. data/app/views/decidim/budgets/admin/proposals_imports/new.html.erb +1 -1
  93. data/app/views/decidim/budgets/budgets/index.html.erb +5 -0
  94. data/app/views/decidim/budgets/order_summary_mailer/order_summary.html.erb +22 -0
  95. data/app/views/decidim/budgets/projects/_budget_confirm.html.erb +3 -3
  96. data/app/views/decidim/budgets/projects/_budget_summary.html.erb +26 -7
  97. data/app/views/decidim/budgets/projects/_filters.html.erb +15 -7
  98. data/app/views/decidim/budgets/projects/_linked_projects.html.erb +2 -2
  99. data/app/views/decidim/budgets/projects/_order_progress.html.erb +14 -18
  100. data/app/views/decidim/budgets/projects/_order_selected_projects.html.erb +3 -3
  101. data/app/views/decidim/budgets/projects/_project.html.erb +1 -57
  102. data/app/views/decidim/budgets/projects/_project_budget_button.html.erb +36 -7
  103. data/app/views/decidim/budgets/projects/_projects.html.erb +8 -1
  104. data/app/views/decidim/budgets/projects/index.html.erb +15 -7
  105. data/app/views/decidim/budgets/projects/index.js.erb +8 -0
  106. data/app/views/decidim/budgets/projects/show.html.erb +18 -11
  107. data/config/locales/am-ET.yml +1 -0
  108. data/config/locales/ar.yml +3 -17
  109. data/config/locales/bg-BG.yml +7 -0
  110. data/config/locales/bg.yml +6 -0
  111. data/config/locales/ca.yml +126 -12
  112. data/config/locales/cs.yml +145 -31
  113. data/config/locales/da-DK.yml +1 -0
  114. data/config/locales/da.yml +1 -0
  115. data/config/locales/de.yml +115 -12
  116. data/config/locales/el.yml +169 -0
  117. data/config/locales/en.yml +126 -12
  118. data/config/locales/eo.yml +1 -0
  119. data/config/locales/es-MX.yml +126 -12
  120. data/config/locales/es-PY.yml +126 -12
  121. data/config/locales/es.yml +126 -12
  122. data/config/locales/et-EE.yml +1 -0
  123. data/config/locales/et.yml +1 -0
  124. data/config/locales/eu.yml +4 -14
  125. data/config/locales/fi-plain.yml +127 -13
  126. data/config/locales/fi.yml +137 -23
  127. data/config/locales/fr-CA.yml +266 -0
  128. data/config/locales/fr.yml +125 -12
  129. data/config/locales/ga-IE.yml +1 -0
  130. data/config/locales/gl.yml +3 -13
  131. data/config/locales/hr-HR.yml +1 -0
  132. data/config/locales/hr.yml +1 -0
  133. data/config/locales/hu.yml +19 -13
  134. data/config/locales/id-ID.yml +3 -12
  135. data/config/locales/is-IS.yml +1 -12
  136. data/config/locales/is.yml +114 -0
  137. data/config/locales/it.yml +97 -13
  138. data/config/locales/ja-JP.yml +172 -0
  139. data/config/locales/ja.yml +262 -0
  140. data/config/locales/ko-KR.yml +1 -0
  141. data/config/locales/ko.yml +1 -0
  142. data/config/locales/lt-LT.yml +1 -0
  143. data/config/locales/lt.yml +1 -0
  144. data/config/locales/lv.yml +164 -0
  145. data/config/locales/mt-MT.yml +1 -0
  146. data/config/locales/mt.yml +1 -0
  147. data/config/locales/nl.yml +113 -13
  148. data/config/locales/no.yml +39 -13
  149. data/config/locales/om-ET.yml +1 -0
  150. data/config/locales/pl.yml +175 -62
  151. data/config/locales/pt-BR.yml +4 -14
  152. data/config/locales/pt.yml +63 -47
  153. data/config/locales/ro-RO.yml +172 -0
  154. data/config/locales/ru.yml +3 -15
  155. data/config/locales/sk-SK.yml +180 -0
  156. data/config/locales/sk.yml +166 -0
  157. data/config/locales/sl.yml +1 -0
  158. data/config/locales/so-SO.yml +1 -0
  159. data/config/locales/sr-CS.yml +27 -0
  160. data/config/locales/sv.yml +126 -12
  161. data/config/locales/ti-ER.yml +1 -0
  162. data/config/locales/tr-TR.yml +3 -13
  163. data/config/locales/uk.yml +3 -15
  164. data/config/locales/vi-VN.yml +1 -0
  165. data/config/locales/vi.yml +1 -0
  166. data/config/locales/zh-CN.yml +260 -0
  167. data/config/locales/zh-TW.yml +1 -0
  168. data/db/migrate/20200617105120_create_decidim_budgets.rb +15 -0
  169. data/db/migrate/20200629072626_rename_budget_to_budget_ammount.rb +7 -0
  170. data/db/migrate/20200629134013_add_budget_reference_to_project.rb +7 -0
  171. data/db/migrate/20200706142609_add_budget_reference_to_order.rb +7 -0
  172. data/db/migrate/20200714103519_move_budgets_to_own_model.rb +109 -0
  173. data/db/migrate/20200717140012_add_scope_to_budgets.rb +7 -0
  174. data/db/migrate/20200728075039_add_selected_at_to_project.rb +7 -0
  175. data/db/migrate/20200804175222_votes_enabled_to_votes_choices.rb +35 -0
  176. data/db/migrate/20200827154129_add_commentable_counter_cache_to_projects.rb +9 -0
  177. data/lib/decidim/budgets.rb +1 -0
  178. data/lib/decidim/budgets/admin_engine.rb +12 -5
  179. data/lib/decidim/budgets/component.rb +94 -38
  180. data/lib/decidim/budgets/engine.rb +8 -6
  181. data/lib/decidim/budgets/seeds/city.jpeg +0 -0
  182. data/lib/decidim/budgets/test/factories.rb +71 -9
  183. data/lib/decidim/budgets/version.rb +1 -1
  184. data/lib/decidim/budgets/workflows.rb +17 -0
  185. data/lib/decidim/budgets/workflows/all.rb +20 -0
  186. data/lib/decidim/budgets/workflows/base.rb +132 -0
  187. data/lib/decidim/budgets/workflows/one.rb +33 -0
  188. metadata +121 -16
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddScopeToBudgets < ActiveRecord::Migration[5.2]
4
+ def change
5
+ add_reference :decidim_budgets_budgets, :decidim_scope, foreign_key: true, index: true
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddSelectedAtToProject < ActiveRecord::Migration[5.2]
4
+ def change
5
+ add_column :decidim_budgets_projects, :selected_at, :date, index: true
6
+ end
7
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ class VotesEnabledToVotesChoices < ActiveRecord::Migration[5.2]
4
+ class Component < ApplicationRecord
5
+ self.table_name = :decidim_components
6
+ end
7
+
8
+ def up
9
+ budget_components.each do |component|
10
+ steps = component["settings"] && component["settings"].dig("steps")
11
+ default_step = component["settings"] && component["settings"].dig("default_step")
12
+
13
+ if steps.present?
14
+ new_steps_settings = component["settings"]["steps"].each_with_object({}) do |(step, config), new_config|
15
+ votes_value = config.dig("votes_enabled") ? "enabled" : "disabled"
16
+
17
+ new_config[step] = config.merge("votes": votes_value).except("votes_enabled")
18
+ new_config
19
+ end
20
+ component["settings"]["steps"] = new_steps_settings
21
+ component.save!
22
+ elsif default_step.present?
23
+ votes_value = component["settings"]["default_step"].dig("votes_enabled") ? "enabled" : "disabled"
24
+
25
+ new_default_step_settings = component["settings"]["default_step"].merge("votes": votes_value).except("votes_enabled")
26
+ component["settings"]["default_step"] = new_default_step_settings
27
+ component.save!
28
+ end
29
+ end
30
+ end
31
+
32
+ def budget_components
33
+ @budget_components ||= Component.where(manifest_name: "budgets")
34
+ end
35
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddCommentableCounterCacheToProjects < ActiveRecord::Migration[5.2]
4
+ def change
5
+ add_column :decidim_budgets_projects, :comments_count, :integer, null: false, default: 0, index: true
6
+ Decidim::Budgets::Project.reset_column_information
7
+ Decidim::Budgets::Project.find_each(&:update_comments_count)
8
+ end
9
+ end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "decidim/budgets/workflows"
3
4
  require "decidim/budgets/admin"
4
5
  require "decidim/budgets/engine"
5
6
  require "decidim/budgets/admin_engine"
@@ -12,15 +12,22 @@ module Decidim
12
12
  paths["lib/tasks"] = nil
13
13
 
14
14
  routes do
15
- resources :projects do
15
+ resources :budgets do
16
+ resources :projects do
17
+ collection do
18
+ resource :proposals_import, only: [:new, :create]
19
+ end
20
+ end
21
+ end
22
+
23
+ resources :projects, exclude: [:index, :new, :create, :edit, :update, :destroy] do
24
+ get :proposals_picker, on: :collection
25
+
16
26
  resources :attachment_collections
17
27
  resources :attachments
18
- collection do
19
- resource :proposals_import, only: [:new, :create]
20
- end
21
28
  end
22
29
 
23
- root to: "projects#index"
30
+ root to: "budgets#index"
24
31
  end
25
32
 
26
33
  def load_seed
@@ -8,15 +8,24 @@ Decidim.register_component(:budgets) do |component|
8
8
  component.icon = "decidim/budgets/icon.svg"
9
9
  component.stylesheet = "decidim/budgets/budgets"
10
10
  component.permissions_class_name = "Decidim::Budgets::Permissions"
11
+ component.component_form_class_name = "Decidim::Budgets::Admin::ComponentForm"
11
12
 
12
13
  component.data_portable_entities = ["Decidim::Budgets::Order"]
13
14
 
14
15
  component.newsletter_participant_entities = ["Decidim::Budgets::Order"]
15
16
 
17
+ component.query_type = "Decidim::Budgets::BudgetsType"
18
+
16
19
  component.actions = %(vote)
17
20
 
18
21
  component.on(:before_destroy) do |instance|
19
- raise StandardError, "Can't remove this component" if Decidim::Budgets::Project.where(component: instance).any?
22
+ raise StandardError, "Can't remove this component" if Decidim::Budgets::Budget.where(component: instance).any?
23
+ end
24
+
25
+ component.register_resource(:budget) do |resource|
26
+ resource.model_class_name = "Decidim::Budgets::Budget"
27
+ resource.card = "decidim/budgets/budget"
28
+ resource.searchable = true
20
29
  end
21
30
 
22
31
  component.register_resource(:project) do |resource|
@@ -27,12 +36,17 @@ Decidim.register_component(:budgets) do |component|
27
36
  resource.searchable = true
28
37
  end
29
38
 
30
- component.register_stat :projects_count, primary: true, priority: Decidim::StatsRegistry::LOW_PRIORITY do |components, start_at, end_at|
39
+ component.register_stat :budgets_count, primary: true, priority: Decidim::StatsRegistry::LOW_PRIORITY do |components|
40
+ Decidim::Budgets::Budget.where(component: components).count
41
+ end
42
+
43
+ component.register_stat :projects_count, priority: Decidim::StatsRegistry::LOW_PRIORITY do |components, start_at, end_at|
31
44
  Decidim::Budgets::FilteredProjects.for(components, start_at, end_at).count
32
45
  end
33
46
 
34
47
  component.register_stat :orders_count do |components, start_at, end_at|
35
- orders = Decidim::Budgets::Order.where(component: components)
48
+ budgets = Decidim::Budgets::Budget.where(component: components)
49
+ orders = Decidim::Budgets::Order.where(component: budgets)
36
50
  orders = orders.where("created_at >= ?", start_at) if start_at.present?
37
51
  orders = orders.where("created_at <= ?", end_at) if end_at.present?
38
52
  orders.count
@@ -40,71 +54,113 @@ Decidim.register_component(:budgets) do |component|
40
54
 
41
55
  component.register_stat :comments_count, tag: :comments do |components, start_at, end_at|
42
56
  projects = Decidim::Budgets::FilteredProjects.for(components, start_at, end_at)
43
- Decidim::Comments::Comment.where(root_commentable: projects).count
57
+ projects.sum(:comments_count)
58
+ end
59
+
60
+ component.register_stat :followers_count, tag: :followers, priority: Decidim::StatsRegistry::LOW_PRIORITY do |components, start_at, end_at|
61
+ projects_ids = Decidim::Budgets::FilteredProjects.for(components, start_at, end_at).pluck(:id)
62
+ Decidim::Follow.where(decidim_followable_type: "Decidim::Budgets::Project", decidim_followable_id: projects_ids).count
44
63
  end
45
64
 
46
65
  component.settings(:global) do |settings|
66
+ settings.attribute :scopes_enabled, type: :boolean, default: false
67
+ settings.attribute :scope_id, type: :scope
68
+ settings.attribute :workflow, type: :enum, default: "one", choices: -> { Decidim::Budgets.workflows.keys.map(&:to_s) }
47
69
  settings.attribute :projects_per_page, type: :integer, default: 12
48
- settings.attribute :total_budget, type: :integer, default: 100_000_000
70
+ settings.attribute :vote_rule_threshold_percent_enabled, type: :boolean, default: true
49
71
  settings.attribute :vote_threshold_percent, type: :integer, default: 70
72
+ settings.attribute :vote_rule_minimum_budget_projects_enabled, type: :boolean, default: false
73
+ settings.attribute :vote_minimum_budget_projects_number, type: :integer, default: 1
50
74
  settings.attribute :comments_enabled, type: :boolean, default: true
75
+ settings.attribute :comments_max_length, type: :integer, required: false
51
76
  settings.attribute :resources_permissions_enabled, type: :boolean, default: true
52
77
  settings.attribute :announcement, type: :text, translated: true, editor: true
78
+
79
+ settings.attribute :landing_page_content, type: :text, translated: true, editor: true
80
+ settings.attribute :more_information_modal, type: :text, translated: true
53
81
  end
54
82
 
55
83
  component.settings(:step) do |settings|
56
84
  settings.attribute :comments_blocked, type: :boolean, default: false
57
- settings.attribute :votes_enabled, type: :boolean, default: true
85
+ settings.attribute :votes, type: :enum, default: "enabled", choices: %w(disabled enabled finished)
58
86
  settings.attribute :show_votes, type: :boolean, default: false
59
87
  settings.attribute :announcement, type: :text, translated: true, editor: true
88
+
89
+ settings.attribute :landing_page_content, type: :text, translated: true, editor: true
90
+ settings.attribute :more_information_modal, type: :text, translated: true
91
+ settings.attribute :announcement, type: :text, translated: true, editor: true
60
92
  end
61
93
 
62
94
  component.seeds do |participatory_space|
95
+ landing_page_content = Decidim::Faker::Localized.localized do
96
+ "<h2>#{::Faker::Lorem.sentence}</h2>" \
97
+ "<p>#{::Faker::Lorem.paragraph}</p>" \
98
+ "<p>#{::Faker::Lorem.paragraph}</p>"
99
+ end
100
+
63
101
  component = Decidim::Component.create!(
64
102
  name: Decidim::Components::Namer.new(participatory_space.organization.available_locales, :budgets).i18n_name,
65
103
  manifest_name: :budgets,
66
104
  published_at: Time.current,
67
- participatory_space: participatory_space
105
+ participatory_space: participatory_space,
106
+ settings: {
107
+ landing_page_content: landing_page_content,
108
+ more_information_modal: Decidim::Faker::Localized.paragraph(4),
109
+ workflow: %w(one random all).sample
110
+ }
68
111
  )
69
112
 
70
- 2.times do
71
- project = Decidim::Budgets::Project.create!(
113
+ rand(1...3).times do
114
+ Decidim::Budgets::Budget.create!(
72
115
  component: component,
73
- scope: participatory_space.organization.scopes.sample,
74
- category: participatory_space.categories.sample,
75
116
  title: Decidim::Faker::Localized.sentence(2),
76
117
  description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
77
118
  Decidim::Faker::Localized.paragraph(3)
78
119
  end,
79
- budget: Faker::Number.number(8)
80
- )
81
-
82
- attachment_collection = Decidim::AttachmentCollection.create!(
83
- name: Decidim::Faker::Localized.word,
84
- description: Decidim::Faker::Localized.sentence(5),
85
- collection_for: project
120
+ total_budget: Faker::Number.number(8)
86
121
  )
122
+ end
87
123
 
88
- Decidim::Attachment.create!(
89
- title: Decidim::Faker::Localized.sentence(2),
90
- description: Decidim::Faker::Localized.sentence(5),
91
- file: File.new(File.join(__dir__, "seeds", "Exampledocument.pdf")),
92
- attachment_collection: attachment_collection,
93
- attached_to: project
94
- )
95
- Decidim::Attachment.create!(
96
- title: Decidim::Faker::Localized.sentence(2),
97
- description: Decidim::Faker::Localized.sentence(5),
98
- file: File.new(File.join(__dir__, "seeds", "city.jpeg")),
99
- attached_to: project
100
- )
101
- Decidim::Attachment.create!(
102
- title: Decidim::Faker::Localized.sentence(2),
103
- description: Decidim::Faker::Localized.sentence(5),
104
- file: File.new(File.join(__dir__, "seeds", "Exampledocument.pdf")),
105
- attached_to: project
106
- )
107
- Decidim::Comments::Seed.comments_for(project)
124
+ Decidim::Budgets::Budget.where(component: component).each do |budget|
125
+ rand(2...4).times do
126
+ project = Decidim::Budgets::Project.create!(
127
+ budget: budget,
128
+ scope: participatory_space.organization.scopes.sample,
129
+ category: participatory_space.categories.sample,
130
+ title: Decidim::Faker::Localized.sentence(2),
131
+ description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
132
+ Decidim::Faker::Localized.paragraph(3)
133
+ end,
134
+ budget_amount: Faker::Number.number(8)
135
+ )
136
+
137
+ attachment_collection = Decidim::AttachmentCollection.create!(
138
+ name: Decidim::Faker::Localized.word,
139
+ description: Decidim::Faker::Localized.sentence(5),
140
+ collection_for: project
141
+ )
142
+
143
+ Decidim::Attachment.create!(
144
+ title: Decidim::Faker::Localized.sentence(2),
145
+ description: Decidim::Faker::Localized.sentence(5),
146
+ attachment_collection: attachment_collection,
147
+ attached_to: project,
148
+ file: File.new(File.join(__dir__, "seeds", "Exampledocument.pdf"))
149
+ )
150
+ Decidim::Attachment.create!(
151
+ title: Decidim::Faker::Localized.sentence(2),
152
+ description: Decidim::Faker::Localized.sentence(5),
153
+ attached_to: project,
154
+ file: File.new(File.join(__dir__, "seeds", "city.jpeg"))
155
+ )
156
+ Decidim::Attachment.create!(
157
+ title: Decidim::Faker::Localized.sentence(2),
158
+ description: Decidim::Faker::Localized.sentence(5),
159
+ attached_to: project,
160
+ file: File.new(File.join(__dir__, "seeds", "Exampledocument.pdf"))
161
+ )
162
+ Decidim::Comments::Seed.comments_for(project)
163
+ end
108
164
  end
109
165
  end
110
166
  end
@@ -12,15 +12,17 @@ module Decidim
12
12
  isolate_namespace Decidim::Budgets
13
13
 
14
14
  routes do
15
- resources :projects, only: [:index, :show]
16
- resource :order, only: [:destroy] do
17
- member do
18
- post :checkout
15
+ resources :budgets, only: [:index, :show] do
16
+ resources :projects, only: [:index, :show]
17
+ resource :order, only: [:destroy] do
18
+ member do
19
+ post :checkout
20
+ end
21
+ resource :line_item, only: [:create, :destroy]
19
22
  end
20
- resource :line_item, only: [:create, :destroy]
21
23
  end
22
24
 
23
- root to: "projects#index"
25
+ root to: "budgets#index"
24
26
  end
25
27
 
26
28
  initializer "decidim_budgets.assets" do |app|
@@ -7,30 +7,48 @@ require "decidim/core/test/factories"
7
7
  require "decidim/participatory_processes/test/factories"
8
8
 
9
9
  FactoryBot.define do
10
- factory :budget_component, parent: :component do
10
+ factory :budgets_component, parent: :component do
11
11
  name { Decidim::Components::Namer.new(participatory_space.organization.available_locales, :budgets).i18n_name }
12
12
  manifest_name { :budgets }
13
13
  participatory_space { create(:participatory_process, :with_steps, organization: organization) }
14
14
 
15
- trait :with_total_budget_and_vote_threshold_percent do
15
+ trait :with_vote_threshold_percent do
16
16
  transient do
17
- total_budget { 100_000_000 }
17
+ vote_rule_threshold_percent_enabled { true }
18
+ vote_rule_minimum_budget_projects_enabled { false }
18
19
  vote_threshold_percent { 70 }
19
20
  end
20
21
 
21
22
  settings do
22
23
  {
23
- total_budget: total_budget,
24
+ vote_rule_threshold_percent_enabled: vote_rule_threshold_percent_enabled,
25
+ vote_rule_minimum_budget_projects_enabled: vote_rule_minimum_budget_projects_enabled,
24
26
  vote_threshold_percent: vote_threshold_percent
25
27
  }
26
28
  end
27
29
  end
28
30
 
31
+ trait :with_minimum_budget_projects do
32
+ transient do
33
+ vote_rule_threshold_percent_enabled { false }
34
+ vote_rule_minimum_budget_projects_enabled { true }
35
+ vote_minimum_budget_projects_number { 3 }
36
+ end
37
+
38
+ settings do
39
+ {
40
+ vote_rule_threshold_percent_enabled: vote_rule_threshold_percent_enabled,
41
+ vote_rule_minimum_budget_projects_enabled: vote_rule_minimum_budget_projects_enabled,
42
+ vote_minimum_budget_projects_number: vote_minimum_budget_projects_number
43
+ }
44
+ end
45
+ end
46
+
29
47
  trait :with_votes_disabled do
30
48
  step_settings do
31
49
  {
32
50
  participatory_space.active_step.id => {
33
- votes_enabled: false
51
+ votes: :disabled
34
52
  }
35
53
  }
36
54
  end
@@ -45,22 +63,66 @@ FactoryBot.define do
45
63
  }
46
64
  end
47
65
  end
66
+
67
+ trait :with_voting_finished do
68
+ step_settings do
69
+ {
70
+ participatory_space.active_step.id => {
71
+ votes: :finished,
72
+ show_votes: true
73
+ }
74
+ }
75
+ end
76
+ end
77
+ end
78
+
79
+ factory :budget, class: "Decidim::Budgets::Budget" do
80
+ title { generate_localized_title }
81
+ description { Decidim::Faker::Localized.wrapped("<p>", "</p>") { generate_localized_title } }
82
+ total_budget { 100_000_000 }
83
+ component { create(:budgets_component) }
84
+
85
+ trait :with_projects do
86
+ transient do
87
+ projects_number { 2 }
88
+ end
89
+
90
+ after(:create) do |budget, evaluator|
91
+ create_list(:project, evaluator.projects_number, budget: budget)
92
+ end
93
+ end
48
94
  end
49
95
 
50
96
  factory :project, class: "Decidim::Budgets::Project" do
51
97
  title { generate_localized_title }
52
98
  description { Decidim::Faker::Localized.wrapped("<p>", "</p>") { generate_localized_title } }
53
- budget { Faker::Number.number(8) }
54
- component { create(:budget_component) }
99
+ budget_amount { Faker::Number.number(8) }
100
+ budget { create(:budget) }
101
+
102
+ trait :selected do
103
+ selected_at { Time.current }
104
+ end
55
105
  end
56
106
 
57
107
  factory :order, class: "Decidim::Budgets::Order" do
58
- component { create(:budget_component) }
108
+ budget { create(:budget) }
59
109
  user { create(:user, organization: component.organization) }
110
+
111
+ trait :with_projects do
112
+ transient do
113
+ projects_number { 2 }
114
+ end
115
+
116
+ after(:create) do |order, evaluator|
117
+ project_budget = (order.maximum_budget / evaluator.projects_number).to_i
118
+ order.projects << create_list(:project, evaluator.projects_number, budget_amount: project_budget, budget: order.budget)
119
+ order.save!
120
+ end
121
+ end
60
122
  end
61
123
 
62
124
  factory :line_item, class: "Decidim::Budgets::LineItem" do
63
125
  order
64
- project { create(:project, component: order.component) }
126
+ project { create(:project, budget: order.budget) }
65
127
  end
66
128
  end
@@ -4,7 +4,7 @@ module Decidim
4
4
  # This holds the decidim-budgets version.
5
5
  module Budgets
6
6
  def self.version
7
- "0.20.1"
7
+ "0.23.1"
8
8
  end
9
9
  end
10
10
  end