effective_cpd 0.5.4 → 0.6.1

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