- 정본 로직(08장 아홉 · 산림 10장 4륜 덤프) 시간환산 중간 식 = 세 줄 분자 ÷ 분모 곱(713-4 전 꼴) · 수식 문서 = 빌더 변환으로 다시 지음(변환 대조 1,520 같음 · 채택 1 원 셋 = 같은 까닭 714-3) - 체인톱 GF000337 은 그대로(시간환산 = 하루 연료 · 손료 → 시간 · 조종원 없음) - 짝: 기계 양식 시간환산(M01 lists = 세 줄 곱) · master_machine_coef ↔ common_util_machine_coef 기본값 5/24 · 기계 덮음 새 조종원 줄 꼴(master_doc_cover ↔ common_util_formula_doc_cover) · 기호 이름 상여분자 · 상여분모 · 휴지분자 · 휴지분모 - 전후: 조종원 기계 295 대 노무비만 ×5/3 · 조종원 없는 기계 불변 · 로직 1,520 중 기계 부르는 431 만 오름 - B09 는 안 고침(계수표 세 줄을 스스로 곱함 · 두 번 곱 0) 낡은 시험 고침: 713-4 지킴을 세 계수 꼴로 · masterdata_check · 796-1 · 821-2 · 821-4 · 822-2 · 836-1 · 839-1 기대값 = 조종원 5/24 · 802-2 채택 차이 셋 · 821-3 줄 쌓기 내 기계 = 836-2 뒤 개인 층 자동 따라옴(옛 단가새값 · 단가갱신 기대 걷음) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
81 lines
2.7 KiB
Python
81 lines
2.7 KiB
Python
"""713-4 지킴 — 정본 로직 원문 대조 정리(내역 15) 뒤 꼴.
|
||
|
||
조종원 = 하루 노임 × 1/8 × 16/12 × 25/20(840-5 · 요구 864 경쟁사와 같게 — 713-4 의 1/8 만 꼴을 되돌림) ·
|
||
지운 키(쪼갠 로직 · 쪽 표 · 터파기 작업량)를
|
||
쓰는 곳 0 · 방제 8-3 열 여덟 모두 로직 · 플랜트 13-1-1 표 하나.
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import json
|
||
import re
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
ROOT = Path(__file__).resolve().parents[2]
|
||
sys.path.insert(0, str(ROOT / "resources/master_data/scripts"))
|
||
|
||
import check_master as cm # noqa: E402
|
||
|
||
GONE = [
|
||
*("GF000100", "GF000102", "GF000104", "GF000106", "GF000108", "GF000110"),
|
||
*("GC000872", "GC000873", "GC000874", "GC000875", "GF000216", "GF000217"),
|
||
*("QC001609", "QC001610", "QC001611", "QC001612"),
|
||
]
|
||
MACHINE = (
|
||
"GC000267",
|
||
"GC000268",
|
||
"GC000269",
|
||
"GC000270",
|
||
"GC000271",
|
||
"GC000275",
|
||
"GC000276",
|
||
"GF000145",
|
||
)
|
||
|
||
|
||
def _rows(files):
|
||
return {
|
||
str(r["키"]): r for d in files.values() for r in (d.get("줄") or []) + (d.get("표") or [])
|
||
}
|
||
|
||
|
||
def _bare(v):
|
||
"""비고 글(옛 키를 적어 둔 내력)은 뺌 — 식 · 요소 · 용도만 봄."""
|
||
if isinstance(v, dict):
|
||
return {k: _bare(x) for k, x in v.items() if k != "비고"}
|
||
if isinstance(v, list):
|
||
return [_bare(x) for x in v]
|
||
return v
|
||
|
||
|
||
def test_지운_키는_어디에도_없음() -> None:
|
||
pattern = re.compile("|".join(GONE))
|
||
for name, data in cm.load().items(): # 대장(`_키대장.json`)은 준 키를 지님(키 불변) · 안 읽음
|
||
assert not pattern.search(json.dumps(_bare(data), ensure_ascii=False, default=str)), name
|
||
for path in (ROOT / "resources/master_template").rglob("*.json"):
|
||
assert not pattern.search(path.read_text(encoding="utf-8", errors="ignore")), path.name
|
||
|
||
|
||
def test_조종원_시간환산_세_계수() -> None:
|
||
rows = _rows(cm.load())
|
||
for key in MACHINE:
|
||
text = str(rows[key]["중간"])
|
||
assert "'시간환산'" in text and "상여계수" in text and "휴지계수" in text, key
|
||
|
||
|
||
def test_방제_열_여덟_플랜트_한_표() -> None:
|
||
files = cm.load()
|
||
rows = _rows(files)
|
||
assert len(rows["QF000229"]["용도"]["로직키"]) == 8 # 8-3 원문 열 여덟
|
||
pipe = rows["QC001608"]["줄"]
|
||
assert {r["구분"] for r in pipe} == {
|
||
"배관용 탄소강관 KSD3507",
|
||
"압력배관용 탄소강관 KSD3562 SCH#40",
|
||
}
|
||
whole = cm.mf.Master(files)
|
||
passed, stuck, skipped = cm.calc_all(files, whole)
|
||
assert not stuck and passed + len(skipped) == sum(
|
||
1 for d in files.values() if d.get("그룹") == "로직" for _ in d["줄"]
|
||
)
|