order_optimizer 0.2.1 → 0.3.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 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