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



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

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!



482
483
484
485
486
487
488
489
# File 'app/models/effective/event_registrant.rb', line 482

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

  after_commit { event_registration&.send_event_registrants_cancelled_email! }

  true
end

#cancel_all!Object



497
498
499
500
# File 'app/models/effective/event_registrant.rb', line 497

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

#cancelled?Boolean

Returns:

  • (Boolean)


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

def cancelled?
  cancelled_at.present?
end

#detailsObject



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

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)


247
248
249
250
251
252
253
# File 'app/models/effective/event_registrant.rb', line 247

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



551
552
553
# File 'app/models/effective/event_registrant.rb', line 551

def event_registration_submit_order
  event_registration&.submit_order
end

#event_ticket_priceObject



507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
# File 'app/models/effective/event_registrant.rb', line 507

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



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

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)


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

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



242
243
244
# File 'app/models/effective/event_registrant.rb', line 242

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



327
328
329
# File 'app/models/effective/event_registrant.rb', line 327

def mark_registered!
  registered!
end

#member?Boolean

Anyone or Members tickets

Returns:

  • (Boolean)


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

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



199
200
201
202
203
204
205
206
207
# File 'app/models/effective/event_registrant.rb', line 199

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)


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

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)


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

def present_registrant?
  !blank_registrant?
end

#promote!Object



362
363
364
365
366
367
368
369
370
371
372
# File 'app/models/effective/event_registrant.rb', line 362

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



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

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



374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
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 374

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



413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
# File 'app/models/effective/event_registrant.rb', line 413

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



238
239
240
# File 'app/models/effective/event_registrant.rb', line 238

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

#qb_item_nameObject



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

def qb_item_name
  event_ticket&.qb_item_name
end

#registered!Object

Called by an event_registration after_defer and after_purchase



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

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

#registered?Boolean

Returns:

  • (Boolean)


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

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)


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

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



234
235
236
# File 'app/models/effective/event_registrant.rb', line 234

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

#save_and_update_orders!Object

Admin update event registrant action



332
333
334
335
336
337
338
339
340
341
342
# File 'app/models/effective/event_registrant.rb', line 332

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)


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

def selected?
  selected_at.present?
end

#selected_not_expired?Boolean

Returns:

  • (Boolean)


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

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



533
534
535
# File 'app/models/effective/event_registrant.rb', line 533

def send_confirmation_email!
  send_order_emails!
end

#send_order_emails!Object



547
548
549
# File 'app/models/effective/event_registrant.rb', line 547

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

#send_payment_request!Object

Manual admin action only. From datatable.



538
539
540
541
542
543
544
545
# File 'app/models/effective/event_registrant.rb', line 538

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



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

def tax_exempt
  event_ticket&.tax_exempt
end

#titleObject



195
196
197
# File 'app/models/effective/event_registrant.rb', line 195

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

#to_sObject



191
192
193
# File 'app/models/effective/event_registrant.rb', line 191

def to_s
  persisted? ? title : 'registrant'
end

#unarchive!Object



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

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!



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

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

#uncancel_all!Object



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

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

#unpromote!Object



455
456
457
458
459
460
461
# File 'app/models/effective/event_registrant.rb', line 455

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



353
354
355
356
357
358
359
360
# File 'app/models/effective/event_registrant.rb', line 353

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



344
345
346
347
348
349
350
351
# File 'app/models/effective/event_registrant.rb', line 344

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)


528
529
530
# File 'app/models/effective/event_registrant.rb', line 528

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