export function defaultPackingBoxes(items) { return items.filter(item => Number(item.quantity) > 0).map(item => ({ quantities: { [item.skuCode]: Number(item.quantity) }, length: '', width: '', height: '', weight: '' })) } export function packingBoxPayload(box) { return { items: Object.entries(box.quantities || {}).filter(([, quantity]) => Number(quantity) > 0) .map(([skuCode, quantity]) => ({ skuCode, quantity: Number(quantity) })), length: Number(box.length), width: Number(box.width), height: Number(box.height), weight: Number(box.weight) } } export function validPackingAllocation(boxes, expected) { if (!boxes.length) return false const totals = {} for (const box of boxes) { const payload = packingBoxPayload(box) if (!payload.items.length || !['length', 'width', 'height', 'weight'].every(key => Number.isFinite(payload[key]) && payload[key] > 0)) return false for (const item of payload.items) { if (!Number.isSafeInteger(item.quantity) || item.quantity <= 0 || !Object.hasOwn(expected, item.skuCode)) return false totals[item.skuCode] = (totals[item.skuCode] || 0) + item.quantity } } return Object.entries(expected).filter(([, quantity]) => Number(quantity) > 0).every(([sku, quantity]) => totals[sku] === Number(quantity)) && Object.keys(totals).length === Object.values(expected).filter(quantity => Number(quantity) > 0).length }