feat(stmate-test): 3차 화면·데이터 마무리 — 보호표시 · 공종번호 · 직종·노임 · 제비율표 편집 · 차수 칸 저장 · 계약 변환등록 = 울진 계약 STC · 장부 87.6%

- 시험 615 통과 · 브라우저 화면 13개·메뉴 90개 오류 0

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-13 21:00:14 +09:00
co-authored by Claude Opus 5.5
parent e8b76dd65b
commit ffc2401870
36 changed files with 1907 additions and 78 deletions
+5
View File
@@ -17,6 +17,8 @@
};
const codeOf = (r) => txt(r && r.CODE);
const OWN = { M: "MAMT", L: "LAMT", S: "SAMT" };
// 보호표시(wM_Boxa 「보호」 열 = 기초·견적단가 UC) — 일괄 손질에서 건너뜀(ui_dan.isProtected 와 같은 판정)
const isProtected = (r) => /^[MLSW]/.test(codeOf(r)) && txt(r.UC) === "T";
// 반올림·절사 — 소수 d 자리(음수 = 10^-d 원 단위)
function roundTo(v, d, mode) {
@@ -51,6 +53,7 @@
const c = codeOf(r);
if (!c || !opt.kinds.includes(c[0]) || (only && !only.has(c))) return;
if (num(r.NAGCD) > 0 && (Number(opt.from) === 2 || Number(opt.to) === 2)) return;
if (isProtected(r) && !opt.force) return;
const src = slotVals(r, opt.from);
const T0 = src.M + src.L + src.S;
if (opt.skipZero && !(T0 > 0)) return;
@@ -81,6 +84,7 @@
(rows || []).forEach((r) => {
const c = codeOf(r);
if (!c || !opt.kinds.includes(c[0]) || (only && !only.has(c))) return;
if (isProtected(r)) return;
const cur = slotVals(r, 1);
const curT = cur.M + cur.L + cur.S;
const base = num(r.AMT_61) || curT;
@@ -310,6 +314,7 @@
}
global.STMATE_UI_CODE_AMT = {
isProtected,
roundTo,
chgAmt,
halAll,