effective_memberships 0.4.6 → 0.4.9

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: 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