"""B09 원가 요율 후보(PLAN 145-4) — M01 `요율_조달청제비율.json` 을 읽어 줄마다 후보 글 한 줄. 후보는 보이기만 — 구간(추정가격 · 공기 · 공종 · 연도)을 고르는 값은 사용자 몫이라 확정하지 않음. 요율 칸은 빈칸에서 시작(사용자 입력 · `user.estimate.rates`). """ from __future__ import annotations import json from functools import lru_cache from pathlib import Path from typing import Any FILE = Path(__file__).resolve().parents[1] / "resources" / "master_data" / "요율_조달청제비율.json" def _percents(value: Any) -> list[float]: """값 안 모든 rate_percent — 구간 · 연도 · 공종 갈래 통째로.""" if isinstance(value, dict): own = value.get("rate_percent") found = [float(own)] if isinstance(own, (int, float)) else [] return found + [ p for key, v in value.items() if key != "rate_percent" for p in _percents(v) ] if isinstance(value, list): return [p for item in value for p in _percents(item)] return [] @lru_cache(maxsize=1) def rate_candidates() -> dict[str, str]: """{RT 키: 「M01 RT… 3.56%」 · 「… 1.01~1.57%(구간 · 고르는 값 사용자)」} — 파일 없으면 {}.""" try: rows = json.loads(FILE.read_text(encoding="utf-8")).get("줄") or [] except (OSError, ValueError): return {} out: dict[str, str] = {} for row in rows: percents = sorted(set(_percents(row.get("값")))) if not percents: text = "구간 식(고르는 값 사용자)" elif len(percents) == 1: text = f"{percents[0]:g}%" else: text = f"{percents[0]:g}~{percents[-1]:g}%(구간 · 고르는 값 사용자)" out[str(row.get("키"))] = f"M01 {row.get('키')} {text}" return out