Module: EffectiveEventsEventRegistration

Extended by:
ActiveSupport::Concern
Defined in:
app/models/concerns/effective_events_event_registration.rb

Overview

EffectiveEventsEventRegistration

Mark your owner model with effective_events_event_registration to get all the includes

Defined Under Namespace

Modules: Base, ClassMethods

Instance Method Summary collapse

Instance Method Details

#addons!Object



345
346
347
348
349
350
351
# File 'app/models/concerns/effective_events_event_registration.rb', line 345

def addons!
  after_commit do
    update_submit_fees_and_order! if submit_order.present?
  end

  save!
end

#build_event_addonsObject

This builds the default event addons used by the wizard form



394
395
396
397
398
399
400
401
402
403
404
405
406
# File 'app/models/concerns/effective_events_event_registration.rb', line 394

def build_event_addons
  if event_addons.blank?
    raise('expected owner and event to be present') unless owner && event

    event_addons.build(
      first_name: owner.try(:first_name),
      last_name: owner.try(:last_name),
      email: owner.try(:email)
    )
  end

  event_addons
end

#build_event_registrant(event_ticket:) ⇒ Object



371
372
373
# File 'app/models/concerns/effective_events_event_registration.rb', line 371

def build_event_registrant(event_ticket:)
  event_registrants.build(event: event, event_ticket: event_ticket, owner: owner)
end

#complete!Object



359
360
361
362
363
364
365
366
367
368
369
# File 'app/models/concerns/effective_events_event_registration.rb', line 359

def complete!
  raise('event registration must be submitted to complete!') unless 
  raise('expected a purchased order') unless submit_order&.purchased?

  wizard_steps[:checkout] ||= Time.zone.now
  wizard_steps[:submitted] ||= Time.zone.now
  wizard_steps[:complete] = Time.zone.now

  completed!
  true
end

#display_countdown?Boolean

Returns:

  • (Boolean)


246
247
248
249
250
251
252
# File 'app/models/concerns/effective_events_event_registration.rb', line 246

def display_countdown?
  return false if done?
  return false unless selected_at.present?
  return false unless current_step.present?

  [:start, :tickets, :submitted, :complete].exclude?(current_step)
end

#done?Boolean

Returns:

  • (Boolean)


242
243
244
# File 'app/models/concerns/effective_events_event_registration.rb', line 242

def done?
  completed?
end

#event_addon(event_product:, first_name:, last_name:, email:) ⇒ Object

Find or build. But it’s not gonna work with more than 1. This is for testing only really.



382
383
384
385
# File 'app/models/concerns/effective_events_event_registration.rb', line 382

def event_addon(event_product:, first_name:, last_name:, email:)
  addon = event_addons.find { |er| er.event_product == event_product && er.first_name == first_name && er.last_name == last_name && er.email == email }
  addon || event_addons.build(event: event, event_product: event_product, owner: owner, first_name: first_name, last_name: last_name, email: email)
end

#event_ticket_selection(event_ticket:, quantity: 0) ⇒ Object

Find or build



388
389
390
391
# File 'app/models/concerns/effective_events_event_registration.rb', line 388

def event_ticket_selection(event_ticket:, quantity: 0)
  selection = event_ticket_selections.find { |ets| ets.event_ticket == event_ticket } 
  selection || event_ticket_selections.build(event_ticket: event_ticket, quantity: quantity)
end

#event_ticketsObject



408
409
410
# File 'app/models/concerns/effective_events_event_registration.rb', line 408

def event_tickets
  present_event_registrants.map(&:event_ticket).uniq
end

#in_progress?Boolean

Returns:

  • (Boolean)


238
239
240
# File 'app/models/concerns/effective_events_event_registration.rb', line 238

def in_progress?
  draft? || 
end

#select_event_registrantsObject

Assigns the selected at time to start the reservation window



311
312
313
314
# File 'app/models/concerns/effective_events_event_registration.rb', line 311

def select_event_registrants
  now = Time.zone.now
  present_event_registrants.each { |er| er.assign_attributes(selected_at: now) }
end

#selected_atObject

When we make a ticket selection, we assign the selected_at to all tickets So the max or the min should be the same here.



256
257
258
# File 'app/models/concerns/effective_events_event_registration.rb', line 256

def selected_at
  event_registrants.map(&:selected_at).compact.max
end

#selected_expired?Boolean

Returns:

  • (Boolean)


264
265
266
267
# File 'app/models/concerns/effective_events_event_registration.rb', line 264

def selected_expired?
  return false if selected_at.blank?
  Time.zone.now >= selected_expires_at
end

#selected_expires_atObject



260
261
262
# File 'app/models/concerns/effective_events_event_registration.rb', line 260

def selected_expires_at
  selected_at + EffectiveEvents.EventRegistration.selection_window
end

#selection_not_expired?Boolean

Returns:

  • (Boolean)


269
270
271
272
# File 'app/models/concerns/effective_events_event_registration.rb', line 269

def selection_not_expired?
  return true if selected_at.blank?
  Time.zone.now < selected_expires_at
end

#ticket_selection_expired!Object

Called by a before_action on the event registration show action



275
276
277
278
279
280
281
282
283
284
285
# File 'app/models/concerns/effective_events_event_registration.rb', line 275

def ticket_selection_expired!
  raise("unexpected submitted registration") if 
  raise("unexpected purchased order") if submit_order&.purchased?
  raise("unexpected deferred order") if submit_order&.deferred?

  event_registrants.each { |er| er.assign_attributes(selected_at: nil) }
  event_ticket_selections.each { |ets| ets.assign_attributes(quantity: 0) }
  assign_attributes(current_step: nil, wizard_steps: {}) # Reset all steps

  save!
end

#tickets!Object



328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
# File 'app/models/concerns/effective_events_event_registration.rb', line 328

def tickets!
  assign_attributes(current_step: :tickets) # Ensure the unavailable tickets validations are run

  reset_all_wizard_steps_after(:tickets) unless 

  update_event_registrants
  select_event_registrants
  waitlist_event_registrants

  after_commit do
    update_submit_fees_and_order! if submit_order.present?
    update_deferred_event_registration! if submit_order&.deferred?
  end

  save!
end

#to_sObject

Instance Methods



234
235
236
# File 'app/models/concerns/effective_events_event_registration.rb', line 234

def to_s
  'registration'
end

#try_completed!Object



353
354
355
356
357
# File 'app/models/concerns/effective_events_event_registration.rb', line 353

def try_completed!
  return false unless 
  return false unless submit_order&.purchased?
  complete!
end

#unavailable_event_productsObject



422
423
424
425
426
427
428
429
430
# File 'app/models/concerns/effective_events_event_registration.rb', line 422

def unavailable_event_products
  unavailable = []

  present_event_addons.map(&:event_product).group_by { |p| p }.each do |event_product, event_products|
    unavailable << event_product unless event.event_product_available?(event_product, quantity: event_products.length)
  end

  unavailable
end

#unavailable_event_ticketsObject



412
413
414
415
416
417
418
419
420
# File 'app/models/concerns/effective_events_event_registration.rb', line 412

def unavailable_event_tickets
  unavailable = []

  present_event_registrants.map(&:event_ticket).group_by { |t| t }.each do |event_ticket, event_tickets|
    unavailable << event_ticket unless event.event_ticket_available?(event_ticket, except: self, quantity: event_tickets.length)
  end

  unavailable
end

#update_blank_registrants!Object



432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
# File 'app/models/concerns/effective_events_event_registration.rb', line 432

def update_blank_registrants!
  # This method is called by the user on a submitted or completed event registration.
  # Allow them to update blank registrants
  # Don't let them hack the form and change any information.
  if changes.present? || previous_changes.present?
    raise('unable to make changes to event while updating blank registrants')
  end

  if event_registrants.any? { |er| (er.changes.keys - Effective::EventRegistrant::PERMITTED_BLANK_REGISTRANT_CHANGES).present? }
    raise('unable to make changes to event registrants while updating blank registrants')
  end

  if event_registrants.any? { |er| er.blank_registrant_was == false && er.changes.present? }
    raise('unable to make changes to non-blank registrant while updating blank registrants')
  end

  if event_addons.any? { |ea| ea.changes.present? }
    raise('unable to make changes to event addons while updating blank registrants')
  end

  assign_attributes(current_step: :details) if current_step.blank? # Enables validations
  save!

  update_submit_fees_and_order! if submit_order.present? && !submit_order.purchased?

  true
end

#update_event_registrantsObject

This considers the event_ticket_selection and builds the appropriate event_registrants



288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
# File 'app/models/concerns/effective_events_event_registration.rb', line 288

def update_event_registrants
  event_ticket_selections.each do |event_ticket_selection|
    event_ticket = event_ticket_selection.event_ticket
    quantity = event_ticket_selection.quantity.to_i

    # All the registrants for this event ticket
    registrants = event_registrants.select { |er| er.event_ticket == event_ticket }

    # Delete over quantity
    if (diff = registrants.length - quantity) > 0
      registrants.last(diff).each { |er| er.mark_for_destruction }
    end

    # Create upto quantity
    if (diff = quantity - registrants.length) > 0
      diff.times { build_event_registrant(event_ticket: event_ticket) }
    end
  end

  event_registrants
end

#waitlist_event_registrantsObject

Looks at any unselected event registrants and assigns a waitlist value



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

def waitlist_event_registrants
  present_event_registrants.group_by { |er| er.event_ticket }.each do |event_ticket, event_registrants|
    if event_ticket.waitlist?
      capacity = event.capacity_available(event_ticket: event_ticket, event_registration: self)
      event_registrants.each_with_index { |er, index| er.assign_attributes(waitlisted: index >= capacity) }
    else
      event_registrants.each { |er| er.assign_attributes(waitlisted: false) }
    end
  end
end