# -*- coding: utf-8 -*- """재료 줄 요소조각 — 잡힌 자재품목 이름 · 참조(PLAN 8-5). `master_text._item_pieces` 가 부름.""" from __future__ import annotations import re import master_formula as mf import master_pick as mp _ERRORS = (mf.FormulaError, KeyError, TypeError) def picked(item: dict, line: dict | None, index: int, env: dict, master) -> dict | None: """재료 줄이 잡은 자재품목 줄 — 계산한 줄의 출처(`MT000018.거래가격`) 먼저 · 빈 줄이면 고름 · 검색어 · 대표로 다시 찾음. 못 찾으면 None.""" got = str((line or {}).get("출처") or "")[:8] try: if got[:2] == "MT": return master.get(got) cond = {k: mf.fill(v, env) if isinstance(v, str) else v for k, v in item["요소"].items()} key = (mp.CHOSEN.get() or {}).get(str(index)) if not key and cond.get("검색어"): key = mp.pick(master, cond, env, item.get("단위")) key = key or cond.get("대표") return master.get(str(key)) if key and str(key)[:2] == "MT" else None except _ERRORS: return None def piece(item: dict, line: dict | None, index: int, env: dict, master) -> dict | None: """요소조각 — 글 = 품목 이름(지역 포함) · 참조 = 테이블 MT · 그 키. 못 찾으면 None.""" row = picked(item, line, index, env, master) if row is None: return None key = str(row["키"]) name = re.sub(r"\s+", " ", str(row.get("이름") or "")).strip() return {"kind": "요소", "글": name, "참조": {"테이블": key[:2], "키": key}}