Files
Aislo/resources/tester/test_b09_wood_chipping.py
eomsangdonandClaude Opus 5 0fc64fa704 feat(b09): ㉰ 이동식 임목 파쇄 8-11 일위대가 — 운전경비표에 값이 없던 파쇄기 기계 층을 8-11 [주]⑤·비고로 세움
· 건설 8-4 운전경비표 7205-0125 93.25㎾ 줄은 연료·잡품 칸이 「-」 → 레코드가 없어 기계 층도 일위대가도 조용히 없었음
· 8-11 [주]⑤ 연료 13.5ℓ(경유) · 비고 잡재료 주연료비 16% · [주]② 기계운전자 1인이 유일한 값이라 그대로(브레인 판정)
· B-FP-08-11 ㎥당 = 파쇄기 1/Q(3.5) + 보통인부 2인 ÷ 8시간 ÷ Q · 기계운전자는 기계 층 조종원으로 한 번만
· 파쇄기날(자원 목록 새 칸) — 「자재 단가」 에 넣으면 0.00125개/hr ÷ Q, 아니면 사유 · [주]③ 운반비·④ 우드그랩·⑥ 규격 외 견적은 사유 한 줄
· 영월 호표는 옛 판(8-2-35 Q=6)이라 대조 대상 아님

새 제목 B 51,029원/㎥ · 바뀐 제목 0 · 프로젝트 내역 그대로(파쇄 기본 끔) · 잴 시험 넷 빨강→초록 · 끄기 넷 빨강 · 전체 시험 1711 + 371 통과

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BW6Jdsh18WPtYUR6THZJqn
2026-09-15 01:08:56 +09:00

64 lines
3.0 KiB
Python

"""이동식 임목 파쇄 8-11 — 2026-09-15 브레인 판정(㉰ 둘째).
원문 L4651: 이동식 임목 파쇄기 93.25KW · Q = 3.5 ㎥/hr · 비고 「잡재료 : 주연료비의 16% · 소모품비(파쇄기날) 0.00125개/hr」
[주]① 1일 8시간 ② 1일 기계운전자 1인 · 보통인부 2인 ③ 장비 운반비 별도 ④ 우드그랩 별도 ⑤ 연료 13.5ℓ(디젤)
건설품셈 운전경비표(8-4 L3458) 7205-0125 93.25㎾ 줄은 연료·잡품 칸이 「-」 → 우리 운전경비 레코드가 없어
기계 층이 안 서고 일위대가도 조용히 없었음. 8-11 [주]⑤·비고가 **유일한 값**이라 그대로 씀(판정할 것 없음).
파쇄기날은 규격·단가가 없어 「자재 단가」 칸 + 사유(화약류·치즐과 같은 통로).
"""
from __future__ import annotations
from decimal import Decimal
from B09_Estimation.B09_Estimation_UnitPrice import cached_build
BLADE = "AR-M-249d0a01"
Q = Decimal("3.5")
def _rows(book, code: str) -> list:
own = book.details.get(code) or []
return [
*own,
*(r for d in own if d.ref_code.startswith("D-") for r in book.details[d.ref_code]),
]
def test_파쇄기_기계_층이_8_11_주5_연료와_잡재료_16퍼센트로_섬() -> None:
book = cached_build().book
rows = {r.ref_code: r for r in book.details["X-7205-0125"]}
assert rows["M-FUEL-경유"].quantity == Decimal("13.5"), rows
misc = next(r for r in book.details["X-7205-0125"] if r.percent_of_material is not None)
assert misc.percent_of_material == Decimal(16)
assert any(code.endswith("#시간") for code in rows), rows # 기계운전자 1인(조종원 시간당)
def test_파쇄_일위대가는_기계_1_Q_와_보통인부_2인_8시간() -> None:
build = cached_build()
book = build.book
assert book.titles["B-FP-08-11"].unit == "㎥"
rows = _rows(book, "B-FP-08-11")
machine = next(r for r in rows if r.ref_code == "X-7205-0125")
assert machine.quantity == Decimal(1) / Q and machine.output == Q, machine
labor = next(r for r in rows if r.ref_code == "1002")
assert labor.quantity == Decimal(2) / Decimal(8) / Q, labor
assert not any(r.ref_code.startswith("1048") for r in rows) # 운전자는 기계 층에 — 두 번 안 셈
def test_파쇄기날은_단가가_없으면_사유_있으면_시간당_수량_나누기_Q() -> None:
build = cached_build()
assert "FP-08-11" in build.material_uses.get(BLADE, [])
assert any("파쇄기날" in label for label in build.unattached.get("FP-08-11", []))
priced = cached_build(material_prices=((BLADE, "150000", "견적"),))
blade = next(r for r in _rows(priced.book, "B-FP-08-11") if r.ref_code == BLADE)
assert blade.quantity == Decimal("0.00125") / Q, blade
assert not any("파쇄기날" in label for label in priced.unattached.get("FP-08-11", []))
def test_원문_주의_별도_계상은_사유로() -> None:
from B09_Estimation.B09_Estimation_KnownGaps import known_gap_note
note = known_gap_note("FP-08-11")
assert "운반비" in note and "우드그랩" in note, note