fix(826-3-1): 사본 · 수식 두 칸을 같은 읽은 줄로 줄임
- 수식 길 저장(따로 문서)은 옛 셈이 안 돌아 사본 칸이 1 줄로 줄던 것 — 두 칸 사본 줄 묶음 안에 드는 색인이 읽은 줄로 함께 줄임 · 사본 칸 빈 줄은 수식 칸 값 먼저 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user