Module: SpreeCmCommissioner::OrderSeatable

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

Instance Method Summary collapse

Instance Method Details

#cancel_blocks!Object

Cancel blocks for the order. Called from system (order cancellation/archive). Raises errors to alert the system if something goes wrong.



64
65
66
67
68
69
70
71
# File 'app/models/concerns/spree_cm_commissioner/order_seatable.rb', line 64

def cancel_blocks!
  return unless should_manage_blocks?

  CmAppLogger.log(label: "#{self.class.name}#cancel_blocks!", data: { order_id: id }) do
    SpreeCmCommissioner::Seats::BlocksCanceler.new(order_id: id, cancel_by: user).cancel_blocks!
    update!(hold_expires_at: nil)
  end
end

#ensure_blocks_heldObject

Makes sure seat blocks are held if not held yet or if the hold has expired. Called before moving to payment state to ensure seats are held properly, even if hold was started from :address state or an old hold expired.



26
27
28
29
30
31
# File 'app/models/concerns/spree_cm_commissioner/order_seatable.rb', line 26

def ensure_blocks_held
  return unless should_manage_blocks?
  return if hold_expires_at.present? && hold_expires_at > Time.zone.now

  hold_blocks
end

#hold_blocksObject



33
34
35
36
37
38
39
40
41
# File 'app/models/concerns/spree_cm_commissioner/order_seatable.rb', line 33

def hold_blocks
  hold_blocks!
rescue SpreeCmCommissioner::Seats::BlocksAreReservedByOtherGuestError,
       SpreeCmCommissioner::Seats::BlocksAreOnHoldByOtherGuestError,
       SpreeCmCommissioner::Seats::BlocksAreReservedBySameGuestError,
       SpreeCmCommissioner::Seats::UnableToSaveReservedBlockRecordError => e
  errors.add(:seats, e.message)
  false
end

#hold_blocks!Object

Hold blocks for the order. Called during checkout (user-initiated). Catches seat errors and adds them to order.errors to prevent state transition. Returns false if error occurs, true otherwise.



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'app/models/concerns/spree_cm_commissioner/order_seatable.rb', line 46

def hold_blocks!
  return unless should_manage_blocks?

  CmAppLogger.log(label: "#{self.class.name}#hold_blocks!", data: { order_id: id }) do
    held_blocks = SpreeCmCommissioner::Seats::BlocksHolder.new(
      line_item_ids: line_item_ids,
      hold_by: user
    ).hold_blocks!

    if held_blocks.any?
      min_expiration = held_blocks.map(&:expired_at).min
      update!(hold_expires_at: min_expiration)
    end
  end
end

#reserve_blocks!Object

Reserve blocks for the order. Called from system (order completion). Raises errors to alert the system if something goes wrong.



75
76
77
78
79
80
81
# File 'app/models/concerns/spree_cm_commissioner/order_seatable.rb', line 75

def reserve_blocks!
  return unless should_manage_blocks?

  CmAppLogger.log(label: "#{self.class.name}#reserve_blocks!", data: { order_id: id }) do
    SpreeCmCommissioner::Seats::BlocksReserver.new(line_item_ids: line_item_ids, reserve_by: user).reserve_blocks!
  end
end

#should_manage_blocks?Boolean

Returns:

  • (Boolean)


19
20
21
# File 'app/models/concerns/spree_cm_commissioner/order_seatable.rb', line 19

def should_manage_blocks?
  preload_block_ids.any?
end