feat(m02): 자재목록 세 칸 기본값 — 「일반」 지움 · 빈 칸 사급 · 별도계상 · 포함 · 별도계상이면 운반비 꺼짐(162-1)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SE9MxeXTu2uaDZ55BJowAY
This commit is contained in:
2026-10-09 23:49:25 +09:00
co-authored by Claude Opus 5.5
parent 35d6b68c41
commit 365fef4fd4
5 changed files with 73 additions and 23 deletions
+35 -1
View File
@@ -4,6 +4,8 @@
로직 자재 = 로직 줄 `자재표시 {호표 차례: 세 칸}`(차례가 재료 줄인 것만 · 틀려도 400 아님)
- 기준합 · 반영합 그대로 · 저장 왕복에 남음 · 화면 `normalizeLabor` 도 같은 규칙(Node 헬퍼)
- 화면 칸 부품 = 새 파일 · 사용자 줄 · 로직 줄 같은 칸 · 사전조합 줄엔 안 넘김(소스 검사)
- 162-1 = 「일반」 지움(관급 · 사급) · 빈 칸 = 읽을 때 기본(사급 · 별도계상 · 포함 · 저장은 비움) ·
옛 「일반」 = 사급으로 읽음 · 별도계상이면 운반비 드롭다운 꺼짐(값 그대로)
"""
import json
@@ -116,7 +118,7 @@ def _src(name):
def test_화면_칸_부품_사용자_줄_로직_줄_같은_칸():
marks = _src("M02_MasterTemplete_Labor_MatMarks.ts")
assert '{ value: "", text: "—" }' in marks
assert '"—"' not in marks # 「—」 항목 없음(162-1)
assert "e.stopPropagation()" in marks # 줄 누름과 따로
rows = _src("M02_MasterTemplete_Labor_Rows.ts")
assert "...markCells(mat, on?.mark" in rows and "...markHeads()," in rows
@@ -128,3 +130,35 @@ def test_화면_칸_부품_사용자_줄_로직_줄_같은_칸():
api = _src("M02_MasterTemplete_Labor_Api.ts")
for key, allowed in labor.MARKS.items():
assert f"{key}: [{', '.join(json.dumps(v, ensure_ascii=False) for v in allowed)}]" in api
def test_빈_칸_기본값_허용_값_그대로():
assert labor.MARK_DEFAULT == {"자재구분": "사급", "별도계상": "별도계상", "운반비": "포함"}
assert {k: labor.mark_of({}, k) for k in labor.MARKS} == labor.MARK_DEFAULT
assert {k: labor.mark_of(MARKS, k) for k in labor.MARKS} == MARKS
assert labor.mark_of(None, "운반비") == "포함"
def test_옛_일반은_사급으로_읽음():
assert "일반" not in labor.MARKS["자재구분"]
got = labor.clean(
_doc(
담은로직=[{"로직": NET, "자재표시": {"3": {"자재구분": "일반", "운반비": "미포함"}}}],
자재=[{"코드": WIRE, "자재구분": "일반"}],
)
)
assert got["담은로직"][0]["자재표시"] == {"3": {"운반비": "미포함"}} # 저장은 채우지 않음
assert "자재구분" not in got["자재"][0]
assert labor.mark_of(got["자재"][0], "자재구분") == "사급"
assert labor.mark_of({"자재구분": "일반"}, "자재구분") == "사급"
def test_화면_기본값_한_벌_운반비_꺼짐():
api = _src("M02_MasterTemplete_Labor_Api.ts")
for key, v in labor.MARK_DEFAULT.items():
assert f'{key}: "{v}",' in api.split("MAT_MARK_DEFAULT")[1].split("};")[0]
marks = _src("M02_MasterTemplete_Labor_MatMarks.ts")
assert "value[key] ?? MAT_MARK_DEFAULT[key]" in marks
assert 'picks.운반비.disabled = sep === "별도계상"' in marks
assert "haulOff(value.별도계상 ?? MAT_MARK_DEFAULT.별도계상)" in marks
assert '일반: "Mark_General"' not in marks