feat(master_data): 건설품셈 공통 7장(돌공사) 로직 7줄 · 시험 4개

- 메쌓기 · 찰쌓기 · 메붙임 · 찰붙임 · 전석쌓기 · 전석깔기 · 석재판 습식
- 굴착기+부착용집게 줄은 값 칸 이름으로 막힘 · 7-4-2 · 7-4-3 범위규칙이 글
- 견본 검사에 건설 3·4·7장 · 산림 6·8장 더함

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj
This commit is contained in:
2026-09-19 17:47:20 +09:00
co-authored by Claude Opus 5
parent 70d9ca920c
commit f386fd9933
2 changed files with 261 additions and 0 deletions
@@ -0,0 +1,227 @@
{
"그룹": "로직",
"원문": "건설품셈",
"판": "2026",
"줄": [
{
"열쇠": "7-1-1 메쌓기",
"이름": "메쌓기(굴착기+부착용 집게)",
"결과단위": "원/㎡",
"출처": "건설품셈 공통 7-1-1",
"소유": "공용",
"입력": [{ "이름": "뒷길이", "고르기": ["35cm이하", "55cm이하", "75cm이하"] }],
"중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:7-1-1 메쌓기, 뒷길이=뒷길이).시공량" }],
"호표": [
{
"종류": "인력",
"요소": "인력:건설노임:1033",
"이름": "석공",
"단위": "인",
"수량": "찾기(소요량:건설품셈:7-1-1 메쌓기, 뒷길이=뒷길이).석공 / 시공량",
"비목": "노무비"
},
{
"종류": "인력",
"요소": "인력:건설노임:1002",
"이름": "보통인부",
"단위": "인",
"수량": "찾기(소요량:건설품셈:7-1-1 메쌓기, 뒷길이=뒷길이).보통인부 / 시공량",
"비목": "노무비"
}
],
"덧줄": [],
"끝수": null,
"비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 장비 규격은 작업여건에 따라 바꿀 수 있음(주⑥) — 굴착기·집게 설계자 고름 · 기초콘크리트·뒤채움·다짐 별도(주⑤) · 채움재(잡석·콘크리트) 재료 원문 표에 없음 · 막힘: 굴착기+부착용 집게 빠짐 — 칸 이름 「굴착기+부착용집게」 식에서 못 부름"
},
{
"열쇠": "7-1-2 찰쌓기",
"이름": "찰쌓기(굴착기+부착용 집게)",
"결과단위": "원/㎡",
"출처": "건설품셈 공통 7-1-2",
"소유": "공용",
"입력": [{ "이름": "뒷길이", "고르기": ["35cm이하", "55cm이하", "75cm이하"] }],
"중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:7-1-2 찰쌓기, 뒷길이=뒷길이).시공량" }],
"호표": [
{
"종류": "인력",
"요소": "인력:건설노임:1033",
"이름": "석공",
"단위": "인",
"수량": "찾기(소요량:건설품셈:7-1-2 찰쌓기, 뒷길이=뒷길이).석공 / 시공량",
"비목": "노무비"
},
{
"종류": "인력",
"요소": "인력:건설노임:1002",
"이름": "보통인부",
"단위": "인",
"수량": "찾기(소요량:건설품셈:7-1-2 찰쌓기, 뒷길이=뒷길이).보통인부 / 시공량",
"비목": "노무비"
}
],
"덧줄": [],
"끝수": null,
"비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 장비 규격은 작업여건에 따라 바꿀 수 있음(주⑥) — 굴착기·집게 설계자 고름 · 기초콘크리트·뒤채움·다짐 별도(주⑤) · 채움재(잡석·콘크리트) 재료 원문 표에 없음 · 막힘: 굴착기+부착용 집게 빠짐 — 칸 이름 「굴착기+부착용집게」 식에서 못 부름"
},
{
"열쇠": "7-2-1 메붙임",
"이름": "메붙임(굴착기+부착용 집게)",
"결과단위": "원/㎡",
"출처": "건설품셈 공통 7-2-1",
"소유": "공용",
"입력": [{ "이름": "뒷길이", "고르기": ["35cm이하", "55cm이하", "75cm이하"] }],
"중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:7-2-1 메붙임, 뒷길이=뒷길이).시공량" }],
"호표": [
{
"종류": "인력",
"요소": "인력:건설노임:1033",
"이름": "석공",
"단위": "인",
"수량": "찾기(소요량:건설품셈:7-2-1 메붙임, 뒷길이=뒷길이).석공 / 시공량",
"비목": "노무비"
},
{
"종류": "인력",
"요소": "인력:건설노임:1002",
"이름": "보통인부",
"단위": "인",
"수량": "찾기(소요량:건설품셈:7-2-1 메붙임, 뒷길이=뒷길이).보통인부 / 시공량",
"비목": "노무비"
}
],
"덧줄": [],
"끝수": null,
"비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 장비 규격은 작업여건에 따라 바꿀 수 있음(주⑥) — 굴착기·집게 설계자 고름 · 기초콘크리트·뒤채움·다짐 별도(주⑤) · 채움재(잡석·콘크리트) 재료 원문 표에 없음 · 막힘: 굴착기+부착용 집게 빠짐 — 칸 이름 「굴착기+부착용집게」 식에서 못 부름"
},
{
"열쇠": "7-2-2 찰붙임",
"이름": "찰붙임(굴착기+부착용 집게)",
"결과단위": "원/㎡",
"출처": "건설품셈 공통 7-2-2",
"소유": "공용",
"입력": [{ "이름": "뒷길이", "고르기": ["35cm이하", "55cm이하", "75cm이하"] }],
"중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:7-2-2 찰붙임, 뒷길이=뒷길이).시공량" }],
"호표": [
{
"종류": "인력",
"요소": "인력:건설노임:1033",
"이름": "석공",
"단위": "인",
"수량": "찾기(소요량:건설품셈:7-2-2 찰붙임, 뒷길이=뒷길이).석공 / 시공량",
"비목": "노무비"
},
{
"종류": "인력",
"요소": "인력:건설노임:1002",
"이름": "보통인부",
"단위": "인",
"수량": "찾기(소요량:건설품셈:7-2-2 찰붙임, 뒷길이=뒷길이).보통인부 / 시공량",
"비목": "노무비"
}
],
"덧줄": [],
"끝수": null,
"비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 장비 규격은 작업여건에 따라 바꿀 수 있음(주⑥) — 굴착기·집게 설계자 고름 · 기초콘크리트·뒤채움·다짐 별도(주⑤) · 채움재(잡석·콘크리트) 재료 원문 표에 없음 · 막힘: 굴착기+부착용 집게 빠짐 — 칸 이름 「굴착기+부착용집게」 식에서 못 부름"
},
{
"열쇠": "7-3-1 전석쌓기",
"이름": "전석쌓기(굴착기+부착용 집게)",
"결과단위": "원/㎡",
"출처": "건설품셈 공통 7-3-1",
"소유": "공용",
"입력": [],
"중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:7-3-1 전석쌓기).시공량" }],
"호표": [
{ "종류": "인력", "요소": "인력:건설노임:1033", "이름": "석공", "단위": "인", "수량": "찾기(소요량:건설품셈:7-3-1 전석쌓기).석공 / 시공량", "비목": "노무비" },
{
"종류": "인력",
"요소": "인력:건설노임:1002",
"이름": "보통인부",
"단위": "인",
"수량": "찾기(소요량:건설품셈:7-3-1 전석쌓기).보통인부 / 시공량",
"비목": "노무비"
},
{
"종류": "재료",
"요소": "재료:자체:레미콘",
"이름": "채움콘크리트",
"단위": "㎥",
"수량": "찾기(소요량:건설품셈:7-3-1 전석쌓기 재료량).채움콘크리트",
"비목": "재료비",
"출처": "건설품셈 공통 7-3-1 주⑥"
}
],
"덧줄": [],
"끝수": null,
"비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 장비 규격은 작업여건에 따라 바꿀 수 있음(주⑤) — 굴착기·집게 설계자 고름 · 해석: 채움콘크리트 = 재료_자체 레미콘 · 전석 재료 원문 표에 없음 · 막힘: 굴착기+부착용 집게 빠짐 — 칸 이름 「굴착기+부착용집게」 식에서 못 부름"
},
{
"열쇠": "7-3-2 전석깔기",
"이름": "전석깔기(굴착기+부착용 집게)",
"결과단위": "원/㎡",
"출처": "건설품셈 공통 7-3-2",
"소유": "공용",
"입력": [],
"중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:7-3-2 전석깔기).시공량" }],
"호표": [
{ "종류": "인력", "요소": "인력:건설노임:1033", "이름": "석공", "단위": "인", "수량": "찾기(소요량:건설품셈:7-3-2 전석깔기).석공 / 시공량", "비목": "노무비" },
{
"종류": "인력",
"요소": "인력:건설노임:1002",
"이름": "보통인부",
"단위": "인",
"수량": "찾기(소요량:건설품셈:7-3-2 전석깔기).보통인부 / 시공량",
"비목": "노무비"
}
],
"덧줄": [],
"끝수": null,
"비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 해석: 원문 기준 「㎡당」이나 편성·시공량 꼴이 7-3-1 과 같아 일당으로 읽음 · 장비 규격은 작업여건에 따라 바꿀 수 있음(주⑤) — 굴착기·집게 설계자 고름 · 전석 재료 원문 표에 없음 · 막힘: 굴착기+부착용 집게 빠짐 — 칸 이름 「굴착기+부착용집게」 식에서 못 부름"
},
{
"열쇠": "7-4-1 습식공법",
"이름": "석재판 붙임 습식공법",
"결과단위": "원/㎡",
"출처": "건설품셈 공통 7-4-1",
"소유": "공용",
"입력": [{ "이름": "시공부위", "고르기": ["바닥부", "계단부"] }, { "이름": "자재", "고르기": ["테라조판", "화강석"] }],
"중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:7-4-1 습식공법, 시공부위=시공부위, 자재=자재).시공량" }],
"호표": [
{
"종류": "인력",
"요소": "인력:건설노임:1033",
"이름": "석공",
"단위": "인",
"수량": "찾기(소요량:건설품셈:7-4-1 습식공법, 시공부위=시공부위, 자재=자재).석공 / 시공량",
"비목": "노무비"
},
{
"종류": "인력",
"요소": "인력:건설노임:1034",
"이름": "줄눈공",
"단위": "인",
"수량": "찾기(소요량:건설품셈:7-4-1 습식공법, 시공부위=시공부위, 자재=자재).줄눈공 / 시공량",
"비목": "노무비"
},
{
"종류": "인력",
"요소": "인력:건설노임:1002",
"이름": "보통인부",
"단위": "인",
"수량": "찾기(소요량:건설품셈:7-4-1 습식공법, 시공부위=시공부위, 자재=자재).보통인부 / 시공량",
"비목": "노무비"
}
],
"덧줄": [
{
"이름": "공구손료 및 경장비",
"식": "((찾기(소요량:건설품셈:7-4-1 습식공법, 시공부위=시공부위, 자재=자재).석공 / 시공량) * 인력:건설노임:1033 + (찾기(소요량:건설품셈:7-4-1 습식공법, 시공부위=시공부위, 자재=자재).줄눈공 / 시공량) * 인력:건설노임:1034 + (찾기(소요량:건설품셈:7-4-1 습식공법, 시공부위=시공부위, 자재=자재).보통인부 / 시공량) * 인력:건설노임:1002) * 2 / 100",
"비목": "경비",
"출처": "건설품셈 공통 7-4-1 주③"
}
],
"끝수": null,
"비고": "해석: 인력품 = 인력 호표 줄 금액 합(기계 조종원 제외) · 해석: 주③ 2% 는 원문 주 글에만 있어(계수 표 없음) 식에 수로 적음 · 석재판·모르타르 재료 원문 표에 없음"
}
]
}
+34
View File
@@ -15,11 +15,16 @@ SAMPLES = [
"계수_건설품셈_공통8장.json",
"계수_산림품셈_9장.json",
"기계_건설품셈.json",
"로직_건설품셈_공통3장.json",
"로직_건설품셈_공통4장.json",
"로직_건설품셈_공통7장.json",
"로직_건설품셈_공통8장.json",
"로직_산림품셈_03장.json",
"로직_산림품셈_04장.json",
"로직_산림품셈_05장.json",
"로직_산림품셈_06장.json",
"로직_산림품셈_07장.json",
"로직_산림품셈_08장.json",
"로직_산림품셈_10장.json",
"로직_산림품셈_11장.json",
"로직_산림품셈_13장.json",
@@ -197,6 +202,35 @@ def test_방제_벌목조재_감_할증(whole):
assert got[""][0]["수량"].quantize(Decimal("0.000001")) == want.quantize(Decimal("0.000001"))
def test_건설_석재판_습식_공구손료(whole):
"""공통 7-4-1 — 바닥부 테라조판 석공 3 · 줄눈공 1 · 보통인부 2 ÷ 15㎡ · 공구손료 인력품 2%."""
got = mf.run(whole, "건설품셈:7-4-1 습식공법", {"시공부위": "바닥부", "자재": "테라조판"})
assert [line["수량"] for line in got[""][:3]] == [Decimal(3) / 15, Decimal(1) / 15, Decimal(2) / 15]
assert got["경비"] == got["노무비"] * Decimal("0.02")
def test_건설_정원석_난이도_가산(whole):
"""공통 4-4-1 — 쌓기 20ton 미만 조경공 1.212 × 1.1 · 굴착기 0.7㎥ 0.657hr 그대로."""
given = {"작업": "쌓기", "중량": "20ton 미만", "난이도가산": 10, "지역": "전국평균", "보정작업": "해당 없음"}
got = mf.run(whole, "건설품셈:4-4-1 정원석 쌓기 및 놓기", given)
assert [line["수량"] for line in got[""][:2]] == [Decimal("1.3332"), Decimal("0.657")]
def test_건설_벌목_집재거리_가산(whole):
"""공통 3-9-1 — 나무높이 6m 벌목부 2.8 · 집재 250m = 100m 초과 두 번 × 30%."""
got = mf.run(whole, "건설품셈:3-9-1 벌목", {"나무높이": 6, "집재거리": 250})
assert got[""][0]["수량"] == Decimal("4.48")
def test_건설_흙깎기_암_치즐(whole):
"""공통 3-2-3 — 풍화암 65㎥/일 · 굴착기+대형브레이커 8/65 시간 · 치즐 1%."""
given = {"암분류": "풍화암", "집토": "안 함", "지역": "전국평균", "보정작업": "해당 없음"}
got = mf.run(whole, "건설품셈:3-2-3 흙깎기(기계) 암", given)
brk = got[""][1]
assert brk["수량"] == Decimal(8) / 65
assert got[""][-1]["금액"] == brk["금액"] / 100
def test_범위_입력은_막음(whole):
with pytest.raises(mf.FormulaError):
mf.run(