effective_memberships 0.4.6 → 0.4.9

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: 20a57ae6829f25668b31b12a6a67ca6b0fb648810a6efba12c516a30a969144f
4
- data.tar.gz: 7b67ecef9d09b021e924b8f8e1a0eb33a741a8a10c8a8912c6aae5aff7fd8545
3
+ metadata.gz: 60e4351c09c9d070ea622ed6e7770df2f14d53e177a4ea74e04294d00b91af6f
4
+ data.tar.gz: 65436fdfda6a93aa08e1846d44b13131eedcc9d92e5831742dd6892d5ed87a32
5
5
  SHA512:
6
- metadata.gz: 14d942c1d353f5b439392fe6a5646efd1f5dbd2d74959c65a776394c339e3bbc6aaf794bbd7d352cb192416bd04ea7f97db21931ab88ff48c3f773f4c707322c
7
- data.tar.gz: 5ac8508dd130358939656a248d568b8257c3f751dafb2a5d9b49e5cc4d036982750e8f33bcae7a9b5be9957eb0b9a9f3e28f942ece9dfb26b7ac83684d36b4f4
6
+ metadata.gz: bffdf6c0614f8f36ee84b38426b1a8ea9aae37a7b1385fe9ce746584196bb043d2c835f1414942f8dc504b53090e6725649657fe348feab736a9b00453aa13c7
7
+ data.tar.gz: 845130d67ea3500c634f2f9c96684af9ca1785dc50133ac94efda8087cb80e2e50bf05ea071540106d7d0250c557a0267ead9ed5b3ea2f98ca59cb99858b197a
@@ -5,7 +5,7 @@ module Admin
5
5
 
6
6
  include Effective::CrudController
7
7
 
8
- submit :save, 'Update Membership',
8
+ submit :revise, 'Update Membership',
9
9
  success: -> { "#{resource.owner} has been successfully updated. Please double check the membership history is correct" },
10
10
  redirect: -> { admin_owners_path(resource) }
11
11
 
@@ -63,7 +63,7 @@ module Admin
63
63
  end
64
64
 
65
65
  collection do
66
- EffectiveMemberships.Organization.deep.left_joins(:membership).includes(membership: :membership_categories)
66
+ EffectiveMemberships.Organization.deep.left_joins(:membership).includes(:addresses, membership: :membership_categories)
67
67
  end
68
68
 
69
69
  def categories
@@ -62,6 +62,11 @@ module EffectiveMembershipsOrganization
62
62
  scope :deep, -> { includes(:representatives) }
63
63
  scope :sorted, -> { order(:title) }
64
64
 
65
+ scope :membership_applying, -> {
66
+ applicants = EffectiveMemberships.Applicant.all
67
+ without_role(:member).where(id: applicants.select(:organization_id))
68
+ }
69
+
65
70
  validates :title, presence: true, uniqueness: true
66
71
  validates :email, presence: true
67
72
  end
@@ -37,6 +37,22 @@ module EffectiveMembershipsOwner
37
37
  accepts_nested_attributes_for :membership_histories
38
38
 
39
39
  scope :members, -> { joins(:membership) }
40
+
41
+ scope :membership_removed, -> {
42
+ removed = Effective::MembershipHistory.removed.where(owner_type: name)
43
+ without_role(:member).where(id: removed.select(:owner_id))
44
+ }
45
+
46
+ scope :membership_bad_standing, -> {
47
+ bad_standing = Effective::Membership.where(bad_standing: true).where(owner_type: name)
48
+ where(id: bad_standing.select(:owner_id))
49
+ }
50
+
51
+ scope :membership_renewed_this_period, -> {
52
+ with_paid_fees_through = Effective::Membership.with_paid_fees_through.where(owner_type: name)
53
+ where(id: with_paid_fees_through.select(:owner_id))
54
+ }
55
+
40
56
  end
41
57
 
42
58
  def assign_member_role
@@ -181,8 +197,8 @@ module EffectiveMembershipsOwner
181
197
  # Build the renewal fee
182
198
  fee ||= fees.build()
183
199
 
184
- late_on ||= EffectiveMemberships.Registrar.late_fee_date(period: period)
185
- bad_standing_on ||= EffectiveMemberships.Registrar.bad_standing_date(period: period)
200
+ late_on ||= EffectiveMemberships.Registrar.late_fee_date(period: period) if category.create_late_fees?
201
+ bad_standing_on ||= EffectiveMemberships.Registrar.bad_standing_date(period: period) if category.create_bad_standing?
186
202
 
187
203
  fee.assign_attributes(
188
204
  fee_type: 'Renewal',
@@ -284,52 +284,53 @@ module EffectiveMembershipsRegistrar
284
284
  retval
285
285
  end
286
286
 
287
-
288
287
  # This is intended to be run once per day in a rake task
289
288
  # rake effective_memberships:create_fees
290
289
  # Create Renewal and Late fees
291
- def create_fees!(period: nil, late_on: nil, bad_standing_on: nil)
292
- # The current period, based on Time.zone.now
290
+ def create_fees!(period: nil)
293
291
  period ||= current_period
294
- late_on ||= late_fee_date(period: period)
295
- bad_standing_on ||= bad_standing_date(period: period)
292
+ memberships = Effective::Membership.deep.with_unpaid_fees_through(period)
296
293
 
297
294
  # Create Renewal Fees
298
- Effective::Membership.deep.with_unpaid_fees_through(period).find_each do |membership|
299
- membership.categories.select(&:create_renewal_fees?).map do |category|
300
- existing = membership.owner.membership_period_fee(category: category, period: period, except: 'Renewal')
301
- next if existing.present? # This might be an existing Prorated fee
295
+ memberships.find_each { |membership| create_renewal_fees!(membership, period: period) }
296
+ GC.start
302
297
 
303
- fee = membership.owner.build_renewal_fee(category: category, period: period, late_on: late_on, bad_standing_on: bad_standing_on)
304
- raise("expected build_renewal_fee to return a fee for period #{period}") unless fee.kind_of?(Effective::Fee)
305
- next if fee.purchased?
298
+ # Create Late Fees
299
+ memberships.find_each { |membership| create_late_fees!(membership, period: period) }
300
+ GC.start
306
301
 
307
- puts("Created renewal fee for #{membership.owner}") if fee.new_record? && !Rails.env.test?
302
+ # Update Membership Status - Assign In Bad Standing
303
+ memberships.find_each { |membership| update_membership_status!(membership, period: period) }
304
+ GC.start
308
305
 
309
- fee.save!
310
- end
311
- end
306
+ true
307
+ end
312
308
 
313
- GC.start
309
+ def create_renewal_fees!(membership, period:)
310
+ membership.categories.select(&:create_renewal_fees?).map do |category|
311
+ existing = membership.owner.membership_period_fee(category: category, period: period, except: 'Renewal')
312
+ next if existing.present? # This might be an existing Prorated fee
314
313
 
315
- # Create Late Fees
316
- Effective::Membership.deep.with_unpaid_fees_through(period).find_each do |membership|
317
- membership.categories.select(&:create_late_fees?).map do |category|
318
- fee = membership.owner.build_late_fee(category: category, period: period)
319
- next if fee.blank? || fee.purchased?
314
+ fee = membership.owner.build_renewal_fee(category: category, period: period)
315
+ raise("expected build_renewal_fee to return a fee for period #{period}") unless fee.kind_of?(Effective::Fee)
316
+ next if fee.purchased?
320
317
 
321
- fee.save!
322
- end
323
- end
318
+ puts("Created renewal fee for #{membership.owner}") if fee.new_record? && !Rails.env.test?
324
319
 
325
- GC.start
320
+ fee.save!
321
+ end
322
+ end
326
323
 
327
- # Update Membership Status - Assign In Bad Standing
328
- Effective::Membership.deep.with_unpaid_fees_through(period).find_each do |membership|
329
- membership.owner.update_membership_status!
324
+ def create_late_fees!(membership, period:)
325
+ membership.categories.select(&:create_late_fees?).map do |category|
326
+ fee = membership.owner.build_late_fee(category: category, period: period)
327
+ next if fee.blank? || fee.purchased?
328
+ fee.save!
330
329
  end
330
+ end
331
331
 
332
- true
332
+ def update_membership_status!(membership, period: nil)
333
+ membership.owner.update_membership_status!
333
334
  end
334
335
 
335
336
  # Called in the after_purchase of fee payment
@@ -27,6 +27,11 @@ module EffectiveMembershipsUser
27
27
  class_name: 'Effective::Representative', inverse_of: :user, dependent: :delete_all
28
28
 
29
29
  accepts_nested_attributes_for :representatives, allow_destroy: true
30
+
31
+ scope :membership_applying, -> {
32
+ applicants = EffectiveMemberships.Applicant.all
33
+ without_role(:member).where(id: applicants.select(:user_id))
34
+ }
30
35
  end
31
36
 
32
37
  # Instance Methods
@@ -38,8 +38,9 @@ module Effective
38
38
  }
39
39
 
40
40
  scope :with_unpaid_fees_through, -> (period = nil) {
41
- where(arel_table[:fees_paid_period].lt(period || EffectiveMemberships.Registrar.current_period))
42
- .or(where(fees_paid_period: nil))
41
+ joined = where(arel_table[:joined_on].lt(period || EffectiveMemberships.Registrar.current_period))
42
+ unpaid = where(arel_table[:fees_paid_period].lt(period || EffectiveMemberships.Registrar.current_period)).or(where(fees_paid_period: nil))
43
+ joined.merge(unpaid)
43
44
  }
44
45
 
45
46
  before_validation do
@@ -119,7 +120,24 @@ module Effective
119
120
  end
120
121
 
121
122
  def fees_paid?
122
- fees_paid_period == EffectiveMemberships.Registrar.current_period
123
+ paid_fees_through?(EffectiveMemberships.Registrar.current_period)
124
+ end
125
+
126
+ def paid_fees_through?(period = nil)
127
+ period ||= EffectiveMemberships.Registrar.current_period
128
+
129
+ return false if fees_paid_period.blank?
130
+ fees_paid_period >= period
131
+ end
132
+
133
+ def unpaid_fees_through?(period = nil)
134
+ period ||= EffectiveMemberships.Registrar.current_period
135
+
136
+ return false if joined_on.blank?
137
+ return false unless joined_on < period
138
+
139
+ return true if fees_paid_period.blank?
140
+ fees_paid_period < period
123
141
  end
124
142
 
125
143
  def change_fees_paid_period
@@ -127,6 +145,10 @@ module Effective
127
145
  end
128
146
 
129
147
  def change_fees_paid_period=(date)
148
+ if date.blank?
149
+ return assign_attributes(fees_paid_period: nil, fees_paid_through_period: nil)
150
+ end
151
+
130
152
  date = (date.respond_to?(:strftime) ? date : Date.parse(date))
131
153
 
132
154
  period = EffectiveMemberships.Registrar.period(date: date)
@@ -135,5 +157,20 @@ module Effective
135
157
  assign_attributes(fees_paid_period: period, fees_paid_through_period: period_end_on)
136
158
  end
137
159
 
160
+ # Admin updating membership info
161
+ def revise!
162
+ save!
163
+
164
+ period = EffectiveMemberships.Registrar.current_period
165
+ return true if paid_fees_through?(period)
166
+
167
+ # Otherwise build fees right now
168
+ EffectiveMemberships.Registrar.create_renewal_fees!(self, period: period)
169
+ EffectiveMemberships.Registrar.create_late_fees!(self, period: period)
170
+ EffectiveMemberships.Registrar.update_membership_status!(self, period: period)
171
+
172
+ true
173
+ end
174
+
138
175
  end
139
176
  end
@@ -25,6 +25,8 @@ module Effective
25
25
  scope :deep, -> { includes(:owner) }
26
26
  scope :sorted, -> { order(:start_on) }
27
27
 
28
+ scope :removed, -> { where(removed: true) }
29
+
28
30
  validates :owner, presence: true
29
31
 
30
32
  # validates :categories, presence: true, unless: -> { removed? }
@@ -1 +1,5 @@
1
+ .card
2
+ .card-body= render 'effective/fee_payments/summary', fee_payment: fee_payment
3
+
1
4
  = render 'effective/fee_payments/fee_payment', fee_payment: fee_payment
5
+ = render 'effective/fee_payments/orders', fee_payment: fee_payment
@@ -3,9 +3,8 @@
3
3
  = f.hidden_field :owner_id
4
4
  = f.hidden_field :owner_type
5
5
  - else
6
- - raise('todo')
7
- - collection = EffectiveMembershipsOwner.descendants.map { |d| [d.name.to_s, d.members.sorted] }.to_h
8
- = f.select :owner_id, collection, polymorphic: true
6
+ - collection = { 'Users' => current_user.class.sorted, 'Organizations' => EffectiveMemberships.Organization.sorted }
7
+ = f.select :owner, collection, polymorphic: true
9
8
 
10
9
  - if f.object.new_record?
11
10
  = f.select :fee_type, EffectiveMemberships.custom_fee_types
@@ -21,7 +21,7 @@
21
21
  - periods = registrar.periods(from: f.object.joined_on)
22
22
  - collection = periods.reverse.map { |period| [registrar.period_end_on(date: period), period] }
23
23
 
24
- = f.select :change_fees_paid_period, collection, label: 'Fees Paid Through', hint: 'Which period this user has fees paid through. Can change how renewal fees are created.'
24
+ = f.select :change_fees_paid_period, collection, label: 'Fees Paid Through', hint: 'Which period this user has fees paid through. Determines which renewal fees should be created. Setting this to a past or blank period may create a renewal fee in the current period.'
25
25
 
26
26
  %p.text-muted To update the current membership categories, use the 'Assign' or 'Reclassify' actions below
27
27
 
@@ -0,0 +1,12 @@
1
+ - user = (resource.respond_to?(:email) ? resource : resource.user)
2
+
3
+ = user.to_s
4
+
5
+ - if user.email.present?
6
+ %br
7
+ = mail_to user.email
8
+
9
+ - if user.membership.present?
10
+ %br
11
+ = '#' + user.membership.number
12
+ #{user.membership.categories.to_sentence}
@@ -1,4 +1,4 @@
1
1
  - if fee_payment.submit_order&.purchased?
2
2
  .card.mb-4
3
3
  .card-body
4
- = render(fee_payment.submit_order)
4
+ = render('effective/orders/order', order: fee_payment.submit_order)
@@ -1,3 +1,3 @@
1
1
  module EffectiveMemberships
2
- VERSION = '0.4.6'
2
+ VERSION = '0.4.9'
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.4.6
4
+ version: 0.4.9
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-04-12 00:00:00.000000000 Z
11
+ date: 2022-04-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -178,6 +178,20 @@ dependencies:
178
178
  - - ">="
179
179
  - !ruby/object:Gem::Version
180
180
  version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: timecop
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'
181
195
  - !ruby/object:Gem::Dependency
182
196
  name: effective_test_bot
183
197
  requirement: !ruby/object:Gem::Requirement
@@ -352,6 +366,7 @@ files:
352
366
  - app/views/admin/registrar_actions/_form_remove.html.haml
353
367
  - app/views/admin/representatives/_form.html.haml
354
368
  - app/views/admin/representatives/_user_fields.html.haml
369
+ - app/views/admin/users/_col.html.haml
355
370
  - app/views/effective/applicant_references/_applicant_reference.html.haml
356
371
  - app/views/effective/applicant_references/_datatable_actions.html.haml
357
372
  - app/views/effective/applicant_references/_form.html.haml