effective_memberships 0.1.5 → 0.1.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: 99f08d66833ddda5de88911b43a3bdbeec7a3c8471a8018612dad529c577d8bd
4
- data.tar.gz: 0de87e5740113cde0a6dc6447eae0d53341637b6eeac1787ec233dceeab5b50c
3
+ metadata.gz: 8544e4c2c8881ecaf20650d65109ceec61d336d6da71934efeb456106fd106e7
4
+ data.tar.gz: d6c35955b6d1c50ac00e38f8e61c06be8ea5f09bd9f0b46151df34e595a3fb41
5
5
  SHA512:
6
- metadata.gz: 4e7dbbdfccb1c6dc0f0c30f15c58fa04a82a556cf00d9ad00e252fcfd99c29c5b74a973a694c9447f19cf1b114d15a59decc1ac52049fc3019425c252938f7b7
7
- data.tar.gz: '0683eee612f3d51e1024c118813cce613a3f5715c2959ac09b7cbea1cb000e9c17e3acfced1deaf28c717a6398b0d1a26622394018a2ff3f4f3225de7fb58c90'
6
+ metadata.gz: 825b440ee144856494653beed35d1f2897d9636450b30401aed9197c13614ed1e6c1e64a3cbdc3e8534d7f8080be630d19066a780dd7c6405da30eb455998785
7
+ data.tar.gz: df56086d4d6c6b856ca4b477a5fd6dbd78791e533523ef6e6d1a47efc75e326cb7b402ded63d1146d95a3929f2a0dc0846d16ae3f7d37173d82f788b9e355c58
@@ -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
@@ -247,6 +247,12 @@ module EffectiveMembershipsApplicant
247
247
  validates :declare_truth, acceptance: true
248
248
  end
249
249
 
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
+
250
256
  # Admin Approve
251
257
  validate(if: -> { approved_membership_date.present? }) do
252
258
  if approved_membership_date.to_date > Time.zone.now.to_date
@@ -453,12 +459,17 @@ module EffectiveMembershipsApplicant
453
459
 
454
460
  def find_or_build_submit_order
455
461
  order = submit_order || orders.build(user: owner)
462
+ fees = submit_fees()
456
463
 
457
464
  # Adds fees, but does not overwrite any existing price.
458
- submit_fees.each do |fee|
465
+ fees.each do |fee|
459
466
  order.add(fee) unless order.purchasables.include?(fee)
460
467
  end
461
468
 
469
+ order.purchasables.each do |purchasable|
470
+ order.remove(purchasable) unless fees.include?(purchasable)
471
+ end
472
+
462
473
  # From Billing Step
463
474
  order.billing_address = owner.billing_address if owner.billing_address.present?
464
475
 
@@ -110,6 +110,12 @@ module EffectiveMembershipsFeePayment
110
110
  validates :declare_truth, acceptance: true
111
111
  end
112
112
 
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
+
113
119
  # Clear required steps memoization
114
120
  after_save { @_required_steps = nil }
115
121
 
@@ -205,17 +211,22 @@ module EffectiveMembershipsFeePayment
205
211
 
206
212
  # We take over the owner's outstanding fees.
207
213
  def find_or_build_submit_fees
208
- Array(outstanding_fees).each { |fee| fees << fee }
214
+ Array(outstanding_fees).each { |fee| fees << fee unless fees.include?(fee) }
209
215
  submit_fees
210
216
  end
211
217
 
212
218
  def find_or_build_submit_order
213
219
  order = submit_order || orders.build(user: owner)
220
+ fees = submit_fees()
214
221
 
215
- submit_fees.each do |fee|
222
+ fees.each do |fee|
216
223
  order.add(fee) unless order.purchasables.include?(fee)
217
224
  end
218
225
 
226
+ order.purchasables.each do |purchasable|
227
+ order.remove(purchasable) unless fees.include?(purchasable)
228
+ end
229
+
219
230
  order.billing_address = owner.billing_address if owner.billing_address.present?
220
231
 
221
232
  order
@@ -244,7 +255,6 @@ module EffectiveMembershipsFeePayment
244
255
  save!
245
256
  end
246
257
 
247
-
248
258
  # Called automatically via after_purchase hook above
249
259
  def submit_purchased!
250
260
  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.5'
2
+ VERSION = '0.1.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.1.5
4
+ version: 0.1.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: 2021-12-21 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