- 계수_건설품셈_01장_적용기준.json 덧(CC000495~527): 규칙 · 계수만 절(1-2-2 · 1-2-3 · 1-2-4 · 1-2-5 · 1-2-6 · 1-2-8 · 1-3-2 · 1-4-1 · 1-4-2 · 1-5-1~10)마다 「규칙 글」 표(원문 글 그대로) + 수 표(단위 · 소수 표준 · 금액 단위 · 체적 변화율 L · C · 체적환산계수 f · 파쇄된 돌 10∼40% · 잡재료 2∼5% · 작업반장 · 공구손료 3% · 시공단위 품 소수자리 · 품 산정 식 · 예시 · 건설폐기물 발생량 · 공사용수) · 1-2-9 소규모 적용시공량 · 다수 규격 예시 = 계수로만 - 표 칸 「성격」 — 기존 1-3 · 1-4 표 33 + 1-2-9 둘(같은 성격 묶음 · 1-2-9 ↔ 1-4-6 작업시간 제한 한 성격) · 기존 표의 다른 글자 그대로 - 로직_건설품셈_01장_적용기준.json 덧: GC001192 건설폐기물 발생량(1-5-4 · 면적 × TON/㎡ × 폐콘크리트 증가율) · GC001193 공사용수(1-5-6 · 작업량 × 단위용수 × 잡용수율) · 원문 「-」 칸 = 줄 없음(멈춤) - 1-2-9 소규모 · 1-4 품의 할증 로직 = 만들지 않음(PLAN 783-1) - 빌더 덧 build_로직_건설품셈_01장_적용기준.py 나머지(+ _적용기준_나머지_표 · _적용기준_나머지_로직) · 키 = master_keys.issue(adopt 는 로직을 받지 않음) - check_master 「목차」(check_master_toc.py) — 공통 1장 원문 절 목록 ↔ 마스터 전수 · 통째 빠진 절 · 로직 없는 품·표·식 절 · 1-2-9 · 1-4-2 = 783-1 로 미룸 표지 - 지킴 시험 test_782_2_common_ch1.py · test_782_1_carry_127.py 로직 줄 목록 = 앞 셋만 봄(같은 파일에 1-5 로직이 붙어 낡음) - check_master 전후 같음(+ 목차 0) · 기존 로직 1513 셈 값 전후 같음 · 계산전부 1515 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
101 lines
3.7 KiB
Python
101 lines
3.7 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""782-1 건설 공통 1-2-7 운반 기초 — 계수 표 여덟 · 로직 셋 · 실무 소운반 재현 넷 · check_master."""
|
||
|
||
import sys
|
||
from decimal import Decimal
|
||
from pathlib import Path
|
||
|
||
import pytest
|
||
|
||
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "master_data/scripts"))
|
||
|
||
import check_master as cm # noqa: E402
|
||
import master_formula as mf # noqa: E402
|
||
|
||
COEF = "계수_건설품셈_01장_적용기준.json"
|
||
LOGIC = "로직_건설품셈_01장_적용기준.json"
|
||
JIGE = "GC001140"
|
||
BASE = {
|
||
"재료종별": "암석",
|
||
"재료형상": "화강암",
|
||
"회당운반량": 0,
|
||
"실작업시간": 0,
|
||
"경사각도": 0,
|
||
"재료갈래": "석재류",
|
||
"운반로": "불량",
|
||
"운반회수": 0,
|
||
}
|
||
|
||
|
||
@pytest.fixture(scope="module")
|
||
def whole():
|
||
return cm.master()
|
||
|
||
|
||
def qty(whole, ref, **given) -> Decimal:
|
||
line = mf.run(whole, ref, {**BASE, **given} if ref == JIGE else given)["줄"][0]
|
||
return line["수량"].quantize(Decimal("0.000001"))
|
||
|
||
|
||
@pytest.mark.parametrize(
|
||
"given, want",
|
||
[
|
||
# 북부청 임도 단산10 야면석소운반 — 엑셀이 1일 운반횟수 42 를 값으로 넣음
|
||
({"운반무게": 575, "운반거리": 6, "경사각도": 35, "운반회수": 42}, "0.547619"),
|
||
# 동부청 영월 D01466 야면석소운반 — L 20 · V 2,000 · t 2
|
||
({"운반무게": 575, "운반거리": 20}, "0.163556"),
|
||
# 동부청 영월 D00450 콘크리트소운반 — 단위중량 표 콘크리트 2,300㎏
|
||
(
|
||
{"운반무게": 0, "재료종별": "콘크리트", "재료형상": "해당 없음", "운반거리": 20},
|
||
"0.654222",
|
||
),
|
||
# 북부청 사방 단산17 떼소운반 — 33㎏ · 운반회수 100
|
||
({"운반무게": 33, "운반거리": 20, "운반회수": 100}, "0.013200"),
|
||
],
|
||
)
|
||
def test_재현(whole, given, want):
|
||
assert qty(whole, JIGE, **given) == Decimal(want)
|
||
|
||
|
||
def test_북부청_금액(whole):
|
||
got = mf.run(whole, JIGE, {**BASE, "운반무게": 575, "운반거리": 6, "운반회수": 42})
|
||
line = got["줄"][0]
|
||
assert line["이름"] == "보통인부"
|
||
if line["단가"] == 172068: # 2026 상반기 건설노임 — 엑셀 94,227.7
|
||
assert round(line["금액"], 1) == Decimal("94227.7")
|
||
|
||
|
||
def test_경사_환산_식(whole):
|
||
# α 35° = 8 → 환산 48m · V 2,000 · t 2 · T 450 → N 92.21 → 575/25/N
|
||
got = mf.run(whole, JIGE, {**BASE, "운반무게": 575, "운반거리": 6, "경사각도": 35})
|
||
assert got["중간"]["환산계수"] == 8
|
||
assert got["중간"]["작업시간"] == 450
|
||
assert got["줄"][0]["수량"].quantize(Decimal("0.000001")) == Decimal("0.249422")
|
||
|
||
|
||
def test_기계설비_벽돌(whole):
|
||
given = {
|
||
"운반무게": 100,
|
||
"재료종별": "암석",
|
||
"재료형상": "화강암",
|
||
"회당운반량": 0,
|
||
"실작업시간": 0,
|
||
"운반거리": Decimal("0.1"),
|
||
"경사각도": 0,
|
||
"도로상태": "보통",
|
||
}
|
||
# 4인 ÷ 450분 × (60 × 2 × 0.1 / 1.5 + 2)
|
||
assert qty(whole, "GC001141", **given) == Decimal("0.088889")
|
||
assert qty(whole, "GC001142", 운반="인력", 층수=3) == Decimal("0.74")
|
||
assert qty(whole, "GC001142", 운반="리프트", 층수=5) == Decimal("0.31")
|
||
|
||
|
||
def test_check_master():
|
||
files, whole = cm.load([COEF, LOGIC]), cm.master()
|
||
found = [x for name, data in files.items() for x in cm.check_form(name, data)]
|
||
found += cm.check_body(files) + cm.check_logics(files, whole)
|
||
assert found == []
|
||
keys = {t["키"] for t in files[COEF]["표"] if t["원문번호"] == "1-2-7"}
|
||
assert keys == {f"CC000{n}" for n in range(341, 349)}
|
||
assert [r["키"] for r in files[LOGIC]["줄"]][:3] == ["GC001140", "GC001141", "GC001142"]
|