63 lines
2.4 KiB
TypeScript
63 lines
2.4 KiB
TypeScript
import {db} from "../../../../database/dbclient.js";
|
|
import {settings} from "../../../../database/schema/settings.js";
|
|
import {createLog} from "../../logger/logger.js";
|
|
|
|
export const lotRestriction = async (pallets: any, truckQty: number) => {
|
|
// get the settings so we have these.
|
|
const setting = await db.select().from(settings);
|
|
const maxLots = parseInt(setting.filter((n) => n.name === "maxLotPerTruck")[0].value);
|
|
// sort by production date so we can get the oldest ones first
|
|
pallets.sort((a: any, b: any) => new Date(a.productionDate).getTime() - new Date(b.productionDate).getTime());
|
|
|
|
// group all pallets by the lot numbers
|
|
const groupedByLotNum = pallets.reduce((acc: any, item: any) => {
|
|
if (!acc[item.lotNum]) {
|
|
acc[item.lotNum] = [];
|
|
}
|
|
acc[item.lotNum].push(item);
|
|
return acc;
|
|
}, {});
|
|
|
|
// select the oldest lots until we have 3 lots that meet or exceed 22 pallets
|
|
const selectedLots = [];
|
|
let totalPallets = 0;
|
|
|
|
// Sort lots by the oldest productionDate in each lot
|
|
const sortedLots = Object.keys(groupedByLotNum).sort((a, b) => {
|
|
return (
|
|
new Date(groupedByLotNum[a][0].productionDate).getTime() -
|
|
new Date(groupedByLotNum[b][0].productionDate).getTime()
|
|
);
|
|
});
|
|
|
|
for (const lotNum of sortedLots) {
|
|
// Add the current lot to the selection
|
|
selectedLots.push(lotNum);
|
|
totalPallets += groupedByLotNum[lotNum].length;
|
|
|
|
// If we have 3 lots, check if the total pallets meet or exceed 22
|
|
if (selectedLots.length === maxLots) {
|
|
if (totalPallets >= truckQty) {
|
|
// We have enough pallets, exit the loop
|
|
break;
|
|
} else {
|
|
// Remove the last added lot and try the next one
|
|
const removedLot = selectedLots.pop();
|
|
totalPallets -= groupedByLotNum[removedLot!].length;
|
|
}
|
|
}
|
|
}
|
|
|
|
// flatten the selected lots into a single array
|
|
let result = selectedLots.flatMap((lotNum) => groupedByLotNum[lotNum]);
|
|
|
|
// trim down to be only the the truck qty
|
|
if (result.length > truckQty) {
|
|
result = result.slice(0, truckQty);
|
|
}
|
|
|
|
createLog("info", "ocme", "ocme", `Total pallets: ${result.length}`);
|
|
createLog("info", "ocme", "ocme", `Unique lotNums:", ${new Set(result.map((pallet) => pallet.lotNum)).size}`);
|
|
return result;
|
|
};
|