// 원본 수량산출(TFRMMULLANG) 공종 단위 조작 — 공종복사하기·붙여넣기(mnuCopy·mnuPaste)와 순서 이동. // 복사본은 현재 산출서 바로 아래에 넣고, 내역 이중 반영을 막기 위해 내역 연결을 비운다. const EstQuantitySheets = (() => { function copy(project, code, uid) { const sheets = project.quantitySheets || [], index = sheets.findIndex((sheet) => sheet.Code === code); if (index < 0) throw Error("복사할 수량산출서를 고르세요."); const used = new Set(sheets.map((sheet) => sheet.Code)); let next = `Q${uid}`; for (let n = 2; used.has(next); n++) next = `Q${uid}_${n}`; const sheet = structuredClone(sheets[index]); sheet.Code = next; sheet.Name = `${sheets[index].Name || sheets[index].Code} 복사본`; for (const item of sheet.items || []) { item.TargetCode = ""; item.TargetKey = ""; delete item.LinkCode; delete item.LinkIndex; } sheets.splice(index + 1, 0, sheet); return next; } function move(project, code, step) { const sheets = project.quantitySheets || [], index = sheets.findIndex((sheet) => sheet.Code === code), next = index + step; if (index < 0 || next < 0 || next >= sheets.length) return false; [sheets[index], sheets[next]] = [sheets[next], sheets[index]]; return true; } function handle(name, state) { const code = state.quantitySheet; if (name === "quantity-sheet-copy") { EstApp.change((project) => { state.quantitySheet = copy(project, code, EstApp.uid()); }, false); state.notice = "산출서를 복사했습니다. 복사본의 내역 연결은 비워 두었습니다."; } else if (name === "quantity-sheet-up" || name === "quantity-sheet-down") { const step = name === "quantity-sheet-up" ? -1 : 1, sheets = state.project.quantitySheets || [], index = sheets.findIndex((sheet) => sheet.Code === code); if (index < 0 || index + step < 0 || index + step >= sheets.length) throw Error("더 옮길 수 없습니다."); EstApp.change((project) => move(project, code, step), false); } else return false; return true; } return { copy, move, handle }; })();