Files
Aislo/tools/est-test/native-haljung.js

94 lines
3.2 KiB
JavaScript

// 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,
};
})();