Class: Inventory::StockShuffler

Inherits:
BaseService
  • Object
show all
Defined in:
app/services/inventory/stock_shuffler.rb

Instance Method Summary collapse

Instance Method Details

#process(store_ids = [1,2]) ⇒ Object



3
4
5
6
7
# File 'app/services/inventory/stock_shuffler.rb', line 3

def process(store_ids = [1,2])
  store_ids.each do |store_id|
    shuffle_cerazorb(store_id)
  end
end

#shuffle_cerazorb(store_id) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'app/services/inventory/stock_shuffler.rb', line 9

def shuffle_cerazorb(store_id)
  small_item = StoreItem.includes(:item).where(items: {sku: 'CZRG-SH5MM-24X24'}, location: 'AVAILABLE', store_id: store_id).first
  medium_item = StoreItem.includes(:item).where(items: {sku: 'CZRG-SH5MM-24X48'}, location: 'AVAILABLE', store_id: store_id).first
  large_item = StoreItem.includes(:item).where(items: {sku: 'CZRG-SH5MM-48X48'}, location: 'AVAILABLE', store_id: store_id).first
  small_item_qty = small_item.qty_on_hand
  medium_item_qty = medium_item.qty_on_hand * 2
  large_item_qty = large_item.qty_on_hand * 4
  qty_hash = {small_item: small_item_qty, medium_item: medium_item_qty, large_item: large_item_qty}

  return 'already balanced' if qty_hash.values.uniq.length == 1

  # how much do we have in total
  total_stock = qty_hash.values.sum
  qty_per_item = (total_stock / 3).floor

  spread_small_cerazorb(small_item_qty - qty_per_item, store_id, qty_per_item) if small_item_qty > qty_per_item
  medium_item_qty = medium_item.reload.qty_on_hand * 2
  spread_medium_cerazorb(medium_item_qty - qty_per_item, store_id, qty_per_item) if medium_item_qty > qty_per_item
  large_item_qty = large_item.reload.qty_on_hand * 4
  spread_large_cerazorb(large_item_qty - qty_per_item, store_id, qty_per_item) if large_item_qty > qty_per_item

  return "New quantities: CZRG-SH5MM-24X24 (#{small_item.reload.qty_on_hand}) / CZRG-SH5MM-24X48 (#{medium_item.reload.qty_on_hand}) / CZRG-SH5MM-48X48 (#{large_item.reload.qty_on_hand})"
end

#spread_large_cerazorb(qty_to_spread, store_id, qty_per_item) ⇒ Object



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'app/services/inventory/stock_shuffler.rb', line 85

def spread_large_cerazorb(qty_to_spread, store_id, qty_per_item)
  small_item = StoreItem.includes(:item).where(items: {sku: 'CZRG-SH5MM-24X24'}, location: 'AVAILABLE', store_id: store_id).first
  medium_item = StoreItem.includes(:item).where(items: {sku: 'CZRG-SH5MM-24X48'}, location: 'AVAILABLE', store_id: store_id).first
  large_item = StoreItem.includes(:item).where(items: {sku: 'CZRG-SH5MM-48X48'}, location: 'AVAILABLE', store_id: store_id).first

  qty_to_spread = [qty_to_spread, large_item.qty_available * 4].min

  return 'not enough to spread' if qty_to_spread < 4

  # reclassify as many as needed into the small size
  small_needs = qty_per_item - small_item.qty_on_hand
  small_needs = 0 if small_needs < 0 # set to 0 if that returned a negative value
  reclassify_to_small = [qty_to_spread, small_needs].min
  if reclassify_to_small >= 4 # must have 4 minimum
    reclassify_qty = (reclassify_to_small / 4).floor
    ItemLedgerEntry.item_reclassification(Store.find(store_id), {0 => {store_item_id: large_item.id, qty: reclassify_qty}}, {0 => {item_id: small_item.item_id, location: "AVAILABLE", qty: (reclassify_qty * 4)}}, Date.current, 'Stock shuffler')
    qty_to_spread -= (reclassify_qty * 4)
  end

  # reclassify the rest into the medium size
  if qty_to_spread >= 4 # must have minimum 4
    reclassify_qty = (qty_to_spread / 4).floor
    ItemLedgerEntry.item_reclassification(Store.find(store_id), {0 => {store_item_id: large_item.id, qty: reclassify_qty}}, {0 => {item_id: medium_item.item_id, location: "AVAILABLE", qty: (reclassify_qty * 2)}}, Date.current, 'Stock shuffler')
  end
end

#spread_medium_cerazorb(qty_to_spread, store_id, qty_per_item) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'app/services/inventory/stock_shuffler.rb', line 59

def spread_medium_cerazorb(qty_to_spread, store_id, qty_per_item)
  small_item = StoreItem.includes(:item).where(items: {sku: 'CZRG-SH5MM-24X24'}, location: 'AVAILABLE', store_id: store_id).first
  medium_item = StoreItem.includes(:item).where(items: {sku: 'CZRG-SH5MM-24X48'}, location: 'AVAILABLE', store_id: store_id).first
  large_item = StoreItem.includes(:item).where(items: {sku: 'CZRG-SH5MM-48X48'}, location: 'AVAILABLE', store_id: store_id).first

  qty_to_spread = [qty_to_spread, medium_item.qty_available * 2].min

  return 'not enough to spread' if qty_to_spread < 2

  # reclassify as many as needed into the small size
  small_needs = qty_per_item - small_item.qty_on_hand
  small_needs = 0 if small_needs < 0 # set to 0 if that returned a negative value
  reclassify_to_small = [qty_to_spread, small_needs].min
  if reclassify_to_small >= 2 # must have 2 minimum
    reclassify_qty = (reclassify_to_small / 2).floor
    ItemLedgerEntry.item_reclassification(Store.find(store_id), {0 => {store_item_id: medium_item.id, qty: reclassify_qty}}, {0 => {item_id: small_item.item_id, location: "AVAILABLE", qty: (reclassify_qty * 2)}}, Date.current, 'Stock shuffler')
    qty_to_spread -= (reclassify_qty * 2)
  end

  # reclassify the rest into the large size
  if qty_to_spread >= 4 # must have minimum 4
    reclassify_qty = (qty_to_spread / 2).floor
    ItemLedgerEntry.item_reclassification(Store.find(store_id), {0 => {store_item_id: medium_item.id, qty: reclassify_qty}}, {0 => {item_id: large_item.item_id, location: "AVAILABLE", qty: (reclassify_qty / 2)}}, Date.current, 'Stock shuffler')
  end
end

#spread_small_cerazorb(qty_to_spread, store_id, qty_per_item) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'app/services/inventory/stock_shuffler.rb', line 33

def spread_small_cerazorb(qty_to_spread, store_id, qty_per_item)
  small_item = StoreItem.includes(:item).where(items: {sku: 'CZRG-SH5MM-24X24'}, location: 'AVAILABLE', store_id: store_id).first
  medium_item = StoreItem.includes(:item).where(items: {sku: 'CZRG-SH5MM-24X48'}, location: 'AVAILABLE', store_id: store_id).first
  large_item = StoreItem.includes(:item).where(items: {sku: 'CZRG-SH5MM-48X48'}, location: 'AVAILABLE', store_id: store_id).first

  qty_to_spread = [qty_to_spread, small_item.qty_available].min

  return 'not enough to spread' if qty_to_spread < 2

  # reclassify as many as needed into into the medium size
  medium_needs = qty_per_item - (medium_item.qty_on_hand * 2)
  medium_needs = 0 if medium_needs < 0 # set to 0 if that returned a negative value
  reclassify_to_medium = [qty_to_spread, medium_needs].min
  if reclassify_to_medium >= 2 # must have 2 minimum
    reclassify_qty = (reclassify_to_medium / 2).floor * 2
    ItemLedgerEntry.item_reclassification(Store.find(store_id), {0 => {store_item_id: small_item.id, qty: reclassify_qty}}, {0 => {item_id: medium_item.item_id, location: "AVAILABLE", qty: (reclassify_qty / 2)}}, Date.current, 'Stock shuffler')
    qty_to_spread -= reclassify_qty
  end

  # reclassify the rest into the large size
  if qty_to_spread >= 4 # must have minimum 4
    reclassify_qty = (qty_to_spread / 4).floor * 4
    ItemLedgerEntry.item_reclassification(Store.find(store_id), {0 => {store_item_id: small_item.id, qty: reclassify_qty}}, {0 => {item_id: large_item.item_id, location: "AVAILABLE", qty: (reclassify_qty / 4)}}, Date.current, 'Stock shuffler')
  end
end