decidim-time_tracker 0.3

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 (134) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE-AGPLv3.txt +661 -0
  3. data/README.md +174 -0
  4. data/Rakefile +40 -0
  5. data/app/assets/config/admin/decidim_time_tracker_manifest.css +2 -0
  6. data/app/assets/config/admin/decidim_time_tracker_manifest.js +1 -0
  7. data/app/assets/config/decidim_time_tracker_manifest.css +3 -0
  8. data/app/assets/config/decidim_time_tracker_manifest.js +1 -0
  9. data/app/assets/images/decidim/time_tracker/icon.svg +1 -0
  10. data/app/assets/javascripts/decidim/time_tracker/activity_ui.js.es6 +112 -0
  11. data/app/assets/javascripts/decidim/time_tracker/admin/assignations.js.es6 +35 -0
  12. data/app/assets/javascripts/decidim/time_tracker/reports/reports.js.es6 +19 -0
  13. data/app/assets/javascripts/decidim/time_tracker/time_tracker.js.es6 +82 -0
  14. data/app/assets/javascripts/decidim/time_tracker/timer_api.js.es6 +55 -0
  15. data/app/assets/stylesheets/decidim/time_tracker/_variables.scss +1 -0
  16. data/app/assets/stylesheets/decidim/time_tracker/admin/time_tracker.scss +59 -0
  17. data/app/assets/stylesheets/decidim/time_tracker/time_tracker.scss +118 -0
  18. data/app/cells/decidim/time_tracker/milestone/show.erb +42 -0
  19. data/app/cells/decidim/time_tracker/milestone_cell.rb +54 -0
  20. data/app/commands/decidim/time_tracker/admin/create_activity.rb +39 -0
  21. data/app/commands/decidim/time_tracker/admin/create_assignation.rb +75 -0
  22. data/app/commands/decidim/time_tracker/admin/create_task.rb +33 -0
  23. data/app/commands/decidim/time_tracker/admin/create_time_tracker.rb +76 -0
  24. data/app/commands/decidim/time_tracker/admin/destroy_activity.rb +43 -0
  25. data/app/commands/decidim/time_tracker/admin/destroy_assignation.rb +43 -0
  26. data/app/commands/decidim/time_tracker/admin/destroy_task.rb +43 -0
  27. data/app/commands/decidim/time_tracker/admin/export_time_tracker.rb +150 -0
  28. data/app/commands/decidim/time_tracker/admin/update_activity.rb +49 -0
  29. data/app/commands/decidim/time_tracker/admin/update_assignation.rb +42 -0
  30. data/app/commands/decidim/time_tracker/admin/update_task.rb +44 -0
  31. data/app/commands/decidim/time_tracker/create_milestone.rb +57 -0
  32. data/app/commands/decidim/time_tracker/create_request_assignation.rb +39 -0
  33. data/app/commands/decidim/time_tracker/start_time_event.rb +104 -0
  34. data/app/commands/decidim/time_tracker/stop_last_time_event.rb +45 -0
  35. data/app/controllers/concerns/decidim/time_tracker/admin/filterable_assignations.rb +50 -0
  36. data/app/controllers/decidim/time_tracker/activity_questionnaire_controller.rb +76 -0
  37. data/app/controllers/decidim/time_tracker/admin/activities_controller.rb +82 -0
  38. data/app/controllers/decidim/time_tracker/admin/activity_questionnaire_controller.rb +52 -0
  39. data/app/controllers/decidim/time_tracker/admin/application_controller.rb +22 -0
  40. data/app/controllers/decidim/time_tracker/admin/assignations_controller.rb +84 -0
  41. data/app/controllers/decidim/time_tracker/admin/assignee_questionnaire_controller.rb +58 -0
  42. data/app/controllers/decidim/time_tracker/admin/stats_controller.rb +24 -0
  43. data/app/controllers/decidim/time_tracker/admin/tasks_controller.rb +112 -0
  44. data/app/controllers/decidim/time_tracker/admin/time_tracker_exports_controller.rb +25 -0
  45. data/app/controllers/decidim/time_tracker/application_controller.rb +24 -0
  46. data/app/controllers/decidim/time_tracker/assignations_controller.rb +38 -0
  47. data/app/controllers/decidim/time_tracker/assignee_questionnaire_controller.rb +80 -0
  48. data/app/controllers/decidim/time_tracker/milestones_controller.rb +62 -0
  49. data/app/controllers/decidim/time_tracker/reports/user_controller.rb +38 -0
  50. data/app/controllers/decidim/time_tracker/time_events_controller.rb +68 -0
  51. data/app/controllers/decidim/time_tracker/time_tracker_controller.rb +43 -0
  52. data/app/forms/decidim/time_tracker/admin/activity_form.rb +27 -0
  53. data/app/forms/decidim/time_tracker/admin/assignation_form.rb +29 -0
  54. data/app/forms/decidim/time_tracker/admin/task_form.rb +22 -0
  55. data/app/forms/decidim/time_tracker/milestone_form.rb +32 -0
  56. data/app/forms/decidim/time_tracker/time_event_form.rb +47 -0
  57. data/app/helpers/decidim/time_tracker/admin/application_helper.rb +33 -0
  58. data/app/helpers/decidim/time_tracker/application_helper.rb +95 -0
  59. data/app/jobs/decidim/time_tracker/stop_counter_job.rb +29 -0
  60. data/app/models/decidim/time_tracker/activity.rb +135 -0
  61. data/app/models/decidim/time_tracker/application_record.rb +10 -0
  62. data/app/models/decidim/time_tracker/assignation.rb +68 -0
  63. data/app/models/decidim/time_tracker/assignee.rb +29 -0
  64. data/app/models/decidim/time_tracker/assignee_data.rb +19 -0
  65. data/app/models/decidim/time_tracker/milestone.rb +27 -0
  66. data/app/models/decidim/time_tracker/task.rb +44 -0
  67. data/app/models/decidim/time_tracker/time_event.rb +62 -0
  68. data/app/models/decidim/time_tracker/time_tracker.rb +46 -0
  69. data/app/models/decidim/time_tracker/tos_acceptance.rb +16 -0
  70. data/app/permissions/decidim/time_tracker/admin/permissions.rb +69 -0
  71. data/app/permissions/decidim/time_tracker/permissions.rb +69 -0
  72. data/app/presenters/decidim/time_tracker/admin_log/activity_presenter.rb +44 -0
  73. data/app/presenters/decidim/time_tracker/admin_log/assignation_presenter.rb +48 -0
  74. data/app/presenters/decidim/time_tracker/admin_log/task_presenter.rb +46 -0
  75. data/app/presenters/decidim/time_tracker/admin_log/value_types/activity_presenter.rb +28 -0
  76. data/app/presenters/decidim/time_tracker/admin_log/value_types/time_tracker_presenter.rb +28 -0
  77. data/app/views/decidim/time_tracker/admin/_breadcrumbs.html.erb +56 -0
  78. data/app/views/decidim/time_tracker/admin/activities/_form.html.erb +41 -0
  79. data/app/views/decidim/time_tracker/admin/activities/_index.html.erb +73 -0
  80. data/app/views/decidim/time_tracker/admin/activities/edit.html.erb +5 -0
  81. data/app/views/decidim/time_tracker/admin/activities/new.html.erb +5 -0
  82. data/app/views/decidim/time_tracker/admin/assignations/_form.html.erb +30 -0
  83. data/app/views/decidim/time_tracker/admin/assignations/index.html.erb +67 -0
  84. data/app/views/decidim/time_tracker/admin/assignations/new.html.erb +9 -0
  85. data/app/views/decidim/time_tracker/admin/questionnaires/_index.html.erb +27 -0
  86. data/app/views/decidim/time_tracker/admin/questionnaires/_questionnaire.html.erb +21 -0
  87. data/app/views/decidim/time_tracker/admin/stats/index.html.erb +50 -0
  88. data/app/views/decidim/time_tracker/admin/tasks/_assignations.html.erb +60 -0
  89. data/app/views/decidim/time_tracker/admin/tasks/_form.html.erb +7 -0
  90. data/app/views/decidim/time_tracker/admin/tasks/_index.html.erb +61 -0
  91. data/app/views/decidim/time_tracker/admin/tasks/edit.html.erb +16 -0
  92. data/app/views/decidim/time_tracker/admin/tasks/index.html.erb +5 -0
  93. data/app/views/decidim/time_tracker/admin/tasks/new.html.erb +12 -0
  94. data/app/views/decidim/time_tracker/milestones/index.html.erb +60 -0
  95. data/app/views/decidim/time_tracker/reports/user/index.html.erb +41 -0
  96. data/app/views/decidim/time_tracker/time_tracker/_activity.html.erb +43 -0
  97. data/app/views/decidim/time_tracker/time_tracker/_answer_questionnaire.html.erb +7 -0
  98. data/app/views/decidim/time_tracker/time_tracker/_assignee_data.html.erb +9 -0
  99. data/app/views/decidim/time_tracker/time_tracker/_callout_status.html.erb +3 -0
  100. data/app/views/decidim/time_tracker/time_tracker/_idle_activity.html.erb +27 -0
  101. data/app/views/decidim/time_tracker/time_tracker/_milestone_form.html.erb +35 -0
  102. data/app/views/decidim/time_tracker/time_tracker/_request_activity.html.erb +22 -0
  103. data/app/views/decidim/time_tracker/time_tracker/_sign_in.html.erb +5 -0
  104. data/app/views/decidim/time_tracker/time_tracker/index.html.erb +59 -0
  105. data/config/activity_questionnaire.yml +26 -0
  106. data/config/assignee_questionnaire.yml +37 -0
  107. data/config/i18n-tasks.yml +10 -0
  108. data/config/locales/ca.yml +394 -0
  109. data/config/locales/cs.yml +394 -0
  110. data/config/locales/en.yml +419 -0
  111. data/config/locales/es.yml +394 -0
  112. data/db/migrate/20200302115642_create_decidim_time_tracker_time_trackers.rb +10 -0
  113. data/db/migrate/20200302115654_create_decidim_time_tracker_tasks.rb +11 -0
  114. data/db/migrate/20200302115658_create_decidim_time_tracker_assignees.rb +12 -0
  115. data/db/migrate/20200302115700_create_decidim_time_tracker_activities.rb +19 -0
  116. data/db/migrate/20200302115708_create_decidim_time_tracker_milestones.rb +13 -0
  117. data/db/migrate/20200302115831_create_decidim_time_tracker_assignations.rb +16 -0
  118. data/db/migrate/20200302115840_create_decidim_time_tracker_time_events.rb +15 -0
  119. data/db/migrate/20201118153327_create_decidim_time_tracker_assignee_data.rb +10 -0
  120. data/db/migrate/20201223115130_create_decidim_time_tracker_tos_acceptances.rb +18 -0
  121. data/lib/decidim/time_tracker.rb +45 -0
  122. data/lib/decidim/time_tracker/admin.rb +10 -0
  123. data/lib/decidim/time_tracker/admin_engine.rb +51 -0
  124. data/lib/decidim/time_tracker/component.rb +248 -0
  125. data/lib/decidim/time_tracker/engine.rb +59 -0
  126. data/lib/decidim/time_tracker/reports.rb +10 -0
  127. data/lib/decidim/time_tracker/reports_engine.rb +34 -0
  128. data/lib/decidim/time_tracker/test/admin_log_presenter_examples.rb +34 -0
  129. data/lib/decidim/time_tracker/test/factories.rb +110 -0
  130. data/lib/decidim/time_tracker/test/time_tracker_context.rb +18 -0
  131. data/lib/decidim/time_tracker/time_tracker_activity_questionnaire_answers_serializer.rb +74 -0
  132. data/lib/decidim/time_tracker/version.rb +9 -0
  133. data/vendor/assets/javascripts/jsrender.min.js +4 -0
  134. metadata +276 -0
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module TimeTracker
5
+ module Admin
6
+ # A command with all the business logic when creating a task
7
+ class CreateTask < Rectify::Command
8
+ def initialize(form)
9
+ @form = form
10
+ end
11
+
12
+ # Creates the task if valid.
13
+ #
14
+ # Broadcasts :ok if successful, :invalid otherwise.
15
+ def call
16
+ return broadcast(:invalid) if @form.invalid?
17
+
18
+ create_task
19
+ broadcast(:ok)
20
+ end
21
+
22
+ def create_task
23
+ Decidim.traceability.create!(
24
+ Decidim::TimeTracker::Task,
25
+ @form.current_user,
26
+ name: @form.name,
27
+ time_tracker: @form.time_tracker
28
+ )
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module TimeTracker
5
+ module Admin
6
+ # A command with all the business logic when creating a task
7
+ class CreateTimeTracker < Rectify::Command
8
+ def initialize(component)
9
+ @questionnaire = Decidim::Forms::Questionnaire.new
10
+ @assignee_questionnaire = Decidim::Forms::Questionnaire.new
11
+ @time_tracker = Decidim::TimeTracker::TimeTracker.new(component: component, questionnaire: @questionnaire)
12
+ end
13
+
14
+ def call
15
+ begin
16
+ @time_tracker.save!
17
+ populate_questionnaire(Decidim::TimeTracker.default_activity_questionnaire, @questionnaire)
18
+ populate_questionnaire(Decidim::TimeTracker.default_assignee_questionnaire, @assignee_questionnaire)
19
+ create_assignee_data
20
+ rescue StandardError
21
+ return broadcast(:invalid)
22
+ end
23
+
24
+ broadcast(:ok)
25
+ end
26
+
27
+ attr_reader :time_tracker, :questionnaire, :assignee_questionnaire
28
+
29
+ private
30
+
31
+ def populate_questionnaire(seeds, questionnaire)
32
+ return unless seeds
33
+ return unless seeds[:questions]
34
+
35
+ questions = seeds[:questions].map do |question|
36
+ Decidim::Forms::Question.create(prepare_question(question, questionnaire))
37
+ end
38
+
39
+ seeds[:title] = i18nize(seeds[:title])
40
+ seeds[:description] = i18nize(seeds[:description])
41
+ seeds[:tos] = i18nize(seeds[:tos])
42
+ seeds[:questions] = questions
43
+
44
+ questionnaire.attributes = seeds
45
+ end
46
+
47
+ def prepare_question(question, questionnaire)
48
+ if question.has_key?(:answer_options)
49
+ question[:answer_options].map! do |answer_option|
50
+ answer_option[:body] = i18nize(answer_option[:body])
51
+ Decidim::Forms::AnswerOption.new(answer_option)
52
+ end
53
+ end
54
+
55
+ question.merge(
56
+ body: i18nize(question[:body]),
57
+ description: i18nize(question[:description]),
58
+ questionnaire: questionnaire
59
+ )
60
+ end
61
+
62
+ def create_assignee_data
63
+ Decidim::TimeTracker::AssigneeData.create!(time_tracker: @time_tracker, questionnaire: @assignee_questionnaire)
64
+ end
65
+
66
+ def i18nize(key)
67
+ return key unless key.is_a? String
68
+
69
+ I18n.available_locales.each_with_object({}) do |locale, acc|
70
+ acc[locale] = I18n.with_locale(locale) { I18n.t(key, default: key) }
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module TimeTracker
5
+ module Admin
6
+ # A command with all the business logic when updating an activity
7
+ class DestroyActivity < Rectify::Command
8
+ # Public: Initializes the command.
9
+ #
10
+ # form - A form object with the params.
11
+ def initialize(activity, user)
12
+ @activity = activity
13
+ @user = user
14
+ end
15
+
16
+ # Executes the command. Broadcasts these events:
17
+ #
18
+ # - :ok when everything is valid.
19
+ # - :invalid if the form wasn't valid and we couldn't proceed.
20
+ #
21
+ # Returns nothing.
22
+ def call
23
+ destroy_activity!
24
+ broadcast(:ok)
25
+ end
26
+
27
+ private
28
+
29
+ attr_reader :form
30
+
31
+ def destroy_activity!
32
+ Decidim.traceability.perform_action!(
33
+ :delete,
34
+ @activity,
35
+ @user
36
+ ) do
37
+ @activity.destroy!
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module TimeTracker
5
+ module Admin
6
+ # A command with all the business logic when updating an activity
7
+ class DestroyAssignation < Rectify::Command
8
+ # Public: Initializes the command.
9
+ #
10
+ # form - A form object with the params.
11
+ def initialize(assignation, user)
12
+ @assignation = assignation
13
+ @user = user
14
+ end
15
+
16
+ # Executes the command. Broadcasts these events:
17
+ #
18
+ # - :ok when everything is valid.
19
+ # - :invalid if the form wasn't valid and we couldn't proceed.
20
+ #
21
+ # Returns nothing.
22
+ def call
23
+ destroy_assignation!
24
+ broadcast(:ok)
25
+ end
26
+
27
+ private
28
+
29
+ attr_reader :form
30
+
31
+ def destroy_assignation!
32
+ Decidim.traceability.perform_action!(
33
+ :delete,
34
+ @assignation,
35
+ @user
36
+ ) do
37
+ @assignation.destroy!
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module TimeTracker
5
+ module Admin
6
+ # A command with all the business logic when updating an task
7
+ class DestroyTask < Rectify::Command
8
+ # Public: Initializes the command.
9
+ #
10
+ # form - A form object with the params.
11
+ def initialize(task, user)
12
+ @task = task
13
+ @user = user
14
+ end
15
+
16
+ # Executes the command. Broadcasts these events:
17
+ #
18
+ # - :ok when everything is valid.
19
+ # - :invalid if the form wasn't valid and we couldn't proceed.
20
+ #
21
+ # Returns nothing.
22
+ def call
23
+ destroy_task!
24
+ broadcast(:ok)
25
+ end
26
+
27
+ private
28
+
29
+ attr_reader :form
30
+
31
+ def destroy_task!
32
+ Decidim.traceability.perform_action!(
33
+ :delete,
34
+ @task,
35
+ @user
36
+ ) do
37
+ @task.destroy!
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,150 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module TimeTracker
5
+ module Admin
6
+ # A command with all the business logic when an admin exports time tracker to
7
+ # create an accountability component.
8
+ class ExportTimeTracker < Rectify::Command
9
+ # Public: Initializes the command.
10
+ def initialize(current_component, current_user)
11
+ @component = current_component
12
+ @user = current_user
13
+ end
14
+
15
+ # Executes the command. Broadcasts these events:
16
+ #
17
+ # - :ok when everything is valid.
18
+ # - :invalid when we couldn't proceed.
19
+ #
20
+ # Returns the accountability component.
21
+ def call
22
+ create_component
23
+ export_time_tracker
24
+ broadcast(:ok, @accountability_component)
25
+ end
26
+
27
+ private
28
+
29
+ attr_reader :component
30
+
31
+ def create_component
32
+ params = {
33
+ name: {
34
+ en: "Time Tracker Accountability"
35
+ },
36
+ manifest_name: :accountability,
37
+ published_at: Time.current,
38
+ participatory_space: @component.participatory_space,
39
+ settings: {
40
+ categories_label: {
41
+ en: "Project"
42
+ },
43
+ subcategories_label: {
44
+ en: "Activity"
45
+ }
46
+ }
47
+ }
48
+
49
+ @accountability_component = Decidim.traceability.perform_action!("publish", Decidim::Component, @user, visibility: "all") do
50
+ Decidim::Component.create!(params)
51
+ end
52
+
53
+ Decidim::Accountability::Status.create!(
54
+ component: @accountability_component,
55
+ name: { en: "Not started" },
56
+ key: "not_started"
57
+ ) do |status|
58
+ @not_started = status
59
+ end
60
+
61
+ Decidim::Accountability::Status.create!(
62
+ component: @accountability_component,
63
+ name: { en: "Work in progress" },
64
+ key: "work_in_progress"
65
+ ) do |status|
66
+ @work_in_progress = status
67
+ end
68
+
69
+ Decidim::Accountability::Status.create!(
70
+ component: @accountability_component,
71
+ name: { en: "Completed" },
72
+ key: "completed"
73
+ ) do |status|
74
+ @completed = status
75
+ end
76
+ end
77
+
78
+ def export_time_tracker
79
+ tasks.each do |task|
80
+ params_category = {
81
+ name: task.name,
82
+ weight: 0,
83
+ description: task.name,
84
+ participatory_space: current_participatory_space
85
+ }
86
+
87
+ category = Decidim.traceability.create!(
88
+ Decidim::Category,
89
+ @user,
90
+ params_category
91
+ )
92
+
93
+ status = @not_started
94
+ status = @work_in_progress unless task.activities.joins(:time_events).empty?
95
+ status = @completed if task.activities.where("decidim_time_tracker_activities.end_date > ?", Time.zone.today).empty?
96
+
97
+ params_task = {
98
+ component: @accountability_component,
99
+ title: task.name,
100
+ category: category,
101
+ status: @not_started
102
+ }
103
+
104
+ result = Decidim.traceability.create!(
105
+ Decidim::Accountability::Result,
106
+ @user,
107
+ params_task,
108
+ visibility: "all"
109
+ )
110
+
111
+ task_activities(task).each do |activity|
112
+ status = @not_started
113
+ status = @work_in_progress unless activity.time_events.nil?
114
+ status = @completed if activity.end_date < Time.zone.today
115
+
116
+ params_activity = {
117
+ component: @accountability_component,
118
+ parent_id: result.id,
119
+ title: activity.description,
120
+ start_date: activity.start_date,
121
+ end_date: activity.end_date,
122
+ category: category,
123
+ status: status
124
+ }
125
+
126
+ Decidim.traceability.create!(
127
+ Decidim::Accountability::Result,
128
+ @user,
129
+ params_activity,
130
+ visibility: "all"
131
+ )
132
+ end
133
+ end
134
+ end
135
+
136
+ def tasks
137
+ Decidim::TimeTracker::Task.where(component: @component)
138
+ end
139
+
140
+ def task_activities(task)
141
+ Decidim::TimeTracker::Activity.where(task: task)
142
+ end
143
+
144
+ def activities_assignations(activity)
145
+ Decidim::TimeTracker::Assignation.where(activity: activity)
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module TimeTracker
5
+ module Admin
6
+ # A command with all the business logic when updating an activity
7
+ class UpdateActivity < Rectify::Command
8
+ # Public: Initializes the command.
9
+ #
10
+ # form - A form object with the params.
11
+ def initialize(activity, form, user)
12
+ @activity = activity
13
+ @form = form
14
+ @user = user
15
+ end
16
+
17
+ # Executes the command. Broadcasts these events:
18
+ #
19
+ # - :ok when everything is valid.
20
+ # - :invalid if the form wasn't valid and we couldn't proceed.
21
+ #
22
+ # Returns nothing.
23
+ def call
24
+ return broadcast(:invalid) if form.invalid?
25
+
26
+ update_activity!
27
+ broadcast(:ok)
28
+ end
29
+
30
+ private
31
+
32
+ attr_reader :form
33
+
34
+ def update_activity!
35
+ Decidim.traceability.update!(
36
+ @activity,
37
+ @user,
38
+ description: @form.description,
39
+ active: @form.active,
40
+ start_date: @form.start_date,
41
+ end_date: @form.end_date,
42
+ max_minutes_per_day: @form.max_minutes_per_day,
43
+ requests_start_at: @form.requests_start_at
44
+ )
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module TimeTracker
5
+ module Admin
6
+ # A command with all the business logic when updating an assignation
7
+ class UpdateAssignation < Rectify::Command
8
+ # Public: Initializes the command.
9
+ #
10
+ # assignation_status - A symbol representing the assignation status.
11
+ def initialize(assignation, user, assignation_status)
12
+ @assignation = assignation
13
+ @user = user
14
+ @assignation_status = assignation_status
15
+ end
16
+
17
+ # Executes the command. Broadcasts these events:
18
+ #
19
+ # - :ok when everything is valid.
20
+ # - :invalid if the form wasn't valid and we couldn't proceed.
21
+ #
22
+ # Returns nothing.
23
+ def call
24
+ return broadcast(:invalid) unless [:accepted, :rejected].include? @assignation_status
25
+
26
+ update_assignation!
27
+ broadcast(:ok)
28
+ end
29
+
30
+ private
31
+
32
+ def update_assignation!
33
+ Decidim.traceability.update!(
34
+ @assignation,
35
+ @user,
36
+ status: @assignation_status
37
+ )
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end