feat(master_data): 노임 준용 칸 · ESTX 다른 조사 다섯 갈래 노임 파일 · 인력_자체 → 새 노임 열쇠와 인력_미확보
- 역산: ESTX 미공표 추정 = 마지막 공표값 × 전체직종 평균 증가율 공표일마다 이어 곱·원 미만 버림 (5 직종 원 단위 일치 · 9 직종 앞 값 없음) - 건설노임 미공표 14 줄에 준용 칸(null) · 엔진은 값이 비면 준용 직종 값 · 호표 출처 「준용: <직종>」 · M01 계산표에 표시 - 새 파일: 엔지니어링노임 59 · 측량노임 20 · 건설사업관리노임 7 · SW노임 17 · 산림노임 2 (줄 수·값 합 ESTX 와 같음) - 인력_자체 49 → 새 노임 열쇠 18 · 인력_미확보 31 · 로직 참조 526 곳 - 로직 일괄 시험 계산: 통과 1011 → 1088 · 인력 값 없음 멈춤 176 → 84 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PAdA5ThqmtVSsbzjusk1cJ
This commit is contained in:
@@ -51,9 +51,9 @@ def whole():
|
||||
|
||||
@pytest.fixture(scope="module")
|
||||
def faked():
|
||||
"""자체 인력 값이 빈 칸 — 시험용 가짜 값(파일엔 안 씀)."""
|
||||
"""미확보 인력 값이 빈 칸 — 시험용 가짜 값(파일엔 안 씀)."""
|
||||
files = cm.load()
|
||||
for row in files["인력_자체.json"]["줄"]:
|
||||
for row in files["인력_미확보.json"]["줄"]:
|
||||
if row["값"] is None:
|
||||
row["값"] = Decimal(1000)
|
||||
return mf.Master(files)
|
||||
@@ -389,7 +389,7 @@ def test_토목_강교_제작공수_보정(whole):
|
||||
|
||||
|
||||
def test_자체_직종으로_세운_절(faked):
|
||||
"""없는 직종(고급·중급기술자 · 중급숙련기술자)을 인력_자체로 세운 줄."""
|
||||
"""건설노임에 없는 직종(고급·중급기술자 · 중급숙련기술자)을 엔지니어링노임으로 세운 줄."""
|
||||
|
||||
def qty(ref, given):
|
||||
return {x["이름"]: x["수량"] for x in mf.run(faked, "건설품셈:" + ref, given)["줄"]}
|
||||
@@ -435,7 +435,7 @@ def test_토목_배송관_철거_크레인_규격(whole):
|
||||
def test_토목_보링_심도_가산():
|
||||
"""토목 8-1-2 — 깊이 35m = 20m 넘는 15m 를 10m 단위 올림 2번 × 5% · 인력만 · 쵸핑비트는 호박돌층만."""
|
||||
files = cm.load()
|
||||
for row in files["인력_자체.json"]["줄"] + files["재료_자체.json"]["줄"]:
|
||||
for row in files["인력_미확보.json"]["줄"] + files["재료_자체.json"]["줄"]:
|
||||
if row["값"] is None: # 관리자가 채울 값 — 시험용 가짜 값(파일엔 안 씀)
|
||||
row["값"] = Decimal(1000)
|
||||
given = {"층": "점토층", "규격": "BX", "깊이": 35, "심도가산율": 5}
|
||||
@@ -449,7 +449,7 @@ def test_토목_보링_심도_가산():
|
||||
def test_토목_측량_계산예():
|
||||
"""토목 9-1-2 원문 계산예 — 구하는점 6·주어진점 4·산지 = 인원 × 10/16 × 1.2 × 1.12 · 9-4-3-1 설계예 1km 당 × 연장."""
|
||||
files = cm.load()
|
||||
for row in files["인력_자체.json"]["줄"]:
|
||||
for row in files["인력_미확보.json"]["줄"]:
|
||||
if row["값"] is None: # 관리자가 채울 값 — 시험용 가짜 값(파일엔 안 씀)
|
||||
row["값"] = Decimal(1000)
|
||||
master = mf.Master(files)
|
||||
@@ -601,3 +601,26 @@ def test_범위규칙_이상이하():
|
||||
assert mf.find(table, {"길이": Decimal(30)})["값"] == 3
|
||||
with pytest.raises(mf.FormulaError):
|
||||
mf.find(table, {"길이": Decimal(25)})
|
||||
|
||||
|
||||
def test_미공표_준용():
|
||||
"""값 없는 직종에 준용 열쇠 — 그 직종 값으로 셈 · 호표 출처에 「준용: 이름」 · 준용 없으면 멈춤."""
|
||||
files = cm.load()
|
||||
lines = [
|
||||
{
|
||||
"종류": "인력",
|
||||
"이름": "연마공",
|
||||
"요소": "인력:건설노임:1032",
|
||||
"수량": "2",
|
||||
"비목": "노무비",
|
||||
}
|
||||
]
|
||||
files["_시험"] = {"그룹": "로직", "원문": "시험", "줄": [{"열쇠": "준용", "호표": lines}]}
|
||||
with pytest.raises(mf.FormulaError):
|
||||
mf.run(mf.Master(files), "시험:준용", {})
|
||||
row = next(r for r in files["인력_건설노임.json"]["줄"] if r["열쇠"] == "1032")
|
||||
assert row["값"] is None and "준용" in row
|
||||
row["준용"] = Decimal(1002) # M01 이 수로 적어도 열쇠로 읽음
|
||||
got = mf.run(mf.Master(files), "시험:준용", {})
|
||||
assert got["줄"][0]["출처"] == "준용: 보통인부"
|
||||
assert got["노무비"] == 2 * Decimal(172068)
|
||||
|
||||
Reference in New Issue
Block a user