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:
@@ -43,6 +43,14 @@
|
||||
"pum_edition": "2026-01-01",
|
||||
"basis": "9-19-1 토사면 고르기 절토면 표(원문 L5414)가 자원 머리에 규격을 안 적음 — [주]① 「공기압축기는 3.5㎥/분, 소형브레이커는 1㎥/분, 굴착기는 0.7㎥를 기준한 것이다」 → 굴착기(무한궤도) 0.7(카탈로그 0.7 은 무한궤도뿐). 칸이 규격을 적은 줄(성토면 굴착기 0.6㎥)은 안 덮음. 2026-09-14 브레인 승인(⑤ Ⓐ)"
|
||||
},
|
||||
{
|
||||
"axis": "resource",
|
||||
"from": "다짐:봉상후렉시블(45mm)",
|
||||
"to": "4611-0350",
|
||||
"scope": "FP-12-15",
|
||||
"pum_edition": "2026-01-01",
|
||||
"basis": "12-15 집수정 표(원문 L6460)는 「봉상후렉시블(45mm) Q=5.4㎥/hr」 만 적고 전기·엔진을 안 적음 — 건설품셈 8-3 (4611) 은 전기식 플렉시블형 ø45(0.75㎾)·엔진식 플렉시블형 ø45(2.6㎾) 둘 · 12-34-1 「콘크리트 진동기(3.5HP)」 = 2.6㎾ 엔진식 · 운전경비표(8-4)에 엔진식 4611-0350(휘발유 1.0L)만 있음 → 엔진식. 전기식이 필요하면 그때 엶. 2026-09-14 브레인 승인(661 뒤 ①)"
|
||||
},
|
||||
{
|
||||
"axis": "variant",
|
||||
"from": "0.2·소림",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"schema_version": "1.0",
|
||||
"dataset_id": "data_work_item_master_manifest",
|
||||
"generated_at": "2026-09-14T21:01:09+09:00",
|
||||
"generated_at": "2026-09-14T22:25:14+09:00",
|
||||
"built_by": "B08_Quantity/B08_Quantity_Build_WorkItemMaster.py",
|
||||
"source": {
|
||||
"dataset_id": "pum_forest",
|
||||
@@ -12,8 +12,8 @@
|
||||
"files": [
|
||||
{
|
||||
"file": "work_item_master_2026-01-01.json",
|
||||
"sha256": "915a1403611a9c713e5c59bff4422a2fe9f53d4168a44a9fada43d14b6c9d9d6",
|
||||
"size_bytes": 838599
|
||||
"sha256": "2f0d8bfb3836597ee6f2fd755e2f2e172cb33df1e1e9061af81982a43497f9b2",
|
||||
"size_bytes": 838655
|
||||
},
|
||||
{
|
||||
"file": "form_undetermined_2026-01-01.json",
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"dataset_id": "work_item_master_forest",
|
||||
"effective_date": "2026-01-01",
|
||||
"pum_edition": "2026-01-01",
|
||||
"generated_at": "2026-09-14T21:01:09+09:00",
|
||||
"generated_at": "2026-09-14T22:25:14+09:00",
|
||||
"dataset_version": {
|
||||
"dataset_id": "pum_forest",
|
||||
"effective_date": "2026-01-01",
|
||||
@@ -33149,6 +33149,7 @@
|
||||
"special_glyphs": [],
|
||||
"capacity_formula_here": false,
|
||||
"variant_key": [
|
||||
"구체콘크리트",
|
||||
"버림콘크리트"
|
||||
],
|
||||
"condition_note": [
|
||||
@@ -33212,6 +33213,7 @@
|
||||
}
|
||||
],
|
||||
"variant_keys": [
|
||||
"구체콘크리트",
|
||||
"버림콘크리트"
|
||||
]
|
||||
},
|
||||
|
||||
@@ -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"])
|
||||
|
||||
Reference in New Issue
Block a user