feat(778-4): 율 줄을 단가산출(SK)에 담음 — 고정 비율 더한줄 · 기준 묶음 · 줄 목록 · 율 위 율
- SK 더한줄 율 줄 허용(일위대가 비율 줄과 같은 꼴 `고정 비율 {기준, 비목}` · 수량 = 율)
- 기준 = 비목(노무비 · 재료비 · 경비) · 묶음(인력 · 재료 · 장비 = 그 줄 종류만 · 기계 노무 섞인 블록도 인력 줄만) ·
줄 목록(cid · add:#k · 앞 율 줄 = 율 위 율) · 검사 = 자기 · 뒤 율 줄 막음
- 밑 공용 함수 `M02_Labor_Fixed.rate_base` ↔ 짝 `Labor_Calc.ts` `rateBase`(일위대가 비율 줄 · Expand 같이 씀)
- SK 셈 `_rated` = 엔진 한 번 돈 줄로 밑 → 율 줄 값묶음 → 엔진 다시(율 줄 없는 문서 = 한 번 · 값 그대로)
- B09 pct 밑수 `bundle:` · `rows:`(파이썬 · TS 짝) · SK 블록 율 줄 = pct
- 굳힘 — 바탕 없는 SK 율 줄은 한 줄로 안 펼침(참조 그대로) · 겹침 때 기준 열쇠 새 차례
- 화면 — [율 줄 추가] 창(새 `M02_MasterTemplete_Sangeun_Rate.ts` · 부품 상자만) · 율 줄 = % 줄로 보임 ·
더한줄 지움 · 되살림 때 기준 열쇠 옮김
- 시험 — 새 test_778_4_rate_line(25) · 거울 헬퍼에 rateBase 길 · 전후 대조 SK 16 · 일위대가 118 · B09 대가 입력 14 같음
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -14,7 +14,9 @@
|
||||
`{층: 사본, 주인: 몸 지문, 키: 본 SC, 몸}` 에 담음(`M02_Labor_Ref.copy_ref` · 원본
|
||||
연결 없음 · 하위 호표 끝수 단계 · B09 하위 대가 블록 그대로 · 같은 기초 겹침도
|
||||
블록 안)
|
||||
바탕 SK 참조 · 패치 있는 SK 참조 줄 = 위 덮개를 아래 덮개에 겹쳐 한 벌(`compose`)
|
||||
바탕 SK 참조 · 패치 있는 SK 참조 줄 = 위 덮개를 아래 덮개에 겹쳐 한 벌(`compose` · 율 기준 줄 열쇠
|
||||
`add:#k` 도 새 차례로 · 778-4)
|
||||
율 줄(778-4) 있는 바탕 없는 SK = 한 줄로 못 펼침(율 · 기준 묶음이 넣는 쪽 줄로 번짐) → 참조 그대로
|
||||
못 펼친 줄 = 저장 · 읽기 · 옮기기에선 옛 참조 그대로(값 그대로) · 넣기 길(`strict`)에선 400 까닭.
|
||||
초기화(`reset`) = 덮개 · 뺀줄 · 더한줄 단가 걷음(안쪽 넣은 몸 · 사본 블록까지) · 이음 기계 고정 줄
|
||||
단가 = M01 기계 한 시간 값 다시 받음(736-3) · 항목 · 수량 · 입력값 · 고름 · 자재표시 · 켜쌓기율 ·
|
||||
@@ -142,6 +144,8 @@ def sk_adds(y: dict, q: Decimal, whole: Any, tag: dict) -> list[dict]:
|
||||
|
||||
adds = filled_adds(y, whole)
|
||||
code = (y.get("바탕") or {}).get("로직")
|
||||
if not code and any(sd.is_rate(one) for one in adds):
|
||||
raise sd.DocError("율 줄 있는 바탕 없는 단가산출은 펼쳐 넣지 못함 — 참조로 둠")
|
||||
if not code:
|
||||
return [_scaled(one, q, tag) for one in adds]
|
||||
row = whole.logic(code)
|
||||
@@ -291,13 +295,36 @@ def compose(under: dict, over: dict, whole: Any) -> dict:
|
||||
into[t[1]] = value
|
||||
rate = over.get("켜쌓기율", under.get("켜쌓기율"))
|
||||
out = {**over, "바탕": base, "덮개": covers, "뺀줄": drop, "고름": picks, "자재표시": marks}
|
||||
out["더한줄"] = [a for k, a in enumerate(adds) if k not in gone] + list(
|
||||
over.get("더한줄") or []
|
||||
)
|
||||
kept = [k for k in range(len(adds)) if k not in gone]
|
||||
new = {f"add:#{k}": f"add:#{n}" for n, k in enumerate(kept)} # 율 기준 열쇠(778-4)
|
||||
mine = [
|
||||
_rekey(a, lambda x: new.get(x) if ADD.match(x) else x)
|
||||
for k, a in enumerate(adds)
|
||||
if k not in gone
|
||||
]
|
||||
|
||||
def up(cid: str) -> str | None: # 위 문서 열쇠 → 한 벌 열쇠
|
||||
hit = ADD.match(cid)
|
||||
if hit:
|
||||
return f"add:#{len(kept) + int(hit[1])}"
|
||||
t = to(cid)
|
||||
return cid if t is None else t[1] if t[0] == "base" else new.get(f"add:#{t[1]}")
|
||||
|
||||
out["더한줄"] = mine + [_rekey(dict(a), up) for a in over.get("더한줄") or []]
|
||||
out["입력값"] = {**(under.get("입력값") or {}), **(over.get("입력값") or {})}
|
||||
return out | ({"켜쌓기율": rate} if rate is not None else {})
|
||||
|
||||
|
||||
def _rekey(one: dict, move: Any) -> dict:
|
||||
"""율 더한줄 기준 줄 목록 열쇠를 `move` 로(못 옮긴 열쇠 = 버림 · 778-4)."""
|
||||
rate = ((one.get("고정") or {}).get("비율") or {}) if isinstance(one, dict) else {}
|
||||
if not isinstance(rate.get("기준"), list):
|
||||
return one
|
||||
keys = [k for k in (move(x) for x in rate["기준"]) if k]
|
||||
fx = {**one["고정"], "비율": {**rate, "기준": keys}}
|
||||
return {**one, "고정": fx}
|
||||
|
||||
|
||||
# ── SC ────────────────────────────────────────────────────────────────
|
||||
def sk_line(y: dict, one: dict, whole: Any, tag: dict) -> dict:
|
||||
"""펼친 SK → 일위대가 로직 줄 하나(+ 패치) — 옛 참조 줄 `one` 의 별칭 · 메모 · 수량 · 패치
|
||||
|
||||
Reference in New Issue
Block a user