- 찾기: 줄 단위를 별칭 · 정확 일치 고르기까지 넘김 · 이은 판정마다 단위 맞춤(MatFind `_by_unit` · 코드 길 포함) · 이름 · 규격 같은 쌍둥이 중 같은 단위 줄 › 같은 성격 = 이음 그대로 › 성격 다름 = 판정 「단위 다름 — 고르기」(까닭 「단위 다름 ㎡ ↔ 매」) - 값: 자재품목 바로 이음 줄 = 셈이 줄 단위로 환산 · 표시 「단위 환산 톤 → kg」 · 성격 다름 = 경고(master_pick 한 벌) - 문서 연결(호표 길): 자재 이음에 줄 단위 · 사람이 고른 줄도 단위 글(설명) - 시험 827-3 고침: 고른 줄 연결에 줄 단위 칸이 붙음(840-3 설계) - 전수(네 원천 · 산근 + 일위): 단위 어긋난 48 줄 = 같은 단위 줄 5 · 고르기 37 · 1:1 그대로 6 · 단위 같은 줄 이음 · 값 전후 같음 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
75 lines
3.8 KiB
Python
75 lines
3.8 KiB
Python
"""840-3 불러오기 재료 단위 — ㉠ 같은 이름 · 규격 쌍둥이 중 경쟁사 줄과 같은 단위 줄 먼저 · ㉡ 같은 성격
|
||
단위는 이은 뒤 셈이 줄 단위로 환산(표시 = `단위경고` 「단위 환산 톤 → kg」) · ㉢ 성격 다르면 잇지 않고 고르기(요구 860 · 862).
|
||
|
||
판정 = `M02_San_MatFind`(`M02_San_Link.m01`) · 값 = `master_pick.priced`(자재품목 바로 이음) · 문서 연결 = `M02_Doc_Import._link_of`.
|
||
"""
|
||
|
||
import sys
|
||
from decimal import Decimal
|
||
from pathlib import Path
|
||
|
||
ROOT = Path(__file__).resolve().parents[2]
|
||
sys.path[:0] = [str(ROOT), str(ROOT / "resources" / "master_data" / "scripts")]
|
||
|
||
import master_material as mm # noqa: E402
|
||
import master_pick as mp # noqa: E402
|
||
|
||
from M01_MasterData import M01_MasterData_Store as m01 # noqa: E402
|
||
from M02_MasterTemplete import M02_Doc_Import as dim # noqa: E402
|
||
from M02_MasterTemplete import M02_San_Link as sl # noqa: E402
|
||
from M02_MasterTemplete import M02_San_MatFind as mf # noqa: E402
|
||
|
||
|
||
def _go(name, spec, unit, code="", kind=""):
|
||
src = {"이름": name, "규격": spec, "단위": unit, "갈래": "재료", "코드": code, "종류": kind}
|
||
key, _mark = sl.m01("재료", src)
|
||
return key, src["재료찾기"]
|
||
|
||
|
||
def test_twin_same_unit_first():
|
||
"""잔디 ㎡ 줄 — 매 줄(MT006796)이 아니라 ㎡ 쌍둥이(MT006799)."""
|
||
key, found = _go("천연잔디(한국형)", "0.18×0.18×0.01", "㎡")
|
||
assert key == "MT006799" and found["판정"] == mf.LINKED
|
||
key, _ = _go("천연잔디(한국형)", "0.18×0.18×0.01", "매")
|
||
assert key == "MT006796"
|
||
|
||
|
||
def test_unit_kind_differs_goes_to_pick():
|
||
"""골재시험 회 ↔ 자재 kg · 각재 ㎥ ↔ 재 = 이음 없음 · 판정 고르기 · 까닭 글 · 후보에 그 줄."""
|
||
for name, spec, unit, was in (
|
||
("골재시험", "0.08mm체 통과량시험", "회", "MT009890"),
|
||
("각재(외송)", "3.6×3.0×3.0", "㎥", "MT000393"),
|
||
):
|
||
key, found = _go(name, spec, unit)
|
||
assert key is None and found["판정"] == mf.UNIT
|
||
assert found["방법"].startswith(f"단위 다름 {unit} ↔ ")
|
||
assert was in {c["키"] for c in found["후보"]}
|
||
|
||
|
||
def test_same_meaning_units_stay_linked():
|
||
"""본 ↔ EA · 개소 ↔ 개(개수 1 : 1) = 같은 단위로 봄 — 이음 그대로 · 표시 없음."""
|
||
key, found = _go("시스템동바리(수직재)", "D60.5×2.6T P1725", "본")
|
||
assert key == "MT000512" and found["판정"] == mf.LINKED and "단위" not in found["방법"]
|
||
|
||
|
||
def test_ton_to_kg_price():
|
||
"""자재 Ton 줄을 kg 줄에 이음 → 단가 ÷ 1,000 · 표시 「단위 환산 Ton → kg」 · 성격 다름 = 값 그대로 + 경고."""
|
||
whole = m01.loaded()[1]
|
||
base, _ = mm._lowest(whole, "MT000811")
|
||
price, _src, _why, extra = mp.priced(whole, {"단위": "kg"}, "MT000811", {}, None)
|
||
assert price == base * Decimal(1000) / Decimal(1000000)
|
||
assert extra["단위경고"] == "단위 환산 Ton → kg"
|
||
price, *_rest, extra = mp.priced(whole, {"단위": "㎡"}, "MT000811", {}, None)
|
||
assert price == base and extra["단위경고"] == "줄 ㎡ · 자재 Ton"
|
||
price, *_rest, extra = mp.priced(whole, {"단위": "ton"}, "MT000811", {}, None)
|
||
assert price == base and "단위경고" not in extra
|
||
|
||
|
||
def test_doc_link_carries_unit():
|
||
"""문서 연결(호표 길) — 자재 이음에 줄 단위 · 사람이 고른 줄도 성격 다르면 설명에 경고."""
|
||
link, note = dim._link_of({"이음": "MT000811", "단위": "kg"})
|
||
assert link == {"갈래": "요소", "키": "MT000811", "단위": "kg"} and note == "단위 환산 Ton → kg"
|
||
link, note = dim._link_of({"이음": "MT000811", "단위": "㎡"})
|
||
assert link["단위"] == "㎡" and note == "단위 다름 ㎡ ↔ Ton — 값은 자재 단위 그대로"
|
||
assert dim._link_of({"이음": "MT000811", "단위": "Ton"})[1] == ""
|