feat(M02): 옛 일위대가 조합 → 열마다 일위대가 문서 옮기기 — 시스템 층 돌림 (39-1b B7)

- M02_Labor_Migrate: 층마다 열마다 labor 문서 · 여러 열이 쓰던 조합은 열마다 복사 · 키 없는 열 = 빈 일위대가 · 다시 돌려도 같음 · --storage(회사 · 개인 층) · --dry-run
- M02_Labor_Doc.from_combo: 옛 조합(실무문서 UA · UC · UP) → 일위대가 문서 몸(본뜬 = 층 · 주인 · 키)
- 시스템 층 결과: labor/item1(← UA000008) · item2(빈) · item3(← UA000001)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EYJJRCfHfdCGNhmXTjQKV7
This commit is contained in:
2026-10-04 17:46:30 +09:00
co-authored by Claude Opus 5.5
parent 29922434d6
commit ba5c2e99d4
6 changed files with 680 additions and 0 deletions
+22
View File
@@ -125,6 +125,28 @@ def clean(doc: Any) -> dict[str, Any]:
return out
def from_combo(key: str) -> dict[str, Any]:
"""옛 일위대가 조합(마스터 UA = 실무문서 · 회사 UC · 개인 UP) → 일위대가 문서 몸 —
담은로직 · 단위 복사 · 입력값 {} · 수량 null · 자재 [] · `본뜬` = 그 조합(층 · 주인 · 키).
없는 조합은 404."""
from M02_MasterTemplete import M02_MasterTemplete_Combo_Store as combos
row = combos.find(key)
if row is None:
raise store.StoreError(404, f"없는 일위대가 조합 「{key}」")
layer, owner = combos.where(key) or (None, None)
return {
"단위": row.get("단위"),
"본뜬": {"층": layer, "주인": owner, "키": key},
"담은로직": [
{"로직": one.get("로직"), "메모": one.get("메모"), "입력값": {}, "수량": None}
for one in row.get("담은로직") or []
if isinstance(one, dict)
],
"자재": [],
}
# ── 알약 · 면적 값 ────────────────────────────────────────────────────
def material_key(code: str) -> str:
return f"{MATERIAL_HEAD}{code}"