94 lines
3.2 KiB
JavaScript
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,
|
|
};
|
|
})();
|