export function returnSelections(task) { return (task?.items || []).filter(item => item.returnCartonId && ['SKU_LABEL', 'CARTON_AND_SKU', 'RETURN_BULK_SKU_LABEL'].includes(item.operationType)) } export function returnDeductions(task) { const rows = new Map() for (const item of returnSelections(task)) { const skus = item.operationType === 'RETURN_BULK_SKU_LABEL' ? [{ skuCode: item.skuCode, quantity: item.expectedPackages }] : item.skuItems || [] for (const sku of skus) { const key = `${item.cartonMark}::${sku.skuCode}` const row = rows.get(key) || { cartonMark: item.cartonMark, skuCode: sku.skuCode, quantity: 0 } row.quantity += Number(sku.quantity || 0); rows.set(key, row) } } return [...rows.values()] } export function requiresReturnPack(task) { const totals = new Map() for (const row of returnDeductions(task)) totals.set(row.cartonMark, (totals.get(row.cartonMark) || 0) + row.quantity) return returnSelections(task).some(item => !Number(item.returnQuantity) || totals.get(item.cartonMark) < Number(item.returnQuantity)) } export function returnPackFacts(task) { return (task?.history || []).filter(row => row.action === 'RETURN_PACK').flatMap(row => { try { const detail = typeof row.detail === 'string' ? JSON.parse(row.detail) : row.detail; return detail?.round === (task.reviewedAt || 'INITIAL') ? [detail] : [] } catch { return [] } }) }