effective_memberships 0.6.7 → 0.6.10

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