Class: Inventory::StockShuffler
- Inherits:
-
BaseService
- Object
- BaseService
- Inventory::StockShuffler
- Defined in:
- app/services/inventory/stock_shuffler.rb
Instance Method Summary collapse
- #process(store_ids = [1,2]) ⇒ Object
- #shuffle_cerazorb(store_id) ⇒ Object
- #spread_large_cerazorb(qty_to_spread, store_id, qty_per_item) ⇒ Object
- #spread_medium_cerazorb(qty_to_spread, store_id, qty_per_item) ⇒ Object
- #spread_small_cerazorb(qty_to_spread, store_id, qty_per_item) ⇒ Object
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 |