// REA TFRMHALJUNGBIUL (0xdb4b14, 0xdb4d74, 0xdb4e70, 0xf5b7fc) // 일위대가 및 단가산출 공종(묶음) 내 할증계산 행 추가/적용 기능 const EstHalJung = (() => { const { num, components, units, floating } = EstMath; // REA cxRadioSize (불러올비목): 0=비목별, 1=재료비의, 2=노무비의, 3=경비의, 4=합계의 const sizeKinds = { 0: { text: "비목별", ocheck: 0 }, 1: { text: "재료비의", ocheck: 1 }, 2: { text: "노무비의", ocheck: 2 }, 3: { text: "경비의", ocheck: 3 }, 4: { text: "합계의", ocheck: 4 }, }; // REA cxRadioBimog (적용비목): 0=비목별, 1=재료비에, 2=노무비에, 3=경비에 const bimogKinds = { 0: { text: "비목별", scheck: 0 }, 1: { text: "재료비에", scheck: 1 }, 2: { text: "노무비에", scheck: 2 }, 3: { text: "경비에", scheck: 3 }, }; function apply( project, tableKey, groupCode, { name = "할 증", size = "비목별", rate = 0, sourceKind = 0, targetKind = 0 } = {}, ) { if (tableKey !== "HeadMainDat") { throw Error("일위대가 화면에서만 할증계산을 적용할 수 있습니다."); } const rateNum = num(rate); if (!Number.isFinite(rateNum) || rateNum === 0) { throw Error("할증 적용율(%)은 0이 아닌 유효한 숫자여야 합니다."); } const next = structuredClone(project); const rows = next.tables[tableKey] || []; const grps = EstNative.groups(rows); const group = grps.get(groupCode); if (!group) throw Error("공종(묶음)을 찾을 수 없습니다."); const sInfo = sizeKinds[sourceKind] || sizeKinds[0]; const bInfo = bimogKinds[targetKind] || bimogKinds[0]; const finalSize = size && size !== "비목별" ? size.trim() : sInfo.text; // REA 의도: 불러올비목이 특정 비목(1=재료비, 2=노무비, 3=경비)이고 적용비목이 비목별(targetKind=0)인 경우, // 원천 비목에 그대로 가산되도록 scheck를 원천 비목으로 맞춤. // (targetKind가 0이고 sourceKind가 0이면 비목별 행별로 각각 분배되므로 scheck=0 유지) const effectiveSCheck = targetKind === 0 && sourceKind >= 1 && sourceKind <= 3 ? sInfo.ocheck : bInfo.scheck; // REA LinkIndex 58 (비율) 행 생성 const haljungRow = { Index: 0, Level: 0, LinkIndex: 58, Name: name.trim() || "할 증", Size: finalSize, Unite: "%", GN: rateNum, SCheck: effectiveSCheck, OCheck: sInfo.ocheck, TU: 0, TC: 0, NC: 0, GC: 0, JC: 0, SC: 0, }; // 묶음 내 삽입 위치 찾기: // 소계(LinkIndex=51, 68)가 있으면 소계 바로 앞에, 없으면 묶음의 마지막 행 뒤에 삽입 const groupEnd = group.start + group.rows.length; let insertIndex = groupEnd; for (let i = group.start + 1; i < groupEnd; i++) { const link = num(rows[i].LinkIndex); if ([51, 68].includes(link)) { insertIndex = i; break; } } rows.splice(insertIndex, 0, haljungRow); return next.options?.AutoCalc === false ? next : EstNative.calculate(next); } return { sizeKinds, bimogKinds, apply, }; })();