- 809_1 이름 = 진짜 흠 + 낡은 기대 — 읽기기(812-1)가 지은 율 줄 이름 「율」이 엑셀 글 머리로 안 바뀜 → `Import_Shape._MADE` 에 율 더함 · 합계 = 차림 글줄 · 기계 = 한 줄(이름 · 규격 칸) 은 낡은 기대 고침 · 금액 15,935 · 336 · 723 · 16,994 그대로 - 812_9 별칭 = 낡은 기대 — 815-2 가 아스팔트페이버 별칭을 마스터 기계 줄 칸으로 옮겨 「넣기 전 못 찾음」 이 안 맞음 · 시험은 마스터 칸으로 봄 · 부르는 곳 없는 `M02_Machine_Find.learn`(옛 장부 쓰기) · `by_code` · `same_kind`(걷은 연결 찾기 몫) 지움 - 804_2 hourly = 낡은 기대 — 814-1 이 GC000268 목록을 117 → 209 로 늘려 겹친 116 대 고름이 GC000269 로 뒤집힘(116 대 모두 원 단위 같음) · 같은 로직 줄만 대던 시험 → 같은 갈래 식(부착 · 손료만 · 조종원) 줄 모두 댐 - 진짜 흠(브레인 갈래 가) — GC000272 「조종원 없는 기종」 목록에 기계표 조종원 1 인 9 대가 겹쳐 목록 길이 차례로 고름 → `logic_of` = 기계표 조종원 > 0 이면 조종원 호표 든 식 먼저 · 불러오기 `hourly_link` 도 같은 길 · 바뀐 4 대 = 진동롤러(핸드가이드식) 0.7ton 6,557 → 41,969 · 래머 80kg 1,959 → 23,708 · 플레이트 콤팩터 1.5ton 2,855 → 24,604 · 발전기 100kW 45,535 → 67,284(M01 문서 금액 그대로) · 시험에 9 대 굳힘 - 778_5 기계 표 = 진짜 흠 — 812-9 찾기가 호표 기계 글 「운 반 : 덤프트럭(4.5Ton)」 · 「…[hr] : 90%」 · 「(90%)」 머리 꼬리를 안 뗌 → `Hopyo_Fixed._eqs` 쌍점 조각 · 율 꼬리 뗌 · 이어짐 187 · 고를 것 1 · 못 이음 2(조합 한 줄 · 괄호 깨짐) · 모두 이음 블록 161 - 721 단추 자리 = 낡은 기대(808-1 [단가 갱신][재생성] tools 더함) - 815-1 보고 요약에 「합친 뒤」 열 — 기계 이음 95.7 % · 우리 값 원파일 1,891 · 0 원 줄 블록 147 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
109 lines
6.2 KiB
Python
109 lines
6.2 KiB
Python
"""778-5 줄 잇기 한 벌 · 블록 = 줄 판정 모음 · 단위 SK(D-2 · D-3 · 요구 622 · 623 · 624).
|
||
|
||
- 줄 잇기(`M02_Hopyo_Units`) — 작업반장 = 건설업 · 숫자 규격 치수 차례 · 구분자 무관 · 글자 규격 = 고를 것 ·
|
||
손료율 = 자재 줄 방법 · 우리에 없는 율 항목(설치비 · 제경비) = 율 줄 · 여덟 파일 묶음별 수 굳힘
|
||
- 단위 SK(`M02_Hopyo_SkUnit` · `M02_Hopyo_Sangeun`) — 확인 안 한 블록 안 만듦 · 확인 블록 = 바탕 없는 SK +
|
||
근거 꼬리표 · 고를 줄 남으면 못만듦 · 고르면 만듦 · 다시 올려도 같은 SK 재사용 · 일위대가 = 확인 전 못 이음
|
||
층 = 임시 폴더 · M01 · 마스터 읽기만.
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import json
|
||
|
||
import pytest
|
||
|
||
from M02_MasterTemplete import M02_Hopyo_Material as hmat
|
||
from M02_MasterTemplete import M02_Hopyo_Sangeun as sangeun
|
||
from M02_MasterTemplete import M02_Hopyo_SkUnit as skunit
|
||
from M02_MasterTemplete import M02_Hopyo_Units as units
|
||
from M02_MasterTemplete import M02_Labor_Doc as labor
|
||
from M02_MasterTemplete import M02_Sangeun_Calc as calc
|
||
from M02_MasterTemplete import M02_Sangeun_Doc as sd
|
||
from resources.tester import helper_m02_hopyo_golden as golden
|
||
from resources.tester.test_m02_hopyo_excel import URL, _post, client, master_hash # noqa: F401
|
||
|
||
# 여덟 파일 불리는 블록 줄 연결 표(778-5 D-2 굳힘 · 바뀌면 까닭 커밋 글)
|
||
TABLE = {
|
||
"L": {"이어짐": 366, "고를 것": 0, "못 이음": 0},
|
||
"X": {"이어짐": 187, "고를 것": 1, "못 이음": 2}, # 812-9 찾기 · 못 이음 = 조합 · 괄호 깨짐
|
||
"M": {"이어짐": 71, "고를 것": 55, "못 이음": 4},
|
||
"R": {"이어짐": 150, "고를 것": 2, "못 이음": 0},
|
||
"S": {"이어짐": 3, "고를 것": 0, "못 이음": 0},
|
||
"E": {"이어짐": 1, "고를 것": 0, "못 이음": 0},
|
||
}
|
||
ALL_LINKED = 161 # 815-3 호표 기계 글 쌍점 · 율 꼬리 뗌
|
||
|
||
|
||
@pytest.fixture(scope="module")
|
||
def us():
|
||
return units.Units()
|
||
|
||
|
||
def test_작업반장_건설업_기본(us):
|
||
got = us.line({"묶음": "L", "이름": "작업반장", "직종": "작업반장", "품": 0.1})
|
||
assert got["상태"] == units.LINKED and got["단위"] == {"노임": "LB000001"} # 건설업
|
||
assert got["꼬리표"] == ["기본 — 건설업 작업반장"] and got["후보"][0]["키"] == "LB000261"
|
||
one = us.line({"묶음": "L", "이름": "보통인부", "직종": "보통인부", "품": 0.5})
|
||
assert one["단위"] == {"노임": "LB000002"} and not one["꼬리표"]
|
||
|
||
|
||
def test_숫자_규격_차례_구분자_무관_글자_규격_후보(us):
|
||
assert hmat.dims("600×1200") == hmat.dims("1200x600 mm") == hmat.dims("1200*600㎜")
|
||
assert hmat.dims("1종2류(철재)") is None and hmat.lettered("1종2류(철재)")
|
||
assert not hmat.lettered("600*1200mm") and not hmat.lettered("#20, 0.9mm")
|
||
for spec in ("600×1200", "1200x600", "1200 X 600mm"):
|
||
got = us.line({"묶음": "M", "이름": "유로폼패널", "규격": spec, "단위": "매", "품": 1})
|
||
assert got["상태"] == units.LINKED and got["단위"] == {"자재": "MT000467"}, spec
|
||
named = us.line({"묶음": "M", "이름": "유로폼(패널)(600×1200)", "단위": None, "품": 1})
|
||
assert named["단위"] == {"자재": "MT000467"} # 「유로폼(패널)」 = 유로폼패널 · 단위 없는 EST 줄
|
||
paint = {"묶음": "M", "이름": "광명단조합페인트", "규격": "1종2류(철재)", "단위": "L", "품": 1}
|
||
got = us.line(paint)
|
||
assert got["상태"] == units.PICK and got["글"] == units.LETTERS and got["후보"]
|
||
|
||
|
||
def test_손료율_자재_줄_율_항목_율_줄(us):
|
||
wear = us.line({"묶음": "M", "이름": "유로폼패널", "규격": "600×1200", "품": 0.267,
|
||
"손료율": 0.267}) # fmt: skip
|
||
assert wear["방법"] == units.WEAR and wear["상태"] == units.LINKED
|
||
setup = {"묶음": "R", "이름": "설치비(재료비의 5%)", "품": 0.05, "기준꼴": "자재"}
|
||
assert us.line(setup)["단위"] == {"기준": "재료", "비목": "재료비"} # 우리에 없는 율 항목
|
||
rest = {"묶음": "R", "이름": "제경비(노무비의 60%)", "품": 0.6, "기준꼴": "노무비"}
|
||
assert us.line(rest)["단위"] == {"기준": "노무비", "비목": "경비"}
|
||
lost = us.line({"묶음": "R", "이름": "기구손료(노무비의 9%)", "기준": "노무비", "품": 0.09})
|
||
assert lost["상태"] == units.PICK and lost["후보"] == [{"기준": "노무비", "비목": "경비"}]
|
||
# 단위 SK 셈 — 설치비 = 재료 줄 × 5 % · 제경비 = 노무비 × 60 %
|
||
block = {"항목": [
|
||
{"묶음": "L", "이름": "보통인부", "직종": "보통인부", "품": 0.5, "행": 1},
|
||
{"묶음": "M", "이름": "유로폼패널", "규격": "600×1200", "단위": "매", "품": 2, "행": 2},
|
||
{**setup, "행": 3}, {**rest, "행": 4},
|
||
]} # fmt: skip
|
||
got = skunit.judge(block, us, lambda sub: None, None, "㎡")
|
||
assert got["판정"] == skunit.GOOD and [r["상태"] for r in got["줄"]] == [units.LINKED] * 4
|
||
labor_, mat = (got["줄"][0]["우리금액"], got["줄"][1]["우리금액"])
|
||
assert got["줄"][2]["우리금액"] == pytest.approx(mat * 0.05, abs=0.1)
|
||
assert got["줄"][3]["우리금액"] == pytest.approx(labor_ * 0.6, abs=0.1)
|
||
doc = {"키": "SK-000001", "이름": "t", "단위": "㎡", "바탕": None, "더한줄": got["더한줄"]}
|
||
whole = us.whole
|
||
ran = labor._json(calc.run(sd.clean(doc, None, whole), whole))
|
||
assert ran["1단위"]["계"] == pytest.approx(got["우리금액"])
|
||
|
||
|
||
def test_여덟_파일_줄_연결_표(us):
|
||
rows, full, blocks = [], 0, 0
|
||
for tag in golden.FILES:
|
||
hp = golden.read(tag)
|
||
_, first = sangeun.calls(hp)
|
||
for b in hp["단산"]:
|
||
if int(b["번"]) not in first:
|
||
continue
|
||
got = [(o["묶음"], us.line(o)["상태"]) for o in b.get("항목") or [] if not o.get("밖")]
|
||
rows += got
|
||
blocks += 1
|
||
full += all(s == units.LINKED for _, s in got)
|
||
assert units.summary(rows) == TABLE and (full, blocks) == (ALL_LINKED, 206)
|
||
|
||
|
||
def _sks(folder) -> dict[str, dict]:
|
||
return {p.stem: json.loads(p.read_bytes()) for p in (folder / "sangeun").glob("SK-*.json")}
|