effective_cpd 0.0.1 → 0.1

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