fix(M01): 자재표에 없는 품목 34건 — 재료 줄 검색어 비움(40줄) · 빈 검색어 = 후보 없음 · 결정 목록 절(PLAN 29-3)

- 로직 14 파일 재료 줄 40 검색어를 빈 글로(억지 연결 뗌) · 그 줄만 고침(다른 줄 · 모양 그대로)
- GC000432 메탈리밍쉘 {규격} 은 그대로 — BX 는 품목 있음 · NX 는 이미 후보 없음
- 엔진: 빈 검색어 = 자재표에 없는 품목 — candidates 빈 목록 · 계산 단가 없음 + 까닭 · 고름은 그대로 · 검사 틀림 안 셈(master_pick · master_material) · _틀.md 한 줄
- 결정 목록 맨 아래 「자재표에 없는 품목 — 사용자 결정」 34줄
- 시험 한 건 더함(test_masterdata_check)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BU9gbNE3aWFUvE61pS2WGt
This commit is contained in:
2026-09-30 17:31:31 +09:00
co-authored by Claude Opus 5.5
parent a01cf96769
commit f7f4572f3c
19 changed files with 126 additions and 47 deletions
+41
View File
@@ -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 | 검색어 비움 |
+1
View File
@@ -225,6 +225,7 @@
- 이름 조건 = 구분·상세구분·규격이 같아도 품명이 갈리는 자재품목을 가를 때만 둠(예: 파형강관 커플링밴드 vs 접속티 — 둘 다 관경만 규격에 있어 규격 조건으로는 안 갈림). 규격과 같은 방식(낱말이 **모두** 이름에 든 줄) — 대소문자·빈칸은 안 가림.
- **키를 못 박음** — 재료 줄은 늘 요소 묶음 + `검색어`(「합판(내수) 12t 서울」) · 줄에 자재품목 키를 바로 적지 않음 · 재료 입력에 키 목록(`고르기`)을 두지 않음.
- 찾기 = 검색어 낱말(띄어쓰기로 나눔)이 **모두** 이름 또는 규격에 든 자재품목 줄 · 요소에 `구분` · `상세구분` 이 있으면 그 안에서만 · 단위는 같은 성격까지(아래 환산).
- `검색어` 빈 글 = 자재표에 없는 품목(`docs/raw/M01_결정목록` 「자재표에 없는 품목」) — 후보 없음 · 단가 없음 · 까닭만 · 품목을 골라 넣으면 그 값 · 검사는 틀림으로 안 셈.
- 자동값 차례 = 값 있는 줄 → 줄 단위와 똑같은 단위 → 검색어 안 지역 낱말(서울 등)과 맞는 줄 → 키 차례 · 그 첫째.
- 고른 품목 = 계산 요청에만 실음(`_화면_계약.md` 10장 `고름`) · 로직 파일에 저장하지 않음 · 폐기 품목은 지움.
- 단위 환산 = 같은 성격만 — 무게 g · kg · ton(톤 · Ton) / 길이 mm · cm · m · km / 넓이 ㎠ · ㎡ / 부피 ㎤ · ℓ · ㎥ · 단가를 줄 단위로 바꿔 계산.
@@ -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, {})
+15 -3
View File
@@ -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, {})
@@ -106,7 +106,7 @@
},
{
"종류": "재료",
"요소": {"구분": "잡재료", "상세구분": "용접·가스", "검색어": "아세틸렌 98%"},
"요소": {"구분": "잡재료", "상세구분": "용접·가스", "검색어": ""},
"이름": "동 및 동합금용 용접봉",
"규격": "BCUP3",
"단위": "㎏",
@@ -203,7 +203,7 @@
},
{
"종류": "재료",
"요소": {"구분": "잡재료", "상세구분": "용접·가스", "검색어": "아세틸렌 98%"},
"요소": {"구분": "잡재료", "상세구분": "용접·가스", "검색어": ""},
"이름": "잠호용접와이어",
"단위": "㎏",
"수량": "만약(용접방식 == '자동용접', 환산용접길이 * 찾기(QC001190, 재료='잠호용접와이어').자동용접, 0)",
@@ -2055,7 +2055,7 @@
},
{
"종류": "재료",
"요소": {"구분": "거푸집·가설재", "상세구분": "동바리·비계", "검색어": "안전발판(PSP대용) 250×3000"},
"요소": {"구분": "거푸집·가설재", "상세구분": "동바리·비계", "검색어": ""},
"이름": "손잡이기둥",
"단위": "개",
"수량": "찾기(QC000063, 구분='손잡이기둥').수량 * 찾기(QC000016, 공기=공기, 재료='강관, 비계기본틀, 비계장선틀, 가새').손율 / 100",
@@ -269,7 +269,7 @@
},
{
"종류": "재료",
"요소": {"구분": "콘크리트제품", "상세구분": "경계석·블록", "검색어": "주차라인블록 1000X300X150"},
"요소": {"구분": "콘크리트제품", "상세구분": "경계석·블록", "검색어": ""},
"이름": "치장벽돌",
"단위": "매",
"수량": "찾기(QC001213, 벽두께=벽두께).'벽돌(19×9×5.7㎝)'",
@@ -243,7 +243,7 @@
},
{
"종류": "재료",
"요소": {"구분": "도료·방수·접착", "상세구분": "방수·실링", "검색어": "방수석고보드 12.5t"},
"요소": {"구분": "도료·방수·접착", "상세구분": "방수·실링", "검색어": ""},
"이름": "일체식 방수시트",
"단위": "㎡",
"수량": "찾기(QC000635, 구분='일체식 방수시트').수량",
@@ -3303,7 +3303,7 @@
},
{
"종류": "재료",
"요소": {"구분": "목재", "상세구분": "각재·판재", "검색어": "외송각재 30×30×3600mm 서울"},
"요소": {"구분": "목재", "상세구분": "각재·판재", "검색어": ""},
"이름": "각재 10㎝×10㎝",
"단위": "㎥",
"수량": "찾기(QC000245).각재",
@@ -2394,7 +2394,7 @@
},
{
"종류": "재료",
"요소": {"구분": "볼트·앵커·철물", "상세구분": "와이어로프·클램프", "검색어": "와이어로프(철심) 9㎜"},
"요소": {"구분": "볼트·앵커·철물", "상세구분": "와이어로프·클램프", "검색어": ""},
"이름": "P.P로프(9㎜)",
"단위": "m",
"수량": "찾기(QC000334, 구분='육상부설').'P.P로프(9㎜)' / 100",
@@ -5339,7 +5339,7 @@
},
{
"종류": "재료",
"요소": {"구분": "매트·토목섬유", "상세구분": "부직포·토목섬유", "검색어": "직포 옥상방수용직포"},
"요소": {"구분": "매트·토목섬유", "상세구분": "부직포·토목섬유", "검색어": ""},
"이름": "지오콤포지트",
"단위": "㎡",
"수량": "만약(재료 == '지오콤포지트', 찾기(QC000399, 구분='지오콤포지트').수량, 0)",
@@ -957,7 +957,7 @@
},
{
"종류": "재료",
"요소": {"구분": "건축마감", "상세구분": "천장·바닥·마감재", "검색어": "처마후레싱 C/S"},
"요소": {"구분": "건축마감", "상세구분": "천장·바닥·마감재", "검색어": ""},
"이름": "테라조",
"단위": "m",
"수량": "만약(구분 == '석재류', 찾기(QC001266, 구분=구분).테라조, 0)",
@@ -966,7 +966,7 @@
},
{
"종류": "재료",
"요소": {"구분": "건축마감", "상세구분": "천장·바닥·마감재", "검색어": "처마후레싱 C/S"},
"요소": {"구분": "건축마감", "상세구분": "천장·바닥·마감재", "검색어": ""},
"이름": "합성수지 걸레받이",
"단위": "m",
"수량": "만약(구분 == '합성수지류', 찾기(QC001266, 구분=구분).합성수지, 0)",
@@ -958,7 +958,7 @@
},
{
"종류": "재료",
"요소": {"구분": "도료·방수·접착", "상세구분": "방수·실링", "검색어": "방수석고보드 12.5t"},
"요소": {"구분": "도료·방수·접착", "상세구분": "방수·실링", "검색어": ""},
"이름": "벤토나이트방수재",
"단위": "㎡",
"수량": "만약(종류 == '벤토나이트 시트', 찾기(QC001307, 구분='벤토나이트방수재', 종류='시트', 부위=부위).수량, 0)",
@@ -1021,7 +1021,7 @@
},
{
"종류": "재료",
"요소": {"구분": "잡재료", "상세구분": "소모품", "검색어": "PVC코팅철선 #8"},
"요소": {"구분": "잡재료", "상세구분": "소모품", "검색어": ""},
"이름": "조인트테이프",
"단위": "m",
"수량": "만약(종류 == '벤토나이트 시트', 찾기(QC001307, 구분='조인트테이프', 종류='시트', 부위=부위).수량, 0)",
@@ -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)",
@@ -447,7 +447,7 @@
},
{
"종류": "재료",
"요소": {"구분": "볼트·앵커·철물", "상세구분": "볼트·너트", "검색어": "작은나사(스크류) ø 4.2㎜"},
"요소": {"구분": "볼트·앵커·철물", "상세구분": "볼트·너트", "검색어": ""},
"이름": "AL리벳",
"단위": "개",
"수량": "찾기(QC001339, 구분='AL리벳', 규격='ø 4.2㎜').수량",
@@ -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, 종별='에어해머').수량",
@@ -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))))))))",
@@ -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)",
"단위": "㎡",
"수량": "고무받침면적",
+24 -2
View File
@@ -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["까닭"]