effective_memberships 0.1.23 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml 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