"""운반이 두 축에 실리던 자리 (2026-09-09 실측). ⚠⚠ 토공집계표는 실무 토적집계 모양이라 「무대·도자운반·덤프운반」을 함께 싣고, 인계본에는 운반표(FP-10-11·FP-10-12)가 **같은 물량으로 또 실렸다.** 실측 — 도자 17.389·61.130 · 덤프 37.511·122.417 이 두 축에 각각 있었고 **둘 다 in_bill**. ⚠ 겨누는 것 넷 ① 집계 쪽 운반 줄은 **내역 줄이 아니다** ② 그래도 **값은 남는다** — 검산(무대+도자+덤프 = 총 운반토량)이 그 값을 씀 ③ 사유가 적힌다 — 「내역 줄은 운반표 쪽」 ④ 운반표 쪽은 그대로 내역 줄로 선다 """ 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 집계 = { "rows": [ {"group": "도자운반", "unit": "㎥", "amount": 17.39, "in_bill": True}, {"group": "덤프운반", "unit": "㎥", "amount": 37.51, "in_bill": True}, {"group": "무대(종방향유용토)", "unit": "㎥", "amount": 14.76, "in_bill": False}, {"group": "성토", "unit": "㎥", "amount": 100.0, "in_bill": True}, ] } 운반 = { "rows": [ { "equipment": "dozer", "ground": "토사", "volume_m3": 15.65, "natural_m3": 17.39, "conversion_c": 0.9, "average_distance_m": 43.66, "in_bill": True, } ] } def 줄들() -> dict: rows = build_handoff(summary_table=집계, haul_table=운반)["work_items"] return {row["name"]: row for row in rows} def test_집계_쪽_운반은_내역_줄이_아니다() -> None: rows = 줄들() assert rows["도자운반"]["in_bill"] is False assert rows["덤프운반"]["in_bill"] is False def test_값은_남는다() -> None: """⚠ 빼 버리면 검산이 안 된다 — 무대를 그렇게 둔 것과 같은 규칙.""" assert 줄들()["도자운반"]["quantity"] == 17.39 def test_사유가_적힌다() -> None: reason = 줄들()["도자운반"]["in_bill_reason"] assert "내역 줄은 운반표 쪽" in reason def test_운반표_쪽은_그대로_선다() -> None: row = 줄들()["불도저 운반"] assert row["in_bill"] is True and row["work_item_code"] == "FP-10-11" assert row["quantity"] == 17.39 def test_토공_줄은_안_건드린다() -> None: """⚠ 성토처럼 집계에만 있는 줄은 그대로 내역 줄이다 — 운반 계열만 가른다.""" assert 줄들()["성토"]["in_bill"] is True