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,34 @@
1
+ module Effective
2
+ class CpdAuditReviewItem < ActiveRecord::Base
3
+ belongs_to :cpd_audit_review
4
+ belongs_to :item, polymorphic: true # CpdAuditResponse or CpdStatementActivity
5
+
6
+ if respond_to?(:log_changes)
7
+ log_changes(to: :cpd_audit_review)
8
+ end
9
+
10
+ effective_resource do
11
+ recommendation :string
12
+ comments :text
13
+
14
+ timestamps
15
+ end
16
+
17
+ scope :deep, -> { includes(:cpd_audit_review, :item) }
18
+ scope :sorted, -> { order(:id) }
19
+
20
+ validates :recommendation, presence: true
21
+ validates :item_id, presence: true, uniqueness: { scope: [:cpd_audit_review_id, :item_type] }
22
+
23
+ validate(if: -> { recommendation.present? && cpd_audit_review.present? }) do
24
+ unless cpd_audit_review.cpd_audit_level.recommendations.include?(recommendation)
25
+ self.errors.add(:recommendation, 'must exist in this audit level')
26
+ end
27
+ end
28
+
29
+ def to_s
30
+ recommendation.presence || 'cpd audit review item'
31
+ end
32
+
33
+ end
34
+ end
@@ -1,13 +1,16 @@
1
1
  module Effective
2
2
  class CpdCategory < ActiveRecord::Base
3
3
  has_rich_text :body
4
- log_changes if respond_to?(:log_changes)
5
4
 
6
5
  has_many :cpd_activities, -> { order(:position) }, inverse_of: :cpd_category, dependent: :destroy
7
6
  accepts_nested_attributes_for :cpd_activities, allow_destroy: true
8
7
 
9
- # has_many :rules, -> { order(cycle_id: :desc) }, as: :ruleable, dependent: :delete_all
10
- # accepts_nested_attributes_for :rules, allow_destroy: true
8
+ has_many :rules, class_name: 'Effective::CpdRule', as: :ruleable
9
+ has_many :cpd_statement_activities
10
+
11
+ if respond_to?(:log_changes)
12
+ log_changes(except: [:rules, :cpd_statement_activities])
13
+ end
11
14
 
12
15
  effective_resource do
13
16
  title :string
@@ -27,6 +30,12 @@ module Effective
27
30
  validates :position, presence: true
28
31
  validates :body, presence: true
29
32
 
33
+ before_destroy do
34
+ if (count = cpd_statement_activities.length) > 0
35
+ raise("#{count} statement activities belong to this category")
36
+ end
37
+ end
38
+
30
39
  def to_s
31
40
  title.presence || 'category'
32
41
  end
@@ -49,11 +49,18 @@ module Effective
49
49
 
50
50
  validates :title, presence: true
51
51
  validates :start_at, presence: true
52
+ validates :required_score, numericality: { greater_than: 0, allow_nil: true }
52
53
 
53
54
  validate(if: -> { start_at.present? && end_at.present? }) do
54
55
  self.errors.add(:end_at, 'must be after the start date') unless end_at > start_at
55
56
  end
56
57
 
58
+ before_destroy do
59
+ if (count = cpd_statements.length) > 0
60
+ raise("#{count} statement belong to this cycle")
61
+ end
62
+ end
63
+
57
64
  def self.latest_cycle
58
65
  order(id: :desc).first
59
66
  end
@@ -3,7 +3,9 @@ module Effective
3
3
  belongs_to :cpd_cycle
4
4
  belongs_to :ruleable, polymorphic: true # Activity or Category
5
5
 
6
- log_changes(to: :cpd_cycle) if respond_to?(:log_changes)
6
+ if respond_to?(:log_changes)
7
+ log_changes(to: :cpd_cycle)
8
+ end
7
9
 
8
10
  # Only permit the words amount, amount2 and any charater 0-9 + - / * ( )
9
11
  INVALID_FORMULA_CHARS = /[^0-9\+\-\/\*\(\)]/
@@ -10,7 +10,10 @@ module Effective
10
10
  accepts_nested_attributes_for :cpd_statement_activities
11
11
 
12
12
  has_many_attached :files
13
- log_changes if respond_to?(:log_changes)
13
+
14
+ if respond_to?(:log_changes)
15
+ log_changes(except: [:wizard_steps])
16
+ end
14
17
 
15
18
  acts_as_tokened
16
19
 
@@ -29,21 +32,22 @@ module Effective
29
32
  confirm_factual :boolean
30
33
  confirm_readonly :boolean
31
34
 
32
- completed_at :datetime, permitted: false
35
+ submitted_at :datetime, permitted: false
33
36
 
34
37
  # Acts as tokened
35
38
  token :string, permitted: false
36
39
 
37
40
  # Acts as Wizard
38
41
  wizard_steps :text, permitted: false
42
+
39
43
  timestamps
40
44
  end
41
45
 
42
46
  scope :deep, -> { includes(:cpd_cycle, :user, cpd_statement_activities: [:files_attachments, :cpd_category, :original, cpd_activity: [:rich_text_body]]) }
43
47
  scope :sorted, -> { order(:cpd_cycle_id) }
44
48
 
45
- scope :draft, -> { where(completed_at: nil) }
46
- scope :completed, -> { where.not(completed_at: nil) }
49
+ scope :draft, -> { where(submitted_at: nil) }
50
+ scope :completed, -> { where.not(submitted_at: nil) }
47
51
 
48
52
  before_validation(if: -> { new_record? }) do
49
53
  self.user ||= current_user
@@ -65,19 +69,22 @@ module Effective
65
69
  end
66
70
 
67
71
  def to_s
68
- (cpd_cycle || 'statement').to_s
72
+ cpd_cycle.present? ? "#{cpd_cycle} Statement" : 'statement'
69
73
  end
70
74
 
71
75
  # This is the review step where they click Submit Ballot
72
76
  def submit!
73
77
  wizard_steps[:complete] ||= Time.zone.now
74
- self.completed_at ||= Time.zone.now
75
78
 
76
- save!
79
+ update!(submitted_at: Time.zone.now)
80
+ end
81
+
82
+ def in_progress?
83
+ submitted_at.blank?
77
84
  end
78
85
 
79
86
  def completed?
80
- completed_at.present?
87
+ submitted_at.present?
81
88
  end
82
89
 
83
90
  def carry_forward
@@ -7,7 +7,7 @@
7
7
  .row
8
8
  .col
9
9
  = f.text_field :title, label: 'Title'
10
- = f.rich_text_area :body, label: "Body"
10
+ = f.rich_text_area :body, label: 'Body (optional)'
11
11
  .col
12
12
  = f.text_field :amount_label,
13
13
  hint: 'hours of work, papers written, courses attended'
@@ -0,0 +1,100 @@
1
+ = effective_form_with(model: [:admin, cpd_audit_level_question], engine: true) do |f|
2
+ - if inline_datatable?
3
+ = f.hidden_field :cpd_audit_level_section_id
4
+ - else
5
+ = f.select :cpd_audit_level_section_id, Effective::CpdAuditLevelSection.sorted.all
6
+
7
+ = f.text_field :title, label: 'Question Title'
8
+ = f.rich_text_area :body, label: 'Body (optional)'
9
+
10
+ = f.check_box :required, hint: 'A response to this question will be required'
11
+ = f.select :category, Effective::CpdAuditLevelQuestion::CATEGORIES
12
+
13
+ = f.show_if :category, 'Choose one' do
14
+ .card
15
+ .card-body
16
+ %h5 Choose one
17
+ %p Display radio buttons to choose one option
18
+
19
+ = f.show_if :category, 'Select all that apply' do
20
+ .card
21
+ .card-body
22
+ %h5 Select all that apply
23
+ %p Display checkboxes to select all options that apply
24
+
25
+ = f.show_if :category, 'Select up to 1' do
26
+ .card
27
+ .card-body
28
+ %h5 Select up to 1 (one)
29
+ %p Display checkboxes to select up to 1 option
30
+
31
+ = f.show_if :category, 'Select up to 2' do
32
+ .card
33
+ .card-body
34
+ %h5 Select up to 2 (two)
35
+ %p Display checkboxes to select up to 2 options
36
+
37
+ = f.show_if :category, 'Select up to 3' do
38
+ .card
39
+ .card-body
40
+ %h5 Select up to 3 (three)
41
+ %p Display checkboxes to select up to 3 options
42
+
43
+ = f.show_if :category, 'Select up to 4' do
44
+ .card
45
+ .card-body
46
+ %h5 Select up to 4 (four)
47
+ %p Display checkboxes to select up to 4 options
48
+
49
+ = f.show_if :category, 'Select up to 5' do
50
+ .card
51
+ .card-body
52
+ %h5 Select up to 5 (five)
53
+ %p Display checkboxes to select up to 5 options
54
+
55
+ = f.show_if :category, 'Short Answer' do
56
+ .card
57
+ .card-body
58
+ %h5 Short Answer
59
+ %p Display a text field to enter a short text answer
60
+
61
+ = f.show_if :category, 'Long Answer' do
62
+ .card
63
+ .card-body
64
+ %h5 Long Answer
65
+ %p Display a textarea to enter a long text answer
66
+
67
+ = f.show_if :category, 'Date' do
68
+ .card
69
+ .card-body
70
+ %h5 Date
71
+ %p Display a date field to enter a date
72
+
73
+ = f.show_if :category, 'Email' do
74
+ .card
75
+ .card-body
76
+ %h5 Email
77
+ %p Display an email field to enter an email
78
+
79
+ = f.show_if :category, 'Number' do
80
+ .card
81
+ .card-body
82
+ %h5 Number
83
+ %p Display a number field to enter an integer number
84
+
85
+ = f.show_if :category, 'Upload File' do
86
+ .card
87
+ .card-body
88
+ %h5 Upload File
89
+ %p Display a file field to upload a file
90
+
91
+ = f.show_if_any :category, Effective::CpdAuditLevelQuestion::WITH_OPTIONS_CATEGORIES do
92
+ .mt-3.card
93
+ .card-body
94
+ %h5 Options
95
+ %p Display the following options:
96
+
97
+ = f.has_many :cpd_audit_level_question_options, class: 'tight' do |fa|
98
+ = fa.text_field :title, label: false
99
+
100
+ = effective_submit(f)
@@ -0,0 +1,24 @@
1
+ = tabs do
2
+ = tab 'Audit Level' do
3
+ = render 'admin/cpd_audit_levels/form_cpd_audit_level', cpd_audit_level: cpd_audit_level
4
+
5
+ - if cpd_audit_level.persisted?
6
+ = tab 'Sections and Questions' do
7
+ %p
8
+ Each of the following sections is a step on the audit wizard.
9
+ The All Steps content will be displayed as well as the top and bottom content.
10
+
11
+ = tabs do
12
+ - cpd_audit_level.cpd_audit_level_sections.each do |cpd_audit_level_section|
13
+ = tab(cpd_audit_level_section.to_s) do
14
+ = render 'admin/cpd_audit_levels/form_cpd_audit_level_section', cpd_audit_level: cpd_audit_level, cpd_audit_level_section: cpd_audit_level_section
15
+
16
+ = tab 'Auditee Wizard' do
17
+ = render 'admin/cpd_audit_levels/form_content_audit', cpd_audit_level: cpd_audit_level
18
+
19
+ = tab 'Audit Reviewer Wizard' do
20
+ = render 'admin/cpd_audit_levels/form_content_audit_review', cpd_audit_level: cpd_audit_level
21
+
22
+ - if cpd_audit_level.respond_to?(:log_changes_datatable)
23
+ = tab 'Logs' do
24
+ = render_inline_datatable(cpd_audit_level.log_changes_datatable)
@@ -0,0 +1,15 @@
1
+ %p Each of the following content areas will be displayed on the auditee wizard.
2
+
3
+ = effective_form_with(model: [:admin, cpd_audit_level], engine: true) do |f|
4
+ = card("All Steps Content") do
5
+ = f.rich_text_area "rich_text_all_steps_audit_content", label: false,
6
+ hint: "displayed on all steps"
7
+
8
+ %hr
9
+
10
+ - Effective::CpdAudit::WIZARD_STEPS.each do |step, title|
11
+ = card("#{title} Content") do
12
+ = f.rich_text_area "rich_text_#{step}_audit_content", label: false,
13
+ hint: "displayed on the auditee wizard #{step} wizard step only"
14
+
15
+ = f.submit
@@ -0,0 +1,15 @@
1
+ %p Each of the following content areas will be displayed on the audit reviewer wizard.
2
+
3
+ = effective_form_with(model: [:admin, cpd_audit_level], engine: true) do |f|
4
+ = card("All Steps Content") do
5
+ = f.rich_text_area "rich_text_all_steps_audit_review_content", label: false,
6
+ hint: "displayed on all steps"
7
+
8
+ %hr
9
+
10
+ - Effective::CpdAuditReview::WIZARD_STEPS.each do |step, title|
11
+ = card("#{title} Content") do
12
+ = f.rich_text_area "rich_text_#{step}_audit_review_content", label: false,
13
+ hint: "displayed on the audit reviewer #{step} wizard step only"
14
+
15
+ = f.submit
@@ -0,0 +1,52 @@
1
+ = effective_form_with(model: [:admin, cpd_audit_level], engine: true) do |f|
2
+ = f.text_field :title, hint: 'A title for this kind of audit'
3
+
4
+ = f.select :recommendations, f.object.recommendations,
5
+ label: 'Audit Review recommendation choices', tags: true, placeholder: 'Type to add item...',
6
+ hint: 'The recommendation made by an audit reviewer when reviewing an audit. Begin typing and then press enter to add a choice'
7
+
8
+
9
+ = f.select :determinations, f.object.determinations,
10
+ label: 'Audit determination choices', tags: true, placeholder: 'Type to add item...',
11
+ hint: 'The final determination made by the auditor when closing an audit. Begin typing and then press enter to add a choice.'
12
+
13
+ %h2 Sections
14
+ %p
15
+ Please add at least one section.
16
+ Each section is a step on the audit wizard with its own content and questions.
17
+
18
+ = f.has_many :cpd_audit_level_sections, class: 'tight' do |fas|
19
+ = fas.text_field :title, label: false
20
+
21
+ %h2 Deadlines
22
+ %p.text-muted Leave blank for no deadlines
23
+ .row
24
+ .col= f.text_field :days_to_submit, label: 'Days for auditee to submit', hint: "The number of business days from the date of notification or approved extension that an auditee has to complete their submission."
25
+ .col= f.text_field :days_to_review, label: 'Days for auditor to review', hint: "The number of business days from the auditee's deadline that an auditor has to review the submission and provide a recommendation."
26
+
27
+ %h2 Workflows
28
+ %p.text-muted Each of these workflows will be displayed to the audittee and/or auditor on their wizard steps. Leave blank for no deadlines.
29
+
30
+ .row
31
+ .col
32
+ %h3 Conflict of Interest
33
+ = f.check_box :conflict_of_interest, label: 'Yes, the auditee and auditor may declare a conflict of interest with their matching'
34
+
35
+ = f.show_if :conflict_of_interest, true do
36
+ = f.text_field :days_to_declare_conflict, label: 'Days to declare conflict of interest', hint: "The number of business days from the date of notification that an auditee and auditors have to declare a conflict of interest with the matching."
37
+
38
+ .col
39
+ %h3 Exemption
40
+ = f.check_box :can_request_exemption, label: "Yes, the auditee may request an exemption<br><br>".html_safe
41
+
42
+ = f.show_if :can_request_exemption, true do
43
+ = f.text_field :days_to_request_exemption, label: 'Days to request exemption', hint: "The number of business days from the date of notification that an auditee may request an exemption."
44
+
45
+ .col
46
+ %h3 Extension
47
+ = f.check_box :can_request_extension, label: "Yes, the auditee may request an extension<br><br>"
48
+
49
+ = f.show_if :can_request_extension, true do
50
+ = f.text_field :days_to_request_extension, label: 'Days to request extension', hint: "The number of business days from the date of notification that an auditee may request an extension."
51
+
52
+ = effective_submit(f)
@@ -0,0 +1,10 @@
1
+ = effective_form_with(model: [:admin, cpd_audit_level], engine: true) do |f|
2
+ = f.fields_for :cpd_audit_level_sections, cpd_audit_level_section do |fas|
3
+ = fas.rich_text_area :top_content
4
+ = fas.rich_text_area :bottom_content
5
+
6
+ = f.submit
7
+
8
+ %h2 Questions
9
+ - datatable = Admin::EffectiveCpdAuditLevelQuestionsDatatable.new(cpd_audit_level_section_id: cpd_audit_level_section.id)
10
+ = render_datatable(datatable, inline: true, simple: true)
@@ -0,0 +1 @@
1
+ = render('effective/cpd_audit_reviews/cpd_audit_review', cpd_audit_review: cpd_audit_review)
@@ -0,0 +1,13 @@
1
+ = effective_form_with(model: [:admin, cpd_audit_review], engine: true) do |f|
2
+ - if inline_datatable?
3
+ = f.hidden_field :cpd_audit_id
4
+ = f.static_field :cpd_audit, label: 'CPD Audit'
5
+ - else
6
+ = f.select :cpd_audit_id, Effective::CpdAudit.available.sorted.all
7
+
8
+ = render('admin/cpd_audits/audit_reviewer_fields', f: f)
9
+
10
+ %p Send email
11
+ = email_form_fields(f, :cpd_audit_review_opened)
12
+
13
+ = effective_submit(f)
@@ -0,0 +1,2 @@
1
+ - collection = current_user.class.send(EffectiveCpd.audit_reviewer_user_scope)
2
+ = f.select :user, { 'Audit Reviewers' => collection }, label: 'Audit Reviewer', polymorphic: true
@@ -0,0 +1,2 @@
1
+ - collection = current_user.class.send(EffectiveCpd.auditee_user_scope)
2
+ = f.select :user, { 'Auditees' => collection }, label: 'Auditee', polymorphic: true
@@ -0,0 +1,46 @@
1
+ = tabs do
2
+ - if cpd_audit.new_record?
3
+ = tab 'New Audit' do
4
+ = render 'admin/cpd_audits/form_new', cpd_audit: cpd_audit
5
+
6
+ - if cpd_audit.persisted?
7
+ - if cpd_audit.completed?
8
+ = tab 'Audit' do
9
+ = render 'effective/cpd_audits/cpd_audit', cpd_audit: cpd_audit
10
+
11
+ = tab 'Status' do
12
+ = render 'admin/cpd_audits/status', cpd_audit: cpd_audit
13
+ - else
14
+ = tab 'Status' do
15
+ = render 'admin/cpd_audits/status', cpd_audit: cpd_audit
16
+
17
+ = tab 'Audit' do
18
+ = render 'effective/cpd_audits/cpd_audit', cpd_audit: cpd_audit
19
+
20
+ = tab 'Statements' do
21
+ - datatable = Admin::EffectiveCpdStatementsDatatable.new(user_id: cpd_audit.user.id, user_type: cpd_audit.user.class.name)
22
+ = render_datatable(datatable, inline: true, simple: true)
23
+
24
+ = tab 'Audit Reviews' do
25
+ - datatable = Admin::EffectiveCpdAuditReviewsDatatable.new(cpd_audit_id: cpd_audit.id)
26
+ = render_datatable(datatable, inline: true, simple: true)
27
+
28
+ - unless cpd_audit.closed?
29
+ = tab 'Determination' do
30
+ = render 'admin/cpd_audits/form_determination', cpd_audit: cpd_audit
31
+
32
+ - if cpd_audit.conflicted?
33
+ = tab 'Process Conflict of Interest' do
34
+ = render 'admin/cpd_audits/form_conflict', cpd_audit: cpd_audit
35
+
36
+ - if cpd_audit.exemption_requested?
37
+ = tab 'Process Exemption Request' do
38
+ = render 'admin/cpd_audits/form_exemption', cpd_audit: cpd_audit
39
+
40
+ - if cpd_audit.extension_requested?
41
+ = tab 'Process Extension Request' do
42
+ = render 'admin/cpd_audits/form_extension', cpd_audit: cpd_audit
43
+
44
+ - if cpd_audit.respond_to?(:log_changes_datatable)
45
+ = tab 'Logs' do
46
+ = render_inline_datatable(cpd_audit.log_changes_datatable)