- 문서 칸 `수식`(옛 `사본` 은 802-5 까지 옆에) = 값 사본(로직 · 자원 단가 줄) + 부름 닫힌 묶음 + SK 문서 · 끊음 · 따로 — `M02_Doc_Copy`(새)
· 부름 문서 = 값 줄이 지금 M01 줄과 같으면 M01 수식 문서 · 다르면 만든 때 줄 변환
- SK 금액 = 문서 셈(`M02_Doc_Sk.on_run`) — 옛 칸(덮개 · 더한줄 …)은 파생(엔진에 넣던 고친 줄 → 문서 · 덮개 없는 바탕 = M01 문서 사본) · 수식 길 고침 = 따로(옛 칸 고침 저장 409 · 재생성 = 파생으로)
- 일위대가 · SC 로직 줄 = 문서 셈(`M02_Labor_Copy.line`) · 줄 옵션 = 문서 규칙(켜쌓기율 변수 r · 고른 자재 = 요소 키 · 별도계상 = 합밖 + 뒤 「재료비의 %」 밑엔 그 줄 금액 더함)
- [단가 갱신] = 자원 단가 줄만(문서 그대로) · [재생성] = 지금 M01 문서로(고친 문서 · 끊음 버림 알림) · 빈 SK = 빈 문서 「—」
- 수식 길 GET/POST …/sangeun/{키}/doc · /preview · /save(층 쓰기 · 서버 정본 셈) — `M02_Doc_Sk_Path` · `M02_Doc_Router`(새 · main 등록)
- B09 구조물 · 서고 사본 = `수식.json` 함께 굳힘(`M02_Doc_B09` · 원본판 안 듦) · B09 셈 그대로(문서 셈 전환 = 802-6)
- 옮기기 `M02_Doc_Migrate`(보기만 · --apply --backup · --restore) · 목록 `docs/raw/요구_1104/_목록_802-4a_M02대조.xlsx` — 층 SK 15 · 일위대가 21 · SC 4 · B09 서고 사본 3 같음 · 빈 SK 2 = 옛 0 → 「—」 · 가져온 식 1 = 802-4b
- 시험 test_802_4a(12) · test_204_2 서고 사본 파일 목록에 수식.json · test_795_1 `_fake` 가 M01 수식 문서도 같이 바꿈(M01 정본 = 수식 문서 — 옛 줄만 바꾼 흉내는 문서 사본에 안 닿음) · 옛 SK 흉내 = 사본 · 수식 둘 다 뗌
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
53 lines
2.4 KiB
Python
53 lines
2.4 KiB
Python
"""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"))}
|