effective_memberships 0.3.14 → 0.4.0
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/organizations_controller.rb +19 -0
- data/app/controllers/admin/representatives_controller.rb +19 -0
- data/app/controllers/effective/applicants_controller.rb +2 -3
- data/app/controllers/effective/fee_payments_controller.rb +1 -2
- data/app/controllers/effective/organizations_controller.rb +16 -0
- data/app/controllers/effective/representatives_controller.rb +19 -0
- data/app/datatables/admin/effective_applicants_datatable.rb +10 -5
- data/app/datatables/admin/effective_categories_datatable.rb +7 -0
- data/app/datatables/admin/effective_fee_payments_datatable.rb +11 -6
- data/app/datatables/admin/effective_organizations_datatable.rb +31 -0
- data/app/datatables/admin/effective_representatives_datatable.rb +28 -0
- data/app/datatables/effective_applicants_datatable.rb +1 -1
- data/app/datatables/effective_fee_payments_datatable.rb +5 -4
- data/app/datatables/effective_organizations_datatable.rb +18 -0
- data/app/datatables/effective_representatives_datatable.rb +40 -0
- data/app/helpers/effective_memberships_helper.rb +25 -0
- data/app/mailers/effective/memberships_mailer.rb +7 -7
- data/app/models/concerns/effective_memberships_applicant.rb +63 -30
- data/app/models/concerns/effective_memberships_category.rb +32 -5
- data/app/models/concerns/effective_memberships_fee_payment.rb +44 -45
- data/app/models/concerns/effective_memberships_organization.rb +94 -0
- data/app/models/concerns/effective_memberships_owner.rb +0 -55
- data/app/models/concerns/effective_memberships_registrar.rb +2 -2
- data/app/models/concerns/effective_memberships_user.rb +70 -0
- data/app/models/effective/fee.rb +1 -1
- data/app/models/effective/organization.rb +8 -0
- data/app/models/effective/representative.rb +56 -0
- data/app/views/admin/categories/_form_applicant_eligibility.html.haml +1 -1
- data/app/views/admin/categories/_form_applicant_steps.html.haml +29 -24
- data/app/views/admin/categories/_form_category.html.haml +3 -0
- data/app/views/admin/categories/_form_renewals.html.haml +0 -2
- data/app/views/admin/organizations/_fields.html.haml +6 -0
- data/app/views/admin/organizations/_form.html.haml +31 -0
- data/app/views/admin/organizations/_form_organization.html.haml +23 -0
- data/app/views/admin/representatives/_form.html.haml +38 -0
- data/app/views/{effective/applicants/_demographics_fields.html.haml → admin/representatives/_user_fields.html.haml} +2 -6
- data/app/views/effective/applicants/_dashboard.html.haml +24 -5
- data/app/views/effective/applicants/_demographics.html.haml +1 -1
- data/app/views/effective/applicants/_missing_info.html.haml +7 -3
- data/app/views/effective/applicants/_organization.html.haml +9 -0
- data/app/views/effective/applicants/_select_organization.html.haml +21 -0
- data/app/views/effective/applicants/_summary.html.haml +17 -9
- data/app/views/effective/applicants/billing.html.haml +2 -2
- data/app/views/effective/applicants/demographics.html.haml +7 -6
- data/app/views/effective/applicants/education.html.haml +2 -2
- data/app/views/effective/applicants/organization.html.haml +19 -0
- data/app/views/effective/applicants/references.html.haml +1 -1
- data/app/views/effective/applicants/select.html.haml +11 -1
- data/app/views/effective/applicants/stamp.html.haml +2 -2
- data/app/views/effective/applicants/start.html.haml +17 -11
- data/app/views/effective/applicants/submitted.html.haml +5 -5
- data/app/views/effective/applicants/summary.html.haml +1 -1
- data/app/views/effective/fee_payments/_demographics.html.haml +1 -1
- data/app/views/effective/fee_payments/_organization.html.haml +9 -0
- data/app/views/effective/fee_payments/_summary.html.haml +39 -1
- data/app/views/effective/fee_payments/billing.html.haml +2 -2
- data/app/views/effective/fee_payments/demographics.html.haml +2 -2
- data/app/views/effective/fee_payments/organization.html.haml +18 -0
- data/app/views/effective/fee_payments/start.html.haml +20 -17
- data/app/views/effective/fee_payments/submitted.html.haml +10 -3
- data/app/views/effective/fees/_dashboard.html.haml +20 -8
- data/app/views/effective/memberships/_dashboard.html.haml +16 -5
- data/app/views/effective/organizations/_dashboard.html.haml +10 -0
- data/app/views/effective/organizations/_form.html.haml +8 -0
- data/app/views/effective/organizations/_form_organization.html.haml +11 -0
- data/app/views/effective/representatives/_form.html.haml +33 -0
- data/app/views/effective/{fee_payments/_demographics_fields.html.haml → representatives/_user_fields.html.haml} +2 -6
- data/app/views/organizations/_demographics.html.haml +45 -0
- data/app/views/organizations/_fields_demographics.html.haml +29 -0
- data/app/views/users/_demographics.html.haml +50 -0
- data/app/views/users/_fields_demographics.html.haml +29 -0
- data/config/effective_memberships.rb +3 -0
- data/config/routes.rb +9 -0
- data/db/migrate/01_create_effective_memberships.rb.erb +57 -10
- data/db/seeds.rb +18 -0
- data/lib/effective_memberships/engine.rb +3 -0
- data/lib/effective_memberships/version.rb +1 -1
- data/lib/effective_memberships.rb +6 -2
- metadata +33 -20
- data/app/views/effective/applicants/_demographics_owner.html.haml +0 -20
- data/app/views/effective/fee_payments/_demographics_owner.html.haml +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 223d0bdf9ce08beacd79d4fdeb3e184878bb9e9cdb8b5964aa1c4ace9f1d2735
|
4
|
+
data.tar.gz: 158b570a8dc933b247245e450c74a78c63877ece8f35a59b1e400b0fdb017b43
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b8e3fe9641f2826a4df557f1817163d719bb53112a835b3a5456ea7020283f360e4bcdc99d75c1a79256f6515b2fa05f5a2c0001b6eb1ecfa988dd09eba8eb5d
|
7
|
+
data.tar.gz: 013d39152828dce9d873e1eb1f1bb9f3a42aa83fc31105e020adbd47734f42902eec0659ff661b1fd4e8bd1983a389374848847221b6aec35dcbb8bfb5552661
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Admin
|
2
|
+
class OrganizationsController < ApplicationController
|
3
|
+
before_action(:authenticate_user!) if defined?(Devise)
|
4
|
+
before_action { EffectiveResources.authorize!(self, :admin, :effective_memberships) }
|
5
|
+
|
6
|
+
include Effective::CrudController
|
7
|
+
|
8
|
+
resource_scope -> { EffectiveMemberships.Organization.deep.all }
|
9
|
+
datatable -> { EffectiveResources.best('Admin::EffectiveMembershipsDatatable').new }
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def permitted_params
|
14
|
+
model = (params.key?(:effective_organization) ? :effective_organization : :organization)
|
15
|
+
params.require(model).permit!
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Admin
|
2
|
+
class RepresentativesController < ApplicationController
|
3
|
+
before_action(:authenticate_user!) if defined?(Devise)
|
4
|
+
before_action { EffectiveResources.authorize!(self, :admin, :effective_memberships) }
|
5
|
+
|
6
|
+
include Effective::CrudController
|
7
|
+
|
8
|
+
resource_scope -> { Effective::Representative.deep.all }
|
9
|
+
datatable -> { Admin::EffectiveRepresentativesDatatable.new }
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def permitted_params
|
14
|
+
model = (params.key?(:effective_representative) ? :effective_representative : :representative)
|
15
|
+
params.require(model).permit!
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -4,9 +4,8 @@ module Effective
|
|
4
4
|
|
5
5
|
include Effective::WizardController
|
6
6
|
|
7
|
-
resource_scope -> { EffectiveMemberships.Applicant.deep.where(
|
8
|
-
|
9
|
-
submit :resubmit, 'Submit Application'
|
7
|
+
resource_scope -> { EffectiveMemberships.Applicant.deep.where(user: current_user) }
|
10
8
|
|
9
|
+
submit :resubmit, 'Resubmit Application'
|
11
10
|
end
|
12
11
|
end
|
@@ -4,7 +4,6 @@ module Effective
|
|
4
4
|
|
5
5
|
include Effective::WizardController
|
6
6
|
|
7
|
-
resource_scope -> { EffectiveMemberships.FeePayment.deep.where(
|
8
|
-
|
7
|
+
resource_scope -> { EffectiveMemberships.FeePayment.deep.where(user: current_user) }
|
9
8
|
end
|
10
9
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Effective
|
2
|
+
class OrganizationsController < ApplicationController
|
3
|
+
before_action(:authenticate_user!) if defined?(Devise)
|
4
|
+
|
5
|
+
include Effective::CrudController
|
6
|
+
|
7
|
+
resource_scope -> { EffectiveMemberships.Organization.deep.where(id: current_user.organizations) }
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def permitted_params
|
12
|
+
params.require(:organization).permit!
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Effective
|
2
|
+
class RepresentativesController < ApplicationController
|
3
|
+
before_action(:authenticate_user!) if defined?(Devise)
|
4
|
+
|
5
|
+
include Effective::CrudController
|
6
|
+
|
7
|
+
resource_scope -> {
|
8
|
+
organizations = EffectiveMemberships.Organization.deep.where(id: current_user.organizations)
|
9
|
+
Effective::Representative.deep.where(organization: organizations)
|
10
|
+
}
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def permitted_params
|
15
|
+
params.require(:effective_representative).permit!
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -26,7 +26,8 @@ module Admin
|
|
26
26
|
|
27
27
|
col :approved_at, label: 'Approved', visible: false, as: :date
|
28
28
|
|
29
|
-
col :
|
29
|
+
col :user
|
30
|
+
col :organization
|
30
31
|
|
31
32
|
col :applicant_type
|
32
33
|
col :category, search: { collection: EffectiveMemberships.Category.all, polymorphic: false }
|
@@ -40,14 +41,18 @@ module Admin
|
|
40
41
|
collection do
|
41
42
|
applicants = EffectiveMemberships.Applicant.deep.all
|
42
43
|
|
43
|
-
raise('expected
|
44
|
+
raise('expected a user_id or organization_id, not owner_id') if attributes[:owner_id].present?
|
44
45
|
|
45
|
-
if scope == :in_progress && attributes[:
|
46
|
+
if scope == :in_progress && attributes[:user_id].blank? && attributes[:organization_id].blank?
|
46
47
|
applicants = applicants.where.not(status: :draft)
|
47
48
|
end
|
48
49
|
|
49
|
-
if attributes[:
|
50
|
-
applicants = applicants.where(
|
50
|
+
if attributes[:user_id].present?
|
51
|
+
applicants = applicants.where(user_id: attributes[:owner_id])
|
52
|
+
end
|
53
|
+
|
54
|
+
if attributes[:organization_id].present?
|
55
|
+
applicants = applicants.where(organization_id: attributes[:organization_id])
|
51
56
|
end
|
52
57
|
|
53
58
|
if attributes[:except_id].present?
|
@@ -8,13 +8,20 @@ module Admin
|
|
8
8
|
col :id, visible: false
|
9
9
|
|
10
10
|
col :title
|
11
|
+
col :can_apply_new, label: 'Can Apply'
|
11
12
|
col :applicant_fee, as: :price
|
13
|
+
|
12
14
|
col :renewal_fee, as: :price
|
13
15
|
col :late_fee, as: :price
|
14
16
|
col :rich_text_body, label: 'Body'
|
15
17
|
col :tax_exempt
|
16
18
|
col :qb_item_name, visible: false
|
17
19
|
|
20
|
+
col :category_type, search: EffectiveMemberships.Category.category_types
|
21
|
+
|
22
|
+
col :optional_applicant_wizard_steps, label: 'Applicant Steps'
|
23
|
+
col :optional_fee_payment_wizard_steps, label: 'Fee Payment Steps'
|
24
|
+
|
18
25
|
actions_col
|
19
26
|
end
|
20
27
|
|
@@ -18,7 +18,8 @@ module Admin
|
|
18
18
|
col :period, visible: false
|
19
19
|
col :submitted_at, label: 'Submitted', visible: false, as: :date
|
20
20
|
|
21
|
-
col :
|
21
|
+
col :user
|
22
|
+
col :organization
|
22
23
|
|
23
24
|
col :category, search: { collection: EffectiveMemberships.Category.all, polymorphic: false }
|
24
25
|
|
@@ -27,17 +28,21 @@ module Admin
|
|
27
28
|
actions_col
|
28
29
|
end
|
29
30
|
|
30
|
-
collection do
|
31
|
+
collection(apply_belongs_to: false) do
|
31
32
|
fee_payments = EffectiveMemberships.FeePayment.deep.all
|
32
33
|
|
33
|
-
raise('expected an
|
34
|
+
raise('expected an user_id but was given an owner_id') if attributes[:owner_id].present?
|
34
35
|
|
35
|
-
if fee_payments == :in_progress && attributes[:
|
36
|
+
if fee_payments == :in_progress && attributes[:user_id].blank? && attributes[:organization_id].blank?
|
36
37
|
fee_payments = fee_payments.where.not(status: :draft)
|
37
38
|
end
|
38
39
|
|
39
|
-
if attributes[:
|
40
|
-
fee_payments = fee_payments.where(
|
40
|
+
if attributes[:user_id].present?
|
41
|
+
fee_payments = fee_payments.where(user_id: attributes[:user_id])
|
42
|
+
end
|
43
|
+
|
44
|
+
if attributes[:organization_id].present?
|
45
|
+
fee_payments = fee_payments.where(organization_id: attributes[:organization_id])
|
41
46
|
end
|
42
47
|
|
43
48
|
if attributes[:except_id].present?
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Admin
|
2
|
+
class EffectiveOrganizationsDatatable < Effective::Datatable
|
3
|
+
datatable do
|
4
|
+
|
5
|
+
col :updated_at, visible: false
|
6
|
+
col :created_at, visible: false
|
7
|
+
|
8
|
+
col :id, visible: false
|
9
|
+
|
10
|
+
if categories.present?
|
11
|
+
col :category, search: categories
|
12
|
+
end
|
13
|
+
|
14
|
+
col :title
|
15
|
+
|
16
|
+
col :representatives_count
|
17
|
+
col :representatives
|
18
|
+
|
19
|
+
actions_col
|
20
|
+
end
|
21
|
+
|
22
|
+
collection do
|
23
|
+
EffectiveMemberships.Organization.deep.all
|
24
|
+
end
|
25
|
+
|
26
|
+
def categories
|
27
|
+
EffectiveMemberships.Organization.categories
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Admin
|
2
|
+
class EffectiveRepresentativesDatatable < Effective::Datatable
|
3
|
+
datatable do
|
4
|
+
col :id, visible: false
|
5
|
+
col :user_id, visible: false
|
6
|
+
|
7
|
+
col :organization
|
8
|
+
col :user
|
9
|
+
|
10
|
+
col :email do |representative|
|
11
|
+
mail_to(representative.user.email)
|
12
|
+
end
|
13
|
+
|
14
|
+
col :roles, search: roles_collection
|
15
|
+
|
16
|
+
actions_col
|
17
|
+
end
|
18
|
+
|
19
|
+
collection do
|
20
|
+
Effective::Representative.deep.all
|
21
|
+
end
|
22
|
+
|
23
|
+
def roles_collection
|
24
|
+
EffectiveRoles.roles_collection(Effective::Representative.new).map(&:second)
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -6,7 +6,9 @@ class EffectiveFeePaymentsDatatable < Effective::Datatable
|
|
6
6
|
col :token, visible: false
|
7
7
|
col :created_at, visible: false
|
8
8
|
|
9
|
-
col :
|
9
|
+
col :user
|
10
|
+
col :organization
|
11
|
+
|
10
12
|
col :status, visible: false
|
11
13
|
col :submitted_at, label: 'Submitted', as: :date
|
12
14
|
col :period, visible: false
|
@@ -16,9 +18,8 @@ class EffectiveFeePaymentsDatatable < Effective::Datatable
|
|
16
18
|
actions_col(new: false)
|
17
19
|
end
|
18
20
|
|
19
|
-
collection do
|
20
|
-
EffectiveMemberships.FeePayment.deep.done
|
21
|
-
.where(owner: current_user.effective_memberships_owners)
|
21
|
+
collection(apply_belongs_to: false) do
|
22
|
+
scope = EffectiveMemberships.FeePayment.deep.done.for(current_user)
|
22
23
|
end
|
23
24
|
|
24
25
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# Dashboard Organizations
|
2
|
+
class EffectiveOrganizationsDatatable < Effective::Datatable
|
3
|
+
datatable do
|
4
|
+
order :title
|
5
|
+
|
6
|
+
col :id, visible: false
|
7
|
+
|
8
|
+
col :title
|
9
|
+
col :representatives
|
10
|
+
|
11
|
+
actions_col
|
12
|
+
end
|
13
|
+
|
14
|
+
collection do
|
15
|
+
EffectiveMemberships.Organization.deep.where(id: current_user.organizations)
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
class EffectiveRepresentativesDatatable < Effective::Datatable
|
2
|
+
datatable do
|
3
|
+
col :id, visible: false
|
4
|
+
|
5
|
+
col :organization
|
6
|
+
col :user
|
7
|
+
|
8
|
+
unless attributes[:user_id]
|
9
|
+
col :email do |representative|
|
10
|
+
mail_to(representative.user.email)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
col :roles, search: roles_collection
|
15
|
+
|
16
|
+
unless attributes[:actions] == false
|
17
|
+
actions_col
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
collection do
|
23
|
+
scope = Effective::Representative.deep.all.where(organization: current_user.organizations)
|
24
|
+
|
25
|
+
if attributes[:organization_id]
|
26
|
+
scope = scope.where(organization_id: attributes[:organization_id])
|
27
|
+
end
|
28
|
+
|
29
|
+
if attributes[:user_id]
|
30
|
+
scope = scope.where(user_id: attributes[:user_id])
|
31
|
+
end
|
32
|
+
|
33
|
+
scope
|
34
|
+
end
|
35
|
+
|
36
|
+
def roles_collection
|
37
|
+
EffectiveRoles.roles_collection(Effective::Representative.new).map(&:second)
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -8,4 +8,29 @@ module EffectiveMembershipsHelper
|
|
8
8
|
end.compact
|
9
9
|
end
|
10
10
|
|
11
|
+
def effective_memberships_select_applicant_organization_collection(resource)
|
12
|
+
user = (resource.respond_to?(:user) ? resource.user : resource)
|
13
|
+
raise('expected an effective memberships user') unless user.class.try(:effective_memberships_user?)
|
14
|
+
|
15
|
+
representatives = user.representatives.select { |rep| rep.is?(:owner) || rep.is?(:billing) }
|
16
|
+
organizations = representatives.map { |rep| [rep.organization.to_s, rep.organization.id] }
|
17
|
+
|
18
|
+
organizations + [['New Organization...', 'new']]
|
19
|
+
end
|
20
|
+
|
21
|
+
# This is the select yourself or organization field on FeePayments#start
|
22
|
+
def effective_memberships_select_fee_payment_organization(resource)
|
23
|
+
user = (resource.respond_to?(:user) ? resource.user : resource)
|
24
|
+
raise('expected an effective memberships user') unless user.class.try(:effective_memberships_user?)
|
25
|
+
|
26
|
+
owners = user.memberships_owners.select { |owner| owner.outstanding_fee_payment_fees.present? }
|
27
|
+
|
28
|
+
owners.map do |owner|
|
29
|
+
[
|
30
|
+
owner.to_s,
|
31
|
+
(owner.to_param if owner.kind_of?(EffectiveMemberships.Organization)) # Nil when user
|
32
|
+
]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
11
36
|
end
|
@@ -11,7 +11,7 @@ module Effective
|
|
11
11
|
subject = subject_for(__method__, 'Applicant Completed', resource, opts)
|
12
12
|
headers = headers_for(resource, opts)
|
13
13
|
|
14
|
-
mail(to: resource.
|
14
|
+
mail(to: resource.user.email, subject: subject, **headers)
|
15
15
|
end
|
16
16
|
|
17
17
|
def applicant_missing_info(resource, opts = {})
|
@@ -21,7 +21,7 @@ module Effective
|
|
21
21
|
subject = subject_for(__method__, 'Applicant Missing Info', resource, opts)
|
22
22
|
headers = headers_for(resource, opts)
|
23
23
|
|
24
|
-
mail(to: resource.
|
24
|
+
mail(to: resource.user.email, subject: subject, **headers)
|
25
25
|
end
|
26
26
|
|
27
27
|
def applicant_approved(resource, opts = {})
|
@@ -31,7 +31,7 @@ module Effective
|
|
31
31
|
subject = subject_for(__method__, 'Applicant Approved', resource, opts)
|
32
32
|
headers = headers_for(resource, opts)
|
33
33
|
|
34
|
-
mail(to: resource.
|
34
|
+
mail(to: resource.user.email, subject: subject, **headers)
|
35
35
|
end
|
36
36
|
|
37
37
|
def applicant_declined(resource, opts = {})
|
@@ -41,7 +41,7 @@ module Effective
|
|
41
41
|
subject = subject_for(__method__, 'Applicant Declined', resource, opts)
|
42
42
|
headers = headers_for(resource, opts)
|
43
43
|
|
44
|
-
mail(to: resource.
|
44
|
+
mail(to: resource.user.email, subject: subject, **headers)
|
45
45
|
end
|
46
46
|
|
47
47
|
def applicant_reference_notification(resource, opts = {})
|
@@ -58,11 +58,11 @@ module Effective
|
|
58
58
|
|
59
59
|
def assigns_for(resource)
|
60
60
|
if resource.class.respond_to?(:effective_memberships_applicant?)
|
61
|
-
return applicant_assigns(resource).merge(
|
61
|
+
return applicant_assigns(resource).merge(owner_assigns(resource.owner))
|
62
62
|
end
|
63
63
|
|
64
64
|
if resource.kind_of?(Effective::ApplicantReference)
|
65
|
-
return reference_assigns(resource).merge(
|
65
|
+
return reference_assigns(resource).merge(owner_assigns(resource.applicant.owner))
|
66
66
|
end
|
67
67
|
|
68
68
|
raise('unexpected resource')
|
@@ -99,7 +99,7 @@ module Effective
|
|
99
99
|
{ reference: values }
|
100
100
|
end
|
101
101
|
|
102
|
-
def
|
102
|
+
def owner_assigns(owner)
|
103
103
|
raise('expected a owner') unless owner.class.respond_to?(:effective_memberships_owner?)
|
104
104
|
|
105
105
|
values = {
|
@@ -44,7 +44,8 @@ module EffectiveMembershipsApplicant
|
|
44
44
|
acts_as_wizard(
|
45
45
|
start: 'Start',
|
46
46
|
select: 'Select Application Type',
|
47
|
-
demographics: 'Demographics',
|
47
|
+
demographics: 'Demographics', # Individual only. Users fields.
|
48
|
+
organization: 'Organization', # Organization only. Organization fields.
|
48
49
|
education: 'Education',
|
49
50
|
course_amounts: 'Courses',
|
50
51
|
experience: 'Work Experience',
|
@@ -73,8 +74,11 @@ module EffectiveMembershipsApplicant
|
|
73
74
|
attr_accessor :approved_membership_date
|
74
75
|
|
75
76
|
# Application Namespace
|
76
|
-
belongs_to :
|
77
|
-
accepts_nested_attributes_for :
|
77
|
+
belongs_to :user, polymorphic: true
|
78
|
+
accepts_nested_attributes_for :user
|
79
|
+
|
80
|
+
belongs_to :organization, polymorphic: true, optional: true
|
81
|
+
accepts_nested_attributes_for :organization
|
78
82
|
|
79
83
|
belongs_to :category, polymorphic: true, optional: true
|
80
84
|
belongs_to :from_category, polymorphic: true, optional: true
|
@@ -142,7 +146,7 @@ module EffectiveMembershipsApplicant
|
|
142
146
|
timestamps
|
143
147
|
end
|
144
148
|
|
145
|
-
scope :deep, -> { includes(:
|
149
|
+
scope :deep, -> { includes(:user, :organization, :category, :from_category, :orders) }
|
146
150
|
scope :sorted, -> { order(:id) }
|
147
151
|
|
148
152
|
scope :in_progress, -> { where.not(status: [:approved, :declined]) }
|
@@ -150,14 +154,15 @@ module EffectiveMembershipsApplicant
|
|
150
154
|
|
151
155
|
scope :not_draft, -> { where.not(status: :draft) }
|
152
156
|
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
end
|
157
|
+
scope :for, -> (user) {
|
158
|
+
raise('expected a effective memberships user') unless user.class.try(:effective_memberships_user?)
|
159
|
+
where(user: user).or(where(organization: user.organizations))
|
160
|
+
}
|
158
161
|
|
159
|
-
|
160
|
-
|
162
|
+
# Set Apply to Join or Reclassification
|
163
|
+
before_validation(if: -> { (new_record? || current_step == :select) && owner.present? }) do
|
164
|
+
self.applicant_type = (owner.membership.blank? ? 'Apply to Join' : 'Apply to Reclassify')
|
165
|
+
self.from_category = owner.membership&.category
|
161
166
|
end
|
162
167
|
|
163
168
|
before_validation(if: -> { current_step == :experience }) do
|
@@ -165,18 +170,16 @@ module EffectiveMembershipsApplicant
|
|
165
170
|
end
|
166
171
|
|
167
172
|
# All Steps validations
|
168
|
-
validates :
|
173
|
+
validates :user, presence: true
|
169
174
|
validates :from_category, presence: true, if: -> { reclassification? }
|
170
175
|
|
171
176
|
validate(if: -> { reclassification? }) do
|
172
177
|
errors.add(:category_id, "can't reclassify to existing category") if category_id == from_category_id
|
173
178
|
end
|
174
179
|
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
errors.add(:base, 'may not have outstanding fees') if owner.outstanding_fee_payment_fees.present?
|
179
|
-
end
|
180
|
+
validate(if: -> { category.present? }) do
|
181
|
+
self.errors.add(:organization_id, "can't be blank when organization category") if category.organization? && organization.blank?
|
182
|
+
self.errors.add(:organization_id, "must be blank when individual category") if category.individual? && organization.present?
|
180
183
|
end
|
181
184
|
|
182
185
|
# Select Step
|
@@ -185,6 +188,10 @@ module EffectiveMembershipsApplicant
|
|
185
188
|
validates :category, presence: true
|
186
189
|
end
|
187
190
|
|
191
|
+
validate(if: -> { current_step == :select && owner.present? }) do
|
192
|
+
self.errors.add(:base, 'may not have outstanding fees') if owner.outstanding_fee_payment_fees.present?
|
193
|
+
end
|
194
|
+
|
188
195
|
# Applicant Educations Step
|
189
196
|
with_options(if: -> { current_step == :education }) do
|
190
197
|
validate do
|
@@ -291,6 +298,14 @@ module EffectiveMembershipsApplicant
|
|
291
298
|
|
292
299
|
# Special logic for stamp step
|
293
300
|
applicant_steps.delete(:stamp) unless apply_to_join?
|
301
|
+
applicant_steps.delete(:organization) unless category&.organization?
|
302
|
+
|
303
|
+
# change_wizard_steps is defined in effective_resources acts_as_wizard
|
304
|
+
applicant_steps = change_wizard_steps(applicant_steps)
|
305
|
+
|
306
|
+
unless applicant_steps.kind_of?(Array) && applicant_steps.all? { |step| step.kind_of?(Symbol) }
|
307
|
+
raise('expected change_wizard_steps to return an Array of steps with no nils')
|
308
|
+
end
|
294
309
|
|
295
310
|
wizard_steps.select do |step|
|
296
311
|
required_steps.include?(step) || category.blank? || applicant_steps.include?(step)
|
@@ -370,6 +385,18 @@ module EffectiveMembershipsApplicant
|
|
370
385
|
end
|
371
386
|
end
|
372
387
|
|
388
|
+
def owner
|
389
|
+
organization || user
|
390
|
+
end
|
391
|
+
|
392
|
+
def owner_symbol
|
393
|
+
organization? ? :organization : :user
|
394
|
+
end
|
395
|
+
|
396
|
+
def build_organization(params = {})
|
397
|
+
self.organization = EffectiveMemberships.Organization.new(params)
|
398
|
+
end
|
399
|
+
|
373
400
|
def apply_to_join?
|
374
401
|
applicant_type == 'Apply to Join'
|
375
402
|
end
|
@@ -378,8 +405,12 @@ module EffectiveMembershipsApplicant
|
|
378
405
|
applicant_type == 'Apply to Reclassify'
|
379
406
|
end
|
380
407
|
|
381
|
-
def
|
382
|
-
|
408
|
+
def individual?
|
409
|
+
!(owner.kind_of?(EffectiveMemberships.Organization) && category&.organization?)
|
410
|
+
end
|
411
|
+
|
412
|
+
def organization?
|
413
|
+
owner.kind_of?(EffectiveMemberships.Organization) && category&.organization?
|
383
414
|
end
|
384
415
|
|
385
416
|
def in_progress?
|
@@ -399,9 +430,11 @@ module EffectiveMembershipsApplicant
|
|
399
430
|
when 'draft'
|
400
431
|
"Applicant has not yet completed the #{category} wizard steps or paid to submit this application. This application will transition to 'submitted' after payment has been collected."
|
401
432
|
when 'submitted'
|
402
|
-
summary = "Application has been purchased and submitted.
|
433
|
+
summary = "Application has been purchased and submitted."
|
434
|
+
tasks = "The following tasks remain before it can be completed:"
|
435
|
+
approval = "Waiting on approval."
|
403
436
|
items = completed_requirements.map { |item, done| "<li>#{item}: #{done ? 'Complete' : 'Incomplete'}</li>" }.join
|
404
|
-
"<p>#{summary}</p><ul>#{items}</ul>"
|
437
|
+
completed_requirements.present? ? "<p>#{summary} #{tasks}</p><ul>#{items}</ul>" : "#{summary} #{approval}"
|
405
438
|
when 'completed'
|
406
439
|
if applicant_reviews_required?
|
407
440
|
"All required materials have been provided. This application will transition to 'reviewed' after all reviewers have voted."
|
@@ -425,11 +458,11 @@ module EffectiveMembershipsApplicant
|
|
425
458
|
def can_apply_categories_collection
|
426
459
|
categories = EffectiveMemberships.Category.sorted.can_apply
|
427
460
|
|
428
|
-
if
|
461
|
+
if user.blank? || !user.is?(:member)
|
429
462
|
return categories.where(can_apply_new: true)
|
430
463
|
end
|
431
464
|
|
432
|
-
category_ids =
|
465
|
+
category_ids = user.memberships.map(&:category_ids).flatten
|
433
466
|
|
434
467
|
categories.select do |cat|
|
435
468
|
cat.can_apply_existing? ||
|
@@ -503,10 +536,6 @@ module EffectiveMembershipsApplicant
|
|
503
536
|
)
|
504
537
|
end
|
505
538
|
|
506
|
-
# The submit! method used to be here
|
507
|
-
# But it needs to be inside the included do block
|
508
|
-
# So see above. Sorry.
|
509
|
-
|
510
539
|
def applicant_references_required?
|
511
540
|
min_applicant_references > 0
|
512
541
|
end
|
@@ -514,9 +543,13 @@ module EffectiveMembershipsApplicant
|
|
514
543
|
# When an application is submitted, these must be done to go to completed.
|
515
544
|
# An Admin can override this and just set them to completed.
|
516
545
|
def completed_requirements
|
517
|
-
|
518
|
-
|
519
|
-
|
546
|
+
if category&.applicant_wizard_steps&.include?(:references) || applicant_references_required?
|
547
|
+
{
|
548
|
+
'Applicant References' => (!applicant_references_required? || applicant_references.count(&:completed?) >= min_applicant_references)
|
549
|
+
}
|
550
|
+
else
|
551
|
+
{}
|
552
|
+
end
|
520
553
|
end
|
521
554
|
|
522
555
|
def complete!
|