effective_cpd 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +17 -9
- data/app/helpers/effective_cpd_helper.rb +10 -0
- data/app/models/effective/cpd_cycle.rb +8 -2
- data/app/models/effective/cpd_rule.rb +9 -4
- data/app/views/admin/cpd_cycles/_form_content.html.haml +8 -0
- data/app/views/admin/cpd_cycles/_form_cpd_rules.html.haml +3 -3
- data/app/views/effective/cpd_statements/_activities_new.html.haml +1 -0
- data/app/views/effective/cpd_statements/_layout.html.haml +2 -0
- data/app/views/effective/cpd_statements/submit.html.haml +1 -2
- data/db/seeds.rb +13 -13
- data/lib/effective_cpd/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '09c97e5c49d9195e2b402e395d3039510de53b4dda1503ad052af6e7dc28221b'
|
4
|
+
data.tar.gz: 24f617a5dd535b960ef3d9056956395f647a4a5581613014f8786b7d850b521e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e0d0aa17d7b171d1226a40852f79f8440a271cb7bd451bce1260887be7a2c722409d9d8fe4e96a1337e1911935985ef3b737e0cf75807e911714f945637afb3d
|
7
|
+
data.tar.gz: 46744c3a3cbd29b133958be01a375238c0e8d413ba9e64eb0e020fdae9505af907e03c3257d93cecd13df534c9dd7bedd309d58a9052596aad5552161b1aa9ff
|
data/README.md
CHANGED
@@ -144,18 +144,26 @@ You can also programatically do it. Add the following to your user class.
|
|
144
144
|
# This is an ActiveRecord concern to add the has_many :cpd_statements
|
145
145
|
effective_cpd_user
|
146
146
|
|
147
|
-
#
|
148
|
-
# Must be 100 points in the last 3 years. Can submit 0 0 100 or 33 33 34
|
147
|
+
# We require 100 points in the last 3 years.
|
149
148
|
def cpd_statement_required_score(cpd_statement)
|
150
|
-
#
|
151
|
-
|
152
|
-
|
149
|
+
# We always consider the 3 year window, of the passed cpd_statement and the last two statements
|
150
|
+
last_two_statements = cpd_statements.select do |statement|
|
151
|
+
statement.completed? && statement.cpd_cycle_id < cpd_statement.cpd_cycle_id
|
152
|
+
end.last(2)
|
153
153
|
|
154
|
-
|
155
|
-
|
156
|
-
return 0 if existing >= 100
|
154
|
+
# They can submit 0 0 100
|
155
|
+
return 0 if last_two_statements.length < 2
|
157
156
|
|
158
|
-
|
157
|
+
# 100 points in the last 3 years.
|
158
|
+
required_score = 100
|
159
|
+
|
160
|
+
# Score so far
|
161
|
+
existing_score = last_two_statements.sum { |statement| statement.score }
|
162
|
+
raise('expected existing_score to be >= 0') if existing_score < 0
|
163
|
+
|
164
|
+
# Required score minus previous
|
165
|
+
return 0 if existing_score >= required_score
|
166
|
+
(required_score - existing_score)
|
159
167
|
end
|
160
168
|
```
|
161
169
|
|
@@ -30,6 +30,16 @@ module EffectiveCpdHelper
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
+
def cpd_statement_submit_label(cpd_statement)
|
34
|
+
label = "Yes, I understand I will not be able to submit more #{cpd_credits_label} or modify any of my activities for this #{cpd_cycle_label}, once I submit."
|
35
|
+
|
36
|
+
if (end_at = cpd_statement.cpd_cycle.end_at).present?
|
37
|
+
label += " The last date to submit this form is #{end_at.strftime("%B %d, %Y")}."
|
38
|
+
end
|
39
|
+
|
40
|
+
label
|
41
|
+
end
|
42
|
+
|
33
43
|
def effective_cpd_categories
|
34
44
|
@effective_cpd_categories ||= Effective::CpdCategory.deep.sorted
|
35
45
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module Effective
|
2
2
|
class CpdCycle < ActiveRecord::Base
|
3
3
|
has_rich_text :all_steps_content # Update build_from_cycle() below if these change
|
4
|
+
has_rich_text :sidebar_content
|
4
5
|
has_rich_text :start_content
|
5
6
|
has_rich_text :activities_content
|
6
7
|
has_rich_text :agreements_content
|
@@ -29,6 +30,7 @@ module Effective
|
|
29
30
|
|
30
31
|
scope :deep, -> {
|
31
32
|
with_rich_text_all_steps_content
|
33
|
+
.with_rich_text_sidebar_content
|
32
34
|
.with_rich_text_start_content
|
33
35
|
.with_rich_text_activities_content
|
34
36
|
.with_rich_text_submit_content
|
@@ -76,13 +78,17 @@ module Effective
|
|
76
78
|
attributes = cycle.dup.attributes.except('title', 'token', 'start_at', 'end_at')
|
77
79
|
assign_attributes(attributes)
|
78
80
|
|
79
|
-
[:all_steps_content, :start_content, :activities_content, :submit_content, :complete_content].each do |rich_text|
|
81
|
+
[:all_steps_content, :sidebar_content, :start_content, :activities_content, :submit_content, :complete_content].each do |rich_text|
|
80
82
|
self.send("#{rich_text}=", cycle.send(rich_text))
|
81
83
|
end
|
82
84
|
|
83
85
|
cycle.cpd_rules.each do |rule|
|
84
86
|
attributes = rule.dup.attributes.except('cpd_cycle_id')
|
85
|
-
self.cpd_rules.build(attributes)
|
87
|
+
cpd_rule = self.cpd_rules.build(attributes)
|
88
|
+
|
89
|
+
if rule.category?
|
90
|
+
cpd_rule.category_credit_description = rule.category_credit_description
|
91
|
+
end
|
86
92
|
end
|
87
93
|
|
88
94
|
self
|
@@ -3,6 +3,9 @@ module Effective
|
|
3
3
|
belongs_to :cpd_cycle
|
4
4
|
belongs_to :ruleable, polymorphic: true # Activity or Category
|
5
5
|
|
6
|
+
# For a Category: A maximum of 35 PDHs/year may be claimed in the Contributions to Knowledge category
|
7
|
+
has_rich_text :category_credit_description
|
8
|
+
|
6
9
|
if respond_to?(:log_changes)
|
7
10
|
log_changes(to: :cpd_cycle)
|
8
11
|
end
|
@@ -12,7 +15,6 @@ module Effective
|
|
12
15
|
|
13
16
|
effective_resource do
|
14
17
|
# A plaintext description of the formula
|
15
|
-
# For a Category: A maximum of 35 PDHs/year may be claimed in the Contributions to Knowledge category
|
16
18
|
# For a Activity: 15 hours of work equals 1 credit
|
17
19
|
credit_description :text
|
18
20
|
|
@@ -23,6 +25,7 @@ module Effective
|
|
23
25
|
formula :string
|
24
26
|
|
25
27
|
# Maximum number of cycles can carry forward
|
28
|
+
# Only considered for activities
|
26
29
|
max_cycles_can_carry_forward :integer
|
27
30
|
|
28
31
|
# Cannot be entered in this cycle
|
@@ -31,19 +34,21 @@ module Effective
|
|
31
34
|
timestamps
|
32
35
|
end
|
33
36
|
|
34
|
-
scope :deep, -> { includes(:cpd_cycle, :ruleable) }
|
37
|
+
scope :deep, -> { with_rich_text_category_credit_description.includes(:cpd_cycle, :ruleable) }
|
35
38
|
scope :categories, -> { where(ruleable_type: 'Effective::CpdCategory') }
|
36
39
|
scope :activities, -> { where(ruleable_type: 'Effective::CpdActivity') }
|
37
40
|
scope :unavailable, -> { where(unavailable: true) }
|
38
41
|
|
39
42
|
#validates :cpd_cycle_id, uniqueness: { scope: [:ruleable_id, :ruleable_type] }
|
40
|
-
validates :credit_description, presence: true
|
41
43
|
validates :max_credits_per_cycle, numericality: { greater_than: 0, allow_nil: true }
|
42
|
-
validates :max_cycles_can_carry_forward, numericality: {
|
44
|
+
validates :max_cycles_can_carry_forward, numericality: { greater_than_or_equal_to: 0, allow_nil: true }
|
43
45
|
|
44
46
|
validates :formula, presence: true, if: -> { activity? }
|
45
47
|
validates :formula, absence: true, if: -> { category? }
|
46
48
|
|
49
|
+
validates :credit_description, presence: true, if: -> { activity? }
|
50
|
+
validates :category_credit_description, presence: true, if: -> { category? }
|
51
|
+
|
47
52
|
validate(if: -> { formula.present? }) do
|
48
53
|
if formula.gsub('amount2', '').gsub('amount', '').gsub(' ', '').match(INVALID_FORMULA_CHARS).present?
|
49
54
|
self.errors.add(:formula, "may only contain amount, amount2 and 0-9 + - / * ( ) characters")
|
@@ -1,9 +1,17 @@
|
|
1
1
|
= effective_form_with(model: [:admin, cpd_cycle], engine: true) do |f|
|
2
|
+
%h2 All Steps Content
|
3
|
+
|
2
4
|
.card.mb-4
|
3
5
|
.card-body
|
4
6
|
%h5.card-title All Steps Content
|
5
7
|
= f.rich_text_area :all_steps_content, label: false, hint: 'displayed on all statement steps'
|
6
8
|
|
9
|
+
.card.mb-4
|
10
|
+
.card-body
|
11
|
+
%h5.card-title Sidebar Content
|
12
|
+
= f.rich_text_area :sidebar_content, label: false, hint: 'displayed on the sidebar on all statement steps'
|
13
|
+
|
14
|
+
%h2 Individual Steps Content
|
7
15
|
.card.mb-4
|
8
16
|
.card-body
|
9
17
|
%h5.card-title Start Step
|
@@ -10,8 +10,8 @@
|
|
10
10
|
label: "Max #{cpd_credits_label} per #{cpd_cycle_label}",
|
11
11
|
hint: "The maximum number of #{cpd_credits_label} that may be earned in this category for this #{cpd_cycle_label}. Leave blank for no limit."
|
12
12
|
|
13
|
-
= fc.
|
14
|
-
hint: "A
|
13
|
+
= fc.rich_text_area :category_credit_description,
|
14
|
+
hint: "A description of the maximum #{cpd_credits_label} and carry forward policy of activities for this category"
|
15
15
|
|
16
16
|
= fc.check_box :unavailable, label: "Unavailable in this #{cpd_cycle_label}"
|
17
17
|
|
@@ -49,7 +49,7 @@
|
|
49
49
|
|
50
50
|
= fa.number_field :max_cycles_can_carry_forward,
|
51
51
|
label: "Max #{cpd_cycles_label} can carry forward",
|
52
|
-
hint: "leave blank for no limit"
|
52
|
+
hint: "leave blank for no limit. enter zero for no carry forward."
|
53
53
|
|
54
54
|
= fa.check_box :unavailable, label: "Unavailable in this #{cpd_cycle_label}"
|
55
55
|
|
@@ -14,7 +14,6 @@
|
|
14
14
|
= effective_form_with(model: resource, url: wizard_path(step), method: :put) do |f|
|
15
15
|
= f.hidden_field :current_step
|
16
16
|
|
17
|
-
= f.check_box :confirm_readonly,
|
18
|
-
label: 'Yes, I understand that I will not be able to modify this statement after submission'
|
17
|
+
= f.check_box :confirm_readonly, label: cpd_statement_submit_label(f.object)
|
19
18
|
|
20
19
|
= f.submit 'Submit Statement', center: true
|
data/db/seeds.rb
CHANGED
@@ -9,7 +9,6 @@ if Rails.env.test?
|
|
9
9
|
Effective::CpdRule.delete_all
|
10
10
|
|
11
11
|
ActionText::RichText.where(record_type: ['Effective::CpdCycle', 'Effective::CpdCycle', 'Effective::CpdActivity', 'Effective::CpdAudit', 'Effective::CpdAuditLevelSection', 'Effective::CpdAuditLevelQuestion']).delete_all
|
12
|
-
|
13
12
|
end
|
14
13
|
|
15
14
|
# Build the first CpdCycle
|
@@ -18,11 +17,12 @@ cycle = Effective::CpdCycle.create!(
|
|
18
17
|
start_at: now.beginning_of_year,
|
19
18
|
end_at: now.end_of_year,
|
20
19
|
required_score: 100,
|
21
|
-
all_steps_content: "
|
22
|
-
start_content: "
|
23
|
-
activities_content: "
|
24
|
-
submit_content: "
|
25
|
-
complete_content: "
|
20
|
+
all_steps_content: "All Steps Content",
|
21
|
+
start_content: "Start Content",
|
22
|
+
activities_content: "Activities Content",
|
23
|
+
submit_content: "Submit Content",
|
24
|
+
complete_content: "Complete Content",
|
25
|
+
sidebar_content: "Sidebar Content"
|
26
26
|
)
|
27
27
|
|
28
28
|
# Professional Practice
|
@@ -33,7 +33,7 @@ category = Effective::CpdCategory.create!(
|
|
33
33
|
Effective::CpdRule.create!(
|
34
34
|
cpd_cycle: cycle,
|
35
35
|
ruleable: category,
|
36
|
-
|
36
|
+
category_credit_description: 'Upto a maximum of 20 claimable points per CPD year. Points cannot be carried forward to future years.',
|
37
37
|
max_credits_per_cycle: 20
|
38
38
|
)
|
39
39
|
|
@@ -74,7 +74,7 @@ category = Effective::CpdCategory.create!(
|
|
74
74
|
Effective::CpdRule.create!(
|
75
75
|
cpd_cycle: cycle,
|
76
76
|
ruleable: category,
|
77
|
-
|
77
|
+
category_credit_description: 'Upto a maximum of 20 claimable points per CPD year. Points cannot be carried forward to future years.',
|
78
78
|
max_credits_per_cycle: 20
|
79
79
|
)
|
80
80
|
|
@@ -144,7 +144,7 @@ category = Effective::CpdCategory.create!(
|
|
144
144
|
Effective::CpdRule.create!(
|
145
145
|
cpd_cycle: cycle,
|
146
146
|
ruleable: category,
|
147
|
-
|
147
|
+
category_credit_description: 'Upto a maximum of 35 claimable points per CPD year. Points may be carried over upto a maximum of 2 years after the year in which they were earned.',
|
148
148
|
max_credits_per_cycle: 35
|
149
149
|
)
|
150
150
|
|
@@ -183,7 +183,7 @@ category = Effective::CpdCategory.create!(
|
|
183
183
|
Effective::CpdRule.create!(
|
184
184
|
cpd_cycle: cycle,
|
185
185
|
ruleable: category,
|
186
|
-
|
186
|
+
category_credit_description: 'Upto a maximum of 15 claimable points per CPD year. Points may be carried over upto a maximum of 2 years after the year in which they were earned.',
|
187
187
|
max_credits_per_cycle: 15
|
188
188
|
)
|
189
189
|
|
@@ -265,7 +265,7 @@ category = Effective::CpdCategory.create!(
|
|
265
265
|
Effective::CpdRule.create!(
|
266
266
|
cpd_cycle: cycle,
|
267
267
|
ruleable: category,
|
268
|
-
|
268
|
+
category_credit_description: 'Upto a maximum of 15 claimable points per CPD year. Points may be carried over upto a maximum of 2 years after the year in which they were earned.',
|
269
269
|
max_credits_per_cycle: 15
|
270
270
|
)
|
271
271
|
|
@@ -319,7 +319,7 @@ category = Effective::CpdCategory.create!(
|
|
319
319
|
Effective::CpdRule.create!(
|
320
320
|
cpd_cycle: cycle,
|
321
321
|
ruleable: category,
|
322
|
-
|
322
|
+
category_credit_description: 'Upto a maximum of 30 claimable points per CPD year. Points may be carried over upto a maximum of 2 years after the year in which they were earned.',
|
323
323
|
max_credits_per_cycle: 30
|
324
324
|
)
|
325
325
|
|
@@ -421,7 +421,7 @@ category = Effective::CpdCategory.create!(
|
|
421
421
|
Effective::CpdRule.create!(
|
422
422
|
cpd_cycle: cycle,
|
423
423
|
ruleable: category,
|
424
|
-
|
424
|
+
category_credit_description: 'Upto a maximum of 10 points per mentee or position per CPD year. Points may be carried over upto a maximum of 2 years after the year in which they were earned.',
|
425
425
|
max_credits_per_cycle: nil
|
426
426
|
)
|
427
427
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: effective_cpd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Code and Effect
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-05-
|
11
|
+
date: 2021-05-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|