effective_memberships 0.1.23 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 928383b46dabf57a0ee3e4ebed61050c15ddd4d2da01fcc50cec8ead2ded706b
4
- data.tar.gz: 2e7b2f5b6e5e75991239f093783ab8a83c6f2b522fa8f5a482c067d04cb122ba
3
+ metadata.gz: 981aea653a25a94a440ce8599ab99cab71f429ac409a839f5f061d9731239d2e
4
+ data.tar.gz: b88503a72edd658d63e81b49d4b17c4402dde65d717692db4dff53f3b54c02fe
5
5
  SHA512:
6
- metadata.gz: 8cd3faa8139e44db7aa485de820bed35f09b9d8cf8b2d56010cd87bf47515f143b9289362978cc305d63a50d8a24b4b8b9dadaabd240fffcc50abb970e8ac7d4
7
- data.tar.gz: ba43e01d4180108144333d61d17f22a4297374db0842c6e33bf7044d381b192883d6813532b5717dca8df778293b065e1a0ba7d07a2c867f2c60b03912520e1e
6
+ metadata.gz: 67066fc2672c948a59c20cd1422e88d39a5b41be07aecf36ede4dcace2919e91c0d1058c165ebad70af7ed6dedcdc47015f447d89449c330d7cd1edf537a80cb
7
+ data.tar.gz: 7f46ea79c2d79e431f1150224180520850dbc683b399b9758801818d9ab213de67e6e4902a1e3861a1b16a5f54843fe048f5e0c5222d89cda27351ae5f6e28a6
@@ -0,0 +1,9 @@
1
+ module Admin
2
+ class ApplicantReferencesController < 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
+ end
9
+ end
@@ -24,12 +24,11 @@ module Effective
24
24
 
25
25
  def permitted_params
26
26
  permitted = params.require(:effective_applicant_reference).permit!.except(:token, :last_notified_at, :status, :status_steps)
27
- authorized = current_user.effective_memberships_owners.include?(resource.applicant.owner) == false
28
27
 
29
- if resource.submitted? && resource.applicant.was_submitted? && authorized
30
- permitted
31
- else
28
+ if current_user && current_user.effective_memberships_owners.include?(resource.applicant&.owner)
32
29
  permitted.except(:reservations, :reservations_reason, :work_history, :accept_declaration)
30
+ else
31
+ permitted
33
32
  end
34
33
 
35
34
  end
@@ -16,7 +16,6 @@ module Effective
16
16
  end
17
17
  end
18
18
 
19
-
20
19
  after_save do
21
20
  flash.now[:success] = ''
22
21
  end
@@ -0,0 +1,14 @@
1
+ module Effective
2
+ class MembershipsDirectoryController < ApplicationController
3
+ include Effective::CrudController
4
+
5
+ def index
6
+ @page_title = 'Directory'
7
+
8
+ EffectiveResources.authorize!(self, :index, Effective::Membership)
9
+
10
+ @datatable = EffectiveResources.best('EffectiveMembershipsDirectoryDatatable').new
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,31 @@
1
+ class Admin::EffectiveApplicantReferencesDatatable < Effective::Datatable
2
+
3
+ datatable do
4
+ order :name
5
+
6
+ col :applicant
7
+
8
+ col :name
9
+ col :email
10
+ col :phone
11
+
12
+ col :status do |reference|
13
+ if reference.submitted?
14
+ 'Waiting on response'
15
+ elsif reference.completed?
16
+ 'Completed'
17
+ end
18
+ end
19
+
20
+ col :last_notified_at do |reference|
21
+ reference.last_notified_at&.strftime('%F') unless reference.completed?
22
+ end
23
+
24
+ actions_col
25
+ end
26
+
27
+ collection do
28
+ Effective::ApplicantReference.deep.all
29
+ end
30
+
31
+ end
@@ -8,7 +8,7 @@ module Admin
8
8
  col :owner_id, visible: false
9
9
  col :owner_type, visible: false
10
10
 
11
- col :owner
11
+ val :owner
12
12
  col :categories
13
13
 
14
14
  col :number
@@ -28,7 +28,7 @@ module Admin
28
28
  end
29
29
 
30
30
  collection do
31
- memberships = Effective::Membership.deep.all
31
+ memberships = Effective::Membership.deep.all.includes(:owner)
32
32
 
33
33
  raise('expected an owner_id, not user_id') if attributes[:user_id].present?
34
34
 
@@ -0,0 +1,31 @@
1
+ # Member Directory Datatable
2
+ class EffectiveMembershipsDirectoryDatatable < Effective::Datatable
3
+ datatable do
4
+ length 100
5
+
6
+ col(:name) { |membership| membership.owner.to_s }
7
+
8
+ col :joined_on
9
+ col :number
10
+ col :categories, search: :string, label: 'Category'
11
+ end
12
+
13
+ collection do
14
+ scope = Effective::Membership.deep.includes(:owner)
15
+
16
+ archived_klasses.each do |klass|
17
+ scope = scope.where.not(owner_id: klass.archived.select('id'), owner_type: klass.name)
18
+ end
19
+
20
+ scope
21
+ end
22
+
23
+ def archived_klasses
24
+ @archived_klasses ||= begin
25
+ klasses = Effective::Membership.distinct(:owner_type).pluck(:owner_type)
26
+ klasses = klasses.select { |klass| klass.safe_constantize.try(:acts_as_archived?) }
27
+ klasses.map { |klass| klass.constantize }
28
+ end
29
+ end
30
+
31
+ end
@@ -21,6 +21,8 @@ module EffectiveMembershipsOwner
21
21
  end
22
22
 
23
23
  included do
24
+ acts_as_role_restricted unless respond_to?(:acts_as_role_restricted?)
25
+
24
26
  # App scoped
25
27
  has_many :applicants, -> { order(:id) }, inverse_of: :owner, as: :owner
26
28
  has_many :fee_payments, -> { order(:id) }, inverse_of: :owner, as: :owner
@@ -51,10 +53,37 @@ module EffectiveMembershipsOwner
51
53
  end
52
54
 
53
55
  def effective_memberships_owners
54
- owners = users if respond_to?(:users) && users.any? { |user| user.class.respond_to?(:effective_memberships_owner?) }
55
- owners = organizations if respond_to?(:organizations) && organizations.any? { |organization| organization.class.respond_to?(:effective_memberships_owner?) }
56
+ owners = organizations if self.class.respond_to?(:effective_organizations_user?)
57
+ owners = users if self.class.respond_to?(:effective_organizations_organization?)
58
+
59
+ owners = Array(owners).reject { |owner| owner.try(:archived?) }
60
+
61
+ owners.presence || [self]
62
+ end
56
63
 
57
- owners || [self]
64
+ # This is the calculated way of determining if an owner is a member or not.
65
+ # The correct way to check for membership is: current_user.is?(:member)
66
+ def membership_present?
67
+ individual_membership_present? || organization_membership_present?
68
+ end
69
+
70
+ def individual_membership_present?
71
+ membership.present? && !membership.marked_for_destruction?
72
+ end
73
+
74
+ def organization_membership_present?(except: nil)
75
+ return false unless self.class.respond_to?(:effective_organizations_user?)
76
+ organizations.any? { |organization| organization != except && organization.membership_present? }
77
+ end
78
+
79
+ def assign_member_role
80
+ membership_present? ? add_role(:member) : remove_role(:member)
81
+ end
82
+
83
+ # This can be called by a script to recalculate the owner role based on current membership
84
+ def update_member_role!
85
+ assign_member_role
86
+ save!
58
87
  end
59
88
 
60
89
  def outstanding_fee_payment_owners
@@ -230,6 +259,7 @@ module EffectiveMembershipsOwner
230
259
  fee
231
260
  end
232
261
 
262
+ # Called by the registrar.
233
263
  def update_membership_status!
234
264
  raise('expected membership to be present') unless membership.present?
235
265
 
@@ -37,7 +37,7 @@ module EffectiveMembershipsRegistrar
37
37
  categories = Array(categories)
38
38
 
39
39
  raise('expecting a memberships owner') unless owner.class.respond_to?(:effective_memberships_owner?)
40
- raise('expecting a membership category') unless categories.all? { |cat| cat.class.respond_to?(:effective_memberships_category?) }
40
+ raise('expecting a membership category') unless categories.present? && categories.all? { |cat| cat.class.respond_to?(:effective_memberships_category?) }
41
41
 
42
42
  # Default Date and next number
43
43
  date ||= Time.zone.now
@@ -73,6 +73,9 @@ module EffectiveMembershipsRegistrar
73
73
  save!(owner, date: date)
74
74
  end
75
75
 
76
+ # Assign member role
77
+ add_member_role(owner)
78
+
76
79
  owner.update_membership_status!
77
80
  end
78
81
 
@@ -113,6 +116,9 @@ module EffectiveMembershipsRegistrar
113
116
  raise('already has purchased prorated fee') if fee.purchased?
114
117
  end
115
118
 
119
+ # Assign member role
120
+ add_member_role(owner)
121
+
116
122
  # Save owner
117
123
  save!(owner, date: date)
118
124
  end
@@ -163,6 +169,9 @@ module EffectiveMembershipsRegistrar
163
169
  owner.outstanding_fee_payment_fees.each { |fee| fee.mark_for_destruction }
164
170
  owner.outstanding_fee_payment_orders.each { |order| order.mark_for_destruction }
165
171
 
172
+ # Remove member role
173
+ remove_member_role(owner)
174
+
166
175
  save!(owner, date: date)
167
176
  end
168
177
 
@@ -293,6 +302,34 @@ module EffectiveMembershipsRegistrar
293
302
 
294
303
  protected
295
304
 
305
+ def add_member_role(owner)
306
+ owner.add_role(:member)
307
+
308
+ if owner.class.respond_to?(:effective_organizations_organization?)
309
+ organization = owner
310
+ organization.representatives.each { |representative| representative.user.add_role(:member) }
311
+ end
312
+
313
+ true
314
+ end
315
+
316
+ def remove_member_role(owner)
317
+ owner.remove_role(:member)
318
+
319
+ if owner.class.respond_to?(:effective_organizations_organization?)
320
+ organization = owner
321
+
322
+ organization.representatives.each do |representative|
323
+ user = representative.user
324
+ member = user.individual_membership_present? || user.organization_membership_present?(except: organization)
325
+
326
+ user.remove_role(:member) if !member
327
+ end
328
+ end
329
+
330
+ true
331
+ end
332
+
296
333
  def save!(owner, date: Time.zone.now)
297
334
  owner.build_membership_history(start_on: date)
298
335
  owner.save!
@@ -26,7 +26,7 @@ module Effective
26
26
  timestamps
27
27
  end
28
28
 
29
- scope :deep, -> { includes(:membership_categories) }
29
+ scope :deep, -> { includes(membership_categories: :category) }
30
30
  scope :sorted, -> { order(:id) }
31
31
 
32
32
  scope :with_paid_fees_through, -> (period = nil) {
@@ -58,6 +58,7 @@ module Effective
58
58
  validates :number, presence: true, uniqueness: true
59
59
  validates :joined_on, presence: true
60
60
  validates :registration_on, presence: true
61
+ validates :membership_categories, presence: true
61
62
 
62
63
  validate(if: -> { owner.present? }) do
63
64
  self.errors.add(:owner_id, 'must be a memberships owner') unless owner.class.effective_memberships_owner?
@@ -0,0 +1 @@
1
+ = render '/effective/applicant_references/applicant_reference', applicant_reference: applicant_reference, skip_actions: true
@@ -21,6 +21,10 @@
21
21
  = tab 'Process' do
22
22
  = render 'admin/applicants/form_process', applicant: applicant
23
23
 
24
+ - if applicant.applicant_references.present?
25
+ = tab 'References' do
26
+ .mb-4= render_inline_datatable(Admin::EffectiveApplicantReferencesDatatable.new(applicant: applicant))
27
+
24
28
  - if applicant.fees.present?
25
29
  = tab 'Fees' do
26
30
  .mb-4= render_inline_datatable(Admin::EffectiveFeesDatatable.new(applicant_id: applicant.to_param))
@@ -51,9 +51,9 @@
51
51
  = applicant.min_applicant_references
52
52
  Required References Responded
53
53
  - else
54
- - if applicant.applicant_references.count(&:submitted?) > 0
54
+ - if applicant.applicant_references.present?
55
55
  %p
56
- = applicant.applicant_references.count(&:submitted?)
56
+ = applicant.applicant_references.count(&:completed?)
57
57
  = '/'
58
58
  = applicant.applicant_references.count
59
59
  References Responded
@@ -23,7 +23,7 @@
23
23
  - elsif reference.completed?
24
24
  Response completed
25
25
 
26
- - if reference.applicant.was_submitted? && !reference.completed?
26
+ - unless reference.applicant.was_approved?
27
27
  %tr
28
28
  %th Last Notified at
29
29
  %td= reference.last_notified_at&.strftime('%F') || 'Never'
@@ -0,0 +1 @@
1
+ = render_datatable(@datatable, buttons: false)
@@ -32,7 +32,7 @@ EffectiveMemberships.setup do |config|
32
32
  # config.deliver_method = :deliver_later
33
33
 
34
34
  # Default layout
35
- config.mailer_layout = 'effective_memberships_mailer_layout'
35
+ # config.mailer_layout = 'effective_memberships_mailer_layout'
36
36
 
37
37
  # Default From
38
38
  config.mailer_sender = "no-reply@example.com"
data/config/routes.rb CHANGED
@@ -16,10 +16,17 @@ EffectiveMemberships::Engine.routes.draw do
16
16
  resources :fee_payments, only: [:new, :show] do
17
17
  resources :build, controller: :fee_payments, only: [:show, :update]
18
18
  end
19
+
20
+ get '/directory', to: 'memberships_directory#index'
19
21
  end
20
22
 
21
23
  namespace :admin do
22
24
  resources :applicants, except: [:new, :create, :show]
25
+
26
+ resources :applicant_references, only: [:show] do
27
+ post :notify, on: :member
28
+ end
29
+
23
30
  resources :fees
24
31
  resources :categories, except: [:show]
25
32
 
@@ -1,3 +1,3 @@
1
1
  module EffectiveMemberships
2
- VERSION = '0.1.23'
2
+ VERSION = '0.2.3'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_memberships
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.23
4
+ version: 0.2.3
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-01-12 00:00:00.000000000 Z
11
+ date: 2022-01-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: effective_roles
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: wicked
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -164,6 +178,20 @@ dependencies:
164
178
  - - ">="
165
179
  - !ruby/object:Gem::Version
166
180
  version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: effective_organizations
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
167
195
  - !ruby/object:Gem::Dependency
168
196
  name: effective_developer
169
197
  requirement: !ruby/object:Gem::Requirement
@@ -212,6 +240,7 @@ files:
212
240
  - app/assets/stylesheets/effective_memberships/base.scss
213
241
  - app/controllers/admin/applicant_course_areas_controller.rb
214
242
  - app/controllers/admin/applicant_course_names_controller.rb
243
+ - app/controllers/admin/applicant_references_controller.rb
215
244
  - app/controllers/admin/applicants_controller.rb
216
245
  - app/controllers/admin/categories_controller.rb
217
246
  - app/controllers/admin/fee_payments_controller.rb
@@ -221,8 +250,10 @@ files:
221
250
  - app/controllers/effective/applicant_references_controller.rb
222
251
  - app/controllers/effective/applicants_controller.rb
223
252
  - app/controllers/effective/fee_payments_controller.rb
253
+ - app/controllers/effective/memberships_directory_controller.rb
224
254
  - app/datatables/admin/effective_applicant_course_areas_datatable.rb
225
255
  - app/datatables/admin/effective_applicant_course_names_datatable.rb
256
+ - app/datatables/admin/effective_applicant_references_datatable.rb
226
257
  - app/datatables/admin/effective_applicants_datatable.rb
227
258
  - app/datatables/admin/effective_categories_datatable.rb
228
259
  - app/datatables/admin/effective_fee_payments_datatable.rb
@@ -235,6 +266,7 @@ files:
235
266
  - app/datatables/effective_applicant_references_datatable.rb
236
267
  - app/datatables/effective_applicants_datatable.rb
237
268
  - app/datatables/effective_fee_payments_datatable.rb
269
+ - app/datatables/effective_memberships_directory_datatable.rb
238
270
  - app/helpers/effective_memberships_helper.rb
239
271
  - app/mailers/effective/memberships_mailer.rb
240
272
  - app/models/concerns/effective_memberships_applicant.rb
@@ -263,6 +295,7 @@ files:
263
295
  - app/views/admin/applicant_course_areas/_form_applicant_course_area.html.haml
264
296
  - app/views/admin/applicant_course_areas/index.html.haml
265
297
  - app/views/admin/applicant_course_name/_form.html.haml
298
+ - app/views/admin/applicant_references/_applicant_reference.html.haml
266
299
  - app/views/admin/applicants/_form.html.haml
267
300
  - app/views/admin/applicants/_form_approve.html.haml
268
301
  - app/views/admin/applicants/_form_decline.html.haml
@@ -344,6 +377,7 @@ files:
344
377
  - app/views/effective/fees/_fee.html.haml
345
378
  - app/views/effective/memberships/_dashboard.html.haml
346
379
  - app/views/effective/memberships/_membership.html.haml
380
+ - app/views/effective/memberships_directory/index.html.haml
347
381
  - app/views/effective/memberships_mailer/applicant_approved.liquid
348
382
  - app/views/effective/memberships_mailer/applicant_declined.liquid
349
383
  - app/views/effective/memberships_mailer/applicant_reference_notification.liquid