effective_memberships 0.1.22 → 0.2.2

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: 8631bb8b93a7995e011f7adec1de42aeea234db706f39d09e2b82354263e7d79
4
- data.tar.gz: 0bbb9dfcd4376d091ed21e9a0e06f2b48e4124b8292c0209d64b5ccb57966ef4
3
+ metadata.gz: 240ed521dcef407cae7be663d49f877b373012b2fbd8877b787a4fa315539a2b
4
+ data.tar.gz: 394ebf710135b07e984df6277e80ca2340f8f4e4e61980e127dd0113ea6e2dca
5
5
  SHA512:
6
- metadata.gz: 81a13b9ff646557e043080d8dcda78b47291bcfd605b648ac6f5617c06fc5c575c10b96ccda6da7416f25580a1245fc230fb7e4a6396ab681a81e5302ff1e421
7
- data.tar.gz: cdcb59441b8a561ea6324c30656bac165c67acebb9a593ab7133110a24e38ad32d2b753fe6f539fd87cadd9789df0bb4bcd90b408a735d7817c6b692f9437728
6
+ metadata.gz: 7602bafa9bd4d86c4d01db0acadf432da1b9af29c7eeee171d3e560baa74037318802e7604282986bbe09230fbee3ae8005ee1f3148ff477422d0ef5ed83d138
7
+ data.tar.gz: a3d51cf1a5d0941b48d1a3c400115973478acf21c501daf8e79aa61b83bb2109c314c6091d8a8742d1637b21895cd214819c94b53aef5e0743db3371f384bef8
@@ -16,10 +16,6 @@ module Effective
16
16
  end
17
17
  end
18
18
 
19
- before_render(only: :show, if: -> { step == :checkout }) do
20
- resource.ready!
21
- end
22
-
23
19
  after_save do
24
20
  flash.now[:success] = ''
25
21
  end
@@ -16,10 +16,6 @@ module Effective
16
16
  end
17
17
  end
18
18
 
19
- before_render(only: :show, if: -> { step == :checkout }) do
20
- resource.ready!
21
- end
22
-
23
19
  after_save do
24
20
  flash.now[:success] = ''
25
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
@@ -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
@@ -60,6 +60,8 @@ module EffectiveMembershipsApplicant
60
60
  submitted: 'Submitted'
61
61
  )
62
62
 
63
+ acts_as_purchasable_wizard
64
+
63
65
  log_changes(except: :wizard_steps) if respond_to?(:log_changes)
64
66
 
65
67
  has_many_attached :applicant_files
@@ -247,12 +249,6 @@ module EffectiveMembershipsApplicant
247
249
  validates :declare_truth, acceptance: true
248
250
  end
249
251
 
250
- # Billing Step
251
- validate(if: -> { current_step == :billing && owner.present? }) do
252
- self.errors.add(:base, "must have a billing address") unless owner.billing_address.present?
253
- self.errors.add(:base, "must have an email") unless owner.email.present?
254
- end
255
-
256
252
  # Admin Approve
257
253
  validate(if: -> { approved_membership_date.present? }) do
258
254
  if approved_membership_date.to_date > Time.zone.now.to_date
@@ -288,10 +284,47 @@ module EffectiveMembershipsApplicant
288
284
  end
289
285
  end
290
286
 
291
- after_purchase do |_|
292
- raise('expected submit_order to be purchased') unless submit_order&.purchased?
293
- submit_purchased!
287
+ # All Fees and Orders
288
+ def submit_fees
289
+ fees.select { |fee| fee.applicant_submit_fee? }
290
+ end
291
+
292
+ def submit_order
293
+ orders.find { |order| order.purchasables.any?(&:applicant_submit_fee?) }
294
+ end
295
+
296
+ def submit_fee_qb_item_name
297
+ 'Applicant'
298
+ end
299
+
300
+ def find_or_build_submit_fees
301
+ return submit_fees if submit_fees.present?
302
+
303
+ fees.build(
304
+ owner: owner,
305
+ fee_type: 'Applicant',
306
+ category: category,
307
+ price: category.applicant_fee,
308
+ qb_item_name: submit_fee_qb_item_name()
309
+ )
310
+
311
+ submit_fees
312
+ end
313
+
314
+ # Draft -> Submitted requirements
315
+ def submit!
316
+ raise('already submitted') if was_submitted?
317
+ raise('expected a purchased order') unless submit_order&.purchased?
318
+
319
+ after_commit do
320
+ applicant_references.each { |reference| reference.notify! if reference.submitted? }
321
+ end
322
+
323
+ wizard_steps[:checkout] ||= Time.zone.now
324
+ wizard_steps[:submitted] = Time.zone.now
325
+ submitted!
294
326
  end
327
+
295
328
  end
296
329
 
297
330
  # Instance Methods
@@ -330,10 +363,6 @@ module EffectiveMembershipsApplicant
330
363
  approved? || declined?
331
364
  end
332
365
 
333
- def can_visit_step?(step)
334
- can_revisit_completed_steps(step)
335
- end
336
-
337
366
  def summary
338
367
  case status_was
339
368
  when 'draft'
@@ -435,101 +464,9 @@ module EffectiveMembershipsApplicant
435
464
  category&.min_applicant_files.to_i
436
465
  end
437
466
 
438
- # All Fees and Orders
439
- def submit_fees
440
- fees.select { |fee| fee.applicant_submit_fee? }
441
- end
442
-
443
- def submit_order
444
- orders.find { |order| order.purchasables.any?(&:applicant_submit_fee?) }
445
- end
446
-
447
- def submit_fee_qb_item_name
448
- 'Applicant'
449
- end
450
-
451
- def find_or_build_submit_fees
452
- return submit_fees if submit_fees.present?
453
-
454
- fees.build(
455
- owner: owner,
456
- fee_type: 'Applicant',
457
- category: category,
458
- price: category.applicant_fee,
459
- qb_item_name: submit_fee_qb_item_name()
460
- )
461
-
462
- submit_fees
463
- end
464
-
465
- def find_or_build_submit_order
466
- order = submit_order || orders.build(user: owner)
467
- fees = submit_fees()
468
-
469
- # Adds fees, but does not overwrite any existing price.
470
- fees.each do |fee|
471
- order.add(fee) unless order.purchasables.include?(fee)
472
- end
473
-
474
- order.purchasables.each do |purchasable|
475
- order.remove(purchasable) unless fees.include?(purchasable)
476
- end
477
-
478
- # From Billing Step
479
- order.billing_address = owner.billing_address if owner.billing_address.present?
480
-
481
- order.save
482
-
483
- order
484
- end
485
-
486
- # Should be indempotent.
487
- def build_submit_fees_and_order
488
- return false if was_submitted?
489
-
490
- fees = find_or_build_submit_fees()
491
- raise('already has purchased submit fees') if fees.any? { |fee| fee.purchased? }
492
-
493
- order = find_or_build_submit_order()
494
- raise('already has purchased submit order') if order.purchased?
495
-
496
- true
497
- end
498
-
499
- # Owner clicks on the Billing step. Next step is Checkout
500
- def billing!
501
- ready!
502
- end
503
-
504
- # Ready to check out
505
- def ready!
506
- build_submit_fees_and_order
507
- save!
508
- end
509
-
510
- # Called automatically via after_purchase hook above
511
- def submit_purchased!
512
- return false if was_submitted?
513
-
514
- wizard_steps[:checkout] = Time.zone.now
515
- submit!
516
- end
517
-
518
- # Draft -> Submitted requirements
519
- def submit!
520
- raise('already submitted') if was_submitted?
521
- raise('expected a purchased order') unless submit_order&.purchased?
522
-
523
- after_commit do
524
- applicant_references.each { |reference| reference.notify! if reference.submitted? }
525
- end
526
-
527
- wizard_steps[:checkout] ||= Time.zone.now
528
- wizard_steps[:submitted] = Time.zone.now
529
- submitted!
530
- end
531
-
532
- # Submitted -> Completed requirements
467
+ # The submit! method used to be here
468
+ # But it needs to be inside the included do block
469
+ # So see above. Sorry.
533
470
 
534
471
  def applicant_references_required?
535
472
  min_applicant_references > 0
@@ -44,6 +44,8 @@ module EffectiveMembershipsFeePayment
44
44
  submitted: 'Submitted'
45
45
  )
46
46
 
47
+ acts_as_purchasable_wizard
48
+
47
49
  log_changes(except: :wizard_steps) if respond_to?(:log_changes)
48
50
 
49
51
  # Declarations Step
@@ -110,12 +112,6 @@ module EffectiveMembershipsFeePayment
110
112
  validates :declare_truth, acceptance: true
111
113
  end
112
114
 
113
- # Billing Step
114
- validate(if: -> { current_step == :billing && owner.present? }) do
115
- self.errors.add(:base, "must have a billing address") unless owner.billing_address.present?
116
- self.errors.add(:base, "must have an email") unless owner.email.present?
117
- end
118
-
119
115
  # Clear required steps memoization
120
116
  after_save { @_required_steps = nil }
121
117
 
@@ -135,13 +131,30 @@ module EffectiveMembershipsFeePayment
135
131
  end
136
132
  end
137
133
 
138
- after_purchase do |_order|
139
- raise('expected submit_order to be purchased') unless submit_order&.purchased?
134
+ # All Fees and Orders
135
+ # Overriding acts_as_purchasable_wizard
136
+ def outstanding_fees
137
+ owner&.outstanding_fee_payment_fees
138
+ end
139
+
140
+ def submit_fees
141
+ fees
142
+ end
143
+
144
+ def submit_order
145
+ orders.first
146
+ end
147
+
148
+ # We take over the owner's outstanding fees.
149
+ def find_or_build_submit_fees
150
+ Array(outstanding_fees).each { |fee| fees << fee unless fees.include?(fee) }
151
+ submit_fees
152
+ end
140
153
 
141
- submit_purchased!
142
- after_submit_purchased!
154
+ def after_submit_purchased!
143
155
  EffectiveMemberships.Registrar.fee_payment_purchased!(owner)
144
156
  end
157
+
145
158
  end
146
159
 
147
160
  def to_s
@@ -157,14 +170,6 @@ module EffectiveMembershipsFeePayment
157
170
  submitted?
158
171
  end
159
172
 
160
- def can_visit_step?(step)
161
- can_revisit_completed_steps(step)
162
- end
163
-
164
- def outstanding_fees
165
- owner&.outstanding_fee_payment_fees
166
- end
167
-
168
173
  def select!
169
174
  reset!
170
175
  end
@@ -200,83 +205,4 @@ module EffectiveMembershipsFeePayment
200
205
  owner.representatives.any?(&:marked_for_destruction?)
201
206
  end
202
207
 
203
- # All Fees and Orders
204
- def submit_fees
205
- fees
206
- end
207
-
208
- def submit_order
209
- orders.first
210
- end
211
-
212
- # We take over the owner's outstanding fees.
213
- def find_or_build_submit_fees
214
- Array(outstanding_fees).each { |fee| fees << fee unless fees.include?(fee) }
215
- submit_fees
216
- end
217
-
218
- def find_or_build_submit_order
219
- order = submit_order || orders.build(user: owner)
220
- fees = submit_fees()
221
-
222
- fees.each do |fee|
223
- order.add(fee) unless order.purchasables.include?(fee)
224
- end
225
-
226
- order.purchasables.each do |purchasable|
227
- order.remove(purchasable) unless fees.include?(purchasable)
228
- end
229
-
230
- order.billing_address = owner.billing_address if owner.billing_address.present?
231
-
232
- order.save
233
-
234
- order
235
- end
236
-
237
- # Should be indempotent.
238
- def build_submit_fees_and_order
239
- return false if was_submitted?
240
-
241
- fees = find_or_build_submit_fees()
242
- raise('already has purchased submit fees') if fees.any? { |fee| fee.purchased? }
243
-
244
- order = find_or_build_submit_order()
245
- raise('already has purchased submit order') if order.purchased?
246
-
247
- true
248
- end
249
-
250
- # Owner clicks on the Billing Submit. Next step is Checkout
251
- def billing!
252
- ready!
253
- end
254
-
255
- def ready!
256
- build_submit_fees_and_order
257
- save!
258
- end
259
-
260
- # Called automatically via after_purchase hook above
261
- def submit_purchased!
262
- return false if was_submitted?
263
-
264
- wizard_steps[:checkout] = Time.zone.now
265
- submit!
266
- end
267
-
268
- # A hook to extend
269
- def after_submit_purchased!
270
- end
271
-
272
- # Draft -> Submitted
273
- def submit!
274
- raise('already submitted') if was_submitted?
275
- raise('expected a purchased order') unless submit_order&.purchased?
276
-
277
- wizard_steps[:checkout] ||= Time.zone.now
278
- wizard_steps[:submitted] = Time.zone.now
279
- submitted!
280
- end
281
-
282
208
  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_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,6 +16,8 @@ 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
@@ -1,3 +1,3 @@
1
1
  module EffectiveMemberships
2
- VERSION = '0.1.22'
2
+ VERSION = '0.2.2'
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.22
4
+ version: 0.2.2
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-11 00:00:00.000000000 Z
11
+ date: 2022-01-21 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
@@ -221,6 +249,7 @@ files:
221
249
  - app/controllers/effective/applicant_references_controller.rb
222
250
  - app/controllers/effective/applicants_controller.rb
223
251
  - app/controllers/effective/fee_payments_controller.rb
252
+ - app/controllers/effective/memberships_directory_controller.rb
224
253
  - app/datatables/admin/effective_applicant_course_areas_datatable.rb
225
254
  - app/datatables/admin/effective_applicant_course_names_datatable.rb
226
255
  - app/datatables/admin/effective_applicants_datatable.rb
@@ -235,6 +264,7 @@ files:
235
264
  - app/datatables/effective_applicant_references_datatable.rb
236
265
  - app/datatables/effective_applicants_datatable.rb
237
266
  - app/datatables/effective_fee_payments_datatable.rb
267
+ - app/datatables/effective_memberships_directory_datatable.rb
238
268
  - app/helpers/effective_memberships_helper.rb
239
269
  - app/mailers/effective/memberships_mailer.rb
240
270
  - app/models/concerns/effective_memberships_applicant.rb
@@ -344,6 +374,7 @@ files:
344
374
  - app/views/effective/fees/_fee.html.haml
345
375
  - app/views/effective/memberships/_dashboard.html.haml
346
376
  - app/views/effective/memberships/_membership.html.haml
377
+ - app/views/effective/memberships_directory/index.html.haml
347
378
  - app/views/effective/memberships_mailer/applicant_approved.liquid
348
379
  - app/views/effective/memberships_mailer/applicant_declined.liquid
349
380
  - app/views/effective/memberships_mailer/applicant_reference_notification.liquid