decidim-budgets 0.22.0 → 0.23.0

Sign up to get free protection for your applications and to get access to all the features.
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,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Budgets
5
+ module Admin
6
+ # This command is executed when the user destroys a Budget
7
+ # from the admin panel.
8
+ class DestroyBudget < Rectify::Command
9
+ def initialize(budget, current_user)
10
+ @budget = budget
11
+ @current_user = current_user
12
+ end
13
+
14
+ # Destroys the budget if valid.
15
+ #
16
+ # Broadcasts :ok if successful, :invalid otherwise.
17
+ def call
18
+ return broadcast(:invalid) if budget.projects.present?
19
+
20
+ destroy_budget!
21
+
22
+ broadcast(:ok, budget)
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :budget, :current_user
28
+
29
+ def destroy_budget!
30
+ Decidim.traceability.perform_action!(
31
+ :delete,
32
+ budget,
33
+ current_user,
34
+ visibility: "all"
35
+ ) do
36
+ budget.destroy!
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -4,7 +4,7 @@ module Decidim
4
4
  module Budgets
5
5
  module Admin
6
6
  # A command with all the business logic when an admin imports proposals from
7
- # one component to budget component.
7
+ # one component to projects of a budget.
8
8
  class ImportProposalsToBudgets < Rectify::Command
9
9
  # Public: Initializes the command.
10
10
  #
@@ -32,45 +32,46 @@ module Decidim
32
32
  def create_projects_from_accepted_proposals
33
33
  transaction do
34
34
  proposals.map do |original_proposal|
35
- next if proposal_already_copied?(original_proposal, target_component)
35
+ next if proposal_already_copied?(original_proposal)
36
36
 
37
- project = Decidim::Budgets::Project.new
38
- project.title = project_localized(original_proposal.title)
39
- project.description = project_localized(original_proposal.body)
40
- project.budget = form.default_budget
41
- project.category = original_proposal.category
42
- project.scope = original_proposal.scope
43
- project.component = target_component
44
- project.save!
37
+ new_project = create_project_from_proposal!(original_proposal)
45
38
 
46
- project.link_resources([original_proposal], "included_proposals")
39
+ new_project.link_resources([original_proposal], "included_proposals")
47
40
  end.compact
48
41
  end
49
42
  end
50
43
 
44
+ def create_project_from_proposal!(original_proposal)
45
+ params = {
46
+ budget: form.budget,
47
+ title: original_proposal.title,
48
+ description: original_proposal.body,
49
+ budget_amount: form.default_budget,
50
+ category: original_proposal.category,
51
+ scope: original_proposal.scope
52
+ }
53
+
54
+ @project = Decidim.traceability.create!(
55
+ Project,
56
+ form.current_user,
57
+ params,
58
+ visibility: "all"
59
+ )
60
+ end
61
+
51
62
  def proposals
52
63
  Decidim::Proposals::Proposal.where(component: origin_component).where(state: "accepted")
53
64
  end
54
65
 
55
66
  def origin_component
56
- @form.origin_component
67
+ form.origin_component
57
68
  end
58
69
 
59
- def target_component
60
- @form.current_component
61
- end
62
-
63
- def proposal_already_copied?(original_proposal, target_component)
64
- original_proposal.linked_resources(:projects, "included_proposals").any? do |proposal|
65
- proposal.component == target_component
70
+ def proposal_already_copied?(original_proposal)
71
+ original_proposal.linked_resources(:projects, "included_proposals").any? do |project|
72
+ project.budget == form.budget
66
73
  end
67
74
  end
68
-
69
- def project_localized(text)
70
- Decidim.available_locales.inject({}) do |result, locale|
71
- result.update(locale => text)
72
- end.with_indifferent_access
73
- end
74
75
  end
75
76
  end
76
77
  end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Budgets
5
+ module Admin
6
+ # This command is executed when the user updates a Budget
7
+ # from the admin panel.
8
+ class UpdateBudget < Rectify::Command
9
+ def initialize(form, budget)
10
+ @form = form
11
+ @budget = budget
12
+ end
13
+
14
+ # Updates the budget if valid.
15
+ #
16
+ # Broadcasts :ok if successful, :invalid otherwise.
17
+ def call
18
+ return broadcast(:invalid) if form.invalid?
19
+
20
+ update_budget!
21
+
22
+ broadcast(:ok, budget)
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :form, :budget
28
+
29
+ def update_budget!
30
+ attributes = {
31
+ scope: form.scope,
32
+ title: form.title,
33
+ weight: form.weight,
34
+ description: form.description,
35
+ total_budget: form.total_budget
36
+ }
37
+
38
+ Decidim.traceability.update!(
39
+ budget,
40
+ form.current_user,
41
+ attributes,
42
+ visibility: "all"
43
+ )
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -52,7 +52,8 @@ module Decidim
52
52
  category: form.category,
53
53
  title: form.title,
54
54
  description: form.description,
55
- budget: form.budget
55
+ budget_amount: form.budget_amount,
56
+ selected_at: selected_at
56
57
  )
57
58
  end
58
59
 
@@ -63,6 +64,12 @@ module Decidim
63
64
  def link_proposals
64
65
  project.link_resources(proposals, "included_proposals")
65
66
  end
67
+
68
+ def selected_at
69
+ return unless form.selected
70
+
71
+ Time.current
72
+ end
66
73
  end
67
74
  end
68
75
  end
@@ -7,10 +7,8 @@ module Decidim
7
7
  # Public: Initializes the command.
8
8
  #
9
9
  # order - The current order for the user.
10
- # component - The current component.
11
- def initialize(order, component)
10
+ def initialize(order)
12
11
  @order = order
13
- @component = component
14
12
  end
15
13
 
16
14
  # Executes the command. Broadcasts these events:
@@ -20,15 +18,17 @@ module Decidim
20
18
  #
21
19
  # Returns nothing.
22
20
  def call
23
- return broadcast(:invalid, @order) unless checkout!
21
+ return broadcast(:invalid, order) unless checkout!
24
22
 
25
- broadcast(:ok, @order)
23
+ broadcast(:ok, order)
26
24
  end
27
25
 
28
26
  private
29
27
 
28
+ attr_reader :order
29
+
30
30
  def checkout!
31
- return unless @order && @order.valid?
31
+ return unless order && order.valid?
32
32
 
33
33
  @order.with_lock do
34
34
  SendOrderSummaryJob.perform_later(@order)
@@ -28,9 +28,10 @@ module Decidim
28
28
 
29
29
  private
30
30
 
31
+ attr_reader :project
32
+
31
33
  def remove_line_item
32
- @order.projects.destroy(@project)
33
- @order.save!
34
+ @order.projects.destroy(project)
34
35
  end
35
36
  end
36
37
  end
@@ -9,13 +9,13 @@ module Decidim
9
9
  extend ActiveSupport::Concern
10
10
 
11
11
  included do
12
- helper_method :current_order
12
+ helper_method :current_order, :can_have_order?, :voted_for?
13
13
 
14
14
  # The current order created by the user.
15
15
  #
16
16
  # Returns an Order.
17
17
  def current_order
18
- @current_order ||= Order.includes(:projects).find_or_initialize_by(user: current_user, component: current_component)
18
+ @current_order ||= Order.includes(:projects).find_or_initialize_by(user: current_user, budget: budget)
19
19
  end
20
20
 
21
21
  def current_order=(order)
@@ -25,6 +25,18 @@ module Decidim
25
25
  def persisted_current_order
26
26
  current_order if current_order&.persisted?
27
27
  end
28
+
29
+ def can_have_order?
30
+ current_user.present? &&
31
+ voting_open? &&
32
+ current_participatory_space.can_participate?(current_user) &&
33
+ allowed_to?(:create, :order, budget: budget, workflow: current_workflow)
34
+ end
35
+
36
+ # Return true if the user has voted the project
37
+ def voted_for?(project)
38
+ current_order && current_order.projects.include?(project)
39
+ end
28
40
  end
29
41
  end
30
42
  end
@@ -17,7 +17,7 @@ module Decidim
17
17
  def available_orders
18
18
  @available_orders ||= begin
19
19
  available_orders = []
20
- available_orders << "random" if voting_is_open? || !votes_are_visible?
20
+ available_orders << "random" if voting_open? || !votes_are_visible?
21
21
  available_orders << "most_voted" if votes_are_visible?
22
22
  available_orders += %w(highest_cost lowest_cost)
23
23
  available_orders
@@ -28,10 +28,6 @@ module Decidim
28
28
  available_orders.first
29
29
  end
30
30
 
31
- def voting_is_open?
32
- current_settings.votes_enabled?
33
- end
34
-
35
31
  def votes_are_visible?
36
32
  current_settings.show_votes?
37
33
  end
@@ -39,9 +35,9 @@ module Decidim
39
35
  def reorder(projects)
40
36
  case order
41
37
  when "highest_cost"
42
- projects.order(budget: :desc)
38
+ projects.order(budget_amount: :desc)
43
39
  when "lowest_cost"
44
- projects.order(budget: :asc)
40
+ projects.order(budget_amount: :asc)
45
41
  when "most_voted"
46
42
  if votes_are_visible?
47
43
  ids = projects.sort_by(&:confirmed_orders_count).map(&:id).reverse
@@ -9,13 +9,21 @@ module Decidim
9
9
  # Note that it inherits from `Decidim::Components::BaseController`, which
10
10
  # override its layout and provide all kinds of useful methods.
11
11
  class ApplicationController < Decidim::Admin::Components::BaseController
12
- helper_method :projects, :project
12
+ helper_method :budget, :projects, :project
13
+
14
+ def budget
15
+ @budget ||= Budget.where(component: current_component).includes(:projects).find_by(id: params[:budget_id])
16
+ end
13
17
 
14
18
  def projects
15
- @projects ||= Project.where(component: current_component)
19
+ return unless budget
20
+
21
+ @projects ||= budget.projects
16
22
  end
17
23
 
18
24
  def project
25
+ return unless projects
26
+
19
27
  @project ||= projects.find(params[:id])
20
28
  end
21
29
  end
@@ -17,7 +17,7 @@ module Decidim
17
17
  end
18
18
 
19
19
  def project
20
- @project ||= projects.find(params[:project_id])
20
+ @project ||= Decidim::Budgets::Project.find(params[:project_id])
21
21
  end
22
22
  end
23
23
  end
@@ -10,7 +10,7 @@ module Decidim
10
10
  include Decidim::Admin::Concerns::HasAttachments
11
11
 
12
12
  def after_destroy_path
13
- projects_path
13
+ budget_projects_path(project.budget)
14
14
  end
15
15
 
16
16
  def attached_to
@@ -18,7 +18,7 @@ module Decidim
18
18
  end
19
19
 
20
20
  def project
21
- @project ||= projects.find(params[:project_id])
21
+ @project ||= Decidim::Budgets::Project.find(params[:project_id])
22
22
  end
23
23
  end
24
24
  end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Budgets
5
+ module Admin
6
+ # This controller allows the create or update a budget.
7
+ class BudgetsController < Admin::ApplicationController
8
+ helper_method :budgets, :budget
9
+
10
+ def new
11
+ enforce_permission_to :create, :budget
12
+ @form = form(BudgetForm).instance
13
+ end
14
+
15
+ def create
16
+ enforce_permission_to :create, :budget
17
+ @form = form(BudgetForm).from_params(params, current_component: current_component)
18
+
19
+ CreateBudget.call(@form) do
20
+ on(:ok) do
21
+ flash[:notice] = I18n.t("budgets.create.success", scope: "decidim.budgets.admin")
22
+ redirect_to budgets_path
23
+ end
24
+
25
+ on(:invalid) do
26
+ flash.now[:alert] = I18n.t("budgets.create.invalid", scope: "decidim.budgets.admin")
27
+ render action: "new"
28
+ end
29
+ end
30
+ end
31
+
32
+ def edit
33
+ enforce_permission_to :update, :budget, budget: budget
34
+ @form = form(BudgetForm).from_model(budget)
35
+ end
36
+
37
+ def update
38
+ enforce_permission_to :update, :budget, budget: budget
39
+ @form = form(BudgetForm).from_params(params, current_component: current_component)
40
+
41
+ UpdateBudget.call(@form, budget) do
42
+ on(:ok) do
43
+ flash[:notice] = I18n.t("budgets.update.success", scope: "decidim.budgets.admin")
44
+ redirect_to budgets_path
45
+ end
46
+
47
+ on(:invalid) do
48
+ flash.now[:alert] = I18n.t("budgets.update.invalid", scope: "decidim.budgets.admin")
49
+ render action: "edit"
50
+ end
51
+ end
52
+ end
53
+
54
+ def destroy
55
+ enforce_permission_to :delete, :budget, budget: budget
56
+
57
+ DestroyBudget.call(budget, current_user) do
58
+ on(:ok) do
59
+ flash[:notice] = I18n.t("budgets.destroy.success", scope: "decidim.budgets.admin")
60
+ end
61
+
62
+ on(:invalid) do
63
+ flash.now[:alert] = I18n.t("budgets.destroy.invalid", scope: "decidim.budgets.admin")
64
+ end
65
+ end
66
+
67
+ redirect_to budgets_path
68
+ end
69
+
70
+ private
71
+
72
+ def budgets
73
+ @budgets ||= Budget.where(component: current_component).order(weight: :asc)
74
+ end
75
+
76
+ def budget
77
+ @budget ||= budgets.find_by(id: params[:id])
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -20,12 +20,12 @@ module Decidim
20
20
  def create
21
21
  enforce_permission_to :create, :project
22
22
 
23
- @form = form(ProjectForm).from_params(params)
23
+ @form = form(ProjectForm).from_params(params, budget: budget)
24
24
 
25
25
  CreateProject.call(@form) do
26
26
  on(:ok) do
27
27
  flash[:notice] = I18n.t("projects.create.success", scope: "decidim.budgets.admin")
28
- redirect_to projects_path
28
+ redirect_to budget_projects_path(budget)
29
29
  end
30
30
 
31
31
  on(:invalid) do
@@ -43,12 +43,12 @@ module Decidim
43
43
 
44
44
  def update
45
45
  enforce_permission_to :update, :project, project: project
46
- @form = form(ProjectForm).from_params(params)
46
+ @form = form(ProjectForm).from_params(params, budget: budget)
47
47
 
48
48
  UpdateProject.call(@form, project) do
49
49
  on(:ok) do
50
50
  flash[:notice] = I18n.t("projects.update.success", scope: "decidim.budgets.admin")
51
- redirect_to projects_path
51
+ redirect_to budget_projects_path(budget)
52
52
  end
53
53
 
54
54
  on(:invalid) do
@@ -64,7 +64,7 @@ module Decidim
64
64
  DestroyProject.call(project, current_user) do
65
65
  on(:ok) do
66
66
  flash[:notice] = I18n.t("projects.destroy.success", scope: "decidim.budgets.admin")
67
- redirect_to projects_path
67
+ redirect_to budget_projects_path(budget)
68
68
  end
69
69
  end
70
70
  end
@@ -72,11 +72,11 @@ module Decidim
72
72
  private
73
73
 
74
74
  def projects
75
- @projects ||= Project.where(component: current_component).page(params[:page]).per(15)
75
+ @projects ||= budget.projects.page(params[:page]).per(15)
76
76
  end
77
77
 
78
78
  def orders
79
- @orders ||= Order.where(component: current_component)
79
+ @orders ||= Order.where(budget: budget)
80
80
  end
81
81
 
82
82
  def pending_orders