Files
Aislo/resources/tester/helper_m01_flow_c.cjs
T
eomsangdonandClaude Sonnet 5 f458da7f20 feat(M01): 로직 화면에 「새로 만들기」 단추 · 저장 뒤 방식 C 로 열기 · 테스트 컨테이너와 방식 A·B 화면 걷음
- 로직 화면 바의 새로 만들기 단추가 모달을 엶 · 저장·본떠 저장 뒤 새 자체 로직을 흐름 그림으로 바로 엶
- UI_Test* 다섯 파일 삭제 · 왼쪽 「테스트」 줄 제거 · 모달의 까닭 글은 UI_Logic_Text 것을 씀
- 견본 10개 키 목록은 시험(test_m01_test_container)으로 옮김 · 흐름 그림 시험의 옛 파일 이름을 바로잡음

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016WRFJmmhPi4exAzHgPZHMT
2026-09-21 09:57:17 +09:00

142 lines
5.2 KiB
JavaScript

/* M01 방식 C(흐름 그림) 뼈대 검증 헬퍼 — TS를 그 자리에서 트랜스파일해 Node로 돌린다.
* (프론트에 JS 테스트 러너가 없어 pytest가 이 스크립트를 부른다 — test_m01_flow_c.py)
* 확장자가 `.cjs` 인 까닭은 helper_b05_patch_skirt.cjs 머리말 참고(루트가 ESM). */
const fs = require("fs");
const path = require("path");
const ts = require(path.join(__dirname, "..", "..", "config", "node_modules", "typescript"));
const source = fs.readFileSync(
path.join(__dirname, "..", "..", "M01_MasterData", "M01_MasterData_UI_Logic_Flow_Model.ts"),
"utf8",
);
const js = ts.transpileModule(source, {
compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 },
}).outputText;
const moduleBox = { exports: {} };
new Function("exports", "module", "require", js)(moduleBox.exports, moduleBox, require);
const { buildFlow, logicRef } = moduleBox.exports;
/** 산림품셈 13-4-1 메쌓기 모양 — 표 찾기 하나 · 인력 두 줄 · 덧줄 하나(할증) */
const 메쌓기 = {
: "GF000219",
원문번호: "13-4-1",
이름: "돌쌓기 메쌓기(인력)",
결과단위: "원/㎡",
출처: "산림품셈 13-4-1",
입력: [
{ 이름: "뒷길이", 단위: "㎝", 고르기: [25, 30] },
{ 이름: "높이", 단위: "m" },
],
중간: [{ 이름: "증가율", : "찾기(QF000422, 높이=높이).증가율", 출처: "산림품셈 13-4-1 주③" }],
호표: [
{
종류: "인력",
요소: "LB000033",
이름: "석공",
단위: "인",
수량: "찾기(QF000421, 뒷길이=뒷길이).석공",
비목: "노무비",
},
{
종류: "로직",
요소: "로직(GC000268, 기계='2702-0020')",
이름: "굴착기",
단위: "시간",
수량: "1 / N",
비목: "경비",
},
],
덧줄: [{ 이름: "잡재료", : "노무비 * 0.03", 비목: "재료비", 출처: "산림품셈 13-4-1 주①" }],
끝수: null,
};
const = {
ok: true,
lines: [
{ 이름: "석공", 단위: "인", 수량: 1.2, 단가: 300000, 금액: 360000, 비목: { 노무비: 360000 } },
{ 이름: "굴착기", 단위: "시간", 수량: 0.5, 단가: 80000, 금액: 40000, 비목: { 경비: 40000 } },
{ 이름: "잡재료", 단위: "식", 수량: 1, 단가: 10800, 금액: 10800, 비목: { 재료비: 10800 } },
],
sums: { 노무비: 360000, 재료비: 10800, 경비: 40000, : 410800 },
middle: { 증가율: 15 },
};
/** 돈이 아닌 로직 — 결과 식 하나 */
const 작업량 = {
: "GF000118",
원문번호: "9-16-1",
이름: "노체포설 시간당 작업량",
결과단위: "㎥/hr",
출처: "산림품셈 9-16-1",
입력: [{ 이름: "토질", 고르기: ["보통토", "암괴"] }],
중간: [{ 이름: "E", : "찾기(QF000300, 토질=토질).E" }],
결과: { : "3600 * q * E / Cm" },
};
const kinds = (columns) => columns.map((c) => c.kind);
const box = (columns, kind, i) => columns.find((c) => c.kind === kind).boxes[i];
const out = {
logicRef: [logicRef("로직(GC000268, 기계='2702-0020')"), logicRef("LB000033") ?? null],
: kinds(buildFlow(메쌓기, , {}, { 뒷길이: "25" })),
칸_계산전: kinds(buildFlow(메쌓기, null, {}, {})),
칸_돈아님: kinds(buildFlow(작업량, { ok: true, result: 42.5, middle: { E: 0.8 } }, {}, {})),
};
{
const columns = buildFlow(메쌓기, , {}, { 뒷길이: "25", 높이: "4" });
const 입력 = box(columns, "입력", 0);
const 중간 = box(columns, "중간", 0);
const 수량 = box(columns, "수량", 0);
const 단가1 = box(columns, "단가", 0);
const 단가2 = box(columns, "단가", 1);
const 덧줄 = box(columns, "덧줄", 0);
const = box(columns, "계", 0);
const 비목 = columns.find((c) => c.kind === "비목").boxes;
out. = {
입력값: 입력.value,
입력출처: 입력.detail,
중간값: 중간.value,
중간식: 중간.detail[0],
수량값: 수량.value,
수량식: 수량.detail[0],
단가노트: 단가1.note,
단가값: 단가1.value,
로직: 단가2.logic ?? null,
로직아님: 단가1.logic ?? null,
덧줄값: 덧줄.value,
덧줄식: 덧줄.detail[0],
비목: 비목.map((b) => [b.label, b.value]),
비목상세: 비목.map((b) => b.detail),
계값: .value,
묶음: columns.find((c) => c.kind === "수량").boxes.map((b) => b.cost),
id: [수량.id, 단가1.id, 덧줄.id, .id],
};
}
{
const columns = buildFlow(메쌓기, null, { LB000033: null }, {});
out.계산전 = {
수량값: box(columns, "수량", 0).value,
수량식: box(columns, "수량", 0).detail[0],
단가막힘: box(columns, "단가", 0).bad === true,
계값: box(columns, "계", 0).value,
};
}
{
const columns = buildFlow(메쌓기, { ok: false, reason: "입력 없음" }, {}, {});
out.멈춤 = { : kinds(columns), 계값: box(columns, "계", 0).value };
}
{
const columns = buildFlow(작업량, { ok: true, result: 42.5, middle: { E: 0.8 } }, {}, {});
out.돈아님 = {
중간값: box(columns, "중간", 0).value,
결과값: box(columns, "계", 0).value,
결과식: box(columns, "계", 0).detail[0],
};
}
process.stdout.write(JSON.stringify(out));