diff --git a/M02_MasterTemplete/M02_Copy_Slim.py b/M02_MasterTemplete/M02_Copy_Slim.py index 94f2a9572..1aa3dde11 100644 --- a/M02_MasterTemplete/M02_Copy_Slim.py +++ b/M02_MasterTemplete/M02_Copy_Slim.py @@ -23,21 +23,22 @@ def _keys(rows: list[dict]) -> set[str]: return {str(r.get("키")) for r in rows} -def cut(copy: Any, reads: dict, more: Any = ()) -> Any: - """값 사본(`skc` 꼴) → 이 사본 셈이 읽은 줄만 + 읽은 · 사본 없는 줄(지금 값) · +def _rows(copy: dict) -> list[dict]: + return [*copy["로직"], *(copy.get("단가") or [])] + + +def cut(copy: Any, keys: set[str], pool: dict | None = None) -> Any: + """값 사본(`skc` 꼴) → `keys` 줄만 · 사본 없는 줄 = `pool`(다른 칸 사본) › 지금 M01(+ 내 기계) · 판은 바뀐 몫만 다시.""" - if not skc.has({skc.KEY: copy}): + if not skc.has({skc.KEY: copy}) or not keys: return copy - rows = [*copy["로직"], *(copy.get("단가") or [])] + rows = _rows(copy) have = _keys(rows) - keys = {k for box, got in reads.items() if box <= have for k in got} | set(more) - if not keys: - return copy # 셈이 이 사본을 안 읽음 — 그대로 whole = skc.whole_() add = [ - prices.to_json(whole.index[k[:2]][k]) + (pool or {}).get(k) or prices.to_json(whole.index[k[:2]][k]) for k in sorted(keys - have) - if k in whole.index.get(k[:2], {}) + if k in (pool or {}) or k in whole.index.get(k[:2], {}) ] keep = [r for r in rows if str(r.get("키")) in keys] + add logic = [r for r in keep if str(r.get("키"))[:2] not in skc.RES] @@ -51,17 +52,24 @@ def cut(copy: Any, reads: dict, more: Any = ()) -> Any: def cut_doc(doc: Any, reads: dict) -> Any: - """문서의 로직 사본(`사본`) · 수식 사본 값 몫(`수식`)을 줄임 — - 문서 안 내 기계 키는 늘 담음(822-1).""" + """문서의 로직 사본(`사본`) · 수식 사본 값 몫(`수식`)을 두 칸 같은 줄로 줄임 — + 줄 = 사본 줄 묶음이 두 칸 안에 드는 색인이 읽은 것 + 문서 안 내 기계 키(822-1) · + 읽은 줄 없음 = 그대로.""" if not isinstance(doc, dict): return doc - more = mym.keys_in({k: v for k, v in doc.items() if k not in (skc.KEY, dc.KEY)}) + old = doc[skc.KEY] if skc.has(doc) else None + form = doc[dc.KEY] if dc.has(doc) and isinstance(doc[dc.KEY].get("로직"), list) else None + mine = {str(r.get("키")): r for c in (form, old) if c for r in _rows(c)} + keys = {k for box, got in reads.items() if box <= mine.keys() for k in got} + if not keys: + return doc # 셈이 이 사본을 안 읽음 — 그대로 + keys |= set(mym.keys_in({k: v for k, v in doc.items() if k not in (skc.KEY, dc.KEY)})) out = dict(doc) - if skc.has(doc): - out[skc.KEY] = cut(doc[skc.KEY], reads, more) - if dc.has(doc) and isinstance(doc[dc.KEY].get("로직"), list): - got = doc[dc.KEY] - out[dc.KEY] = {**got, **cut(dc.values_of(got), reads, more)} + if form: + out[dc.KEY] = {**form, **cut(dc.values_of(form), keys)} + if old: + pool = {str(r.get("키")): r for r in _rows(out[dc.KEY])} if form else None + out[skc.KEY] = cut(old, keys, pool) return out