cutAllocation = {
let usedStock = [];
let lastStockId = {};
for (let needed of d3.sort(cutsNeeded, (d) => -d.length)) {
for (let i = 0; i < needed.quantity; i++) {
const canFit = usedStock.filter(
(d) => d.size === needed.stock && d.remaining() >= needed.length
);
let byLeastRemaining = d3.sort(canFit, (d) => d.remaining());
const boardToCut = byLeastRemaining[0];
if (boardToCut?.remaining() >= needed.length) {
boardToCut.add(needed);
} else {
lastStockId[needed.stock] = (lastStockId[needed.stock] ?? 0) + 1;
let newStock = new StockPiece(needed.stock, lastStockId[needed.stock]);
newStock.add(needed);
usedStock.push(newStock);
}
}
}
return usedStock;
}