@@ -11,56 +11,16 @@ def initialize(order_qty, order_item)
1111 end
1212
1313 def optimal ( product )
14- pack = @order_item . packs ( product )
15- # pack = @order_item.watermelon if product == 'watermelon'
16-
1714 pack_qtys = [ ]
18- pack . each do |p |
19- pack_qtys << [ p . qty , p . price ]
20- end
21-
22- # sort packs in descending order
23- p_desc = pack_qtys . sort { |a , b | b <=> a }
24-
25- whole_packs = [ ]
26- left_over_qty = order_qty
27-
28- # Find the # of largest size packs required to make up the qty
29- # If it's not exact, top it up with next largest packs, etc etc
30- p_desc . each do |p , v |
31- volume = left_over_qty . to_f / p
32-
33- next unless volume >= 1
34-
35- product = volume . to_int * p
36- left_over_qty -= product
15+ @order_item . packs ( product ) . each { |p | pack_qtys << [ p . qty , p . price ] }
3716
38- whole_packs << [ volume . to_int , p , v ]
39- end
40- # puts whole_packs.each
41-
42- # sort pack in ascending order
43- p_asc = pack_qtys . sort { |a , b | a <=> b }
17+ whole_packs = whole_packs ( pack_qtys , [ ] , order_qty )
4418
45- p_asc . each do |p , v |
46- break if left_over_qty . zero?
19+ return whole_packs [ 0 ] if whole_packs [ 1 ] . zero?
4720
48- if left_over_qty <= p
49- # Update qty of packs if entry already exists
50- whole_packs . map do |a |
51- a [ 0 ] += 1 if a [ 1 ] . to_i == p
52- left_over_qty = 0
53- end
21+ total_packs = left_over_items ( pack_qtys , whole_packs [ 0 ] , whole_packs [ 1 ] )
5422
55- next if whole_packs . detect { |a | a [ 1 ] == p }
56- # Otherwise, add a new entry to make up the qty
57- whole_packs << [ 1 , p , v ]
58- end
59-
60- next
61- end
62-
63- whole_packs
23+ total_packs [ 0 ]
6424 end
6525
6626 def present_line ( whole_packs )
@@ -75,13 +35,43 @@ def present_line(whole_packs)
7535
7636 puts "#{ @order_qty } #{ @order_item . name } #{ @line_total } "
7737
78- sub_item . each do |s |
79- puts s
80- end
38+ sub_item . each { |s | puts s }
8139 end
8240
8341 def total_quantity_of_items
84- # @order_qty * @line_total
8542 @line_total
8643 end
44+
45+ private
46+
47+ def whole_packs ( pack_qtys , packs , left_over_qty )
48+ pack_qtys . sort { |a , b | b <=> a } . each do |p , v |
49+ volume = left_over_qty . to_f / p
50+
51+ next unless volume >= 1
52+
53+ left_over_qty -= volume . to_int * p
54+
55+ packs << [ volume . to_int , p , v ]
56+ end
57+
58+ [ packs , left_over_qty ]
59+ end
60+
61+ def left_over_items ( pack_qtys , packs , left_over_qty )
62+ pack_qtys . sort { |a , b | a <=> b } . each do |p , v |
63+ break if left_over_qty . zero?
64+
65+ next unless left_over_qty <= p
66+
67+ packs . map { |a | a [ 0 ] += 1 if a [ 1 ] . to_i == p }
68+ left_over_qty = 0
69+
70+ next if packs . detect { |a | a [ 1 ] == p }
71+
72+ packs << [ 1 , p , v ]
73+ end
74+
75+ [ packs , left_over_qty ]
76+ end
8777end
0 commit comments