order_optimizer 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|