- 운반 줄 이름: 「dozer 운반」 → 「불도저 운반」(매핑 master_name) · 「dump_truck 운반」 → 「덤프 운반」 · 「free_haul 운반」 → 「무대(종방향유용토)」(토공집계 이름) - 덤프 규격·호표 규격 L: 「L=137.13474461798225m」 → 「L=137.13m」 — 보이기만 둘째 자리 · 호표 열쇠·운반 식은 받은 거리 그대로 - 규격 칸 갈래: 이미 적힌 갈래는 한 번만(`spec_with_variant` · 숫자 경계) — 「Ø800 800」 → 「Ø800」 - 936be972 내역: 흠 줄 6 → 0 · 금액 불변 161,514,889 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016VBGFXB9AbJBwXP19z75Qq
85 lines
3.4 KiB
Python
85 lines
3.4 KiB
Python
"""운반 줄은 자연상태로 선다 (2026-09-09).
|
|
|
|
⚠⚠ **두 자가 섞여 있던 자리다.** 유토곡선은 **다짐상태**로 쌓고(운반거리를 그 기준으로 재야
|
|
맞는다) **내역서에 오르는 수량은 자연상태**다 —
|
|
`config_system_design` 5-4-3 「운반거리 산정 시 모든 수량은 다짐상태로 환산해 계산하고,
|
|
**내역서에 적용하는 수량은 자연상태로 한다**」.
|
|
|
|
⚠ 겨누는 것 넷
|
|
① 되돌린 값(`natural_m3`)이 오면 **그 값으로 선다**
|
|
② 쓴 계수를 근거에 적는다 — 되짚을 수 있어야 한다
|
|
③ ⚠ 되돌릴 계수가 없으면(갈래 못 붙임) **다짐 그대로 두고 사유를 낸다** — 토사 계수로
|
|
눅이면 근거 없이 금액이 움직인다
|
|
④ **거리는 안 바뀐다** — 거리는 다짐 기준으로 재는 것이 맞다
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parents[2]
|
|
sys.path.insert(0, str(ROOT))
|
|
|
|
from B08_Quantity.B08_Quantity_Engine_Handoff import build_handoff # noqa: E402
|
|
|
|
|
|
def 표(**extra: object) -> dict:
|
|
row = {
|
|
"equipment": "dump_truck",
|
|
"ground": "리핑암",
|
|
"volume_m3": 140.78,
|
|
"average_distance_m": 318.6,
|
|
"in_bill": True,
|
|
}
|
|
row.update(extra)
|
|
return {"rows": [row]}
|
|
|
|
|
|
def 줄(**extra: object) -> dict:
|
|
rows = build_handoff(haul_table=표(**extra))["work_items"]
|
|
return next(row for row in rows if row["name"] == "덤프 운반")
|
|
|
|
|
|
def test_되돌린_값이_오면_그것으로_선다() -> None:
|
|
row = 줄(natural_m3=122.42, conversion_c=1.15)
|
|
assert row["quantity"] == 122.42
|
|
|
|
|
|
def test_쓴_계수가_근거에_적힌다() -> None:
|
|
row = 줄(natural_m3=122.42, conversion_c=1.15)
|
|
assert "÷ C 1.15" in row["spec_detail"] and "자연상태" in row["spec_detail"]
|
|
|
|
|
|
def test_되돌릴_계수가_없으면_다짐_그대로_두고_사유() -> None:
|
|
"""⚠ 토사 계수로 눅이면 근거 없이 금액이 움직인다."""
|
|
row = 줄()
|
|
assert row["quantity"] == 140.78
|
|
assert "다짐상태 그대로" in row["spec_detail"]
|
|
|
|
|
|
def test_거리는_안_바뀐다() -> None:
|
|
"""거리는 다짐 기준으로 재는 것이 맞다 — 상태를 되돌려도 그대로다."""
|
|
assert 줄(natural_m3=122.42, conversion_c=1.15)["haul_distance_m"] == 318.6
|
|
|
|
|
|
def test_갈래를_통로로_보낸다() -> None:
|
|
"""⚠⚠ 운반 단가가 지반 갈래로 갈리는데 `spec` 문자열만 보내면 받는 쪽이 못 고른다.
|
|
|
|
「버림」에서 275,584원이 사라졌던 그 자리와 같다 — 갈래는 `variant_value` 한 통로로만.
|
|
"""
|
|
row = 줄(natural_m3=122.42, conversion_c=1.15)
|
|
assert row["variant_axis"] == "ground_class"
|
|
assert row["variant_value"] == "리핑암"
|
|
# ⚠ 이름은 우리 갈래 그대로 — 일위대가의 「파쇄암」과는 인계본 별칭이 이어 준다.
|
|
assert row["spec"] == "리핑암"
|
|
|
|
|
|
def test_갈래가_없는_줄은_칸이_비어_있다() -> None:
|
|
"""무대처럼 갈래가 없는 자리에 빈 문자열을 넣지 않는다 — `None` 이라야 「없음」이다."""
|
|
rows = build_handoff(haul_table={"rows": [{"equipment": "dozer", "volume_m3": 10.0}]})[
|
|
"work_items"
|
|
]
|
|
row = next(r for r in rows if r["name"] == "불도저 운반")
|
|
assert row["variant_axis"] is None and row["variant_value"] is None
|