effective_memberships 0.4.17 → 0.5.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 (40) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/admin/registrar_actions_controller.rb +8 -0
  3. data/app/controllers/admin/statuses_controller.rb +19 -0
  4. data/app/datatables/admin/effective_membership_histories_datatable.rb +10 -0
  5. data/app/datatables/admin/effective_memberships_datatable.rb +2 -1
  6. data/app/datatables/admin/effective_statuses_datatable.rb +21 -0
  7. data/app/models/concerns/effective_memberships_applicant.rb +84 -41
  8. data/app/models/concerns/effective_memberships_category.rb +10 -3
  9. data/app/models/concerns/effective_memberships_fee_payment.rb +16 -5
  10. data/app/models/concerns/effective_memberships_owner.rb +37 -7
  11. data/app/models/concerns/effective_memberships_registrar.rb +70 -4
  12. data/app/models/concerns/effective_memberships_status.rb +71 -0
  13. data/app/models/effective/fee.rb +11 -3
  14. data/app/models/effective/membership.rb +41 -3
  15. data/app/models/effective/membership_history.rb +17 -4
  16. data/app/models/effective/membership_status.rb +13 -0
  17. data/app/models/effective/registrar_action.rb +38 -4
  18. data/app/models/effective/status.rb +7 -0
  19. data/app/views/admin/membership_histories/_form.html.haml +2 -0
  20. data/app/views/admin/registrar_actions/_form.html.haml +7 -0
  21. data/app/views/admin/registrar_actions/_form_assign.html.haml +29 -9
  22. data/app/views/admin/registrar_actions/_form_register.html.haml +7 -2
  23. data/app/views/admin/registrar_actions/_form_status_change.html.haml +41 -0
  24. data/app/views/admin/statuses/_form.html.haml +8 -0
  25. data/app/views/admin/statuses/_form_status.html.haml +9 -0
  26. data/app/views/effective/applicants/_reinstatement.html.haml +9 -0
  27. data/app/views/effective/applicants/reinstatement.html.haml +15 -0
  28. data/app/views/effective/applicants/select/_apply_for_reinstatement.html.haml +3 -0
  29. data/app/views/effective/applicants/select/_apply_to_join.html.haml +1 -0
  30. data/app/views/effective/applicants/select/_apply_to_reclassify.html.haml +5 -0
  31. data/app/views/effective/applicants/select/_categories.html.haml +25 -0
  32. data/app/views/effective/applicants/select.html.haml +34 -26
  33. data/config/effective_memberships.rb +4 -0
  34. data/config/routes.rb +2 -1
  35. data/db/migrate/01_create_effective_memberships.rb.erb +38 -0
  36. data/db/seeds.rb +6 -0
  37. data/lib/effective_memberships/engine.rb +1 -0
  38. data/lib/effective_memberships/version.rb +1 -1
  39. data/lib/effective_memberships.rb +10 -7
  40. metadata +16 -2
@@ -42,11 +42,14 @@ module EffectiveMembershipsRegistrar
42
42
  period(date: date).end_of_year
43
43
  end
44
44
 
45
- def assign!(owner, categories:, date: nil, number: nil)
45
+ # Category is required, statuses are optional
46
+ def assign!(owner, categories:, statuses: nil, date: nil, number: nil)
46
47
  categories = Array(categories)
48
+ statuses = Array(statuses)
47
49
 
48
50
  raise('expecting a memberships owner') unless owner.class.respond_to?(:effective_memberships_owner?)
49
- raise('expecting a membership category') unless categories.present? && categories.all? { |cat| cat.class.respond_to?(:effective_memberships_category?) }
51
+ raise('expecting a membership category') if categories.blank? || categories.any? { |cat| !cat.class.respond_to?(:effective_memberships_category?) }
52
+ raise('expecting an membership status (optional)') if statuses.present? && statuses.any? { |status| !status.class.respond_to?(:effective_memberships_status?) }
50
53
 
51
54
  # Default Date and next number
52
55
  date ||= Time.zone.now
@@ -64,6 +67,17 @@ module EffectiveMembershipsRegistrar
64
67
  membership.number ||= number
65
68
  membership.number_as_integer ||= (Integer(number) rescue nil)
66
69
 
70
+ # Delete any removed statuses
71
+ membership.membership_statuses.each do |membership_status|
72
+ next if statuses.include?(membership_status.status)
73
+ membership_status.mark_for_destruction
74
+ end
75
+
76
+ # Build any additional statuses
77
+ statuses.each do |status|
78
+ membership.build_membership_status(status: status)
79
+ end
80
+
67
81
  # Delete any removed categories
68
82
  membership.membership_categories.each do |membership_category|
69
83
  next if categories.include?(membership_category.category)
@@ -76,6 +90,7 @@ module EffectiveMembershipsRegistrar
76
90
  end
77
91
 
78
92
  changed = membership.membership_categories.any? { |mc| mc.new_record? || mc.marked_for_destruction? }
93
+ changed ||= membership.membership_statuses.any? { |ms| ms.new_record? || ms.marked_for_destruction? }
79
94
 
80
95
  if changed
81
96
  membership.registration_on = date # Always new registration_on
@@ -88,9 +103,10 @@ module EffectiveMembershipsRegistrar
88
103
  owner.update_membership_status!
89
104
  end
90
105
 
91
- def register!(owner, to:, date: nil, number: nil, skip_fees: false)
106
+ def register!(owner, to:, status: nil, date: nil, number: nil, skip_fees: false)
92
107
  raise('expecting a memberships owner') unless owner.class.respond_to?(:effective_memberships_owner?)
93
108
  raise('expecting a memberships category') unless to.class.respond_to?(:effective_memberships_category?)
109
+ raise('expecting a memberships status') unless status.nil? || status.class.respond_to?(:effective_memberships_status?)
94
110
  raise('owner has existing membership. use reclassify! instead.') if owner.membership.present?
95
111
 
96
112
  # Default Date and next number
@@ -113,6 +129,9 @@ module EffectiveMembershipsRegistrar
113
129
  # Assign Category
114
130
  membership.build_membership_category(category: to)
115
131
 
132
+ # Assign Status
133
+ membership.build_membership_status(status: status) if status.present?
134
+
116
135
  # Assign fees paid through period
117
136
  if skip_fees
118
137
  membership.fees_paid_period = period
@@ -136,7 +155,6 @@ module EffectiveMembershipsRegistrar
136
155
  raise('expecting a memberships owner') unless owner.class.respond_to?(:effective_memberships_owner?)
137
156
  raise('owner must have an existing membership. use register! instead') if owner.membership.blank?
138
157
 
139
- # Todo. I dunno this was owner.membership.category
140
158
  from = owner.membership.category
141
159
 
142
160
  raise('expecting a to memberships category') unless to.class.respond_to?(:effective_memberships_category?)
@@ -164,6 +182,54 @@ module EffectiveMembershipsRegistrar
164
182
  save!(owner, date: date)
165
183
  end
166
184
 
185
+ def reinstate!(owner, date: nil, skip_fees: false)
186
+ raise('expecting a memberships owner') unless owner.class.respond_to?(:effective_memberships_owner?)
187
+ raise('owner must have an existing membership. use register! instead') if owner.membership.blank?
188
+
189
+ from = owner.membership.status
190
+ raise('expecting a from memberships status') if from.present? && !from.class.respond_to?(:effective_memberships_status?)
191
+
192
+ date ||= Time.zone.now
193
+
194
+ membership = owner.membership
195
+ membership.membership_status(status: from).mark_for_destruction if from.present?
196
+
197
+ unless skip_fees
198
+ fee = owner.build_prorated_fee(date: date)
199
+ # This might already be present and purchased if joined and reinstated in the same period
200
+ end
201
+
202
+ save!(owner, date: date)
203
+ end
204
+
205
+ # This clears the status entirely from user
206
+ def status_remove!(owner, date: nil)
207
+ status_change!(owner, to: nil, date: date)
208
+ end
209
+
210
+ # To can be nil to clear the status entirely
211
+ def status_change!(owner, to:, date: nil)
212
+ raise('expecting a memberships owner') unless owner.class.respond_to?(:effective_memberships_owner?)
213
+ raise('owner must have an existing membership. use register! instead') if owner.membership.blank?
214
+
215
+ from = owner.membership.status
216
+
217
+ raise('expecting a to memberships status') if to.present? && !to.class.respond_to?(:effective_memberships_status?)
218
+ raise('expecting a from memberships status') if from.present? && !from.class.respond_to?(:effective_memberships_status?)
219
+ raise('expected to and from to be different') if from == to
220
+
221
+ date ||= Time.zone.now
222
+
223
+ membership = owner.membership
224
+
225
+ # Assign Status
226
+ membership.build_membership_status(status: to) if to.present?
227
+ membership.membership_status(status: from).mark_for_destruction if from.present?
228
+
229
+ # Save
230
+ save!(owner, date: date)
231
+ end
232
+
167
233
  def remove!(owner, date: nil)
168
234
  raise('expecting a memberships owner') unless owner.class.respond_to?(:effective_memberships_owner?)
169
235
  raise('expected a member') unless owner.membership.present?
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ # EffectiveMembershipsStatus
4
+ #
5
+ # Mark your status model with effective_memberships_status to get all the includes
6
+
7
+ module EffectiveMembershipsStatus
8
+ extend ActiveSupport::Concern
9
+
10
+ module Base
11
+ def effective_memberships_status
12
+ include ::EffectiveMembershipsStatus
13
+ end
14
+ end
15
+
16
+ module ClassMethods
17
+ def effective_memberships_status?; true; end
18
+
19
+ def status_types
20
+ ['Individual', 'Organization']
21
+ end
22
+
23
+ def statuses
24
+ []
25
+ end
26
+ end
27
+
28
+ included do
29
+ log_changes(except: :memberships) if respond_to?(:log_changes)
30
+
31
+ has_many :membership_statuses, class_name: 'Effective::MembershipStatus', as: :status
32
+
33
+ effective_resource do
34
+ status_type :string
35
+
36
+ title :string
37
+ status :string # Unused but must belong to self.class.statuses
38
+ position :integer
39
+
40
+ timestamps
41
+ end
42
+
43
+ scope :deep, -> { all }
44
+ scope :sorted, -> { order(:position) }
45
+
46
+ validates :title, presence: true, uniqueness: true
47
+ validates :status_type, presence: true
48
+ validates :position, presence: true
49
+
50
+ before_validation do
51
+ self.position ||= (self.class.pluck(:position).compact.max || -1) + 1
52
+ self.status_type ||= self.class.status_types.first
53
+ end
54
+
55
+ end
56
+
57
+ # Instance Methods
58
+
59
+ def to_s
60
+ title.presence || 'New Membership Status'
61
+ end
62
+
63
+ def individual?
64
+ status_type == 'Individual'
65
+ end
66
+
67
+ def organization?
68
+ status_type == 'Organization'
69
+ end
70
+
71
+ end
@@ -13,6 +13,9 @@ module Effective
13
13
  # The membership category for this fee, if there's only 1 membership.categories
14
14
  belongs_to :category, polymorphic: true, optional: true
15
15
 
16
+ # The membership status for this fee, if there's only 1 membership.statuses
17
+ belongs_to :with_status, polymorphic: true, optional: true
18
+
16
19
  effective_resource do
17
20
  fee_type :string
18
21
 
@@ -35,6 +38,7 @@ module Effective
35
38
 
36
39
  before_validation(if: -> { owner && owner.membership }) do
37
40
  self.category ||= owner.membership.categories.first if owner.membership.categories.length == 1
41
+ self.with_status ||= owner.membership.statuses.first if owner.membership.statuses.length == 1
38
42
  end
39
43
 
40
44
  before_validation do
@@ -81,16 +85,20 @@ module Effective
81
85
 
82
86
  # Used by applicant.applicant_submit_fees
83
87
  def applicant_submit_fee?
84
- fee_type == 'Applicant'
88
+ return true if parent.kind_of?(EffectiveMemberships.Applicant)
89
+
90
+ ['Applicant', 'Reinstatement'].include?(fee_type)
85
91
  end
86
92
 
87
93
  def fee_payment_fee?
88
- fee_type != 'Applicant'
94
+ return false if parent.kind_of?(EffectiveMemberships.Applicant)
95
+
96
+ ['Applicant', 'Reinstatement'].exclude?(fee_type)
89
97
  end
90
98
 
91
99
  # Will advance a membership.fees_paid_through_year value when purchased
92
100
  def membership_period_fee?
93
- fee_type == 'Prorated' || fee_type == 'Renewal'
101
+ ['Prorated', 'Renewal'].include?(fee_type)
94
102
  end
95
103
 
96
104
  def custom_fee?
@@ -7,6 +7,9 @@ module Effective
7
7
  has_many :membership_categories, -> { order(:id) }, inverse_of: :membership, dependent: :delete_all
8
8
  accepts_nested_attributes_for :membership_categories
9
9
 
10
+ has_many :membership_statuses, -> { order(:id) }, inverse_of: :membership, dependent: :delete_all
11
+ accepts_nested_attributes_for :membership_statuses
12
+
10
13
  log_changes(to: :owner) if respond_to?(:log_changes)
11
14
 
12
15
  effective_resource do
@@ -74,7 +77,8 @@ module Effective
74
77
  summary = [
75
78
  owner.to_s,
76
79
  'is',
77
- (categories.to_sentence),
80
+ (statuses.to_sentence if statuses.present?),
81
+ (categories.to_sentence if categories.present?),
78
82
  'member',
79
83
  "##{number_was}",
80
84
  "who joined #{joined_on&.strftime('%F') || '-'}",
@@ -85,6 +89,8 @@ module Effective
85
89
  (summary + '.').html_safe
86
90
  end
87
91
 
92
+ ## Membership Categories
93
+
88
94
  # We can't use the polymorphic has_many. So this is a helper.
89
95
  def categories
90
96
  membership_categories.reject(&:marked_for_destruction?).map(&:category)
@@ -96,12 +102,12 @@ module Effective
96
102
 
97
103
  # We might want to use singular memberships.
98
104
  def category
99
- raise('expected singular usage but there are more than one membership') if categories.length > 1
105
+ raise('expected singular usage but there are more than one membership category') if categories.length > 1
100
106
  categories.first
101
107
  end
102
108
 
103
109
  def category_id
104
- raise('expected singular usage but there are more than one membership') if categories.length > 1
110
+ raise('expected singular usage but there are more than one membership category') if categories.length > 1
105
111
  categories.first.id
106
112
  end
107
113
 
@@ -115,6 +121,38 @@ module Effective
115
121
  membership_category(category: category) || membership_categories.build(category: category)
116
122
  end
117
123
 
124
+ ## Membership Statuses
125
+
126
+ # We can't use the polymorphic has_many. So this is a helper.
127
+ def statuses
128
+ membership_statuses.reject(&:marked_for_destruction?).map(&:status)
129
+ end
130
+
131
+ def status_ids
132
+ membership_statuses.reject(&:marked_for_destruction?).map(&:status_id)
133
+ end
134
+
135
+ # We might want to use singular memberships.
136
+ def status
137
+ raise('expected singular usage but there are more than one membership status') if statuses.length > 1
138
+ statuses.first
139
+ end
140
+
141
+ def status_id
142
+ raise('expected singular usage but there are more than one membership status') if statuses.length > 1
143
+ statuses.first.id
144
+ end
145
+
146
+ def membership_status(status:)
147
+ raise('expected a status') unless status.class.respond_to?(:effective_memberships_status?)
148
+ membership_statuses.find { |ms| ms.status_id == status.id && ms.status_type == status.class.name }
149
+ end
150
+
151
+ # find or build
152
+ def build_membership_status(status:)
153
+ membership_status(status: status) || membership_statuses.build(status: status)
154
+ end
155
+
118
156
  def good_standing?
119
157
  !bad_standing?
120
158
  end
@@ -22,16 +22,15 @@ module Effective
22
22
  serialize :categories, Array
23
23
  serialize :category_ids, Array
24
24
 
25
+ serialize :statuses, Array
26
+ serialize :status_ids, Array
27
+
25
28
  scope :deep, -> { includes(:owner) }
26
29
  scope :sorted, -> { order(:start_on) }
27
30
 
28
31
  scope :removed, -> { where(removed: true) }
29
32
 
30
33
  validates :owner, presence: true
31
-
32
- # validates :categories, presence: true, unless: -> { removed? }
33
- # validates :category_ids, presence: true, unless: -> { removed? }
34
-
35
34
  validates :start_on, presence: true
36
35
 
37
36
  def to_s
@@ -44,6 +43,10 @@ module Effective
44
43
  category_ids.present? ? EffectiveMemberships.Category.where(id: category_ids) : []
45
44
  end
46
45
 
46
+ def membership_statuses
47
+ status_ids.present? ? EffectiveMemberships.Status.where(id: status_ids) : []
48
+ end
49
+
47
50
  def membership_category_ids
48
51
  membership_categories.map(&:id)
49
52
  end
@@ -53,5 +56,15 @@ module Effective
53
56
  assign_attributes(categories: categories.map(&:to_s), category_ids: categories.map(&:id))
54
57
  end
55
58
 
59
+ def membership_status_ids
60
+ membership_statuses.map(&:id)
61
+ end
62
+
63
+ def membership_status_ids=(ids)
64
+ statuses = EffectiveMemberships.Status.where(id: ids)
65
+ assign_attributes(statuses: statuses.map(&:to_s), status_ids: statuses.map(&:id))
66
+ end
67
+
68
+
56
69
  end
57
70
  end
@@ -0,0 +1,13 @@
1
+ module Effective
2
+ class MembershipStatus < ActiveRecord::Base
3
+ belongs_to :status, polymorphic: true
4
+ belongs_to :membership, polymorphic: true
5
+
6
+ log_changes(to: :membership) if respond_to?(:log_changes)
7
+
8
+ def to_s
9
+ status&.to_s || 'membership status'
10
+ end
11
+
12
+ end
13
+ end
@@ -12,13 +12,21 @@ module Effective
12
12
  # Bad Standing
13
13
  attr_accessor :bad_standing_reason
14
14
 
15
+ # Register
16
+ attr_accessor :status_id
17
+
15
18
  # Reclassify & Register
16
19
  attr_accessor :category_id
17
20
  attr_accessor :membership_number
18
21
  attr_accessor :skip_fees
19
22
 
23
+ # Status Change
24
+ attr_accessor :status_id
25
+ attr_accessor :status_remove_action
26
+
20
27
  # Assign
21
28
  attr_accessor :category_ids
29
+ attr_accessor :status_ids
22
30
 
23
31
  # Mark Fees Paid - Order Attributes
24
32
  attr_accessor :payment_provider
@@ -38,6 +46,10 @@ module Effective
38
46
  validates :category_id, presence: true,
39
47
  if: -> { current_action == :reclassify || current_action == :register }
40
48
 
49
+ # Status Change
50
+ validates :status_id, presence: true, if: -> { current_action == :status_change }
51
+
52
+ # Assign
41
53
  validates :category_ids, presence: true, if: -> { current_action == :assign }
42
54
 
43
55
  def to_s
@@ -46,7 +58,7 @@ module Effective
46
58
 
47
59
  def register!
48
60
  update!(current_action: :register)
49
- EffectiveMemberships.Registrar.register!(owner, to: category, number: membership_number.presence, skip_fees: skip_fees?)
61
+ EffectiveMemberships.Registrar.register!(owner, to: category, status: status, number: number, skip_fees: skip_fees?)
50
62
  end
51
63
 
52
64
  def reclassify!
@@ -54,9 +66,19 @@ module Effective
54
66
  EffectiveMemberships.Registrar.reclassify!(owner, to: category, skip_fees: skip_fees?)
55
67
  end
56
68
 
69
+ def status_change!
70
+ update!(current_action: :status_change)
71
+ EffectiveMemberships.Registrar.status_change!(owner, to: status)
72
+ end
73
+
74
+ def status_remove!
75
+ update!(current_action: :status_remove)
76
+ EffectiveMemberships.Registrar.status_remove!(owner)
77
+ end
78
+
57
79
  def assign!
58
80
  update!(current_action: :assign)
59
- EffectiveMemberships.Registrar.assign!(owner, categories: categories, number: membership_number.presence)
81
+ EffectiveMemberships.Registrar.assign!(owner, categories: categories, statuses: statuses, number: number)
60
82
  end
61
83
 
62
84
  def good_standing!
@@ -102,11 +124,23 @@ module Effective
102
124
  private
103
125
 
104
126
  def category
105
- EffectiveMemberships.Category.find(@category_id) if @category_id
127
+ EffectiveMemberships.Category.find(@category_id) if @category_id.present?
106
128
  end
107
129
 
108
130
  def categories
109
- EffectiveMemberships.Category.where(id: @category_ids) if @category_ids
131
+ EffectiveMemberships.Category.where(id: @category_ids) if @category_ids.present?
132
+ end
133
+
134
+ def status
135
+ EffectiveMemberships.Status.find(@status_id) if @status_id.present?
136
+ end
137
+
138
+ def statuses
139
+ EffectiveMemberships.Status.where(id: @status_ids) if @status_ids.present?
140
+ end
141
+
142
+ def number
143
+ membership_number.presence
110
144
  end
111
145
 
112
146
  def order_attributes
@@ -0,0 +1,7 @@
1
+ module Effective
2
+ class Status < ActiveRecord::Base
3
+ self.table_name = EffectiveMemberships.statuses_table_name.to_s
4
+
5
+ effective_memberships_status
6
+ end
7
+ end
@@ -11,7 +11,9 @@
11
11
 
12
12
  = f.date_field :end_on, hint: 'The end date of this period in history. Must be present for all past histories. Must be blank in the most recent history, unless membership removed.'
13
13
  = f.text_field :number, hint: 'The membership number'
14
+
14
15
  = f.select :membership_category_ids, EffectiveMemberships.Category.all.sorted, label: 'Membership Categories', hint: 'The membership category or categories held during this period in history.'
16
+ = f.select :membership_status_ids, EffectiveMemberships.Status.all.sorted, label: 'Membership Statuses', hint: 'The membership status or statuses held during this period in history.'
15
17
 
16
18
  = f.check_box :bad_standing, hint: 'Membership in bad standing'
17
19
  = f.check_box :removed, hint: 'Membership removed'
@@ -1,10 +1,17 @@
1
1
  - registrar_action = Effective::RegistrarAction.new(current_user: current_user, owner: owner)
2
2
 
3
+ -# This form is great if we want to do multiple categories or statuses
4
+ -#.mb-4= render 'admin/registrar_actions/form_assign', registrar_action: registrar_action
5
+
3
6
  - if owner.membership.blank?
4
7
  .mb-4= render 'admin/registrar_actions/form_register', registrar_action: registrar_action
5
8
 
6
9
  - if owner.membership.present?
7
10
  .mb-4= render 'admin/registrar_actions/form_reclassify', registrar_action: registrar_action
11
+
12
+ - if owner.registrar_action_statuses(:status_change).present?
13
+ .mb-4= render 'admin/registrar_actions/form_status_change', registrar_action: registrar_action
14
+
8
15
  .mb-4= render 'admin/registrar_actions/form_bad_standing', registrar_action: registrar_action
9
16
  .mb-4= render 'admin/registrar_actions/form_fees_paid', registrar_action: registrar_action
10
17
  .mb-4= render 'admin/registrar_actions/form_remove', registrar_action: registrar_action
@@ -8,21 +8,41 @@
8
8
 
9
9
  - membership = f.object.owner.membership
10
10
 
11
+ - categories = f.object.owner.registrar_action_categories(:assign)
12
+ - statuses = f.object.owner.registrar_action_statuses(:assign)
13
+ - label = [('categories' if categories.present?), ('statuses' if statuses.present?)].join(' or ')
14
+
15
+ - if membership.present?
16
+ - f.object.category_ids = membership.category_ids
17
+ - f.object.status_ids = membership.status_ids
18
+
11
19
  %p.text-muted
12
- Assign to one or more categories.
20
+ Assign to #{label}.
21
+
22
+ - if categories.present?
23
+ = f.static_field :current_action, label: 'Current Categories' do
24
+ - Array(membership&.categories).each do |category|
25
+ %div= link_to(category, effective_memberships.edit_admin_category_path(category))
13
26
 
14
- = f.static_field :current_action, label: 'Current Categories' do
15
- - Array(membership&.categories).each do |category|
16
- %div= link_to(category, effective_memberships.edit_admin_category_path(category))
27
+ - if membership&.categories.blank?
28
+ None
17
29
 
18
- - if membership.blank?
19
- None
30
+ - if statuses.present?
31
+ = f.static_field :current_action, label: 'Current Statuses' do
32
+ - Array(membership&.statuses).each do |status|
33
+ %div= link_to(status, effective_memberships.edit_admin_status_path(status))
20
34
 
21
- = f.check_box :current_action, label: 'Yes, assign this member to categories'
35
+ - if membership&.statuses.blank?
36
+ None
37
+
38
+ = f.check_box :current_action, label: "Yes, assign this member to #{label}"
22
39
 
23
40
  = f.show_if :current_action, true do
24
- - categories = f.object.owner.registrar_action_categories(:assign)
25
- = f.select :category_ids, categories, label: 'Assign to', required: true, multiple: true
41
+ - if categories.present?
42
+ = f.select :category_ids, categories, label: 'Assign to', required: true, multiple: true
43
+
44
+ - if statuses.present?
45
+ = f.select :status_ids, statuses, label: false, required: true, multiple: true
26
46
 
27
47
  - if membership.present?
28
48
  %p The member will keep their existing membership number: #{membership.number}.
@@ -7,6 +7,8 @@
7
7
  = f.hidden_field :owner_type
8
8
 
9
9
  - period = EffectiveMemberships.Registrar.current_period
10
+ - categories = f.object.owner.registrar_action_categories(:register)
11
+ - statuses = f.object.owner.registrar_action_statuses(:register)
10
12
 
11
13
  %p.text-muted
12
14
  Register into a new category and optionally create fees.
@@ -17,8 +19,11 @@
17
19
  = f.check_box :current_action, label: 'Yes, register to a membership'
18
20
 
19
21
  = f.show_if :current_action, true do
20
- - categories = f.object.owner.registrar_action_categories(:register)
21
- = f.select :category_id, categories, label: 'Register to'
22
+ - if categories.present?
23
+ = f.select :category_id, categories, label: 'Register to'
24
+
25
+ - if statuses.present?
26
+ = f.select :status_id, statuses, label: false
22
27
 
23
28
  = f.text_field :membership_number, hint: "leave blank to assign the next number"
24
29
 
@@ -0,0 +1,41 @@
1
+ .card
2
+ .card-body
3
+ %h5.card-title Status Change
4
+
5
+ = effective_form_with(model: [:admin, registrar_action], url: effective_memberships.admin_registrar_actions_path) do |f|
6
+ = f.hidden_field :owner_id
7
+ = f.hidden_field :owner_type
8
+
9
+ - membership = f.object.owner.membership
10
+ - period = EffectiveMemberships.Registrar.current_period
11
+
12
+ %p.text-muted
13
+ Change or remove a member's existing status.
14
+
15
+ = f.static_field :current_action, label: 'Current Status' do
16
+ = (membership.status || 'None').to_s
17
+
18
+ = f.check_box :current_action, label: 'Yes, change member status'
19
+
20
+ = f.show_if :current_action, true do
21
+ %p The member will keep their existing membership number: #{membership.number}.
22
+
23
+ - statuses = f.object.owner.registrar_action_statuses(:status_change) - membership.statuses
24
+ = f.select :status_id, statuses, label: 'Change status to', required: true
25
+
26
+ %p No fees will be created
27
+
28
+ = f.submit 'Change Status', border: false, center: true, 'data-confirm': "Really change #{f.object.owner}?"
29
+
30
+ - # Remove Action
31
+ - if membership.status.present?
32
+ = f.check_box :status_remove_action, label: "Yes, remove #{membership.status} status"
33
+
34
+ = f.show_if :status_remove_action, true do
35
+ %p The member will keep their existing membership number: #{membership.number}
36
+
37
+ %p This action will remove the #{membership.status} status
38
+
39
+ %p No fees will be created
40
+
41
+ = f.submit 'Remove Status', border: false, center: true, 'data-confirm': "Really remove status #{f.object.owner}?"
@@ -0,0 +1,8 @@
1
+ = tabs do
2
+ = tab 'Status' do
3
+ = render 'admin/statuses/form_status', status: status
4
+
5
+ - if status.persisted?
6
+ - if status.respond_to?(:log_changes_datatable)
7
+ = tab 'Logs' do
8
+ = render_inline_datatable(status.log_changes_datatable)
@@ -0,0 +1,9 @@
1
+ = effective_form_with(model: [:admin, status], engine: true) do |f|
2
+ = f.text_field :title
3
+
4
+ = f.select :status_type, f.object.class.status_types
5
+
6
+ - if f.object.class.statuses.present?
7
+ = f.select :status, f.object.class.statuses
8
+
9
+ = f.submit
@@ -0,0 +1,9 @@
1
+ = wizard_card(applicant) do
2
+ %table.table.table-sm
3
+ %tbody
4
+ %tr
5
+ %td= icon('check')
6
+ %td Yes, I am applying to reinstate from #{applicant.from_status || applicant.from_category}.
7
+ %tr
8
+ %td= icon('check')
9
+ %td Yes, I have read, understand and agree to the reinstatement declaration
@@ -0,0 +1,15 @@
1
+ = render 'layout' do
2
+ = render 'effective/applicants/content', resource: resource
3
+
4
+ - completed = resource.has_completed_step?(:reinstatement)
5
+ - resource.declare_reinstatement = completed
6
+
7
+ = card do
8
+ = effective_form_with(model: resource, url: wizard_path(step), method: :put) do |f|
9
+ = f.hidden_field :id
10
+
11
+ = render_if_exists("effective/applicants/reinstatement_fields", f: f)
12
+
13
+ = f.check_box :declare_reinstatement, label: 'Yes, I accept and agree to the above'
14
+
15
+ = f.save 'Save and Continue'
@@ -0,0 +1,3 @@
1
+ - membership = f.object.owner.membership
2
+
3
+ %p Apply for reinstatement from #{membership.status || membership.category}.