/* M02 항목 목록(`M02_MasterTemplete_ItemList.ts`) 칸 · 찾기 · 쪽 단위검증 헬퍼 — 트랜스파일해 Node 로 돌리고 * JSON 으로 냄. 화면 부품(ui_template · M01 머리 · css)은 빈 것으로 갈음 · 나무 자료(`TreePanel_Model`)는 진짜. */ const fs = require("fs"); const path = require("path"); const ts = require(path.join(__dirname, "..", "..", "config", "node_modules", "typescript")); const M02 = path.join(__dirname, "..", "..", "M02_MasterTemplete"); const load = (name, stubs) => { const js = ts.transpileModule(fs.readFileSync(path.join(M02, name), "utf8"), { compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 }, }).outputText; const box = { exports: {} }; const need = (id) => (id in stubs ? stubs[id] : {}); new Function("exports", "module", "require", js)(box.exports, box, need); return box.exports; }; const model = load("M02_MasterTemplete_TreePanel_Model.ts", {}); const m = load("M02_MasterTemplete_ItemList.ts", { "./M02_MasterTemplete_TreePanel_Model": model, }); const row = (열, 경로, extra = {}) => ({ key: `SS-${열}`, 열, 경로, 이름: 경로.join(" "), 단위: "m", 도번: `SD-${열}`, 면적번: `SA-${열}`, 수정일: { structure: "2026-10-01T09:00:00", area: "2026-10-03T10:00:00" }, labor: null, ...extra, }); const rows = [ row("c1", ["기슭막이", "메쌓기", "1.2m"], { labor: { 번호: "SU-000001", 로직수: 3, 합계: 1234567.4, 기준: 99, 단위: "개소" }, 수정일: { structure: "2026-10-01T09:00:00", labor: "2026-10-04T11:00:00" }, }), row("c2", ["기슭막이", "찰쌓기"], { labor: { 번호: "SU-000002", 로직수: 0, 합계: null } }), row("c3", ["옹벽"], { 도번: "", 수정일: {} }), ]; const cells = (kind) => rows.map((r) => m.ITEM_COLS[kind].map((c) => c.get(r))); const many = Array.from({ length: 65 }, (_, i) => row(`n${i}`, ["배수", `측구 ${i}`])); process.stdout.write( JSON.stringify({ heads: Object.fromEntries( Object.entries(m.ITEM_COLS).map(([k, cols]) => [k, cols.map((c) => c.head)]), ), cells: { structure: cells("structure"), area: cells("area"), labor: cells("labor"), item: cells("item"), }, find: m.pageOf(rows, m.ITEM_COLS.structure, "기슭 찰", 1).shown.map((r) => r.열), findLabor: m.pageOf(rows, m.ITEM_COLS.labor, "SU-000001", 1).shown.map((r) => r.열), findNone: m.pageOf(rows, m.ITEM_COLS.structure, "없는말", 1), page3: (({ page, total, shown }) => ({ page, total, n: shown.length }))( m.pageOf(many, m.ITEM_COLS.structure, "", 3), ), pageOver: m.pageOf(many, m.ITEM_COLS.structure, "", 9).page, pageEmpty: m.pageOf([], m.ITEM_COLS.structure, "", 2).page, // 그 부분 문서 없는 줄(39-8 H3) — c1 = 일위대가 있음 · 면적 수정일 없음 · c3 = 수정일 · 일위대가 없음 sums: [ rows[0], // 반영 합 있음 { labor: { 로직수: 14, 합계: 0, 기준: 167746.6 } }, // 수량 없음 = 기준 rows[1], // 담은 로직 0 { labor: { 로직수: 2, 합계: null, 기준: null } }, // 계산값 없음 rows[2], // 일위대가 없음 ].map((r) => m.laborSum(r)), missing: ["structure", "area", "labor", "item"].map((k) => rows.map((r) => m.missingPart(k, r)), ), }), );