From f386fd9933b475c0f5da3dcd6bdcaba283f15322 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 19 Sep 2026 17:47:20 +0900 Subject: [PATCH] =?UTF-8?q?feat(master=5Fdata):=20=EA=B1=B4=EC=84=A4?= =?UTF-8?q?=ED=92=88=EC=85=88=20=EA=B3=B5=ED=86=B5=207=EC=9E=A5(=EB=8F=8C?= =?UTF-8?q?=EA=B3=B5=EC=82=AC)=20=EB=A1=9C=EC=A7=81=207=EC=A4=84=20=C2=B7?= =?UTF-8?q?=20=EC=8B=9C=ED=97=98=204=EA=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 메쌓기 · 찰쌓기 · 메붙임 · 찰붙임 · 전석쌓기 · 전석깔기 · 석재판 습식 - 굴착기+부착용집게 줄은 값 칸 이름으로 막힘 · 7-4-2 · 7-4-3 범위규칙이 글 - 견본 검사에 건설 3·4·7장 · 산림 6·8장 더함 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj --- .../master_data/로직_건설품셈_공통7장.json | 227 ++++++++++++++++++ resources/tester/test_masterdata_check.py | 34 +++ 2 files changed, 261 insertions(+) create mode 100644 resources/master_data/로직_건설품셈_공통7장.json diff --git a/resources/master_data/로직_건설품셈_공통7장.json b/resources/master_data/로직_건설품셈_공통7장.json new file mode 100644 index 00000000..cb85daa0 --- /dev/null +++ b/resources/master_data/로직_건설품셈_공통7장.json @@ -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% 는 원문 주 글에만 있어(계수 표 없음) 식에 수로 적음 · 석재판·모르타르 재료 원문 표에 없음" + } + ] +} diff --git a/resources/tester/test_masterdata_check.py b/resources/tester/test_masterdata_check.py index afe4074b..0bea85fb 100644 --- a/resources/tester/test_masterdata_check.py +++ b/resources/tester/test_masterdata_check.py @@ -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(