From bf7f31fa636bee48dd98f1d01d82218a21820c5a Mon Sep 17 00:00:00 2001 From: umsangdon Date: Mon, 2 Nov 2026 21:44:49 +0900 Subject: [PATCH] =?UTF-8?q?fix(740-1):=20747-1=20=EA=B2=B9=EC=B9=A8=20?= =?UTF-8?q?=EB=A7=9E=EC=B6=A4=20=E2=80=94=20SK=20=EB=A5=BC=20=EC=9D=BC?= =?UTF-8?q?=EC=9C=84=EB=8C=80=EA=B0=80=20=EC=A4=84=EB=A1=9C=20=ED=8E=BC?= =?UTF-8?q?=EC=B9=A0=20=EB=95=8C=20=EB=B0=94=ED=83=95=20=EC=9E=AC=EB=A3=8C?= =?UTF-8?q?=20=EB=B3=84=EB=8F=84=EA=B3=84=EC=83=81=20=EB=B9=88=20=EC=B9=B8?= =?UTF-8?q?=20=3D=20=EC=A7=81=EC=A0=91=EA=B3=84=EC=82=B0=20=EC=A0=81?= =?UTF-8?q?=EC=96=B4=20=EB=91=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 까닭: 747-1 뒤 SK 셈은 바탕 재료 빈 칸 = 직접계산 · 일위대가 줄(덮개 줄 line=True)은 별도계상 기본 → 펼친 줄이 재료비를 잃음(합판거푸집 GC000211 SK 를 일위대가에 넣으면 금액 줄어듦) - Library_Flat.sk_line: 바탕 재료 줄마다 자재표시 {별도계상: 직접계산} + 고른 두 칸 그대로 - 지킴 시험: 740-1 에 747 겹침(덮개 있음 · 없음 두 갈래 전후 금액 같음 · 고치기 전 실패 확인) Co-Authored-By: Claude Opus 5.5 --- M02_MasterTemplete/M02_Library_Flat.py | 6 ++++++ resources/tester/test_740_1_library_flat.py | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/M02_MasterTemplete/M02_Library_Flat.py b/M02_MasterTemplete/M02_Library_Flat.py index 69ccc2b45..9437f4e4e 100644 --- a/M02_MasterTemplete/M02_Library_Flat.py +++ b/M02_MasterTemplete/M02_Library_Flat.py @@ -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} diff --git a/resources/tester/test_740_1_library_flat.py b/resources/tester/test_740_1_library_flat.py index e7b9ceb9c..06ecaacec 100644 --- a/resources/tester/test_740_1_library_flat.py +++ b/resources/tester/test_740_1_library_flat.py @@ -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)