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.
- checksums.yaml +4 -4
- data/app/controllers/admin/registrar_actions_controller.rb +8 -0
- data/app/controllers/admin/statuses_controller.rb +19 -0
- data/app/datatables/admin/effective_membership_histories_datatable.rb +10 -0
- data/app/datatables/admin/effective_memberships_datatable.rb +2 -1
- data/app/datatables/admin/effective_statuses_datatable.rb +21 -0
- data/app/models/concerns/effective_memberships_applicant.rb +84 -41
- data/app/models/concerns/effective_memberships_category.rb +10 -3
- data/app/models/concerns/effective_memberships_fee_payment.rb +16 -5
- data/app/models/concerns/effective_memberships_owner.rb +37 -7
- data/app/models/concerns/effective_memberships_registrar.rb +70 -4
- data/app/models/concerns/effective_memberships_status.rb +71 -0
- data/app/models/effective/fee.rb +11 -3
- data/app/models/effective/membership.rb +41 -3
- data/app/models/effective/membership_history.rb +17 -4
- data/app/models/effective/membership_status.rb +13 -0
- data/app/models/effective/registrar_action.rb +38 -4
- data/app/models/effective/status.rb +7 -0
- data/app/views/admin/membership_histories/_form.html.haml +2 -0
- data/app/views/admin/registrar_actions/_form.html.haml +7 -0
- data/app/views/admin/registrar_actions/_form_assign.html.haml +29 -9
- data/app/views/admin/registrar_actions/_form_register.html.haml +7 -2
- data/app/views/admin/registrar_actions/_form_status_change.html.haml +41 -0
- data/app/views/admin/statuses/_form.html.haml +8 -0
- data/app/views/admin/statuses/_form_status.html.haml +9 -0
- data/app/views/effective/applicants/_reinstatement.html.haml +9 -0
- data/app/views/effective/applicants/reinstatement.html.haml +15 -0
- data/app/views/effective/applicants/select/_apply_for_reinstatement.html.haml +3 -0
- data/app/views/effective/applicants/select/_apply_to_join.html.haml +1 -0
- data/app/views/effective/applicants/select/_apply_to_reclassify.html.haml +5 -0
- data/app/views/effective/applicants/select/_categories.html.haml +25 -0
- data/app/views/effective/applicants/select.html.haml +34 -26
- data/config/effective_memberships.rb +4 -0
- data/config/routes.rb +2 -1
- data/db/migrate/01_create_effective_memberships.rb.erb +38 -0
- data/db/seeds.rb +6 -0
- data/lib/effective_memberships/engine.rb +1 -0
- data/lib/effective_memberships/version.rb +1 -1
- data/lib/effective_memberships.rb +10 -7
- metadata +16 -2
@@ -42,11 +42,14 @@ module EffectiveMembershipsRegistrar
|
|
42
42
|
period(date: date).end_of_year
|
43
43
|
end
|
44
44
|
|
45
|
-
|
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')
|
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
|
data/app/models/effective/fee.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
(
|
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:
|
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:
|
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
|
@@ -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
|
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
|
-
|
15
|
-
|
16
|
-
%div= link_to(category, effective_memberships.edit_admin_category_path(category))
|
27
|
+
- if membership&.categories.blank?
|
28
|
+
None
|
17
29
|
|
18
|
-
|
19
|
-
|
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
|
-
|
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
|
25
|
-
|
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
|
21
|
-
|
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,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'
|