knowledge(마스터): 전력을 재료_유가전력으로 연결 — 자재품목 전력 2줄 뺌

- 품셈재료 「전력」 연결 = {이름: 전력량요금, 계약종별: 입력} — 유가전력 전력 줄을 가리킴
- 전력 쓰는 로직 8 줄에 입력 「전력 계약종별」(주택용 저압 · 일반용(갑)Ⅰ 저압 · 산업용(갑)Ⅰ 저압) — 품셈·계약예규에 계약종별 규정 없어 기본값 두지 않음
- 임시전력(갑)은 주택용 저압 요금 그대로(요금표 6.가) — 따로 고르기에 두지 않음
- master_material: 자재품목 아닌 줄은 「값」 한 칸으로 읽고 계약종별 후보를 고름 · check_master 연결 모양·끊김 검사도 맞춤
- 자재품목 MT000006 · MT000007 삭제 → _키대장.json 「폐기」 · 빌더 DROP 에 더해 다시 만들어도 같음
- _틀.md 재료 절 · 시험 둘 고침(전력 계약종별 · 연결 낮은 값은 시멘트로)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj
This commit is contained in:
2026-09-20 19:11:34 +09:00
co-authored by Claude Opus 5
parent 7b017e61c6
commit 76ee8acb4b
11 changed files with 157 additions and 29 deletions
@@ -14,8 +14,10 @@ from decimal import Decimal
LINKED = "MP" # 품셈재료 테이블ID
MARKET = "MT" # 자재품목 테이블ID
PRICED = "MO" # 유가전력 테이블ID — 값 한 칸
SLOTS = ("물가자료", "유통물가", "물가정보", "거래가격", "관급") # 자재품목 값 열
REGION = "자재지역" # 로직 입력 — 「지역」 은 유가 고르기가 씀
TARIFF = "전력 계약종별" # 로직 입력 — 품셈·계약예규에 계약종별 규정 없음
_UNITS = {"ea": "", "ton": "", "t": "", "l": "", "리터": "", "set": "", "세트": ""}
@@ -35,8 +37,10 @@ def plain_unit(s) -> str:
def _offers(master: mf.Master, key: str) -> list[tuple[Decimal, str]]:
"""자재품목 줄 하나의 (값, 출처) — 값이 있는 열마다 하나 · 출처는 그 열 이름."""
"""줄 하나의 (값, 출처) — 자재품목은 값이 있는 열마다 하나 · 그 밖(유가전력)은 「값」 한 칸."""
row = master.get(key)
if key[:2] != MARKET:
return [(row[""], f"{row['']}.값")] if row.get("") is not None else []
return [(row[slot], f"{row['']}.{slot}") for slot in SLOTS if row.get(slot) is not None]
@@ -59,9 +63,30 @@ def _market_index(master: mf.Master) -> list[tuple[str, str, str, str, str]]:
return master._market
def _tariff(master: mf.Master, ref: str, row: dict, env: dict) -> list[str]:
"""후보 조건{이름 · 계약종별: 입력} — 유가전력 전력 줄 가운데 그 계약종별·이름으로 시작하는 줄."""
cond = row["연결"]
if TARIFF not in env:
raise mf.FormulaError(f"{master.label(ref)}」 입력 「{TARIFF}」 없음")
want, kind = plain(cond["이름"]), plain(env[TARIFF])
hits = [
key
for key, one in master.index.get(PRICED, {}).items()
if one.get("구분") == "전력"
and plain(one.get("상세구분")) == kind
and plain(one.get("이름")).startswith(want)
and one.get("") is not None
]
if not hits:
raise mf.FormulaError(f"{master.label(ref)}」 계약종별 값 없음 — {env[TARIFF]}")
return hits
def _candidates(master: mf.Master, ref: str, row: dict, env: dict) -> list[str]:
"""후보 조건{이름 · 규격 · 지역: 입력} — 뿌리가 이름으로 끝나고 이름에 지역 글자 · 단위 같음."""
cond = row["연결"]
if cond.get("계약종별") == "입력":
return _tariff(master, ref, row, env)
if cond.get("지역") == "입력" and REGION not in env:
raise mf.FormulaError(f"{master.label(ref)}」 입력 「{REGION}」 없음")
region = plain(env.get(REGION, "")) if cond.get("지역") == "입력" else ""