effective_cpd 0.0.1 → 0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +89 -10
  3. data/app/controllers/admin/cpd_audit_level_questions_controller.rb +13 -0
  4. data/app/controllers/admin/cpd_audit_levels_controller.rb +13 -0
  5. data/app/controllers/admin/cpd_audit_reviews_controller.rb +13 -0
  6. data/app/controllers/admin/cpd_audits_controller.rb +41 -0
  7. data/app/controllers/effective/cpd_audit_reviews_controller.rb +60 -0
  8. data/app/controllers/effective/cpd_audits_controller.rb +55 -0
  9. data/app/controllers/effective/cpd_cycles_controller.rb +1 -0
  10. data/app/controllers/effective/cpd_statements_controller.rb +1 -3
  11. data/app/datatables/admin/effective_cpd_audit_level_questions_datatable.rb +30 -0
  12. data/app/datatables/admin/effective_cpd_audit_levels_datatable.rb +34 -0
  13. data/app/datatables/admin/effective_cpd_audit_reviews_datatable.rb +29 -0
  14. data/app/datatables/admin/effective_cpd_audits_datatable.rb +67 -0
  15. data/app/datatables/admin/effective_cpd_statements_datatable.rb +3 -3
  16. data/app/datatables/effective_cpd_available_audit_reviews_datatable.rb +37 -0
  17. data/app/datatables/effective_cpd_available_audits_datatable.rb +30 -0
  18. data/app/datatables/{effective_cpd_datatable.rb → effective_cpd_available_cycles_datatable.rb} +3 -4
  19. data/app/datatables/effective_cpd_completed_audit_reviews_datatable.rb +32 -0
  20. data/app/datatables/effective_cpd_completed_audits_datatable.rb +24 -0
  21. data/app/datatables/effective_cpd_completed_statements_datatable.rb +28 -0
  22. data/app/helpers/effective_cpd_audits_helper.rb +48 -0
  23. data/app/mailers/effective/cpd_mailer.rb +155 -3
  24. data/app/models/effective/cpd_activity.rb +16 -3
  25. data/app/models/effective/cpd_audit.rb +380 -0
  26. data/app/models/effective/cpd_audit_level.rb +87 -0
  27. data/app/models/effective/cpd_audit_level_question.rb +91 -0
  28. data/app/models/effective/cpd_audit_level_question_option.rb +34 -0
  29. data/app/models/effective/cpd_audit_level_section.rb +50 -0
  30. data/app/models/effective/cpd_audit_response.rb +86 -0
  31. data/app/models/effective/cpd_audit_response_option.rb +6 -0
  32. data/app/models/effective/cpd_audit_review.rb +222 -0
  33. data/app/models/effective/cpd_audit_review_item.rb +34 -0
  34. data/app/models/effective/cpd_category.rb +12 -3
  35. data/app/models/effective/cpd_cycle.rb +7 -0
  36. data/app/models/effective/cpd_rule.rb +3 -1
  37. data/app/models/effective/cpd_statement.rb +15 -8
  38. data/app/views/admin/cpd_activities/_form.html.haml +1 -1
  39. data/app/views/admin/cpd_audit_level_questions/_form.html.haml +100 -0
  40. data/app/views/admin/cpd_audit_levels/_form.html.haml +24 -0
  41. data/app/views/admin/cpd_audit_levels/_form_content_audit.html.haml +15 -0
  42. data/app/views/admin/cpd_audit_levels/_form_content_audit_review.html.haml +15 -0
  43. data/app/views/admin/cpd_audit_levels/_form_cpd_audit_level.html.haml +52 -0
  44. data/app/views/admin/cpd_audit_levels/_form_cpd_audit_level_section.html.haml +10 -0
  45. data/app/views/admin/cpd_audit_reviews/_cpd_audit_review.html.haml +1 -0
  46. data/app/views/admin/cpd_audit_reviews/_form.html.haml +13 -0
  47. data/app/views/admin/cpd_audits/_audit_reviewer_fields.html.haml +2 -0
  48. data/app/views/admin/cpd_audits/_auditee_fields.html.haml +2 -0
  49. data/app/views/admin/cpd_audits/_form.html.haml +46 -0
  50. data/app/views/admin/cpd_audits/_form_conflict.html.haml +24 -0
  51. data/app/views/admin/cpd_audits/_form_determination.html.haml +10 -0
  52. data/app/views/admin/cpd_audits/_form_exemption.html.haml +24 -0
  53. data/app/views/admin/cpd_audits/_form_extension.html.haml +24 -0
  54. data/app/views/admin/cpd_audits/_form_new.html.haml +28 -0
  55. data/app/views/admin/cpd_audits/_status.html.haml +121 -0
  56. data/app/views/admin/cpd_categories/_form.html.haml +1 -1
  57. data/app/views/admin/cpd_cycles/_form.html.haml +4 -4
  58. data/app/views/admin/cpd_cycles/_form_cpd_cycle.html.haml +3 -0
  59. data/app/views/admin/cpd_statements/_cpd_statement.html.haml +7 -0
  60. data/app/views/effective/cpd_audit_level_questions/_cpd_audit_level_question.html.haml +5 -0
  61. data/app/views/effective/cpd_audit_responses/_cpd_audit_response.html.haml +4 -0
  62. data/app/views/effective/cpd_audit_responses/_fields.html.haml +13 -0
  63. data/app/views/effective/cpd_audit_responses/fields/_choose_one.html.haml +1 -0
  64. data/app/views/effective/cpd_audit_responses/fields/_date.html.haml +2 -0
  65. data/app/views/effective/cpd_audit_responses/fields/_email.html.haml +2 -0
  66. data/app/views/effective/cpd_audit_responses/fields/_long_answer.html.haml +1 -0
  67. data/app/views/effective/cpd_audit_responses/fields/_number.html.haml +2 -0
  68. data/app/views/effective/cpd_audit_responses/fields/_select_all_that_apply.html.haml +1 -0
  69. data/app/views/effective/cpd_audit_responses/fields/_select_up_to_1.html.haml +1 -0
  70. data/app/views/effective/cpd_audit_responses/fields/_select_up_to_2.html.haml +1 -0
  71. data/app/views/effective/cpd_audit_responses/fields/_select_up_to_3.html.haml +1 -0
  72. data/app/views/effective/cpd_audit_responses/fields/_select_up_to_4.html.haml +1 -0
  73. data/app/views/effective/cpd_audit_responses/fields/_select_up_to_5.html.haml +1 -0
  74. data/app/views/effective/cpd_audit_responses/fields/_short_answer.html.haml +1 -0
  75. data/app/views/effective/cpd_audit_responses/fields/_upload_file.html.haml +1 -0
  76. data/app/views/effective/cpd_audit_responses/responses/_choose_one.html.haml +1 -0
  77. data/app/views/effective/cpd_audit_responses/responses/_date.html.haml +1 -0
  78. data/app/views/effective/cpd_audit_responses/responses/_email.html.haml +1 -0
  79. data/app/views/effective/cpd_audit_responses/responses/_long_answer.html.haml +1 -0
  80. data/app/views/effective/cpd_audit_responses/responses/_number.html.haml +1 -0
  81. data/app/views/effective/cpd_audit_responses/responses/_select_all_that_apply.html.haml +5 -0
  82. data/app/views/effective/cpd_audit_responses/responses/_select_up_to_1.html.haml +1 -0
  83. data/app/views/effective/cpd_audit_responses/responses/_select_up_to_2.html.haml +5 -0
  84. data/app/views/effective/cpd_audit_responses/responses/_select_up_to_3.html.haml +5 -0
  85. data/app/views/effective/cpd_audit_responses/responses/_select_up_to_4.html.haml +5 -0
  86. data/app/views/effective/cpd_audit_responses/responses/_select_up_to_5.html.haml +5 -0
  87. data/app/views/effective/cpd_audit_responses/responses/_short_answer.html.haml +1 -0
  88. data/app/views/effective/cpd_audit_responses/responses/_upload_file.html.haml +4 -0
  89. data/app/views/effective/cpd_audit_review_items/_cpd_audit_review_item.html.haml +6 -0
  90. data/app/views/effective/cpd_audit_review_items/_fields.html.haml +11 -0
  91. data/app/views/effective/cpd_audit_reviews/_conflict.html.haml +15 -0
  92. data/app/views/effective/cpd_audit_reviews/_cpd_audit_level_section.html.haml +23 -0
  93. data/app/views/effective/cpd_audit_reviews/_cpd_audit_review.html.haml +17 -0
  94. data/app/views/effective/cpd_audit_reviews/_cpd_statement.html.haml +15 -0
  95. data/app/views/effective/cpd_audit_reviews/_layout.html.haml +24 -0
  96. data/app/views/effective/cpd_audit_reviews/_recommendation.html.haml +9 -0
  97. data/app/views/effective/cpd_audit_reviews/_summary.html.haml +47 -0
  98. data/app/views/effective/cpd_audit_reviews/complete.html.haml +20 -0
  99. data/app/views/effective/cpd_audit_reviews/conflict.html.haml +21 -0
  100. data/app/views/effective/cpd_audit_reviews/cpd_audit_level_section.html.haml +43 -0
  101. data/app/views/effective/cpd_audit_reviews/cpd_statement.html.haml +35 -0
  102. data/app/views/effective/cpd_audit_reviews/information.html.haml +5 -0
  103. data/app/views/effective/cpd_audit_reviews/instructions.html.haml +10 -0
  104. data/app/views/effective/cpd_audit_reviews/questionnaire.html.haml +8 -0
  105. data/app/views/effective/cpd_audit_reviews/recommendation.html.haml +21 -0
  106. data/app/views/effective/cpd_audit_reviews/start.html.haml +10 -0
  107. data/app/views/effective/cpd_audit_reviews/statements.html.haml +29 -0
  108. data/app/views/effective/cpd_audit_reviews/submit.html.haml +14 -0
  109. data/app/views/effective/cpd_audit_reviews/waiting.html.haml +9 -0
  110. data/app/views/effective/cpd_audits/_conflict.html.haml +15 -0
  111. data/app/views/effective/cpd_audits/_cpd_audit.html.haml +12 -0
  112. data/app/views/effective/cpd_audits/_cpd_audit_level_section.html.haml +14 -0
  113. data/app/views/effective/cpd_audits/_exemption.html.haml +26 -0
  114. data/app/views/effective/cpd_audits/_extension.html.haml +30 -0
  115. data/app/views/effective/cpd_audits/_files.html.haml +12 -0
  116. data/app/views/effective/cpd_audits/_layout.html.haml +33 -0
  117. data/app/views/effective/cpd_audits/_summary.html.haml +54 -0
  118. data/app/views/effective/cpd_audits/_waiting.html.haml +6 -0
  119. data/app/views/effective/cpd_audits/complete.html.haml +24 -0
  120. data/app/views/effective/cpd_audits/conflict.html.haml +22 -0
  121. data/app/views/effective/cpd_audits/cpd_audit_level_section.html.haml +20 -0
  122. data/app/views/effective/cpd_audits/exemption.html.haml +19 -0
  123. data/app/views/effective/cpd_audits/extension.html.haml +21 -0
  124. data/app/views/effective/cpd_audits/files.html.haml +7 -0
  125. data/app/views/effective/cpd_audits/information.html.haml +5 -0
  126. data/app/views/effective/cpd_audits/instructions.html.haml +5 -0
  127. data/app/views/effective/cpd_audits/questionnaire.html.haml +5 -0
  128. data/app/views/effective/cpd_audits/start.html.haml +11 -0
  129. data/app/views/effective/cpd_audits/submit.html.haml +15 -0
  130. data/app/views/effective/cpd_audits/waiting.html.haml +24 -0
  131. data/app/views/effective/cpd_mailer/README.md +1 -0
  132. data/app/views/effective/cpd_mailer/cpd_audit_closed.liquid +15 -0
  133. data/app/views/effective/cpd_mailer/cpd_audit_conflict_resolved.liquid +15 -0
  134. data/app/views/effective/cpd_mailer/cpd_audit_conflicted.liquid +13 -0
  135. data/app/views/effective/cpd_mailer/cpd_audit_exemption_denied.liquid +13 -0
  136. data/app/views/effective/cpd_mailer/cpd_audit_exemption_granted.liquid +13 -0
  137. data/app/views/effective/cpd_mailer/cpd_audit_exemption_request.liquid +13 -0
  138. data/app/views/effective/cpd_mailer/cpd_audit_extension_denied.liquid +13 -0
  139. data/app/views/effective/cpd_mailer/cpd_audit_extension_granted.liquid +13 -0
  140. data/app/views/effective/cpd_mailer/cpd_audit_extension_request.liquid +13 -0
  141. data/app/views/effective/cpd_mailer/cpd_audit_opened.liquid +13 -0
  142. data/app/views/effective/cpd_mailer/cpd_audit_review_opened.liquid +15 -0
  143. data/app/views/effective/cpd_mailer/cpd_audit_review_ready.liquid +13 -0
  144. data/app/views/effective/cpd_mailer/cpd_audit_review_submitted.liquid +11 -0
  145. data/app/views/effective/cpd_mailer/cpd_audit_reviewed.liquid +13 -0
  146. data/app/views/effective/cpd_mailer/cpd_audit_submitted.liquid +13 -0
  147. data/app/views/effective/cpd_statement_activities/_cpd_statement_activity.html.haml +65 -0
  148. data/app/views/effective/cpd_statement_activities/_form.html.haml +9 -10
  149. data/app/views/effective/cpd_statements/_activities.html.haml +3 -64
  150. data/app/views/effective/cpd_statements/_activities_edit.html.haml +2 -0
  151. data/app/views/effective/cpd_statements/_activities_table.html.haml +64 -0
  152. data/app/views/effective/cpd_statements/_agreements.html.haml +19 -5
  153. data/app/views/effective/cpd_statements/_cpd_statement.html.haml +6 -3
  154. data/app/views/effective/cpd_statements/_summary.html.haml +26 -31
  155. data/app/views/effective/cpd_statements/activities.html.haml +1 -1
  156. data/app/views/effective/cpd_statements/agreements.html.haml +7 -1
  157. data/app/views/effective/cpd_statements/submit.html.haml +1 -1
  158. data/config/effective_cpd.rb +47 -10
  159. data/config/routes.rb +18 -1
  160. data/db/migrate/01_create_effective_cpd.rb.erb +157 -1
  161. data/db/seeds.rb +2 -1
  162. data/lib/effective_cpd.rb +42 -3
  163. data/lib/effective_cpd/version.rb +1 -1
  164. data/lib/generators/effective_cpd/install_generator.rb +16 -3
  165. metadata +168 -9
  166. data/app/datatables/effective_cpd_statements_datatable.rb +0 -23
  167. data/app/views/admin/cpd_statements/_form.html.haml +0 -6
@@ -0,0 +1,67 @@
1
+ module Admin
2
+ class EffectiveCpdAuditsDatatable < Effective::Datatable
3
+ filters do
4
+ scope :all
5
+ scope :available, label: 'In Progress'
6
+ scope :completed
7
+ scope :waiting_on_admin
8
+ scope :waiting_on_auditee
9
+ scope :waiting_on_reviewers
10
+ end
11
+
12
+ datatable do
13
+ col :id, visible: false
14
+ col :created_at, visible: false
15
+ col :updated_at, visible: false
16
+
17
+ col :token, visible: false
18
+
19
+ col :cpd_audit_level, label: 'Audit Level'
20
+
21
+ col :user, search: :string, label: 'Auditee'
22
+
23
+ col(:cpd_audit_reviews, label: 'Auditor Reviewers', search: :string) do |cpd_audit|
24
+ cpd_audit.cpd_audit_reviews.map(&:user).map do |user|
25
+ content_tag(:div, class: 'col-resource_item') do
26
+ if view.respond_to?(:edit_admin_user_path)
27
+ link_to(user.to_s, edit_admin_user_path(user))
28
+ else
29
+ user.to_s
30
+ end
31
+ end
32
+ end.join.html_safe
33
+ end
34
+
35
+ col :notification_date, label: 'Date of Notification'
36
+ col :extension_date, label: 'Approved Extension Date', visible: false
37
+ col :due_date
38
+
39
+ col :status
40
+ col :determination
41
+
42
+ col(:auditee_cpd_statements, label: 'Auditee Statements') do |cpd_audit|
43
+ cpd_audit.user.cpd_statements.map do |cpd_statement|
44
+ content_tag(:div, class: 'col-resource_item') do
45
+ link_to(cpd_statement.to_s, effective_cpd.admin_cpd_statement_path(cpd_statement))
46
+ end
47
+ end.join.html_safe
48
+ end
49
+
50
+ col :conflict_of_interest, visible: false
51
+ col :conflict_of_interest_reason, visible: false
52
+
53
+ col :exemption_request, visible: false
54
+ col :exemption_request_reason, visible: false
55
+
56
+ col :extension_request, visible: false
57
+ col :extension_request_date, visible: false
58
+ col :extension_request_reason, visible: false
59
+
60
+ actions_col
61
+ end
62
+
63
+ collection do
64
+ Effective::CpdAudit.all.deep
65
+ end
66
+ end
67
+ end
@@ -1,9 +1,9 @@
1
1
  module Admin
2
2
  class EffectiveCpdStatementsDatatable < Effective::Datatable
3
3
  filters do
4
- scope :completed
5
- scope :draft
6
4
  scope :all
5
+ scope :draft, label: 'In Progress'
6
+ scope :completed
7
7
  end
8
8
 
9
9
  datatable do
@@ -16,7 +16,7 @@ module Admin
16
16
 
17
17
  col :cpd_cycle, label: cpd_cycle_label.titleize
18
18
  col :user
19
- col :completed_at
19
+ col :submitted_at, as: :date, label: 'Submitted'
20
20
  col :score
21
21
  col :carry_forward
22
22
 
@@ -0,0 +1,37 @@
1
+ # Displays cpd audits for this auditor reviewer user
2
+
3
+ class EffectiveCpdAvailableAuditReviewsDatatable < Effective::Datatable
4
+ datatable do
5
+ order :due_date
6
+
7
+ col :token, visible: false
8
+
9
+ col :cpd_audit_level, label: 'Audit'
10
+ col :due_date
11
+ col :user, label: 'Auditee', action: false
12
+
13
+ col :ready_to_review do |cpd_audit|
14
+ cpd_audit.was_submitted? ? 'Yes' : 'No'
15
+ end
16
+
17
+ actions_col(actions: []) do |cpd_audit|
18
+ cpd_audit_review = cpd_audit.cpd_audit_reviews.find { |r| r.user_id == current_user.id }
19
+
20
+ if cpd_audit_review.wizard_steps.blank?
21
+ dropdown_link_to('Start', effective_cpd.cpd_audit_review_build_path(cpd_audit_review, cpd_audit_review.next_step))
22
+ else
23
+ dropdown_link_to('Continue', effective_cpd.cpd_audit_review_build_path(cpd_audit_review, cpd_audit_review.next_step))
24
+ end
25
+ end
26
+ end
27
+
28
+ collection do
29
+ raise('expected a current_user') unless current_user.present?
30
+
31
+ reviews = Effective::CpdAuditReview.available.where(user: current_user)
32
+
33
+ Effective::CpdAudit.available.includes(:cpd_audit_reviews)
34
+ .where(id: reviews.select('cpd_audit_id as id'))
35
+ end
36
+
37
+ end
@@ -0,0 +1,30 @@
1
+ # Displays cpd audits for this auditee user
2
+
3
+ class EffectiveCpdAvailableAuditsDatatable < Effective::Datatable
4
+ datatable do
5
+ order :due_date
6
+
7
+ col :token, visible: false
8
+
9
+ col :cpd_audit_level, label: 'Audit'
10
+ col :due_date
11
+ col :status
12
+ col :determination
13
+
14
+ actions_col(actions: []) do |cpd_audit|
15
+ if cpd_audit.opened?
16
+ dropdown_link_to('Start', effective_cpd.cpd_audit_build_path(cpd_audit, cpd_audit.next_step))
17
+ elsif cpd_audit.was_submitted?
18
+ dropdown_link_to('Show', effective_cpd.cpd_audit_build_path(cpd_audit, cpd_audit.last_completed_step))
19
+ else
20
+ dropdown_link_to('Continue', effective_cpd.cpd_audit_build_path(cpd_audit, cpd_audit.next_step))
21
+ end
22
+ end
23
+ end
24
+
25
+ collection do
26
+ raise('expected a current_user') unless current_user.present?
27
+ Effective::CpdAudit.available.where(user: current_user)
28
+ end
29
+
30
+ end
@@ -1,6 +1,6 @@
1
1
  # Displays available cpd_cycles that the current_user may complete
2
2
 
3
- class EffectiveCpdDatatable < Effective::Datatable
3
+ class EffectiveCpdAvailableCyclesDatatable < Effective::Datatable
4
4
  datatable do
5
5
  order :start_at
6
6
 
@@ -14,8 +14,6 @@ class EffectiveCpdDatatable < Effective::Datatable
14
14
 
15
15
  if statement.blank?
16
16
  dropdown_link_to('Start', effective_cpd.cpd_cycle_cpd_statement_build_path(cpd_cycle, :new, :start))
17
- elsif statement.completed?
18
- 'Complete'
19
17
  else
20
18
  dropdown_link_to('Continue', effective_cpd.cpd_cycle_cpd_statement_build_path(cpd_cycle, statement, statement.next_step))
21
19
  end
@@ -24,7 +22,8 @@ class EffectiveCpdDatatable < Effective::Datatable
24
22
 
25
23
  collection do
26
24
  raise('expected a current_user') unless current_user.present?
27
- Effective::CpdCycle.available
25
+ completed = Effective::CpdStatement.completed.where(user: current_user)
26
+ Effective::CpdCycle.available.where.not(id: completed.select('cpd_cycle_id as id'))
28
27
  end
29
28
 
30
29
  end
@@ -0,0 +1,32 @@
1
+ # Displays cpd audits for this auditor reviewer user
2
+
3
+ class EffectiveCpdCompletedAuditReviewsDatatable < Effective::Datatable
4
+ datatable do
5
+ order :notification_date
6
+
7
+ col :token, visible: false
8
+
9
+ col :cpd_audit_level, label: 'Audit'
10
+ col :notification_date, label: 'Date of Notification'
11
+ col :user, label: 'Auditee', action: false
12
+
13
+ col :recommendation do |cpd_audit|
14
+ cpd_audit.cpd_audit_reviews.find { |r| r.user_id == current_user.id }.recommendation
15
+ end
16
+
17
+ actions_col(actions: []) do |cpd_audit|
18
+ cpd_audit_review = cpd_audit.cpd_audit_reviews.find { |r| r.user_id == current_user.id }
19
+ dropdown_link_to('Show', effective_cpd.cpd_audit_review_build_path(cpd_audit_review, cpd_audit_review.next_step))
20
+ end
21
+ end
22
+
23
+ collection do
24
+ raise('expected a current_user') unless current_user.present?
25
+
26
+ reviews = Effective::CpdAuditReview.completed.where(user: current_user)
27
+
28
+ Effective::CpdAudit.includes(:cpd_audit_reviews)
29
+ .where(id: reviews.select('cpd_audit_id as id'))
30
+ end
31
+
32
+ end
@@ -0,0 +1,24 @@
1
+ # Displays cpd audits for this auditee user
2
+
3
+ class EffectiveCpdCompletedAuditsDatatable < Effective::Datatable
4
+ datatable do
5
+ order :notification_date
6
+
7
+ col :token, visible: false
8
+
9
+ col :cpd_audit_level, label: 'Audit'
10
+ col :notification_date, label: 'Date of Notification'
11
+ col :status
12
+ col :determination
13
+
14
+ actions_col(actions: []) do |cpd_audit|
15
+ dropdown_link_to('Show', effective_cpd.cpd_audit_build_path(cpd_audit, cpd_audit.last_completed_step))
16
+ end
17
+ end
18
+
19
+ collection do
20
+ raise('expected a current_user') unless current_user.present?
21
+ Effective::CpdAudit.completed.where(user: current_user)
22
+ end
23
+
24
+ end
@@ -0,0 +1,28 @@
1
+ # Displays past cpd statements that were completed by the user
2
+
3
+ class EffectiveCpdCompletedStatementsDatatable < Effective::Datatable
4
+ datatable do
5
+ order :cpd_cycle_id
6
+
7
+ col(:cpd_cycle_id, label: 'Statement') do |statement|
8
+ statement.cpd_cycle.to_s
9
+ end
10
+
11
+ col :submitted_at, as: :date, label: 'Submitted'
12
+ col :score
13
+ col :carry_forward
14
+
15
+ unless attributes[:actions] == false
16
+ actions_col(actions: []) do |cpd_statement|
17
+ dropdown_link_to('Show', effective_cpd.cpd_cycle_cpd_statement_build_path(cpd_statement.cpd_cycle, cpd_statement, cpd_statement.last_completed_step))
18
+ end
19
+ end
20
+ end
21
+
22
+ collection do
23
+ raise('expected a current_user') unless current_user.present?
24
+ user = (current_user.class.find(attributes[:user_id]) if attributes[:user_id])
25
+ Effective::CpdStatement.completed.where(user: user || current_user).includes(:cpd_cycle)
26
+ end
27
+
28
+ end
@@ -0,0 +1,48 @@
1
+ module EffectiveCpdAuditsHelper
2
+
3
+ def cpd_audit_conflict_of_interest_collection
4
+ [['Yes, there is a conflict of interest', true], ['No conflict of interest', false]]
5
+ end
6
+
7
+ def cpd_audit_exemption_request_collection
8
+ [['Yes, I would like to request an exemption', true], ['No exemption request', false]]
9
+ end
10
+
11
+ def cpd_audit_extension_request_collection
12
+ [['Yes, I would like to request an extension', true], ['No extension request', false]]
13
+ end
14
+
15
+ def cpd_audit_summary_text(cpd_audit)
16
+ case cpd_audit.status
17
+ when 'opened'
18
+ "The audit has been opened. The auditee and audit reviewers have been notified. Waiting for the auditee to submit their audit questionnaire."
19
+ when 'started'
20
+ "The auditee has begun their audit questionnaire. Waiting for the auditee to submit their audit questionnaire."
21
+ when 'conflicted'
22
+ "The auditee has declared a conflict of interest. Waiting for a new reviewer to be assigned or otherwise resolved."
23
+ when 'conflicted_resolved'
24
+ "The auditee had declared a conflict of interest. This has been resolved. Waiting for the auditee to submit their audit questionnaire."
25
+ when 'exemption_requested'
26
+ "The auditee has requested an exemption. Waiting for request to be granted or denied."
27
+ when 'exemption_granted'
28
+ "The exemption request has been granted. This audit may now be closed."
29
+ when 'exemption_denied'
30
+ "The exemption request has been denied. The audit will continue. Waiting for the auditee to submit their audit questionnaire."
31
+ when 'extension_requested'
32
+ "The auditee has requested an extension. Waiting for request to be granted or denied."
33
+ when 'extension_granted'
34
+ "The extension request has been granted. There is a new deadline. Waiting for the auditee to submit their audit questionnaire."
35
+ when 'extension_denied'
36
+ "The extension request has been denied. The deadline remains. Waiting for the auditee to submit their audit questionnaire."
37
+ when 'submitted'
38
+ "The auditee has submitted their audit questionnaire. Waiting on review."
39
+ when 'reviewed'
40
+ "The audit has been reviewed and is ready for the final determination to be made."
41
+ when 'closed'
42
+ "This audit has been closed with a final determination. All done."
43
+ else
44
+ raise("unexpected cpd audit status: #{cpd_audit.status}")
45
+ end
46
+ end
47
+
48
+ end
@@ -1,7 +1,159 @@
1
1
  module Effective
2
- class CpdMailer < ActionMailer::Base
3
- default from: EffectiveCpd.mailer[:default_from]
4
- layout EffectiveCpd.mailer[:layout].presence || 'effective_cpd_mailer_layout'
2
+ class CpdMailer < EffectiveCpd.parent_mailer_class
3
+ default from: -> { EffectiveCpd.mailer_sender }
4
+ layout -> { EffectiveCpd.mailer_layout || 'effective_cpd_mailer_layout' }
5
+
6
+ # CPD Audit
7
+ def cpd_audit_opened(cpd_audit, opts = {})
8
+ @assigns = effective_cpd_email_assigns(cpd_audit)
9
+ @assigns.merge!(url: effective_cpd.cpd_audit_url(cpd_audit))
10
+
11
+ mail(to: cpd_audit.user.email, **headers_for(cpd_audit, opts))
12
+ end
13
+
14
+ def cpd_audit_conflicted(cpd_audit, opts = {})
15
+ @assigns = effective_cpd_email_assigns(cpd_audit)
16
+ @assigns.merge!(url: effective_cpd.edit_admin_cpd_audit_url(cpd_audit))
17
+
18
+ mail(to: EffectiveCpd.mailer_admin, **headers_for(cpd_audit, opts))
19
+ end
20
+
21
+ def cpd_audit_conflict_resolved(cpd_audit, opts = {})
22
+ @assigns = effective_cpd_email_assigns(cpd_audit)
23
+ @assigns.merge!(url: effective_cpd.cpd_audit_url(cpd_audit))
24
+
25
+ mail(to: cpd_audit.user.email, **headers_for(cpd_audit, opts))
26
+ end
27
+
28
+ def cpd_audit_exemption_request(cpd_audit, opts = {})
29
+ @assigns = effective_cpd_email_assigns(cpd_audit)
30
+ @assigns.merge!(url: effective_cpd.edit_admin_cpd_audit_url(cpd_audit))
31
+
32
+ mail(to: EffectiveCpd.mailer_admin, **headers_for(cpd_audit, opts))
33
+ end
34
+
35
+ def cpd_audit_exemption_denied(cpd_audit, opts = {})
36
+ @assigns = effective_cpd_email_assigns(cpd_audit)
37
+ @assigns.merge!(url: effective_cpd.cpd_audit_url(cpd_audit))
38
+
39
+ mail(to: cpd_audit.user.email, **headers_for(cpd_audit, opts))
40
+ end
41
+
42
+ def cpd_audit_exemption_granted(cpd_audit, opts = {})
43
+ @assigns = effective_cpd_email_assigns(cpd_audit)
44
+ @assigns.merge!(url: effective_cpd.cpd_audit_url(cpd_audit))
45
+
46
+ mail(to: cpd_audit.user.email, **headers_for(cpd_audit, opts))
47
+ end
48
+
49
+ def cpd_audit_extension_request(cpd_audit, opts = {})
50
+ @assigns = effective_cpd_email_assigns(cpd_audit)
51
+ @assigns.merge!(url: effective_cpd.edit_admin_cpd_audit_url(cpd_audit))
52
+
53
+ mail(to: EffectiveCpd.mailer_admin, **headers_for(cpd_audit, opts))
54
+ end
55
+
56
+ def cpd_audit_extension_denied(cpd_audit, opts = {})
57
+ @assigns = effective_cpd_email_assigns(cpd_audit)
58
+ @assigns.merge!(url: effective_cpd.cpd_audit_url(cpd_audit))
59
+
60
+ mail(to: cpd_audit.user.email, **headers_for(cpd_audit, opts))
61
+ end
62
+
63
+ def cpd_audit_extension_granted(cpd_audit, opts = {})
64
+ @assigns = effective_cpd_email_assigns(cpd_audit)
65
+ @assigns.merge!(url: effective_cpd.cpd_audit_url(cpd_audit))
66
+
67
+ mail(to: cpd_audit.user.email, **headers_for(cpd_audit, opts))
68
+ end
69
+
70
+ def cpd_audit_submitted(cpd_audit, opts = {})
71
+ @assigns = effective_cpd_email_assigns(cpd_audit)
72
+ @assigns.merge!(url: effective_cpd.edit_admin_cpd_audit_url(cpd_audit))
73
+
74
+ mail(to: EffectiveCpd.mailer_admin, **headers_for(cpd_audit, opts))
75
+ end
76
+
77
+ def cpd_audit_reviewed(cpd_audit, opts = {})
78
+ @assigns = effective_cpd_email_assigns(cpd_audit)
79
+ @assigns.merge!(url: effective_cpd.edit_admin_cpd_audit_url(cpd_audit))
80
+
81
+ mail(to: EffectiveCpd.mailer_admin, **headers_for(cpd_audit, opts))
82
+ end
83
+
84
+ def cpd_audit_closed(cpd_audit, opts = {})
85
+ @assigns = effective_cpd_email_assigns(cpd_audit)
86
+ @assigns.merge!(url: effective_cpd.cpd_audit_url(cpd_audit))
87
+
88
+ mail(to: cpd_audit.user.email, **headers_for(cpd_audit, opts))
89
+ end
90
+
91
+ # CPD Audit Review
92
+ def cpd_audit_review_opened(cpd_audit_review, opts = {})
93
+ @assigns = effective_cpd_email_assigns(cpd_audit_review)
94
+ @assigns.merge!(url: effective_cpd.cpd_audit_review_url(cpd_audit_review))
95
+
96
+ mail(to: cpd_audit_review.user.email, **headers_for(cpd_audit_review, opts))
97
+ end
98
+
99
+ def cpd_audit_review_ready(cpd_audit_review, opts = {})
100
+ @assigns = effective_cpd_email_assigns(cpd_audit_review)
101
+ @assigns.merge!(url: effective_cpd.cpd_audit_review_url(cpd_audit_review))
102
+
103
+ mail(to: cpd_audit_review.user.email, **headers_for(cpd_audit_review, opts))
104
+ end
105
+
106
+ def cpd_audit_review_submitted(cpd_audit_review, opts = {})
107
+ @assigns = effective_cpd_email_assigns(cpd_audit_review)
108
+ @assigns.merge!(url: effective_cpd.edit_admin_cpd_audit_url(cpd_audit_review.cpd_audit))
109
+
110
+ mail(to: EffectiveCpd.mailer_admin, **headers_for(cpd_audit_review, opts))
111
+ end
112
+
113
+ protected
114
+
115
+ def headers_for(resource, opts = {})
116
+ resource.respond_to?(:log_changes_datatable) ? opts.merge(log: resource) : opts
117
+ end
118
+
119
+ def effective_cpd_email_assigns(resource)
120
+ unless resource.kind_of?(Effective::CpdAudit) || resource.kind_of?(Effective::CpdAuditReview)
121
+ raise('expected an Effective::CpdAudit or Effective::CpdAuditReview')
122
+ end
123
+
124
+ @cpd_audit = (resource.kind_of?(Effective::CpdAudit) ? resource : resource.cpd_audit)
125
+ @cpd_audit_review = (resource if resource.kind_of?(Effective::CpdAuditReview))
126
+
127
+ @auditee = @cpd_audit.user
128
+ @reviewer = @cpd_audit_review.user if @cpd_audit_review.present?
129
+
130
+ audit_assigns = {
131
+ audit: {
132
+ title: @cpd_audit.to_s,
133
+ level: @cpd_audit.cpd_audit_level.to_s,
134
+ determination: @cpd_audit.determination.to_s
135
+ },
136
+ auditee: {
137
+ name: @auditee.to_s,
138
+ email: @auditee.email
139
+ }
140
+ }
141
+
142
+ review_assigns = if @cpd_audit_review.present?
143
+ {
144
+ review: {
145
+ title: @cpd_audit_review.to_s,
146
+ recommendation: @cpd_audit_review.recommendation.to_s
147
+ },
148
+ reviewer: {
149
+ name: @reviewer.to_s,
150
+ email: @reviewer.email
151
+ }
152
+ }
153
+ end
154
+
155
+ audit_assigns.merge(review_assigns || {})
156
+ end
5
157
 
6
158
  end
7
159
  end