diff --git a/resources/master_data/scripts/master_formula.py b/resources/master_data/scripts/master_formula.py index 926396b6..8f6ac76e 100644 --- a/resources/master_data/scripts/master_formula.py +++ b/resources/master_data/scripts/master_formula.py @@ -267,7 +267,7 @@ class Master: if number in slot: self.twice.add((key[:2], number)) slot.setdefault(number, row) - mp.EQ.set(self.numbers.get("EQ", {})) # 기계 입력이 목록 밖 원문 분류번호도 받게 + mp.EQ.set(self) # 기계 입력이 목록 밖 원문 분류번호도 받게 def get(self, ref: str) -> dict: tid, _, number = ref.partition(":") @@ -503,6 +503,7 @@ def _inputs(row: dict, given: dict) -> dict: pass if isinstance(value, (int, float)): value = Decimal(str(value)) + value = mp.resolve(spec, value) # 기계 EQ 키 → 원문 분류번호 if "고르기" in spec and value not in spec["고르기"] and not mp.machine(spec, value): raise FormulaError(f"입력 「{name}」={value} 고르기 밖") if "범위" in spec: diff --git a/resources/master_data/scripts/master_pick.py b/resources/master_data/scripts/master_pick.py index f3f28ebf..185943f9 100644 --- a/resources/master_data/scripts/master_pick.py +++ b/resources/master_data/scripts/master_pick.py @@ -27,7 +27,7 @@ REGIONS = ( ).split() CHOSEN: ContextVar[dict | None] = ContextVar("고름", default=None) # {호표 줄 차례(0부터): 자재 키} -EQ: ContextVar[dict | None] = ContextVar("기계번호", default=None) # 기계 마스터 {원문번호: 줄} +EQ: ContextVar = ContextVar("기계번호", default=None) # 지금 쓰는 마스터 — 기계 줄을 찾음 @contextmanager @@ -40,9 +40,22 @@ def choosing(picks: dict | None): CHOSEN.reset(token) +def _numbers() -> dict: + return EQ.get().numbers.get("EQ", {}) if EQ.get() else {} + + +def resolve(spec: dict, value): + """기계 입력이 EQ 키로 오면 원문 분류번호로 풂 — 고르기 목록(원문번호)과 같은 꼴.""" + if not (isinstance(value, str) and value.strip()[:2] == "EQ" and EQ.get()): + return value + row = EQ.get().index.get("EQ", {}).get(value.strip()) + number = str(row.get("원문번호") or "") if row else "" + return number if number and machine(spec, number) else value + + def machine(spec: dict, value) -> bool: """기계 입력 — 고르기 목록 밖 원문 분류번호도 기계 마스터에 있으면 받음.""" - known = EQ.get() or {} + known = _numbers() picks = spec.get("고르기") or [] return bool(picks) and str(value).strip() in known and all(str(o) in known for o in picks) diff --git a/resources/tester/test_m01_pick.py b/resources/tester/test_m01_pick.py index 1e6215da..f911987b 100644 --- a/resources/tester/test_m01_pick.py +++ b/resources/tester/test_m01_pick.py @@ -112,3 +112,18 @@ def test_check_master_검색어_후보0_단위경고(client) -> None: assert "후보 0" in mf.check_pick(whole, "줄", {"검색어": "없는물건zzz"})[0] assert mf.check_unit(whole, "줄", {"검색어": "어닐링철선 서울 4.0mm"}, "kg") == [] assert "성격이 다름" in mf.check_unit(whole, "줄", {"검색어": "어닐링철선 서울 4.0mm"}, "m")[0] + + +def test_기계_입력은_EQ_키도_원문번호로_풀어_받음(client) -> None: + key = "GC000267" + number = "0101-0007" # 고르기 목록 밖 + eq = next(k for k, r in store.loaded()[1].index["EQ"].items() if r.get("원문번호") == number) + base = {**store.auto(key)["값"]} + by_number = client.post( + "/api/m01/calc", json={"key": key, "inputs": {**base, "기계": number}} + ).json() + by_key = client.post("/api/m01/calc", json={"key": key, "inputs": {**base, "기계": eq}}).json() + assert by_key["ok"] is True, by_key + assert by_key["sums"] == by_number["sums"] # EQ 키 = 원문번호와 같은 계산 + bad = client.post("/api/m01/calc", json={"key": key, "inputs": {**base, "기계": "EQ999999"}}) + assert bad.json()["ok"] is False