"""B09 사본(구조물 · 서고)의 수식 문서 사본 `수식.json`(PLAN 802-4a 2 · 브레인 802-4a ①) — 서버 단독. 사본을 만들 때(`M02_Item_Source.build_source`) 단가 묶음 `단가.json` 옆에 함께 굳힘 — {그룹: 수식문서, 문서: {키: 문서}} = 그 묶음의 로직 줄(담은 로직 · 하위 로직 · 굳힌 단가산출 GX9)이 닿는 닫힌 묶음 · 원본 일위대가 문서의 수식 사본 부름이 먼저(만든 때 것) · 없으면 묶음 줄 = 지금 M01 줄이면 M01 문서 · 다르면 그 줄 변환(`M02_Doc_Copy.doc_of`). [단가 갱신](값만) = 이 파일 안 고침 · [재생성](재적용) = 새로 찍음. B09 셈은 지금 풀이(`단가.json` · 단가 책) 그대로 — 산근을 문서 셈으로 바꾸는 것은 802-6. 원본판(`version_of`)에는 안 듦(로직 줄은 `단가.json` 이 이미 잼 · 옛 사본이 거짓 「원본 바뀜」 안 뜸). """ from __future__ import annotations from typing import Any from M02_MasterTemplete import M02_Doc_Copy as dc from M02_MasterTemplete import M02_Doc_Sk as dsk FILE = "수식.json" GROUP = "수식문서" def logic_keys(bundle: dict[str, Any]) -> list[str]: """단가 묶음의 로직 줄 키(그룹 「로직」 파일).""" return [ str(row.get("키")) for data in bundle.values() if isinstance(data, dict) and data.get("그룹") == "로직" for row in data.get("줄") or [] if isinstance(row, dict) and row.get("키") ] def build(bundle: dict[str, Any], labor: dict[str, Any] | None = None) -> dict[str, Any]: """`단가.json` 묶음 → `수식.json` 내용.""" from M02_MasterTemplete import M02_Item_Prices as prices keys = logic_keys(bundle) if not keys: return {"그룹": GROUP, "문서": {}} doc = (labor or {}).get("줄") or {} have = (doc.get(dc.KEY) or {}).get("부름") if dc.has(doc) else None whole = prices.load_prices(bundle) return dsk.norm({"그룹": GROUP, "문서": dc.closure(whole, keys, have)}) def attach(files: dict[str, Any]) -> dict[str, Any]: """사본 파일 묶음에 `수식.json` 을 더함(이미 있으면 그대로 · 단가 묶음 없으면 그대로).""" bundle = files.get("단가.json") if FILE in files or not isinstance(bundle, dict): return files return {**files, FILE: build(bundle, files.get("일위대가.json"))}