effective_cpd 0.5.4 → 0.6.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aa9017248147c4af300594830ead405a65e2730a927643b17c4305e2b4bfed14
4
- data.tar.gz: e7b981130d75f07009ab9e9230124a4fc8a7945d90d8762b372cdca52d76ecc0
3
+ metadata.gz: 2a95ee01fbfe7c486fd9ad091133538b2b8403c30783b0cb6a43b46f01c74ada
4
+ data.tar.gz: 2906c5e7b24e4cce48178461b8604f022f4a80b13eced676d5780f2ef193859e
5
5
  SHA512:
6
- metadata.gz: 6e8dd1a783788c1a236b152758ebc10a67f2dcc3d6a3ea23e110400be6314b50a7774de677535fccdd57ef3612f08acfeadea3c475de35ff0c8ac2249b03dc00
7
- data.tar.gz: 40c86b4159c7ed278fbbf4eeb2197b0b5d5c4e6333c6d06e644589c80ab3699d88eba75b9a07c2d37de79651441374b57a5d9dc8c8814b3f2f5ec157bbff6886
6
+ metadata.gz: 6c9ebe344d70ad88cada7edf2588cf3a1f3da7a180e28acfa3d383974611d117b7cba60ab3511339777736005489cc5c23cd6874455ea0b92a3c8ac6ac4249a0
7
+ data.tar.gz: fedf95f5ea68064701da0a05e573608c8547c4ad5d6a13b70ed6ebd7802d5ef8639aeaf538147dade3f281273212479f012e0716dc2d8264b2a72f2a9d55b00a
@@ -5,6 +5,8 @@ module Admin
5
5
 
6
6
  include Effective::CrudController
7
7
 
8
+ page_title(only: :index) { "#{EffectiveCpd.program_label} Statement Activities" }
9
+
8
10
  # def permitted_params
9
11
  # params.require(:effective_cpd_statement).permit!
10
12
  # end
@@ -5,9 +5,17 @@ module Admin
5
5
 
6
6
  include Effective::CrudController
7
7
 
8
- # def permitted_params
9
- # params.require(:effective_cpd_statement).permit!
10
- # end
8
+ resource_scope -> { EffectiveCpd.CpdStatement.deep.all }
9
+ datatable -> { Admin::EffectiveCpdStatementsDatatable.new }
10
+
11
+ page_title(only: :index) { "#{EffectiveCpd.program_label} Statements" }
12
+
13
+ private
14
+
15
+ def permitted_params
16
+ model = (params.key?(:effective_cpd_statement) ? :effective_cpd_statement : :cpd_statement)
17
+ params.require(model).permit!
18
+ end
11
19
 
12
20
  end
13
21
  end
@@ -7,7 +7,7 @@ module Effective
7
7
  cycle = Effective::CpdCycle.find(params[:id])
8
8
  EffectiveResources.authorize!(self, :show, cycle)
9
9
 
10
- statement = Effective::CpdStatement.where(cpd_cycle: cycle, user: current_user).first
10
+ statement = EffectiveCpd.CpdStatement.where(cpd_cycle: cycle, user: current_user).first
11
11
 
12
12
  if statement.present?
13
13
  redirect_to effective_cpd.cpd_cycle_cpd_statement_build_path(cycle, statement, statement.next_step)
@@ -4,7 +4,7 @@ module Effective
4
4
 
5
5
  include Effective::CrudController
6
6
 
7
- resource_scope -> { CpdStatement.find(params[:cpd_statement_id]).cpd_statement_activities }
7
+ resource_scope -> { EffectiveCpd.CpdStatement.find(params[:cpd_statement_id]).cpd_statement_activities }
8
8
 
9
9
  # Score all statements when we change any activity
10
10
  after_save do
@@ -7,7 +7,7 @@ module Effective
7
7
 
8
8
  resource_scope do
9
9
  cycle = Effective::CpdCycle.find(params[:cpd_cycle_id])
10
- Effective::CpdStatement.deep.where(cpd_cycle: cycle, user: current_user)
10
+ EffectiveCpd.CpdStatement.deep.where(cpd_cycle: cycle, user: current_user)
11
11
  end
12
12
 
13
13
  after_save(if: -> { step == :start }) do
@@ -16,8 +16,7 @@ module Effective
16
16
 
17
17
  # Enforce one statement per user per cycle. Redirect them to an existing statement for this cycle.
18
18
  before_action(only: [:new, :show]) do
19
- cycle = Effective::CpdCycle.find(params[:cpd_cycle_id])
20
- existing = Effective::CpdStatement.where(cpd_cycle: cycle, user: current_user).where.not(id: resource).first
19
+ existing = resource_scope.where.not(id: resource).first
21
20
 
22
21
  if existing.present?
23
22
  redirect_to effective_cpd.cpd_cycle_cpd_statement_build_path(existing.cpd_cycle, existing, existing.next_step)
@@ -44,17 +43,16 @@ module Effective
44
43
  end
45
44
 
46
45
  def permitted_params
46
+ model = (params.key?(:effective_cpd_statement) ? :effective_cpd_statement : :cpd_statement)
47
47
  case step
48
48
  when :start
49
- params.require(:effective_cpd_statement).permit(:current_step)
49
+ params.require(model).permit(:current_step)
50
50
  when :activities
51
- params.require(:effective_cpd_statement).permit(:current_step)
51
+ params.require(model).permit(:current_step)
52
52
  when :agreements
53
- params.require(:effective_cpd_statement).permit(
54
- :current_step, :confirm_read, :confirm_factual, files: []
55
- )
53
+ params.require(model).permit(:current_step, :confirm_read, :confirm_factual, files: [])
56
54
  when :submit
57
- params.require(:effective_cpd_statement).permit(:current_step, :confirm_readonly)
55
+ params.require(model).permit(:current_step, :confirm_readonly)
58
56
  when :complete
59
57
  raise('unexpected post to complete')
60
58
  else
@@ -36,7 +36,7 @@ module Admin
36
36
  end
37
37
 
38
38
  collection do
39
- Effective::CpdStatement.all.deep
39
+ EffectiveCpd.CpdStatement.all.deep
40
40
  end
41
41
  end
42
42
  end
@@ -10,7 +10,7 @@ class EffectiveCpdAvailableCyclesDatatable < Effective::Datatable
10
10
  col :available_date, label: 'Available'
11
11
 
12
12
  col :required_score, label: 'Required' do |cpd_cycle|
13
- cpd_statement = Effective::CpdStatement.new(cpd_cycle: cpd_cycle, user: current_user)
13
+ cpd_statement = EffectiveCpd.CpdStatement.new(cpd_cycle: cpd_cycle, user: current_user)
14
14
  cpd_score(cpd_statement.required_score || cpd_statement.targeted_score)
15
15
  end
16
16
 
@@ -27,7 +27,7 @@ class EffectiveCpdAvailableCyclesDatatable < Effective::Datatable
27
27
 
28
28
  collection do
29
29
  raise('expected a current_user') unless current_user.present?
30
- completed = Effective::CpdStatement.completed.where(user: current_user)
30
+ completed = EffectiveCpd.CpdStatement.completed.where(user: current_user)
31
31
  Effective::CpdCycle.available.where.not(id: completed.select('cpd_cycle_id as id'))
32
32
  end
33
33
 
@@ -27,7 +27,8 @@ class EffectiveCpdCompletedStatementsDatatable < Effective::Datatable
27
27
  collection do
28
28
  raise('expected a current_user') unless current_user.present?
29
29
  user = (current_user.class.find(attributes[:user_id]) if attributes[:user_id])
30
- Effective::CpdStatement.completed.where(user: user || current_user).includes(:cpd_cycle)
30
+
31
+ EffectiveCpd.CpdStatement.completed.where(user: user || current_user).includes(:cpd_cycle)
31
32
  end
32
33
 
33
34
  end
@@ -0,0 +1,151 @@
1
+ # frozen_string_literal: true
2
+
3
+ # EffectiveCpdStatement
4
+ #
5
+ # Mark your owner model with effective_cpd_statement to get all the includes
6
+
7
+ module EffectiveCpdStatement
8
+ extend ActiveSupport::Concern
9
+
10
+ module Base
11
+ def effective_cpd_statement
12
+ include ::EffectiveCpdStatement
13
+ end
14
+ end
15
+
16
+ module ClassMethods
17
+ def effective_cpd_statement?; true; end
18
+ end
19
+
20
+ included do
21
+ acts_as_tokened
22
+
23
+ acts_as_wizard(
24
+ start: 'Start',
25
+ activities: 'Enter Activities',
26
+ agreements: 'Sign Agreements',
27
+ submit: 'Confirm & Submit',
28
+ complete: 'Complete'
29
+ )
30
+
31
+ log_changes(except: :wizard_steps) if respond_to?(:log_changes)
32
+
33
+ has_many_attached :files
34
+
35
+ attr_accessor :current_user
36
+ attr_accessor :current_step
37
+
38
+ # App scoped
39
+ belongs_to :user, polymorphic: true
40
+
41
+ # Effective Namespace
42
+ belongs_to :cpd_cycle, class_name: 'Effective::CpdCycle'
43
+
44
+ has_many :cpd_statement_activities, -> { order(:id) }, inverse_of: :cpd_statement, dependent: :destroy, class_name: 'Effective::CpdStatementActivity'
45
+ accepts_nested_attributes_for :cpd_statement_activities
46
+
47
+ effective_resource do
48
+ score :integer
49
+
50
+ confirm_read :boolean
51
+ confirm_factual :boolean
52
+ confirm_readonly :boolean
53
+
54
+ submitted_at :datetime, permitted: false
55
+
56
+ # Acts as tokened
57
+ token :string, permitted: false
58
+
59
+ # Acts as Wizard
60
+ wizard_steps :text, permitted: false
61
+
62
+ timestamps
63
+ end
64
+
65
+ scope :deep, -> { includes(:cpd_cycle, :user, cpd_statement_activities: [:files_attachments, :cpd_category, :original, cpd_activity: [:rich_text_body]]) }
66
+ scope :sorted, -> { order(:cpd_cycle_id) }
67
+
68
+ scope :draft, -> { where(submitted_at: nil) }
69
+ scope :completed, -> { where.not(submitted_at: nil) }
70
+
71
+ before_validation(if: -> { new_record? }) do
72
+ self.user ||= current_user
73
+ self.score ||= 0
74
+ end
75
+
76
+ validate(if: -> { completed? }) do
77
+ min = required_score() || 0.0
78
+ self.errors.add(:score, "must be #{min} or greater to submit a statement") if score < min
79
+ end
80
+
81
+ with_options(if: -> { current_step == :agreements }) do
82
+ validates :confirm_read, acceptance: true
83
+ validates :confirm_factual, acceptance: true
84
+ end
85
+
86
+ with_options(if: -> { current_step == :submit}) do
87
+ validates :confirm_readonly, acceptance: true
88
+ end
89
+ end
90
+
91
+ def to_s
92
+ cpd_cycle.present? ? "#{cpd_cycle} Statement" : 'statement'
93
+ end
94
+
95
+ def import!(date: nil)
96
+ date ||= Time.zone.now
97
+
98
+ wizard_steps[:start] ||= date
99
+ wizard_steps[:activities] ||= date
100
+ cpd_statement_activities.each { |activity| activity.importing = true }
101
+
102
+ save!
103
+ end
104
+
105
+ # This is the review step where they click Submit Ballot
106
+ def submit!
107
+ wizard_steps[:complete] ||= Time.zone.now
108
+
109
+ update!(submitted_at: Time.zone.now)
110
+ end
111
+
112
+ # Called by admin only. This is an exceptional action
113
+ def unsubmit!
114
+ update!(wizard_steps: {}, submitted_at: nil, confirm_readonly: nil)
115
+ end
116
+
117
+ def in_progress?
118
+ submitted_at.blank?
119
+ end
120
+
121
+ def completed?
122
+ submitted_at.present?
123
+ end
124
+ alias_method :submitted?, :completed?
125
+
126
+ def required_score
127
+ required_by_cycle = cpd_cycle&.required_score
128
+ required_by_user = user.cpd_statement_required_score(self) if user.respond_to?(:cpd_statement_required_score)
129
+
130
+ [required_by_cycle, required_by_user].compact.max
131
+ end
132
+
133
+ def targeted_score
134
+ targeted_by_cycle = cpd_cycle&.targeted_score
135
+ targeted_by_user = user.cpd_statement_targeted_score(self) if user.respond_to?(:cpd_statement_targeted_score)
136
+
137
+ [targeted_by_cycle, targeted_by_user].compact.max
138
+ end
139
+
140
+ def carry_forward
141
+ cpd_statement_activities.sum { |activity| activity.carry_forward || BigDecimal(0) }.to_d
142
+ end
143
+
144
+ # {category_id => 20, category_id => 15}
145
+ def score_per_category
146
+ @score_per_category ||= Hash.new(BigDecimal(0)).tap do |scores|
147
+ cpd_statement_activities.each { |activity| scores[activity.cpd_category_id] += activity.score.to_d }
148
+ end
149
+ end
150
+
151
+ end
@@ -13,7 +13,10 @@ module EffectiveCpdUser
13
13
  end
14
14
 
15
15
  included do
16
- has_many :cpd_statements, -> { Effective::CpdStatement.sorted }, inverse_of: :user, class_name: 'Effective::CpdStatement'
16
+ # App Scoped
17
+ has_many :cpd_statements, -> { order(:cpd_cycle_id) }, inverse_of: :user
18
+
19
+ # Effective
17
20
  has_many :cpd_audits, -> { Effective::CpdAudit.sorted }, inverse_of: :user, class_name: 'Effective::CpdAudit'
18
21
  has_many :cpd_audit_reviews, -> { Effective::CpdAuditReview.sorted }, inverse_of: :user, class_name: 'Effective::CpdAuditReview'
19
22
 
@@ -4,10 +4,10 @@ module Effective
4
4
 
5
5
  def initialize(user:, from: nil)
6
6
  @cycles = CpdCycle.deep.sorted.all
7
- @statements = CpdStatement.deep.where(user: user).sorted.all
7
+ @statements = EffectiveCpd.CpdStatement.deep.where(user: user).sorted.all
8
8
 
9
9
  if from.present?
10
- raise('expected from to be a CpdStatement') unless from.kind_of?(CpdStatement)
10
+ raise('expected from to be a CpdStatement') unless from.class.respond_to?(:effective_cpd_statement?)
11
11
  @statements = @statements.where('cpd_cycle_id >= ?', from.cpd_cycle_id)
12
12
  end
13
13
 
@@ -43,7 +43,7 @@ module Effective
43
43
  protected
44
44
 
45
45
  def save!
46
- CpdStatement.transaction do
46
+ EffectiveCpd.CpdStatement.transaction do
47
47
  @statements.each { |statement| statement.save! }; true
48
48
  end
49
49
  end
@@ -1,132 +1,5 @@
1
1
  module Effective
2
2
  class CpdStatement < ActiveRecord::Base
3
- attr_accessor :current_user
4
- attr_accessor :current_step
5
-
6
- belongs_to :cpd_cycle
7
- belongs_to :user, polymorphic: true
8
-
9
- has_many :cpd_statement_activities, -> { order(:id) }, inverse_of: :cpd_statement, dependent: :destroy
10
- accepts_nested_attributes_for :cpd_statement_activities
11
-
12
- has_many_attached :files
13
-
14
- if respond_to?(:log_changes)
15
- log_changes(except: [:wizard_steps])
16
- end
17
-
18
- acts_as_tokened
19
-
20
- acts_as_wizard(
21
- start: 'Start',
22
- activities: 'Enter Activities',
23
- agreements: 'Sign Agreements',
24
- submit: 'Confirm & Submit',
25
- complete: 'Complete'
26
- )
27
-
28
- effective_resource do
29
- score :integer
30
-
31
- confirm_read :boolean
32
- confirm_factual :boolean
33
- confirm_readonly :boolean
34
-
35
- submitted_at :datetime, permitted: false
36
-
37
- # Acts as tokened
38
- token :string, permitted: false
39
-
40
- # Acts as Wizard
41
- wizard_steps :text, permitted: false
42
-
43
- timestamps
44
- end
45
-
46
- scope :deep, -> { includes(:cpd_cycle, :user, cpd_statement_activities: [:files_attachments, :cpd_category, :original, cpd_activity: [:rich_text_body]]) }
47
- scope :sorted, -> { order(:cpd_cycle_id) }
48
-
49
- scope :draft, -> { where(submitted_at: nil) }
50
- scope :completed, -> { where.not(submitted_at: nil) }
51
-
52
- before_validation(if: -> { new_record? }) do
53
- self.user ||= current_user
54
- self.score ||= 0
55
- end
56
-
57
- validate(if: -> { completed? }) do
58
- min = required_score() || 0.0
59
- self.errors.add(:score, "must be #{min} or greater to submit a statement") if score < min
60
- end
61
-
62
- with_options(if: -> { current_step == :agreements }) do
63
- validates :confirm_read, acceptance: true
64
- validates :confirm_factual, acceptance: true
65
- end
66
-
67
- with_options(if: -> { current_step == :submit}) do
68
- validates :confirm_readonly, acceptance: true
69
- end
70
-
71
- def to_s
72
- cpd_cycle.present? ? "#{cpd_cycle} Statement" : 'statement'
73
- end
74
-
75
- def import!(date: nil)
76
- date ||= Time.zone.now
77
-
78
- wizard_steps[:start] ||= date
79
- wizard_steps[:activities] ||= date
80
- cpd_statement_activities.each { |activity| activity.importing = true }
81
-
82
- save!
83
- end
84
-
85
- # This is the review step where they click Submit Ballot
86
- def submit!
87
- wizard_steps[:complete] ||= Time.zone.now
88
-
89
- update!(submitted_at: Time.zone.now)
90
- end
91
-
92
- # Called by admin only. This is an exceptional action
93
- def unsubmit!
94
- update!(wizard_steps: {}, submitted_at: nil, confirm_readonly: nil)
95
- end
96
-
97
- def in_progress?
98
- submitted_at.blank?
99
- end
100
-
101
- def completed?
102
- submitted_at.present?
103
- end
104
- alias_method :submitted?, :completed?
105
-
106
- def required_score
107
- required_by_cycle = cpd_cycle&.required_score
108
- required_by_user = user.cpd_statement_required_score(self) if user.respond_to?(:cpd_statement_required_score)
109
-
110
- [required_by_cycle, required_by_user].compact.max
111
- end
112
-
113
- def targeted_score
114
- targeted_by_cycle = cpd_cycle&.targeted_score
115
- targeted_by_user = user.cpd_statement_targeted_score(self) if user.respond_to?(:cpd_statement_targeted_score)
116
-
117
- [targeted_by_cycle, targeted_by_user].compact.max
118
- end
119
-
120
- def carry_forward
121
- cpd_statement_activities.sum { |activity| activity.carry_forward || BigDecimal(0) }.to_d
122
- end
123
-
124
- # {category_id => 20, category_id => 15}
125
- def score_per_category
126
- @score_per_category ||= Hash.new(BigDecimal(0)).tap do |scores|
127
- cpd_statement_activities.each { |activity| scores[activity.cpd_category_id] += activity.score.to_d }
128
- end
129
- end
130
-
3
+ effective_cpd_statement
131
4
  end
132
5
  end
@@ -11,7 +11,7 @@ module Effective
11
11
  belongs_to :cpd_cycle
12
12
  belongs_to :user, polymorphic: true
13
13
 
14
- belongs_to :original, class_name: 'CpdStatementActivity', optional: true # If this is a Carryover, the original_statement_activity will be set.
14
+ belongs_to :original, class_name: 'Effective::CpdStatementActivity', optional: true # If this is a Carryover, the original_statement_activity will be set.
15
15
  #has_many :carried, class_name: 'CpdStatementActivity', foreign_key: 'original_id', dependent: :delete_all
16
16
 
17
17
  has_many_attached :files
@@ -41,8 +41,8 @@ module Effective
41
41
  scope :deep, -> { includes(:cpd_statement, :cpd_category, :cpd_activity, :original) }
42
42
  scope :sorted, -> { order(:id) }
43
43
 
44
- scope :draft, -> { where(cpd_statement_id: CpdStatement.draft) }
45
- scope :completed, -> { where(cpd_statement_id: CpdStatement.completed) }
44
+ scope :draft, -> { where(cpd_statement_id: EffectiveCpd.CpdStatement.draft) }
45
+ scope :completed, -> { where(cpd_statement_id: EffectiveCpd.CpdStatement.completed) }
46
46
 
47
47
  validates :original, presence: true, if: -> { (carry_over || 0) > 0 }
48
48
  validates :description, presence: true
@@ -1,13 +1,20 @@
1
1
  = render('layout') do
2
2
  %h1= resource.cpd_cycle
3
3
 
4
+ - raise('expected a submitted cpd_statement') unless resource.submitted_at.present?
5
+
6
+ .alert.alert-warning.mb-4
7
+ Successfully submitted on #{resource.submitted_at.strftime('%F')}.
8
+
4
9
  - if resource.cpd_cycle.all_steps_content.present?
5
10
  .mb-2= resource.cpd_cycle.all_steps_content.to_s
6
11
 
7
12
  - if resource.cpd_cycle.complete_content.present?
8
13
  .mb-2= resource.cpd_cycle.complete_content.to_s
9
14
 
10
- = render(resource)
15
+ = link_to "Return to Dashboard", root_path, class: 'btn btn-lg btn-primary mb-4'
16
+
17
+ = render('effective/cpd_statements/cpd_statement', cpd_statement: resource)
11
18
 
12
19
  %hr
13
- .text-center= link_to 'Home', root_url, class: 'btn btn-primary'
20
+ = link_to "Return to Dashboard", root_path, class: 'btn btn-lg btn-primary'
@@ -7,7 +7,7 @@
7
7
  - if resource.cpd_cycle.submit_content.present?
8
8
  .mb-2= resource.cpd_cycle.submit_content.to_s
9
9
 
10
- = render(resource)
10
+ = render('effective/cpd_statements/cpd_statement', cpd_statement: resource)
11
11
 
12
12
  %p= link_to 'Change Activities', wizard_path(:activities)
13
13
 
@@ -29,7 +29,12 @@ EffectiveCpd.setup do |config|
29
29
  admin: 'admin'
30
30
  }
31
31
 
32
+ # CPD Class Settings
33
+ # Configure the class responsible for the cpd statements.
34
+ # config.cpd_statement_class_name = 'Effective::CpdStatement'
35
+
32
36
  # Program label settings
37
+ config.program_label = 'CPD' # CPD or MCE
33
38
  config.cycle_label = 'year' # 'cycle', 'season'
34
39
  config.credit_label = 'credit' # 'credit', 'PDH', 'PDU', 'CCC'
35
40
 
@@ -11,6 +11,7 @@ module EffectiveCpd
11
11
  initializer 'effective_cpd.active_record' do |app|
12
12
  ActiveSupport.on_load :active_record do
13
13
  ActiveRecord::Base.extend(EffectiveCpdUser::Base)
14
+ ActiveRecord::Base.extend(EffectiveCpdStatement::Base)
14
15
  end
15
16
  end
16
17
 
@@ -1,3 +1,3 @@
1
1
  module EffectiveCpd
2
- VERSION = '0.5.4'
2
+ VERSION = '0.6.1'
3
3
  end
data/lib/effective_cpd.rb CHANGED
@@ -14,8 +14,9 @@ module EffectiveCpd
14
14
  :cpd_audit_level_questions_table_name, :cpd_audit_level_question_options_table_name,
15
15
  :cpd_audits_table_name, :cpd_audit_responses_table_name, :cpd_audit_response_options_table_name,
16
16
  :cpd_audit_reviews_table_name, :cpd_audit_review_items_table_name,
17
- :cycle_label, :credit_label, :layout, :auditee_user_scope, :audit_reviewer_user_scope,
18
- :mailer, :parent_mailer, :deliver_method, :mailer_layout, :mailer_sender, :mailer_admin, :mailer_subject, :use_effective_email_templates
17
+ :program_label, :cycle_label, :credit_label, :layout, :auditee_user_scope, :audit_reviewer_user_scope,
18
+ :mailer, :parent_mailer, :deliver_method, :mailer_layout, :mailer_sender, :mailer_admin, :mailer_subject, :use_effective_email_templates,
19
+ :cpd_statement_class_name
19
20
  ]
20
21
  end
21
22
 
@@ -25,4 +26,8 @@ module EffectiveCpd
25
26
  mailer&.constantize || Effective::CpdMailer
26
27
  end
27
28
 
29
+ def self.CpdStatement
30
+ cpd_statement_class_name&.constantize || Effective::CpdStatement
31
+ end
32
+
28
33
  end
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.5.4
4
+ version: 0.6.1
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: 2022-10-03 00:00:00.000000000 Z
11
+ date: 2022-11-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -216,6 +216,7 @@ files:
216
216
  - app/helpers/effective_cpd_audits_helper.rb
217
217
  - app/helpers/effective_cpd_helper.rb
218
218
  - app/mailers/effective/cpd_mailer.rb
219
+ - app/models/concerns/effective_cpd_statement.rb
219
220
  - app/models/concerns/effective_cpd_user.rb
220
221
  - app/models/effective/cpd_activity.rb
221
222
  - app/models/effective/cpd_audit.rb