order_optimizer 0.2.1 → 0.3.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: c7436b34e3961c7cb835d33eb4212ce823fc050d362af7b3297eb80a2a5dda77
4
- data.tar.gz: 366e5d4ba6d0fb9772a982ec0aeccf6aba82cc3e8bb79237954afdfebc42a5da
3
+ metadata.gz: f7582fc4c48f45ba73759ff312cc21a0bfe7731a5b109eafcb313c2c0930d435
4
+ data.tar.gz: b10e675e41325916aede4dae3cbbc2f3dddc075bd0f0164daa5f61948c813c9c
5
5
  SHA512:
6
- metadata.gz: cf15bc0ee13c1f1c244b9d5a54b7271f1f6fee150305411bab9f18353d80f701e148c86eeda665ab555222f4a0cd10f5a8370d18910f190dc886080fc0883e03
7
- data.tar.gz: 0aa94e6ce45593754e611376e9a29389caa3ae1d167f3406d7ef232a0906918802dc6515bff0f63cc3d8830d5d863c1ed316f6197457719c2aa974afc7a3051b
6
+ metadata.gz: 3b92cd98cbb49a93f5dd152673fca3e44d8ff531a6eae3fd87e1bd44c0bfeaebc02e580c69694da21069450dfae897a0ed641e2fe217b18a93a3d1ead28c4efd
7
+ data.tar.gz: 1bb4af7ddd21d6bb5ddf22b18ed0b0e099609de555c3350837a84478b516a1f43adf2c0a58e818ca17abd443ce254dc862596661d77f8b5d46937d8f9f5b1a05
@@ -1,5 +1,9 @@
1
1
  # OrderOptimizer Gem Changelog
2
2
 
3
+ ## 0.3.0 (2020-11-23)
4
+
5
+ - Add `cheapest_exact_order` method to optimize an order with an exact amount
6
+
3
7
  ## 0.2.1 (2019-12-18)
4
8
 
5
9
  - Improve result for mixed catalogs with discounts and multiple pack sizes
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- order_optimizer (0.2.1)
4
+ order_optimizer (0.3.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -19,4 +19,4 @@ DEPENDENCIES
19
19
  rake
20
20
 
21
21
  BUNDLED WITH
22
- 2.0.2
22
+ 2.1.4
data/README.md CHANGED
@@ -56,6 +56,22 @@ cheapest_order_for_947_units.total # => 3_900.00
56
56
  cheapest_order_for_947_units.skus # => { '1000-pack' => 1 }
57
57
  ```
58
58
 
59
+ You can also optimize your order for exact order amounts
60
+
61
+ ```ruby
62
+ # Initialize the optimize with a catalog
63
+ order_optimizer = OrderOptimizer.new(
64
+ '1-pack' => { quantity: 1, price_per_unit: 9 },
65
+ '10-pack' => { quantity: 10, price_per_unit: 5 },
66
+ )
67
+
68
+ # Pick the cheapest order that includes the exact required quantity
69
+ cheapest_exact_order_for_58_units = order_optimizer.cheapest_exact_order(required_qty: 56)
70
+ cheapest_exact_order_for_58_units.quantity # => 58
71
+ cheapest_exact_order_for_58_units.total # => 322
72
+ cheapest_exact_order_for_58_units.skus # => { '10-pack' => 5, '1-pack' => 8 }
73
+ ```
74
+
59
75
  It is possible to define dicount prices a minimum quantity:
60
76
 
61
77
  ```ruby
@@ -10,8 +10,13 @@ class OrderOptimizer
10
10
  end
11
11
 
12
12
  def cheapest_order(required_qty:)
13
- possible_orders(skus: @catalog.skus, required_qty: required_qty)
14
- .min_by(&:total) || OrderOptimizer::Order.new(required_qty: required_qty)
13
+ possible_orders(skus: @catalog.skus, required_qty: required_qty).min_by(&:total) ||
14
+ OrderOptimizer::Order.new(required_qty: required_qty)
15
+ end
16
+
17
+ def cheapest_exact_order(required_qty:)
18
+ possible_orders(skus: @catalog.skus, required_qty: required_qty).select(&:exact?).min_by(&:total) ||
19
+ OrderOptimizer::Order.new(required_qty: required_qty)
15
20
  end
16
21
 
17
22
  private
@@ -34,6 +39,7 @@ class OrderOptimizer
34
39
  unless count.zero?
35
40
  orders << OrderOptimizer::Order.new(required_qty: required_qty).add(sku, count: count)
36
41
  end
42
+
37
43
  if remainder
38
44
  orders << OrderOptimizer::Order.new(required_qty: required_qty).add(sku, count: count + 1)
39
45
  end
@@ -23,5 +23,9 @@ class OrderOptimizer
23
23
  def complete?
24
24
  missing_qty.zero?
25
25
  end
26
+
27
+ def exact?
28
+ @required_qty == quantity
29
+ end
26
30
  end
27
31
  end
@@ -1,3 +1,3 @@
1
1
  class OrderOptimizer
2
- VERSION = "0.2.1"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -6,7 +6,7 @@ Gem::Specification.new do |spec|
6
6
  spec.name = "order_optimizer"
7
7
  spec.version = OrderOptimizer::VERSION
8
8
 
9
- spec.authors = ["crispymtn", "Martin Spickermann"]
9
+ spec.authors = ["crispymtn", "Martin Spickermann", "Maurice Vogel"]
10
10
  spec.email = ["op@crispymtn.com", "spickermann@gmail.com"]
11
11
  spec.homepage = "https://github.com/crispymtn/order_optimizer"
12
12
  spec.license = "MIT"
metadata CHANGED
@@ -1,15 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: order_optimizer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - crispymtn
8
8
  - Martin Spickermann
9
+ - Maurice Vogel
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2019-12-19 00:00:00.000000000 Z
13
+ date: 2020-11-23 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: bundler
@@ -100,7 +101,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
100
101
  - !ruby/object:Gem::Version
101
102
  version: '0'
102
103
  requirements: []
103
- rubygems_version: 3.0.6
104
+ rubygems_version: 3.1.2
104
105
  signing_key:
105
106
  specification_version: 4
106
107
  summary: Helps to optimize orders if the goods are offered in different pack sizes