effective_memberships 0.9.6 → 0.9.7

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: f42637485b8a72cd2cf2a7f4845e75dbca8d3c379270d4dfe0a607e70610117d
4
- data.tar.gz: 9d41bd14aad6e7e54c76568bd58147d43965fd30060c07525941294b7504d28e
3
+ metadata.gz: c9916218e0d606b59b230debdc5c7a70e1d3754333f786298a4b9f3cf21222ce
4
+ data.tar.gz: 7ee9f5e5f4f64ea6764c206b053a81dc0d253a596de57d2e20324e3c64b86aa4
5
5
  SHA512:
6
- metadata.gz: d456e9bcd40ce78fc83689c5352a85bc156ec50f7149bd169f7af1521d3ec1c58f6ed67b06922b28b36fec1cbb7c880a58e4e6c7ddcf197f3872e37fb5ac247b
7
- data.tar.gz: 2f27824362cf294f83d4f953bb8c283045ef70a03910b17eeff1591f90df0a508bcf7dff1bbca53b49d6663f60d50376e9a8d4fb50da9cc47e6889724d34ef4d
6
+ metadata.gz: 6e6f8b7f49df86cd4461dba072f3106e3a095076d44f298ced308857e7ee86b3f91455d6823716470d6b4dccdb75ed42e8e05cc2be9bc0208e314aaef011e759
7
+ data.tar.gz: 936b9c462cede66151ae4a9d186a3b3d6aee60989f284f6157373fb043f73498e486678e09d39af0f75f648a5ace5826f66f0ec553427fbeb77375a1b5822fa9
@@ -14,6 +14,10 @@ module Admin
14
14
  success: -> { "#{resource.owner} has been reclassified to #{resource.owner.membership.category}" },
15
15
  redirect: -> { admin_owners_path(resource) }
16
16
 
17
+ submit :reinstate, 'Reinstate',
18
+ success: -> { "#{resource.owner} has been reinstated to #{resource.owner.membership.category}" },
19
+ redirect: -> { admin_owners_path(resource) }
20
+
17
21
  submit :status_assign, 'Assign Status',
18
22
  success: -> { "#{resource.owner} has been assigned #{resource.owner.membership.statuses_sentence}" },
19
23
  redirect: -> { admin_owners_path(resource) }
@@ -21,6 +21,10 @@ module EffectiveMembershipsApplicant
21
21
  [:start, :select, :summary, :billing, :checkout, :submitted]
22
22
  end
23
23
 
24
+ # Apply to Join - Anyone can do this
25
+ # Apply to Reclassify - Must have an existing membership and category
26
+ # Apply for Reinstatement - Must have a removed membership. Membership history.
27
+
24
28
  def categories
25
29
  ['Apply to Join', 'Apply to Reclassify', 'Apply for Reinstatement']
26
30
  end
@@ -101,7 +105,6 @@ module EffectiveMembershipsApplicant
101
105
  # Required for Apply to Reclassify
102
106
  belongs_to :from_category, polymorphic: true, optional: true
103
107
 
104
- # Required for Apply for Reinstatement
105
108
  belongs_to :from_status, polymorphic: true, optional: true
106
109
 
107
110
  has_many :applicant_reviews, -> { order(:id) }, as: :applicant, inverse_of: :applicant, dependent: :destroy
@@ -202,8 +205,8 @@ module EffectiveMembershipsApplicant
202
205
  self.from_category = owner.membership.categories.first
203
206
  end
204
207
 
205
- if owner.membership.present? && reinstatement?
206
- self.from_status = owner.membership.statuses.find { |status| status.reinstatable? }
208
+ if reinstatement?
209
+ self.from_category = owner.reinstatement_membership_category
207
210
  end
208
211
  end
209
212
 
@@ -215,7 +218,6 @@ module EffectiveMembershipsApplicant
215
218
  validates :user, presence: true
216
219
 
217
220
  validates :from_category, presence: true, if: -> { reclassification? }
218
- validates :from_status, presence: true, if: -> { reinstatement? }
219
221
 
220
222
  validate(if: -> { reclassification? && category_id.present? }) do
221
223
  errors.add(:category_id, "can't reclassify to existing category") if category_id == from_category_id
@@ -603,10 +605,12 @@ module EffectiveMembershipsApplicant
603
605
 
604
606
  # Used by the select step
605
607
  def can_apply_applicant_types_collection
606
- if owner.blank? || owner.membership.blank? || owner.membership.categories.blank?
608
+ if owner.blank?
607
609
  ['Apply to Join']
608
- elsif owner.membership.statuses.any?(&:reinstatable?)
610
+ elsif owner.membership_removed?
609
611
  ['Apply for Reinstatement', 'Apply to Join']
612
+ elsif owner.membership.blank? || owner.membership.categories.blank?
613
+ ['Apply to Join']
610
614
  else
611
615
  ['Apply to Reclassify']
612
616
  end
@@ -861,7 +865,7 @@ module EffectiveMembershipsApplicant
861
865
  elsif reclassification?
862
866
  EffectiveMemberships.Registrar.reclassify!(owner, to: to_category, status: to_status)
863
867
  elsif reinstatement?
864
- EffectiveMemberships.Registrar.reinstate!(owner, from: from_status)
868
+ EffectiveMemberships.Registrar.reinstate!(owner, to: to_category)
865
869
  else
866
870
  raise('unsupported approval applicant_type')
867
871
  end
@@ -130,8 +130,25 @@ module EffectiveMembershipsOwner
130
130
  end
131
131
 
132
132
  def membership_removed_on
133
- return nil unless membership_removed?
134
- membership_histories.find { |history| history.removed? }.start_on
133
+ removed_membership_history.start_on if membership_removed?
134
+ end
135
+
136
+ # The membership history that is removed. Has exit statuses that may affect reinstatement fees.
137
+ def removed_membership_history
138
+ membership_histories.reverse.find { |history| history.removed? } if membership_removed?
139
+ end
140
+
141
+ # The membership history we would reinstate to. Should be the one just before removed.
142
+ def reinstatement_membership_history
143
+ membership_histories.reverse.find { |history| !history.removed? } if membership_removed?
144
+ end
145
+
146
+ def reinstatement_membership_category
147
+ reinstatement_membership_history.membership_categories.first if membership_removed?
148
+ end
149
+
150
+ def reinstatement_membership_statuses
151
+ reinstatement_membership_history.membership_statuses if membership_removed?
135
152
  end
136
153
 
137
154
  def registrar_action_categories(action)
@@ -139,7 +156,7 @@ module EffectiveMembershipsOwner
139
156
  end
140
157
 
141
158
  def registrar_action_statuses(action)
142
- EffectiveMemberships.Status.sorted.all.where.not(id: EffectiveMemberships.Registrar.not_in_good_standing_status)
159
+ EffectiveMemberships.Status.sorted.all
143
160
  end
144
161
 
145
162
  def after_build_fee(fee)
@@ -311,9 +328,7 @@ module EffectiveMembershipsOwner
311
328
  EffectiveMemberships.Registrar.in_good_standing!(self)
312
329
  end
313
330
 
314
- if membership_histories.blank?
315
- build_membership_history()
316
- end
331
+ build_membership_history() if membership_histories.blank?
317
332
 
318
333
  save!
319
334
  end
@@ -361,9 +376,10 @@ module EffectiveMembershipsOwner
361
376
  errors = []
362
377
  history = membership_histories.first
363
378
  last_history = membership_histories.last
379
+ was_removed = membership_histories.any? { |history| history.removed? }
364
380
 
365
381
  # Check membership joined on date matches first history start date
366
- if membership.joined_on != history.start_on
382
+ if membership.joined_on != history.start_on && !was_removed
367
383
  errors << "The joined date #{membership.joined_on.strftime('%F')} does not match the first history start date of #{history.start_on.strftime('%F')}. Please change the first history start date to #{membership.joined_on.strftime('%F')} or update the joined date above."
368
384
  end
369
385
 
@@ -131,9 +131,12 @@ module EffectiveMembershipsRegistrar
131
131
  membership.registration_on = date # Always new registration_on
132
132
 
133
133
  # Assign Number (this could be nil)
134
- number = next_membership_number(owner, to: to) if number.blank?
135
- membership.number = number
136
- membership.number_as_integer = (Integer(number) rescue nil)
134
+ number = next_membership_number(owner, to: to) if number.nil?
135
+
136
+ if number.present?
137
+ membership.number = number
138
+ membership.number_as_integer = (Integer(number) rescue nil)
139
+ end
137
140
 
138
141
  # Assign Category
139
142
  membership.build_membership_category(category: to)
@@ -173,11 +176,13 @@ module EffectiveMembershipsRegistrar
173
176
 
174
177
  date ||= Time.zone.now
175
178
 
179
+ # Existing Membership
176
180
  membership = owner.membership
177
181
 
178
- # Assign Category
182
+ # Last Changed Date
179
183
  membership.registration_on = date
180
184
 
185
+ # Assign Category
181
186
  membership.build_membership_category(category: to)
182
187
  membership.membership_category(category: from).mark_for_destruction
183
188
 
@@ -195,24 +200,60 @@ module EffectiveMembershipsRegistrar
195
200
  save!(owner, date: date)
196
201
  end
197
202
 
198
- def reinstate!(owner, from:, date: nil, skip_fees: false)
203
+ def reinstate!(owner, to: nil, date: nil, skip_fees: false)
199
204
  raise('expecting a memberships owner') unless owner.class.respond_to?(:effective_memberships_owner?)
200
- raise('owner must have an existing membership. use register! instead') if owner.membership.blank?
205
+ raise('owner must have a removed membership.') unless owner.membership_removed?
206
+
207
+ history = owner.reinstatement_membership_history
208
+ raise('owner must have a reinstatement membership history.') if history.blank?
201
209
 
202
- raise('expecting a from') if from.blank?
203
- raise('expected a from status or category') unless from.class.respond_to?(:effective_memberships_status?) || from.class.respond_to?(:effective_memberships_category?)
210
+ to ||= owner.reinstatement_membership_category
211
+ raise('expecting a to memberships category') unless to.class.respond_to?(:effective_memberships_category?)
204
212
 
213
+ statuses = owner.reinstatement_membership_statuses
214
+
215
+ # Default Date
205
216
  date ||= Time.zone.now
217
+ period = period(date: date)
218
+ period_end_on = period_end_on(date: date)
206
219
 
207
- membership = owner.membership
208
- membership.membership_status(status: from).mark_for_destruction if from.class.respond_to?(:effective_memberships_status?)
209
- membership.membership_category(category: from).mark_for_destruction if from.class.respond_to?(:effective_memberships_category?)
220
+ # Build a membership
221
+ membership = owner.build_membership
222
+
223
+ # Assign Dates
224
+ membership.joined_on = date
225
+ membership.registration_on = date
226
+
227
+ # Assign Number (this could be nil)
228
+ if history.number.present?
229
+ membership.number = history.number
230
+ membership.number_as_integer = (Integer(history.number) rescue nil)
231
+ end
232
+
233
+ # Assign Category
234
+ membership.build_membership_category(category: to)
235
+
236
+ # Assign Statuses
237
+ statuses.each do |status|
238
+ membership.build_membership_status(status: status)
239
+ end
210
240
 
241
+ # Assign fees paid through period
242
+ if skip_fees
243
+ membership.fees_paid_period = period
244
+ membership.fees_paid_through_period = period_end_on
245
+ end
246
+
247
+ # Or, Build Fees
211
248
  unless skip_fees
212
249
  fee = owner.build_prorated_fee(date: date)
213
250
  # This might already be present and purchased if joined and reinstated in the same period
214
251
  end
215
252
 
253
+ # Assign member role
254
+ add_member_role(owner)
255
+
256
+ # Save owner
216
257
  save!(owner, date: date)
217
258
  end
218
259
 
@@ -267,16 +308,17 @@ module EffectiveMembershipsRegistrar
267
308
  true
268
309
  end
269
310
 
270
- def remove!(owner, date: nil)
311
+ # When you remove, you can set a status(es) which may affect reinstatement applications
312
+ def remove!(owner, statuses: nil, date: nil, notes: nil)
313
+ statuses = Array(statuses)
314
+
271
315
  raise('expecting a memberships owner') unless owner.class.respond_to?(:effective_memberships_owner?)
272
316
  raise('expected a member with a membership') unless owner.membership.present?
317
+ raise('expecting an membership status (optional)') if statuses.present? && statuses.any? { |status| !status.class.respond_to?(:effective_memberships_status?) }
273
318
 
274
319
  # Date
275
320
  date ||= Time.zone.now
276
321
 
277
- # Remove Membership
278
- owner.membership.mark_for_destruction
279
-
280
322
  # Delete unpurchased fees and orders
281
323
  owner.outstanding_fee_payment_fees.each { |fee| fee.mark_for_destruction }
282
324
  owner.outstanding_fee_payment_orders.each { |order| order.mark_for_destruction }
@@ -284,7 +326,17 @@ module EffectiveMembershipsRegistrar
284
326
  # Remove member role
285
327
  remove_member_role(owner)
286
328
 
287
- save!(owner, date: date)
329
+ # Remove Membership
330
+ owner.membership.mark_for_destruction
331
+
332
+ # We do the save a bit differently here because we want to set the removed statuses
333
+ history = owner.build_membership_history(start_on: date, notes: notes)
334
+
335
+ if statuses.present?
336
+ history.assign_attributes(statuses: statuses.map(&:to_s), status_ids: statuses.map(&:id))
337
+ end
338
+
339
+ owner.save!
288
340
  end
289
341
 
290
342
  def not_in_good_standing!(owner, date: nil, notes: nil)
@@ -25,13 +25,18 @@ module Effective
25
25
  serialize :status_ids, Array
26
26
 
27
27
  scope :deep, -> { includes(:owner) }
28
- scope :sorted, -> { order(:start_on) }
28
+ scope :sorted, -> { order(:start_on).order(:id) }
29
29
 
30
30
  scope :removed, -> { where(removed: true) }
31
31
 
32
32
  validates :owner, presence: true
33
33
  validates :start_on, presence: true
34
34
 
35
+ with_options(if: -> { removed? }) do
36
+ validates :number, absence: { message: 'must be blank when removed' }
37
+ validates :category_ids, absence: { message: 'must be blank when removed' }
38
+ end
39
+
35
40
  def to_s
36
41
  'membership history'
37
42
  end
@@ -17,6 +17,9 @@ module Effective
17
17
  attr_accessor :membership_number
18
18
  attr_accessor :skip_fees
19
19
 
20
+ # Reinstate
21
+ attr_accessor :skip_fees
22
+
20
23
  # Status Change
21
24
  attr_accessor :status_ids
22
25
  attr_accessor :status_id
@@ -64,6 +67,11 @@ module Effective
64
67
  EffectiveMemberships.Registrar.reclassify!(owner, to: category, skip_fees: skip_fees?)
65
68
  end
66
69
 
70
+ def reinstate!
71
+ update!(current_action: :reinstate)
72
+ EffectiveMemberships.Registrar.reinstate!(owner, skip_fees: skip_fees?)
73
+ end
74
+
67
75
  def status_assign!
68
76
  update!(current_action: :status_assign)
69
77
  EffectiveMemberships.Registrar.status_assign!(owner, status: statuses)
@@ -86,7 +94,7 @@ module Effective
86
94
 
87
95
  def remove!
88
96
  update!(current_action: :remove)
89
- EffectiveMemberships.Registrar.remove!(owner)
97
+ EffectiveMemberships.Registrar.remove!(owner, statuses: statuses)
90
98
  end
91
99
 
92
100
  def assign_attributes(atts)
@@ -4,9 +4,13 @@
4
4
  - categories = EffectiveMemberships.Category.all
5
5
  = f.select :category_id, categories, label: 'Approve to'
6
6
 
7
+ - reinstatement = applicant.owner.reinstatement_membership_history if applicant.reinstatement?
8
+
7
9
  %p
8
10
  - if applicant.owner.membership&.number_was.present?
9
11
  The member will keep their existing membership number: #{applicant.owner.membership.number}.
12
+ - elsif applicant.reinstatement? && reinstatement.number.present?
13
+ The member will keep their previous membership number: #{reinstatement.number}.
10
14
  - else
11
15
  - number = EffectiveMemberships.Registrar.next_membership_number(applicant.owner, to: applicant.category)
12
16
 
@@ -15,6 +19,9 @@
15
19
  - else
16
20
  No membership number will be assigned.
17
21
 
22
+ - if applicant.reinstatement?
23
+ %p The member will be reinstated with their previous status: #{badges(reinstatement.membership_statuses) || 'None'}.
24
+
18
25
  %h3 Fees
19
26
  %p The following fees will be created:
20
27
  - month = Time.zone.now.strftime('%B')
@@ -27,6 +34,9 @@
27
34
  %li A #{month} prorated fee to the new category
28
35
  %li A #{month} discount fee from their old category
29
36
 
37
+ - if applicant.reinstatement?
38
+ %li A #{month} prorated fee to their reinstatement category
39
+
30
40
  %p The following unpurchased fees will be deleted:
31
41
  - outstanding_fee_payment_fees = applicant.owner.outstanding_fee_payment_fees
32
42
 
@@ -15,3 +15,7 @@
15
15
  - if membership.blank? && owner.membership_histories.present?
16
16
  = card('History') do
17
17
  = render_datatable(Admin::EffectiveMembershipHistoriesDatatable.new(owner: owner), inline: true, simple: true)
18
+
19
+ - if owner.membership_removed?
20
+ - registrar_action = Effective::RegistrarAction.new(current_user: current_user, owner: owner)
21
+ = render 'admin/registrar_actions/form_reinstatement', registrar_action: registrar_action
@@ -15,3 +15,6 @@
15
15
  .mb-4= render 'admin/registrar_actions/form_not_in_good_standing', registrar_action: registrar_action
16
16
  .mb-4= render 'admin/registrar_actions/form_fees_paid', registrar_action: registrar_action
17
17
  .mb-4= render 'admin/registrar_actions/form_remove', registrar_action: registrar_action
18
+
19
+
20
+ - # The reinstatement form is added by memberships/form and not here
@@ -0,0 +1,44 @@
1
+ .card
2
+ .card-body
3
+ %h5.card-title Reinstate
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
+ - removed = f.object.owner.removed_membership_history
10
+ - reinstatement = f.object.owner.reinstatement_membership_history
11
+
12
+ - raise('expected a removed membership history') unless removed.present?
13
+ - raise('expected a reinstatement membership history') unless reinstatement.present?
14
+
15
+ - period = EffectiveMemberships.Registrar.current_period
16
+
17
+ %p.text-muted
18
+ Reinstate to previous membership and optionally create fees.
19
+
20
+ %p
21
+ This member was removed on #{removed.start_on.strftime('%F')} from
22
+ = reinstatement.membership_categories.first
23
+ = badges(reinstatement.membership_statuses)
24
+ - if reinstatement.number.present?
25
+ with number #{reinstatement.number}.
26
+
27
+ = f.check_box :current_action, label: 'Yes, reinstate this member to their previous category, status and number'
28
+
29
+ = f.show_if :current_action, true do
30
+ = f.check_box :skip_fees, label: 'Yes, skip creating fees and just set the category'
31
+
32
+ = f.hide_if :skip_fees, true do
33
+ %p The following fee(s) will be created:
34
+ - month = Time.zone.now.strftime('%B')
35
+
36
+ %ul
37
+ %li A #{month} prorated fee for the #{reinstatement.membership_categories.first} category
38
+
39
+ %p The member will be required to return to the website and make a fee payment
40
+
41
+ = f.show_if :skip_fees, true do
42
+ %p No fees will be created
43
+
44
+ = f.submit 'Reinstate', border: false, center: true, 'data-confirm': "Really reinstate #{f.object.owner}?"
@@ -13,5 +13,10 @@
13
13
  = f.check_box :current_action, label: 'Yes, remove this member'
14
14
 
15
15
  = f.show_if :current_action, true do
16
+ - statuses = f.object.owner.registrar_action_statuses(:remove)
17
+
18
+ - if statuses.present?
19
+ = f.select :status_ids, statuses, label: 'Remove with status', multiple: true, hint: 'Will be assigned to the membership history and may affect fees generated for reinstatement applicants'
20
+
16
21
  = f.submit 'Remove', border: false, center: true,
17
22
  'data-confirm': "Really remove #{f.object.owner}?"
@@ -1,3 +1 @@
1
- - membership = f.object.owner.membership
2
-
3
- %p Apply for reinstatement from #{badges(f.object.from_status || f.object.from_category)}.
1
+ %p Apply for reinstatement to #{resource.owner.reinstatement_membership_category}.
@@ -3,7 +3,8 @@
3
3
 
4
4
  - categories = resource.can_apply_categories_collection()
5
5
  - applicant_types = resource.can_apply_applicant_types_collection()
6
- - existing_category = resource.owner&.membership&.category
6
+ - existing_category = resource.owner.membership&.category
7
+ - reinstatement_category = resource.owner.reinstatement_membership_category
7
8
 
8
9
  = card do
9
10
  = effective_form_with(model: resource, url: wizard_path(step), method: :put) do |f|
@@ -20,11 +21,6 @@
20
21
  = render('effective/applicants/select/apply_to_join', f: f)
21
22
  = render('effective/applicants/select/categories', f: f, categories: categories)
22
23
 
23
- - elsif applicant_types == ['Apply for Reinstatement']
24
- = f.hidden_field :applicant_type, value: applicant_types.first
25
- = f.hidden_field :category_id, value: existing_category.id
26
- = render('effective/applicants/select/apply_for_reinstatement', f: f)
27
-
28
24
  - elsif applicant_types == ['Apply to Reclassify']
29
25
  = render('effective/applicants/select/apply_to_reclassify', f: f)
30
26
  = render('effective/applicants/select/categories', f: f, categories: categories - [existing_category])
@@ -32,6 +28,11 @@
32
28
  - else
33
29
  = f.select :applicant_type, applicant_types, label: 'Apply to...'
34
30
 
31
+ - if applicant_types.include?('Apply for Reinstatement')
32
+ = f.show_if :applicant_type, 'Apply for Reinstatement' do
33
+ = f.hidden_field :category_id, value: reinstatement_category.id
34
+ = render('effective/applicants/select/apply_for_reinstatement', f: f)
35
+
35
36
  - if applicant_types.include?('Apply to Join')
36
37
  = f.show_if :applicant_type, 'Apply to Join' do
37
38
  = render('effective/applicants/select/apply_to_join', f: f)
@@ -42,9 +43,4 @@
42
43
  = render('effective/applicants/select/apply_to_reclassify', f: f)
43
44
  = render('effective/applicants/select/categories', f: f, categories: categories - [existing_category])
44
45
 
45
- - if applicant_types.include?('Apply for Reinstatement')
46
- = f.show_if :applicant_type, 'Apply for Reinstatement' do
47
- = f.hidden_field :category_id, value: existing_category.id
48
- = render('effective/applicants/select/apply_for_reinstatement', f: f)
49
-
50
46
  = f.save 'Save and Continue'
@@ -35,6 +35,7 @@
35
35
 
36
36
  - if current_user.membership_removed?
37
37
  %p Your membership was removed on #{current_user.membership_removed_on.strftime('%F')}.
38
+ %p You may Apply for Reinstatement to #{current_user.reinstatement_membership_category} by clicking the Apply to Join button below and then complete the wizard.
38
39
 
39
40
  - if membership_organizations.present?
40
41
  %p You are a representative for #{pluralize(membership_organizations.length, 'member organization')}.
@@ -1,3 +1,3 @@
1
1
  module EffectiveMemberships
2
- VERSION = '0.9.6'
2
+ VERSION = '0.9.7'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_memberships
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.6
4
+ version: 0.9.7
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-11-28 00:00:00.000000000 Z
11
+ date: 2022-12-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -383,6 +383,7 @@ files:
383
383
  - app/views/admin/registrar_actions/_form_not_in_good_standing.html.haml
384
384
  - app/views/admin/registrar_actions/_form_reclassify.html.haml
385
385
  - app/views/admin/registrar_actions/_form_register.html.haml
386
+ - app/views/admin/registrar_actions/_form_reinstatement.html.haml
386
387
  - app/views/admin/registrar_actions/_form_remove.html.haml
387
388
  - app/views/admin/registrar_actions/_form_status_change.html.haml
388
389
  - app/views/admin/representatives/_form.html.haml