diff --git a/resources/master_data/scripts/master_formula.py b/resources/master_data/scripts/master_formula.py index ec47a7f4..c8de9137 100644 --- a/resources/master_data/scripts/master_formula.py +++ b/resources/master_data/scripts/master_formula.py @@ -255,6 +255,9 @@ def _match(table: dict, row: dict, cond: str, want) -> bool: if table.get("조건", {}).get(cond) == "범위": low, high = have rule, *more = table.get("범위규칙", "초과·이하").split(" · ") + rule = rule.split(" (")[0] # 「이상·미만 (원문 …)」 — 괄호 설명은 뺌 + if rule == "이상·이하": + return (low is None or want >= low) and (high is None or want <= high) if rule == "초과·이하": return (low is None or want > low) and (high is None or want <= high) if rule == "이상·미만": diff --git a/resources/master_data/계수_건설품셈_토목5장.json b/resources/master_data/계수_건설품셈_토목5장.json index b138f44f..e3844968 100644 --- a/resources/master_data/계수_건설품셈_토목5장.json +++ b/resources/master_data/계수_건설품셈_토목5장.json @@ -101,7 +101,7 @@ "기준": "", "출처": "건설품셈 토목 5-1-2", "조건": { - "대형단품 평균중량 a(ton)": "범위" + "대형단품평균중량": "범위" }, "값칸": { "대형단품계수": "수" @@ -109,28 +109,28 @@ "범위규칙": "이상·미만", "줄": [ { - "대형단품 평균중량 a(ton)": [ + "대형단품평균중량": [ null, 10 ], "대형단품계수": 1.0 }, { - "대형단품 평균중량 a(ton)": [ + "대형단품평균중량": [ 10, 15 ], "대형단품계수": 0.97 }, { - "대형단품 평균중량 a(ton)": [ + "대형단품평균중량": [ 15, 20 ], "대형단품계수": 0.92 }, { - "대형단품 평균중량 a(ton)": [ + "대형단품평균중량": [ 20, null ], @@ -151,29 +151,29 @@ "기준": "", "출처": "건설품셈 토목 5-1-2", "조건": { - "부품 평균중량 b(㎏)": "범위" + "부품평균중량": "범위" }, "값칸": { "부품계수": "수" }, - "범위규칙": "첫 줄 100 이하 · 가운뎃줄 100 초과 150 미만 · 끝줄 150 이상", + "범위규칙": "초과·이하 · 원문 첫 줄 100 이하 · 가운뎃줄 100 초과 150 미만 · 끝줄 150 이상 — 150 한 점만 가운뎃줄로 읽힘", "줄": [ { - "부품 평균중량 b(㎏)": [ + "부품평균중량": [ null, 100 ], "부품계수": 1.00 }, { - "부품 평균중량 b(㎏)": [ + "부품평균중량": [ 100, 150 ], "부품계수": 0.95 }, { - "부품 평균중량 b(㎏)": [ + "부품평균중량": [ 150, null ], @@ -287,7 +287,7 @@ "출처": "건설품셈 토목 5-1-2", "조건": { "형식": "고르기", - "총중량(톤)": "범위" + "총중량": "범위" }, "값칸": { "증감계수": "수" @@ -296,7 +296,7 @@ "줄": [ { "형식": "플레이트거더", - "총중량(톤)": [ + "총중량": [ null, 100 ], @@ -304,7 +304,7 @@ }, { "형식": "플레이트거더", - "총중량(톤)": [ + "총중량": [ 100, 300 ], @@ -312,7 +312,7 @@ }, { "형식": "플레이트거더", - "총중량(톤)": [ + "총중량": [ 300, 500 ], @@ -320,7 +320,7 @@ }, { "형식": "플레이트거더", - "총중량(톤)": [ + "총중량": [ 500, 1000 ], @@ -328,7 +328,7 @@ }, { "형식": "플레이트거더", - "총중량(톤)": [ + "총중량": [ 1000, null ], @@ -336,7 +336,7 @@ }, { "형식": "박스거더", - "총중량(톤)": [ + "총중량": [ null, 100 ], @@ -344,7 +344,7 @@ }, { "형식": "박스거더", - "총중량(톤)": [ + "총중량": [ 100, 300 ], @@ -352,7 +352,7 @@ }, { "형식": "박스거더", - "총중량(톤)": [ + "총중량": [ 300, 500 ], @@ -360,7 +360,7 @@ }, { "형식": "박스거더", - "총중량(톤)": [ + "총중량": [ 500, 1000 ], @@ -368,7 +368,7 @@ }, { "형식": "박스거더", - "총중량(톤)": [ + "총중량": [ 1000, null ], @@ -376,7 +376,7 @@ }, { "형식": "기타형식", - "총중량(톤)": [ + "총중량": [ null, 100 ], @@ -384,7 +384,7 @@ }, { "형식": "기타형식", - "총중량(톤)": [ + "총중량": [ 100, 300 ], @@ -392,7 +392,7 @@ }, { "형식": "기타형식", - "총중량(톤)": [ + "총중량": [ 300, 500 ], @@ -400,7 +400,7 @@ }, { "형식": "기타형식", - "총중량(톤)": [ + "총중량": [ 500, 1000 ], @@ -408,7 +408,7 @@ }, { "형식": "기타형식", - "총중량(톤)": [ + "총중량": [ 1000, null ], @@ -426,7 +426,7 @@ "출처": "건설품셈 토목 5-1-2", "조건": { "형식": "고르기", - "사각(°)": "범위" + "사각": "범위" }, "값칸": { "증감계수": "수" @@ -435,7 +435,7 @@ "줄": [ { "형식": "박스거더이외의형식", - "사각(°)": [ + "사각": [ 85, null ], @@ -443,7 +443,7 @@ }, { "형식": "박스거더이외의형식", - "사각(°)": [ + "사각": [ 75, 85 ], @@ -451,7 +451,7 @@ }, { "형식": "박스거더이외의형식", - "사각(°)": [ + "사각": [ 45, 75 ], @@ -459,7 +459,7 @@ }, { "형식": "박스거더이외의형식", - "사각(°)": [ + "사각": [ null, 45 ], @@ -467,7 +467,7 @@ }, { "형식": "박스거더", - "사각(°)": [ + "사각": [ 85, null ], @@ -475,7 +475,7 @@ }, { "형식": "박스거더", - "사각(°)": [ + "사각": [ 75, 85 ], @@ -483,7 +483,7 @@ }, { "형식": "박스거더", - "사각(°)": [ + "사각": [ 45, 75 ], @@ -491,7 +491,7 @@ }, { "형식": "박스거더", - "사각(°)": [ + "사각": [ null, 45 ], @@ -509,7 +509,7 @@ "출처": "건설품셈 토목 5-1-2", "조건": { "형식": "고르기", - "곡률반경 R(m)": "범위" + "곡률반경": "범위" }, "값칸": { "증감계수": "수" @@ -518,7 +518,7 @@ "줄": [ { "형식": "박스거더이외의형식", - "곡률반경 R(m)": [ + "곡률반경": [ 500, null ], @@ -526,7 +526,7 @@ }, { "형식": "박스거더이외의형식", - "곡률반경 R(m)": [ + "곡률반경": [ 250, 500 ], @@ -534,7 +534,7 @@ }, { "형식": "박스거더이외의형식", - "곡률반경 R(m)": [ + "곡률반경": [ 100, 250 ], @@ -542,7 +542,7 @@ }, { "형식": "박스거더이외의형식", - "곡률반경 R(m)": [ + "곡률반경": [ null, 100 ], @@ -550,7 +550,7 @@ }, { "형식": "박스거더", - "곡률반경 R(m)": [ + "곡률반경": [ 500, null ], @@ -558,7 +558,7 @@ }, { "형식": "박스거더", - "곡률반경 R(m)": [ + "곡률반경": [ 250, 500 ], @@ -566,7 +566,7 @@ }, { "형식": "박스거더", - "곡률반경 R(m)": [ + "곡률반경": [ 100, 250 ], @@ -574,7 +574,7 @@ }, { "형식": "박스거더", - "곡률반경 R(m)": [ + "곡률반경": [ null, 100 ], diff --git a/resources/master_data/로직_건설품셈_토목5장.json b/resources/master_data/로직_건설품셈_토목5장.json new file mode 100644 index 00000000..cef60e72 --- /dev/null +++ b/resources/master_data/로직_건설품셈_토목5장.json @@ -0,0 +1,656 @@ +{ + "그룹": "로직", + "원문": "건설품셈", + "판": "2026", + "줄": [ + { + "열쇠": "5-1-1 기본제작공수", + "이름": "강교 제작", + "결과단위": "원/ton", + "출처": "건설품셈 토목 5-1-1", + "소유": "공용", + "입력": [ + { "이름": "형식", "고르기": ["플레이트거더", "박스거더", "강바닥판 플레이트거더", "강바닥판 박스거더", "트러스", "아치", "라멘"] }, + { "이름": "고강도강비율", "단위": "", "범위": [0, 1], "출처": "건설품셈 토목 5-1-2 고강도강재 상당품 비율" }, + { "이름": "대형단품평균중량", "단위": "ton", "출처": "건설품셈 토목 5-1-2 대형단품계수" }, + { "이름": "부품평균중량", "단위": "㎏", "출처": "건설품셈 토목 5-1-2 부품계수" }, + { "이름": "연수", "단위": "연", "출처": "건설품셈 토목 5-1-2 증감계수 a" }, + { "이름": "총중량", "단위": "ton", "출처": "건설품셈 토목 5-1-2 증감계수 b" }, + { "이름": "사각", "단위": "°", "출처": "건설품셈 토목 5-1-2 증감계수 c" }, + { "이름": "곡률반경", "단위": "m", "출처": "건설품셈 토목 5-1-2 증감계수 d" }, + { "이름": "높이곡선변화", "고르기": ["없음", "있음"], "출처": "건설품셈 토목 5-1-2 증감계수 e" } + ], + "중간": [ + { + "이름": "고강도보정", + "식": "1 + 찾기(계수:건설품셈:5-1-2 영향계수, 형식=만약(형식 == '플레이트거더' 또는 형식 == '강바닥판 플레이트거더', '플레이트거더', '상기 이외의 형식'), 강종='SM 460, HSB 460').영향계수 * 고강도강비율", + "출처": "건설품셈 토목 5-1-2 영향계수" + }, + { "이름": "대형단품계수", "식": "찾기(계수:건설품셈:5-1-2 대형단품계수, 대형단품평균중량=대형단품평균중량).대형단품계수", "출처": "건설품셈 토목 5-1-2" }, + { "이름": "부품계수", "식": "찾기(계수:건설품셈:5-1-2 부품계수, 부품평균중량=부품평균중량).부품계수", "출처": "건설품셈 토목 5-1-2" }, + { "이름": "증감a", "식": "만약(연수 < 2, 0, 찾기(계수:건설품셈:5-1-2 연속 증감계수, 연수=연수).증감계수)", "출처": "건설품셈 토목 5-1-2 a" }, + { + "이름": "증감b", + "식": "찾기(계수:건설품셈:5-1-2 총중량 증감계수, 형식=만약(형식 == '플레이트거더' 또는 형식 == '강바닥판 플레이트거더', '플레이트거더', 만약(형식 == '박스거더' 또는 형식 == '강바닥판 박스거더', '박스거더', '기타형식')), 총중량=총중량).증감계수", + "출처": "건설품셈 토목 5-1-2 b" + }, + { + "이름": "증감cd", + "식": "최대(찾기(계수:건설품셈:5-1-2 사각 증감계수, 형식=만약(형식 == '박스거더' 또는 형식 == '강바닥판 박스거더', '박스거더', '박스거더이외의형식'), 사각=사각).증감계수, 찾기(계수:건설품셈:5-1-2 곡률 증감계수, 형식=만약(형식 == '박스거더' 또는 형식 == '강바닥판 박스거더', '박스거더', '박스거더이외의형식'), 곡률반경=곡률반경).증감계수)", + "출처": "건설품셈 토목 5-1-2 c · d" + }, + { + "이름": "증감e", + "식": "만약(높이곡선변화 == '없음', 0, 찾기(계수:건설품셈:5-1-2 거더 높이 증감계수, 형식=만약(형식 == '박스거더' 또는 형식 == '강바닥판 박스거더', '박스거더', '박스거더이외의형식')).증감계수)", + "출처": "건설품셈 토목 5-1-2 e" + }, + { "이름": "본체보정", "식": "1 + 증감a + 증감b + 증감cd + 증감e", "출처": "건설품셈 토목 5-1-2" } + ], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1010", + "이름": "철판공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:5-1-1 기본제작공수, 형식=형식).철판공 * 고강도보정 * 대형단품계수 * 부품계수 * 본체보정", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1012", + "이름": "용접공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:5-1-1 기본제작공수, 형식=형식).용접공 * 고강도보정 * 대형단품계수 * 부품계수 * 본체보정", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1009", + "이름": "철공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:5-1-1 기본제작공수, 형식=형식).가조립_철공 * 대형단품계수 * 본체보정", + "비목": "노무비" + } + ], + "덧줄": [ + { + "이름": "공장제작 제경비", + "식": "((찾기(소요량:건설품셈:5-1-1 기본제작공수, 형식=형식).철판공 * 고강도보정 * 대형단품계수 * 부품계수 * 본체보정) * 인력:건설노임:1010 + (찾기(소요량:건설품셈:5-1-1 기본제작공수, 형식=형식).용접공 * 고강도보정 * 대형단품계수 * 부품계수 * 본체보정) * 인력:건설노임:1012 + (찾기(소요량:건설품셈:5-1-1 기본제작공수, 형식=형식).가조립_철공 * 대형단품계수 * 본체보정) * 인력:건설노임:1009) * 찾기(계수:건설품셈:5-1-1 제경비, 항목='공장제작 제경비').비율 / 100", + "비목": "경비", + "출처": "건설품셈 토목 5-1-1 주⑤" + } + ], + "끝수": null, + "비고": "제작공수 = (절단·용접·단품 공수 × 고강도강 보정 × 대형단품계수 × 부품계수 + 가조립 공수 × 대형단품계수) × 본체 보정계수(5-1-2) · 해석: 강바닥판 플레이트거더·박스거더는 영향계수·증감계수에서 플레이트거더·박스거더로 봄 · 고강도강 SM 460·HSB 460 만 · 연수 1 이하면 증감계수 a 0 · 상하행선 분리면 연수 2배(설계자 입력) · 직선교는 곡률반경 500 이상 입력 · 높이 곡선변화 구간 곡률 500m 이상이면 「없음」 · 부품계수 150㎏ 한 점은 가운뎃줄(0.95)로 읽힘 — 원문 끝줄(0.9) · 제경비 = 표준제작공수 60%(주⑤) — 산재보험료·기타경비·간접노무비·일반관리비·이윤 제외 · 막힘: 제작도 작성(5-1-3 주①) 빠짐 — 건설노임에 「중급숙련기술자」 요소 없음" + }, + { + "열쇠": "5-1-3 기타재료 소요량", + "이름": "강교 제작 기타재료", + "결과단위": "원/ton", + "출처": "건설품셈 토목 5-1-3", + "소유": "공용", + "입력": [{ "이름": "잡품", "단위": "%", "범위": [0, 5], "출처": "건설품셈 토목 5-1-3 주②" }], + "중간": [], + "호표": [ + { + "종류": "재료", + "요소": "재료:자체:강교 용접봉", + "이름": "용접봉(강교 제작)", + "단위": "㎏", + "수량": "찾기(소요량:건설품셈:5-1-3 기타재료 소요량, 품명='용접봉').수량", + "비목": "재료비", + "출처": "건설품셈 토목 5-1-3" + }, + { + "종류": "재료", + "요소": "재료:나라장터자재:20204084", + "이름": "산소가스", + "단위": "L", + "수량": "찾기(소요량:건설품셈:5-1-3 기타재료 소요량, 품명='산소').수량 * 1000", + "비목": "재료비", + "출처": "건설품셈 토목 5-1-3" + }, + { + "종류": "재료", + "요소": "재료:나라장터자재:20204251", + "이름": "LPG(건설용)", + "단위": "kg", + "수량": "찾기(소요량:건설품셈:5-1-3 기타재료 소요량, 품명='LPG가스').수량", + "비목": "재료비", + "출처": "건설품셈 토목 5-1-3" + } + ], + "덧줄": [ + { + "이름": "잡품·기타", + "식": "(찾기(소요량:건설품셈:5-1-3 기타재료 소요량, 품명='용접봉').수량 * 재료:자체:강교 용접봉 + 찾기(소요량:건설품셈:5-1-3 기타재료 소요량, 품명='산소').수량 * 1000 * 재료:나라장터자재:20204084 + 찾기(소요량:건설품셈:5-1-3 기타재료 소요량, 품명='LPG가스').수량 * 재료:나라장터자재:20204251) * 잡품 / 100", + "비목": "재료비", + "출처": "건설품셈 토목 5-1-3 주②" + } + ], + "끝수": null, + "비고": "해석: 산소 ㎥ = 나라장터 산소가스 L × 1,000 · 잡품·기타 용접 재료비 5% 이내 — 설계자 입력(아니면 0) · 검사시험비 별도(주③) · 강판 재료 손실량 6% 이내(5-1-3)는 재료 수량 몫 · 공시에 없는 재료 = 재료_자체" + }, + { + "열쇠": "5-2-1 소재 표면처리", + "이름": "강교 소재 표면처리", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 5-2-1", + "소유": "공용", + "입력": [], + "중간": [], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1029", + "이름": "도장공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:5-2-1 소재 표면처리, 구분='도장공').수량", + "비목": "노무비" + }, + { + "종류": "재료", + "요소": "재료:자체:철구(Shot ball)", + "이름": "철구(Shot ball)", + "단위": "㎏", + "수량": "찾기(소요량:건설품셈:5-2-1 소재 표면처리, 구분='철구(Shot ball)').수량", + "비목": "재료비", + "출처": "건설품셈 토목 5-2-1" + }, + { + "종류": "재료", + "요소": "재료:자체:무기질아연말샵프라이머", + "이름": "무기질아연말 샵프라이머 도막두께 20μm", + "단위": "ℓ", + "수량": "찾기(소요량:건설품셈:5-2-1 소재 표면처리, 구분='무기질아연말샵프라이머', 규격='도막두께20μm').수량", + "비목": "재료비", + "출처": "건설품셈 토목 5-2-1" + } + ], + "덧줄": [], + "끝수": null, + "비고": "공장 Shot Blasting · 전처리프라이머(5-2-2 주①) · 인력품에 공장경비 포함 · 재료 할증 포함 · 공시에 없는 재료 = 재료_자체" + }, + { + "열쇠": "5-2-2 제품 표면처리", + "이름": "강교 제품 표면처리", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 5-2-2", + "소유": "공용", + "입력": [{ "이름": "면", "고르기": ["외면", "BOX 형상 내면"], "출처": "건설품셈 토목 5-2-2 비고" }], + "중간": [], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1029", + "이름": "도장공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:5-2-2 제품 표면처리, 구분='도장공').수량 * 만약(면 == '외면', 1, 1 + 찾기(계수:건설품셈:5-2-2 BOX 내면 할증, 항목='BOX 형상의 내면').할증률 / 100)", + "비목": "노무비" + }, + { + "종류": "재료", + "요소": "재료:자체:철편(Grit)", + "이름": "철편(Grit)", + "단위": "㎏", + "수량": "찾기(소요량:건설품셈:5-2-2 제품 표면처리, 구분='철편(Grit)').수량", + "비목": "재료비", + "출처": "건설품셈 토목 5-2-2" + } + ], + "덧줄": [], + "끝수": null, + "비고": "도장 전 Grit Blasting · SSPC SP10(주①②) · BOX 내면 인력품 60% 할증(비고) · 공시에 없는 재료 = 재료_자체" + }, + { + "열쇠": "5-2-3 도장재료 사용량", + "이름": "강교 도장재료", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 5-2-3", + "소유": "공용", + "입력": [ + { + "이름": "도료종별", + "고르기": ["무기질 아연말계 도료", "에폭시계 방청도료", "고고형분 에폭시계도료", "우레탄계 도료", "불소수지계 도료", "실록산계 도료", "세라믹계 방식도료", "세라믹계 우레탄도료"], + "출처": "건설품셈 토목 5-2-3 주①" + }, + { "이름": "도장구분", "고르기": ["공장도장", "현장도장"], "출처": "건설품셈 토목 5-2-3 주①" }, + { "이름": "도장", "고르기": ["하도", "중·상도"], "출처": "건설품셈 토목 5-2-3 주①" }, + { "이름": "도막두께", "단위": "μm", "출처": "건설품셈 토목 5-2-3" }, + { "이름": "도료단가", "단위": "원/ℓ", "출처": "건설품셈 토목 5-2-3" }, + { "이름": "희석재단가", "단위": "원/ℓ", "출처": "건설품셈 토목 5-2-3" } + ], + "중간": [ + { + "이름": "도료량", + "식": "도막두께 / (찾기(계수:건설품셈:5-2-3 고형분용적비, 도료종별=도료종별).고형분용적비 * 10) / (1 - 찾기(계수:건설품셈:5-2-3 손실률, 구분=도장구분, 도장=도장).손실률 / 100)", + "출처": "건설품셈 토목 5-2-3" + }, + { "이름": "희석재량", "식": "도료량 * 찾기(계수:건설품셈:5-2-3 희석재, 항목='희석재').비율 / 100", "출처": "건설품셈 토목 5-2-3" } + ], + "호표": [], + "덧줄": [ + { "이름": "도료", "식": "도료량 * 도료단가", "비목": "재료비", "출처": "건설품셈 토목 5-2-3" }, + { "이름": "희석재", "식": "희석재량 * 희석재단가", "비목": "재료비", "출처": "건설품셈 토목 5-2-3" }, + { + "이름": "잡재료", + "식": "(도료량 * 도료단가 + 희석재량 * 희석재단가) * 찾기(계수:건설품셈:5-2-3 잡재료, 항목='잡재료').비율 / 100", + "비목": "재료비", + "출처": "건설품셈 토목 5-2-3 주②" + } + ], + "끝수": null, + "비고": "도료 사용량 = 도막두께 ÷ (고형분용적비×10) ÷ (1−손실률) ℓ/㎡ · 희석재 25% · 잡재료 10%(주②) · 도료·희석재는 종류가 많아 단가를 설계자 입력 · 고형분용적비는 제작사 따라 바뀜(주①)" + }, + { + "열쇠": "5-2-4 도장", + "이름": "강교 도장(1회)", + "결과단위": "원/㎡", + "출처": "건설품셈 토목 5-2-4", + "소유": "공용", + "입력": [ + { "이름": "도장구분", "고르기": ["공장도장", "현장도장"], "출처": "건설품셈 토목 5-2-4" }, + { "이름": "면", "고르기": ["외면", "박스거더 내면"], "출처": "건설품셈 토목 5-2-4 주③" } + ], + "중간": [ + { + "이름": "도장면적", + "식": "만약(도장구분 == '공장도장', 찾기(소요량:건설품셈:5-2-4 도장, 구분='도장공').공장도장도장면적, 찾기(소요량:건설품셈:5-2-4 도장, 구분='도장공').현장도장도장면적) * 만약(면 == '외면', 1, 1 - 찾기(계수:건설품셈:5-2-4 내면 도장, 항목='박스거더 내면 도장과 같은 내면 도장').할감률 / 100)", + "출처": "건설품셈 토목 5-2-4" + } + ], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1029", + "이름": "도장공", + "단위": "인", + "수량": "만약(도장구분 == '공장도장', 찾기(소요량:건설품셈:5-2-4 도장, 구분='도장공').공장도장수량, 찾기(소요량:건설품셈:5-2-4 도장, 구분='도장공').현장도장수량) / 도장면적", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "만약(도장구분 == '공장도장', 찾기(소요량:건설품셈:5-2-4 도장, 구분='특별인부').공장도장수량, 찾기(소요량:건설품셈:5-2-4 도장, 구분='특별인부').현장도장수량) / 도장면적", + "비목": "노무비" + } + ], + "덧줄": [ + { + "이름": "공구손료 및 경장비", + "식": "((만약(도장구분 == '공장도장', 찾기(소요량:건설품셈:5-2-4 도장, 구분='도장공').공장도장수량, 찾기(소요량:건설품셈:5-2-4 도장, 구분='도장공').현장도장수량) / 도장면적) * 인력:건설노임:1029 + (만약(도장구분 == '공장도장', 찾기(소요량:건설품셈:5-2-4 도장, 구분='특별인부').공장도장수량, 찾기(소요량:건설품셈:5-2-4 도장, 구분='특별인부').현장도장수량) / 도장면적) * 인력:건설노임:1003) * 만약(도장구분 == '현장도장', 찾기(계수:건설품셈:5-2-4 현장도장 경장비, 항목='현장도장 공구손료 및 경장비').비율, 0) / 100", + "비목": "경비", + "출처": "건설품셈 토목 5-2-4 주⑥" + } + ], + "끝수": null, + "비고": "해석: 인력품 = 인력 호표 줄 금액 합(기계 조종원 제외) · 해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 도장 1회 · 신설교량(주①) · 공장도장 인력품에 공장경비 포함(주②) · 내면 도장 일당 도장면적 33% 할감(주③) · 현장도장만 공구손료·경장비 5%(주⑥)" + }, + { + "열쇠": "5-3-1 강재거더 지조립", + "이름": "강재거더 지조립", + "결과단위": "원/개소", + "출처": "건설품셈 토목 5-3-1", + "소유": "공용", + "입력": [ + { "이름": "형식", "고르기": ["개구제형", "폐합형"], "출처": "건설품셈 토목 5-3-1" }, + { "이름": "지조립장", "고르기": ["불량", "보통", "양호"], "출처": "건설품셈 토목 5-3-1 주④" }, + { + "이름": "크레인", + "고르기": [ + "2104-0010", + "2104-0015", + "2104-0020", + "2104-0025", + "2104-0030", + "2104-0035", + "2104-0040", + "2104-0045", + "2104-0050", + "2104-0060", + "2104-0070", + "2104-0080", + "2104-0100", + "2104-0130", + "2104-0160", + "2104-0200", + "2104-0220", + "2104-0250", + "2104-0300" + ] + }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + } + ], + "중간": [ + { + "이름": "시공량", + "식": "만약(형식 == '개구제형', 찾기(소요량:건설품셈:5-3-1 강재거더 지조립, 구분='인력', 품목='철공').기본조립개소수개구제형, 찾기(소요량:건설품셈:5-3-1 강재거더 지조립, 구분='인력', 품목='철공').기본조립개소수폐합형) + 만약(지조립장 == '보통', 0, 찾기(소요량:건설품셈:5-3-1 작업난이도, 구분=지조립장).작업난이도)", + "출처": "건설품셈 토목 5-3-1 주④" + } + ], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1009", + "이름": "철공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:5-3-1 강재거더 지조립, 구분='인력', 품목='철공').수량 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:5-3-1 강재거더 지조립, 구분='인력', 품목='특별인부').수량 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계=크레인, 지역=지역)", + "이름": "크레인", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:5-3-1 강재거더 지조립, 구분='장비', 품목='크레인', 규격='100~300ton').수량 * 8 / 시공량" + } + ], + "덧줄": [ + { + "이름": "공구손료 및 경장비", + "식": "((찾기(소요량:건설품셈:5-3-1 강재거더 지조립, 구분='인력', 품목='철공').수량 / 시공량) * 인력:건설노임:1009 + (찾기(소요량:건설품셈:5-3-1 강재거더 지조립, 구분='인력', 품목='특별인부').수량 / 시공량) * 인력:건설노임:1003) * 찾기(계수:건설품셈:5-3-1 경장비, 형식=형식).비율 / 100", + "비목": "경비", + "출처": "건설품셈 토목 5-3-1 주⑧" + } + ], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 크레인 원문 100~300ton — 작업여건 따라 설계자 고름 · 작업난이도 불량 −1 · 양호 +1 개소(주④) · 지조립장 조성·가설 벤트 제외(주⑤) · 해석: 인력품 = 인력 호표 줄 금액 합(기계 조종원 제외)" + }, + { + "열쇠": "5-3-2 강재거더 가설", + "이름": "강재거더 가설", + "결과단위": "원/개", + "출처": "건설품셈 토목 5-3-2", + "소유": "공용", + "입력": [ + { "이름": "형식", "고르기": ["개구제형", "폐합형"], "출처": "건설품셈 토목 5-3-2" }, + { "이름": "장소", "고르기": ["육상", "해상"], "출처": "건설품셈 토목 5-3-2 주⑥" }, + { "이름": "단일거더", "고르기": ["아님", "지조립 없이 단일거더 직접 인양"], "출처": "건설품셈 토목 5-3-2 주②" }, + { "이름": "확폭등", "고르기": ["아님", "확폭·과도교·과선교 지하 통로내"], "출처": "건설품셈 토목 5-3-2 주⑤" }, + { + "이름": "크레인", + "고르기": [ + "2104-0010", + "2104-0015", + "2104-0020", + "2104-0025", + "2104-0030", + "2104-0035", + "2104-0040", + "2104-0045", + "2104-0050", + "2104-0060", + "2104-0070", + "2104-0080", + "2104-0100", + "2104-0130", + "2104-0160", + "2104-0200", + "2104-0220", + "2104-0250", + "2104-0300" + ] + }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + } + ], + "중간": [ + { + "이름": "시공량", + "식": "만약(형식 == '개구제형', 찾기(소요량:건설품셈:5-3-2 강재거더 가설, 구분='인력', 품목='철공').가설개수개구제형, 찾기(소요량:건설품셈:5-3-2 강재거더 가설, 구분='인력', 품목='철공').가설개수폐합형) + 만약(단일거더 == '아님', 0, 찾기(계수:건설품셈:5-3-2 단일거더 추가, 항목='단일 강재거더 직접 인양 가설').개수) - 만약(확폭등 == '아님', 0, 찾기(계수:건설품셈:5-3-2 가설 개수 차감, 항목='교량 확폭, 과도교, 과선교 지하 통로내').개수)", + "출처": "건설품셈 토목 5-3-2 주②⑤" + } + ], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1009", + "이름": "철공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:5-3-2 강재거더 가설, 구분='인력', 품목='철공').수량 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1006", + "이름": "비계공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:5-3-2 강재거더 가설, 구분='인력', 품목='비계공').수량 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:5-3-2 강재거더 가설, 구분='인력', 품목='특별인부').수량 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1012", + "이름": "용접공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:5-3-2 강재거더 가설, 구분='인력', 품목='용접공').수량 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계=크레인, 지역=지역)", + "이름": "크레인", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:5-3-2 강재거더 가설, 구분='장비', 품목='크레인', 규격='100~300ton').수량 * 8 / 시공량" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비(조종원 없음), 기계='2106-0005', 지역=지역)", + "이름": "고소작업차 5ton", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:5-3-2 강재거더 가설, 구분='장비', 품목='고소작업차', 규격='5ton').수량 * 8 / 시공량" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1006", + "이름": "비계공", + "단위": "인", + "수량": "만약(장소 == '육상', 0, 찾기(계수:건설품셈:5-3-2 해상 추가 인원, 직종='비계공').인원 / 시공량)", + "비목": "노무비", + "출처": "건설품셈 토목 5-3-2 주⑥" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "만약(장소 == '육상', 0, 찾기(계수:건설품셈:5-3-2 해상 추가 인원, 직종='특별인부').인원 / 시공량)", + "비목": "노무비", + "출처": "건설품셈 토목 5-3-2 주⑥" + } + ], + "덧줄": [ + { + "이름": "공구손료 및 경장비", + "식": "((찾기(소요량:건설품셈:5-3-2 강재거더 가설, 구분='인력', 품목='철공').수량 / 시공량) * 인력:건설노임:1009 + (찾기(소요량:건설품셈:5-3-2 강재거더 가설, 구분='인력', 품목='비계공').수량 / 시공량) * 인력:건설노임:1006 + (찾기(소요량:건설품셈:5-3-2 강재거더 가설, 구분='인력', 품목='특별인부').수량 / 시공량) * 인력:건설노임:1003 + (찾기(소요량:건설품셈:5-3-2 강재거더 가설, 구분='인력', 품목='용접공').수량 / 시공량) * 인력:건설노임:1012 + (만약(장소 == '육상', 0, 찾기(계수:건설품셈:5-3-2 해상 추가 인원, 직종='비계공').인원 / 시공량)) * 인력:건설노임:1006 + (만약(장소 == '육상', 0, 찾기(계수:건설품셈:5-3-2 해상 추가 인원, 직종='특별인부').인원 / 시공량)) * 인력:건설노임:1003) * 찾기(계수:건설품셈:5-3-2 경장비, 장소=장소, 형식=형식).인력품대비 / 100", + "비목": "경비", + "출처": "건설품셈 토목 5-3-2 주⑪" + } + ], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 크레인 원문 100~300ton — 작업여건 따라 설계자 고름 · 해상 가설은 비계공·특별인부 2인씩 추가(주⑥) · 바지선 등 별도 · 높이 할증 없음(주⑧) · 해석: 인력품 = 인력 호표 줄 금액 합(기계 조종원 제외)" + }, + { + "열쇠": "5-3-3 기타 부재 설치", + "이름": "강교 기타 부재 설치", + "결과단위": "원/ton", + "출처": "건설품셈 토목 5-3-3", + "소유": "공용", + "입력": [ + { "이름": "장소", "고르기": ["육상", "해상"], "출처": "건설품셈 토목 5-3-3 주②" }, + { + "이름": "크레인", + "고르기": [ + "2104-0010", + "2104-0015", + "2104-0020", + "2104-0025", + "2104-0030", + "2104-0035", + "2104-0040", + "2104-0045", + "2104-0050", + "2104-0060", + "2104-0070", + "2104-0080", + "2104-0100", + "2104-0130", + "2104-0160", + "2104-0200", + "2104-0220", + "2104-0250", + "2104-0300" + ] + }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + } + ], + "중간": [{ "이름": "시공량", "식": "찾기(소요량:건설품셈:5-3-3 기타 부재 설치, 구분='인력', 품목='철공').설치수량" }], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1009", + "이름": "철공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:5-3-3 기타 부재 설치, 구분='인력', 품목='철공').수량 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1006", + "이름": "비계공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:5-3-3 기타 부재 설치, 구분='인력', 품목='비계공').수량 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "찾기(소요량:건설품셈:5-3-3 기타 부재 설치, 구분='인력', 품목='특별인부').수량 / 시공량", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1012", + "이름": "용접공", + "단위": "인", + "수량": "찾기(소요량:건설품셈:5-3-3 기타 부재 설치, 구분='인력', 품목='용접공').수량 / 시공량", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계=크레인, 지역=지역)", + "이름": "크레인", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:5-3-3 기타 부재 설치, 구분='장비', 품목='크레인', 규격='100~300ton').수량 * 8 / 시공량" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "만약(장소 == '육상', 0, 찾기(계수:건설품셈:5-3-3 해상 추가 인원, 항목='특별인부').인원 / 시공량)", + "비목": "노무비", + "출처": "건설품셈 토목 5-3-3 주②" + } + ], + "덧줄": [ + { + "이름": "공구손료 및 경장비", + "식": "((찾기(소요량:건설품셈:5-3-3 기타 부재 설치, 구분='인력', 품목='철공').수량 / 시공량) * 인력:건설노임:1009 + (찾기(소요량:건설품셈:5-3-3 기타 부재 설치, 구분='인력', 품목='비계공').수량 / 시공량) * 인력:건설노임:1006 + (찾기(소요량:건설품셈:5-3-3 기타 부재 설치, 구분='인력', 품목='특별인부').수량 / 시공량) * 인력:건설노임:1003 + (찾기(소요량:건설품셈:5-3-3 기타 부재 설치, 구분='인력', 품목='용접공').수량 / 시공량) * 인력:건설노임:1012 + (만약(장소 == '육상', 0, 찾기(계수:건설품셈:5-3-3 해상 추가 인원, 항목='특별인부').인원 / 시공량)) * 인력:건설노임:1003) * 찾기(계수:건설품셈:5-3-3 경장비, 항목='공구손료 및 경장비').비율 / 100", + "비목": "경비", + "출처": "건설품셈 토목 5-3-3 주⑤" + } + ], + "끝수": null, + "비고": "해석: 일당 편성 장비 1대 × 1일 8시간 ÷ 일당 시공량(산림품셈 12장 로직과 같음) · 크레인 원문 100~300ton — 작업여건 따라 설계자 고름 · 가로보·캔틸레버보·엔드빔·형강류 육상 설치(주①) · 해석: 인력품 = 인력 호표 줄 금액 합(기계 조종원 제외)" + } + ] +} diff --git a/resources/master_data/재료_자체.json b/resources/master_data/재료_자체.json index ce46efdb..3c7953f6 100644 --- a/resources/master_data/재료_자체.json +++ b/resources/master_data/재료_자체.json @@ -98,6 +98,10 @@ { "열쇠": "테르밋용재", "이름": "테르밋용재", "규격": "점화용", "단위": "포", "값": null, "출처": "자체", "비고": "건설품셈 토목 4-5-2 테르밋 용접 소모재료(참고자료)" }, { "열쇠": "테르밋 몰드", "이름": "몰드", "규격": "테르밋 용접용", "단위": "개", "값": null, "출처": "자체", "비고": "건설품셈 토목 4-5-2 테르밋 용접 소모재료(참고자료)" }, { "열쇠": "테르밋 골무", "이름": "골무", "규격": "테르밋 용접용", "단위": "개", "값": null, "출처": "자체", "비고": "건설품셈 토목 4-5-2 테르밋 용접 소모재료(참고자료)" }, - { "열쇠": "테르밋 퓨즈", "이름": "퓨즈", "규격": "테르밋 용접용", "단위": "개", "값": null, "출처": "자체", "비고": "건설품셈 토목 4-5-2 테르밋 용접 소모재료(참고자료)" } + { "열쇠": "테르밋 퓨즈", "이름": "퓨즈", "규격": "테르밋 용접용", "단위": "개", "값": null, "출처": "자체", "비고": "건설품셈 토목 4-5-2 테르밋 용접 소모재료(참고자료)" }, + { "열쇠": "강교 용접봉", "이름": "용접봉", "규격": "강교 제작용", "단위": "㎏", "값": null, "출처": "자체", "비고": "건설품셈 토목 5-1-3 기타재료 소요량" }, + { "열쇠": "철구(Shot ball)", "이름": "철구(Shot ball)", "규격": "", "단위": "㎏", "값": null, "출처": "자체", "비고": "건설품셈 토목 5-2-1 소재 표면처리" }, + { "열쇠": "무기질아연말샵프라이머", "이름": "무기질아연말 샵프라이머", "규격": "도막두께 20μm", "단위": "ℓ", "값": null, "출처": "자체", "비고": "건설품셈 토목 5-2-1 소재 표면처리" }, + { "열쇠": "철편(Grit)", "이름": "철편(Grit)", "규격": "", "단위": "㎏", "값": null, "출처": "자체", "비고": "건설품셈 토목 5-2-2 제품 표면처리" } ] } diff --git a/resources/tester/test_masterdata_check.py b/resources/tester/test_masterdata_check.py index d9579a0d..47655884 100644 --- a/resources/tester/test_masterdata_check.py +++ b/resources/tester/test_masterdata_check.py @@ -23,6 +23,7 @@ SAMPLES = [ "로직_건설품셈_토목2장.json", "로직_건설품셈_토목3장.json", "로직_건설품셈_토목4장.json", + "로직_건설품셈_토목5장.json", "로직_건설품셈_토목6장.json", "로직_산림품셈_03장.json", "로직_산림품셈_04장.json", @@ -314,6 +315,25 @@ def test_토목_궤광조립_직결형_단선감(whole): assert got["줄"][0]["수량"] == Decimal(16) / Decimal("237.5") +def test_토목_강교_제작공수_보정(whole): + """토목 5-1-2 — 연수 2 는 「이상·이하」 [2,2] · 총중량 표 범위규칙 뒤 괄호 설명은 뺌.""" + given = { + "형식": "박스거더", + "고강도강비율": Decimal("0.5"), + "대형단품평균중량": 12, + "부품평균중량": 120, + "연수": 2, + "총중량": 600, + "사각": 60, + "곡률반경": 200, + "높이곡선변화": "있음", + } + got = mf.run(whole, "건설품셈:5-1-1 기본제작공수", given) + # 0.95 × (1 + 0.25×0.5) × 0.97 × 0.95 × (1 − 0.03 − 0.02 + 0.25 + 0.11) + want = Decimal("0.95") * Decimal("1.125") * Decimal("0.97") * Decimal("0.95") * Decimal("1.31") + assert got["줄"][0]["수량"] == want + + def test_범위_입력은_막음(whole): with pytest.raises(mf.FormulaError): mf.run(