Files
Aislo/resources/tester/test_840_3_material_unit.py
T
eomsangdonandClaude Opus 5.5 92fd88e94c feat(840-3): 불러오기 재료 단위 셋 — 같은 단위 쌍둥이 먼저 · 같은 성격 환산 · 성격 다르면 고를 재료
- 찾기: 줄 단위를 별칭 · 정확 일치 고르기까지 넘김 · 이은 판정마다 단위 맞춤(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>
2026-11-15 16:19:36 +09:00

75 lines
3.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""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] == ""