effective_memberships 0.5.0 → 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/models/concerns/effective_memberships_applicant.rb +81 -41
- data/app/models/concerns/effective_memberships_category.rb +9 -2
- data/app/models/concerns/effective_memberships_fee_payment.rb +16 -6
- data/app/models/concerns/effective_memberships_registrar.rb +20 -1
- data/app/models/effective/fee.rb +11 -3
- 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/db/migrate/01_create_effective_memberships.rb.erb +7 -0
- data/db/seeds.rb +6 -0
- data/lib/effective_memberships/version.rb +1 -1
- data/lib/effective_memberships.rb +1 -1
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0c5813efd8fd5455db9964bbb466b8ae8d12f44ee3acce7a945c5ff67550c5e8
|
4
|
+
data.tar.gz: a91d84a98511574b854ae98724d5fbdd37a66aef5a9d87a29956bd6c9cf95062
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 83c2dba1cfde3ace28c1037a633e50a4f975f5b8be24877ee2d96e029197c5d43ea8b4e66a2e3a992c9f9298c6c81d84fdaa2045a6e7dc12e3ef97ad154a4a90
|
7
|
+
data.tar.gz: 18b9f5b9377923a1a17703f104ab51710a9c6dacfb6315c322c6a71c3c6204e4b80d64ec13121c4d95b20178e807087bf8ab383288486e6f3abba9b09ca72bf2
|
@@ -22,7 +22,7 @@ module EffectiveMembershipsApplicant
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def categories
|
25
|
-
['Apply to Join', 'Apply to Reclassify']
|
25
|
+
['Apply to Join', 'Apply to Reclassify', 'Apply for Reinstatement']
|
26
26
|
end
|
27
27
|
|
28
28
|
def transcripts_statuses
|
@@ -51,6 +51,7 @@ module EffectiveMembershipsApplicant
|
|
51
51
|
select: 'Select Application Type',
|
52
52
|
demographics: 'Demographics', # Individual only. Users fields.
|
53
53
|
organization: 'Organization', # Organization only. Organization fields.
|
54
|
+
reinstatement: 'Reinstatement', # Apply for Reinstatement only
|
54
55
|
education: 'Education',
|
55
56
|
course_amounts: 'Courses',
|
56
57
|
equivalences: 'Equivalent Memberships',
|
@@ -80,6 +81,9 @@ module EffectiveMembershipsApplicant
|
|
80
81
|
attr_accessor :declare_code_of_ethics
|
81
82
|
attr_accessor :declare_truth
|
82
83
|
|
84
|
+
# Reinstatements Step
|
85
|
+
attr_accessor :declare_reinstatement
|
86
|
+
|
83
87
|
# Admin Approve Step
|
84
88
|
attr_accessor :approved_membership_number
|
85
89
|
attr_accessor :approved_membership_date
|
@@ -93,7 +97,10 @@ module EffectiveMembershipsApplicant
|
|
93
97
|
|
94
98
|
belongs_to :category, polymorphic: true, optional: true
|
95
99
|
|
100
|
+
# Required for Apply to Reclassify
|
96
101
|
belongs_to :from_category, polymorphic: true, optional: true
|
102
|
+
|
103
|
+
# Required for Apply for Reinstatement
|
97
104
|
belongs_to :from_status, polymorphic: true, optional: true
|
98
105
|
|
99
106
|
has_many :applicant_reviews, -> { order(:id) }, as: :applicant, inverse_of: :applicant, dependent: :destroy
|
@@ -171,7 +178,7 @@ module EffectiveMembershipsApplicant
|
|
171
178
|
timestamps
|
172
179
|
end
|
173
180
|
|
174
|
-
scope :deep, -> { includes(:user, :organization, :category, :from_category, :orders) }
|
181
|
+
scope :deep, -> { includes(:user, :organization, :category, :from_category, :from_status, :orders) }
|
175
182
|
scope :sorted, -> { order(:id) }
|
176
183
|
|
177
184
|
scope :in_progress, -> { where.not(status: [:approved, :declined]) }
|
@@ -186,7 +193,7 @@ module EffectiveMembershipsApplicant
|
|
186
193
|
|
187
194
|
# Set Apply to Join or Reclassification
|
188
195
|
before_validation(if: -> { (new_record? || current_step == :select) && owner.present? }) do
|
189
|
-
self.applicant_type
|
196
|
+
self.applicant_type ||= can_apply_applicant_types_collection().first
|
190
197
|
self.from_category = owner.membership&.category
|
191
198
|
self.from_status = owner.membership&.status
|
192
199
|
end
|
@@ -197,12 +204,18 @@ module EffectiveMembershipsApplicant
|
|
197
204
|
|
198
205
|
# All Steps validations
|
199
206
|
validates :user, presence: true
|
207
|
+
|
200
208
|
validates :from_category, presence: true, if: -> { reclassification? }
|
209
|
+
validates :from_status, presence: true, if: -> { reinstatement? }
|
201
210
|
|
202
|
-
validate(if: -> { reclassification? }) do
|
211
|
+
validate(if: -> { reclassification? && category_id.present? }) do
|
203
212
|
errors.add(:category_id, "can't reclassify to existing category") if category_id == from_category_id
|
204
213
|
end
|
205
214
|
|
215
|
+
validate(if: -> { reinstatement? && category_id.present? }) do
|
216
|
+
errors.add(:category_id, "must match existing category when reinstatement") unless category_id == from_category_id
|
217
|
+
end
|
218
|
+
|
206
219
|
validate(if: -> { category.present? }) do
|
207
220
|
self.errors.add(:organization_id, "can't be blank when organization category") if category.organization? && organization.blank?
|
208
221
|
self.errors.add(:organization_id, "must be blank when individual category") if category.individual? && organization.present?
|
@@ -315,6 +328,12 @@ module EffectiveMembershipsApplicant
|
|
315
328
|
validates :declare_truth, acceptance: true
|
316
329
|
end
|
317
330
|
|
331
|
+
# Reinstatements step
|
332
|
+
with_options(if: -> { current_step == :reinstatement }) do
|
333
|
+
validates :declare_reinstatement, acceptance: true
|
334
|
+
end
|
335
|
+
|
336
|
+
|
318
337
|
# Admin Approve
|
319
338
|
validate(if: -> { approved_membership_date.present? }) do
|
320
339
|
if approved_membership_date.to_date > Time.zone.now.to_date
|
@@ -340,16 +359,19 @@ module EffectiveMembershipsApplicant
|
|
340
359
|
# This required_steps is defined inside the included do .. end block so it overrides the acts_as_wizard one.
|
341
360
|
def required_steps
|
342
361
|
return self.class.test_required_steps if Rails.env.test? && self.class.test_required_steps.present?
|
362
|
+
return self.class.all_wizard_steps if category.blank?
|
343
363
|
|
344
364
|
@_required_steps ||= begin
|
345
|
-
|
365
|
+
# All required
|
346
366
|
required_steps = self.class.required_wizard_steps
|
347
367
|
|
348
|
-
|
368
|
+
# Based on current applicant
|
369
|
+
applicant_steps = (reinstatement? ? category.applicant_reinstatement_wizard_steps : category.applicant_wizard_steps)
|
349
370
|
|
350
|
-
#
|
371
|
+
# Sanity check
|
351
372
|
applicant_steps.delete(:stamp) unless apply_to_join?
|
352
373
|
applicant_steps.delete(:organization) unless category&.organization?
|
374
|
+
applicant_steps.delete(:reinstatement) unless reinstatement?
|
353
375
|
|
354
376
|
# change_wizard_steps is defined in effective_resources acts_as_wizard
|
355
377
|
applicant_steps = change_wizard_steps(applicant_steps)
|
@@ -358,40 +380,45 @@ module EffectiveMembershipsApplicant
|
|
358
380
|
raise('expected change_wizard_steps to return an Array of steps with no nils')
|
359
381
|
end
|
360
382
|
|
361
|
-
|
362
|
-
required_steps.include?(step) ||
|
383
|
+
self.class.all_wizard_steps.select do |step|
|
384
|
+
required_steps.include?(step) || applicant_steps.include?(step)
|
363
385
|
end
|
364
386
|
end
|
365
387
|
end
|
366
388
|
|
367
389
|
def sidebar_steps
|
368
|
-
|
369
|
-
required_steps
|
390
|
+
has_completed_step?(:select) ? required_steps : self.class.required_wizard_steps
|
370
391
|
end
|
371
392
|
|
372
393
|
def can_visit_step?(step)
|
373
|
-
if missing_info?
|
374
|
-
return [:start, :select, :billing, :checkout].exclude?(step)
|
375
|
-
end
|
376
|
-
|
394
|
+
return [:start, :select, :billing, :checkout].exclude?(step) if missing_info?
|
377
395
|
can_revisit_completed_steps(step)
|
378
396
|
end
|
379
397
|
|
398
|
+
def applicant_fee_type
|
399
|
+
return 'Reinstatement' if reinstatement?
|
400
|
+
'Applicant'
|
401
|
+
end
|
402
|
+
|
380
403
|
def applicant_fee_category
|
381
404
|
category
|
382
405
|
end
|
383
406
|
|
384
407
|
def applicant_fee_price
|
408
|
+
return category.applicant_reinstatement_fee if reinstatement?
|
385
409
|
category.applicant_fee
|
386
410
|
end
|
387
411
|
|
388
412
|
# All Fees and Orders
|
389
413
|
def submit_fees
|
390
414
|
# Find or build submit fee
|
391
|
-
fee = fees.first || fees.build(owner: owner
|
415
|
+
fee = fees.first || fees.build(owner: owner)
|
416
|
+
|
417
|
+
raise('expected a present applicant fee price') if applicant_fee_price.blank?
|
392
418
|
|
393
419
|
unless fee.purchased?
|
394
420
|
fee.assign_attributes(
|
421
|
+
fee_type: applicant_fee_type(),
|
395
422
|
category: applicant_fee_category(),
|
396
423
|
price: applicant_fee_price(),
|
397
424
|
tax_exempt: applicant_fee_category().applicant_fee_tax_exempt,
|
@@ -436,18 +463,9 @@ module EffectiveMembershipsApplicant
|
|
436
463
|
|
437
464
|
# Instance Methods
|
438
465
|
def to_s
|
439
|
-
if
|
440
|
-
|
441
|
-
|
442
|
-
'-',
|
443
|
-
category,
|
444
|
-
'for',
|
445
|
-
category,
|
446
|
-
("from #{from_category}" if reclassification?)
|
447
|
-
].compact.join(' ')
|
448
|
-
else
|
449
|
-
'New Applicant'
|
450
|
-
end
|
466
|
+
return 'New Applicant' if applicant_type.blank? || category.blank? || owner.blank?
|
467
|
+
|
468
|
+
"#{owner} - #{applicant_type} to #{category}"
|
451
469
|
end
|
452
470
|
|
453
471
|
def owner
|
@@ -470,6 +488,10 @@ module EffectiveMembershipsApplicant
|
|
470
488
|
applicant_type == 'Apply to Reclassify'
|
471
489
|
end
|
472
490
|
|
491
|
+
def reinstatement?
|
492
|
+
applicant_type == 'Apply for Reinstatement'
|
493
|
+
end
|
494
|
+
|
473
495
|
def individual?
|
474
496
|
!(owner.kind_of?(EffectiveMemberships.Organization) && category&.organization?)
|
475
497
|
end
|
@@ -519,6 +541,17 @@ module EffectiveMembershipsApplicant
|
|
519
541
|
end.html_safe
|
520
542
|
end
|
521
543
|
|
544
|
+
# Used by the select step
|
545
|
+
def can_apply_applicant_types_collection
|
546
|
+
if owner.blank? || owner.membership.blank? || owner.membership.categories.blank?
|
547
|
+
['Apply to Join']
|
548
|
+
elsif owner.membership.statuses.present?
|
549
|
+
['Apply for Reinstatement', 'Apply to Join']
|
550
|
+
else
|
551
|
+
['Apply to Reclassify']
|
552
|
+
end
|
553
|
+
end
|
554
|
+
|
522
555
|
# Used by the select step
|
523
556
|
def can_apply_categories_collection
|
524
557
|
categories = EffectiveMemberships.Category.sorted.can_apply
|
@@ -527,7 +560,7 @@ module EffectiveMembershipsApplicant
|
|
527
560
|
return categories.where(can_apply_new: true)
|
528
561
|
end
|
529
562
|
|
530
|
-
category_ids = user.
|
563
|
+
category_ids = user.membership.category_ids
|
531
564
|
|
532
565
|
categories.select do |cat|
|
533
566
|
cat.can_apply_existing? ||
|
@@ -587,7 +620,7 @@ module EffectiveMembershipsApplicant
|
|
587
620
|
end
|
588
621
|
|
589
622
|
def applicant_references_required?
|
590
|
-
min_applicant_references > 0
|
623
|
+
required_steps.include?(:references) && min_applicant_references > 0
|
591
624
|
end
|
592
625
|
|
593
626
|
# Endorsements Step
|
@@ -596,7 +629,7 @@ module EffectiveMembershipsApplicant
|
|
596
629
|
end
|
597
630
|
|
598
631
|
def applicant_endorsements_required?
|
599
|
-
min_applicant_endorsements > 0
|
632
|
+
required_steps.include?(:endorsements) && min_applicant_endorsements > 0
|
600
633
|
end
|
601
634
|
|
602
635
|
# Equivalences Step
|
@@ -610,7 +643,7 @@ module EffectiveMembershipsApplicant
|
|
610
643
|
end
|
611
644
|
|
612
645
|
def transcripts_required?
|
613
|
-
|
646
|
+
required_steps.include?(:transcripts)
|
614
647
|
end
|
615
648
|
|
616
649
|
# Files Step
|
@@ -634,16 +667,16 @@ module EffectiveMembershipsApplicant
|
|
634
667
|
requirements = {}
|
635
668
|
return requirements unless category.present?
|
636
669
|
|
637
|
-
if
|
638
|
-
requirements['Applicant Endorsements'] = (
|
670
|
+
if applicant_endorsements_required?
|
671
|
+
requirements['Applicant Endorsements'] = (applicant_endorsements.count(&:completed?) >= min_applicant_endorsements)
|
639
672
|
end
|
640
673
|
|
641
|
-
if
|
642
|
-
requirements['Applicant References'] = (
|
674
|
+
if applicant_references_required?
|
675
|
+
requirements['Applicant References'] = (applicant_references.count(&:completed?) >= min_applicant_references)
|
643
676
|
end
|
644
677
|
|
645
|
-
if
|
646
|
-
requirements['Applicant Transcripts'] =
|
678
|
+
if transcripts_required?
|
679
|
+
requirements['Applicant Transcripts'] = transcripts_received?
|
647
680
|
end
|
648
681
|
|
649
682
|
requirements
|
@@ -692,9 +725,14 @@ module EffectiveMembershipsApplicant
|
|
692
725
|
# When an application is completed, these must be done to go to reviewed
|
693
726
|
# An Admin can override this and just set them to reviewed.
|
694
727
|
def reviewed_requirements
|
695
|
-
{
|
696
|
-
|
697
|
-
|
728
|
+
requirements = {}
|
729
|
+
return requirements unless category.present?
|
730
|
+
|
731
|
+
if applicant_reviews_required?
|
732
|
+
requirements['Applicant Reviews'] = (applicant_reviews.count(&:completed?) >= min_applicant_reviews)
|
733
|
+
end
|
734
|
+
|
735
|
+
requirements
|
698
736
|
end
|
699
737
|
|
700
738
|
def review!
|
@@ -726,6 +764,8 @@ module EffectiveMembershipsApplicant
|
|
726
764
|
)
|
727
765
|
elsif reclassification?
|
728
766
|
EffectiveMemberships.Registrar.reclassify!(owner, to: category)
|
767
|
+
elsif reinstatement?
|
768
|
+
EffectiveMemberships.Registrar.reinstate!(owner)
|
729
769
|
else
|
730
770
|
raise('unsupported approval applicant_type')
|
731
771
|
end
|
@@ -51,8 +51,9 @@ module EffectiveMembershipsCategory
|
|
51
51
|
can_apply_restricted :boolean
|
52
52
|
can_apply_restricted_ids :text
|
53
53
|
|
54
|
-
applicant_fee
|
55
|
-
|
54
|
+
applicant_fee :integer
|
55
|
+
applicant_reinstatement_fee :integer
|
56
|
+
applicant_wizard_steps :text
|
56
57
|
|
57
58
|
min_applicant_educations :integer
|
58
59
|
min_applicant_endorsements :integer
|
@@ -192,10 +193,16 @@ module EffectiveMembershipsCategory
|
|
192
193
|
applicant_review_wizard_steps - EffectiveMemberships.ApplicantReview.required_wizard_steps
|
193
194
|
end
|
194
195
|
|
196
|
+
# Apply to Join or Apply to Reclassify
|
195
197
|
def applicant_wizard_steps
|
196
198
|
(Array(self[:applicant_wizard_steps]) - [nil, '']).map(&:to_sym)
|
197
199
|
end
|
198
200
|
|
201
|
+
# Apply for Reinstatement
|
202
|
+
def applicant_reinstatement_wizard_steps
|
203
|
+
[:reinstatement]
|
204
|
+
end
|
205
|
+
|
199
206
|
def fee_payment_wizard_steps
|
200
207
|
(Array(self[:fee_payment_wizard_steps]) - [nil, '']).map(&:to_sym)
|
201
208
|
end
|
@@ -57,7 +57,7 @@ module EffectiveMembershipsFeePayment
|
|
57
57
|
accepts_nested_attributes_for :organization
|
58
58
|
|
59
59
|
belongs_to :category, polymorphic: true, optional: true
|
60
|
-
belongs_to :
|
60
|
+
belongs_to :with_status, polymorphic: true, optional: true
|
61
61
|
|
62
62
|
# Effective Namespace
|
63
63
|
has_many :fees, -> { order(:id) }, as: :parent, class_name: 'Effective::Fee', dependent: :nullify
|
@@ -102,7 +102,7 @@ module EffectiveMembershipsFeePayment
|
|
102
102
|
|
103
103
|
before_validation(if: -> { current_step == :start && user && user.membership }) do
|
104
104
|
self.category ||= user.membership.categories.first if user.membership.categories.length == 1
|
105
|
-
self.
|
105
|
+
self.with_status ||= user.membership.statuses.first if user.membership.statuses.length == 1
|
106
106
|
end
|
107
107
|
|
108
108
|
# All Steps validations
|
@@ -121,17 +121,27 @@ module EffectiveMembershipsFeePayment
|
|
121
121
|
# This required_steps is defined inside the included do .. end block so it overrides the acts_as_wizard one.
|
122
122
|
def required_steps
|
123
123
|
return self.class.test_required_steps if Rails.env.test? && self.class.test_required_steps.present?
|
124
|
+
return self.class.all_wizard_steps if category.blank?
|
124
125
|
|
125
126
|
@_required_steps ||= begin
|
126
|
-
|
127
|
+
# All required
|
127
128
|
required_steps = self.class.required_wizard_steps
|
128
129
|
|
129
|
-
|
130
|
+
# Based on current fee payment
|
131
|
+
fee_payment_steps = Array(category.fee_payment_wizard_steps)
|
130
132
|
|
133
|
+
# Sanity Check
|
131
134
|
fee_payment_steps.delete(:organization) unless organization?
|
132
135
|
|
133
|
-
|
134
|
-
|
136
|
+
# change_wizard_steps is defined in effective_resources acts_as_wizard
|
137
|
+
fee_payment_steps = change_wizard_steps(fee_payment_steps)
|
138
|
+
|
139
|
+
unless fee_payment_steps.kind_of?(Array) && fee_payment_steps.all? { |step| step.kind_of?(Symbol) }
|
140
|
+
raise('expected change_wizard_steps to return an Array of steps with no nils')
|
141
|
+
end
|
142
|
+
|
143
|
+
self.class.all_wizard_steps.select do |step|
|
144
|
+
required_steps.include?(step) || fee_payment_steps.include?(step)
|
135
145
|
end
|
136
146
|
end
|
137
147
|
end
|
@@ -155,7 +155,6 @@ module EffectiveMembershipsRegistrar
|
|
155
155
|
raise('expecting a memberships owner') unless owner.class.respond_to?(:effective_memberships_owner?)
|
156
156
|
raise('owner must have an existing membership. use register! instead') if owner.membership.blank?
|
157
157
|
|
158
|
-
# Todo. I dunno this was owner.membership.category
|
159
158
|
from = owner.membership.category
|
160
159
|
|
161
160
|
raise('expecting a to memberships category') unless to.class.respond_to?(:effective_memberships_category?)
|
@@ -183,6 +182,26 @@ module EffectiveMembershipsRegistrar
|
|
183
182
|
save!(owner, date: date)
|
184
183
|
end
|
185
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
|
+
|
186
205
|
# This clears the status entirely from user
|
187
206
|
def status_remove!(owner, date: nil)
|
188
207
|
status_change!(owner, to: nil, date: date)
|
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?
|
@@ -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 @@
|
|
1
|
+
%p Please select a category for your application to join:
|
@@ -0,0 +1,25 @@
|
|
1
|
+
- organization_categories = categories.select(&:organization?)
|
2
|
+
|
3
|
+
- if categories.blank?
|
4
|
+
%p
|
5
|
+
There are no categories available for you to apply for.
|
6
|
+
Please contact us if you believe this is in error.
|
7
|
+
|
8
|
+
- if categories.present?
|
9
|
+
= f.select :category_id, categories, required: true
|
10
|
+
|
11
|
+
- categories.each do |mc|
|
12
|
+
= f.show_if(:category_id, mc.id) do
|
13
|
+
.mb-4
|
14
|
+
%h3= mc.to_s
|
15
|
+
|
16
|
+
- if organization_categories.present?
|
17
|
+
%small.text-muted #{mc.category} #{mc.category_type} Membership
|
18
|
+
|
19
|
+
= mc.rich_text_body
|
20
|
+
|
21
|
+
= render_if_exists("effective/applicants/select/#{mc.to_s.parameterize.underscore}", f: f, category: mc)
|
22
|
+
|
23
|
+
- if organization_categories.present?
|
24
|
+
= f.show_if_any(:category_id, organization_categories.map(&:id)) do
|
25
|
+
= render('effective/applicants/select_organization', f: f)
|
@@ -2,41 +2,49 @@
|
|
2
2
|
= render 'effective/applicants/content', resource: resource
|
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
7
|
|
7
8
|
= card do
|
8
|
-
|
9
|
-
|
10
|
-
There are no categories available for you to apply for.
|
11
|
-
Please contact us if you believe this is in error.
|
9
|
+
= effective_form_with(model: resource, url: wizard_path(step), method: :put) do |f|
|
10
|
+
= f.hidden_field :id
|
12
11
|
|
13
|
-
|
14
|
-
|
12
|
+
= f.hidden_field :stream, value: nil
|
13
|
+
= f.hidden_field :organization_id, value: nil
|
14
|
+
= f.hidden_field :organization_type, value: nil
|
15
15
|
|
16
|
-
=
|
17
|
-
|
16
|
+
= f.hidden_field :applicant_type, value: applicant_types.first
|
17
|
+
= f.hidden_field :category_type, value: EffectiveMemberships.Category.name
|
18
18
|
|
19
|
-
|
20
|
-
=
|
21
|
-
= f
|
22
|
-
= f.hidden_field :category_type, value: EffectiveMemberships.Category.name
|
19
|
+
- if applicant_types == ['Apply to Join']
|
20
|
+
= render('effective/applicants/select/apply_to_join', f: f)
|
21
|
+
= render('effective/applicants/select/categories', f: f, categories: categories)
|
23
22
|
|
24
|
-
|
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)
|
25
27
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
%h3= mc.to_s
|
28
|
+
- elsif applicant_types == ['Apply to Reclassify']
|
29
|
+
= render('effective/applicants/select/apply_to_reclassify', f: f)
|
30
|
+
= render('effective/applicants/select/categories', f: f, categories: categories - [existing_category])
|
30
31
|
|
31
|
-
|
32
|
-
|
32
|
+
- else
|
33
|
+
= f.select :applicant_type, applicant_types, label: 'Apply to...'
|
33
34
|
|
34
|
-
|
35
|
+
- if applicant_types.include?('Apply to Join')
|
36
|
+
= f.show_if :applicant_type, 'Apply to Join' do
|
37
|
+
= render('effective/applicants/select/apply_to_join', f: f)
|
38
|
+
= render('effective/applicants/select/categories', f: f, categories: categories)
|
35
39
|
|
36
|
-
|
40
|
+
- if applicant_types.include?('Apply to Reclassify')
|
41
|
+
= f.show_if :applicant_type, 'Apply to Reclassify' do
|
42
|
+
= render('effective/applicants/select/apply_to_reclassify', f: f)
|
43
|
+
= render('effective/applicants/select/categories', f: f, categories: categories - [existing_category])
|
37
44
|
|
38
|
-
- if
|
39
|
-
= f.
|
40
|
-
=
|
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)
|
41
49
|
|
42
|
-
|
50
|
+
= f.save 'Save and Continue'
|
@@ -18,6 +18,7 @@ class CreateEffectiveMemberships < ActiveRecord::Migration[6.0]
|
|
18
18
|
|
19
19
|
t.text :applicant_wizard_steps
|
20
20
|
t.integer :applicant_fee
|
21
|
+
t.integer :applicant_reinstatement_fee
|
21
22
|
|
22
23
|
t.text :applicant_review_wizard_steps
|
23
24
|
|
@@ -458,6 +459,9 @@ class CreateEffectiveMemberships < ActiveRecord::Migration[6.0]
|
|
458
459
|
t.integer :category_id
|
459
460
|
t.string :category_type
|
460
461
|
|
462
|
+
t.integer :with_status_id
|
463
|
+
t.string :with_status_type
|
464
|
+
|
461
465
|
t.string :fee_type
|
462
466
|
|
463
467
|
t.integer :purchased_order_id
|
@@ -502,6 +506,9 @@ class CreateEffectiveMemberships < ActiveRecord::Migration[6.0]
|
|
502
506
|
t.integer :category_id
|
503
507
|
t.string :category_type
|
504
508
|
|
509
|
+
t.integer :with_status_id
|
510
|
+
t.string :with_status_type
|
511
|
+
|
505
512
|
t.date :period
|
506
513
|
|
507
514
|
# Acts as Statused
|
data/db/seeds.rb
CHANGED
@@ -9,6 +9,8 @@ if Rails.env.test?
|
|
9
9
|
Effective::ApplicantCourseName.delete_all
|
10
10
|
end
|
11
11
|
|
12
|
+
Effective::Status.where(title: 'Resigned').first_or_create!
|
13
|
+
|
12
14
|
member = Effective::Category.create!(
|
13
15
|
title: "Full Member",
|
14
16
|
can_apply_new: true,
|
@@ -18,6 +20,7 @@ member = Effective::Category.create!(
|
|
18
20
|
min_applicant_references: 2,
|
19
21
|
min_applicant_reviews: 2,
|
20
22
|
applicant_fee: 100_00,
|
23
|
+
applicant_reinstatement_fee: 50_00,
|
21
24
|
renewal_fee: 250_00,
|
22
25
|
late_fee: 50_00,
|
23
26
|
prorated_jan: 120_00, prorated_feb: 110_00, prorated_mar: 100_00, prorated_apr: 90_00, prorated_may: 80_00, prorated_jun: 70_00,
|
@@ -34,6 +37,7 @@ student = Effective::Category.create!(
|
|
34
37
|
min_applicant_references: 0,
|
35
38
|
min_applicant_reviews: 0,
|
36
39
|
applicant_fee: 50_00,
|
40
|
+
applicant_reinstatement_fee: 25_00,
|
37
41
|
renewal_fee: 125_00,
|
38
42
|
late_fee: 25_00,
|
39
43
|
prorated_jan: 120_00, prorated_feb: 110_00, prorated_mar: 100_00, prorated_apr: 90_00, prorated_may: 80_00, prorated_jun: 70_00,
|
@@ -49,6 +53,7 @@ retired = Effective::Category.create!(
|
|
49
53
|
can_apply_restricted: true,
|
50
54
|
can_apply_restricted_ids: [member.id],
|
51
55
|
applicant_fee: 0,
|
56
|
+
applicant_reinstatement_fee: 0,
|
52
57
|
renewal_fee: 0,
|
53
58
|
prorated_jan: 120_00, prorated_feb: 110_00, prorated_mar: 100_00, prorated_apr: 90_00, prorated_may: 80_00, prorated_jun: 70_00,
|
54
59
|
prorated_jul: 60_00, prorated_aug: 50_00, prorated_sep: 40_00, prorated_oct: 30_00, prorated_nov: 20_00, prorated_dec: 10_00,
|
@@ -66,6 +71,7 @@ member = Effective::Category.create!(
|
|
66
71
|
min_applicant_references: 2,
|
67
72
|
min_applicant_reviews: 2,
|
68
73
|
applicant_fee: 100_00,
|
74
|
+
applicant_reinstatement_fee: 50_00,
|
69
75
|
renewal_fee: 250_00,
|
70
76
|
late_fee: 50_00,
|
71
77
|
prorated_jan: 120_00, prorated_feb: 110_00, prorated_mar: 100_00, prorated_apr: 90_00, prorated_may: 80_00, prorated_jun: 70_00,
|
@@ -54,7 +54,7 @@ module EffectiveMemberships
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def self.fee_types
|
57
|
-
required = ['Applicant', 'Prorated', 'Discount', 'Renewal', 'Late', 'Admin']
|
57
|
+
required = ['Applicant', 'Reinstatement', 'Prorated', 'Discount', 'Renewal', 'Late', 'Admin']
|
58
58
|
additional = Array(additional_fee_types)
|
59
59
|
|
60
60
|
(required + additional).uniq.sort
|
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.5.
|
4
|
+
version: 0.5.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-08-
|
11
|
+
date: 2022-08-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -413,6 +413,7 @@ files:
|
|
413
413
|
- app/views/effective/applicants/_orders.html.haml
|
414
414
|
- app/views/effective/applicants/_organization.html.haml
|
415
415
|
- app/views/effective/applicants/_references.html.haml
|
416
|
+
- app/views/effective/applicants/_reinstatement.html.haml
|
416
417
|
- app/views/effective/applicants/_select.html.haml
|
417
418
|
- app/views/effective/applicants/_select_organization.html.haml
|
418
419
|
- app/views/effective/applicants/_stamp.html.haml
|
@@ -431,7 +432,12 @@ files:
|
|
431
432
|
- app/views/effective/applicants/files.html.haml
|
432
433
|
- app/views/effective/applicants/organization.html.haml
|
433
434
|
- app/views/effective/applicants/references.html.haml
|
435
|
+
- app/views/effective/applicants/reinstatement.html.haml
|
434
436
|
- app/views/effective/applicants/select.html.haml
|
437
|
+
- app/views/effective/applicants/select/_apply_for_reinstatement.html.haml
|
438
|
+
- app/views/effective/applicants/select/_apply_to_join.html.haml
|
439
|
+
- app/views/effective/applicants/select/_apply_to_reclassify.html.haml
|
440
|
+
- app/views/effective/applicants/select/_categories.html.haml
|
435
441
|
- app/views/effective/applicants/stamp.html.haml
|
436
442
|
- app/views/effective/applicants/start.html.haml
|
437
443
|
- app/views/effective/applicants/submitted.html.haml
|