function canPreserveSpecial(parts, title, num) { const sequences = new Set(parts.map((part) => part.F_SEQ)); return ( parts.length > 0 && sequences.size === parts.length && parts.every((part) => Boolean(part.F_SEQ)) && [ ["F_MCOST", "F_MPRICE"], ["F_LCOST", "F_LPRICE"], ["F_ECOST", "F_EPRICE"], ].every( ([field, total]) => Math.abs(parts.reduce((sum, part) => sum + num(part[field]), 0) - num(title[total])) < 1e-6, ) ); } function fixedSpecialPart(part, source, pk, num) { const GC = num(part.F_MCOST), NC = num(part.F_LCOST), JC = num(part.F_ECOST); return { PkID: pk, Index: 0, Code: source ? part.F_CODE1 : "", JdlSourceCode: part.F_CODE1, Name: part.F_DES, Size: part.F_SIZE, Unite: part.F_UNIT, LinkIndex: source?.kind || 0, CalcIndex: 1, JdlSummary: true, GN: num(part.F_QQTY), GC, NC, JC, SC: 0, TC: GC + NC + JC, }; } module.exports = { canPreserveSpecial, fixedSpecialPart };