Files
Aislo/tools/est-test/native-new-estimate.js
T
eomsangdonandClaude Opus 5.5 b97ecf47de feat(est-test): 단가산출 전역변수·새내역서 파일로저장·산출서 삽입과 선택 삭제
- 전역변수:  표지 대입 변수를 호표 넘어 유지, 지정·해제, 목록·이동
- 새내역서 파일로저장: 당초값·신규 표시·당초 사본 지운 새 작업 따로 저장
- 수량산출서 삽입(공종명칭·규격)·선택공종 삭제

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 13:43:43 +09:00

55 lines
2.1 KiB
JavaScript

// 원본 「새내역서 파일로저장」(mnuSaveNewEst 0x113384c) — 현재 문서는 그대로 두고 설계변경 흔적을 지운 새 작업을 따로 저장.
// 표 12개(노임·자재·견적·표준·기계기준·기계 본문/호표·단산 본문/호표·일위 본문/호표·내역서)의 「_」로 끝나는 칸(당초값)을 비우고
// 신규 표시(NewItem)를 끄며, 원가 안전관리비 특례 줄(CalcIndex 4)은 1 로, 당초 사본(baseline)은 뺀다. 재계산 없음.
const EstNewEstimate = (() => {
const TABLES = [
"LaborcDat",
"StuffcDat",
"EstiMateDat",
"SilJukDat",
"MachGijunDat",
"MachMainDat",
"MachTitleDat",
"CostMainDat",
"CostTitleDat",
"HeadMainDat",
"HeadTitleDat",
"EstMainDat",
];
function build(project, name) {
const next = structuredClone(project);
delete next.id;
delete next.baseline;
next.name = name;
for (const table of TABLES)
for (const row of next.tables[table] || []) {
for (const key of Object.keys(row)) if (key.endsWith("_")) row[key] = null;
if ("NewItem" in row) row.NewItem = false;
}
for (const row of next.tables.Wonga || [])
if ((Number(row.CalcIndex) & 0xff) === 4) row.CalcIndex = 1;
return next;
}
async function run(state) {
const name = prompt("새 내역서 이름", `${state.project.name || "내역서"} (새 내역서)`)?.trim();
if (!name) return;
const result = await EstApp.api("/api/save", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(build(state.project, name)),
});
EstApp.download(`${result.name}.estweb.json`, JSON.stringify(result, null, 2));
state.notice = `새 내역서 「${result.name}」를 따로 저장했습니다. 지금 화면은 그대로입니다.`;
EstApp.render();
}
function handle(name, state) {
if (name !== "save-new-estimate") return false;
run(state).catch((error) => {
state.notice = error.message;
EstApp.render();
});
return true;
}
return { build, handle };
})();