decidim-budgets 0.22.0 → 0.23.0

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 (171) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +38 -3
  3. data/app/assets/stylesheets/decidim/budgets/budget/_budget-list.scss +5 -0
  4. data/app/cells/decidim/budgets/base_cell.rb +22 -0
  5. data/app/cells/decidim/budgets/budget_cell.rb +21 -0
  6. data/app/cells/decidim/budgets/budget_information_modal/show.erb +28 -0
  7. data/app/cells/decidim/budgets/budget_information_modal_cell.rb +22 -0
  8. data/app/cells/decidim/budgets/budget_list_item/show.erb +22 -0
  9. data/app/cells/decidim/budgets/budget_list_item_cell.rb +40 -0
  10. data/app/cells/decidim/budgets/budget_m/data.erb +12 -0
  11. data/app/cells/decidim/budgets/budget_m/footer.erb +5 -0
  12. data/app/cells/decidim/budgets/budget_m_cell.rb +16 -0
  13. data/app/cells/decidim/budgets/budgets_header/show.erb +7 -0
  14. data/app/cells/decidim/budgets/budgets_header_cell.rb +14 -0
  15. data/app/cells/decidim/budgets/budgets_list/card_list.erb +7 -0
  16. data/app/cells/decidim/budgets/budgets_list/highlighted.erb +11 -0
  17. data/app/cells/decidim/budgets/budgets_list/show.erb +20 -0
  18. data/app/cells/decidim/budgets/budgets_list/voted.erb +43 -0
  19. data/app/cells/decidim/budgets/budgets_list_cell.rb +39 -0
  20. data/app/cells/decidim/budgets/limit_announcement_cell.rb +52 -0
  21. data/app/cells/decidim/budgets/project_list_item/project_data.erb +17 -3
  22. data/app/cells/decidim/budgets/project_list_item/project_data_vote_button.erb +2 -2
  23. data/app/cells/decidim/budgets/project_list_item/project_text.erb +11 -5
  24. data/app/cells/decidim/budgets/project_list_item/show.erb +3 -3
  25. data/app/cells/decidim/budgets/project_list_item_cell.rb +8 -28
  26. data/app/cells/decidim/budgets/project_m/data.erb +1 -1
  27. data/app/cells/decidim/budgets/project_m_cell.rb +4 -0
  28. data/app/cells/decidim/budgets/project_selected_status_cell.rb +28 -0
  29. data/app/cells/decidim/budgets/project_tags/show.erb +5 -0
  30. data/app/cells/decidim/budgets/project_tags_cell.rb +18 -0
  31. data/app/cells/decidim/budgets/project_voted_hint_cell.rb +33 -0
  32. data/app/cells/decidim/budgets/project_votes_count_cell.rb +44 -0
  33. data/app/commands/decidim/budgets/add_line_item.rb +7 -10
  34. data/app/commands/decidim/budgets/admin/create_budget.rb +48 -0
  35. data/app/commands/decidim/budgets/admin/create_project.rb +12 -7
  36. data/app/commands/decidim/budgets/admin/destroy_budget.rb +42 -0
  37. data/app/commands/decidim/budgets/admin/import_proposals_to_budgets.rb +26 -25
  38. data/app/commands/decidim/budgets/admin/update_budget.rb +48 -0
  39. data/app/commands/decidim/budgets/admin/update_project.rb +8 -1
  40. data/app/commands/decidim/budgets/checkout.rb +6 -6
  41. data/app/commands/decidim/budgets/remove_line_item.rb +3 -2
  42. data/app/controllers/concerns/decidim/budgets/needs_current_order.rb +14 -2
  43. data/app/controllers/concerns/decidim/budgets/orderable.rb +3 -7
  44. data/app/controllers/decidim/budgets/admin/application_controller.rb +10 -2
  45. data/app/controllers/decidim/budgets/admin/attachment_collections_controller.rb +1 -1
  46. data/app/controllers/decidim/budgets/admin/attachments_controller.rb +2 -2
  47. data/app/controllers/decidim/budgets/admin/budgets_controller.rb +82 -0
  48. data/app/controllers/decidim/budgets/admin/projects_controller.rb +7 -7
  49. data/app/controllers/decidim/budgets/admin/proposals_imports_controller.rb +10 -2
  50. data/app/controllers/decidim/budgets/application_controller.rb +23 -0
  51. data/app/controllers/decidim/budgets/budgets_controller.rb +24 -0
  52. data/app/controllers/decidim/budgets/line_items_controller.rb +9 -5
  53. data/app/controllers/decidim/budgets/orders_controller.rb +20 -6
  54. data/app/controllers/decidim/budgets/projects_controller.rb +19 -18
  55. data/app/forms/decidim/budgets/admin/budget_form.rb +39 -0
  56. data/app/forms/decidim/budgets/admin/project_form.rb +14 -10
  57. data/app/forms/decidim/budgets/admin/project_import_proposals_form.rb +4 -0
  58. data/app/helpers/decidim/budgets/admin/application_helper.rb +13 -0
  59. data/app/helpers/decidim/budgets/application_helper.rb +10 -0
  60. data/app/helpers/decidim/budgets/projects_helper.rb +0 -4
  61. data/app/mailers/decidim/budgets/order_summary_mailer.rb +5 -3
  62. data/app/models/decidim/budgets/budget.rb +34 -0
  63. data/app/models/decidim/budgets/line_item.rb +4 -4
  64. data/app/models/decidim/budgets/order.rb +22 -19
  65. data/app/models/decidim/budgets/project.rb +34 -5
  66. data/app/permissions/decidim/budgets/admin/permissions.rb +23 -10
  67. data/app/permissions/decidim/budgets/permissions.rb +28 -6
  68. data/app/presenters/decidim/budgets/admin_log/budget_presenter.rb +42 -0
  69. data/app/queries/decidim/budgets/filtered_projects.rb +9 -1
  70. data/app/queries/decidim/budgets/metrics/budget_followers_metric_measure.rb +3 -2
  71. data/app/queries/decidim/budgets/metrics/budget_participants_metric_measure.rb +6 -5
  72. data/app/serializers/decidim/budgets/data_portability_budgets_order_serializer.rb +3 -2
  73. data/app/services/decidim/budgets/project_search.rb +12 -24
  74. data/app/types/decidim/budgets/budget_type.rb +24 -0
  75. data/app/types/decidim/budgets/budgets_type.rb +6 -6
  76. data/app/types/decidim/budgets/project_type.rb +2 -1
  77. data/app/views/decidim/budgets/admin/budgets/_form.html.erb +23 -0
  78. data/app/views/decidim/budgets/admin/budgets/edit.html.erb +7 -0
  79. data/app/views/decidim/budgets/admin/budgets/index.html.erb +58 -0
  80. data/app/views/decidim/budgets/admin/budgets/new.html.erb +7 -0
  81. data/app/views/decidim/budgets/admin/projects/_form.html.erb +12 -4
  82. data/app/views/decidim/budgets/admin/projects/edit.html.erb +2 -2
  83. data/app/views/decidim/budgets/admin/projects/index.html.erb +20 -7
  84. data/app/views/decidim/budgets/admin/projects/new.html.erb +2 -2
  85. data/app/views/decidim/budgets/admin/proposals_imports/new.html.erb +1 -1
  86. data/app/views/decidim/budgets/budgets/index.html.erb +5 -0
  87. data/app/views/decidim/budgets/order_summary_mailer/order_summary.html.erb +1 -0
  88. data/app/views/decidim/budgets/projects/_budget_confirm.html.erb +3 -3
  89. data/app/views/decidim/budgets/projects/_budget_summary.html.erb +19 -6
  90. data/app/views/decidim/budgets/projects/_filters.html.erb +6 -2
  91. data/app/views/decidim/budgets/projects/_linked_projects.html.erb +1 -1
  92. data/app/views/decidim/budgets/projects/_order_progress.html.erb +10 -6
  93. data/app/views/decidim/budgets/projects/_order_selected_projects.html.erb +3 -3
  94. data/app/views/decidim/budgets/projects/_project_budget_button.html.erb +36 -7
  95. data/app/views/decidim/budgets/projects/index.html.erb +12 -4
  96. data/app/views/decidim/budgets/projects/show.html.erb +17 -10
  97. data/config/locales/am-ET.yml +1 -0
  98. data/config/locales/ar.yml +2 -11
  99. data/config/locales/bg.yml +6 -0
  100. data/config/locales/ca.yml +102 -10
  101. data/config/locales/cs.yml +105 -13
  102. data/config/locales/da.yml +1 -0
  103. data/config/locales/de.yml +90 -9
  104. data/config/locales/el.yml +3 -9
  105. data/config/locales/en.yml +101 -9
  106. data/config/locales/eo.yml +1 -0
  107. data/config/locales/es-MX.yml +101 -9
  108. data/config/locales/es-PY.yml +101 -9
  109. data/config/locales/es.yml +102 -10
  110. data/config/locales/et.yml +1 -0
  111. data/config/locales/eu.yml +3 -8
  112. data/config/locales/fi-plain.yml +102 -10
  113. data/config/locales/fi.yml +103 -11
  114. data/config/locales/fr-CA.yml +100 -9
  115. data/config/locales/fr.yml +100 -9
  116. data/config/locales/gl.yml +2 -7
  117. data/config/locales/hr.yml +1 -0
  118. data/config/locales/hu.yml +2 -7
  119. data/config/locales/id-ID.yml +2 -6
  120. data/config/locales/is-IS.yml +0 -6
  121. data/config/locales/is.yml +114 -0
  122. data/config/locales/it.yml +71 -9
  123. data/config/locales/ja-JP.yml +1 -0
  124. data/config/locales/ja.yml +262 -0
  125. data/config/locales/ko-KR.yml +1 -0
  126. data/config/locales/ko.yml +1 -0
  127. data/config/locales/lt.yml +1 -0
  128. data/config/locales/{lv-LV.yml → lv.yml} +2 -10
  129. data/config/locales/mt.yml +1 -0
  130. data/config/locales/nl.yml +88 -10
  131. data/config/locales/no.yml +22 -9
  132. data/config/locales/om-ET.yml +1 -0
  133. data/config/locales/pl.yml +113 -22
  134. data/config/locales/pt-BR.yml +2 -7
  135. data/config/locales/pt.yml +3 -9
  136. data/config/locales/ro-RO.yml +3 -10
  137. data/config/locales/ru.yml +2 -9
  138. data/config/locales/sk.yml +2 -11
  139. data/config/locales/sl.yml +0 -4
  140. data/config/locales/so-SO.yml +1 -0
  141. data/config/locales/sr-CS.yml +0 -2
  142. data/config/locales/sv.yml +80 -9
  143. data/config/locales/ti-ER.yml +1 -0
  144. data/config/locales/tr-TR.yml +2 -7
  145. data/config/locales/uk.yml +2 -9
  146. data/config/locales/vi-VN.yml +1 -0
  147. data/config/locales/vi.yml +1 -0
  148. data/config/locales/zh-CN.yml +260 -0
  149. data/config/locales/zh-TW.yml +1 -0
  150. data/db/migrate/20200617105120_create_decidim_budgets.rb +15 -0
  151. data/db/migrate/20200629072626_rename_budget_to_budget_ammount.rb +7 -0
  152. data/db/migrate/20200629134013_add_budget_reference_to_project.rb +7 -0
  153. data/db/migrate/20200706142609_add_budget_reference_to_order.rb +7 -0
  154. data/db/migrate/20200714103519_move_budgets_to_own_model.rb +109 -0
  155. data/db/migrate/20200717140012_add_scope_to_budgets.rb +7 -0
  156. data/db/migrate/20200728075039_add_selected_at_to_project.rb +7 -0
  157. data/db/migrate/20200804175222_votes_enabled_to_votes_choices.rb +35 -0
  158. data/db/migrate/20200827154129_add_commentable_counter_cache_to_projects.rb +9 -0
  159. data/lib/decidim/budgets.rb +1 -0
  160. data/lib/decidim/budgets/admin_engine.rb +10 -5
  161. data/lib/decidim/budgets/component.rb +83 -38
  162. data/lib/decidim/budgets/engine.rb +8 -6
  163. data/lib/decidim/budgets/test/factories.rb +42 -13
  164. data/lib/decidim/budgets/version.rb +1 -1
  165. data/lib/decidim/budgets/workflows.rb +17 -0
  166. data/lib/decidim/budgets/workflows/all.rb +20 -0
  167. data/lib/decidim/budgets/workflows/base.rb +132 -0
  168. data/lib/decidim/budgets/workflows/one.rb +33 -0
  169. metadata +84 -17
  170. data/app/cells/decidim/budgets/project_list_item/project_data_number.erb +0 -3
  171. data/app/cells/decidim/budgets/project_list_item/project_data_votes.erb +0 -7
@@ -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,17 +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
16
24
  get :proposals_picker, on: :collection
17
25
 
18
26
  resources :attachment_collections
19
27
  resources :attachments
20
- collection do
21
- resource :proposals_import, only: [:new, :create]
22
- end
23
28
  end
24
29
 
25
- root to: "projects#index"
30
+ root to: "budgets#index"
26
31
  end
27
32
 
28
33
  def load_seed
@@ -19,7 +19,13 @@ Decidim.register_component(:budgets) do |component|
19
19
  component.actions = %(vote)
20
20
 
21
21
  component.on(:before_destroy) do |instance|
22
- 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
23
29
  end
24
30
 
25
31
  component.register_resource(:project) do |resource|
@@ -30,12 +36,17 @@ Decidim.register_component(:budgets) do |component|
30
36
  resource.searchable = true
31
37
  end
32
38
 
33
- 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|
34
44
  Decidim::Budgets::FilteredProjects.for(components, start_at, end_at).count
35
45
  end
36
46
 
37
47
  component.register_stat :orders_count do |components, start_at, end_at|
38
- orders = Decidim::Budgets::Order.where(component: components)
48
+ budgets = Decidim::Budgets::Budget.where(component: components)
49
+ orders = Decidim::Budgets::Order.where(component: budgets)
39
50
  orders = orders.where("created_at >= ?", start_at) if start_at.present?
40
51
  orders = orders.where("created_at <= ?", end_at) if end_at.present?
41
52
  orders.count
@@ -43,7 +54,7 @@ Decidim.register_component(:budgets) do |component|
43
54
 
44
55
  component.register_stat :comments_count, tag: :comments do |components, start_at, end_at|
45
56
  projects = Decidim::Budgets::FilteredProjects.for(components, start_at, end_at)
46
- Decidim::Comments::Comment.where(root_commentable: projects).count
57
+ projects.sum(:comments_count)
47
58
  end
48
59
 
49
60
  component.register_stat :followers_count, tag: :followers, priority: Decidim::StatsRegistry::LOW_PRIORITY do |components, start_at, end_at|
@@ -52,70 +63,104 @@ Decidim.register_component(:budgets) do |component|
52
63
  end
53
64
 
54
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) }
55
69
  settings.attribute :projects_per_page, type: :integer, default: 12
56
- settings.attribute :total_budget, type: :integer, default: 100_000_000
57
70
  settings.attribute :vote_rule_threshold_percent_enabled, type: :boolean, default: true
58
71
  settings.attribute :vote_threshold_percent, type: :integer, default: 70
59
72
  settings.attribute :vote_rule_minimum_budget_projects_enabled, type: :boolean, default: false
60
73
  settings.attribute :vote_minimum_budget_projects_number, type: :integer, default: 1
61
74
  settings.attribute :comments_enabled, type: :boolean, default: true
75
+ settings.attribute :comments_max_length, type: :integer, required: false
62
76
  settings.attribute :resources_permissions_enabled, type: :boolean, default: true
63
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
64
81
  end
65
82
 
66
83
  component.settings(:step) do |settings|
67
84
  settings.attribute :comments_blocked, type: :boolean, default: false
68
- settings.attribute :votes_enabled, type: :boolean, default: true
85
+ settings.attribute :votes, type: :enum, default: "enabled", choices: %w(disabled enabled finished)
69
86
  settings.attribute :show_votes, type: :boolean, default: false
70
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
71
92
  end
72
93
 
73
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
+
74
101
  component = Decidim::Component.create!(
75
102
  name: Decidim::Components::Namer.new(participatory_space.organization.available_locales, :budgets).i18n_name,
76
103
  manifest_name: :budgets,
77
104
  published_at: Time.current,
78
- 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
+ }
79
111
  )
80
112
 
81
- 2.times do
82
- project = Decidim::Budgets::Project.create!(
113
+ rand(1...3).times do
114
+ Decidim::Budgets::Budget.create!(
83
115
  component: component,
84
- scope: participatory_space.organization.scopes.sample,
85
- category: participatory_space.categories.sample,
86
116
  title: Decidim::Faker::Localized.sentence(2),
87
117
  description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
88
118
  Decidim::Faker::Localized.paragraph(3)
89
119
  end,
90
- budget: Faker::Number.number(8)
91
- )
92
-
93
- attachment_collection = Decidim::AttachmentCollection.create!(
94
- name: Decidim::Faker::Localized.word,
95
- description: Decidim::Faker::Localized.sentence(5),
96
- collection_for: project
120
+ total_budget: Faker::Number.number(8)
97
121
  )
122
+ end
98
123
 
99
- Decidim::Attachment.create!(
100
- title: Decidim::Faker::Localized.sentence(2),
101
- description: Decidim::Faker::Localized.sentence(5),
102
- file: File.new(File.join(__dir__, "seeds", "Exampledocument.pdf")),
103
- attachment_collection: attachment_collection,
104
- attached_to: project
105
- )
106
- Decidim::Attachment.create!(
107
- title: Decidim::Faker::Localized.sentence(2),
108
- description: Decidim::Faker::Localized.sentence(5),
109
- file: File.new(File.join(__dir__, "seeds", "city.jpeg")),
110
- attached_to: project
111
- )
112
- Decidim::Attachment.create!(
113
- title: Decidim::Faker::Localized.sentence(2),
114
- description: Decidim::Faker::Localized.sentence(5),
115
- file: File.new(File.join(__dir__, "seeds", "Exampledocument.pdf")),
116
- attached_to: project
117
- )
118
- 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
119
164
  end
120
165
  end
121
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,14 +7,13 @@ 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 }
18
17
  vote_rule_threshold_percent_enabled { true }
19
18
  vote_rule_minimum_budget_projects_enabled { false }
20
19
  vote_threshold_percent { 70 }
@@ -22,7 +21,6 @@ FactoryBot.define do
22
21
 
23
22
  settings do
24
23
  {
25
- total_budget: total_budget,
26
24
  vote_rule_threshold_percent_enabled: vote_rule_threshold_percent_enabled,
27
25
  vote_rule_minimum_budget_projects_enabled: vote_rule_minimum_budget_projects_enabled,
28
26
  vote_threshold_percent: vote_threshold_percent
@@ -30,9 +28,8 @@ FactoryBot.define do
30
28
  end
31
29
  end
32
30
 
33
- trait :with_total_budget_and_minimum_budget_projects do
31
+ trait :with_minimum_budget_projects do
34
32
  transient do
35
- total_budget { 100_000_000 }
36
33
  vote_rule_threshold_percent_enabled { false }
37
34
  vote_rule_minimum_budget_projects_enabled { true }
38
35
  vote_minimum_budget_projects_number { 3 }
@@ -40,7 +37,6 @@ FactoryBot.define do
40
37
 
41
38
  settings do
42
39
  {
43
- total_budget: total_budget,
44
40
  vote_rule_threshold_percent_enabled: vote_rule_threshold_percent_enabled,
45
41
  vote_rule_minimum_budget_projects_enabled: vote_rule_minimum_budget_projects_enabled,
46
42
  vote_minimum_budget_projects_number: vote_minimum_budget_projects_number
@@ -52,7 +48,7 @@ FactoryBot.define do
52
48
  step_settings do
53
49
  {
54
50
  participatory_space.active_step.id => {
55
- votes_enabled: false
51
+ votes: :disabled
56
52
  }
57
53
  }
58
54
  end
@@ -72,7 +68,7 @@ FactoryBot.define do
72
68
  step_settings do
73
69
  {
74
70
  participatory_space.active_step.id => {
75
- votes_enabled: false,
71
+ votes: :finished,
76
72
  show_votes: true
77
73
  }
78
74
  }
@@ -80,20 +76,53 @@ FactoryBot.define do
80
76
  end
81
77
  end
82
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
94
+ end
95
+
83
96
  factory :project, class: "Decidim::Budgets::Project" do
84
97
  title { generate_localized_title }
85
98
  description { Decidim::Faker::Localized.wrapped("<p>", "</p>") { generate_localized_title } }
86
- budget { Faker::Number.number(8) }
87
- 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
88
105
  end
89
106
 
90
107
  factory :order, class: "Decidim::Budgets::Order" do
91
- component { create(:budget_component) }
108
+ budget { create(:budget) }
92
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
93
122
  end
94
123
 
95
124
  factory :line_item, class: "Decidim::Budgets::LineItem" do
96
125
  order
97
- project { create(:project, component: order.component) }
126
+ project { create(:project, budget: order.budget) }
98
127
  end
99
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.22.0"
7
+ "0.23.0"
8
8
  end
9
9
  end
10
10
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "decidim/budgets/workflows/base"
4
+ require "decidim/budgets/workflows/one"
5
+ require "decidim/budgets/workflows/all"
6
+
7
+ module Decidim
8
+ module Budgets
9
+ # Public: Stores the array of available workflows
10
+ def self.workflows
11
+ @workflows ||= {
12
+ one: Workflows::One,
13
+ all: Workflows::All
14
+ }
15
+ end
16
+ end
17
+ end