diff --git a/M02_MasterTemplete/M02_Labor_Ref.py b/M02_MasterTemplete/M02_Labor_Ref.py index 69cb5600e..34a8f3005 100644 --- a/M02_MasterTemplete/M02_Labor_Ref.py +++ b/M02_MasterTemplete/M02_Labor_Ref.py @@ -350,12 +350,22 @@ def carry(doc: dict[str, Any], source: Here) -> dict[str, Any]: got = read_ref(ref) if got is None: raise _bad(f"없는 참조 「{ref['키']}」") - body = origin_mark({**got, "담은로직": _moved(got.get("담은로직"), move, depth + 1)}, ref) - made = create(kind_of(ref["키"]), body) + body = {**got, "담은로직": _moved(got.get("담은로직"), move, depth + 1)} + made = create(kind_of(ref["키"]), origin_mark(_spec_moved(body, done), ref)) done[ref_id(ref)] = {"층": target[0], "주인": target[1], "키": made["이름"]} return done[ref_id(ref)] - return {**doc, "담은로직": _moved(doc.get("담은로직"), move, 1)} + return _spec_moved({**doc, "담은로직": _moved(doc.get("담은로직"), move, 1)}, done) + + +def _spec_moved(doc: dict[str, Any], done: dict[str, Ref]) -> dict[str, Any]: + """규격 열 수량(704-4 · 줄 id = `ref_id`) 열쇠도 새 참조로 — 안 바꾸면 그 줄 열 값이 버려짐.""" + spec = doc.get("규격") + qty = spec.get("수량") if isinstance(spec, dict) else None + if not isinstance(qty, dict) or not done: + return doc + moved = {old: ref_id(new) for old, new in done.items()} + return {**doc, "규격": {**spec, "수량": {moved.get(k, k): v for k, v in qty.items()}}} def _moved(lines: Any, move: Callable[[Ref, int], Ref], depth: int) -> list[Any]: diff --git a/resources/tester/test_m02_labor_ref.py b/resources/tester/test_m02_labor_ref.py index 412ea1a10..aa12c2a0e 100644 --- a/resources/tester/test_m02_labor_ref.py +++ b/resources/tester/test_m02_labor_ref.py @@ -326,6 +326,27 @@ def test_복사는_못_읽는_참조를_같이_복사_본뜬(world): assert e.value.status == 400 +def test_복사_새_키_규격_열_수량도_따라감(world): + """통합 점검 — 회사에 올리기 승인 · 회사로 복사: 개인 참조가 회사 새 키로 바뀌면 규격 열 수량 열쇠도.""" + inner = _combo(world["personal"], [{"로직": TEN}], "안") + old = f"참조|personal|7/42|{inner}" + spec = { + "이름": "H", + "열": ["1.5", "2.0"], + "기본": "1.5", + "수량": {old: {"1.5": 1, "2.0": 1.3}, "고정|돌|가|㎡": {"1.5": 2, "2.0": 2.6}}, + } + doc = {"담은로직": [{"참조": {**MINE, "키": inner}}], "규격": spec} + with store.at(world["company"]): + got = refs.carry(doc, ("personal", "7/42")) + new = f"참조|company|7|{got['담은로직'][0]['참조']['키']}" + assert got["규격"]["수량"] == { + new: {"1.5": 1, "2.0": 1.3}, + "고정|돌|가|㎡": {"1.5": 2, "2.0": 2.6}, + } + assert doc["규격"]["수량"][old] == {"1.5": 1, "2.0": 1.3} # 원본 그대로 + + def test_길_새로_복사_권한(world): from fastapi import FastAPI from fastapi.testclient import TestClient