order_optimizer 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f7582fc4c48f45ba73759ff312cc21a0bfe7731a5b109eafcb313c2c0930d435
4
- data.tar.gz: b10e675e41325916aede4dae3cbbc2f3dddc075bd0f0164daa5f61948c813c9c
3
+ metadata.gz: f25c274ce34a9b081d2ed3430a0b4af3b54e88d026dd1b077feb71ff2b23acb9
4
+ data.tar.gz: 25156d5709294badef7138c805752c5e57900383a9b8a45ad77a5f9b717a1f04
5
5
  SHA512:
6
- metadata.gz: 3b92cd98cbb49a93f5dd152673fca3e44d8ff531a6eae3fd87e1bd44c0bfeaebc02e580c69694da21069450dfae897a0ed641e2fe217b18a93a3d1ead28c4efd
7
- data.tar.gz: 1bb4af7ddd21d6bb5ddf22b18ed0b0e099609de555c3350837a84478b516a1f43adf2c0a58e818ca17abd443ce254dc862596661d77f8b5d46937d8f9f5b1a05
6
+ metadata.gz: 3f82d09e3a00941e261767fca66212461942c504867426f4e361f74292f03e2caf3770870fdad799e17d4c9d868ebb267382e8616e3a67727c1c68d25cdc544b
7
+ data.tar.gz: eaea4177612c87687a646a39d4ddf2233109c40cc0ad202e6755f6fd1832b9ac19a89d900d39a81a9079982230ed0bcf4568efc3a342e655e62c2ea9e77589e0
@@ -1,5 +1,10 @@
1
1
  # OrderOptimizer Gem Changelog
2
2
 
3
+ ## 0.4.0 (2020-12-11)
4
+
5
+ - Add `possible_orders` method to find all possible orders
6
+ - Fix issues with zero remainders on calculations
7
+
3
8
  ## 0.3.0 (2020-11-23)
4
9
 
5
10
  - Add `cheapest_exact_order` method to optimize an order with an exact amount
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- order_optimizer (0.3.0)
4
+ order_optimizer (0.4.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -100,6 +100,21 @@ order_optimizer.cheapest_order(required_qty: 29).skus
100
100
  #=> { '20-pack' => 1, '10-discount' => 10 }
101
101
  ```
102
102
 
103
+ If you're just interested in all possible order combinations:
104
+
105
+ ```ruby
106
+ # Initialize the optimize with a catalog
107
+ order_optimizer = OrderOptimizer.new(
108
+ '1-pack' => { quantity: 1, price_per_unit: 9 },
109
+ '10-pack' => { quantity: 10, price_per_unit: 5 },
110
+ )
111
+
112
+ order_optimizer.possible_orders(required_qty: 11).size
113
+ #=> 3
114
+ order_optimizer.possible_orders(required_qty: 10).map(&:skus)
115
+ #=> [{"10-pack"=>1, "1-pack"=>1}, {"1-pack"=>11}, {"10-pack"=>2}]
116
+ ```
117
+
103
118
  ## Development
104
119
 
105
120
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -10,18 +10,22 @@ class OrderOptimizer
10
10
  end
11
11
 
12
12
  def cheapest_order(required_qty:)
13
- possible_orders(skus: @catalog.skus, required_qty: required_qty).min_by(&:total) ||
13
+ find_possible_orders(skus: @catalog.skus, required_qty: required_qty).min_by(&:total) ||
14
14
  OrderOptimizer::Order.new(required_qty: required_qty)
15
15
  end
16
16
 
17
17
  def cheapest_exact_order(required_qty:)
18
- possible_orders(skus: @catalog.skus, required_qty: required_qty).select(&:exact?).min_by(&:total) ||
18
+ find_possible_orders(skus: @catalog.skus, required_qty: required_qty).select(&:exact?).min_by(&:total) ||
19
19
  OrderOptimizer::Order.new(required_qty: required_qty)
20
20
  end
21
21
 
22
+ def possible_orders(required_qty:)
23
+ find_possible_orders(skus: @catalog.skus, required_qty: required_qty).sort_by(&:total)
24
+ end
25
+
22
26
  private
23
27
 
24
- def possible_orders(required_qty:, skus:)
28
+ def find_possible_orders(required_qty:, skus:)
25
29
  return [] if required_qty < 1 || skus.empty?
26
30
 
27
31
  orders = []
@@ -31,7 +35,7 @@ class OrderOptimizer
31
35
  count, remainder = count_and_remainder_for_sku(order.missing_qty, sku)
32
36
 
33
37
  orders << order.dup.add(sku, count: count) unless count.zero?
34
- orders << order.dup.add(sku, count: count + 1) if remainder
38
+ orders << order.dup.add(sku, count: count + 1) unless remainder.zero?
35
39
  end
36
40
 
37
41
  count, remainder = count_and_remainder_for_sku(required_qty, sku)
@@ -40,7 +44,7 @@ class OrderOptimizer
40
44
  orders << OrderOptimizer::Order.new(required_qty: required_qty).add(sku, count: count)
41
45
  end
42
46
 
43
- if remainder
47
+ unless remainder.zero?
44
48
  orders << OrderOptimizer::Order.new(required_qty: required_qty).add(sku, count: count + 1)
45
49
  end
46
50
  end
@@ -1,3 +1,3 @@
1
1
  class OrderOptimizer
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: order_optimizer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - crispymtn
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2020-11-23 00:00:00.000000000 Z
13
+ date: 2020-12-11 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler