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.
- checksums.yaml +4 -4
- data/app/controllers/admin/applicants_controller.rb +14 -0
- data/app/controllers/effective/applicants_controller.rb +2 -0
- data/app/datatables/admin/effective_applicants_datatable.rb +9 -3
- data/app/datatables/admin/effective_fees_datatable.rb +5 -3
- data/app/datatables/admin/effective_memberships_datatable.rb +38 -1
- data/app/datatables/effective_applicants_datatable.rb +10 -4
- data/app/datatables/effective_memberships_directory_datatable.rb +1 -1
- data/app/helpers/effective_memberships_helper.rb +9 -0
- data/app/mailers/effective/memberships_mailer.rb +16 -6
- data/app/models/concerns/effective_memberships_applicant.rb +115 -44
- data/app/models/concerns/effective_memberships_category.rb +22 -2
- data/app/models/effective/applicant_reference.rb +6 -1
- data/app/models/effective/membership.rb +2 -0
- data/app/views/admin/applicants/_form.html.haml +10 -6
- data/app/views/admin/applicants/_form_approve.html.haml +1 -5
- data/app/views/admin/applicants/_form_complete.html.haml +8 -0
- data/app/views/admin/applicants/_form_missing_info.html.haml +11 -0
- data/app/views/admin/applicants/_form_process.html.haml +16 -12
- data/app/views/admin/applicants/_status.html.haml +67 -49
- data/app/views/effective/applicants/_missing_info.html.haml +18 -0
- data/app/views/effective/applicants/_stamp.html.haml +36 -0
- data/app/views/effective/applicants/_summary.html.haml +1 -1
- data/app/views/effective/applicants/stamp.html.haml +28 -0
- data/app/views/effective/applicants/submitted.html.haml +11 -9
- data/app/views/effective/applicants/summary.html.haml +7 -1
- data/app/views/effective/memberships_mailer/applicant_completed.liquid +15 -0
- data/app/views/effective/memberships_mailer/applicant_missing_info.liquid +17 -0
- data/config/effective_memberships.rb +5 -0
- data/db/migrate/01_create_effective_memberships.rb.erb +4 -0
- data/lib/effective_memberships/version.rb +1 -1
- data/lib/effective_memberships.rb +5 -1
- metadata +23 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8200c84934681ed1e13ce23e75bf061f58e0f83f4549be02de3efdadf4f31c6e
|
4
|
+
data.tar.gz: e09fda17565f145d34ccc7c18674159b943170a150a6798da453884fecc61372
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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}",
|
@@ -1,23 +1,29 @@
|
|
1
1
|
module Admin
|
2
2
|
class EffectiveApplicantsDatatable < Effective::Datatable
|
3
3
|
filters do
|
4
|
-
scope :
|
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 :
|
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
|
-
|
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.
|
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.
|
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(:
|
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 :
|
16
|
-
|
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:
|
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:
|
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
|
-
|
55
|
-
|
56
|
-
|
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,
|
36
|
-
:submitted,
|
37
|
-
:
|
38
|
-
:
|
39
|
-
:
|
40
|
-
:
|
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 :
|
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,
|
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
|
130
|
+
applicant_educations_details :text
|
121
131
|
|
122
132
|
# Applicant Experiences
|
123
|
-
applicant_experiences_months
|
124
|
-
applicant_experiences_details
|
133
|
+
applicant_experiences_months :integer
|
134
|
+
applicant_experiences_details :text
|
125
135
|
|
126
136
|
# Additional Information
|
127
|
-
additional_information
|
137
|
+
additional_information :text
|
128
138
|
|
129
139
|
# Acts as Wizard
|
130
|
-
wizard_steps
|
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
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
301
|
+
def can_visit_step?(step)
|
302
|
+
if missing_info?
|
303
|
+
return [:start, :select, :billing, :checkout].exclude?(step)
|
304
|
+
end
|
287
305
|
|
288
|
-
|
289
|
-
orders.find { |order| order.purchasables.any?(&:applicant_submit_fee?) }
|
306
|
+
can_revisit_completed_steps(step)
|
290
307
|
end
|
291
308
|
|
292
|
-
|
293
|
-
|
294
|
-
|
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
|
-
|
297
|
-
|
323
|
+
# Update stamp price
|
324
|
+
stamp = stamps.first
|
298
325
|
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
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
|
-
|
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
|
-
|
483
|
-
|
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
|
-
|
505
|
-
|
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.
|
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.
|
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
|
-
|
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
|
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
|
-
|
33
|
-
|
34
|
-
|
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(
|
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.
|
2
|
+
%span.badge.badge-secondary= applicant.status_label
|
3
3
|
= applicant.summary
|
4
4
|
|
5
|
-
|
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
|
-
=
|
8
|
-
|
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
|
-
=
|
15
|
-
|
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.
|
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
|
-
|
67
|
-
|
72
|
+
- if applicant.submitted?
|
73
|
+
= link_to 'Complete Applicant', '#process', 'data-click-tab': true, class: 'btn btn-sm btn-primary'
|
68
74
|
|
69
|
-
|
70
|
-
|
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
|
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
|
-
|
79
|
-
|
80
|
-
%
|
81
|
-
|
82
|
-
|
83
|
-
|
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
|
-
|
86
|
-
|
87
|
-
|
101
|
+
%p
|
102
|
+
= icon((completed ? 'check' : 'x'), class: 'small-1')
|
103
|
+
= requirement
|
88
104
|
|
89
|
-
|
90
|
-
|
91
|
-
|
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
|
-
|
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
|
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
|
-
|
108
|
-
%
|
109
|
-
|
110
|
-
|
111
|
-
|
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
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
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'
|
@@ -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
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
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
|
-
|
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
|
-
|
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
|
|
@@ -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.
|
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-
|
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
|