diff --git a/resources/master_data/_틀.md b/resources/master_data/_틀.md index 712bde71..5aabe020 100644 --- a/resources/master_data/_틀.md +++ b/resources/master_data/_틀.md @@ -60,6 +60,7 @@ ``` - 조건 종류 — `수`(같은 값) · `고르기`(글자) · `범위`(줄에 `[아래, 위]` · 끝 열림은 `null` · 포함 여부는 `범위규칙` 에 「초과·이하」처럼). +- `범위규칙` 첫 마디 = 엔진이 읽는 이름 — 「초과·이하」 · 「이상·미만」 · 「이하」(위 끝만) · 「이상·이하」(양 끝 포함). 뒤 마디(` · ` 뒤)는 원문 설명. 「이하」 · 「이상·이하」는 여러 줄이 맞으면 위 끝이 가장 작은 줄. - 원문 「-」 칸은 줄에서 그 값 칸을 뺌. 줄 전체가 「-」 면 줄을 뺌. - 원문에 없는 조건 칸은 줄에서 뺌 — 빈 조건 칸은 그 조건에 무엇이든 맞음. - 값 칸에 범위(「80 ∼ 100」)는 `[아래, 위]` — 로직은 설계자 입력 칸으로 받음(기본값 두지 않음). diff --git a/resources/master_data/scripts/master_formula.py b/resources/master_data/scripts/master_formula.py index fa8003a3..1acf0107 100644 --- a/resources/master_data/scripts/master_formula.py +++ b/resources/master_data/scripts/master_formula.py @@ -273,6 +273,8 @@ def _match(table: dict, row: dict, cond: str, want) -> bool: ) if rule == "이하": # 칸마다 위 끝만 — 맞는 줄 가운데 위 끝이 가장 작은 줄(find) return (low is None or want > low) and (high is None or want <= high) + if rule == "이상·이하": # 양 끝 포함 — 이웃 칸 끝이 겹치면 위 끝이 가장 작은 줄(find) + return (low is None or want >= low) and (high is None or want <= high) raise FormulaError(f"모르는 범위규칙 「{table.get('범위규칙')}」") return have == want @@ -282,7 +284,7 @@ def find(table: dict, conds: dict, want: str | None = None) -> dict: if cond not in table.get("조건", {}): raise FormulaError(f"「{table['열쇠']}」 에 없는 조건 「{cond}」") hits = [row for row in table["줄"] if all(_match(table, row, c, v) for c, v in conds.items())] - if len(hits) > 1 and table.get("범위규칙", "").split(" · ")[0] == "이하": + if len(hits) > 1 and table.get("범위규칙", "").split(" · ")[0] in ("이하", "이상·이하"): for c in conds: ups = [r[c][1] for r in hits if table["조건"].get(c) == "범위" and r.get(c)] if ups and None not in ups: diff --git a/resources/master_data/로직_건설품셈_공통2장.json b/resources/master_data/로직_건설품셈_공통2장.json index 56b40278..c6d2ade6 100644 --- a/resources/master_data/로직_건설품셈_공통2장.json +++ b/resources/master_data/로직_건설품셈_공통2장.json @@ -3858,6 +3858,52 @@ "덧줄": [], "끝수": null }, + { + "열쇠": "2-9-12 사각지대 충돌방지장치 설치 및 해체", + "이름": "굴착기 사각지대 충돌방지장치 설치 및 해체", + "결과단위": "원/개", + "출처": "건설품셈 공통 2-9-12", + "소유": "공용", + "입력": [], + "중간": [ + { + "이름": "중급기술자", + "식": "찾기(소요량:건설품셈:2-9-12 사각지대 충돌방지장치 설치 및 해체, 구분='중급기술자').수량" + }, + { + "이름": "특별인부", + "식": "찾기(소요량:건설품셈:2-9-12 사각지대 충돌방지장치 설치 및 해체, 구분='특별인부').수량" + } + ], + "호표": [ + { + "종류": "인력", + "요소": "인력:자체:중급기술자", + "이름": "중급기술자", + "단위": "인", + "수량": "중급기술자", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "특별인부", + "비목": "노무비" + } + ], + "덧줄": [ + { + "이름": "공구손료 및 경장비", + "식": "(중급기술자 * 인력:자체:중급기술자 + 특별인부 * 인력:건설노임:1003) * 찾기(소요량:건설품셈:2-9-12 계수, 구분='공구손료 및 경장비 기계경비(인력품 기준)').값 / 100", + "비목": "경비", + "출처": "건설품셈 공통 2-9-12" + } + ], + "끝수": null, + "비고": "카메라 · 모니터 · 통신라인 포함 · 장치 재료 별도 · 해석: 중급기술자 = 인력_자체(건설노임에 없음 — 값은 관리자가 채움)" + }, { "열쇠": "2-10-1 비계주위 보호막 설치 및 해체", "이름": "비계주위 보호막 설치 및 해체", @@ -4915,6 +4961,130 @@ ], "끝수": null }, + { + "열쇠": "2-11-8 지능형 CCTV 설치 및 해체", + "이름": "지능형 CCTV 설치 및 해체", + "결과단위": "원/개", + "출처": "건설품셈 공통 2-11-8", + "소유": "공용", + "입력": [ + { + "이름": "설치장소", + "고르기": [ + "지상 또는 건물 설치", + "타워크레인 설치" + ] + } + ], + "중간": [ + { + "이름": "SW시험사", + "식": "찾기(소요량:건설품셈:2-11-8 지능형 CCTV 설치 및 해체, 구분='S/W 시험사', 설치장소=설치장소).수량" + }, + { + "이름": "중급기술자", + "식": "찾기(소요량:건설품셈:2-11-8 지능형 CCTV 설치 및 해체, 구분='중급기술자', 설치장소=설치장소).수량" + }, + { + "이름": "특별인부", + "식": "찾기(소요량:건설품셈:2-11-8 지능형 CCTV 설치 및 해체, 구분='특별인부', 설치장소=설치장소).수량" + } + ], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:2003", + "이름": "S/W시험사", + "단위": "인", + "수량": "SW시험사", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:자체:중급기술자", + "이름": "중급기술자", + "단위": "인", + "수량": "중급기술자", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "특별인부", + "비목": "노무비" + } + ], + "덧줄": [ + { + "이름": "공구손료 및 경장비", + "식": "(SW시험사 * 인력:건설노임:2003 + 중급기술자 * 인력:자체:중급기술자 + 특별인부 * 인력:건설노임:1003) * 찾기(소요량:건설품셈:2-11-8 계수, 구분='공구손료 및 경장비 기계경비(인력품 기준)').값 / 100", + "비목": "경비", + "출처": "건설품셈 공통 2-11-8" + } + ], + "끝수": null, + "비고": "고정형 · 라인포설 · 고정대(용접) · 폴대 · 고소작업차 별도 · 해석: 원문 규격 칸 「설치」 · 「설치, 해체」 = 그 직종이 맡는 작업 — 개당 품은 셋의 합 · 해석: 중급기술자 = 인력_자체(건설노임에 없음 — 값은 관리자가 채움)" + }, + { + "열쇠": "2-11-9 지능형 출입관리 설치 및 해체", + "이름": "지능형 출입관리 설치 및 해체", + "결과단위": "원/개", + "출처": "건설품셈 공통 2-11-9", + "소유": "공용", + "입력": [], + "중간": [ + { + "이름": "SW시험사", + "식": "찾기(소요량:건설품셈:2-11-9 지능형 출입관리 설치 및 해체, 구분='S/W 시험사').수량" + }, + { + "이름": "중급기술자", + "식": "찾기(소요량:건설품셈:2-11-9 지능형 출입관리 설치 및 해체, 구분='중급기술자').수량" + }, + { + "이름": "특별인부", + "식": "찾기(소요량:건설품셈:2-11-9 지능형 출입관리 설치 및 해체, 구분='특별인부').수량" + } + ], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:2003", + "이름": "S/W시험사", + "단위": "인", + "수량": "SW시험사", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:자체:중급기술자", + "이름": "중급기술자", + "단위": "인", + "수량": "중급기술자", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "특별인부", + "비목": "노무비" + } + ], + "덧줄": [ + { + "이름": "공구손료 및 경장비", + "식": "(SW시험사 * 인력:건설노임:2003 + 중급기술자 * 인력:자체:중급기술자 + 특별인부 * 인력:건설노임:1003) * 찾기(소요량:건설품셈:2-11-9 계수, 구분='공구손료 및 경장비 기계경비(인력품 기준)').값 / 100", + "비목": "경비", + "출처": "건설품셈 공통 2-11-9" + } + ], + "끝수": null, + "비고": "턴게이트 · 안면인식 장비 · 라인포설 · 용접 별도 · 해석: 원문 규격 칸 「설치」 · 「설치, 해체」 = 그 직종이 맡는 작업 — 개당 품은 셋의 합 · 해석: 중급기술자 = 인력_자체(건설노임에 없음 — 값은 관리자가 채움)" + }, { "열쇠": "2-12-1 건설용리프트 설치 및 해체", "이름": "건설용리프트 설치 및 해체", @@ -5095,6 +5265,504 @@ "덧줄": [], "끝수": null, "비고": "손료는 2-2-6" + }, + { + "열쇠": "2-12-4 파이프 루프공 장비 조립해체", + "이름": "파이프 루프공 장비 조립해체", + "결과단위": "원/회", + "출처": "건설품셈 공통 2-12-4", + "소유": "공용", + "입력": [ + { + "이름": "크레인", + "고르기": [ + "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", + "2105-0002", + "2105-0003", + "2105-0005", + "2105-0010", + "2105-0015", + "2105-0018" + ], + "출처": "건설품셈 공통 2-12-4", + "비고": "원문 크레인(타이어) 20ton · 규격은 작업여건 따라" + }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + } + ], + "중간": [ + { + "이름": "일수", + "식": "찾기(소요량:건설품셈:2-12-4 장비 조립해체, 구분='소요일수', 명칭='조립').수량 + 찾기(소요량:건설품셈:2-12-4 장비 조립해체, 구분='소요일수', 명칭='해체').수량", + "출처": "건설품셈 공통 2-12-4" + }, + { + "이름": "일반기계운전사", + "식": "찾기(소요량:건설품셈:2-12-4 장비 조립해체, 구분='편성인원', 명칭='일반기계운전사').수량 * 일수" + }, + { + "이름": "기계설비공", + "식": "찾기(소요량:건설품셈:2-12-4 장비 조립해체, 구분='편성인원', 명칭='기계설비공').수량 * 일수" + }, + { + "이름": "보통인부", + "식": "찾기(소요량:건설품셈:2-12-4 장비 조립해체, 구분='편성인원', 명칭='보통인부').수량 * 일수" + } + ], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1050", + "이름": "일반기계운전사", + "단위": "인", + "수량": "일반기계운전사", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1051", + "이름": "기계설비공", + "단위": "인", + "수량": "기계설비공", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "보통인부", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계=크레인, 지역=지역)", + "이름": "크레인(타이어)", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:2-12-4 장비 조립해체, 구분='편성장비', 명칭='크레인(타이어)').수량 * 8 * 일수" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 인력 · 크레인(1대 × 8시간)은 조립 3일 + 해체 2일" + }, + { + "열쇠": "2-12-4 파이프 루프공 추진", + "이름": "파이프 루프공 강관 추진", + "결과단위": "원/m", + "출처": "건설품셈 공통 2-12-4", + "소유": "공용", + "입력": [ + { + "이름": "토질별", + "고르기": [ + "점토・실트", + "사질토", + "자갈모래층 풍화암", + "호박돌 섞인 자갈모래층" + ] + }, + { + "이름": "관경", + "단위": "㎜", + "범위": [ + 300, + 1200 + ], + "출처": "건설품셈 공통 2-12-4", + "비고": "추진 강관 지름" + }, + { + "이름": "추진장", + "단위": "m", + "범위": [ + 0, + 50 + ], + "출처": "건설품셈 공통 2-12-4", + "비고": "누적 추진장 — 0∼10m 등 칸" + }, + { + "이름": "파이프추진기", + "고르기": [ + "5202-0127", + "5202-0240", + "5202-0300" + ], + "출처": "건설품셈 공통 2-12-4", + "비고": "원문 140∼300ton" + }, + { + "이름": "크레인", + "고르기": [ + "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", + "2105-0002", + "2105-0003", + "2105-0005", + "2105-0010", + "2105-0015", + "2105-0018" + ], + "출처": "건설품셈 공통 2-12-4", + "비고": "원문 크레인(타이어) 20ton · 규격은 작업여건 따라" + }, + { + "이름": "용접기", + "고르기": [ + "7611-0200", + "7612-0200" + ], + "출처": "건설품셈 공통 2-12-4", + "비고": "원문 200AMP" + }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + } + ], + "중간": [ + { + "이름": "작업능력", + "식": "찾기(소요량:건설품셈:2-12-4 작업능력, 토질별=토질별, '관경(㎜)'=관경, '추진장(m)'=추진장).작업능력", + "출처": "건설품셈 공통 2-12-4" + }, + { + "이름": "중급기술자", + "식": "찾기(소요량:건설품셈:2-12-4 작업편성인원, 명칭='중급기술자', '추진관경(㎜)'=관경).수량 / 작업능력" + }, + { + "이름": "특별인부", + "식": "찾기(소요량:건설품셈:2-12-4 작업편성인원, 명칭='특별인부', '추진관경(㎜)'=관경).수량 / 작업능력" + }, + { + "이름": "보통인부", + "식": "찾기(소요량:건설품셈:2-12-4 작업편성인원, 명칭='보통인부', '추진관경(㎜)'=관경).수량 / 작업능력" + }, + { + "이름": "용접공", + "식": "찾기(소요량:건설품셈:2-12-4 작업편성인원, 명칭='용접공', '추진관경(㎜)'=관경).수량 / 작업능력" + } + ], + "호표": [ + { + "종류": "인력", + "요소": "인력:자체:중급기술자", + "이름": "중급기술자", + "단위": "인", + "수량": "중급기술자", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "특별인부", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "보통인부", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1012", + "이름": "용접공", + "단위": "인", + "수량": "용접공", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 손료, 기계=파이프추진기)", + "이름": "파이프추진기", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:2-12-4 작업편성장비, 장비명='파이프추진기').수량 * 8 / 작업능력" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계=크레인, 지역=지역)", + "이름": "크레인(타이어)", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:2-12-4 작업편성장비, 장비명='크레인(타이어)').수량 * 8 / 작업능력" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계='7505-0050', 지역=지역)", + "이름": "발전기 50㎾", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:2-12-4 작업편성장비, 장비명='발전기').수량 * 8 / 작업능력" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 손료, 기계=용접기)", + "이름": "용접기 200AMP", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:2-12-4 작업편성장비, 장비명='용접기').수량 * 8 / 작업능력" + } + ], + "덧줄": [], + "끝수": null, + "비고": "강관장 6.0m · 강관 용접품 포함 · 강관 재료 별도 · 호박돌 섞인 자갈모래층 300∼500㎜ 는 원문 「-」 · 해석: 일당 편성 ÷ 작업능력 = m당 · 기계 1대 × 8시간 ÷ 작업능력 = 시간 · 중급기술자 = 인력_자체(건설노임에 없음 — 값은 관리자가 채움)" + }, + { + "열쇠": "2-12-4 파이프 루프공 기계이동 설치", + "이름": "파이프 루프공 추진기 이동설치", + "결과단위": "원/회", + "출처": "건설품셈 공통 2-12-4", + "소유": "공용", + "입력": [ + { + "이름": "이동구분", + "고르기": [ + "수평이동", + "수직이동", + "경사이동" + ] + }, + { + "이름": "이동용장비", + "고르기": [ + "크레인(20ton)", + "잭" + ] + }, + { + "이름": "관경", + "단위": "㎜", + "범위": [ + 300, + 1200 + ], + "출처": "건설품셈 공통 2-12-4", + "비고": "추진 강관 지름" + }, + { + "이름": "크레인", + "고르기": [ + "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", + "2105-0002", + "2105-0003", + "2105-0005", + "2105-0010", + "2105-0015", + "2105-0018" + ], + "출처": "건설품셈 공통 2-12-4", + "비고": "원문 크레인(타이어) 20ton · 규격은 작업여건 따라" + }, + { + "이름": "잭", + "고르기": [ + "5204-0200", + "5204-0300", + "5204-0400", + "5204-0500", + "5204-0600" + ], + "출처": "건설품셈 공통 2-12-4", + "비고": "원문 「잭」 규격 없음 — 설계자가 고름" + }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + } + ], + "중간": [ + { + "이름": "시간", + "식": "찾기(소요량:건설품셈:2-12-4 기계이동 설치, 이동구분=이동구분, '이동용 장비'=이동용장비).소요시간 / 60", + "출처": "건설품셈 공통 2-12-4" + }, + { + "이름": "중급기술자", + "식": "찾기(소요량:건설품셈:2-12-4 작업편성인원, 명칭='중급기술자', '추진관경(㎜)'=관경).수량 * 시간 / 8" + }, + { + "이름": "특별인부", + "식": "찾기(소요량:건설품셈:2-12-4 작업편성인원, 명칭='특별인부', '추진관경(㎜)'=관경).수량 * 시간 / 8" + }, + { + "이름": "보통인부", + "식": "찾기(소요량:건설품셈:2-12-4 작업편성인원, 명칭='보통인부', '추진관경(㎜)'=관경).수량 * 시간 / 8" + }, + { + "이름": "용접공", + "식": "찾기(소요량:건설품셈:2-12-4 작업편성인원, 명칭='용접공', '추진관경(㎜)'=관경).수량 * 시간 / 8" + } + ], + "호표": [ + { + "종류": "인력", + "요소": "인력:자체:중급기술자", + "이름": "중급기술자", + "단위": "인", + "수량": "중급기술자", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "특별인부", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "보통인부", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1012", + "이름": "용접공", + "단위": "인", + "수량": "용접공", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계=크레인, 지역=지역)", + "이름": "크레인(타이어)", + "단위": "시간", + "수량": "만약(이동용장비 == '크레인(20ton)', 시간, 0)" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 손료, 기계=잭)", + "이름": "유압잭", + "단위": "시간", + "수량": "만약(이동용장비 == '잭', 시간, 0)", + "비고": "해석: 잭 = 유압잭" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 인원편성은 강관추진공과 같음(주②) — 작업편성인원 × 소요시간 ÷ 8시간 · 이동용 장비 1대 × 소요시간 · 중급기술자 = 인력_자체(건설노임에 없음 — 값은 관리자가 채움)" } ] } diff --git a/resources/master_data/로직_건설품셈_공통5장.json b/resources/master_data/로직_건설품셈_공통5장.json index 3f17396c..cc8867e1 100644 --- a/resources/master_data/로직_건설품셈_공통5장.json +++ b/resources/master_data/로직_건설품셈_공통5장.json @@ -1075,6 +1075,100 @@ "끝수": null, "비고": "시멘트 · 혼화재 · 물 · 살수차 별도 · 믹서·펌프 손료만 · 해석: 기계 1대 × 1일 8시간(건설품셈 공통 1-1) ÷ 일당 시공량 = 시간" }, + { + "열쇠": "5-1-7 인장", + "이름": "앵커 인장", + "결과단위": "원/개소", + "출처": "건설품셈 공통 5-1-7", + "소유": "공용", + "입력": [ + { + "이름": "인장기", + "고르기": [ + "6516-0060", + "6516-0120", + "6516-0250", + "6516-0300" + ], + "출처": "건설품셈 공통 5-1-7", + "비고": "원문 60ton · 소요 긴장력 따라 바꿈(주④)" + } + ], + "중간": [ + { + "이름": "시공량", + "식": "찾기(소요량:건설품셈:5-1-7 인장).시공량", + "출처": "건설품셈 공통 5-1-7" + }, + { + "이름": "중급기술자", + "식": "찾기(소요량:건설품셈:5-1-7 인장, 구분='중급기술자').수량 / 시공량" + }, + { + "이름": "보링공", + "식": "찾기(소요량:건설품셈:5-1-7 인장, 구분='보링공').수량 / 시공량" + }, + { + "이름": "특별인부", + "식": "찾기(소요량:건설품셈:5-1-7 인장, 구분='특별인부').수량 / 시공량" + }, + { + "이름": "보통인부", + "식": "찾기(소요량:건설품셈:5-1-7 인장, 구분='보통인부').수량 / 시공량" + } + ], + "호표": [ + { + "종류": "인력", + "요소": "인력:자체:중급기술자", + "이름": "중급기술자", + "단위": "인", + "수량": "중급기술자", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1014", + "이름": "보링공", + "단위": "인", + "수량": "보링공", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1003", + "이름": "특별인부", + "단위": "인", + "수량": "특별인부", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "보통인부", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 손료, 기계=인장기)", + "이름": "강연선인장기", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:5-1-7 인장, 구분='강연선인장기').수량 * 1 * 8 / 시공량" + } + ], + "덧줄": [ + { + "이름": "공구손료 및 경장비", + "식": "(중급기술자 * 인력:자체:중급기술자 + 보링공 * 인력:건설노임:1014 + 특별인부 * 인력:건설노임:1003 + 보통인부 * 인력:건설노임:1002) * 찾기(소요량:건설품셈:5-1 공구손료·경장비 보정 — 그룹 계수, 항목='5-1-7 인장').비율 / 100", + "비목": "경비", + "출처": "건설품셈 공통 5-1-7" + } + ], + "끝수": null, + "비고": "강연선 4가닥 앵커체 · 좌대는 기성제품(설치·해체는 「5-1-7 인장 좌대 설치·해체」) · 브라켓 · 소모재료 별도 · 해석: 중급기술자 = 인력_자체(건설노임에 없음 — 값은 관리자가 채움) · 해석: 기계 1대 × 1일 8시간(건설품셈 공통 1-1) ÷ 일당 시공량 = 시간" + }, { "열쇠": "5-1-7 인장 좌대 설치·해체", "이름": "앵커 인장 좌대 설치·해체", diff --git a/resources/master_data/로직_건설품셈_공통6장.json b/resources/master_data/로직_건설품셈_공통6장.json index c9237859..da94adf1 100644 --- a/resources/master_data/로직_건설품셈_공통6장.json +++ b/resources/master_data/로직_건설품셈_공통6장.json @@ -857,6 +857,106 @@ "끝수": null, "비고": "운반비 별도 · 해석: 공장관리비 비목 = 경비" }, + { + "열쇠": "6-2-5 철근의 기계적 이음", + "이름": "철근의 기계적 이음(화약 용접)", + "결과단위": "원/개소", + "출처": "건설품셈 공통 6-2-5", + "소유": "공용", + "입력": [ + { + "이름": "높이", + "고르기": [ + "10m 미만", + "10m∼20m미만", + "20m 이상" + ], + "출처": "건설품셈 공통 6-2-5 비고" + }, + { + "이름": "두께가산횟수", + "단위": "회", + "출처": "건설품셈 공통 6-2-5 비고", + "비고": "철근 두께 3㎜ 증가마다 1회 — 인력품 5% 가산" + } + ], + "중간": [ + { + "이름": "할증", + "식": "1 + (두께가산횟수 * 5 + 만약(높이 == '10m 미만', 0, 찾기(소요량:건설품셈:6-2-5 높이별 요율, 높이=높이).요율)) / 100", + "출처": "건설품셈 공통 6-2-5 비고" + }, + { + "이름": "용접공", + "식": "찾기(소요량:건설품셈:6-2-5 철근의 기계적 이음).용접공 * 할증" + }, + { + "이름": "연마공", + "식": "찾기(소요량:건설품셈:6-2-5 철근의 기계적 이음).연마공 * 할증" + }, + { + "이름": "절단공", + "식": "찾기(소요량:건설품셈:6-2-5 철근의 기계적 이음).절단공 * 할증" + }, + { + "이름": "조력공", + "식": "찾기(소요량:건설품셈:6-2-5 철근의 기계적 이음).조력공 * 할증" + } + ], + "호표": [ + { + "종류": "인력", + "요소": "인력:건설노임:1012", + "이름": "용접공", + "단위": "인", + "수량": "용접공", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1032", + "이름": "연마공", + "단위": "인", + "수량": "연마공", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:자체:절단공", + "이름": "절단공", + "단위": "인", + "수량": "절단공", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1004", + "이름": "조력공", + "단위": "인", + "수량": "조력공", + "비목": "노무비" + }, + { + "종류": "재료", + "요소": "재료:자체:아세틸렌가스(ℓ)", + "이름": "아세틸렌가스", + "단위": "ℓ", + "수량": "찾기(소요량:건설품셈:6-2-5 철근의 기계적 이음).아세틸렌", + "비목": "재료비" + }, + { + "종류": "재료", + "요소": "재료:나라장터자재:20204084", + "이름": "산소", + "단위": "ℓ", + "수량": "찾기(소요량:건설품셈:6-2-5 철근의 기계적 이음).산소", + "비목": "재료비" + } + ], + "덧줄": [], + "끝수": null, + "비고": "D35㎜ 이상 · 원자로 격납시설물 등 특수구조물 · 이음자재(Splices Kit) · 공구손료 · 잡재료 · 검사비 별도 · 연마공 = 건설노임 1032 미공표(값 없음) — 공표·관리자 입력 전엔 계산 막힘 · 해석: 절단공 = 인력_자체(건설노임에 없음 — 값은 관리자가 채움) · 아세틸렌 = 자체 ℓ 단위(나라장터는 kg — 환산값 원문 없음)" + }, { "열쇠": "6-2-6 GFRP 보강근 현장조립", "이름": "GFRP 보강근 현장조립", @@ -1642,7 +1742,96 @@ ], "덧줄": [], "끝수": null, - "비고": "해석: 크레인 = 크레인(타이어) · 해체는 「특수비계공」 노임 요소가 없어 못 만듦 · 제작·고재처리 별도" + "비고": "해석: 크레인 = 크레인(타이어) · 해체는 「6-3-6 슬립폼 해체」 · 제작·고재처리 별도" + }, + { + "열쇠": "6-3-6 슬립폼 해체", + "이름": "슬립폼 해체", + "결과단위": "원/㎡", + "출처": "건설품셈 공통 6-3-6", + "소유": "공용", + "입력": [ + { + "이름": "구분", + "고르기": [ + "해체" + ] + }, + { + "이름": "크레인", + "고르기": [ + "2104-0080", + "2104-0100", + "2104-0130", + "2104-0160", + "2104-0200" + ], + "출처": "건설품셈 공통 6-3-6", + "비고": "원문 해체 80∼200ton" + }, + { + "이름": "지역", + "고르기": [ + "전국평균", + "전국", + "서울", + "경기", + "강원", + "충북", + "충남", + "전북", + "경북", + "경남", + "부산", + "제주", + "대구", + "인천", + "대전", + "울산", + "세종", + "전남광주" + ], + "출처": "건설품셈 공통 8-1-7 5" + } + ], + "중간": [ + { + "이름": "특수비계공", + "식": "찾기(소요량:건설품셈:6-3-6 설치 및 해체, 구분=구분).특수비계공" + }, + { + "이름": "보통인부", + "식": "찾기(소요량:건설품셈:6-3-6 설치 및 해체, 구분=구분).보통인부" + } + ], + "호표": [ + { + "종류": "인력", + "요소": "인력:자체:특수비계공", + "이름": "특수비계공", + "단위": "인", + "수량": "특수비계공", + "비목": "노무비" + }, + { + "종류": "인력", + "요소": "인력:건설노임:1002", + "이름": "보통인부", + "단위": "인", + "수량": "보통인부", + "비목": "노무비" + }, + { + "종류": "로직", + "요소": "로직(건설품셈:8 기계 시간당 경비, 기계=크레인, 지역=지역)", + "이름": "크레인(타이어)", + "단위": "시간", + "수량": "찾기(소요량:건설품셈:6-3-6 설치 및 해체, 구분=구분).크레인" + } + ], + "덧줄": [], + "끝수": null, + "비고": "해석: 크레인 = 크레인(타이어) · 특수비계공 = 인력_자체(건설노임에 없음 — 값은 관리자가 채움) · 고재처리 별도" }, { "열쇠": "6-3-6 슬립폼 인상", diff --git a/resources/master_data/로직_건설품셈_공통8장.json b/resources/master_data/로직_건설품셈_공통8장.json index 691d28e0..d4b4d4c3 100644 --- a/resources/master_data/로직_건설품셈_공통8장.json +++ b/resources/master_data/로직_건설품셈_공통8장.json @@ -385,7 +385,7 @@ "입력": [ { "이름": "기계", - "고르기": ["7620-0003", "7730-0150", "6516-0060", "6516-0120", "6516-0250", "6516-0300", "6105-0190", "6202-0060", "0230-0002", "6410-0080", "6410-0100", "6410-0120", "6410-0150", "6410-0200", "6901-0010", "6530-0090", "6530-0120", "6517-0100", "6517-0150", "6517-0200", "6517-0250", "6517-0300", "6510-0100", "6510-0150", "6510-0200", "6510-0250", "6510-0300", "6518-0100", "6518-0150", "6518-0200", "6518-0250", "6518-0300", "5501-0080", "7750-0016", "7750-0025", "7730-0050", "5401-0017"] + "고르기": ["7620-0003", "7730-0150", "6516-0060", "6516-0120", "6516-0250", "6516-0300", "6105-0190", "6202-0060", "0230-0002", "6410-0080", "6410-0100", "6410-0120", "6410-0150", "6410-0200", "6901-0010", "6530-0090", "6530-0120", "6517-0100", "6517-0150", "6517-0200", "6517-0250", "6517-0300", "6510-0100", "6510-0150", "6510-0200", "6510-0250", "6510-0300", "6518-0100", "6518-0150", "6518-0200", "6518-0250", "6518-0300", "5501-0080", "7750-0016", "7750-0025", "7730-0050", "5401-0017", "5202-0127", "5202-0240", "5202-0300", "7611-0200", "7612-0200", "5204-0200", "5204-0300", "5204-0400", "5204-0500", "5204-0600"] } ], "중간": [ diff --git a/resources/master_data/소요량_건설품셈_공통2장.json b/resources/master_data/소요량_건설품셈_공통2장.json index 4b2d9b8d..03517600 100644 --- a/resources/master_data/소요량_건설품셈_공통2장.json +++ b/resources/master_data/소요량_건설품셈_공통2장.json @@ -10,7 +10,7 @@ "출처": "건설품셈 공통 2-1-1", "조건": { "직접노무비(억)": "범위", "시설": "고르기" }, "값칸": { "면적": "㎡" }, - "범위규칙": "「1.5억 미만」 = 위 끝 제외 · 「500억 이상」 = 아래 끝 포함 · 「1.5 ∼ 3억」 등 = 양 끝 포함", + "범위규칙": "이상·미만 · 원문 「1.5억 미만」 · 「1.5 ∼ 3억」 등 · 「500억 이상」 — 이웃 칸 끝이 겹쳐 아래 끝 포함으로 읽음", "줄": [ { "직접노무비(억)": [null, 1.5], "시설": "현장사무소 감독・감리자", "면적": 40 }, { "직접노무비(억)": [null, 1.5], "시설": "현장사무소 수급자", "면적": 50 }, @@ -66,7 +66,7 @@ "출처": "건설품셈 공통 2-1-2", "조건": { "직접노무비(억)": "범위", "시설": "고르기" }, "값칸": { "면적": "㎡" }, - "범위규칙": "「1.5억 미만」 = 위 끝 제외 · 「500억 이상」 = 아래 끝 포함 · 「1.5 ∼ 3억」 등 = 양 끝 포함", + "범위규칙": "이상·미만 · 원문 「1.5억 미만」 · 「1.5 ∼ 3억」 등 · 「500억 이상」 — 이웃 칸 끝이 겹쳐 아래 끝 포함으로 읽음", "줄": [ { "직접노무비(억)": [null, 1.5], "시설": "현장사무소 감독・감리자", "면적": 30 }, { "직접노무비(억)": [null, 1.5], "시설": "현장사무소 수급자", "면적": 30 }, @@ -3006,7 +3006,7 @@ "출처": "건설품셈 공통 2-12-4 2", "조건": { "명칭": "고르기", "추진관경(㎜)": "범위" }, "값칸": { "수량": "줄 따름" }, - "범위규칙": "「300∼600」 등 양 끝 포함", + "범위규칙": "이상·이하 · 원문 「300∼600」 등 양 끝 포함", "줄": [ { "명칭": "중급기술자", "단위": "인", "추진관경(㎜)": [300, 600], "수량": 1 }, { "명칭": "중급기술자", "단위": "인", "추진관경(㎜)": [700, 900], "수량": 1 }, @@ -3045,7 +3045,7 @@ "출처": "건설품셈 공통 2-12-4 4", "조건": { "토질별": "고르기", "관경(㎜)": "범위", "추진장(m)": "범위" }, "값칸": { "작업능력": "m/일" }, - "범위규칙": "「300∼500」 등 양 끝 포함 · 추진장 「0∼10m」 · 「0∼20m」 등은 원문 그대로 겹친 누적 구간(양 끝 포함)", + "범위규칙": "이상·이하 · 원문 「300∼500」 등 양 끝 포함 · 추진장 「0∼10m」 · 「0∼20m」 등은 원문 그대로 겹친 누적 구간 — 위 끝이 가장 작은 줄", "줄": [ { "토질별": "점토・실트", "관경(㎜)": [300, 500], "추진장(m)": [0, 10], "작업능력": 13 }, { "토질별": "점토・실트", "관경(㎜)": [300, 500], "추진장(m)": [0, 20], "작업능력": 12 }, diff --git a/resources/master_data/인력_자체.json b/resources/master_data/인력_자체.json new file mode 100644 index 00000000..8cddd3d1 --- /dev/null +++ b/resources/master_data/인력_자체.json @@ -0,0 +1,11 @@ +{ + "그룹": "인력", + "원문": "자체", + "판": "2026-09-19", + "비고": "건설노임에 없는 직종 — 이름·단위만 · 값은 관리자가 채움 · 다른 직종에 대응시키지 않음", + "줄": [ + { "열쇠": "중급기술자", "이름": "중급기술자", "규격": "", "단위": "원/일", "값": null, "출처": "자체", "비고": "건설품셈 공통 2-9-12 · 2-11-8 · 2-11-9 · 2-12-4 작업편성인원 · 5-1-7 인장" }, + { "열쇠": "절단공", "이름": "절단공", "규격": "", "단위": "원/일", "값": null, "출처": "자체", "비고": "건설품셈 공통 6-2-5" }, + { "열쇠": "특수비계공", "이름": "특수비계공", "규격": "", "단위": "원/일", "값": null, "출처": "자체", "비고": "건설품셈 공통 6-3-6 설치 및 해체(해체)" } + ] +} diff --git a/resources/master_data/재료_자체.json b/resources/master_data/재료_자체.json index 46a585c0..3eb0b2e6 100644 --- a/resources/master_data/재료_자체.json +++ b/resources/master_data/재료_자체.json @@ -138,6 +138,7 @@ {"열쇠": "복합비료", "이름": "비료", "규격": "복합비료", "단위": "㎏", "값": null, "출처": "자체", "비고": "건설품셈 공통 4-1-3 재료량"}, {"열쇠": "피복제", "이름": "피복제", "규격": "화이버/펄프류", "단위": "㎏", "값": null, "출처": "자체", "비고": "건설품셈 공통 4-1-3 재료량"}, {"열쇠": "침식방지안정제", "이름": "침식방지안정제", "규격": "합성접착제", "단위": "㎏", "값": null, "출처": "자체", "비고": "건설품셈 공통 4-1-3 재료량"}, - {"열쇠": "착색제", "이름": "색소", "규격": "착색제", "단위": "㎏", "값": null, "출처": "자체", "비고": "건설품셈 공통 4-1-3 재료량"} + {"열쇠": "착색제", "이름": "색소", "규격": "착색제", "단위": "㎏", "값": null, "출처": "자체", "비고": "건설품셈 공통 4-1-3 재료량"}, + { "열쇠": "아세틸렌가스(ℓ)", "이름": "아세틸렌가스", "규격": "", "단위": "ℓ", "값": null, "출처": "자체", "비고": "건설품셈 공통 6-2-5 · 원문 ℓ 단위(나라장터 20204095 는 kg)" } ] } diff --git a/resources/tester/test_masterdata_check.py b/resources/tester/test_masterdata_check.py index 40f72fba..04108a5b 100644 --- a/resources/tester/test_masterdata_check.py +++ b/resources/tester/test_masterdata_check.py @@ -205,13 +205,23 @@ def test_방제_벌목조재_감_할증(whole): 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 [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, "지역": "전국평균", "보정작업": "해당 없음"} + given = { + "작업": "쌓기", + "중량": "20ton 미만", + "난이도가산": 10, + "지역": "전국평균", + "보정작업": "해당 없음", + } got = mf.run(whole, "건설품셈:4-4-1 정원석 쌓기 및 놓기", given) assert [line["수량"] for line in got["줄"][:2]] == [Decimal("1.3332"), Decimal("0.657")] @@ -298,3 +308,21 @@ def test_찾기_값칸_있는_줄만(): mf.parse("찾기(소요량:건설품셈:5-1-1 P.P마대 쌓기, 구분=구분).수량")[1][1] == "소요량:건설품셈:5-1-1 P.P마대 쌓기" ) + + +def test_범위규칙_이상이하(): + table = { + "열쇠": "시험", + "조건": {"길이": "범위"}, + "범위규칙": "이상·이하 · 겹친 누적 구간", + "줄": [ + {"길이": [0, 10], "값": 1}, + {"길이": [0, 20], "값": 2}, + {"길이": [30, 40], "값": 3}, + ], + } + assert mf.find(table, {"길이": Decimal(10)})["값"] == 1 + assert mf.find(table, {"길이": Decimal(15)})["값"] == 2 + assert mf.find(table, {"길이": Decimal(30)})["값"] == 3 + with pytest.raises(mf.FormulaError): + mf.find(table, {"길이": Decimal(25)})