1
0

Simplify discount budget calculation

This commit is contained in:
Tim Kächele 2024-08-25 10:06:45 +02:00
parent f152e166f4
commit 1f3e21b711

View File

@ -5,59 +5,15 @@ module PlanetExpressExpress
end
def limit_discounts(shipments)
keys = shipments.keys
positions = Array.new(keys.length, 0)
shipments[:all].each do |month|
available_budget = @limit_per_month
# We expect all keys to have the same length
total_length = shipments[keys.first].length
for month in 0..(total_length - 1) do
reset_positions(positions)
budget = @limit_per_month
while true
# Find the next shipment
min_index = Float::INFINITY
next_val = nil # key_index
for key_index in 0..(keys.length - 1) do
current_position = positions[key_index]
shipment = shipments[keys[key_index]][month][current_position]
next if shipment.nil?
if shipment[:id] < min_index
next_val = key_index
min_index = shipment[:id]
end
end
break if next_val.nil?
# End find the next shipment
shipment = shipments[keys[next_val]][month][positions[next_val]]
positions[next_val] = positions[next_val] + 1
budget = apply_discount(budget, shipment)
end
end
end
private
attr_reader :limit_per_month
def apply_discount(available_budget, shipment)
month.each do |shipment|
if shipment[:discount] > available_budget
shipment[:discount] = available_budget
return 0
end
available_budget - shipment[:discount]
end
def reset_positions(positions)
for i in 0..(positions.length - 1) do
positions[i] = 0
available_budget = available_budget - shipment[:discount]
end
end
end
end