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:
2026-11-04 12:59:48 +09:00
co-authored by Claude Opus 5.5
parent 2f93dd8b11
commit d9a581659f
16 changed files with 825 additions and 53 deletions
+10 -4
View File
@@ -144,6 +144,7 @@ class Expand:
for code in pill["로직"]
}
inner, rows, why, rid = [], [], None, trail[-1] if trail else ""
keyed: list[dict] = [] # 율 밑 줄(778-4 · `fixed.rate_base`)
for at, one in enumerate(lines):
ref = one.get("참조")
if isinstance(ref, dict): # 줄 덮개(715-3) 있는 SK 참조 = 그 줄만 다시 셈
@@ -166,6 +167,8 @@ class Expand:
why = why or f"「{sub.get('이름')}」 {NO_QTY}"
continue
rows.append(labor.mcut.row({k: v * qty for k, v in sub["기준"].items()}))
if not refs.is_rate(head):
keyed.append(fixed.rate_row(head, labor.line_id(head), rows[-1]))
for mat in doc.get("자재") or []: # 사용자 자재(175-2) = 기준단가 × 수량(이은 값)
if labor.apart(mat): # 별도계상 = 안 셈 · 안 줄에도 없음(222-1)
continue
@@ -190,11 +193,14 @@ class Expand:
why = why or f"「{name}」 {inner[-1]['까닭']}"
continue
rows.append(labor.mcut.row({k: v * qty for k, v in base.items()}))
under = labor._sum(rows)
for one in inner: # 비율 고정 줄(705-3) — 밑 = 다른 줄 합
if (one.get("고정") or {}).get("비율"):
one["기준"], row = fixed.ratio_row(one["고정"]["비율"], one["수량"], under)
keyed.append({"키": None, "묶음": "재료", "비목": rows[-1]})
for one in inner: # 비율 고정 줄(705-3) — 밑 = `rate_base`(778-4)
if rate := (one.get("고정") or {}).get("비율"):
under = fixed.rate_base(rate["기준"], keyed)
one["기준"], row = fixed.ratio_row(rate, one["수량"], under)
rows.append(row)
if row:
keyed.append(fixed.rate_row(one, labor.line_id(one), row, True))
return {
"이름": doc.get("이름"),
"단위": doc.get("단위"),