Class: SpreeCmCommissioner::Guests::Finalize
- Inherits:
-
Object
- Object
- SpreeCmCommissioner::Guests::Finalize
- Includes:
- Spree::ServiceModule::Base
- Defined in:
- app/services/spree_cm_commissioner/guests/finalize.rb
Constant Summary collapse
- MAX_RETRY_ATTEMPTS =
5
Instance Method Summary collapse
- #assign_bib(guest:, event:, variant:) ⇒ Object
-
#call(guest:, variant:, event: nil, user: nil) ⇒ Object
rubocop:disable Metrics/MethodLength,Metrics/PerceivedComplexity.
Instance Method Details
#assign_bib(guest:, event:, variant:) ⇒ Object
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'app/services/spree_cm_commissioner/guests/finalize.rb', line 54 def assign_bib(guest:, event:, variant:) bib_prefix = variant.bib_prefix return false unless variant.bib_required? return false if guest.bib_prefix.present? return false if guest.event_id.blank? return false if event.nil? || guest.event_id != event.id guest.bib_prefix = bib_prefix last_bib_number = event.guests .where(bib_prefix: bib_prefix) .maximum(:bib_number) || 0 guest.bib_number = last_bib_number + 1 guest.bib_index = "#{event.id}-#{bib_prefix}-#{guest.bib_number}" true end |
#call(guest:, variant:, event: nil, user: nil) ⇒ Object
rubocop:disable Metrics/MethodLength,Metrics/PerceivedComplexity
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'app/services/spree_cm_commissioner/guests/finalize.rb', line 8 def call(guest:, variant:, event: nil, user: nil) # rubocop:disable Metrics/MethodLength,Metrics/PerceivedComplexity attempts = 0 begin attempts += 1 guest.user = user if user.present? assign_bib(guest: guest, event: event, variant: variant) guest.save! success(guest) rescue ActiveRecord::RecordInvalid => e # Handle Rails-level validation error if e.record.errors[:bib_index].any? && attempts < MAX_RETRY_ATTEMPTS # Reload guest to get fresh data and retry if guest.persisted? guest.reload else # Clear bib values for new records so they get recalculated on retry guest.bib_prefix = nil guest.bib_number = nil guest.bib_index = nil end retry else # Return failure if not a bib_index error or exceeded max attempts failure(nil, e.) end rescue ActiveRecord::RecordNotUnique => e # Handle database-level uniqueness constraint violation # Return failure if not a bib_index error or exceeded max attempts return failure(nil, e.) unless e..include?('bib_index') && attempts < MAX_RETRY_ATTEMPTS # Reload guest to get fresh data and retry if guest.persisted? guest.reload else # Clear bib values for new records so they get recalculated on retry guest.bib_prefix = nil guest.bib_number = nil guest.bib_index = nil end retry end end |