Files
Aislo/resources/tester/helper_stmate_ilwi.cjs
T
eomsangdonandClaude Opus 5.5 3d8fddfc34 feat(stmate-test): 보고서·제잡비·식언어·수량산출·화면 묶음 합침 · 재계산 후 저장 무변경
- 보고서: 원본 STMATE 엑셀과 셀 대조(목록표·자재단가대비·중기·일위대가·산근 목록·설계내역서·원가계산서) · 조달청 XML 공식 XSD 검증 · PM_Prt 화면
- 제잡비: 원본 계산 순서 4형식(T/S/TA/SA) · 실무 7건 저장 결과키 전수 1원 · 요율표 조회 · 선택지 계산 · 제잡비·제비율 화면
- 식언어·수량: 함수·조건식·금액변수·문법 검사·수량변수·QCODE · 산근·구성·중기공식 편집 화면 · 순환 알림
- 화면: 원본 메뉴 체계·단축키 · 설계내역서 편집(행 넣기·지우기·이동·레벨·보관함) · 초기값 · 단가목록표
- 저장: 초기값(Start8x.Ini) 바뀐 키 저장 · 노임 환산 직종 = 초기값 CONLD · 산근·구성 결과에 적용단가 칸 채우지 않음(원본 0)
- DBF 글 칸 앞 빈칸 보존 · 시험 도우미 표준입력 utf8(한글 조각 깨짐 원인)
- 실무 5건 재계산 후 저장 = 바뀐 칸 0 · 시험 332건 통과

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

37 lines
1.4 KiB
JavaScript

// STMATE 재현 앱 일위대가(B)·중기(X) 조립 — stdin {costn_rows, bdqty_rows, start_ini}
const E = require("../../tools/stmate-test/smt_eval.js");
let buf = "";
process.stdin.setEncoding("utf8");
process.stdin.on("data", (d) => (buf += d));
process.stdin.on("end", () => {
const d = JSON.parse(buf);
const ini = d.start_ini || {};
const by = {};
for (const r of d.costn_rows) by[r.CODE.trim()] = r;
const slot = (r) => (Number(r.NAGCD) > 0 ? 2 : 1);
const lookup = (c) => {
const r = by[c];
if (!r) return null;
const s = slot(r);
return { M: +r[`MAMT${s}`], L: +r[`LAMT${s}`], S: +r[`SAMT${s}`], unit: r.UNIT };
};
const conld = String(ini.CONLD || "");
const labor = new Set(conld.match(/.{1,6}/g) || []);
const groups = {};
for (const r of d.bdqty_rows) (groups[r.BDCODE] = groups[r.BDCODE] || []).push(r);
const out = {};
for (const [parent, rows] of Object.entries(groups)) {
if (!by[parent] || !/^[BX]/.test(parent)) continue;
const ev = E.evaluateComposition(rows, lookup, {
totalFirst: parent[0] === "B" && String(ini.CHBNM ?? "1") === "0",
order: ini.OPTNM || "SML",
sbmok: String(by[parent].SBMOK || "").trim(),
labor: parent[0] === "X" ? labor : null,
rx: ini.RXXNM,
usdRate: ini.EXLNM1,
});
out[parent] = [ev.M, ev.L, ev.S];
}
process.stdout.write(JSON.stringify(out));
});