Class: Effective::EventRegistrant

Inherits:
ActiveRecord::Base
  • Object
show all
Includes:
ActionView::Helpers::TagHelper
Defined in:
app/models/effective/event_registrant.rb

Constant Summary collapse

PERMITTED_BLANK_REGISTRANT_CHANGES =
["first_name", "last_name", "email", "company", "user_id", "user_type", "organization_id", "organization_type", "blank_registrant", "response1", "response2", "response3"]

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#building_user_and_organizationObject

Returns the value of attribute building_user_and_organization.



11
12
13
# File 'app/models/effective/event_registrant.rb', line 11

def building_user_and_organization
  @building_user_and_organization
end

Instance Method Details

#archive!Object



427
428
429
430
431
# File 'app/models/effective/event_registrant.rb', line 427

def archive!
  super()
  orders.reject(&:purchased?).each { |order| order.update_purchasable_attributes! }
  true
end

#detailsObject



214
215
216
217
218
219
220
221
# File 'app/models/effective/event_registrant.rb', line 214

def details
  [
    ((:span, 'Member', class: 'badge badge-warning') if member?),
    ((:span, 'Guest of Member', class: 'badge badge-warning') if guest_of_member?),
    ((:span, 'Waitlist', class: 'badge badge-warning') if waitlisted_not_promoted?),
    ((:span, 'Archived', class: 'badge badge-warning') if archived?)
  ].compact.join(' ').html_safe
end

#early_bird?Boolean

Anyone or Members tickets

Returns:

  • (Boolean)


236
237
238
239
240
241
242
# File 'app/models/effective/event_registrant.rb', line 236

def early_bird?
  return false if event.blank?
  return false if event_ticket.blank?
  return false if event_ticket.early_bird_price.blank?

  event.early_bird?
end

#event_registration_submit_orderObject



481
482
483
# File 'app/models/effective/event_registrant.rb', line 481

def event_registration_submit_order
  event_registration&.submit_order
end

#event_ticket_priceObject



439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
# File 'app/models/effective/event_registrant.rb', line 439

def event_ticket_price
  raise('expected an event') if event.blank?
  raise('expected an event ticket') if event_ticket.blank?

  if early_bird?
    event_ticket.early_bird_price
  elsif blank_registrant?
    event_ticket.maximum_price
  elsif member?
    event_ticket.member_price
  elsif guest_of_member?
    event_ticket.guest_of_member_price
  elsif non_member?
    event_ticket.non_member_price
  else
    event_ticket.maximum_price
  end
end

#full_nameObject

Used in email and tickets datatable



200
201
202
203
204
205
206
207
208
209
210
211
212
# File 'app/models/effective/event_registrant.rb', line 200

def full_name
  if first_name.present?
    [
      name,
      ("<small>#{organization || company}</small>" if organization || company.present?),
      ("<small>#{email}</small>" if email.present?)
    ].compact.join('<br>').html_safe
  elsif owner.present?
    owner.to_s + ' - GUEST'
  else
    'GUEST'
  end
end

#guest_of_member?Boolean

Anyone or Members tickets

Returns:

  • (Boolean)


253
254
255
256
257
258
259
# File 'app/models/effective/event_registrant.rb', line 253

def guest_of_member?
  return false if event.blank?
  return false if event_ticket.blank?
  return false unless event_ticket.guest_of_member?

  !member? && owner.try(:membership_present?)
end

#last_first_nameObject



231
232
233
# File 'app/models/effective/event_registrant.rb', line 231

def last_first_name
  (first_name.present? && last_name.present?) ? "#{last_name}, #{first_name}" : "GUEST"
end

#mark_registered!Object

This is the Admin Save and Mark Registered action



312
313
314
# File 'app/models/effective/event_registrant.rb', line 312

def mark_registered!
  registered!
end

#member?Boolean

Anyone or Members tickets

Returns:

  • (Boolean)


245
246
247
248
249
250
# File 'app/models/effective/event_registrant.rb', line 245

def member?
  return false if event.blank?
  return false if event_ticket.blank?

  user.try(:membership_present?) || organization.try(:membership_present?)
end

#nameObject



189
190
191
192
193
194
195
196
197
# File 'app/models/effective/event_registrant.rb', line 189

def name
  if first_name.present?
    "#{first_name} #{last_name}"
  elsif owner.present?
    owner.to_s + ' - GUEST'
  else
    'GUEST'
  end
end

#non_member?Boolean

Anyone tickets only

Returns:

  • (Boolean)


262
263
264
265
266
267
268
# File 'app/models/effective/event_registrant.rb', line 262

def non_member?
  return false if event.blank?
  return false if event_ticket.blank?
  return false unless event_ticket.anyone?

  !member? && !guest_of_member?
end

#present_registrant?Boolean

Returns:

  • (Boolean)


280
281
282
# File 'app/models/effective/event_registrant.rb', line 280

def present_registrant?
  !blank_registrant?
end

#promote!Object



347
348
349
350
351
352
353
354
355
356
357
# File 'app/models/effective/event_registrant.rb', line 347

def promote!
  raise('expected a waitlist? event_ticket') unless event_ticket.waitlist?

  if purchased? && event_registration.present?
    promote_purchased_event_registration!
  elsif purchased? && event_registration.blank?
    promote_purchased_order!
  else
    promote_not_purchased!
  end
end

#promote_not_purchased!Object



413
414
415
416
417
# File 'app/models/effective/event_registrant.rb', line 413

def promote_not_purchased!
  update!(promoted: true)
  orders.reject(&:purchased?).each { |order| order.update_purchasable_attributes! }
  true
end

#promote_purchased_event_registration!Object



359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
# File 'app/models/effective/event_registrant.rb', line 359

def promote_purchased_event_registration!
  # Remove myself from any existing orders. 
  # I must be $0 so we don't need to update any prices.
  orders.each do |order|
    order.order_items.find { |oi| oi.purchasable == self }.destroy!
  end

  # I'm now promoted and unpurchased
  update!(promoted: true, purchased_order: nil)

  # Check if the ticket owner has an unpurchased event registration for the event or create a new one
  event_registration = EffectiveEvents.EventRegistration.draft.where(event: event, owner: owner).where.not(id: event_registration_id).first
  event_registration ||= EffectiveEvents.EventRegistration.new(event: event, owner: owner)

  # Put the event registration on the checkout step
  event_registration.all_steps_before(:checkout).each do |step|
    event_registration.wizard_steps[step] ||= Time.zone.now
  end

  event_registration.save!

  # Move this registrant into the new event registration
  update!(event_registration: event_registration)

  # Build the order for the event registration
  # It can be checked out by admin immediately, or the user can go through it themselves
  event_registration.reload
  event_registration.find_or_build_submit_order

  event_registration.save!
end

#promote_purchased_order!Object



391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
# File 'app/models/effective/event_registrant.rb', line 391

def promote_purchased_order!
  # Remove myself from any existing orders. 
  # I must be $0 so we don't need to update any prices.
  orders.each do |order|
    order.order_items.find { |oi| oi.purchasable == self }.destroy!
  end

  # I'm now promoted and unpurchased
  update!(promoted: true, purchased_order: nil)

  # Check if the ticket owner has an unpurchased order for the event or create a new one
  order = owner.orders.reject { |order| order.purchased? }.find do |order| 
    order.purchasables.any? { |purchasable| purchasable.class.name == "Effective::EventRegistrant" && purchasable.try(:event) == event }
  end
  order ||= Effective::Order.new(user: owner)

  # Move this registrant into the new order
  order.add(self)

  order.save!
end

#purchasable_nameObject



227
228
229
# File 'app/models/effective/event_registrant.rb', line 227

def purchasable_name
  ["#{event_ticket} - #{name}", details.presence].compact.join('<br>').html_safe
end

#qb_item_nameObject



288
289
290
# File 'app/models/effective/event_registrant.rb', line 288

def qb_item_name
  event_ticket&.qb_item_name
end

#registered!Object

Called by an event_registration after_defer and after_purchase



306
307
308
309
# File 'app/models/effective/event_registrant.rb', line 306

def registered!
  self.registered_at ||= Time.zone.now
  save!
end

#registered?Boolean

Returns:

  • (Boolean)


296
297
298
# File 'app/models/effective/event_registrant.rb', line 296

def registered?
  registered_at.present?
end

#registrant_validations_enabled?Boolean

We create registrants on the tickets step. But don’t enforce validations until the details step.

Returns:

  • (Boolean)


271
272
273
274
275
276
277
278
# File 'app/models/effective/event_registrant.rb', line 271

def registrant_validations_enabled?
  return false if blank_registrant? # They want to come back later

  return true if event_registration.blank? # If we're creating in an Admin area
  return false if event_ticket.blank? # Invalid anyway

  event_registration.current_step == :details
end

#responsesObject



223
224
225
# File 'app/models/effective/event_registrant.rb', line 223

def responses
  [response1.presence, response2.presence, response3.presence].compact.join('<br>').html_safe
end

#save_and_update_orders!Object

Admin update event registrant action



317
318
319
320
321
322
323
324
325
326
327
# File 'app/models/effective/event_registrant.rb', line 317

def save_and_update_orders!
  if event_ticket_id_changed?
    assign_attributes(response1: nil, response2: nil, response3: nil)
  end

  save!

  orders.reject(&:purchased?).each { |order| order.update_purchasable_attributes! }

  true
end

#selected?Boolean

Returns:

  • (Boolean)


292
293
294
# File 'app/models/effective/event_registrant.rb', line 292

def selected?
  selected_at.present?
end

#selected_not_expired?Boolean

Returns:

  • (Boolean)


300
301
302
303
# File 'app/models/effective/event_registrant.rb', line 300

def selected_not_expired?
  return false unless EffectiveEvents.EventRegistration.selection_window.present?
  selected_at.present? && (selected_at + EffectiveEvents.EventRegistration.selection_window > Time.zone.now)
end

#send_confirmation_email!Object

Manual admin action only



463
464
465
# File 'app/models/effective/event_registrant.rb', line 463

def send_confirmation_email!
  send_order_emails!
end

#send_order_emails!Object



477
478
479
# File 'app/models/effective/event_registrant.rb', line 477

def send_order_emails!
  event_registration&.submit_order&.send_order_emails!
end

#send_payment_request!Object

Manual admin action only. From datatable.



468
469
470
471
472
473
474
475
# File 'app/models/effective/event_registrant.rb', line 468

def send_payment_request!
  raise('already purchased or deferred') if purchased_or_deferred?

  order = (Array(event_registration_submit_order) + Array(orders)).find { |order| order.in_progress? && !order.purchased_or_deferred? && !order.refund? }
  return false if order.blank?

  order.send_payment_request!
end

#tax_exemptObject



284
285
286
# File 'app/models/effective/event_registrant.rb', line 284

def tax_exempt
  event_ticket&.tax_exempt
end

#titleObject



185
186
187
# File 'app/models/effective/event_registrant.rb', line 185

def title
  ["#{event_ticket} - #{name}", details.presence].compact.join(' ').html_safe
end

#to_sObject



181
182
183
# File 'app/models/effective/event_registrant.rb', line 181

def to_s
  persisted? ? title : 'registrant'
end

#unarchive!Object



433
434
435
436
437
# File 'app/models/effective/event_registrant.rb', line 433

def unarchive!
  super()
  orders.reject(&:purchased?).each { |order| order.update_purchasable_attributes! }
  true
end

#unpromote!Object



419
420
421
422
423
424
425
# File 'app/models/effective/event_registrant.rb', line 419

def unpromote!
  raise('expected a waitlist? event_ticket') unless event_ticket.waitlist?

  update!(promoted: false)
  orders.reject(&:purchased?).each { |order| order.update_purchasable_attributes! }
  true
end

#unwaitlist!Object



338
339
340
341
342
343
344
345
# File 'app/models/effective/event_registrant.rb', line 338

def unwaitlist!
  raise('expected a waitlist? event_ticket') unless event_ticket.waitlist?

  update!(waitlisted: false)
  orders.reject(&:purchased?).each { |order| order.update_purchasable_attributes! }

  true
end

#waitlist!Object



329
330
331
332
333
334
335
336
# File 'app/models/effective/event_registrant.rb', line 329

def waitlist!
  raise('expected a waitlist? event_ticket') unless event_ticket.waitlist?

  update!(waitlisted: true)
  orders.reject(&:purchased?).each { |order| order.update_purchasable_attributes! }

  true
end

#waitlisted_not_promoted?Boolean

Returns:

  • (Boolean)


458
459
460
# File 'app/models/effective/event_registrant.rb', line 458

def waitlisted_not_promoted?
  (waitlisted? && !promoted?)
end