effective_memberships 0.3.8 → 0.3.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/admin/applicants_controller.rb +14 -0
  3. data/app/controllers/effective/applicants_controller.rb +2 -0
  4. data/app/datatables/admin/effective_applicants_datatable.rb +9 -3
  5. data/app/datatables/admin/effective_fees_datatable.rb +5 -3
  6. data/app/datatables/admin/effective_memberships_datatable.rb +38 -1
  7. data/app/datatables/effective_applicants_datatable.rb +10 -4
  8. data/app/datatables/effective_memberships_directory_datatable.rb +1 -1
  9. data/app/helpers/effective_memberships_helper.rb +9 -0
  10. data/app/mailers/effective/memberships_mailer.rb +16 -6
  11. data/app/models/concerns/effective_memberships_applicant.rb +115 -44
  12. data/app/models/concerns/effective_memberships_category.rb +22 -2
  13. data/app/models/effective/applicant_reference.rb +6 -1
  14. data/app/models/effective/membership.rb +2 -0
  15. data/app/views/admin/applicants/_form.html.haml +10 -6
  16. data/app/views/admin/applicants/_form_approve.html.haml +1 -5
  17. data/app/views/admin/applicants/_form_complete.html.haml +8 -0
  18. data/app/views/admin/applicants/_form_missing_info.html.haml +11 -0
  19. data/app/views/admin/applicants/_form_process.html.haml +16 -12
  20. data/app/views/admin/applicants/_status.html.haml +67 -49
  21. data/app/views/effective/applicants/_missing_info.html.haml +18 -0
  22. data/app/views/effective/applicants/_stamp.html.haml +36 -0
  23. data/app/views/effective/applicants/_summary.html.haml +1 -1
  24. data/app/views/effective/applicants/stamp.html.haml +28 -0
  25. data/app/views/effective/applicants/submitted.html.haml +11 -9
  26. data/app/views/effective/applicants/summary.html.haml +7 -1
  27. data/app/views/effective/memberships_mailer/applicant_completed.liquid +15 -0
  28. data/app/views/effective/memberships_mailer/applicant_missing_info.liquid +17 -0
  29. data/config/effective_memberships.rb +5 -0
  30. data/db/migrate/01_create_effective_memberships.rb.erb +4 -0
  31. data/lib/effective_memberships/version.rb +1 -1
  32. data/lib/effective_memberships.rb +5 -1
  33. metadata +23 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a5429d3c4c93088302ef65577a3f97649d2bb56191f701a5475f41973860ad21
4
- data.tar.gz: 276b0b0d68ebf151cf67d8f542105b656688b1bf4969c5047c13c1667d364dca
3
+ metadata.gz: 8200c84934681ed1e13ce23e75bf061f58e0f83f4549be02de3efdadf4f31c6e
4
+ data.tar.gz: e09fda17565f145d34ccc7c18674159b943170a150a6798da453884fecc61372
5
5
  SHA512:
6
- metadata.gz: 5b1c53a8c3cec9712413f4d2c8f58786db72d8e2a12da1f40920fa39ffae3162e67c9782c72bf290ec91b1a29e3aa93374b0c09cb09dafda6151803aec93d578
7
- data.tar.gz: f7bb8c97dbbc5c4f45f6c8b60cc4979fc4de32822b06f4a930a69fc6e7844fba015bf2dd9fa5a4038e885ab6353497cee7a1db0aafb1ec20c561389255315fd1
6
+ metadata.gz: 15f1850e5b6aa9cc4124f49a1dd2ea8599222d2fbe54053d63b5bcc6171a3abfd9f551932d72eef79232024d7a04b93390c16fed8a57836e04ea3fea85011511
7
+ data.tar.gz: 4a317ace51abee560000072f05426b38175900a56a2f0c31eede63207fa3b4edf6845608093b1d77eb47c9118c7f641031e68806e2b96c76b9f4edba6525440d
@@ -8,6 +8,20 @@ module Admin
8
8
  resource_scope -> { EffectiveMemberships.Applicant.deep.all }
9
9
  datatable -> { Admin::EffectiveApplicantsDatatable.new }
10
10
 
11
+ submit :complete, 'Complete Applicant', success: -> {
12
+ [
13
+ "Successfully completed #{resource.owner} #{resource}",
14
+ ("and sent #{resource.owner.email} a notification" unless resource.email_form_skip)
15
+ ].compact.join(' ')
16
+ }
17
+
18
+ submit :missing, 'Missing Info Applicant', success: -> {
19
+ [
20
+ "Successfully marked #{resource.owner} #{resource} as missing info",
21
+ ("and sent #{resource.owner.email} a notification" unless resource.email_form_skip)
22
+ ].compact.join(' ')
23
+ }
24
+
11
25
  submit :approve, 'Approve Applicant', success: -> {
12
26
  [
13
27
  "Successfully approved #{resource.owner} #{resource}",
@@ -6,5 +6,7 @@ module Effective
6
6
 
7
7
  resource_scope -> { EffectiveMemberships.Applicant.deep.where(owner: current_user.effective_memberships_owners) }
8
8
 
9
+ submit :resubmit, 'Submit Application'
10
+
9
11
  end
10
12
  end
@@ -1,23 +1,29 @@
1
1
  module Admin
2
2
  class EffectiveApplicantsDatatable < Effective::Datatable
3
3
  filters do
4
- scope :all
4
+ scope :not_draft, label: 'All'
5
5
  scope :in_progress, label: 'Open / Active'
6
6
  scope :done, label: 'Done'
7
+ scope :draft
7
8
  end
8
9
 
9
10
  datatable do
10
11
  order :id
11
12
  col :id, visible: false
12
13
 
13
- col :status
14
+ col :status, search: effective_memberships_status_collection()
14
15
 
15
16
  col :created_at, label: 'Created', as: :date, visible: false
16
17
  col :updated_at, label: 'Updated', visible: false
17
18
 
18
19
  col :submitted_at, label: 'Submitted', visible: false, as: :date
19
20
  col :completed_at, label: 'Completed', visible: false, as: :date
20
- col :reviewed_at, label: 'Reviewed', visible: false, as: :date
21
+ col :missing_info_at, label: 'Missing Info', visible: false, as: :date
22
+
23
+ if EffectiveMemberships.applicant_reviews?
24
+ col :reviewed_at, label: 'Reviewed', visible: false, as: :date
25
+ end
26
+
21
27
  col :approved_at, label: 'Approved', visible: false, as: :date
22
28
 
23
29
  col :owner
@@ -33,7 +33,9 @@ module Admin
33
33
 
34
34
  col :category, search: { collection: EffectiveMemberships.Category.all, polymorphic: false }
35
35
 
36
- aggregate :total
36
+ unless attributes[:total] == false
37
+ aggregate :total
38
+ end
37
39
 
38
40
  if attributes[:applicant_id]
39
41
  actions_col(new: false)
@@ -63,11 +65,11 @@ module Admin
63
65
  end
64
66
 
65
67
  def applicant
66
- @applicant ||= EffectiveMemberships.Applicant.find(attributes[:applicant_id])
68
+ @applicant ||= EffectiveMemberships.Applicant.where(id: attributes[:applicant_id]).first!
67
69
  end
68
70
 
69
71
  def fee_payment
70
- @fee_payment ||= EffectiveMemberships.FeePayment.find(attributes[:fee_payment_id])
72
+ @fee_payment ||= EffectiveMemberships.FeePayment.where(id: attributes[:fee_payment_id]).first!
71
73
  end
72
74
 
73
75
  end
@@ -24,11 +24,48 @@ module Admin
24
24
  col :bad_standing_admin, visible: false
25
25
  col :bad_standing_reason, visible: false
26
26
 
27
+ col :email do |membership|
28
+ email = membership.owner.try(:email)
29
+ mail_to(email) if email.present?
30
+ end
31
+
32
+ col :phone do |membership|
33
+ membership.owner.try(:phone) || membership.owner.try(:home_phone) || membership.owner.try(:cell_phone)
34
+ end
35
+
36
+ col :address do |membership|
37
+ membership.owner.try(:addresses).try(:first).try(:to_html)
38
+ end
39
+
40
+ col :address1, visible: false do |membership|
41
+ membership.owner.try(:addresses).try(:first).try(:address1)
42
+ end
43
+
44
+ col :address2, visible: false do |membership|
45
+ membership.owner.try(:addresses).try(:first).try(:address2)
46
+ end
47
+
48
+ col :city, visible: false do |membership|
49
+ membership.owner.try(:addresses).try(:first).try(:city)
50
+ end
51
+
52
+ col :province, visible: false do |membership|
53
+ membership.owner.try(:addresses).try(:first).try(:province)
54
+ end
55
+
56
+ col :country, visible: false do |membership|
57
+ membership.owner.try(:addresses).try(:first).try(:country)
58
+ end
59
+
60
+ col :postal_code, visible: false do |membership|
61
+ membership.owner.try(:addresses).try(:first).try(:postal_code)
62
+ end
63
+
27
64
  actions_col
28
65
  end
29
66
 
30
67
  collection do
31
- memberships = Effective::Membership.deep.all.includes(:owner)
68
+ memberships = Effective::Membership.deep.all.includes(owner: :addresses)
32
69
 
33
70
  raise('expected an owner_id, not user_id') if attributes[:user_id].present?
34
71
 
@@ -6,14 +6,20 @@ class EffectiveApplicantsDatatable < Effective::Datatable
6
6
  col :id, visible: false
7
7
 
8
8
  col :category, label: 'Category'
9
- col :status
9
+ col :status, search: effective_memberships_status_collection()
10
10
 
11
11
  col :created_at, label: 'Created', as: :date
12
12
  col :updated_at, label: 'Updated', as: :date, visible: false
13
+
13
14
  col :submitted_at, label: 'Submitted', as: :date
14
- col :completed_at, label: 'Completed', as: :date
15
- col :reviewed_at, label: 'Reviewed', as: :date
16
- col :approved_at, label: 'Approved', visible: false, as: :date
15
+ col :completed_at, label: 'Completed', as: :date, visible: false
16
+ col :missing_info_at, label: 'Missing Info', as: :date, visible: false
17
+
18
+ if EffectiveMemberships.applicant_reviews?
19
+ col :reviewed_at, label: 'Reviewed', as: :date
20
+ end
21
+
22
+ col :approved_at, label: 'Approved', as: :date
17
23
 
18
24
  col :orders
19
25
 
@@ -11,7 +11,7 @@ class EffectiveMembershipsDirectoryDatatable < Effective::Datatable
11
11
  end
12
12
 
13
13
  collection do
14
- scope = Effective::Membership.deep.includes(:owner)
14
+ scope = Effective::Membership.deep.good_standing.includes(:owner)
15
15
 
16
16
  archived_klasses.each do |klass|
17
17
  scope = scope.where.not(owner_id: klass.archived.select('id'), owner_type: klass.name)
@@ -1,2 +1,11 @@
1
1
  module EffectiveMembershipsHelper
2
+
3
+ def effective_memberships_status_collection
4
+ EffectiveMemberships.Applicant::STATUSES.map do |status|
5
+ next if status == :reviewed && !EffectiveMemberships.applicant_reviews?
6
+
7
+ [status.to_s.gsub('_', ' '), status]
8
+ end.compact
9
+ end
10
+
2
11
  end
@@ -5,14 +5,24 @@ module Effective
5
5
  default from: -> { EffectiveMemberships.mailer_sender }
6
6
  layout -> { EffectiveMemberships.mailer_layout || 'effective_memberships_mailer_layout' }
7
7
 
8
+ def applicant_completed(resource, opts = {})
9
+ @assigns = assigns_for(resource)
10
+ mail(to: resource.owner.email, **headers_for(resource, opts))
11
+ end
12
+
13
+ def applicant_missing_info(resource, opts = {})
14
+ @assigns = assigns_for(resource)
15
+ mail(to: resource.owner.email, **headers_for(resource, opts))
16
+ end
17
+
8
18
  def applicant_approved(resource, opts = {})
9
19
  @assigns = assigns_for(resource)
10
- mail(to: EffectiveMemberships.mailer_admin, **headers_for(resource, opts))
20
+ mail(to: resource.owner.email, **headers_for(resource, opts))
11
21
  end
12
22
 
13
23
  def applicant_declined(resource, opts = {})
14
24
  @assigns = assigns_for(resource)
15
- mail(to: EffectiveMemberships.mailer_admin, **headers_for(resource, opts))
25
+ mail(to: resource.owner.email, **headers_for(resource, opts))
16
26
  end
17
27
 
18
28
  def applicant_reference_notification(resource, opts = {})
@@ -49,11 +59,11 @@ module Effective
49
59
 
50
60
  url: effective_memberships.applicant_url(applicant),
51
61
  admin_url: effective_memberships.edit_admin_applicant_url(applicant),
52
- }
53
62
 
54
- if applicant.declined_reason.present?
55
- values.merge!(declined_reason: applicant.declined_reason)
56
- end
63
+ # Optional
64
+ declined_reason: applicant.declined_reason.presence,
65
+ missing_info_reason: applicant.missing_info_reason.presence
66
+ }.compact
57
67
 
58
68
  { applicant: values }
59
69
  end
@@ -32,12 +32,13 @@ module EffectiveMembershipsApplicant
32
32
  acts_as_tokened
33
33
 
34
34
  acts_as_statused(
35
- :draft, # Just Started
36
- :submitted, # Completed wizard. Paid applicant fee.
37
- :completed, # Admin has received all deliverables. The application is complete and ready for review.
38
- :reviewed, # All applicant reviews completed
39
- :declined, # Exit state. Application was declined.
40
- :approved # Exit state. Application was approved.
35
+ :draft, # Just Started
36
+ :submitted, # Completed wizard. Paid applicant fee.
37
+ :missing_info, # Admin has indicated information is missing. The applicant can edit applicant and add info
38
+ :completed, # Admin has received all deliverables. The application is complete and ready for review.
39
+ :reviewed, # All applicant reviews completed
40
+ :declined, # Exit state. Application was declined.
41
+ :approved # Exit state. Application was approved.
41
42
  )
42
43
 
43
44
  acts_as_wizard(
@@ -49,6 +50,7 @@ module EffectiveMembershipsApplicant
49
50
  experience: 'Work Experience',
50
51
  references: 'References',
51
52
  files: 'Attach Files',
53
+ stamp: 'Professional Stamp',
52
54
  declarations: 'Declarations',
53
55
  summary: 'Review',
54
56
  billing: 'Billing Address',
@@ -93,10 +95,14 @@ module EffectiveMembershipsApplicant
93
95
  has_many :applicant_references, -> { order(:id) }, class_name: 'Effective::ApplicantReference', as: :applicant, inverse_of: :applicant, dependent: :destroy
94
96
  accepts_nested_attributes_for :applicant_references, reject_if: :all_blank, allow_destroy: true
95
97
 
96
- has_many :fees, -> { order(:id) }, as: :parent, inverse_of: :parent, class_name: 'Effective::Fee', dependent: :nullify
98
+ has_many :stamps, -> { order(:id) }, class_name: 'Effective::Stamp', as: :applicant, inverse_of: :applicant, dependent: :destroy
99
+ accepts_nested_attributes_for :stamps, reject_if: :all_blank, allow_destroy: true
100
+
101
+ # Effective Namespace polymorphic
102
+ has_many :fees, -> { order(:id) }, class_name: 'Effective::Fee', as: :parent, inverse_of: :parent, dependent: :destroy
97
103
  accepts_nested_attributes_for :fees, reject_if: :all_blank, allow_destroy: true
98
104
 
99
- has_many :orders, -> { order(:id) }, as: :parent, inverse_of: :parent, class_name: 'Effective::Order', dependent: :nullify
105
+ has_many :orders, -> { order(:id) }, class_name: 'Effective::Order', as: :parent, inverse_of: :parent, dependent: :destroy
100
106
  accepts_nested_attributes_for :orders
101
107
 
102
108
  effective_resource do
@@ -116,18 +122,22 @@ module EffectiveMembershipsApplicant
116
122
  declined_at :datetime
117
123
  declined_reason :text
118
124
 
125
+ # Missing Info
126
+ missing_info_at :datetime
127
+ missing_info_reason :text
128
+
119
129
  # Applicant Educations
120
- applicant_educations_details :text
130
+ applicant_educations_details :text
121
131
 
122
132
  # Applicant Experiences
123
- applicant_experiences_months :integer
124
- applicant_experiences_details :text
133
+ applicant_experiences_months :integer
134
+ applicant_experiences_details :text
125
135
 
126
136
  # Additional Information
127
- additional_information :text
137
+ additional_information :text
128
138
 
129
139
  # Acts as Wizard
130
- wizard_steps :text, permitted: false
140
+ wizard_steps :text, permitted: false
131
141
 
132
142
  timestamps
133
143
  end
@@ -138,6 +148,8 @@ module EffectiveMembershipsApplicant
138
148
  scope :in_progress, -> { where.not(status: [:approved, :declined]) }
139
149
  scope :done, -> { where(status: [:approved, :declined]) }
140
150
 
151
+ scope :not_draft, -> { where.not(status: :draft) }
152
+
141
153
  # Set Apply to Join or Reclassification
142
154
  before_validation(if: -> { new_record? && owner.present? }) do
143
155
  self.applicant_type ||= (owner.membership.blank? ? 'Apply to Join' : 'Apply to Reclassify')
@@ -257,9 +269,12 @@ module EffectiveMembershipsApplicant
257
269
  # Admin Decline
258
270
  validates :declined_reason, presence: true, if: -> { declined? }
259
271
 
272
+ # Admin Missing Info
273
+ validates :missing_info_reason, presence: true, if: -> { missing_info? }
274
+
260
275
  # These two try completed and try reviewed
261
- before_save(if: -> { submitted? }) { complete! }
262
- before_save(if: -> { completed? }) { review! }
276
+ # before_save(if: -> { submitted? }) { complete! }
277
+ # before_save(if: -> { completed? }) { review! }
263
278
 
264
279
  # Clear required steps memoization
265
280
  after_save { @_required_steps = nil }
@@ -274,38 +289,49 @@ module EffectiveMembershipsApplicant
274
289
 
275
290
  applicant_steps = Array(category&.applicant_wizard_steps)
276
291
 
292
+ # Special logic for stamp step
293
+ applicant_steps.delete(:stamp) unless apply_to_join?
294
+
277
295
  wizard_steps.select do |step|
278
296
  required_steps.include?(step) || category.blank? || applicant_steps.include?(step)
279
297
  end
280
298
  end
281
299
  end
282
300
 
283
- # All Fees and Orders
284
- def submit_fees
285
- fees.select { |fee| fee.applicant_submit_fee? }
286
- end
301
+ def can_visit_step?(step)
302
+ if missing_info?
303
+ return [:start, :select, :billing, :checkout].exclude?(step)
304
+ end
287
305
 
288
- def submit_order
289
- orders.find { |order| order.purchasables.any?(&:applicant_submit_fee?) }
306
+ can_revisit_completed_steps(step)
290
307
  end
291
308
 
292
- def submit_fee_qb_item_name
293
- 'Applicant'
294
- end
309
+ # All Fees and Orders
310
+ def submit_fees
311
+ # Find or build submit fee
312
+ fee = fees.first || fees.build(owner: owner, fee_type: 'Applicant')
313
+
314
+ unless fee.purchased?
315
+ fee.assign_attributes(
316
+ category: category,
317
+ price: category.applicant_fee,
318
+ tax_exempt: category.applicant_fee_tax_exempt,
319
+ qb_item_name: category.applicant_fee_qb_item_name
320
+ )
321
+ end
295
322
 
296
- def find_or_build_submit_fees
297
- return submit_fees if submit_fees.present?
323
+ # Update stamp price
324
+ stamp = stamps.first
298
325
 
299
- fees.build(
300
- owner: owner,
301
- fee_type: 'Applicant',
302
- category: category,
303
- price: category.applicant_fee,
304
- tax_exempt: category.tax_exempt,
305
- qb_item_name: submit_fee_qb_item_name()
306
- )
326
+ if stamp.present? && !stamp.purchased?
327
+ stamp.assign_attributes(
328
+ price: category.stamp_fee,
329
+ tax_exempt: category.stamp_fee_tax_exempt,
330
+ qb_item_name: category.stamp_fee_qb_item_name
331
+ )
332
+ end
307
333
 
308
- submit_fees
334
+ (fees + stamps)
309
335
  end
310
336
 
311
337
  # Draft -> Submitted requirements
@@ -315,7 +341,9 @@ module EffectiveMembershipsApplicant
315
341
 
316
342
  wizard_steps[:checkout] ||= Time.zone.now
317
343
  wizard_steps[:submitted] = Time.zone.now
344
+
318
345
  submitted!
346
+ stamps.each { |stamp| stamp.submit! }
319
347
 
320
348
  after_commit do
321
349
  applicant_references.each { |reference| reference.notify! if reference.submitted? }
@@ -362,6 +390,10 @@ module EffectiveMembershipsApplicant
362
390
  approved? || declined?
363
391
  end
364
392
 
393
+ def status_label
394
+ (status_was || status).to_s.gsub('_', ' ')
395
+ end
396
+
365
397
  def summary
366
398
  case status_was
367
399
  when 'draft'
@@ -376,6 +408,8 @@ module EffectiveMembershipsApplicant
376
408
  else
377
409
  "This application has been completed and is now ready for an admin to approve or decline it. If approved, prorated fees will be generated."
378
410
  end
411
+ when 'missing_info'
412
+ "Missing the following information: <ul><li>#{missing_info_reason}</li></ul>"
379
413
  when 'reviewed'
380
414
  "This application has been reviewed and is now ready for an admin to approve or decline it. If approved, prorated fees will be generated."
381
415
  when 'approved'
@@ -410,10 +444,6 @@ module EffectiveMembershipsApplicant
410
444
  # Reset the progress so far. They have to click through screens again.
411
445
  assign_attributes(wizard_steps: wizard_steps.slice(:start, :select))
412
446
 
413
- # Delete any fees and orders. Keep all other data.
414
- submit_fees.each { |fee| fee.mark_for_destruction }
415
- submit_order.mark_for_destruction if submit_order
416
-
417
447
  save!
418
448
  end
419
449
 
@@ -463,6 +493,16 @@ module EffectiveMembershipsApplicant
463
493
  category&.min_applicant_files.to_i
464
494
  end
465
495
 
496
+ # Stamps step
497
+ def stamp
498
+ stamps.first || stamps.build(
499
+ owner: owner,
500
+ name: owner.to_s,
501
+ shipping_address: (owner.try(:shipping_address) || owner.try(:billing_address)),
502
+ price: 0
503
+ )
504
+ end
505
+
466
506
  # The submit! method used to be here
467
507
  # But it needs to be inside the included do block
468
508
  # So see above. Sorry.
@@ -471,7 +511,8 @@ module EffectiveMembershipsApplicant
471
511
  min_applicant_references > 0
472
512
  end
473
513
 
474
- # When an application is submitted, these must be done to go to completed
514
+ # When an application is submitted, these must be done to go to completed.
515
+ # An Admin can override this and just set them to completed.
475
516
  def completed_requirements
476
517
  {
477
518
  'Applicant References' => (!applicant_references_required? || applicant_references.count(&:completed?) >= min_applicant_references)
@@ -479,9 +520,34 @@ module EffectiveMembershipsApplicant
479
520
  end
480
521
 
481
522
  def complete!
482
- return false unless submitted? && completed_requirements.values.all?
483
- # Could send registrar an email here saying this applicant is ready to review
523
+ raise('applicant must have been submitted to complete!') unless was_submitted?
524
+
525
+ # Let an admin ignore these requirements if need be
526
+ # return false unless submitted? && completed_requirements.values.all?
527
+
528
+ assign_attributes(missing_info_reason: nil)
484
529
  completed!
530
+
531
+ after_commit { send_email(:applicant_completed) }
532
+ true
533
+ end
534
+
535
+ def missing!
536
+ raise('applicant must have been submitted to missing!') unless was_submitted?
537
+
538
+ missing_info!
539
+
540
+ after_commit { send_email(:applicant_missing_info) }
541
+ true
542
+ end
543
+
544
+ def resubmit!
545
+ raise('applicant must have been submitted and missing info to resubmit!') unless was_submitted? && was_missing_info?
546
+ raise('already submitted') if submitted?
547
+ raise('expected a purchased order') unless submit_order&.purchased?
548
+
549
+ assign_attributes(skip_to_step: :submitted, submitted_at: Time.zone.now)
550
+ submitted!
485
551
  end
486
552
 
487
553
  # Completed -> Reviewed requirements
@@ -494,6 +560,7 @@ module EffectiveMembershipsApplicant
494
560
  end
495
561
 
496
562
  # When an application is completed, these must be done to go to reviewed
563
+ # An Admin can override this and just set them to reviewed.
497
564
  def reviewed_requirements
498
565
  {
499
566
  'Applicant Reviews' => (!applicant_reviews_required? || applicant_reviews.count(&:completed?) >= min_applicant_reviews)
@@ -501,8 +568,10 @@ module EffectiveMembershipsApplicant
501
568
  end
502
569
 
503
570
  def review!
504
- return false unless completed? && reviewed_requirements.values.all?
505
- # Could send registrar an email here saying this applicant is ready to approve
571
+ raise('applicant must have been submitted to review!') unless was_submitted?
572
+
573
+ # Let an admin ignore these requirements if need be
574
+ # return false unless completed? && reviewed_requirements.values.all?
506
575
  reviewed!
507
576
  end
508
577
 
@@ -514,6 +583,8 @@ module EffectiveMembershipsApplicant
514
583
  # Complete the wizard step. Just incase this is run out of order.
515
584
  wizard_steps[:checkout] ||= Time.zone.now
516
585
  wizard_steps[:submitted] ||= Time.zone.now
586
+ assign_attributes(missing_info_reason: nil)
587
+
517
588
  approved!
518
589
 
519
590
  if apply_to_join?
@@ -180,7 +180,7 @@ module EffectiveMembershipsCategory
180
180
  end
181
181
 
182
182
  def applicant_wizard_steps_collection
183
- wizard_steps = EffectiveMemberships.Applicant.all_wizard_steps
183
+ wizard_steps = EffectiveMemberships.Applicant.wizard_steps_hash
184
184
  required_steps = EffectiveMemberships.Applicant.required_wizard_steps
185
185
 
186
186
  wizard_steps.map do |step, title|
@@ -189,7 +189,7 @@ module EffectiveMembershipsCategory
189
189
  end
190
190
 
191
191
  def fee_payment_wizard_steps_collection
192
- wizard_steps = EffectiveMemberships.FeePayment.all_wizard_steps
192
+ wizard_steps = EffectiveMemberships.FeePayment.wizard_steps_hash
193
193
  required_steps = EffectiveMemberships.FeePayment.required_wizard_steps
194
194
 
195
195
  wizard_steps.map do |step, title|
@@ -197,4 +197,24 @@ module EffectiveMembershipsCategory
197
197
  end
198
198
  end
199
199
 
200
+ def applicant_fee_qb_item_name
201
+ 'Applicant'
202
+ end
203
+
204
+ def applicant_fee_tax_exempt
205
+ tax_exempt
206
+ end
207
+
208
+ def stamp_fee
209
+ 0
210
+ end
211
+
212
+ def stamp_fee_qb_item_name
213
+ qb_item_name
214
+ end
215
+
216
+ def stamp_fee_tax_exempt
217
+ tax_exempt
218
+ end
219
+
200
220
  end
@@ -2,7 +2,12 @@ module Effective
2
2
  class ApplicantReference < ActiveRecord::Base
3
3
  acts_as_tokened
4
4
  acts_as_addressable :reference
5
- acts_as_statused :submitted, :completed
5
+
6
+ acts_as_statused(
7
+ :submitted, # Was submitted by the applicant
8
+ :completed # Was completed by the reference.
9
+ )
10
+
6
11
  log_changes(to: :applicant) if respond_to?(:log_changes)
7
12
 
8
13
  belongs_to :applicant, polymorphic: true
@@ -29,6 +29,8 @@ module Effective
29
29
  scope :deep, -> { includes(membership_categories: :category) }
30
30
  scope :sorted, -> { order(:id) }
31
31
 
32
+ scope :good_standing, -> { where(bad_standing: [nil, false]) }
33
+
32
34
  scope :with_paid_fees_through, -> (period = nil) {
33
35
  where(arel_table[:fees_paid_period].gteq(period || EffectiveMemberships.Registrar.current_period))
34
36
  }
@@ -25,17 +25,21 @@
25
25
  = tab 'References' do
26
26
  .mb-4= render_inline_datatable(Admin::EffectiveApplicantReferencesDatatable.new(applicant: applicant))
27
27
 
28
- - if applicant.fees.present?
28
+ - if applicant.fees.present? || applicant.orders.present?
29
29
  = tab 'Fees' do
30
- .mb-4= render_inline_datatable(Admin::EffectiveFeesDatatable.new(applicant_id: applicant.to_param))
30
+ .mb-4
31
+ %h2 Fees
32
+ - datatable = Admin::EffectiveFeesDatatable.new(applicant: applicant, total: false)
33
+ = render_datatable(datatable, simple: true, inline: true)
31
34
 
32
- - if applicant.orders.present?
33
- = tab 'Orders' do
34
- .mb-4= render_datatable(Admin::EffectiveOrdersDatatable.new(parent_id: applicant.id, parent_type: EffectiveMemberships.Applicant.name, owner_id: applicant.owner_id, user_type: applicant.owner_type))
35
+ .mb-4
36
+ %h2 Orders
37
+ - datatable = Admin::EffectiveOrdersDatatable.new(parent: applicant, owner: applicant.owner, user: applicant.owner, total: false)
38
+ = render_datatable(datatable, simple: true)
35
39
 
36
40
  - if applicant.owner.applicants.any? { |other| other.was_submitted? && other.id != applicant.id }
37
41
  = tab 'Other Applications' do
38
- = render_datatable(Admin::EffectiveApplicantsDatatable.new(owner_id: applicant.owner_id, except_id: applicant.id))
42
+ = render_datatable(Admin::EffectiveApplicantsDatatable.new(owner: applicant.owner, except_id: applicant.id))
39
43
 
40
44
  - if applicant.persisted? && applicant.respond_to?(:log_changes_datatable)
41
45
  = tab 'Logs' do
@@ -1,13 +1,9 @@
1
1
  = effective_form_with(model: [:admin, applicant], engine: true) do |f|
2
- %p The #{applicant} will be <strong>approved</strong> to the following membership category.
3
-
4
- %h3 Category
5
- = f.static_field :category, label: 'Applied for'
2
+ %p The #{applicant} will be <strong>approved</strong> to the following membership category:
6
3
 
7
4
  - categories = EffectiveMemberships.Category.all
8
5
  = f.select :category_id, categories, label: 'Approve to'
9
6
 
10
- %h3 Number
11
7
  %p
12
8
  - if applicant.owner.membership&.number_was.present?
13
9
  The member will keep their existing membership number: #{applicant.owner.membership.number}.
@@ -0,0 +1,8 @@
1
+ = effective_form_with(model: [:admin, applicant], engine: true) do |f|
2
+ %p The #{applicant} will be <strong>completed</strong>. All deliverables have been received and all requirements completed.
3
+
4
+ %h3 Email to send
5
+ %p The following email will be sent:
6
+ = email_form_fields(f, :applicant_completed)
7
+
8
+ = f.submit 'Complete Applicant', border: false, center: true, 'data-confirm': "Complete #{f.object.owner}?"
@@ -0,0 +1,11 @@
1
+ = effective_form_with(model: [:admin, applicant], engine: true) do |f|
2
+ %p This applicant will be marked as <strong>missing information</strong> with the following:
3
+
4
+ = f.text_field :missing_info_reason, required: true, label: 'Explanation of missing info'
5
+
6
+ %h3 Email to send
7
+
8
+ %p The following email will be sent:
9
+ = email_form_fields(f, :applicant_missing_info)
10
+
11
+ = f.submit 'Missing Info Applicant', border: false, center: true, 'data-confirm': "Missing Info #{f.object.owner}?"
@@ -1,18 +1,22 @@
1
1
  %p
2
- %span.badge.badge-secondary= applicant.status
2
+ %span.badge.badge-secondary= applicant.status_label
3
3
  = applicant.summary
4
4
 
5
- = tabs(list: { class: 'nav nav-pills'}) do
5
+ %p Process applicant:
6
+
7
+ = accordion do
8
+ - if EffectiveResources.authorized?(self, :complete, applicant)
9
+ = collapse 'Complete this Applicant' do
10
+ = render('admin/applicants/form_complete', applicant: applicant)
11
+
12
+ - if EffectiveResources.authorized?(self, :missing, applicant)
13
+ = collapse 'Missing Information' do
14
+ = render('admin/applicants/form_missing_info', applicant: applicant)
15
+
6
16
  - if EffectiveResources.authorized?(self, :approve, applicant)
7
- = tab 'Approve this Applicant' do
8
- .card.mt-4
9
- .card-body
10
- %h5.card-title Approve
11
- = render('admin/applicants/form_approve', applicant: applicant)
17
+ = collapse 'Approve this Applicant' do
18
+ = render('admin/applicants/form_approve', applicant: applicant)
12
19
 
13
20
  - if EffectiveResources.authorized?(self, :decline, applicant)
14
- = tab 'Decline this Applicant' do
15
- .card.mt-4
16
- .card-body
17
- %h5.card-title Decline
18
- = render('admin/applicants/form_decline', applicant: applicant)
21
+ = collapse 'Decline this Applicant' do
22
+ = render('admin/applicants/form_decline', applicant: applicant)
@@ -1,5 +1,5 @@
1
1
  %p
2
- %span.badge.badge-secondary= applicant.status_was
2
+ %span.badge.badge-secondary= applicant.status_label
3
3
  = applicant.summary
4
4
 
5
5
  %table.table.table-sm.table-striped
@@ -11,6 +11,8 @@
11
11
  %th
12
12
  - # Next action button
13
13
  %tbody
14
+
15
+ -# Draft
14
16
  %tr
15
17
  %td In Progress
16
18
  %td= applicant.created_at.strftime('%F')
@@ -21,6 +23,8 @@
21
23
  - else
22
24
  = '-'
23
25
  %td
26
+
27
+ - # Submitted
24
28
  %tr
25
29
  %td Application Submitted
26
30
  %td= applicant.submitted_at&.strftime('%F') || '-'
@@ -30,6 +34,8 @@
30
34
  - else
31
35
  = '-'
32
36
  %td
37
+
38
+ - # Waiting to Complete
33
39
  %tr
34
40
  %td Waiting to Complete
35
41
  %td= applicant.submitted_at&.strftime('%F') || '-'
@@ -63,71 +69,83 @@
63
69
  References Not Required
64
70
 
65
71
  %td
66
- -# - if !applicant.was_approved? && applicant.transcripts_required? && !applicant.transcripts_approved?
67
- -# = link_to 'Process Transcripts', '#transcripts', 'data-click-tab': true, class: 'btn btn-sm btn-primary'
72
+ - if applicant.submitted?
73
+ = link_to 'Complete Applicant', '#process', 'data-click-tab': true, class: 'btn btn-sm btn-primary'
68
74
 
69
- -# - if !applicant.was_approved? && applicant.nwpta_form_required? && !applicant.nwpta_form_received?
70
- -# = link_to 'Receive NWPTA Form', '#nwpta-verification-form', 'data-click-tab': true, class: 'btn btn-sm btn-primary'
75
+ - # Missing Information
76
+ %tr
77
+ %td Missing Information
78
+ %td= applicant.missing_info_at&.strftime('%F') || '-'
79
+ %td= applicant.missing_info_reason
80
+ %td
71
81
 
82
+ - # Completed
72
83
  %tr
73
- %td Application Complete
84
+ %td Application Completed
74
85
  %td= applicant.completed_at&.strftime('%F') || '-'
75
86
  %td
87
+ - if applicant.completed_at.present?
88
+ = icon('check', class: 'small-1')
89
+ Done
76
90
  %td
77
91
 
78
- %tr
79
- %td Reviews
80
- %td= applicant.reviewed_at&.strftime('%F') || '-'
81
- %td
82
- - applicant.reviewed_requirements.each do |requirement, completed|
83
- - next if requirement.to_s == 'Applicant Reviews'
92
+ - # Reviewed
93
+ - if EffectiveMemberships.applicant_reviews?
94
+ %tr.effective-memberships-applicant-status-reviewed
95
+ %td Reviews
96
+ %td= applicant.reviewed_at&.strftime('%F') || '-'
97
+ %td
98
+ - applicant.reviewed_requirements.each do |requirement, completed|
99
+ - next if requirement.to_s == 'Applicant Reviews'
84
100
 
85
- %p
86
- = icon((completed ? 'check' : 'x'), class: 'small-1')
87
- = requirement
101
+ %p
102
+ = icon((completed ? 'check' : 'x'), class: 'small-1')
103
+ = requirement
88
104
 
89
- - if applicant.applicant_reviews_required?
90
- %p
91
- - if applicant.reviewed_requirements['Applicant Reviews']
105
+ - if applicant.applicant_reviews_required?
106
+ %p
107
+ - if applicant.reviewed_requirements['Applicant Reviews']
108
+ = icon('check', class: 'small-1')
109
+
110
+ = applicant.applicant_reviews.count(&:completed?)
111
+ = '/'
112
+ = applicant.min_applicant_reviews
113
+ Reviews Completed
114
+ - else
115
+ %p
92
116
  = icon('check', class: 'small-1')
117
+ Reviews Not Required
93
118
 
94
- = applicant.applicant_reviews.count(&:completed?)
95
- = '/'
96
- = applicant.min_applicant_reviews
97
- Reviews Completed
98
- - else
99
- %p
100
- = icon('check', class: 'small-1')
101
- Reviews Not Required
119
+ %td
120
+ - # Button to create reviews here
102
121
 
122
+ %tr
123
+ %td Waiting to Process
103
124
  %td
104
- - if applicant.was_reviewed? && !applicant.was_approved?
125
+ - if EffectiveMemberships.applicant_reviews?
126
+ = applicant.reviewed_at&.strftime('%F') || '-'
127
+ - else
128
+ = applicant.completed_at&.strftime('%F') || '-'
129
+ %td
130
+ %td
131
+ - if applicant.was_submitted? && !(applicant.approved? || applicant.declined?)
105
132
  = link_to 'Process Applicant', '#process', 'data-click-tab': true, class: 'btn btn-sm btn-primary'
106
133
 
107
- - if applicant.declined_at.present?
108
- %tr
109
- %td Processed
110
- %td= applicant.declined_at.strftime('%F')
111
- %td
134
+ %tr
135
+ %td Processed
136
+ %td= (applicant.approved_at&.strftime('%F') || applicant.declined_at&.strftime('%F') || '-')
137
+ %td
138
+ - if applicant.was_approved? && !applicant.approved?
139
+ = icon('check', class: 'small-1')
140
+ Approved
141
+
142
+ - elsif applicant.was_declined? || applicant.declined?
112
143
  = icon('check', class: 'small-1')
113
144
  Declined
114
145
  %br
115
146
  = applicant.declined_reason
116
- %td
117
147
 
118
- - if applicant.was_approved?
119
- %tr
120
- %td Processed
121
- %td= applicant.approved_at&.strftime('%F')
122
- %td
123
- - if applicant.was_approved?
124
- = icon('check', class: 'small-1')
125
- Approved
126
- - elsif applicant.declined?
127
- = icon('check', class: 'small-1')
128
- Declined
129
- %br
130
- = applicant.declined_reason
131
- - else
132
- = '-'
133
- %td
148
+ - elsif applicant.approved?
149
+ = icon('check', class: 'small-1')
150
+ Approved
151
+ %td
@@ -0,0 +1,18 @@
1
+ %h3 Missing Information
2
+ %p The following information is missing: #{resource.missing_info_reason}.
3
+
4
+ %p
5
+ Please revisit each wizard step and
6
+ = link_to 'complete all missing information', wizard_path(:demographics)
7
+ for this application.
8
+
9
+ %p
10
+ Once you're ready, click below to re-submit your application with the updated information.
11
+
12
+ %p
13
+ = effective_form_with(model: resource, url: wizard_path(step), method: :put) do |f|
14
+ = f.hidden_field :id
15
+ = f.save 'Submit Application', 'data-confirm': "Really submit application?"
16
+
17
+ %p
18
+ %small * No additional payment required.
@@ -0,0 +1,36 @@
1
+ .card
2
+ .card-body
3
+ .row
4
+ .col-sm
5
+ %h5.card-title= applicant.wizard_step_title(:stamp)
6
+ .col-sm-auto.text-right
7
+ = link_to('Edit', wizard_path(:stamp)) if edit_effective_wizard?
8
+
9
+ - applicant.stamps.each do |stamp|
10
+ %table.table.table-sm
11
+ %tbody
12
+ %tr
13
+ %th Name
14
+ %td= stamp.name
15
+
16
+ %tr
17
+ %th Name Confirmation
18
+ %td= stamp.name_confirmation
19
+
20
+ %tr
21
+ %th Category
22
+ %td= stamp.category
23
+
24
+ - if stamp.shipping_address.present?
25
+ %tr
26
+ %th Shipping Address
27
+ %td= stamp.shipping_address.to_html
28
+
29
+ - if applicant.was_approved?
30
+ %tr
31
+ %th Submitted
32
+ %td= stamp.submitted_at&.strftime('%F') || '-'
33
+
34
+ %tr
35
+ %th Issued
36
+ %td= stamp.issued_at&.strftime('%F') || 'Not Issued'
@@ -36,5 +36,5 @@
36
36
  %tr
37
37
  %th Status
38
38
  %td
39
- %span.badge.badge-secondary= applicant.status
39
+ %span.badge.badge-secondary= applicant.status_label
40
40
  = applicant.summary
@@ -0,0 +1,28 @@
1
+ = render 'layout' do
2
+ = render 'effective/applicants/content', resource: resource
3
+
4
+ .card
5
+ .card-body
6
+ %p Should your application be approved, you are eligible to receive a Professional Stamp.
7
+
8
+ %p Please confirm your name as it should appear on any Professional Stamp.
9
+
10
+ = effective_form_with(model: resource, url: wizard_path(step), method: :put) do |f|
11
+ = f.hidden_field :id
12
+
13
+ = f.fields_for(:stamps, f.object.stamp) do |fs|
14
+ = fs.hidden_field :applicant_id
15
+ = fs.hidden_field :applicant_type
16
+
17
+ = fs.hidden_field :owner_id
18
+ = fs.hidden_field :owner_type
19
+
20
+ = fs.hidden_field :price
21
+ = fs.hidden_field :tax_exempt
22
+ = fs.hidden_field :qb_item_name
23
+
24
+ = render 'effective/stamps/fields', f: fs
25
+
26
+ %p Stamps will be processed after approval of this application.
27
+
28
+ = f.save 'Save and Continue'
@@ -5,8 +5,7 @@
5
5
  - raise('expected a purchased applicant submit_order') unless resource.submit_order&.purchased?
6
6
 
7
7
  .alert.alert-success.mb-4
8
- This application was submitted on
9
- = resource.submit_order.purchased_at.strftime('%F')
8
+ This application was submitted on #{resource.submitted_at.strftime('%F')}
10
9
 
11
10
  - unless resource.approved?
12
11
  .card
@@ -20,15 +19,18 @@
20
19
  .card
21
20
  .card-body= render 'effective/applicants/summary', applicant: resource
22
21
 
22
+ - if resource.missing_info?
23
+ = card do
24
+ = render 'effective/applicants/missing_info', applicant: resource
25
+
23
26
  - if resource.min_applicant_references.to_i > 0 || resource.applicant_references.present?
24
- .card
25
- .card-body
26
- %h3 Confidential References
27
- %p
28
- References are automatically sent a reference request.
29
- Click 'New' to add an additional reference, or click 'Notify' to resend the reference request.
27
+ = card do
28
+ %h3 Confidential References
29
+ %p
30
+ References are automatically sent a reference request.
31
+ Click 'New' to add an additional reference, or click 'Notify' to resend the reference request.
30
32
 
31
- = render_datatable(EffectiveApplicantReferencesDatatable.new(applicant: resource), inline: true, simple: true)
33
+ = render_datatable(EffectiveApplicantReferencesDatatable.new(applicant: resource), inline: true, simple: true)
32
34
 
33
35
  .mb-4
34
36
  = collapse('Show application...', card_class: 'my-2') do
@@ -5,4 +5,10 @@
5
5
 
6
6
  = effective_form_with(model: resource, url: wizard_path(step), method: :put) do |f|
7
7
  = f.hidden_field :id
8
- = f.submit 'Save and Continue', border: false, left: true
8
+
9
+ = f.submit(border: false, left: true) do
10
+ -# Missing Info
11
+ - if EffectiveResources.authorized?(self, :resubmit, resource)
12
+ = f.save 'Submit Application'
13
+ - else
14
+ = f.save 'Save and Continue'
@@ -0,0 +1,15 @@
1
+ ---
2
+ subject: 'Your application was marked as completed!'
3
+ from: 'admin@example.com'
4
+ ---
5
+ Hello {{ user.name }},
6
+
7
+ Your application for {{ applicant.to_category }} has been marked completed.
8
+
9
+ It is ready for review and a final decision to approve or decline.
10
+
11
+ {{ applicant.url }}
12
+
13
+ Thank you.
14
+
15
+ Please contact us for assistance.
@@ -0,0 +1,17 @@
1
+ ---
2
+ subject: 'Your application is missing information'
3
+ from: 'admin@example.com'
4
+ ---
5
+ Hello {{ user.name }},
6
+
7
+ Your application for {{ applicant.to_category }} is missing information:
8
+
9
+ {{ applicant.missing_info_reason }}
10
+
11
+ Please update your application with this info.
12
+
13
+ {{ applicant.url }}
14
+
15
+ Thank you.
16
+
17
+ Please contact us for assistance.
@@ -21,6 +21,11 @@ EffectiveMemberships.setup do |config|
21
21
  # The defaults include: Applicant, Prorated, Renewal, Late, Admin
22
22
  # config.additional_fee_types = []
23
23
 
24
+ # Applicant Reviews
25
+ # When true, display the reviewed state and require Category.min_applicant_reviews
26
+ # When false, hide the reviewed state entirely
27
+ # config.applicant_reviews = false
28
+
24
29
  # Mailer Configuration
25
30
  # Configure the class responsible to send e-mails.
26
31
  # config.mailer = 'Effective::MembershipsMailer'
@@ -151,6 +151,10 @@ class CreateEffectiveMemberships < ActiveRecord::Migration[6.0]
151
151
  t.datetime :declined_at
152
152
  t.text :declined_reason
153
153
 
154
+ # Missing
155
+ t.datetime :missing_info_at
156
+ t.text :missing_info_reason
157
+
154
158
  # Applicant Educations
155
159
  t.text :applicant_educations_details
156
160
 
@@ -1,3 +1,3 @@
1
1
  module EffectiveMemberships
2
- VERSION = '0.3.8'
2
+ VERSION = '0.3.11'
3
3
  end
@@ -8,7 +8,7 @@ module EffectiveMemberships
8
8
  [
9
9
  :categories_table_name, :applicants_table_name, :applicant_reviews_table_name, :fee_payments_table_name,
10
10
  :category_class_name, :applicant_class_name, :applicant_review_class_name, :fee_payment_class_name, :registrar_class_name, :membership_card_class_name,
11
- :additional_fee_types,
11
+ :additional_fee_types, :applicant_reviews,
12
12
  :layout,
13
13
  :mailer, :parent_mailer, :deliver_method, :mailer_layout, :mailer_sender, :mailer_admin, :use_effective_email_templates
14
14
  ]
@@ -36,6 +36,10 @@ module EffectiveMemberships
36
36
  membership_card_class_name&.constantize || Effective::MembershipCard
37
37
  end
38
38
 
39
+ def self.applicant_reviews?
40
+ applicant_reviews == true
41
+ end
42
+
39
43
  # Singleton
40
44
  def self.Registrar
41
45
  klass = registrar_class_name&.constantize || Effective::Registrar
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.3.8
4
+ version: 0.3.11
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-02-03 00:00:00.000000000 Z
11
+ date: 2022-02-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: effective_products
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: effective_resources
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -303,7 +317,9 @@ files:
303
317
  - app/views/admin/applicant_references/_applicant_reference.html.haml
304
318
  - app/views/admin/applicants/_form.html.haml
305
319
  - app/views/admin/applicants/_form_approve.html.haml
320
+ - app/views/admin/applicants/_form_complete.html.haml
306
321
  - app/views/admin/applicants/_form_decline.html.haml
322
+ - app/views/admin/applicants/_form_missing_info.html.haml
307
323
  - app/views/admin/applicants/_form_process.html.haml
308
324
  - app/views/admin/applicants/_status.html.haml
309
325
  - app/views/admin/categories/_form.html.haml
@@ -346,9 +362,11 @@ files:
346
362
  - app/views/effective/applicants/_experience.html.haml
347
363
  - app/views/effective/applicants/_files.html.haml
348
364
  - app/views/effective/applicants/_layout.html.haml
365
+ - app/views/effective/applicants/_missing_info.html.haml
349
366
  - app/views/effective/applicants/_orders.html.haml
350
367
  - app/views/effective/applicants/_references.html.haml
351
368
  - app/views/effective/applicants/_select.html.haml
369
+ - app/views/effective/applicants/_stamp.html.haml
352
370
  - app/views/effective/applicants/_summary.html.haml
353
371
  - app/views/effective/applicants/billing.html.haml
354
372
  - app/views/effective/applicants/checkout.html.haml
@@ -360,6 +378,7 @@ files:
360
378
  - app/views/effective/applicants/files.html.haml
361
379
  - app/views/effective/applicants/references.html.haml
362
380
  - app/views/effective/applicants/select.html.haml
381
+ - app/views/effective/applicants/stamp.html.haml
363
382
  - app/views/effective/applicants/start.html.haml
364
383
  - app/views/effective/applicants/submitted.html.haml
365
384
  - app/views/effective/applicants/summary.html.haml
@@ -387,7 +406,9 @@ files:
387
406
  - app/views/effective/memberships/_membership.html.haml
388
407
  - app/views/effective/memberships_directory/index.html.haml
389
408
  - app/views/effective/memberships_mailer/applicant_approved.liquid
409
+ - app/views/effective/memberships_mailer/applicant_completed.liquid
390
410
  - app/views/effective/memberships_mailer/applicant_declined.liquid
411
+ - app/views/effective/memberships_mailer/applicant_missing_info.liquid
391
412
  - app/views/effective/memberships_mailer/applicant_reference_notification.liquid
392
413
  - app/views/layouts/effective_memberships_mailer_layout.html.haml
393
414
  - config/effective_memberships.rb