effective_memberships 0.6.7 → 0.6.10

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: 994cc88bc7e75f8660b8af1a9930175493759241323675edc72da9ab53640ab5
4
- data.tar.gz: e29658115f728da1b3b33f5776fc24e461f6abe5ac9cb8d1362834153598a96e
3
+ metadata.gz: 7ba47cb79fdfe1d53bfa440e0c6ecd4b454f7da034a9035d25e0306e0b57a1d9
4
+ data.tar.gz: 7b342075e2d9aa6e51d7cecd34011e491f1c95ae7123606d26a23b128915e34d
5
5
  SHA512:
6
- metadata.gz: 9b2a8938998de7838aef913e2e4f2262a0cde28fc04de5fb0d74816a1ff9ddc23db3000985aceca51b4578339553c9be2c39b0ca0df11c6bbecd7a620101e17f
7
- data.tar.gz: 95f6268d44cc10e4dabe9c4208f5d42ae669533f31876643aa2b31749414dc5cbf68e8368c062c5997cc61261579e6bec5decfb446020c5497fe74cc02a29640
6
+ metadata.gz: 4033eb84334a81fe60aa6b67248f34feec629ca3a83bb6f0725ef2bb013dce6344b629eefd9f940f8a6f2b3a7dbdf35360b4027b925c5785d7e1ab7d359b0dcd
7
+ data.tar.gz: 59978379131bfb1a4e9988fdeda03e8e792ec37011c1c2a7338072c73c743dd1cd33999be0d1cbb41142e60ca43e1c15e8fe053b56a7ac9ffcc96e9e6ed6aa6d
@@ -68,7 +68,7 @@ module Effective
68
68
 
69
69
  def assigns_for(resource)
70
70
  if resource.class.respond_to?(:effective_memberships_applicant?)
71
- return applicant_assigns(resource).merge(owner_assigns(resource.owner))
71
+ return applicant_assigns(resource).merge(owner_assigns(resource.owner)).merge(membership_assigns(resource.owner.membership))
72
72
  end
73
73
 
74
74
  if resource.kind_of?(Effective::ApplicantEndorsement)
@@ -87,6 +87,7 @@ module Effective
87
87
 
88
88
  values = {
89
89
  date: (applicant.submitted_at || Time.zone.now).strftime('%F'),
90
+ approved_at: (applicant.approved_at&.strftime('%F') || 'not approved'),
90
91
 
91
92
  to_category: applicant.category.to_s,
92
93
  from_category: applicant.from_category.to_s,
@@ -102,6 +103,19 @@ module Effective
102
103
  { applicant: values }
103
104
  end
104
105
 
106
+ def membership_assigns(membership)
107
+ return {} if membership.blank?
108
+ raise('expected a membership') unless membership.kind_of?(Effective::Membership)
109
+
110
+ values = {
111
+ number: (membership.number || 'no membership number'),
112
+ joined_on: (membership.joined_on&.strftime('%F') || 'unknown'),
113
+ registration_on: (membership.registration_on.strftime('%F') || 'unknown')
114
+ }
115
+
116
+ { membership: values }
117
+ end
118
+
105
119
  def endorsement_assigns(applicant_endorsement)
106
120
  raise('expected a endorsement') unless applicant_endorsement.kind_of?(Effective::ApplicantEndorsement)
107
121
 
@@ -87,6 +87,7 @@ module EffectiveMembershipsApplicant
87
87
  # Admin Approve Step
88
88
  attr_accessor :approved_membership_number
89
89
  attr_accessor :approved_membership_date
90
+ attr_accessor :approved_email_action
90
91
 
91
92
  # Application Namespace
92
93
  belongs_to :user, polymorphic: true
@@ -194,8 +195,14 @@ module EffectiveMembershipsApplicant
194
195
  # Set Apply to Join or Reclassification
195
196
  before_validation(if: -> { (new_record? || current_step == :select) && owner.present? }) do
196
197
  self.applicant_type ||= can_apply_applicant_types_collection().first
197
- self.from_category = owner.membership&.category
198
- self.from_status = owner.membership&.status if reinstatement?
198
+
199
+ if owner.membership.present?
200
+ self.from_category = owner.membership.categories.first
201
+ end
202
+
203
+ if owner.membership.present? && reinstatement?
204
+ self.from_status = owner.membership.statuses.find { |status| status.reinstatable? }
205
+ end
199
206
  end
200
207
 
201
208
  before_validation(if: -> { current_step == :experience }) do
@@ -757,6 +764,19 @@ module EffectiveMembershipsApplicant
757
764
  reviewed!
758
765
  end
759
766
 
767
+ def approve_email_templates
768
+ raise('expected EffectiveEmailTemplates') unless defined?(EffectiveEmailTemplates)
769
+ Effective::EmailTemplate.where('template_name ILIKE ?', 'applicant_approve%').order(:template_name)
770
+ end
771
+
772
+ def to_category
773
+ category
774
+ end
775
+
776
+ def to_status
777
+ nil
778
+ end
779
+
760
780
  # Admin approves an applicant. Registers the owner. Sends an email.
761
781
  def approve!
762
782
  raise('already approved') if was_approved?
@@ -772,14 +792,15 @@ module EffectiveMembershipsApplicant
772
792
  if apply_to_join?
773
793
  EffectiveMemberships.Registrar.register!(
774
794
  owner,
775
- to: category,
795
+ to: to_category,
796
+ status: to_status,
776
797
  date: approved_membership_date.presence, # Set by the Admin Process form, or nil
777
798
  number: approved_membership_number.presence # Set by the Admin Process form, or nil
778
799
  )
779
800
  elsif reclassification?
780
- EffectiveMemberships.Registrar.reclassify!(owner, to: category)
801
+ EffectiveMemberships.Registrar.reclassify!(owner, to: to_category, status: to_status)
781
802
  elsif reinstatement?
782
- EffectiveMemberships.Registrar.reinstate!(owner)
803
+ EffectiveMemberships.Registrar.reinstate!(owner, from: from_status)
783
804
  else
784
805
  raise('unsupported approval applicant_type')
785
806
  end
@@ -186,17 +186,18 @@ module EffectiveMembershipsRegistrar
186
186
  save!(owner, date: date)
187
187
  end
188
188
 
189
- def reinstate!(owner, date: nil, skip_fees: false)
189
+ def reinstate!(owner, from:, date: nil, skip_fees: false)
190
190
  raise('expecting a memberships owner') unless owner.class.respond_to?(:effective_memberships_owner?)
191
191
  raise('owner must have an existing membership. use register! instead') if owner.membership.blank?
192
192
 
193
- from = owner.membership.status
194
- raise('expecting a from memberships status') if from.present? && !from.class.respond_to?(:effective_memberships_status?)
193
+ raise('expecting a from') if from.blank?
194
+ raise('expected a from status or category') unless from.class.respond_to?(:effective_memberships_status?) || from.class.respond_to?(:effective_memberships_category?)
195
195
 
196
196
  date ||= Time.zone.now
197
197
 
198
198
  membership = owner.membership
199
- membership.membership_status(status: from).mark_for_destruction if from.present?
199
+ membership.membership_status(status: from).mark_for_destruction if from.class.respond_to?(:effective_memberships_status?)
200
+ membership.membership_category(category: from).mark_for_destruction if from.class.respond_to?(:effective_memberships_category?)
200
201
 
201
202
  unless skip_fees
202
203
  fee = owner.build_prorated_fee(date: date)
@@ -9,7 +9,11 @@
9
9
  The member will keep their existing membership number: #{applicant.owner.membership.number}.
10
10
  - else
11
11
  - number = EffectiveMemberships.Registrar.next_membership_number(applicant.owner, to: applicant.category)
12
- = f.text_field :approved_membership_number, hint: "leave blank to assign the next number: #{number}."
12
+
13
+ - if number.present?
14
+ = f.text_field :approved_membership_number, hint: "leave blank to assign the next number: #{number || 'none'}."
15
+ - else
16
+ No membership number will be assigned.
13
17
 
14
18
  %h3 Fees
15
19
  %p The following fee(s) will be created:
@@ -24,7 +28,27 @@
24
28
  %li A #{month} discount fee from their old category
25
29
 
26
30
  %h3 Email to send
27
- %p The following email will be sent:
28
- = email_form_fields(f, :applicant_approved)
31
+ - email_templates = applicant.approve_email_templates
32
+
33
+ - f.object.approved_email_action ||= email_templates.first&.id
34
+ = f.hidden_field :approved_email_action
35
+
36
+ - if email_templates.length == 0
37
+ %p The following email will be sent:
38
+ = email_form_fields(f, :applicant_approve)
39
+
40
+ - if email_templates.length == 1
41
+ - template = email_templates.first
42
+ %p The following #{link_to(template, effective_email_templates.edit_admin_email_template_path(template), target: '_blank')} email will be sent:
43
+ = email_form_fields(f, template)
44
+
45
+ - if email_templates.length > 1
46
+ - collection = email_templates.map { |et| [et.to_s.titleize.sub('Applicant ', '') + " (#{et})", et.id] }
47
+ = f.select :approved_email_action, collection
48
+
49
+ - email_templates.each do |template|
50
+ = f.show_if(:approved_email_action, template.id) do
51
+ %p The following #{link_to(template, effective_email_templates.edit_admin_email_template_path(template), target: '_blank')} email will be sent:
52
+ = email_form_fields(f, template)
29
53
 
30
54
  = f.submit 'Approve Applicant', border: false, center: true, 'data-confirm': "Approve #{f.object.owner}?"
@@ -3,11 +3,7 @@
3
3
  = render 'admin/categories/form_category', category: category
4
4
 
5
5
  - if category.persisted?
6
- = render 'admin/categories/form_applicant_eligibility', category: category
7
-
8
- = render 'admin/categories/form_applicant_fees', category: category
9
- = render 'admin/categories/form_renewals', category: category
10
-
6
+ = render 'admin/categories/form_fees', category: category
11
7
 
12
8
  - if category.persisted?
13
9
  = tab 'Content - Applicants' do
@@ -18,14 +14,9 @@
18
14
 
19
15
  = tab 'Wizards' do
20
16
  .row
21
- .col
22
- = render 'admin/categories/form_applicant_steps', category: category
23
-
24
- .col
25
- = render 'admin/categories/form_fee_payment_steps', category: category
17
+ .col= render 'admin/categories/form_applicant_steps', category: category
18
+ .col= render 'admin/categories/form_fee_payment_steps', category: category
26
19
 
27
20
  - if category.respond_to?(:log_changes_datatable)
28
21
  = tab 'Logs' do
29
22
  = render_inline_datatable(category.log_changes_datatable)
30
-
31
-
@@ -4,10 +4,11 @@
4
4
  = f.article_editor "rich_text_applicant_all_steps_content", label: false, hint: "displayed on all steps"
5
5
  - else
6
6
  = f.rich_text_area "rich_text_applicant_all_steps_content", label: false, hint: "displayed on all steps"
7
- - enabled = f.object.applicant_wizard_steps
7
+
8
+ - enabled_steps = f.object.applicant_wizard_steps
8
9
 
9
10
  - EffectiveMemberships.Applicant::WIZARD_STEPS.each do |step, title|
10
- - next unless enabled.include?(step)
11
+ - next unless enabled_steps.include?(step)
11
12
 
12
13
  = card("#{title}") do
13
14
  - if defined?(EffectiveArticleEditor)
@@ -1,6 +1,7 @@
1
1
  = effective_form_with(model: [:admin, category], engine: true) do |f|
2
2
  .row
3
- .col= f.text_field :title, label: 'Category title'
3
+ .col
4
+ = f.text_field :title, label: 'Category title'
4
5
 
5
6
  .col
6
7
  = f.select :category_type, f.object.class.category_types,
@@ -14,4 +15,13 @@
14
15
  - else
15
16
  = f.rich_text_area :rich_text_body, label: 'Description shown in the Application to Join wizard'
16
17
 
17
- = f.submit
18
+ %h3 Applicant Eligibility
19
+ = f.check_box :can_apply_new, label: 'Anyone may apply for this category'
20
+ = f.check_box :can_apply_existing, label: 'Any current member may apply to join'
21
+ = f.check_box :can_apply_restricted, label: 'Only some current members may apply to join'
22
+
23
+ = f.show_if(:can_apply_restricted, true) do
24
+ - categories = f.object.class.where.not(id: f.object)
25
+ = f.select :can_apply_restricted_ids, categories, label: 'Existing member categories'
26
+
27
+ = effective_submit(f)
@@ -1,4 +1,28 @@
1
1
  = effective_form_with(model: [:admin, category], engine: true) do |f|
2
+ %h3 Applicant Fees
3
+ .row
4
+ .col= f.price_field :applicant_fee
5
+ .col= f.text_field :qb_item_name, label: "Quickbooks Item Name"
6
+
7
+ %h3 Pro-rated fees based on date of approval
8
+ .row
9
+ .col-lg-3
10
+ = f.price_field :prorated_jan, label: "January"
11
+ = f.price_field :prorated_feb, label: "February"
12
+ = f.price_field :prorated_mar, label: "March"
13
+ .col-lg-3
14
+ = f.price_field :prorated_apr, label: "April"
15
+ = f.price_field :prorated_may, label: "May"
16
+ = f.price_field :prorated_jun, label: "June"
17
+ .col-lg-3
18
+ = f.price_field :prorated_jul, label: "July"
19
+ = f.price_field :prorated_aug, label: "August"
20
+ = f.price_field :prorated_sep, label: "September"
21
+ .col-lg-3
22
+ = f.price_field :prorated_oct, label: "October"
23
+ = f.price_field :prorated_nov, label: "November"
24
+ = f.price_field :prorated_dec, label: "December"
25
+
2
26
  %h3 Renewal Fees
3
27
  = f.check_box :create_renewal_fees, label: 'Yes, annual renewal fees should be created'
4
28
 
@@ -6,7 +30,8 @@
6
30
  - date = EffectiveMemberships.Registrar.renewal_fee_date(date: Time.zone.now)
7
31
 
8
32
  %p Charged to members, every #{date.strftime('%B %e')}, to renew their dues.
9
- = f.price_field :renewal_fee
33
+ .row
34
+ .col-3= f.price_field :renewal_fee
10
35
 
11
36
  %h3 Late Fees
12
37
  = f.check_box :create_late_fees, label: 'Yes, late fees should be created'
@@ -16,7 +41,8 @@
16
41
  - date = EffectiveMemberships.Registrar.late_fee_date(period: period)
17
42
 
18
43
  %p Charged to members, on #{date.strftime('%B %e')}, with outstanding renewal fees
19
- = f.price_field :late_fee
44
+ .row
45
+ .col-3= f.price_field :late_fee
20
46
 
21
47
  %h3 Bad Standing
22
48
  = f.check_box :create_bad_standing, label: 'Yes, bad standing status should be applied'
@@ -27,4 +53,4 @@
27
53
 
28
54
  %p Members with outstanding fees, on #{date.strftime('%B %e')}, will automatically be marked in bad standing.
29
55
 
30
- = effective_submit(f)
56
+ = f.submit
@@ -22,7 +22,11 @@
22
22
  - else
23
23
  None
24
24
 
25
- - if applicant.from_category.present?
25
+ - if applicant.from_status.present?
26
+ %tr
27
+ %th From Status
28
+ %td= applicant.from_status
29
+ - elsif applicant.from_category.present?
26
30
  %tr
27
31
  %th From Category
28
32
  %td= applicant.from_category
@@ -1,3 +1,3 @@
1
1
  - membership = f.object.owner.membership
2
2
 
3
- %p Apply for reinstatement from #{membership.status || membership.category}.
3
+ %p Apply for reinstatement from #{badges(f.object.from_status || f.object.from_category)}.
@@ -1,3 +1,3 @@
1
1
  module EffectiveMemberships
2
- VERSION = '0.6.7'
2
+ VERSION = '0.6.10'
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.6.7
4
+ version: 0.6.10
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-09-05 00:00:00.000000000 Z
11
+ date: 2022-09-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -353,13 +353,11 @@ files:
353
353
  - app/views/admin/applicants/_status.html.haml
354
354
  - app/views/admin/categories/_form.html.haml
355
355
  - app/views/admin/categories/_form_applicant_content.html.haml
356
- - app/views/admin/categories/_form_applicant_eligibility.html.haml
357
- - app/views/admin/categories/_form_applicant_fees.html.haml
358
356
  - app/views/admin/categories/_form_applicant_steps.html.haml
359
357
  - app/views/admin/categories/_form_category.html.haml
360
358
  - app/views/admin/categories/_form_fee_payment_content.html.haml
361
359
  - app/views/admin/categories/_form_fee_payment_steps.html.haml
362
- - app/views/admin/categories/_form_renewals.html.haml
360
+ - app/views/admin/categories/_form_fees.html.haml
363
361
  - app/views/admin/fee_payments/_fee_payment.html.haml
364
362
  - app/views/admin/fees/_fee.html.haml
365
363
  - app/views/admin/fees/_form.html.haml
@@ -1,9 +0,0 @@
1
- = effective_form_with(model: [:admin, category], engine: true) do |f|
2
- %h3 Applicant Eligibility
3
- = f.check_box :can_apply_new, label: 'Anyone may apply for this category'
4
- = f.check_box :can_apply_existing, label: 'Any current member may apply to join'
5
- = f.check_box :can_apply_restricted, label: 'Only some current members may apply to join'
6
-
7
- = f.show_if(:can_apply_restricted, true) do
8
- - categories = f.object.class.where.not(id: f.object)
9
- = f.select :can_apply_restricted_ids, categories, label: 'Existing member categories'
@@ -1,24 +0,0 @@
1
- = effective_form_with(model: [:admin, category], engine: true) do |f|
2
- %h3 Applicant Fees
3
- .row
4
- .col= f.price_field :applicant_fee
5
- .col= f.text_field :qb_item_name, label: "Quickbooks Item Name"
6
-
7
- %h3 Pro-rated fees based on date of approval
8
- .row
9
- .col-lg-3
10
- = f.price_field :prorated_jan, label: "January"
11
- = f.price_field :prorated_feb, label: "February"
12
- = f.price_field :prorated_mar, label: "March"
13
- .col-lg-3
14
- = f.price_field :prorated_apr, label: "April"
15
- = f.price_field :prorated_may, label: "May"
16
- = f.price_field :prorated_jun, label: "June"
17
- .col-lg-3
18
- = f.price_field :prorated_jul, label: "July"
19
- = f.price_field :prorated_aug, label: "August"
20
- = f.price_field :prorated_sep, label: "September"
21
- .col-lg-3
22
- = f.price_field :prorated_oct, label: "October"
23
- = f.price_field :prorated_nov, label: "November"
24
- = f.price_field :prorated_dec, label: "December"