Class: SpreeCmCommissioner::RedisStock::Restock

Inherits:
Base
  • Object
show all
Defined in:
app/services/spree_cm_commissioner/redis_stock/restock.rb

Instance Method Summary collapse

Methods inherited from Base

#line_items, #schedule_sync_inventory, #warm_redis_keys!

Methods included from ServiceModuleThrowable

#call!

Instance Method Details

#call(line_item_ids:) ⇒ Object

override



5
6
7
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
# File 'app/services/spree_cm_commissioner/redis_stock/restock.rb', line 5

def call(line_item_ids:)
  @line_item_ids = line_item_ids

  keys = []
  quantities = []
  inventory_ids = []
  max_capacities = []
  locked_flags = []
  warmable_items = []

  line_items.each do |li|
    # Mirrors Unstock, and the asymmetry is the dangerous one: filtering there but not here
    # would credit PUBLIC availability for every cancelled locked-stock order, inventing stock
    # out of nothing. Units go back to the pool they came from.
    locked = li.locked_stock?

    li.inventory_items.each do |item|
      keys << item.redis_key(locked: locked)
      quantities << li.quantity
      inventory_ids << item.id
      max_capacities << item.max_capacity
      locked_flags << locked
      warmable_items << item
    end
  end

  warm_redis_keys!(warmable_items)

  return failure(nil, :unable_to_restock) unless restock(keys, quantities, max_capacities)

  inventory_id_and_quantities = inventory_ids.map.with_index do |inventory_id, i|
    { inventory_id: inventory_id, quantity: quantities[i], locked: locked_flags[i] }
  end

  schedule_sync_inventory(inventory_id_and_quantities)
  success(nil)
end