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 +4 -4
- data/CHANGELOG.md +5 -0
- data/Gemfile.lock +1 -1
- data/README.md +15 -0
- data/lib/order_optimizer.rb +9 -5
- data/lib/order_optimizer/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f25c274ce34a9b081d2ed3430a0b4af3b54e88d026dd1b077feb71ff2b23acb9
|
4
|
+
data.tar.gz: 25156d5709294badef7138c805752c5e57900383a9b8a45ad77a5f9b717a1f04
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3f82d09e3a00941e261767fca66212461942c504867426f4e361f74292f03e2caf3770870fdad799e17d4c9d868ebb267382e8616e3a67727c1c68d25cdc544b
|
7
|
+
data.tar.gz: eaea4177612c87687a646a39d4ddf2233109c40cc0ad202e6755f6fd1832b9ac19a89d900d39a81a9079982230ed0bcf4568efc3a342e655e62c2ea9e77589e0
|
data/CHANGELOG.md
CHANGED
@@ -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
|
data/Gemfile.lock
CHANGED
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.
|
data/lib/order_optimizer.rb
CHANGED
@@ -10,18 +10,22 @@ class OrderOptimizer
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def cheapest_order(required_qty:)
|
13
|
-
|
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
|
-
|
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
|
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)
|
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
|
-
|
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
|
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.
|
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
|
13
|
+
date: 2020-12-11 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|