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



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

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

#cancel!Object

If this changes a lot, consider effective_events_event_registration.cancel!



498
499
500
501
502
503
504
505
# File 'app/models/effective/event_registrant.rb', line 498

def cancel!
  assign_attributes(cancelled_at: Time.zone.now)
  archive!

  after_commit { event_registration&.send_event_registrants_cancelled_email! }

  true
end

#cancel_all!Object



513
514
515
516
# File 'app/models/effective/event_registrant.rb', line 513

def cancel_all!
  raise("expected an event registration") if event_registration.blank?
  event_registration.cancel!
end

#cancelled?Boolean

Returns:

  • (Boolean)


493
494
495
# File 'app/models/effective/event_registrant.rb', line 493

def cancelled?
  cancelled_at.present?
end

#detailsObject



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

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? && !cancelled?),
    ((:span, 'Cancelled', class: 'badge badge-warning') if cancelled?),
  ].compact.join(' ').html_safe
end

#early_bird?Boolean

Anyone or Members tickets

Returns:

  • (Boolean)


257
258
259
260
261
262
263
# File 'app/models/effective/event_registrant.rb', line 257

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



567
568
569
# File 'app/models/effective/event_registrant.rb', line 567

def event_registration_submit_order
  event_registration&.submit_order
end

#event_ticket_priceObject



523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
# File 'app/models/effective/event_registrant.rb', line 523

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? && owner.try(:membership_present?) && !owner.try(:membership_disabled?)
    event_ticket.blank_registrant_member_price
  elsif blank_registrant?
    event_ticket.blank_registrant_non_member_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



220
221
222
223
224
225
226
227
228
229
230
231
232
# File 'app/models/effective/event_registrant.rb', line 220

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?
    'Pending Name'
  else
    'Pending Name'
  end
end

#guest_of_member?Boolean

Anyone or Members tickets

Returns:

  • (Boolean)


275
276
277
278
279
280
281
282
# File 'app/models/effective/event_registrant.rb', line 275

def guest_of_member?
  return false if event.blank?
  return false if event_ticket.blank?
  return false unless event_ticket.guest_of_member?
  return false if !member? && owner.try(:membership_disabled?)

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

#last_first_nameObject



252
253
254
# File 'app/models/effective/event_registrant.rb', line 252

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

#mark_registered!Object

This is the Admin Save and Mark Registered action



343
344
345
# File 'app/models/effective/event_registrant.rb', line 343

def mark_registered!
  registered!
end

#member?Boolean

Anyone or Members tickets

Returns:

  • (Boolean)


266
267
268
269
270
271
272
# File 'app/models/effective/event_registrant.rb', line 266

def member?
  return false if event.blank?
  return false if event_ticket.blank?
  return false if (user.try(:membership_disabled?) || organization.try(:membership_disabled?))

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

#nameObject



209
210
211
212
213
214
215
216
217
# File 'app/models/effective/event_registrant.rb', line 209

def name
  if first_name.present?
    "#{first_name} #{last_name}"
  elsif owner.present?
    'Pending Name'
  else
    'Pending Name'
  end
end

#non_member?Boolean

Anyone tickets only

Returns:

  • (Boolean)


285
286
287
288
289
290
291
# File 'app/models/effective/event_registrant.rb', line 285

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)


309
310
311
# File 'app/models/effective/event_registrant.rb', line 309

def present_registrant?
  !blank_registrant?
end

#promote!Object



378
379
380
381
382
383
384
385
386
387
388
# File 'app/models/effective/event_registrant.rb', line 378

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



457
458
459
460
461
462
463
464
465
466
467
468
469
# File 'app/models/effective/event_registrant.rb', line 457

def promote_not_purchased!
  update!(promoted: true)

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

    if order.pending?
      order.defer!(provider: (order.payment_provider.presence || 'cheque'), email: false)
    end
  end

  true
end

#promote_purchased_event_registration!Object



390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
# File 'app/models/effective/event_registrant.rb', line 390

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..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!

  order = event_registration.submit_order

  if order.pending?
    order.defer!(provider: (order.payment_provider.presence || 'cheque'), email: false)
  end

  true
end

#promote_purchased_order!Object



429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
# File 'app/models/effective/event_registrant.rb', line 429

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!

  if order.pending?
    order.defer!(provider: (order.payment_provider.presence || 'cheque'), email: false)
  end

  true
end

#purchasable_nameObject



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

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

#qb_item_nameObject



317
318
319
# File 'app/models/effective/event_registrant.rb', line 317

def qb_item_name
  event_ticket&.qb_item_name
end

#registered!Object

Called by an event_registration after_defer and after_purchase



337
338
339
340
# File 'app/models/effective/event_registrant.rb', line 337

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

#registered?Boolean

Returns:

  • (Boolean)


325
326
327
# File 'app/models/effective/event_registrant.rb', line 325

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)


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

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



244
245
246
# File 'app/models/effective/event_registrant.rb', line 244

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

#save_and_update_orders!Object

Admin update event registrant action



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

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)


321
322
323
# File 'app/models/effective/event_registrant.rb', line 321

def selected?
  selected_at.present?
end

#selected_not_expired?Boolean

Returns:

  • (Boolean)


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

def selected_not_expired?
  return false unless EffectiveEvents.EventRegistration.selection_window.present?
  return false unless selected_at.present?

  (selected_at + EffectiveEvents.EventRegistration.selection_window) > Time.zone.now
end

#send_confirmation_email!Object

Manual admin action only



549
550
551
# File 'app/models/effective/event_registrant.rb', line 549

def send_confirmation_email!
  send_order_emails!
end

#send_order_emails!Object



563
564
565
# File 'app/models/effective/event_registrant.rb', line 563

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

#send_payment_request!Object

Manual admin action only. From datatable.



554
555
556
557
558
559
560
561
# File 'app/models/effective/event_registrant.rb', line 554

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



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

def tax_exempt
  event_ticket&.tax_exempt
end

#titleObject



205
206
207
# File 'app/models/effective/event_registrant.rb', line 205

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

#to_sObject



201
202
203
# File 'app/models/effective/event_registrant.rb', line 201

def to_s
  persisted? ? title : 'registrant'
end

#unarchive!Object



485
486
487
488
489
490
491
# File 'app/models/effective/event_registrant.rb', line 485

def unarchive!
  assign_attributes(cancelled_at: nil)

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

#uncancel!Object

If this changes a lot, consider effective_events_event_registration.uncancel!



508
509
510
511
# File 'app/models/effective/event_registrant.rb', line 508

def uncancel!
  assign_attributes(cancelled_at: nil)
  unarchive!
end

#uncancel_all!Object



518
519
520
521
# File 'app/models/effective/event_registrant.rb', line 518

def uncancel_all!
  raise("expected an event registration") if event_registration.blank?
  event_registration.uncancel!
end

#unpromote!Object



471
472
473
474
475
476
477
# File 'app/models/effective/event_registrant.rb', line 471

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



369
370
371
372
373
374
375
376
# File 'app/models/effective/event_registrant.rb', line 369

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

#validate_one_ticket_per_event?Boolean

The event registration can override this to add event specific validation

Returns:

  • (Boolean)


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

def validate_one_ticket_per_event?
  return event_registration.validate_one_ticket_per_event? if event_registration.present?
  EffectiveEvents.validate_one_ticket_per_event?
end

#waitlist!Object



360
361
362
363
364
365
366
367
# File 'app/models/effective/event_registrant.rb', line 360

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)


544
545
546
# File 'app/models/effective/event_registrant.rb', line 544

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