public List <Shipment> OptimizeSingleGroup(IShipment shipment) { decimal MAXWEIGHT = 70; // Set Max Weight for Ground Services if (Settings.ServiceCode == (int)ServiceType.FEDEXGROUND || Settings.ServiceCode == (int)ServiceType.GROUNDHOMEDELIVERY) { MAXWEIGHT = 150; } var result = new List <Shipment>(); var itemsToSplit = new List <IShippable>(); foreach (var item in shipment.Items) { if (IsOversized(item)) { var s1 = Shipment.CloneAddressesFromInterface(shipment); s1.Items.Add(item.CloneShippable()); result.Add(s1); } else { itemsToSplit.Add(item); } } IShippable tempPackage = new Shippable(); foreach (var pak in itemsToSplit) { if (MAXWEIGHT - tempPackage.BoxWeight >= pak.BoxWeight) { // add to current box tempPackage.BoxWeight += pak.BoxWeight; tempPackage.QuantityOfItemsInBox += pak.QuantityOfItemsInBox; tempPackage.BoxValue += pak.BoxValue; } else { // Save the temp package if it has items if (tempPackage.BoxWeight > 0 || tempPackage.QuantityOfItemsInBox > 0) { var s2 = Shipment.CloneAddressesFromInterface(shipment); s2.Items.Add(tempPackage.CloneShippable()); result.Add(s2); tempPackage = new Shippable(); } // create new box if (pak.BoxWeight > MAXWEIGHT) { //Loop to break up > maxWeight Packages var currentItemsInBox = pak.QuantityOfItemsInBox; var currentWeight = pak.BoxWeight; while (currentWeight > 0) { if (currentWeight > MAXWEIGHT) { var newP = pak.CloneShippable(); newP.BoxWeight = MAXWEIGHT; if (currentItemsInBox > 0) { currentItemsInBox -= 1; newP.QuantityOfItemsInBox = 1; } var s3 = Shipment.CloneAddressesFromInterface(shipment); s3.Items.Add(newP.CloneShippable()); result.Add(s3); currentWeight = currentWeight - MAXWEIGHT; if (currentWeight < 0) { currentWeight = 0; } } else { // Create a new shippable box var newP = pak.CloneShippable(); newP.BoxWeight = currentWeight; if (currentItemsInBox > 0) { newP.QuantityOfItemsInBox = currentItemsInBox; } var s4 = Shipment.CloneAddressesFromInterface(shipment); s4.Items.Add(newP.CloneShippable()); result.Add(s4); currentWeight = 0; } } } else { tempPackage = pak.CloneShippable(); } } } // Save the temp package if it has items if (tempPackage.BoxWeight > 0 || tempPackage.QuantityOfItemsInBox > 0) { var s5 = Shipment.CloneAddressesFromInterface(shipment); s5.Items.Add(tempPackage.CloneShippable()); result.Add(s5); tempPackage = new Shippable(); } return(result); }
private List <IShippable> OptimizeSingleGroup(IShipment shipment) { const decimal MAXWEIGHT = 70; var result = new List <IShippable>(); var itemsToSplit = new List <IShippable>(); foreach (var item in shipment.Items) { if (IsOversized(item)) { result.Add(item.CloneShippable()); } else { itemsToSplit.Add(item); } } IShippable tempPackage = new Shippable(); foreach (var pak in itemsToSplit) { if (MAXWEIGHT - tempPackage.BoxWeight >= pak.BoxWeight) { // add to current box tempPackage.BoxWeight += pak.BoxWeight; tempPackage.QuantityOfItemsInBox += pak.QuantityOfItemsInBox; tempPackage.BoxValue += pak.BoxValue; } else { // Save the temp package if it has items if (tempPackage.BoxWeight > 0 || tempPackage.QuantityOfItemsInBox > 0) { result.Add(tempPackage.CloneShippable()); tempPackage = new Shippable(); } // create new box if (pak.BoxWeight > MAXWEIGHT) { //Loop to break up > maxWeight Packages var currentItemsInBox = pak.QuantityOfItemsInBox; var currentWeight = pak.BoxWeight; while (currentWeight > 0) { if (currentWeight > MAXWEIGHT) { var newP = pak.CloneShippable(); newP.BoxWeight = MAXWEIGHT; if (currentItemsInBox > 0) { currentItemsInBox -= 1; newP.QuantityOfItemsInBox = 1; } result.Add(newP); currentWeight = currentWeight - MAXWEIGHT; if (currentWeight < 0) { currentWeight = 0; } } else { // Create a new shippable box var newP = pak.CloneShippable(); newP.BoxWeight = currentWeight; if (currentItemsInBox > 0) { newP.QuantityOfItemsInBox = currentItemsInBox; } result.Add(newP); currentWeight = 0; } } } else { tempPackage = pak.CloneShippable(); } } } // Save the temp package if it has items if (tempPackage.BoxWeight > 0 || tempPackage.QuantityOfItemsInBox > 0) { result.Add(tempPackage.CloneShippable()); tempPackage = new Shippable(); } return(result); }
public List <IShippable> OptimizePackagesToMaxWeight(IShipment shipment) { var result = new List <IShippable>(); var itemsToSplit = new List <IShippable>(); // drop off oversize items right away foreach (var item in shipment.Items) { if (IsOversized(item)) { result.Add(item.CloneShippable()); } else { itemsToSplit.Add(item); } } IShippable tempPackage = new Shippable(); foreach (var pak in itemsToSplit) { if (_MaxWeight - tempPackage.BoxWeight >= pak.BoxWeight) { // add to current box tempPackage.BoxWeight += pak.BoxWeight; tempPackage.QuantityOfItemsInBox += pak.QuantityOfItemsInBox; tempPackage.BoxValue += pak.BoxValue; } else { // Save the temp package if it has items if (tempPackage.BoxWeight > 0 || tempPackage.QuantityOfItemsInBox > 0) { result.Add(tempPackage.CloneShippable()); tempPackage = new Shippable(); } // create new box if (pak.BoxWeight > _MaxWeight) { //Loop to break up > maxWeight Packages var currentItemsInBox = pak.QuantityOfItemsInBox; var currentWeight = pak.BoxWeight; while (currentWeight > 0) { if (currentWeight > _MaxWeight) { var newP = pak.CloneShippable(); newP.BoxWeight = _MaxWeight; if (currentItemsInBox > 0) { currentItemsInBox -= 1; newP.QuantityOfItemsInBox = 1; } result.Add(newP); currentWeight = currentWeight - _MaxWeight; if (currentWeight < 0) { currentWeight = 0; } } else { // Create a new shippable box var newP = pak.CloneShippable(); newP.BoxWeight = currentWeight; if (currentItemsInBox > 0) { newP.QuantityOfItemsInBox = currentItemsInBox; } result.Add(newP); currentWeight = 0; } } } else { tempPackage = pak.CloneShippable(); } } } // Save the temp package if it has items if (tempPackage.BoxWeight > 0 || tempPackage.QuantityOfItemsInBox > 0) { result.Add(tempPackage.CloneShippable()); tempPackage = new Shippable(); } return(result); }