feat(B08): 구조물 잔토에 상태(자연상태)를 값으로 실음 — 유토곡선 잔량과 섞이지 않게

- 유토곡선 잔량은 다짐상태인데 이 값은 자연상태(제자리 기하 부피)라 그냥 더하면 섞임
  (2026-09-09 랩탑 메인 지적). `volume_basis: "natural"` 을 총량·측점마다 실음
- ⚠ 엄밀히는 되메움에 쓰이는 흙이 다짐부피 ÷ C 라 조금 더 들지만, 실무 정본 시트도
  그냥 빼므로(터파기 1.55 − 되메우기 0.30 = 잔토 1.25) 값은 그대로 두고 사실만 적음
- tmp/tests 1건 추가

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-09 06:47:53 +09:00
co-authored by Claude Opus 5
parent bb9532ce34
commit 018f628bf9
@@ -30,6 +30,15 @@ from B08_Quantity.B08_Quantity_Engine_UnitQuantity import COLLECTED_STONE_KEY, G
#: 유토곡선이 읽는 칸 이름 — 양쪽이 같은 낱말을 써야 인계에서 어긋나지 않는다.
STRUCTURE_SPOIL_KEY = "structure_spoil_m3"
STRUCTURE_SPOIL_POINTS_KEY = "structure_spoil_points"
#: ⚠⚠ **이 값은 자연상태(본바닥)다.** 유토곡선 잔량은 **다짐상태**라 그냥 더하면 상태가
#: 섞인다(2026-09-09 랩탑 메인 지적). 받는 쪽이 `× C` 로 맞춰 담을 수 있게 **상태를 값으로
#: 적어 보낸다** — 말로만 두면 다음 사람이 못 본다.
#: 까닭: 터파기·되메우기가 **제자리 기하 부피**(H × 폭 × 연장)이고 잔토는 그 차이다.
#: ⚠ 엄밀히는 되메움에 **쓰이는 흙**은 다짐부피 ÷ C 라 조금 더 든다. 실무 정본 시트도
#: 그냥 빼므로(터파기 1.55 − 되메우기 0.30 = 잔토 1.25) 여기서도 그대로 두되,
#: **그 사실을 적어 둔다** — 값을 임의로 보정하지 않는다.
VOLUME_BASIS_KEY = "volume_basis"
VOLUME_BASIS_NATURAL = "natural"
SPOIL_COMPONENT = "잔토처리"
@@ -52,6 +61,7 @@ def haul_inputs(unit_quantity_table: dict[str, Any] | None) -> dict[str, Any]:
COLLECTED_STONE_KEY: None,
STRUCTURE_SPOIL_KEY: None,
STRUCTURE_SPOIL_POINTS_KEY: [],
VOLUME_BASIS_KEY: VOLUME_BASIS_NATURAL,
}
total = 0.0
points: list[dict[str, Any]] = []
@@ -73,6 +83,7 @@ def haul_inputs(unit_quantity_table: dict[str, Any] | None) -> dict[str, Any]:
{
"chainage_m": chainage,
"spoil_m3": round(amount, 3),
VOLUME_BASIS_KEY: VOLUME_BASIS_NATURAL,
"ground_type": ground,
"ground_label": GROUND_TYPE_LABEL.get(str(ground)) if ground else None,
"ground_basis": str(structure.get("ground_type_basis") or ""),
@@ -83,4 +94,6 @@ def haul_inputs(unit_quantity_table: dict[str, Any] | None) -> dict[str, Any]:
COLLECTED_STONE_KEY: collected,
STRUCTURE_SPOIL_KEY: round(total, 3) if points or total else None,
STRUCTURE_SPOIL_POINTS_KEY: sorted(points, key=lambda row: row["chainage_m"]),
# 총량에도 상태를 적는다 — 측점값을 안 쓰는 쪽도 상태를 알아야 한다.
VOLUME_BASIS_KEY: VOLUME_BASIS_NATURAL,
}