diff --git a/docs/raw/M01_결정목록/결정목록.md b/docs/raw/M01_결정목록/결정목록.md index 3fa4c067..5cf8eee0 100644 --- a/docs/raw/M01_결정목록/결정목록.md +++ b/docs/raw/M01_결정목록/결정목록.md @@ -192,3 +192,44 @@ | Q125 | 기계설비 9-2-1 | QC001535 | 바탕만들기 Shot Blast 자재 두 줄(steel shot 0.215 · ø1㎜ 기준 0.415)은 별개 재료인가 기준 차이인가? | 별개 재료 / 기준 차이(하나만 씀) | 설계자가 고름 | | sub2_2 | | Q126 | 기계설비 11-1-3 | 없음(로직 없음) | 나사식 재료량표에 구경 32가 없는데 구경 30 값을 쓰는 게 맞나? (원문 30이 32의 오기인가) | 30 값 사용 / 오기로 보고 32로 고침 | 32일 때 30 값 | | sub2_2 | | Q127 | 기계설비 13-2-4 | QC001638 GC000893 | 강판 전기아크용접(V형 13-2-4)에 합금강 재질 입력 · 할증을 넣나? (13-2-3에는 있음) | 넣음 / 넣지 않음 | 재질 입력 · 할증 없음 | | sub2_2 | + +## 자재표에 없는 품목 — 사용자 결정 (34) + +자재표에 대응 품목이 없는 재료 줄 · 검색어를 비워 억지 연결을 뗌(계산 = 단가 없음 · 까닭 「자재표에 없는 품목」 · 품목을 골라 넣으면 그 값). 품목을 새로 넣을지 · 비슷한 품목으로 이을지 답. + +| 번호 | 로직 키 | 재료 이름 | 단위 | 원문 절 | 지금 상태 | +|---|---|---|---|---|---| +| N01 | GF000165 | 핀폴 손료 | 개 | 12-8 | 검색어 비움 | +| N02 | GF000181 | 원형거푸집(PE 10회) 스라브 및 기초 · 벽체 | 조 | 12-16 | 검색어 비움(2줄) | +| N03 | GF000202 | 탄성고무받침(150×150×15) | ㎡ | 12-30-2 | 검색어 비움 | +| N04 | GC000348 | 일체식 방수시트 | ㎡ | 토목 3-4-1 | 검색어 비움 | +| N05 | GC000432 | 메탈리밍쉘 NX | 개 | 토목 8-1-3 | 검색어 그대로 — BX 는 품목 있음 · NX 는 후보 없음(계산 = 단가 없음) | +| N06 | GC000433 | 샘플러(표준관입) | 개 | 토목 8-2-1 | 검색어 비움 | +| N07 | GC000435 | vane blade(대형) 베인 블레이드 | 개 | 토목 8-2-2 | 검색어 비움 | +| N08 | GC000447 GC000448 GC000449 | 에어해머 | 개 | 토목 8-4-2 | 검색어 비움(3줄) | +| N09 | GC000181 | P.P로프(9㎜) | m | 5-2-1 참고자료 | 검색어 비움 | +| N10 | GC000197 | 지오콤포지트 6.0㎜ | ㎡ | 5-4-1 ⑧ | 검색어 비움 | +| N11 | GC000212 | 강재거푸집 손료 | ㎡ | 6-3-2 | 검색어 비움 | +| N12 | GC000216 | 원형맨홀거푸집 ø740~ø1800 | 조 | 6-3-5 | 검색어 비움(5줄) | +| N13 | GC000027 | 손잡이기둥 | 개 | 2-7-6 참고자료 | 검색어 비움 | +| N14 | GC000127 | 각재 10㎝×10㎝ | ㎥ | 3-8-3 ④ | 검색어 비움 | +| N15 | GC000560 | 잠호용접와이어 | ㎏ | 1-1-3·1-1-4 | 검색어 비움 | +| N16 | GC000576 | 치장벽돌 | 매 | 2-1-2 | 검색어 비움 | +| N17 | GC000616 | 테라조 걸레받이 | m | 5-3-5 | 검색어 비움 | +| N18 | GC000616 | 합성수지 걸레받이 | m | 5-3-5 | 검색어 비움 | +| N19 | GC000646 | 조인트테이프 | m | 6-5-3 | 검색어 비움 | +| N20 | GC000646 | 벤토나이트방수재 시트용 | ㎡ | 6-5-3 | 검색어 비움 | +| N21 | GC000670 | AL리벳 | 개 | 8-2-2 | 검색어 비움 | +| N22 | GC000723 | 동 및 동합금용 용접봉(BCuP3) | ㎏ | 1-2-1 참고자료 | 검색어 비움 | +| N23 | GC000931 | 걸레 | ㎏ | 13-6-1 | 검색어 비움 | +| N24 | GC000932 | 걸레 | ㎏ | 13-6-2 | 검색어 비움 | +| N25 | GC000986 | 걸레 | ㎏ | 13-10-2 | 검색어 비움 | +| N26 | GC000993 | 걸레 | ㎏ | 13-11-5 | 검색어 비움 | +| N27 | GC000932 | 신주용접봉 | ㎏ | 13-6-2 | 검색어 비움 | +| N28 | GC000972 | 가루비누 | ㎏ | 13-7-22 | 검색어 비움 | +| N29 | GC000947 | 톱날 | 개 | 13-6-15 | 검색어 비움 | +| N30 | GC000947 | Bite | 개 | 13-6-15 | 검색어 비움 | +| N31 | GC000947 | Bite | 개 | 13-6-15 | 검색어 비움 | +| N32 | GC000993 | 용접면 | 개 | 13-11-5 | 검색어 비움 | +| N33 | GC000993 | 용접홀다 | 개 | 13-11-5 | 검색어 비움 | +| N34 | GC000993 | 용접앞치마 | 개 | 13-11-5 | 검색어 비움 | diff --git a/resources/master_data/_틀.md b/resources/master_data/_틀.md index 918a4e6e..e7572b3a 100644 --- a/resources/master_data/_틀.md +++ b/resources/master_data/_틀.md @@ -225,6 +225,7 @@ - 이름 조건 = 구분·상세구분·규격이 같아도 품명이 갈리는 자재품목을 가를 때만 둠(예: 파형강관 커플링밴드 vs 접속티 — 둘 다 관경만 규격에 있어 규격 조건으로는 안 갈림). 규격과 같은 방식(낱말이 **모두** 이름에 든 줄) — 대소문자·빈칸은 안 가림. - **키를 못 박음** — 재료 줄은 늘 요소 묶음 + `검색어`(「합판(내수) 12t 서울」) · 줄에 자재품목 키를 바로 적지 않음 · 재료 입력에 키 목록(`고르기`)을 두지 않음. - 찾기 = 검색어 낱말(띄어쓰기로 나눔)이 **모두** 이름 또는 규격에 든 자재품목 줄 · 요소에 `구분` · `상세구분` 이 있으면 그 안에서만 · 단위는 같은 성격까지(아래 환산). +- `검색어` 빈 글 = 자재표에 없는 품목(`docs/raw/M01_결정목록` 「자재표에 없는 품목」) — 후보 없음 · 단가 없음 · 까닭만 · 품목을 골라 넣으면 그 값 · 검사는 틀림으로 안 셈. - 자동값 차례 = 값 있는 줄 → 줄 단위와 똑같은 단위 → 검색어 안 지역 낱말(서울 등)과 맞는 줄 → 키 차례 · 그 첫째. - 고른 품목 = 계산 요청에만 실음(`_화면_계약.md` 10장 `고름`) · 로직 파일에 저장하지 않음 · 폐기 품목은 지움. - 단위 환산 = 같은 성격만 — 무게 g · kg · ton(톤 · Ton) / 길이 mm · cm · m · km / 넓이 ㎠ · ㎡ / 부피 ㎤ · ℓ · ㎥ · 단가를 줄 단위로 바꿔 계산. diff --git a/resources/master_data/scripts/master_material.py b/resources/master_data/scripts/master_material.py index 6d6237ac..569ea602 100644 --- a/resources/master_data/scripts/master_material.py +++ b/resources/master_data/scripts/master_material.py @@ -143,7 +143,10 @@ def candidates( """고르기 조건 안 자재품목 키 — 구분 · 상세구분 · 이름 · 규격 낱말이 모두 든 줄 · 파일 차례대로. `unit` 을 주면 그 단위(호표 줄 단위)와 같은 줄만 — 단위가 다르면 다른 물건. 입력 `자재지역` 이 있으면 이름에 그 지역이 든 줄만(그런 줄이 없으면 조건 안 전부). - 조건에 `검색어` 가 있으면 기본 검색어 찾기(`master_pick`).""" + 조건에 `검색어` 가 있으면 기본 검색어 찾기(`master_pick`) · + 빈 검색어 = 자재표에 없는 품목(후보 없음).""" + if mp.empty_term(cond): + return [] if cond.get("검색어"): return mp.search(master, cond, env, unit) want = [plain_spec(w) for w in str(cond.get("규격") or "").split()] @@ -180,7 +183,7 @@ def pick(master: mf.Master, cond: dict, env: dict, unit: str | None = None) -> s def check_unit(master: mf.Master, where: str, cond: dict, unit: str | None) -> list[str]: """단위 경고 — 호표 줄·품셈재료 줄 단위와 맞는 후보가 없거나 대표 줄 단위가 다름. 틀린 데이터가 아니라 좁혀야 할 조건이라 `check_pick` 과 따로 봄(`check_master 단위`).""" - if cond.get("검색어"): + if "검색어" in cond: # 빈 검색어(자재표에 없는 품목)도 이 길 — 구분 안 후보로 경고하지 않음 return mp.check_warn(master, where, cond, unit) cond = static(cond) rows = master.index.get(MARKET, {}) diff --git a/resources/master_data/scripts/master_pick.py b/resources/master_data/scripts/master_pick.py index 445af9d9..b656e47f 100644 --- a/resources/master_data/scripts/master_pick.py +++ b/resources/master_data/scripts/master_pick.py @@ -152,6 +152,8 @@ def priced(master, item: dict, ref, env: dict, index: int | None): def _priced(master, item: dict, ref, env: dict, index: int | None): unit = item.get("단위") picked = (CHOSEN.get() or {}).get(str(index)) if index is not None else None + if not picked and empty_term(ref): # 자재표에 없는 품목 — 구분 안 첫 품목으로 잇지 않음 + return None, None, NO_ITEM, None try: if picked or (isinstance(ref, dict) and ref.get("검색어")): ref = picked or pick(master, ref, env, unit) @@ -170,19 +172,29 @@ def _priced(master, item: dict, ref, env: dict, index: int | None): return price, source, why, warn +NO_ITEM = "자재표에 없는 품목 — 검색어 비움(결정 목록) · 품목을 골라 넣음" + + +def empty_term(ref) -> bool: + """검색어 칸은 있고 비었음 = 자재표에 없는 품목(`M01_결정목록` 「자재표에 없는 품목」) — + 단가 없음 · 까닭만(고름으로 고를 수 있음) · 검사는 이 줄을 틀림으로 세지 않음.""" + return isinstance(ref, dict) and "검색어" in ref and not str(ref["검색어"] or "").strip() + + # ── 검사 ─────────────────────────────────────────────────────────────── def check_zero(master, where: str, cond: dict) -> list[str]: - """검색어 후보 0 — `{입력}` 이 든 검색어는 계산 때 채워져 여기서 못 봄.""" + """검색어 후보 0 — `{입력}` 이 든 검색어는 계산 때 채워져 여기서 못 봄 · + 빈 검색어는 `empty_term`(틀림 아님).""" term = str(cond.get("검색어") or "") if not term.strip() or "{" in term or any("{" in str(v) for v in cond.values()): - return [] if term.strip() else [f"{where} · 검색어 비어 있음"] + return [] return [] if search(master, cond) else [f"{where} · 검색어 「{term}」 후보 0"] def check_warn(master, where: str, cond: dict, unit: str | None) -> list[str]: """단위 경고 줄 — 검색어 후보가 있으나 줄 단위와 같은 성격이 하나도 없음.""" term = str(cond.get("검색어") or "") - if not unit or "{" in term or "{" in str(cond.get("구분") or ""): + if not unit or not term.strip() or "{" in term or "{" in str(cond.get("구분") or ""): return [] keys = search(master, cond) rows = master.index.get(mm.MARKET, {}) diff --git a/resources/master_data/로직_건설품셈_01장_배관공사.json b/resources/master_data/로직_건설품셈_01장_배관공사.json index 82837bed..87eb8ebc 100644 --- a/resources/master_data/로직_건설품셈_01장_배관공사.json +++ b/resources/master_data/로직_건설품셈_01장_배관공사.json @@ -106,7 +106,7 @@ }, { "종류": "재료", - "요소": {"구분": "잡재료", "상세구분": "용접·가스", "검색어": "아세틸렌 98%"}, + "요소": {"구분": "잡재료", "상세구분": "용접·가스", "검색어": ""}, "이름": "동 및 동합금용 용접봉", "규격": "BCUP3", "단위": "㎏", diff --git a/resources/master_data/로직_건설품셈_01장_철골공사.json b/resources/master_data/로직_건설품셈_01장_철골공사.json index a362f023..7b397f08 100644 --- a/resources/master_data/로직_건설품셈_01장_철골공사.json +++ b/resources/master_data/로직_건설품셈_01장_철골공사.json @@ -203,7 +203,7 @@ }, { "종류": "재료", - "요소": {"구분": "잡재료", "상세구분": "용접·가스", "검색어": "아세틸렌 98%"}, + "요소": {"구분": "잡재료", "상세구분": "용접·가스", "검색어": ""}, "이름": "잠호용접와이어", "단위": "㎏", "수량": "만약(용접방식 == '자동용접', 환산용접길이 * 찾기(QC001190, 재료='잠호용접와이어').자동용접, 0)", diff --git a/resources/master_data/로직_건설품셈_02장_가설공사.json b/resources/master_data/로직_건설품셈_02장_가설공사.json index d3938f99..3f359b89 100644 --- a/resources/master_data/로직_건설품셈_02장_가설공사.json +++ b/resources/master_data/로직_건설품셈_02장_가설공사.json @@ -2055,7 +2055,7 @@ }, { "종류": "재료", - "요소": {"구분": "거푸집·가설재", "상세구분": "동바리·비계", "검색어": "안전발판(PSP대용) 250×3000"}, + "요소": {"구분": "거푸집·가설재", "상세구분": "동바리·비계", "검색어": ""}, "이름": "손잡이기둥", "단위": "개", "수량": "찾기(QC000063, 구분='손잡이기둥').수량 * 찾기(QC000016, 공기=공기, 재료='강관, 비계기본틀, 비계장선틀, 가새').손율 / 100", diff --git a/resources/master_data/로직_건설품셈_02장_조적공사.json b/resources/master_data/로직_건설품셈_02장_조적공사.json index 9680707c..c654975c 100644 --- a/resources/master_data/로직_건설품셈_02장_조적공사.json +++ b/resources/master_data/로직_건설품셈_02장_조적공사.json @@ -269,7 +269,7 @@ }, { "종류": "재료", - "요소": {"구분": "콘크리트제품", "상세구분": "경계석·블록", "검색어": "주차라인블록 1000X300X150"}, + "요소": {"구분": "콘크리트제품", "상세구분": "경계석·블록", "검색어": ""}, "이름": "치장벽돌", "단위": "매", "수량": "찾기(QC001213, 벽두께=벽두께).'벽돌(19×9×5.7㎝)'", diff --git a/resources/master_data/로직_건설품셈_03장_터널공사.json b/resources/master_data/로직_건설품셈_03장_터널공사.json index 3f86a3a9..6ef88797 100644 --- a/resources/master_data/로직_건설품셈_03장_터널공사.json +++ b/resources/master_data/로직_건설품셈_03장_터널공사.json @@ -243,7 +243,7 @@ }, { "종류": "재료", - "요소": {"구분": "도료·방수·접착", "상세구분": "방수·실링", "검색어": "방수석고보드 12.5t"}, + "요소": {"구분": "도료·방수·접착", "상세구분": "방수·실링", "검색어": ""}, "이름": "일체식 방수시트", "단위": "㎡", "수량": "찾기(QC000635, 구분='일체식 방수시트').수량", diff --git a/resources/master_data/로직_건설품셈_03장_토공사.json b/resources/master_data/로직_건설품셈_03장_토공사.json index 717c28a2..59dff7d1 100644 --- a/resources/master_data/로직_건설품셈_03장_토공사.json +++ b/resources/master_data/로직_건설품셈_03장_토공사.json @@ -3303,7 +3303,7 @@ }, { "종류": "재료", - "요소": {"구분": "목재", "상세구분": "각재·판재", "검색어": "외송각재 30×30×3600mm 서울"}, + "요소": {"구분": "목재", "상세구분": "각재·판재", "검색어": ""}, "이름": "각재 10㎝×10㎝", "단위": "㎥", "수량": "찾기(QC000245).각재", diff --git a/resources/master_data/로직_건설품셈_05장_기초공사.json b/resources/master_data/로직_건설품셈_05장_기초공사.json index dd1c3db6..00386cdc 100644 --- a/resources/master_data/로직_건설품셈_05장_기초공사.json +++ b/resources/master_data/로직_건설품셈_05장_기초공사.json @@ -2394,7 +2394,7 @@ }, { "종류": "재료", - "요소": {"구분": "볼트·앵커·철물", "상세구분": "와이어로프·클램프", "검색어": "와이어로프(철심) 9㎜"}, + "요소": {"구분": "볼트·앵커·철물", "상세구분": "와이어로프·클램프", "검색어": ""}, "이름": "P.P로프(9㎜)", "단위": "m", "수량": "찾기(QC000334, 구분='육상부설').'P.P로프(9㎜)' / 100", @@ -5339,7 +5339,7 @@ }, { "종류": "재료", - "요소": {"구분": "매트·토목섬유", "상세구분": "부직포·토목섬유", "검색어": "직포 옥상방수용직포"}, + "요소": {"구분": "매트·토목섬유", "상세구분": "부직포·토목섬유", "검색어": ""}, "이름": "지오콤포지트", "단위": "㎡", "수량": "만약(재료 == '지오콤포지트', 찾기(QC000399, 구분='지오콤포지트').수량, 0)", diff --git a/resources/master_data/로직_건설품셈_05장_수장공사.json b/resources/master_data/로직_건설품셈_05장_수장공사.json index b9ab9dc3..bbee04d5 100644 --- a/resources/master_data/로직_건설품셈_05장_수장공사.json +++ b/resources/master_data/로직_건설품셈_05장_수장공사.json @@ -957,7 +957,7 @@ }, { "종류": "재료", - "요소": {"구분": "건축마감", "상세구분": "천장·바닥·마감재", "검색어": "처마후레싱 C/S"}, + "요소": {"구분": "건축마감", "상세구분": "천장·바닥·마감재", "검색어": ""}, "이름": "테라조", "단위": "m", "수량": "만약(구분 == '석재류', 찾기(QC001266, 구분=구분).테라조, 0)", @@ -966,7 +966,7 @@ }, { "종류": "재료", - "요소": {"구분": "건축마감", "상세구분": "천장·바닥·마감재", "검색어": "처마후레싱 C/S"}, + "요소": {"구분": "건축마감", "상세구분": "천장·바닥·마감재", "검색어": ""}, "이름": "합성수지 걸레받이", "단위": "m", "수량": "만약(구분 == '합성수지류', 찾기(QC001266, 구분=구분).합성수지, 0)", diff --git a/resources/master_data/로직_건설품셈_06장_방수공사.json b/resources/master_data/로직_건설품셈_06장_방수공사.json index 136c52b1..809ff6f4 100644 --- a/resources/master_data/로직_건설품셈_06장_방수공사.json +++ b/resources/master_data/로직_건설품셈_06장_방수공사.json @@ -958,7 +958,7 @@ }, { "종류": "재료", - "요소": {"구분": "도료·방수·접착", "상세구분": "방수·실링", "검색어": "방수석고보드 12.5t"}, + "요소": {"구분": "도료·방수·접착", "상세구분": "방수·실링", "검색어": ""}, "이름": "벤토나이트방수재", "단위": "㎡", "수량": "만약(종류 == '벤토나이트 시트', 찾기(QC001307, 구분='벤토나이트방수재', 종류='시트', 부위=부위).수량, 0)", @@ -1021,7 +1021,7 @@ }, { "종류": "재료", - "요소": {"구분": "잡재료", "상세구분": "소모품", "검색어": "PVC코팅철선 #8"}, + "요소": {"구분": "잡재료", "상세구분": "소모품", "검색어": ""}, "이름": "조인트테이프", "단위": "m", "수량": "만약(종류 == '벤토나이트 시트', 찾기(QC001307, 구분='조인트테이프', 종류='시트', 부위=부위).수량, 0)", diff --git a/resources/master_data/로직_건설품셈_06장_철근콘크리트공사.json b/resources/master_data/로직_건설품셈_06장_철근콘크리트공사.json index ff88092d..247746d2 100644 --- a/resources/master_data/로직_건설품셈_06장_철근콘크리트공사.json +++ b/resources/master_data/로직_건설품셈_06장_철근콘크리트공사.json @@ -1272,7 +1272,7 @@ }, { "종류": "재료", - "요소": {"구분": "거푸집·가설재", "상세구분": "거푸집", "검색어": "패널(K-SPAN PANEL) 0.6×305mm"}, + "요소": {"구분": "거푸집·가설재", "상세구분": "거푸집", "검색어": ""}, "이름": "강재거푸집 손료", "단위": "㎡", "수량": "(1 - 10 / 100) / 사용횟수", @@ -1583,7 +1583,7 @@ }, { "종류": "재료", - "요소": {"구분": "거푸집·가설재", "상세구분": "거푸집", "검색어": "폼타이 D형"}, + "요소": {"구분": "거푸집·가설재", "상세구분": "거푸집", "검색어": ""}, "이름": "원형맨홀거푸집 ø740 손료", "단위": "조", "수량": "만약(규격 == 'ø740', 1 / 10, 0)", @@ -1592,7 +1592,7 @@ }, { "종류": "재료", - "요소": {"구분": "거푸집·가설재", "상세구분": "거푸집", "검색어": "폼타이 D형"}, + "요소": {"구분": "거푸집·가설재", "상세구분": "거푸집", "검색어": ""}, "이름": "원형맨홀거푸집 ø900 손료", "단위": "조", "수량": "만약(규격 == 'ø900', 1 / 10, 0)", @@ -1601,7 +1601,7 @@ }, { "종류": "재료", - "요소": {"구분": "거푸집·가설재", "상세구분": "거푸집", "검색어": "폼타이 D형"}, + "요소": {"구분": "거푸집·가설재", "상세구분": "거푸집", "검색어": ""}, "이름": "원형맨홀거푸집 ø1200 손료", "단위": "조", "수량": "만약(규격 == 'ø1200', 1 / 10, 0)", @@ -1610,7 +1610,7 @@ }, { "종류": "재료", - "요소": {"구분": "거푸집·가설재", "상세구분": "거푸집", "검색어": "폼타이 D형"}, + "요소": {"구분": "거푸집·가설재", "상세구분": "거푸집", "검색어": ""}, "이름": "원형맨홀거푸집 ø1500 손료", "단위": "조", "수량": "만약(규격 == 'ø1500', 1 / 10, 0)", @@ -1619,7 +1619,7 @@ }, { "종류": "재료", - "요소": {"구분": "거푸집·가설재", "상세구분": "거푸집", "검색어": "폼타이 D형"}, + "요소": {"구분": "거푸집·가설재", "상세구분": "거푸집", "검색어": ""}, "이름": "원형맨홀거푸집 ø1800 손료", "단위": "조", "수량": "만약(규격 == 'ø1800', 1 / 10, 0)", diff --git a/resources/master_data/로직_건설품셈_08장_금속공사.json b/resources/master_data/로직_건설품셈_08장_금속공사.json index ce0d4008..99c6e305 100644 --- a/resources/master_data/로직_건설품셈_08장_금속공사.json +++ b/resources/master_data/로직_건설품셈_08장_금속공사.json @@ -447,7 +447,7 @@ }, { "종류": "재료", - "요소": {"구분": "볼트·앵커·철물", "상세구분": "볼트·너트", "검색어": "작은나사(스크류) ø 4.2㎜"}, + "요소": {"구분": "볼트·앵커·철물", "상세구분": "볼트·너트", "검색어": ""}, "이름": "AL리벳", "단위": "개", "수량": "찾기(QC001339, 구분='AL리벳', 규격='ø 4.2㎜').수량", diff --git a/resources/master_data/로직_건설품셈_08장_지반조사.json b/resources/master_data/로직_건설품셈_08장_지반조사.json index 99d23cb6..df32d621 100644 --- a/resources/master_data/로직_건설품셈_08장_지반조사.json +++ b/resources/master_data/로직_건설품셈_08장_지반조사.json @@ -346,7 +346,7 @@ }, { "종류": "재료", - "요소": {"구분": "기계·설비", "상세구분": "기계류", "검색어": "치즐(0.2㎥)"}, + "요소": {"구분": "기계·설비", "상세구분": "기계류", "검색어": ""}, "이름": "샘플러", "단위": "개", "수량": "찾기(QC000779, 종별='샘플러').수량", @@ -522,7 +522,7 @@ }, { "종류": "재료", - "요소": {"구분": "기계·설비", "상세구분": "기계류", "검색어": "치즐(0.2㎥)"}, + "요소": {"구분": "기계·설비", "상세구분": "기계류", "검색어": ""}, "이름": "베인 블레이드", "단위": "개", "수량": "찾기(QC000780, 종별='재료비', 세목='vane blade(대형)').수량", @@ -1545,7 +1545,7 @@ }, { "종류": "재료", - "요소": {"구분": "기계·설비", "상세구분": "기계류", "검색어": "치즐(0.2㎥)"}, + "요소": {"구분": "기계·설비", "상세구분": "기계류", "검색어": ""}, "이름": "에어해머", "단위": "개", "수량": "찾기(QC000794, 종별='에어해머').수량", @@ -1667,7 +1667,7 @@ }, { "종류": "재료", - "요소": {"구분": "기계·설비", "상세구분": "기계류", "검색어": "치즐(0.2㎥)"}, + "요소": {"구분": "기계·설비", "상세구분": "기계류", "검색어": ""}, "이름": "에어해머", "단위": "개", "수량": "찾기(QC000795, 종별='에어해머').수량", @@ -1789,7 +1789,7 @@ }, { "종류": "재료", - "요소": {"구분": "기계·설비", "상세구분": "기계류", "검색어": "치즐(0.2㎥)"}, + "요소": {"구분": "기계·설비", "상세구분": "기계류", "검색어": ""}, "이름": "에어해머", "단위": "개", "수량": "찾기(QC000796, 종별='에어해머').수량", diff --git a/resources/master_data/로직_건설품셈_13장_플랜트설비공사.json b/resources/master_data/로직_건설품셈_13장_플랜트설비공사.json index 9a6e05ba..e762b711 100644 --- a/resources/master_data/로직_건설품셈_13장_플랜트설비공사.json +++ b/resources/master_data/로직_건설품셈_13장_플랜트설비공사.json @@ -6918,7 +6918,7 @@ { "종류": "재료", "요소": { "구분": "잡재료", "상세구분": "소모품", "검색어": "여과기 14\"×14〃" }, "이름": "여과기", "단위": "Sh", "수량": "3", "비목": "재료비", "출처": "건설품셈 기계설비 13-6-1" }, { "종류": "재료", - "요소": { "구분": "잡재료", "상세구분": "소모품", "검색어": "그리스(일반범용) CROWN" }, + "요소": { "구분": "잡재료", "상세구분": "소모품", "검색어": "" }, "이름": "걸레", "단위": "㎏", "수량": "2.5", @@ -7200,7 +7200,7 @@ { "종류": "재료", "요소": { "구분": "잡재료", "상세구분": "용접·가스", "검색어": "용접봉 산소" }, "이름": "가스용접봉", "단위": "㎏", "수량": "0.146", "비목": "재료비", "출처": "건설품셈 기계설비 13-6-2" }, { "종류": "재료", - "요소": { "구분": "잡재료", "상세구분": "용접·가스", "검색어": "아세틸렌 98%" }, + "요소": { "구분": "잡재료", "상세구분": "용접·가스", "검색어": "" }, "이름": "신주용접봉", "단위": "㎏", "수량": "0.073", @@ -7220,7 +7220,7 @@ { "종류": "재료", "요소": { "구분": "잡재료", "상세구분": "소모품", "검색어": "소창직" }, "이름": "소창직", "단위": "m", "수량": "0.134", "비목": "재료비", "출처": "건설품셈 기계설비 13-6-2" }, { "종류": "재료", - "요소": { "구분": "잡재료", "상세구분": "소모품", "검색어": "그리스(일반범용) CROWN" }, + "요소": { "구분": "잡재료", "상세구분": "소모품", "검색어": "" }, "이름": "걸레", "단위": "㎏", "수량": "0.73", @@ -10333,7 +10333,7 @@ }, { "종류": "재료", - "요소": {"구분": "기계·설비", "상세구분": "기계류", "검색어": "치즐(0.2㎥)"}, + "요소": {"구분": "기계·설비", "상세구분": "기계류", "검색어": ""}, "이름": "Bite", "단위": "개", "수량": "2.5", @@ -10342,7 +10342,7 @@ }, { "종류": "재료", - "요소": {"구분": "잡재료", "상세구분": "소모품", "검색어": "빗자루 도로청소용"}, + "요소": {"구분": "잡재료", "상세구분": "소모품", "검색어": ""}, "이름": "톱날", "단위": "개", "수량": "2.5", @@ -10351,7 +10351,7 @@ }, { "종류": "재료", - "요소": {"구분": "기계·설비", "상세구분": "기계류", "검색어": "치즐(0.2㎥)"}, + "요소": {"구분": "기계·설비", "상세구분": "기계류", "검색어": ""}, "이름": "Bite", "단위": "개", "수량": "3.2", @@ -13159,7 +13159,7 @@ }, { "종류": "재료", - "요소": {"구분": "잡재료", "상세구분": "소모품", "검색어": "그리스(일반범용) CROWN"}, + "요소": {"구분": "잡재료", "상세구분": "소모품", "검색어": ""}, "이름": "가루비누", "단위": "㎏", "수량": "0.04", @@ -15685,7 +15685,7 @@ "출처": "건설품셈 기계설비 13-10-2", "비고": "원문 규격 ø4㎜×ℓ350" }, - { "종류": "재료", "요소": { "구분": "잡재료", "상세구분": "소모품", "검색어": "그리스(일반범용) CROWN" }, "이름": "걸레", "단위": "㎏", "수량": "2", "비목": "재료비", "출처": "건설품셈 기계설비 13-10-2" }, + { "종류": "재료", "요소": { "구분": "잡재료", "상세구분": "소모품", "검색어": "" }, "이름": "걸레", "단위": "㎏", "수량": "2", "비목": "재료비", "출처": "건설품셈 기계설비 13-10-2" }, { "종류": "재료", "요소": { "구분": "잡재료", "상세구분": "소모품", "대표": "MT030665" }, "이름": "세유", "단위": "ℓ", "수량": "2", "비목": "재료비", "출처": "건설품셈 기계설비 13-10-2" }, { "종류": "재료", "요소": { "구분": "잡재료", "상세구분": "소모품", "대표": "MT030646" }, "이름": "Grease", "단위": "㎏", "수량": "0.2", "비목": "재료비", "출처": "건설품셈 기계설비 13-10-2" }, { @@ -16505,7 +16505,7 @@ }, { "종류": "재료", - "요소": {"구분": "잡재료", "상세구분": "소모품", "검색어": "그리스(일반범용) CROWN"}, + "요소": {"구분": "잡재료", "상세구분": "소모품", "검색어": ""}, "이름": "걸레", "단위": "㎏", "수량": "(만약(공사 == '기기', 0.73, 만약(공사 == '철골', 0.1, 만약(공사 == '배관', 0.2, 만약(공사 == 'Belt & Conveyor', 0.3, 만약(공사 == 'Heater & Tank', 0.1, 만약(공사 == 'Pump & Fan', 0.73, 만약(공사 == 'Crane 류', 0.73, 0))))))))", @@ -16649,7 +16649,7 @@ }, { "종류": "재료", - "요소": {"구분": "잡재료", "상세구분": "용접·가스", "검색어": "팁(날) 노면파쇄기용"}, + "요소": {"구분": "잡재료", "상세구분": "용접·가스", "검색어": ""}, "이름": "용접면", "단위": "개", "수량": "(만약(공사 == '기기', 0.01, 만약(공사 == '철골', 0.02, 만약(공사 == '배관', 0.02, 만약(공사 == 'Belt & Conveyor', 0.02, 만약(공사 == 'Heater & Tank', 0.02, 만약(공사 == 'Pump & Fan', 0.01, 만약(공사 == 'Crane 류', 0.02, 0))))))))", @@ -16658,7 +16658,7 @@ }, { "종류": "재료", - "요소": {"구분": "잡재료", "상세구분": "용접·가스", "검색어": "팁(날) 노면파쇄기용"}, + "요소": {"구분": "잡재료", "상세구분": "용접·가스", "검색어": ""}, "이름": "용접홀다", "단위": "개", "수량": "(만약(공사 == '기기', 0.01, 만약(공사 == '철골', 0.02, 만약(공사 == '배관', 0.02, 만약(공사 == 'Belt & Conveyor', 0.02, 만약(공사 == 'Heater & Tank', 0.02, 만약(공사 == 'Pump & Fan', 0.01, 만약(공사 == 'Crane 류', 0.02, 0))))))))", @@ -16667,7 +16667,7 @@ }, { "종류": "재료", - "요소": {"구분": "잡재료", "상세구분": "용접·가스", "검색어": "팁(날) 노면파쇄기용"}, + "요소": {"구분": "잡재료", "상세구분": "용접·가스", "검색어": ""}, "이름": "용접앞치마", "단위": "개", "수량": "(만약(공사 == '기기', 0.01, 만약(공사 == '철골', 0.05, 만약(공사 == '배관', 0.02, 만약(공사 == 'Belt & Conveyor', 0.05, 만약(공사 == 'Heater & Tank', 0.05, 만약(공사 == 'Pump & Fan', 0.01, 만약(공사 == 'Crane 류', 0.05, 0))))))))", diff --git a/resources/master_data/로직_산림품셈_12장_철근콘크리트.json b/resources/master_data/로직_산림품셈_12장_철근콘크리트.json index 64521131..9c6967b1 100644 --- a/resources/master_data/로직_산림품셈_12장_철근콘크리트.json +++ b/resources/master_data/로직_산림품셈_12장_철근콘크리트.json @@ -944,7 +944,7 @@ }, { "종류": "재료", - "요소": {"구분": "거푸집·가설재", "상세구분": "거푸집", "검색어": "비탈형영구거푸집(KC-FORM) 450용"}, + "요소": {"구분": "거푸집·가설재", "상세구분": "거푸집", "검색어": ""}, "이름": "핀폴 손료", "단위": "개", "수량": "1 * (1 - 10 / 100) / 20", @@ -3198,7 +3198,7 @@ }, { "종류": "재료", - "요소": {"구분": "거푸집·가설재", "상세구분": "거푸집", "검색어": "폼타이 D형"}, + "요소": {"구분": "거푸집·가설재", "상세구분": "거푸집", "검색어": ""}, "이름": "원형거푸집(PE 10회) 스라브 및 기초", "단위": "조", "수량": "1 / 10", @@ -3208,7 +3208,7 @@ }, { "종류": "재료", - "요소": {"구분": "거푸집·가설재", "상세구분": "거푸집", "검색어": "폼타이 D형"}, + "요소": {"구분": "거푸집·가설재", "상세구분": "거푸집", "검색어": ""}, "이름": "원형거푸집(PE 10회) 벽체", "단위": "조", "수량": "1 / 10", @@ -4656,7 +4656,7 @@ }, { "종류": "재료", - "요소": {"구분": "교량·구조부속", "상세구분": "신축이음·받침", "검색어": "익스팬션조인트휠러 t=10mm"}, + "요소": {"구분": "교량·구조부속", "상세구분": "신축이음·받침", "검색어": ""}, "이름": "탄성고무받침(150×150×15)", "단위": "㎡", "수량": "고무받침면적", diff --git a/resources/tester/test_masterdata_check.py b/resources/tester/test_masterdata_check.py index 9b57f371..5eb01763 100644 --- a/resources/tester/test_masterdata_check.py +++ b/resources/tester/test_masterdata_check.py @@ -770,8 +770,18 @@ def test_품셈재료_자재지역_후보(whole): "그룹": "재료", "원문": "품셈재료", "줄": [ - {"키": "MP900003", "이름": "모래", "단위": "㎥", "연결": {"이름": "모래", "규격": "", "지역": "입력"}}, - {"키": "MP900004", "이름": "레미콘", "단위": "㎥", "연결": {"이름": "레미콘", "규격": "", "지역": "입력"}}, + { + "키": "MP900003", + "이름": "모래", + "단위": "㎥", + "연결": {"이름": "모래", "규격": "", "지역": "입력"}, + }, + { + "키": "MP900004", + "이름": "레미콘", + "단위": "㎥", + "연결": {"이름": "레미콘", "규격": "", "지역": "입력"}, + }, ], } } @@ -1168,3 +1178,15 @@ def test_변수_참조_줄은_고르기_조건으로_바뀜(whole): and "{" in item["요소"] ] assert sorted(남음) == [] + + +def test_빈_검색어는_자재표에_없는_품목_단가_없음_검사_통과(): + """PLAN 29-3 — 빈 검색어 = 자재표에 없는 품목: 구분 안 첫 품목으로 안 이음 · + 계산은 까닭만 · 틀림 아님.""" + whole = cm.master() + cond = {"구분": "거푸집·가설재", "상세구분": "거푸집", "검색어": ""} + assert mm.candidates(whole, cond) == [] + assert mm.check_pick(whole, "시험", cond) == [] + got = mf.run(whole, "GF000165", cm.시험입력(whole.logic("GF000165"))) + line = next(x for x in got["줄"] if x["이름"] == "핀폴 손료") + assert line["단가"] is None and "자재표에 없는 품목" in line["까닭"]