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
+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, {})