fix(b09): 휘발유 기계에 경유값이 붙던 것 — 운전경비표 연료 종류대로 유가 · 콘크리트 진동기(4611) 원문값 되살려 집수정 구체콘크리트 갈래를 세움

· 연료 — `fuel_kind` 를 조립이 안 읽어 휘발유 기계 10종(래머·플레이트 콤팩터·믹서·커터·진동기)이 경유값이었음 → `M-FUEL-휘발유` · 시도 판도 종류대로 · 기계 하나 사용료·중기경비 장도 같은 값
· 진동기 — 건설품셈 8-3 (4611) 두 줄이 한 칸에 뭉쳐 규격·손료계수가 비었음 → 원문값 되살림(전기식 ø45 0.75㎾ 4,935 · 엔진식 ø45 2.6㎾ 5,101 · 판정 없음)
· 12-15 「봉상후렉시블(45mm)」 → 엔진식 4611-0350 범위 별칭 — 12-15 는 전기·엔진을 안 적음 · 12-34-1 「3.5HP」 = 2.6㎾ · 운전경비표에 엔진식만(브레인 승인) → 구체콘크리트 갈래가 진동기 1/5.4 hr/㎥ 와 함께 섬
· 661 뒤처리 — 중기경비 장의 `#암석` 이 조합 16%·비암석 계수로 보이던 것을 보정 상각·정비·계와 본 잡품률로
· 마스터 재생성 — 12-15 갈래 키만(구체콘크리트 더함)

휘발유 기계 전수 대조: 재료비 +13~113원/hr · 조립에 선 것은 플레이트 콤팩터(+20원/hr → 9-14-02 +5원)와 진동기 · 나머지 제목 그대로 · 프로젝트 내역 그대로 · 잴 시험 일곱 빨강→초록 · 끄기 다섯 빨강 · 전체 시험 1695 + 330 통과
(시험 파일은 앞선 autopush 가 먼저 쓸어 올린 빨강본 — 이 커밋이 초록으로 맞춤)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BW6Jdsh18WPtYUR6THZJqn
This commit is contained in:
2026-09-14 22:40:49 +09:00
co-authored by Claude Opus 5
parent 142b100a09
commit 7ea2598263
10 changed files with 120 additions and 47 deletions
+6 -3
View File
@@ -35,15 +35,18 @@ def _basin(structure: dict) -> dict:
return next(r for r in handoff["work_items"] if r["origin"] == "structure")
def test_버림_갈래는_서고_구체_갈래는_다짐기_없어_안_섬() -> None:
def test_버림_갈래는_서고_구체_갈래는_다짐기가_풀려야_섬() -> None:
"""⑴ 다짐기 빠진 구체 갈래는 안 세움 — 2026-09-14 661 뒤 ① 진동기(엔진식 4611-0350)가 풀려 이제 섬."""
from B09_Estimation.B09_Estimation_UnitPrice import cached_build, detail_of
build = cached_build()
assert "B-FP-12-15#구체콘크리트" not in build.book.titles
assert "B-FP-12-15#구체콘크리트" in build.book.titles
rows = detail_of(build, "B-FP-12-15#버림콘크리트")["rows"]
assert {r["ref_code"]: float(r["quantity"]) for r in rows} == {"1013": 0.15, "1002": 0.27}
body = {r["ref_code"] for r in detail_of(build, "B-FP-12-15#구체콘크리트")["rows"]}
assert "X-4611-0350" in body, body # 인력만으로 서지 않음(⑴ 까닭 그대로)
left = " ".join(build.unattached.get("FP-12-15", []))
assert "구체콘크리트" in left and "봉상후렉시블" in left, left
assert "구체콘크리트" not in left and "봉상후렉시블" not in left, left
def test_콘크리트_집수정은_조립_조각으로_가고_막힌_까닭이_드러남() -> None:
@@ -29,10 +29,13 @@ def test_휘발유_기계는_휘발유값_경유_기계는_경유값() -> None:
fuels = {r.ref_code for r in book.details["X-1730-0015"] if r.ref_code.startswith("M-FUEL-")}
assert fuels == {"M-FUEL-휘발유"}, fuels
gasoline = Decimal(str(_oil("oil_2026-08-14.json", "oil_gasoline")["value"]))
assert book.titles["M-FUEL-휘발유"].slots[-1] == gasoline or gasoline in book.titles[
"M-FUEL-휘발유"
].slots
diesel_rows = {r.ref_code for r in book.details["X-0201-0070"] if r.ref_code.startswith("M-FUEL-")}
assert (
book.titles["M-FUEL-휘발유"].slots[-1] == gasoline
or gasoline in book.titles["M-FUEL-휘발유"].slots
)
diesel_rows = {
r.ref_code for r in book.details["X-0201-0070"] if r.ref_code.startswith("M-FUEL-")
}
assert diesel_rows == {"M-FUEL-경유"}
@@ -66,7 +69,11 @@ def test_진동기_원문값_되살림() -> None:
def test_집수정_구체콘크리트_갈래가_엔진식_진동기로_섬() -> None:
build = cached_build()
rows = {r["ref_code"]: Decimal(r["quantity"]) for r in detail_of(build, "B-FP-12-15#구체콘크리트")["rows"] if r.get("ref_code")}
rows = {
r["ref_code"]: Decimal(r["quantity"])
for r in detail_of(build, "B-FP-12-15#구체콘크리트")["rows"]
if r.get("ref_code")
}
assert rows["X-4611-0350"] == Decimal(1) / Decimal("5.4"), rows
left = " ".join(build.unattached.get("FP-12-15", []))
assert "봉상후렉시블" not in left and "구체콘크리트" not in left, left
@@ -89,7 +96,7 @@ def test_중기경비_장은_갈래대로_잡품과_손료계수() -> None:
rock, combined = sheets["X-0201-0070#암석"], sheets["X-0201-0070#조합"]
assert rock["misc_material_percent"] == sheets["X-0201-0070"]["misc_material_percent"]
assert combined["misc_material_percent"] == "16"
assert rock["loss_coefficient"] == 2405 and sheets["X-0201-0070"]["loss_coefficient"] == 2085
assert rock["loss_coefficient"] == 2405.0 and sheets["X-0201-0070"]["loss_coefficient"] == 2085
gasoline = next(s for s in sheets.values() if s["machine_code"] == "1730-0015")
assert Decimal(gasoline["fuel_price_per_liter"]) == Decimal(
str(_oil("oil_2026-08-14.json", "oil_gasoline")["value"])