fix(740-1): 747-1 겹침 맞춤 — SK 를 일위대가 줄로 펼칠 때 바탕 재료 별도계상 빈 칸 = 직접계산 적어 둠

- 까닭: 747-1 뒤 SK 셈은 바탕 재료 빈 칸 = 직접계산 · 일위대가 줄(덮개 줄 line=True)은 별도계상 기본 → 펼친 줄이 재료비를 잃음(합판거푸집 GC000211 SK 를 일위대가에 넣으면 금액 줄어듦)
- Library_Flat.sk_line: 바탕 재료 줄마다 자재표시 {별도계상: 직접계산} + 고른 두 칸 그대로
- 지킴 시험: 740-1 에 747 겹침(덮개 있음 · 없음 두 갈래 전후 금액 같음 · 고치기 전 실패 확인)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-02 21:44:49 +09:00
co-authored by Claude Opus 5.5
parent 2b460854ba
commit bf7f31fa63
2 changed files with 25 additions and 0 deletions
+6
View File
@@ -302,6 +302,7 @@ def compose(under: dict, over: dict, whole: Any) -> dict:
def sk_line(y: dict, one: dict, whole: Any, tag: dict) -> dict:
"""펼친 SK → 일위대가 로직 줄 하나(+ 패치) — 옛 참조 줄 `one` 의 별칭 · 메모 · 수량 · 패치
이어받음."""
from M02_MasterTemplete import M02_Labor_Doc as labor
from M02_MasterTemplete import M02_Labor_Patch as patch
from M02_MasterTemplete import M02_Sangeun_Calc as calc
@@ -328,6 +329,11 @@ def sk_line(y: dict, one: dict, whole: Any, tag: dict) -> dict:
for name in ("고름", "자재표시"):
if got := {at[c]: v for c, v in (y.get(name) or {}).items() if c in at}:
line[name] = got
shown = line.get("자재표시") or {}
for n, item in enumerate(row.get("호표") or []): # 747-1 SK 재료 빈 칸 = 직접계산 → 적어 둠
if item.get("종류") == "재료":
shown[str(n)] = {"별도계상": "직접계산", **labor.marks(shown.get(str(n)))}
line |= {"자재표시": shown} if shown else {}
if y.get("켜쌓기율") is not None:
line["켜쌓기율"] = y["켜쌓기율"]
return {**line, **({patch.FIELD: body} if body else {}), "본뜬": tag}
@@ -372,3 +372,22 @@ def test_B09_SC_덮개_줄_대가_금액_M02_같음(world, tmp_path):
block = _b09(root, cover_qty)[1][daega["libs"][made["폴더"]]]
assert block["blank"] == 0
assert block["sum"] == pytest.approx(m02, abs=5) # 끝수(내림)만 다름
def test_747_SK_재료_직접계산_일위대가에_넣어도_같은_금액(world):
"""747-1 SK 바탕 재료 = 직접계산 · 일위대가 줄 기본 = 별도계상 → 펼친 줄에 적어 둠."""
me = world["personal"]
form = "GC000211" # 합판거푸집 — 재료 줄 있음
plain = _make(me, "sangeun", 이름="거푸집", 바탕={"로직": form})
cover = {"material:합판(내수 12㎜)#0": {"qty": 2}}
covered = _make(me, "sangeun", 이름="거푸집 고침", 바탕={"로직": form}, 덮개=cover)
for sk in (plain, covered):
lines = [{"참조": {**MINE, "키": sk}}]
old = _raw(me, "precombo", 이름="옛", 담은로직=lines)
before = _sc_value(me, old)
host = _make(me, "precombo", 이름="새", 담은로직=lines)
line = _read(me, "precombo", host)["담은로직"][0]
assert line["자재표시"] and all(
v["별도계상"] == "직접계산" for v in line["자재표시"].values()
)
assert _sc_value(me, host) == pytest.approx(before, rel=1e-9)