Module: SpreeCmCommissioner::OrderHoldable

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

Instance Method Summary collapse

Instance Method Details

#hold_order_holdsObject

Called before transitioning to :address state. Acquires seat holds (if applicable) + inventory holds for the order.



37
38
39
40
41
42
43
# File 'app/models/concerns/spree_cm_commissioner/order_holdable.rb', line 37

def hold_order_holds
  result = SpreeCmCommissioner::OrderHolds::Hold.call(order: self)
  return true if result.success?

  errors.add(:holds, result.error.value[:message])
  false
end

#lock_order_holds_for_paymentObject

Called via PaymentDecorator#after_commit when a payment is created. Idempotent: skips if holds are already locked (payment_locked_at is set). On first call, ensures all active holds have at least 5 minutes remaining, transitions the inventory hold to :payment_locked, stamps payment_locked_at on both inventory hold and seat blocks, and resyncs order.hold_expires_at.



50
51
52
53
54
55
56
57
# File 'app/models/concerns/spree_cm_commissioner/order_holdable.rb', line 50

def lock_order_holds_for_payment
  return true unless should_manage_blocks? || should_hold_inventory?

  result = SpreeCmCommissioner::OrderHolds::LockForPayment.call(order: self)
  return true if result.success?

  false
end

#release_order_holds!(reason: :user_canceled) ⇒ Object

Releases all holds (seats + inventory) for the order. Raises on failure so the surrounding transaction rolls back.



61
62
63
# File 'app/models/concerns/spree_cm_commissioner/order_holdable.rb', line 61

def release_order_holds!(reason: :user_canceled)
  SpreeCmCommissioner::OrderHolds::Release.call!(order: self, reason: reason)
end

#reserve_order_holds!Object

Converts all holds to reserved/complete state on order completion. Raises on failure so the surrounding transaction rolls back.



67
68
69
# File 'app/models/concerns/spree_cm_commissioner/order_holdable.rb', line 67

def reserve_order_holds!
  SpreeCmCommissioner::OrderHolds::Reserve.call!(order: self)
end

#should_hold_inventory?Boolean

Returns:

  • (Boolean)


29
30
31
32
33
# File 'app/models/concerns/spree_cm_commissioner/order_holdable.rb', line 29

def should_hold_inventory?
  return true if line_items.any?(&:should_hold_inventory?)

  false
end

#should_manage_blocks?Boolean

Returns:

  • (Boolean)


25
26
27
# File 'app/models/concerns/spree_cm_commissioner/order_holdable.rb', line 25

def should_manage_blocks?
  preload_block_ids.any?
end