effective_memberships 0.9.4 → 0.9.6

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: 611d01eb6651211b44bbc681c6060aa4a74541a08ec9ac59d3b0d1972ceacbfc
4
- data.tar.gz: 78796ebd87001ae6e9448f48892d61b034077637ceea0437084a259746824e57
3
+ metadata.gz: f42637485b8a72cd2cf2a7f4845e75dbca8d3c379270d4dfe0a607e70610117d
4
+ data.tar.gz: 9d41bd14aad6e7e54c76568bd58147d43965fd30060c07525941294b7504d28e
5
5
  SHA512:
6
- metadata.gz: 60bd9e7864f520588a47b4ef69a9460c5cbadbc7fbd0718086566787a16e785348666e87c16c41a6e95826c6b4cd5b93a5c9c67a239b14a5ed82699681e6c279
7
- data.tar.gz: 5032cf5a31bda06e919a7abc9009c00ae2d3fcaf25c2889453184839b625cdaa8987c88c95ae7c462c0fb501d6303126b1f2a0b8f14778bbb7d945d49574c9ff
6
+ metadata.gz: d456e9bcd40ce78fc83689c5352a85bc156ec50f7149bd169f7af1521d3ec1c58f6ed67b06922b28b36fec1cbb7c880a58e4e6c7ddcf197f3872e37fb5ac247b
7
+ data.tar.gz: 2f27824362cf294f83d4f953bb8c283045ef70a03910b17eeff1591f90df0a508bcf7dff1bbca53b49d6663f60d50376e9a8d4fb50da9cc47e6889724d34ef4d
@@ -21,6 +21,13 @@ module Admin
21
21
 
22
22
  col :fee_type, search: EffectiveMemberships.fee_types
23
23
 
24
+ col :period, search: { collection: EffectiveMemberships.Registrar.periods_collection } do |fee|
25
+ EffectiveMemberships.Registrar.period_end_on(date: fee.period)
26
+ end
27
+
28
+ col :category, search: { collection: EffectiveMemberships.Category.all, polymorphic: false }
29
+ col :title
30
+
24
31
  col :price, as: :price
25
32
  col :qb_item_name, label: 'Quickbooks Item Name'
26
33
  col :tax_exempt, visible: false
@@ -31,9 +38,8 @@ module Admin
31
38
  col :parent, search: :string, visible: false
32
39
  end
33
40
 
34
- col :purchased_order, visible: false
41
+ col :purchased_order
35
42
 
36
- col :category, search: { collection: EffectiveMemberships.Category.all, polymorphic: false }
37
43
  col :checkout_type, search: Effective::Fee::CHECKOUT_TYPES, visible: false
38
44
 
39
45
  unless attributes[:total] == false
@@ -623,6 +623,7 @@ module EffectiveMembershipsApplicant
623
623
  category_ids = user.membership.category_ids
624
624
 
625
625
  categories.select do |cat|
626
+ cat.can_apply_new? ||
626
627
  cat.can_apply_existing? ||
627
628
  (cat.can_apply_restricted? && (category_ids & cat.can_apply_restricted_ids).present?)
628
629
  end
@@ -847,6 +848,8 @@ module EffectiveMembershipsApplicant
847
848
 
848
849
  approved!
849
850
 
851
+ EffectiveMemberships.Registrar.delete_fees!(owner)
852
+
850
853
  if apply_to_join?
851
854
  EffectiveMemberships.Registrar.register!(
852
855
  owner,
@@ -99,6 +99,15 @@ module EffectiveMembershipsOwner
99
99
  fees.select { |fee| fee.fee_payment_fee? && !fee.purchased? }
100
100
  end
101
101
 
102
+ def outstanding_fee_payments
103
+ fee_payments = EffectiveMemberships.FeePayment.all
104
+
105
+ fee_payments = fee_payments.where(user: self) if self.class.respond_to?(:effective_memberships_user?)
106
+ fee_payments = fee_payments.where(organization: self) if self.class.respond_to?(:effective_memberships_organization?)
107
+
108
+ fee_payments.select { |fee_payment| fee_payment.in_progress? && fee_payment.orders.none?(&:purchased?) }
109
+ end
110
+
102
111
  def outstanding_fee_payment_orders
103
112
  orders.select { |order| order.parent_type.to_s.include?('FeePayment') && !order.purchased? }
104
113
  end
@@ -375,24 +375,56 @@ module EffectiveMembershipsRegistrar
375
375
  retval
376
376
  end
377
377
 
378
+ def periods_collection(from: nil, to: nil)
379
+ from ||= Time.zone.now - 10.years
380
+ periods(from: from, to: to).reverse.map { |period| [period_end_on(date: period), period] }
381
+ end
382
+
383
+ # Called by applicant.approve!
384
+ def delete_fees!(resource)
385
+ owner = (resource.class.respond_to?(:effective_memberships_owner?) ? resource : resource.try(:owner))
386
+ raise('expecting a memberships owner') unless owner.class.respond_to?(:effective_memberships_owner?)
387
+
388
+ # Delete unpurchased fees and orders
389
+ owner.outstanding_fee_payment_fees.each { |fee| fee.mark_for_destruction }
390
+ owner.outstanding_fee_payment_orders.each { |order| order.mark_for_destruction }
391
+ owner.save!
392
+
393
+ owner.outstanding_fee_payments.each { |fee_payment| fee_payment.destroy! }
394
+
395
+ true
396
+ end
397
+
378
398
  # This is intended to be run once per day in a rake task
379
399
  # rake effective_memberships:create_fees
380
400
  # Create Renewal and Late fees
381
- def create_fees!(period: nil)
401
+ # Assigns NIGS
402
+ def create_all_fees!(period: nil)
382
403
  period ||= current_period
383
404
  memberships = Effective::Membership.deep.with_unpaid_fees_through(period)
384
405
 
406
+ memberships.find_each do |membership|
407
+ create_fees!(membership, period: period)
408
+ GC.start
409
+ end
410
+
411
+ true
412
+ end
413
+
414
+ def create_fees!(resource, period: nil)
415
+ period ||= current_period
416
+
417
+ membership = (resource.class.respond_to?(:effective_memberships_owner?) ? resource.membership : resource)
418
+ raise('expected a membership') unless membership.present? && membership.kind_of?(Effective::Membership)
419
+
385
420
  # Create Renewal Fees
386
- memberships.find_each { |membership| create_renewal_fees!(membership, period: period) }
387
- GC.start
421
+ create_renewal_fees!(membership, period: period)
388
422
 
389
423
  # Create Late Fees
390
- memberships.find_each { |membership| create_late_fees!(membership, period: period) }
391
- GC.start
424
+ create_late_fees!(membership, period: period)
392
425
 
393
426
  # Update Membership Status - Assign Not In Good Standing
394
- memberships.find_each { |membership| create_not_in_good_standing!(membership, period: period) }
395
- GC.start
427
+ create_not_in_good_standing!(membership, period: period)
396
428
 
397
429
  true
398
430
  end
@@ -44,9 +44,13 @@ module Effective
44
44
  self.with_status ||= owner.membership.statuses.first if owner.membership.statuses.length == 1
45
45
  end
46
46
 
47
+ before_validation(if: -> { changes['title'].blank? && (changes.keys & ['period', 'category_id', 'fee_type']).present? }) do
48
+ self.title = default_title()
49
+ end
50
+
47
51
  before_validation do
48
52
  self.period ||= EffectiveMemberships.Registrar.current_period
49
- self.title ||= default_title()
53
+ self.title = default_title() if self.title.blank?
50
54
  end
51
55
 
52
56
  before_validation(if: -> { fee_type == 'Renewal' && category.present? && period.present? }) do
@@ -252,9 +252,8 @@ module Effective
252
252
  return true if paid_fees_through?(period)
253
253
 
254
254
  # Otherwise build fees right now
255
- EffectiveMemberships.Registrar.create_renewal_fees!(self, period: period)
256
- EffectiveMemberships.Registrar.create_late_fees!(self, period: period)
257
- EffectiveMemberships.Registrar.create_not_in_good_standing!(self, period: period)
255
+ EffectiveMemberships.Registrar.delete_fees!(self)
256
+ EffectiveMemberships.Registrar.create_fees!(self, period: period)
258
257
 
259
258
  true
260
259
  end
@@ -28,6 +28,7 @@ module Effective
28
28
  # Mark Fees Paid - Order Attributes
29
29
  attr_accessor :payment_provider
30
30
  attr_accessor :payment_card
31
+ attr_accessor :purchased_at
31
32
  attr_accessor :note_to_buyer
32
33
  attr_accessor :note_internal
33
34
 
@@ -136,6 +137,7 @@ module Effective
136
137
  {
137
138
  payment_provider: @payment_provider.presence,
138
139
  payment_card: @payment_card.presence,
140
+ purchased_at: @purchased_at.presence,
139
141
  note_to_buyer: @note_to_buyer.presence,
140
142
  note_internal: @note_internal.presence
141
143
  }.compact
@@ -16,7 +16,7 @@
16
16
  No membership number will be assigned.
17
17
 
18
18
  %h3 Fees
19
- %p The following fee(s) will be created:
19
+ %p The following fees will be created:
20
20
  - month = Time.zone.now.strftime('%B')
21
21
 
22
22
  %ul
@@ -27,6 +27,16 @@
27
27
  %li A #{month} prorated fee to the new category
28
28
  %li A #{month} discount fee from their old category
29
29
 
30
+ %p The following unpurchased fees will be deleted:
31
+ - outstanding_fee_payment_fees = applicant.owner.outstanding_fee_payment_fees
32
+
33
+ %ul
34
+ - outstanding_fee_payment_fees.each do |fee|
35
+ %li= fee
36
+
37
+ - if outstanding_fee_payment_fees.blank?
38
+ %li None
39
+
30
40
  %h3 Email to send
31
41
  - email_templates = applicant.approve_email_templates
32
42
 
@@ -6,45 +6,38 @@
6
6
  - collection = { 'Users' => current_user.class.sorted, 'Organizations' => EffectiveMemberships.Organization.sorted }
7
7
  = f.select :owner, collection, polymorphic: true
8
8
 
9
+ - registrar = EffectiveMemberships.Registrar
9
10
  - fee_types = EffectiveMemberships.fee_types
10
11
  - membership_period_fee_types = fee_types.select { |fee_type| Effective::Fee.new(fee_type: fee_type).membership_period_fee? }
11
12
 
12
- - if f.object.new_record?
13
- = f.select :fee_type, fee_types
14
- - else
15
- = f.static_field :fee_type
16
-
17
- = f.show_if_any(:fee_type, membership_period_fee_types) do
18
- = card do
19
- %p This is a membership period fee. It will advance the membership fees paid through period when purchased.
20
- %p Only one membership period fee -- Prorated or Renewal -- is expected to exist per membership period.
21
-
22
- - registrar = EffectiveMemberships.Registrar
23
- - periods = registrar.periods(from: Time.zone.now - 10.years)
24
- - collection = periods.reverse.map { |period| [registrar.period_end_on(date: period), period] }
13
+ - f.object.period ||= registrar.current_period
14
+ - f.object.checkout_type ||= 'Default'
25
15
 
26
- - f.object.period ||= registrar.current_period
27
- = f.select :period, collection, label: 'Membership period', hint: 'When purchased, set the membership fees paid through period to this period'
16
+ - f.object.category_id ||= f.object.owner&.membership&.categories&.first&.id
17
+ - f.object.category ||= f.object.owner&.membership&.categories&.first
28
18
 
29
- - # Renewal Fees Only
30
- - if f.object.persisted? && f.object.renewal_fee?
31
- - if f.object.category.create_late_fees?
32
- = f.date_field :late_on, hint: 'A late fee will be applied on this date unless purchased'
19
+ = f.select :period, registrar.periods_collection, label: 'Membership period'
20
+ = f.select :fee_type, fee_types
21
+ = f.select :category_id, EffectiveMemberships.Category.all
33
22
 
34
- - if f.object.category.create_not_in_good_standing?
35
- = f.date_field :not_in_good_standing_on, hint: 'The membership will be marked NIGS on this date unless purchased'
23
+ = f.show_if_any(:fee_type, membership_period_fee_types) do
24
+ %p.text-muted
25
+ This is a membership period fee. It will advance the membership fees paid through period when purchased.
26
+ %br
27
+ Only one membership period fee -- Prorated or Renewal -- is expected to exist per membership period.
36
28
 
37
- - f.object.category_id = f.object.owner&.membership&.categories&.first&.id
38
- = f.select :category_id, EffectiveMemberships.Category.all
29
+ - if f.object.category.present?
30
+ = f.show_if(:fee_type, 'Renewal') do
31
+ - if f.object.category.create_late_fees?
32
+ = f.date_field :late_on, hint: 'A late fee will be applied on this date unless purchased. Leave blank to assign the default.'
39
33
 
40
- - if f.object.parent.blank?
41
- - f.object.checkout_type ||= 'Default'
34
+ - if f.object.category.create_not_in_good_standing?
35
+ = f.date_field :not_in_good_standing_on, hint: 'The membership will be marked NIGS on this date unless purchased. Leave blank to assign the default.'
42
36
 
43
- = f.radios :checkout_type, Effective::Fee::CHECKOUT_TYPES, inline: true, label: 'Checkout wizard',
44
- hint: 'When default, Applicant and Reinstatement fees will be charged from the applicant wizard, and all other fee types from the fee payment wizard'
45
- - else
46
- = f.static_field :parent
37
+ = f.radios :checkout_type, Effective::Fee::CHECKOUT_TYPES, inline: true, label: 'Checkout wizard',
38
+ hint: 'When default, Applicant and Reinstatement fees will be charged from the applicant wizard, and all other fee types from the fee payment wizard'
47
39
 
40
+ = f.text_field :title, hint: 'Leave blank to assign the default', required: false
48
41
  = f.price_field :price
49
42
  = f.text_field :qb_item_name, label: 'Quickbooks Item Name'
50
43
  = f.check_box :tax_exempt, label: 'Yes, this fee is tax exempt'
@@ -23,6 +23,6 @@
23
23
 
24
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
- %p.text-muted To update the current membership categories, use the 'Assign' or 'Reclassify' actions below
26
+ %p.text-muted To update the current membership categories or statuses, use the 'Reclassify' or 'Status Change' actions below
27
27
 
28
28
  = f.submit 'Update Membership', border: false, center: true, 'data-confirm': "Really update #{f.object.owner}?"
@@ -31,6 +31,7 @@
31
31
  %p An order will be created and marked as paid with the following information:
32
32
 
33
33
  = f.select :payment_provider, EffectiveOrders.admin_payment_providers, required: true
34
+ = f.datetime_field :purchased_at, label: 'Purchased or completed'
34
35
 
35
36
  = f.text_field :payment_card,
36
37
  label: 'Payment card type, cheque or transaction number',
data/config/routes.rb CHANGED
@@ -52,7 +52,7 @@ EffectiveMemberships::Engine.routes.draw do
52
52
 
53
53
  resources :applicant_reviews, only: [:index, :show]
54
54
 
55
- resources :fees
55
+ resources :fees, except: [:show]
56
56
  resources :categories, only: [:index, :edit, :update]
57
57
 
58
58
  resources :applicant_course_areas, except: [:show]
@@ -1,3 +1,3 @@
1
1
  module EffectiveMemberships
2
- VERSION = '0.9.4'
2
+ VERSION = '0.9.6'
3
3
  end
@@ -11,7 +11,7 @@ namespace :effective_memberships do
11
11
  begin
12
12
  if ActiveRecord::Base.connection.table_exists?(:memberships)
13
13
  EffectiveLogger.info "Running effective_memberships:create_fees scheduled task" if defined?(EffectiveLogger)
14
- EffectiveMemberships.Registrar.create_fees!
14
+ EffectiveMemberships.Registrar.create_all_fees!
15
15
  end
16
16
  rescue => e
17
17
  ExceptionNotifier.notify_exception(e) if defined?(ExceptionNotifier)
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.9.4
4
+ version: 0.9.6
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-11-24 00:00:00.000000000 Z
11
+ date: 2022-11-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails