effective_memberships 0.1.4 → 0.1.8

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: be186a54404ee8564606cdbeb991f89eac977c24da038bcdd7e8d066a07135d5
4
- data.tar.gz: b45bbf9c7f8c581c7497455fc9a6d50254f08526c9bb1372bb2c6bea46c99fb3
3
+ metadata.gz: '017428f74b7a9dd16e4d16a8a256ca2cbf510252266908134034cc56eb651c42'
4
+ data.tar.gz: be01e2eb2f76608ae46b1cfbed55225c3e32f035345e32912db4fcba901da1c4
5
5
  SHA512:
6
- metadata.gz: 1b5abcc5857d2c2b445e7d89d98452f60b9654458242bfdb0f3a2a63e27997e41c586ab0ea526a260f345e1145a920b16e2e0527d154546afc129c02b3e8d136
7
- data.tar.gz: 9efdc2ec2ef92d21aac19b70eaca29d1a3d0221f6d0fc593ed3982885984da2c409f519b98d9d2b60ae01ee00fc43e7c01d074efadb0b5234698b8bab7fde59c
6
+ metadata.gz: 84ccc24c2f09182b1288da31693dde5500478aa4eb9ba3fe58320a12fd85e113df9eaa7b7e954cf39fad473377ea72d855d2e959f89fdc7c5746f4314bdf9258
7
+ data.tar.gz: 15e78208b04cc08f90f09056b7fb5a5df92b3b1b55255734751501ca9fe3a2572ddf5448bf5f09139ee0c6b08f133451ed19a2232d8d3cbe5954ddcfddc20102
@@ -14,6 +14,10 @@ module Admin
14
14
  success: -> { "#{resource.owner} has been reclassified to #{resource.owner.membership.category}" },
15
15
  redirect: -> { admin_owners_path(resource) }
16
16
 
17
+ submit :assign, 'Assign',
18
+ success: -> { "#{resource.owner} has been assigned to #{resource.owner.membership.categories.to_sentence}" },
19
+ redirect: -> { admin_owners_path(resource) }
20
+
17
21
  submit :remove, 'Remove',
18
22
  success: -> { "#{resource.owner} has been removed" },
19
23
  redirect: -> { admin_owners_path(resource) }
@@ -24,8 +24,9 @@ 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
27
28
 
28
- if resource.submitted? && resource.applicant.was_submitted? && (resource.applicant.owner != current_user.effective_memberships_owner)
29
+ if resource.submitted? && resource.applicant.was_submitted? && authorized
29
30
  permitted
30
31
  else
31
32
  permitted.except(:reservations, :reservations_reason, :work_history, :accept_declaration)
@@ -4,7 +4,7 @@ module Effective
4
4
 
5
5
  include Effective::WizardController
6
6
 
7
- resource_scope -> { EffectiveMemberships.Applicant.deep.where(owner: current_user.effective_memberships_owner) }
7
+ resource_scope -> { EffectiveMemberships.Applicant.deep.where(owner: current_user.effective_memberships_owners) }
8
8
 
9
9
  # Allow only 1 in-progress application at a time
10
10
  before_action(only: [:new, :show], unless: -> { resource&.done? }) do
@@ -4,7 +4,7 @@ module Effective
4
4
 
5
5
  include Effective::WizardController
6
6
 
7
- resource_scope -> { EffectiveMemberships.FeePayment.deep.where(owner: current_user.effective_memberships_owner) }
7
+ resource_scope -> { EffectiveMemberships.FeePayment.deep.where(owner: current_user.effective_memberships_owners) }
8
8
 
9
9
  # Allow only 1 in-progress fee payment at a time
10
10
  before_action(only: [:new, :show], unless: -> { resource&.done? }) do
@@ -16,12 +16,15 @@ module Effective
16
16
  end
17
17
  end
18
18
 
19
+ after_save do
20
+ flash.now[:success] = ''
21
+ end
22
+
19
23
  private
20
24
 
21
25
  def permitted_params
22
26
  params.require(:fee_payment).permit!.except(
23
- :owner_id, :owner_type, :status, :status_steps, :wizard_steps,
24
- :submitted_at
27
+ :status, :status_steps, :wizard_steps, :submitted_at
25
28
  )
26
29
  end
27
30
 
@@ -14,7 +14,15 @@ module Admin
14
14
 
15
15
  col :number
16
16
 
17
- col :categories, label: 'Category'
17
+ col :categories, label: 'Category' do |history|
18
+ history.categories.map.with_index do |category, index|
19
+ category_id = history.category_ids[index]
20
+ link = link_to(category, effective_memberships.edit_admin_category_path(category_id))
21
+
22
+ content_tag(:div, link, class: 'col-resource_item')
23
+ end.join.html_safe
24
+ end
25
+
18
26
  col :category_ids, visible: false
19
27
 
20
28
  col :bad_standing
@@ -28,7 +28,7 @@ class EffectiveApplicantsDatatable < Effective::Datatable
28
28
  end
29
29
 
30
30
  collection do
31
- EffectiveMemberships.Applicant.deep.where(owner: current_user.effective_memberships_owner)
31
+ EffectiveMemberships.Applicant.deep.where(owner: current_user.effective_memberships_owners)
32
32
  end
33
33
 
34
34
  end
@@ -6,24 +6,19 @@ class EffectiveFeePaymentsDatatable < Effective::Datatable
6
6
  col :token, visible: false
7
7
  col :created_at, visible: false
8
8
 
9
- col :status
10
- col :period, visible: false
9
+ col :owner
10
+ col :status, visible: false
11
11
  col :submitted_at, label: 'Submitted', as: :date
12
+ col :period, visible: false
12
13
 
13
- col :orders
14
+ col :orders, action: :show
14
15
 
15
- actions_col(show: false) do |fee_payment|
16
- if fee_payment.draft?
17
- dropdown_link_to('Continue', effective_memberships.fee_payment_build_path(fee_payment, fee_payment.next_step), 'data-turbolinks' => false)
18
- dropdown_link_to('Delete', effective_memberships.fee_payment_path(fee_payment), 'data-confirm': "Really delete #{fee_payment}?", 'data-method': :delete)
19
- else
20
- dropdown_link_to('Show', effective_memberships.fee_payment_path(fee_payment))
21
- end
22
- end
16
+ actions_col(new: false)
23
17
  end
24
18
 
25
19
  collection do
26
- EffectiveMemberships.FeePayment.deep.where(owner: current_user.effective_memberships_owner)
20
+ EffectiveMemberships.FeePayment.deep.done
21
+ .where(owner: current_user.effective_memberships_owners)
27
22
  end
28
23
 
29
24
  end
@@ -453,12 +453,17 @@ module EffectiveMembershipsApplicant
453
453
 
454
454
  def find_or_build_submit_order
455
455
  order = submit_order || orders.build(user: owner)
456
+ fees = submit_fees()
456
457
 
457
458
  # Adds fees, but does not overwrite any existing price.
458
- submit_fees.each do |fee|
459
+ fees.each do |fee|
459
460
  order.add(fee) unless order.purchasables.include?(fee)
460
461
  end
461
462
 
463
+ order.purchasables.each do |purchasable|
464
+ order.remove(purchasable) unless fees.include?(purchasable)
465
+ end
466
+
462
467
  # From Billing Step
463
468
  order.billing_address = owner.billing_address if owner.billing_address.present?
464
469
 
@@ -51,7 +51,7 @@ module EffectiveMembershipsFeePayment
51
51
  attr_accessor :declare_truth
52
52
 
53
53
  # Throwaway
54
- attr_accessor :upgrade
54
+ attr_accessor :upgrade, :downgrade
55
55
 
56
56
  # Application Namespace
57
57
  belongs_to :owner, polymorphic: true
@@ -159,6 +159,41 @@ module EffectiveMembershipsFeePayment
159
159
  owner&.outstanding_fee_payment_fees
160
160
  end
161
161
 
162
+ def select!
163
+ reset!
164
+ end
165
+
166
+ def reset!
167
+ assign_attributes(wizard_steps: wizard_steps.slice(:start))
168
+ save!
169
+ end
170
+
171
+ # Work with effective_organizations
172
+ def organization!
173
+ if upgrade_individual_to_organization?
174
+ save!
175
+ update!(owner: owner.representatives.first.organization)
176
+ elsif downgrade_organization_to_individual?
177
+ save!
178
+ update!(owner: current_user)
179
+ else
180
+ save!
181
+ end
182
+ end
183
+
184
+ def upgrade_individual_to_organization?
185
+ return false unless EffectiveResources.truthy?(upgrade)
186
+ return false unless owner.class.respond_to?(:effective_organizations_user?)
187
+ owner.representatives.any?(&:new_record?)
188
+ end
189
+
190
+ def downgrade_organization_to_individual?
191
+ return false unless EffectiveResources.truthy?(downgrade)
192
+ return false unless owner.class.respond_to?(:effective_organizations_organization?)
193
+ return false if current_user.blank?
194
+ owner.representatives.any?(&:marked_for_destruction?)
195
+ end
196
+
162
197
  # All Fees and Orders
163
198
  def submit_fees
164
199
  fees
@@ -170,17 +205,22 @@ module EffectiveMembershipsFeePayment
170
205
 
171
206
  # We take over the owner's outstanding fees.
172
207
  def find_or_build_submit_fees
173
- Array(outstanding_fees).each { |fee| fees << fee }
208
+ Array(outstanding_fees).each { |fee| fees << fee unless fees.include?(fee) }
174
209
  submit_fees
175
210
  end
176
211
 
177
212
  def find_or_build_submit_order
178
213
  order = submit_order || orders.build(user: owner)
214
+ fees = submit_fees()
179
215
 
180
- submit_fees.each do |fee|
216
+ fees.each do |fee|
181
217
  order.add(fee) unless order.purchasables.include?(fee)
182
218
  end
183
219
 
220
+ order.purchasables.each do |purchasable|
221
+ order.remove(purchasable) unless fees.include?(purchasable)
222
+ end
223
+
184
224
  order.billing_address = owner.billing_address if owner.billing_address.present?
185
225
 
186
226
  order
@@ -209,7 +249,6 @@ module EffectiveMembershipsFeePayment
209
249
  save!
210
250
  end
211
251
 
212
-
213
252
  # Called automatically via after_purchase hook above
214
253
  def submit_purchased!
215
254
  return false if was_submitted?
@@ -46,7 +46,23 @@ module EffectiveMembershipsOwner
46
46
  end
47
47
 
48
48
  def effective_memberships_owner
49
- self
49
+ raise('expected singular usage but there are more than one owner') if effective_memberships_owners.length > 1
50
+ effective_memberships_owners.first
51
+ end
52
+
53
+ 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
+
57
+ owners || [self]
58
+ end
59
+
60
+ def outstanding_fee_payment_owners
61
+ effective_memberships_owners.select { |owner| !owner.membership_fees_paid? }
62
+ end
63
+
64
+ def current_fee_payment_owner
65
+ outstanding_fee_payment_owners.first || self
50
66
  end
51
67
 
52
68
  def owner_label
@@ -87,6 +103,10 @@ module EffectiveMembershipsOwner
87
103
  membership_histories.find { |history| history.removed? }.start_on
88
104
  end
89
105
 
106
+ def registrar_action_categories(action)
107
+ EffectiveMemberships.Category.sorted.all
108
+ end
109
+
90
110
  # Instance Methods
91
111
  def additional_fee_attributes(fee)
92
112
  raise('expected an Effective::Fee') unless fee.kind_of?(Effective::Fee)
@@ -161,6 +181,8 @@ module EffectiveMembershipsOwner
161
181
  late_on: nil,
162
182
  bad_standing_on: nil
163
183
  )
184
+
185
+ fee
164
186
  end
165
187
 
166
188
  def build_renewal_fee(category:, period:, late_on:, bad_standing_on:)
@@ -17,6 +17,9 @@ module Effective
17
17
  attr_accessor :membership_number
18
18
  attr_accessor :skip_fees
19
19
 
20
+ # Assign
21
+ attr_accessor :category_ids
22
+
20
23
  # All Action Validations
21
24
  validates :current_action, presence: true
22
25
  validates :current_user, presence: true
@@ -29,10 +32,27 @@ module Effective
29
32
  validates :category_id, presence: true,
30
33
  if: -> { current_action == :reclassify || current_action == :register }
31
34
 
35
+ validates :category_ids, presence: true, if: -> { current_action == :assign }
36
+
32
37
  def to_s
33
38
  'action'
34
39
  end
35
40
 
41
+ def register!
42
+ update!(current_action: :register)
43
+ EffectiveMemberships.Registrar.register!(owner, to: category, number: membership_number.presence, skip_fees: skip_fees?)
44
+ end
45
+
46
+ def reclassify!
47
+ update!(current_action: :reclassify)
48
+ EffectiveMemberships.Registrar.reclassify!(owner, to: category, skip_fees: skip_fees?)
49
+ end
50
+
51
+ def assign!
52
+ update!(current_action: :assign)
53
+ EffectiveMemberships.Registrar.assign!(owner, categories: categories, number: membership_number.presence)
54
+ end
55
+
36
56
  def good_standing!
37
57
  update!(current_action: :good_standing)
38
58
  EffectiveMemberships.Registrar.good_standing!(owner)
@@ -43,11 +63,6 @@ module Effective
43
63
  EffectiveMemberships.Registrar.bad_standing!(owner, reason: bad_standing_reason)
44
64
  end
45
65
 
46
- def reclassify!
47
- update!(current_action: :reclassify)
48
- EffectiveMemberships.Registrar.reclassify!(owner, to: category, skip_fees: skip_fees?)
49
- end
50
-
51
66
  def fees_paid!
52
67
  update!(current_action: :fees_paid)
53
68
  EffectiveMemberships.Registrar.fees_paid!(owner)
@@ -58,11 +73,6 @@ module Effective
58
73
  EffectiveMemberships.Registrar.remove!(owner)
59
74
  end
60
75
 
61
- def register!
62
- update!(current_action: :register)
63
- EffectiveMemberships.Registrar.register!(owner, to: category, number: membership_number.presence, skip_fees: skip_fees?)
64
- end
65
-
66
76
  def update!(atts)
67
77
  assign_attributes(atts); save!
68
78
  end
@@ -89,6 +99,10 @@ module Effective
89
99
  EffectiveMemberships.Category.find(@category_id) if @category_id
90
100
  end
91
101
 
102
+ def categories
103
+ EffectiveMemberships.Category.where(id: @category_ids) if @category_ids
104
+ end
105
+
92
106
  def skip_fees?
93
107
  EffectiveResources.truthy?(@skip_fees)
94
108
  end
@@ -0,0 +1,34 @@
1
+ .card
2
+ .card-body
3
+ %h5.card-title Assign
4
+
5
+ = effective_form_with(model: [:admin, registrar_action], url: effective_memberships.admin_registrar_actions_path) do |f|
6
+ = f.hidden_field :owner_id
7
+ = f.hidden_field :owner_type
8
+
9
+ - membership = f.object.owner.membership
10
+
11
+ %p.text-muted
12
+ Assign to one or more categories.
13
+
14
+ = f.static_field :current_action, label: 'Current Categories' do
15
+ - Array(membership&.categories).each do |category|
16
+ %div= link_to(category, effective_memberships.edit_admin_category_path(category))
17
+
18
+ - if membership.blank?
19
+ None
20
+
21
+ = f.check_box :current_action, label: 'Yes, assign this member to categories'
22
+
23
+ = f.show_if :current_action, true do
24
+ - categories = f.object.owner.registrar_action_categories(:assign)
25
+ = f.select :category_ids, categories, label: 'Assign to', required: true, multiple: true
26
+
27
+ - if membership.present?
28
+ %p The member will keep their existing membership number: #{membership.number}.
29
+ - else
30
+ = f.text_field :membership_number, hint: "leave blank to assign the next number"
31
+
32
+ %p No fees will be created
33
+
34
+ = f.submit 'Assign', border: false, center: true, 'data-confirm': "Really assign #{f.object.owner}?"
@@ -9,13 +9,14 @@
9
9
  - membership = f.object.owner.membership
10
10
 
11
11
  - period = EffectiveMemberships.Registrar.current_period
12
- - date = EffectiveMemberships.Registrar.bad_standing_date(period: period)
12
+ - date = (EffectiveMemberships.Registrar.bad_standing_date(period: period) rescue false)
13
13
 
14
14
  %p.text-muted
15
- Members with outstanding renewal fees are automatically marked
16
- not in good standing on #{date.strftime('%B %d')}.
17
- The status is cleared when they pay their fees.
18
- You can also mark a member as always not in good standing.
15
+ - if date.present?
16
+ Members with outstanding renewal fees are automatically marked
17
+ not in good standing on #{date.strftime('%B %d')}.
18
+ The status is cleared when they pay their fees.
19
+ You can also mark a member as always in bad standing.
19
20
 
20
21
  = f.static_field :current_action, label: 'Current Status' do
21
22
 
@@ -7,9 +7,7 @@
7
7
  = f.hidden_field :owner_type
8
8
 
9
9
  - membership = f.object.owner.membership
10
-
11
10
  - period = EffectiveMemberships.Registrar.current_period
12
- - date = EffectiveMemberships.Registrar.bad_standing_date(period: period)
13
11
 
14
12
  %p.text-muted
15
13
  Change a member's existing category and optionally create fees.
@@ -22,7 +20,8 @@
22
20
  = f.show_if :current_action, true do
23
21
  %p The member will keep their existing membership number: #{membership.number}.
24
22
 
25
- - categories = EffectiveMemberships.Category.all.where.not(id: membership.category_id)
23
+ - categories = f.object.owner.registrar_action_categories(:reclassify) - membership.categories
24
+
26
25
  = f.select :category_id, categories, label: 'Reclassify to', required: true
27
26
 
28
27
  = f.check_box :skip_fees, label: 'Yes, skip creating fees and just set the category'
@@ -17,7 +17,7 @@
17
17
  = f.check_box :current_action, label: 'Yes, register to a membership'
18
18
 
19
19
  = f.show_if :current_action, true do
20
- - categories = EffectiveMemberships.Category.all
20
+ - categories = f.object.owner.registrar_action_categories(:register)
21
21
  = f.select :category_id, categories, label: 'Register to'
22
22
 
23
23
  = f.text_field :membership_number, hint: "leave blank to assign the next number"
@@ -1,6 +1,4 @@
1
- - authorized = EffectiveResources.authorized?(self, :new, EffectiveMemberships.FeePayment)
2
- - datatable = EffectiveResources.best('EffectiveFeePaymentsDatatable').new(self)
3
- - in_progress = current_user.effective_memberships_owner.fee_payments.in_progress
1
+ - datatable = EffectiveResources.best('EffectiveFeePaymentsDatatable').new(self, namespace: :effective)
4
2
 
5
3
  %h2 Fee Payments
6
4
 
@@ -2,19 +2,33 @@
2
2
 
3
3
  .card
4
4
  .card-body
5
- %p Welcome #{current_user.effective_memberships_owner}!
5
+ - current_owner = current_user.current_fee_payment_owner
6
+
7
+ %p Welcome #{current_owner}!
6
8
 
7
9
  = render 'effective/fee_payments/content', resource: resource
8
10
 
9
- - if resource.outstanding_fees.blank?
11
+ - if current_owner.membership_fees_paid?
10
12
  %p You have no fees due at this time.
11
13
  = link_to 'Home', root_path, class: 'btn btn-primary'
12
14
 
13
- - if resource.outstanding_fees.present?
14
- %p You have the following fees due at this time:
15
+ - else
16
+ - if resource.outstanding_fees.present?
17
+ %p You have the following fees due at this time:
18
+ = render_purchasables(resource.outstanding_fees)
19
+ - else
20
+ %p You have fees due. Please continue.
15
21
 
16
- = render_purchasables(resource.outstanding_fees)
22
+ - resource.user = current_user
23
+ - resource.owner = current_owner
17
24
 
18
25
  = effective_form_with(model: resource, url: wizard_path(step), method: :put) do |f|
19
26
  = f.hidden_field :id
27
+
28
+ = f.hidden_field :owner_type
29
+ = f.hidden_field :owner_id
30
+
31
+ = f.hidden_field :user_type
32
+ = f.hidden_field :user_id
33
+
20
34
  = f.save 'Save and Continue'
@@ -1,3 +1,3 @@
1
1
  module EffectiveMemberships
2
- VERSION = '0.1.4'
2
+ VERSION = '0.1.8'
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.4
4
+ version: 0.1.8
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: 2021-12-20 00:00:00.000000000 Z
11
+ date: 2021-12-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -282,6 +282,7 @@ files:
282
282
  - app/views/admin/fees/_form.html.haml
283
283
  - app/views/admin/memberships/_status.html.haml
284
284
  - app/views/admin/registrar_actions/_form.html.haml
285
+ - app/views/admin/registrar_actions/_form_assign.html.haml
285
286
  - app/views/admin/registrar_actions/_form_bad_standing.html.haml
286
287
  - app/views/admin/registrar_actions/_form_fees_paid.html.haml
287
288
  - app/views/admin/registrar_actions/_form_reclassify.html.haml