decidim-time_tracker 0.3

Sign up to get free protection for your applications and to get access to all the features.
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