effective_events 0.16.0 → 0.17.0

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: ecc4eb59591259776d458e3fc0d6328ba9790249e07d1ad9409d95a4eb18871b
4
- data.tar.gz: f85c9a53cfea60042cc37b81956186f6c2ad943ae3a2e2b001225176e9966ce4
3
+ metadata.gz: 6adf869c67bd082b19c66a82b5e3ac530a80b97c19e0047f13bdca69f7f1a98e
4
+ data.tar.gz: a1d8cd3df41996b18c2afcf4f2370a69e9d2b353e3bf3ca356808f3802ade723
5
5
  SHA512:
6
- metadata.gz: 0c83eddb719ba7e8d32d91f4be0474d76a224ca6980bce71d12cbe60bfe737774eb3b20ac005c6a870777f96946bb6e212ddf9693e80ed152728c6a87e0cd5fe
7
- data.tar.gz: 7d5809a96b668b4a2afd459e894216d6077a64e444dba188ec615030dda1a68d076f8759e017cb23424f38840c43be1833070fabc939b3330a5b43ade9475f14
6
+ metadata.gz: b5cb43f659f86669874ea2edca7aa0159aad83c25a85065d2c69ee10d4aaf8392ea8aa1ebc3a171ab95b40f93e8ec3dd2e59aeb9161c8957a94aab60d5247e26
7
+ data.tar.gz: aba17ab942159ea4b5b0cf9c62511f876dbd54b56a864ce584115c07ce2bcd01c02310ceebadafb3548a983b9eeebddd1ccd55dfccde669c231152a35c67c9a8
@@ -18,10 +18,14 @@ module Admin
18
18
  col :title
19
19
  col :category, visible: false
20
20
 
21
- col :early_bird_price, as: :price, visible: event.early_bird_end_at.present?
21
+ col :early_bird_price, as: :price, visible: event&.early_bird_end_at.present?
22
22
  col :regular_price, as: :price
23
23
  col :member_price, as: :price
24
24
 
25
+ col :waitlist
26
+ col :capacity_available, visible: false
27
+ col :capacity, label: 'Capacity Total', visible: false
28
+
25
29
  col :capacity_to_s, label: 'Capacity' do |ticket|
26
30
  if ticket.capacity.present? && ticket.waitlist?
27
31
  "#{ticket.capacity_available} remaining / #{ticket.capacity} total. #{ticket.waitlisted_event_registrants_count} waitlisted."
@@ -44,9 +48,6 @@ module Admin
44
48
  event.event_registrants.purchased.unarchived.count
45
49
  end
46
50
 
47
- col :capacity_available, visible: false
48
- col :capacity, label: 'Capacity Total', visible: false
49
- col :waitlist, visible: false
50
51
 
51
52
  col :question1, visible: false
52
53
  col :question2, visible: false
@@ -8,7 +8,7 @@ module Effective
8
8
  raise('expected an Effective::EventRegistrant') unless resource.kind_of?(Effective::EventRegistrant)
9
9
 
10
10
  @assigns = assigns_for(resource)
11
- mail(to: resource.email, **headers_for(resource, opts))
11
+ mail(to: resource.member_email, **headers_for(resource, opts))
12
12
  end
13
13
 
14
14
  protected
@@ -166,10 +166,6 @@ module Effective
166
166
  errors.add(:delayed_payment, 'no delayed payment processor available') unless EffectiveOrders.try(:delayed?)
167
167
  end
168
168
 
169
- validate(if: -> { delayed_payment_date && registration_end_at }) do
170
- errors.add(:delayed_payment_date, 'must be after registration end date') unless registration_end_at < delayed_payment_date
171
- end
172
-
173
169
  validate(if: -> { file.attached? }) do
174
170
  errors.add(:file, 'must be an image') unless file.image?
175
171
  end
@@ -150,6 +150,8 @@ module Effective
150
150
  update_column(:started_at, Time.zone.now)
151
151
 
152
152
  event_registrants.each do |event_registrant|
153
+ next if event_registrant.member_email.blank?
154
+
153
155
  begin
154
156
  EffectiveEvents.send_email(email_template, event_registrant, email_notification_params)
155
157
  rescue => e
@@ -32,7 +32,6 @@ module Effective
32
32
  company :string
33
33
 
34
34
  blank_registrant :boolean
35
- member_registrant :boolean
36
35
 
37
36
  waitlisted :boolean
38
37
  promoted :boolean # An admin marked this registrant as promoted from the waitlist
@@ -59,8 +58,6 @@ module Effective
59
58
 
60
59
  scope :sorted, -> { order(:last_name) }
61
60
  scope :deep, -> { includes(:event, :event_ticket, :owner) }
62
-
63
- #scope :registered, -> { purchased_or_deferred.unarchived }
64
61
  scope :registered, -> { where.not(registered_at: nil) }
65
62
 
66
63
  before_validation(if: -> { event_registration.present? }) do
@@ -69,7 +66,7 @@ module Effective
69
66
  end
70
67
 
71
68
  before_validation(if: -> { blank_registrant? }) do
72
- assign_attributes(user: nil, first_name: nil, last_name: nil, email: nil)
69
+ assign_attributes(user: nil, first_name: nil, last_name: nil, email: nil, company: nil)
73
70
  end
74
71
 
75
72
  before_validation(if: -> { user.present? }) do
@@ -89,22 +86,24 @@ module Effective
89
86
  validates :email, email: true
90
87
 
91
88
  # Member Only Ticket
92
- with_options(if: -> { event_ticket&.member_only? }, unless: -> { blank_registrant? }) do
89
+ with_options(if: -> { event_ticket&.member_only? && present_registrant? }) do
93
90
  validates :user_id, presence: { message: 'Please select a member' }
94
91
  end
95
92
 
96
93
  # Regular Ticket
97
- with_options(if: -> { event_ticket&.regular? }, unless: -> { blank_registrant? }) do
98
- validates :first_name, presence: true
99
- validates :last_name, presence: true
100
- validates :email, presence: true
94
+ with_options(if: -> { event_ticket&.regular? && present_registrant? }) do
95
+ validates :first_name, presence: true, unless: -> { EffectiveEvents.event_registrant_required_fields.exclude?(:first_name) }
96
+ validates :last_name, presence: true, unless: -> { EffectiveEvents.event_registrant_required_fields.exclude?(:last_name) }
97
+ validates :email, presence: true, unless: -> { EffectiveEvents.event_registrant_required_fields.exclude?(:email) }
98
+ validates :company, presence: true, unless: -> { EffectiveEvents.event_registrant_required_fields.exclude?(:company) }
101
99
  end
102
100
 
103
- with_options(if: -> { event_ticket&.member_or_non_member? && !blank_registrant? }) do
104
- validates :user_id, presence: { message: 'Please select a member' }, unless: -> { first_name.present? || last_name.present? || email.present? }
105
- validates :first_name, presence: true, unless: -> { user.present? }
106
- validates :last_name, presence: true, unless: -> { user.present? }
107
- validates :email, presence: true, unless: -> { user.present? }
101
+ with_options(if: -> { event_ticket&.member_or_non_member? && present_registrant? }) do
102
+ validates :user_id, presence: { message: 'Please select a member' }, unless: -> { first_name.present? || last_name.present? }
103
+ validates :first_name, presence: true, unless: -> { user.present? || EffectiveEvents.event_registrant_required_fields.exclude?(:first_name) }
104
+ validates :last_name, presence: true, unless: -> { user.present? || EffectiveEvents.event_registrant_required_fields.exclude?(:last_name) }
105
+ validates :email, presence: true, unless: -> { user.present? || EffectiveEvents.event_registrant_required_fields.exclude?(:email) }
106
+ validates :company, presence: true, unless: -> { user.present? || EffectiveEvents.event_registrant_required_fields.exclude?(:company) }
108
107
  end
109
108
 
110
109
  after_defer do
@@ -138,7 +137,15 @@ module Effective
138
137
  end
139
138
 
140
139
  def member_present?
141
- user&.is?(:member) || (blank_registrant? && member_registrant?)
140
+ user&.is?(:member)
141
+ end
142
+
143
+ def member_email
144
+ email.presence || user&.email
145
+ end
146
+
147
+ def present_registrant?
148
+ !blank_registrant?
142
149
  end
143
150
 
144
151
  def tax_exempt
@@ -164,6 +171,24 @@ module Effective
164
171
  registered!
165
172
  end
166
173
 
174
+ def waitlist!
175
+ raise('expected a waitlist? event_ticket') unless event_ticket.waitlist?
176
+
177
+ update!(waitlisted: true)
178
+ orders.reject(&:purchased?).each { |order| order.update_purchasable_attributes! }
179
+
180
+ true
181
+ end
182
+
183
+ def unwaitlist!
184
+ raise('expected a waitlist? event_ticket') unless event_ticket.waitlist?
185
+
186
+ update!(waitlisted: false)
187
+ orders.reject(&:purchased?).each { |order| order.update_purchasable_attributes! }
188
+
189
+ true
190
+ end
191
+
167
192
  def promote!
168
193
  raise('expected a waitlist? event_ticket') unless event_ticket.waitlist?
169
194
 
@@ -68,7 +68,6 @@ module Effective
68
68
  validates :early_bird_price, numericality: { greater_than_or_equal_to: 0, allow_blank: true }
69
69
 
70
70
  validates :capacity, numericality: { greater_than_or_equal_to: 0, allow_blank: true }
71
- validates :capacity, numericality: { greater_than_or_equal_to: 1, message: 'must have a non-zero capacity when using waitlist' }, if: -> { waitlist? }
72
71
 
73
72
  def to_s
74
73
  title.presence || 'New Event Ticket'
@@ -1,4 +1,10 @@
1
1
  = effective_form_with(model: [:admin, event_addon], engine: true) do |f|
2
+ - if inline_datatable?
3
+ = f.hidden_field :event_id
4
+ - else
5
+ = f.select :event_id, Effective::Event.sorted.all,
6
+ 'data-load-ajax-url': effective_events.new_admin_event_addon_path,
7
+ 'data-load-ajax-div': '#effective-events-event-addon-ajax'
2
8
  = f.hidden_field :event_id
3
9
 
4
10
  - if f.object.new_record?
@@ -11,11 +17,10 @@
11
17
  - else
12
18
  = f.static_field :owner
13
19
 
14
- = render 'admin/event_addons/fields', f: f, event: event_addon.event
20
+ #effective-events-event-addon-ajax
21
+ - if f.object.event.present?
22
+ = render 'admin/event_addons/fields', f: f, event: event_addon.event
15
23
 
16
24
  = f.check_box :archived, label: "Archive this addon. It will be displayed as archived on the owner's event registration"
17
25
 
18
- - if f.object.new_record?
19
- = f.submit 'Save and Mark Registered'
20
- - else
21
- = f.submit 'Save'
26
+ = f.submit 'Save'
@@ -1,5 +1,10 @@
1
1
  = effective_form_with(model: [:admin, event_registrant], engine: true) do |f|
2
- = f.hidden_field :event_id
2
+ - if inline_datatable?
3
+ = f.hidden_field :event_id
4
+ - else
5
+ = f.select :event_id, Effective::Event.sorted.all,
6
+ 'data-load-ajax-url': effective_events.new_admin_event_registrant_path,
7
+ 'data-load-ajax-div': '#effective-events-event-registrant-ajax'
3
8
 
4
9
  - if f.object.new_record?
5
10
  -# User
@@ -13,11 +18,10 @@
13
18
 
14
19
  = f.datetime_field :registered_at, required: true
15
20
 
16
- = render 'effective/event_registrants/fields', f: f, event: event_registrant.event, namespace: :admin
21
+ #effective-events-event-registrant-ajax
22
+ - if f.object.event.present?
23
+ = render 'effective/event_registrants/fields', f: f, event: event_registrant.event, namespace: :admin
17
24
 
18
25
  = f.check_box :archived, label: "Archive this registrant. It will be displayed as archived on the owner's event registration"
19
26
 
20
- - if f.object.new_record?
21
- = f.submit 'Save and Mark Registered'
22
- - else
23
- = f.submit 'Save'
27
+ = f.submit 'Save'
@@ -11,18 +11,17 @@
11
11
  = f.show_if(:category, 'Regular') do
12
12
  .alert.alert-info.mb-4
13
13
  %strong Regular Ticket:
14
- Anyone will be able to purchase this ticket. They will be asked for a first name, last name and email. Will not display the dropdown list of related members. Only the regular price applies.
14
+ Anyone will be able to purchase this ticket. They will be asked for a first and last name. Will not display the dropdown list of all members. Only the regular price applies.
15
15
 
16
16
  = f.show_if(:category, 'Member Only') do
17
17
  .alert.alert-info.mb-4
18
18
  %strong Member Only Ticket:
19
- Only members will be able to purchase this ticket. They must select a member from the dropdown list of related members. Only the member price applies.
19
+ Only members will be able to purchase this ticket. They must select a member from the dropdown list of all members. Only the member price applies.
20
20
 
21
21
  = f.show_if(:category, 'Member or Non-Member') do
22
22
  .alert.alert-info.mb-4
23
23
  %strong Member or Non-Member Ticket:
24
- Anyone will be able to purchase this ticket. They can select a member from the dropdown list of related members to receive the member pricing.
25
- Or, they can enter a first name, last name and email to receive the regular pricing.
24
+ Anyone will be able to purchase this ticket. They can select a member from the dropdown list of all members to receive the member pricing or they can enter a first name and last name to receive the regular pricing.
26
25
 
27
26
  .col
28
27
  = f.number_field :capacity, hint: "The number of registrations will be limited to capacity.<br>Leave blank for unlimited capacity."
@@ -5,7 +5,7 @@
5
5
  = f.hide_if(:save_as_draft, true) do
6
6
  .row
7
7
  .col-md-6
8
- = f.datetime_field :published_start_at, hint: 'The event will be available starting on this date and time.'
8
+ = f.datetime_field :published_start_at, hint: 'The event will be available starting on this date and time. Leave blank to use the current date and time.'
9
9
  .col-md-6
10
10
  = f.datetime_field :published_end_at, hint: 'The event will no longer be available after this date and time. Leave blank for no end date.', date_linked: false
11
11
 
@@ -17,10 +17,6 @@
17
17
  - else
18
18
  = f.hidden_field :blank_registrant, value: false
19
19
 
20
- - if ticket.member_or_non_member?
21
- = f.show_if(:blank_registrant, true, nested: true) do
22
- = f.check_box :member_registrant, label: 'Yes, this ticket will be for a member'
23
-
24
20
  = f.show_if(:blank_registrant, false, nested: true) do
25
21
  %hr
26
22
 
@@ -1,3 +1,10 @@
1
- - # Choose member
2
- = f.hidden_field :user_type, value: current_user.class.name
3
- = f.select :user_id, effective_events_event_registrant_user_collection(f.object), required: true, hint: effective_events_event_registrant_user_hint()
1
+ - # Choose ANY member
2
+ - klass = (f.object.user || current_user).class
3
+ - ajax_url = (@select2_users_ajax_path || effective_memberships.member_users_membership_select2_ajax_index_path) unless Rails.env.test?
4
+
5
+ = f.hidden_field :user_type, value: klass.name
6
+ = f.select :user_id, klass.all, ajax_url: ajax_url, label: 'Member', required: true, hint: effective_events_event_registrant_user_hint()
7
+
8
+ - # Choose RELATED ORGANIZATION member
9
+ -# = f.hidden_field :user_type, value: current_user.class.name
10
+ -# = f.select :user_id, effective_events_event_registrant_user_collection(f.object), required: true, hint: effective_events_event_registrant_user_hint()
@@ -1,6 +1,13 @@
1
- - # Choose member
2
- = f.hidden_field :user_type, value: current_user.class.name
3
- = f.select :user_id, effective_events_event_registrant_user_collection(f.object), hint: effective_events_event_registrant_user_hint()
1
+ - # Choose ANY member
2
+ - klass = (f.object.user || current_user).class
3
+ - ajax_url = (@select2_users_ajax_path || effective_memberships.member_users_membership_select2_ajax_index_path) unless Rails.env.test?
4
+
5
+ = f.hidden_field :user_type, value: klass.name
6
+ = f.select :user_id, klass.all, ajax_url: ajax_url, label: 'Member', hint: effective_events_event_registrant_user_hint()
7
+
8
+ - # Choose RELATED ORGANIZATION member
9
+ -# = f.hidden_field :user_type, value: current_user.class.name
10
+ -# = f.select :user_id, effective_events_event_registrant_user_collection(f.object), hint: effective_events_event_registrant_user_hint()
4
11
 
5
12
  = f.show_if(:user_id, '', nested: true) do
6
13
  %p.text-center - or -
@@ -1,8 +1,8 @@
1
1
  - # Choose non-member
2
2
  .row
3
- .col-md= f.text_field :first_name, required: true
4
- .col-md= f.text_field :last_name, required: true
3
+ .col-md= f.text_field :first_name
4
+ .col-md= f.text_field :last_name
5
5
 
6
6
  .row
7
- .col-md= f.email_field :email, required: true
7
+ .col-md= f.email_field :email
8
8
  .col-md= f.text_field :company
@@ -13,7 +13,7 @@
13
13
  %th Ticket
14
14
  - if member_column
15
15
  %th Member Price
16
- %th #{'Regualar ' if member_column}Price
16
+ %th #{'Regular ' if member_column}Price
17
17
 
18
18
  %tbody
19
19
  - tickets.each do |ticket|
@@ -3,17 +3,16 @@
3
3
 
4
4
  - if resource.submit_order.deferred?
5
5
  = card do
6
- = render_checkout_step2(resource.submit_order, purchased_url: wizard_path(:complete), deferred_url: wizard_path(:submitted), declined_url: wizard_path(:checkout), skip_order: resource.submit_order.delayed?)
6
+ = render_checkout_step2(resource.submit_order, purchased_url: wizard_path(:complete), deferred_url: wizard_path(:submitted), declined_url: wizard_path(:checkout))
7
7
  - elsif resource.event.registerable? == false
8
8
  .alert.alert-danger Your selected event is no longer available for registration.
9
9
  - elsif resource.unavailable_event_tickets.present?
10
10
  .alert.alert-danger Your selected number of event tickets are no longer available.
11
11
  - elsif resource.unavailable_event_products.present?
12
12
  .alert.alert-danger Your selected number of event add-ons are no longer available.
13
-
14
13
  - else
15
14
  = card do
16
- = render_checkout_step2(resource.submit_order, purchased_url: wizard_path(:complete), deferred_url: wizard_path(:submitted), declined_url: wizard_path(:checkout), skip_order: resource.submit_order.delayed?)
15
+ = render_checkout_step2(resource.submit_order, purchased_url: wizard_path(:complete), deferred_url: wizard_path(:submitted), declined_url: wizard_path(:checkout))
17
16
 
18
17
  - if resource.submit_order.delayed? && resource.submit_order.deferred?
19
18
  = link_to 'Save and Continue', wizard_path(:submitted), class: 'btn btn-primary'
@@ -4,8 +4,8 @@
4
4
  - raise('expected a submitted event_registration') unless resource.submitted?
5
5
  - raise('expected a deffered event_registration submit_order') unless resource.submit_order&.deferred?
6
6
 
7
- - if resource.event.delayed?
8
- - raise('expected event delayed_payment_date to match order delayed_payment_date') unless resource.event.delayed_payment_date == resource.submit_order.delayed_payment_date
7
+ -# - if resource.event.delayed?
8
+ -# - raise('expected event delayed_payment_date to match order delayed_payment_date') unless resource.event.delayed_payment_date == resource.submit_order.delayed_payment_date
9
9
 
10
10
  .mb-4
11
11
  = link_to "Return to Dashboard", return_to_dashboard_path, class: 'btn btn-lg btn-primary btn-block'
@@ -18,6 +18,10 @@ EffectiveEvents.setup do |config|
18
18
  # Hint text for event images attachments
19
19
  config.events_hint_text = 'Hint text that includes required image dimensions'
20
20
 
21
+ # Validations for Event Registrants
22
+ # config.event_registrant_required_fields = [:first_name, :last_name, :email, :company]
23
+ config.event_registrant_required_fields = [:first_name, :last_name, :email]
24
+
21
25
  # Mailer Settings
22
26
  # Please see config/initializers/effective_resources.rb for default effective_* gem mailer settings
23
27
  #
data/config/routes.rb CHANGED
@@ -44,6 +44,8 @@ EffectiveEvents::Engine.routes.draw do
44
44
  resources :event_registrants, except: [:show] do
45
45
  post :promote, on: :member
46
46
  post :unpromote, on: :member
47
+ post :waitlist, on: :member
48
+ post :unwaitlist, on: :member
47
49
 
48
50
  post :archive, on: :member
49
51
  post :unarchive, on: :member
@@ -84,7 +84,6 @@ class CreateEffectiveEvents < ActiveRecord::Migration[6.0]
84
84
  t.text :notes
85
85
 
86
86
  t.boolean :blank_registrant, default: false
87
- t.boolean :member_registrant, default: false
88
87
 
89
88
  t.boolean :waitlisted, default: false
90
89
  t.boolean :promoted, default: false
@@ -1,3 +1,3 @@
1
1
  module EffectiveEvents
2
- VERSION = '0.16.0'.freeze
2
+ VERSION = '0.17.0'.freeze
3
3
  end
@@ -9,7 +9,7 @@ module EffectiveEvents
9
9
  :events_table_name, :event_registrants_table_name, :event_tickets_table_name,
10
10
  :event_registrations_table_name, :event_products_table_name, :event_addons_table_name, :event_notifications_table_name,
11
11
  :mailer, :parent_mailer, :deliver_method, :mailer_layout, :mailer_sender, :mailer_admin, :mailer_subject,
12
- :layout, :per_page, :use_effective_roles, :categories, :events_hint_text,
12
+ :layout, :per_page, :use_effective_roles, :categories, :events_hint_text, :event_registrant_required_fields,
13
13
  :event_registration_class_name
14
14
  ]
15
15
  end
@@ -28,4 +28,8 @@ module EffectiveEvents
28
28
  Array(config[:categories]) - [nil, false, '']
29
29
  end
30
30
 
31
+ def event_registrant_required_fields
32
+ (Array(config[:event_registrant_required_fields]) - [nil, false, '']).map(&:to_sym)
33
+ end
34
+
31
35
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_events
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.16.0
4
+ version: 0.17.0
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: 2024-06-28 00:00:00.000000000 Z
11
+ date: 2024-07-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails