Class: SpreeCmCommissioner::Cart::CreateGuest

Inherits:
Object
  • Object
show all
Includes:
Spree::ServiceModule::Base
Defined in:
app/services/spree_cm_commissioner/cart/create_guest.rb

Instance Method Summary collapse

Instance Method Details

#call(line_item:, options: {}) ⇒ Object



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
# File 'app/services/spree_cm_commissioner/cart/create_guest.rb', line 11

def call(line_item:, options: {})
  guest = line_item.guests.new(options)

  # Release holds BEFORE mutating, using the quantities the hold was placed against
  # (Release reads live line items). Only release when this guest will actually bump
  # the quantity. Guard on success and abort if it fails.
  if will_change_quantity?(line_item)
    release = line_item.order.release_order_holds(reason: :cart_changed)
    return release unless release.success?
  end

  line_item.with_lock do
    next unless guest.save

    guest.save_and_move_to_next_stage
    bump_quantity_to_cover_guests(line_item) if need_to_bump_quantity?(line_item)
  end

  return failure(guest) unless guest.persisted?

  success(guest)
rescue StandardError => e
  CmAppLogger.error(
    label: 'SpreeCmCommissioner::Cart::CreateGuest#call',
    data: {
      error_class: e.class.name,
      error_message: e.message
    }
  )
  failure(guest)
end