Files
Aislo/resources/tester/test_b09_judged_unread_rows.py
eomsangdonandClaude Opus 5 9deaf479d0 feat(b09): 판정표가 안 읽은 줄을 자동으로 「못 붙은 줄」 목록에 — 표를 넣을 때마다 손 사유를 안 달아도 안 샘
· 판정표 공통 한 곳(_unread_rows) — 읽힌 줄 밖의 줄을 올림
· 넘치지 않게: 읽힌 줄 · 이미 못 맞춤 이름 · 다른 갈래가 쓴 기계 줄 · 자원 머리(첫 줄 머리 모양 · 횟수별) · 빈 줄은 뺌 · 분류 딱지 줄(자재·인력·기계)은 이름 칸으로 · 비고는 글 앞머리와 함께
· 손 사유와 안 겹치게: 공종 사유 한 줄에 이미 적힌 이름은 안 올림 · 오늘 손으로 단 날개벽·면벽·맨홀 줄 목록 사유는 걷고 [주] 30% 할증만 남김
· 새던 셋이 함께 닫힘 — 12-15 거푸집·철근·뚜껑·설치비 · 12-04 비고(수직고 7m 할증) · 12-34-1 레미콘 별도계상

판정표 9표 늘어난 줄: 9-19-1 0 · 12-04 +1 · 12-15 +4 · 12-12 +8 · 12-13 +6 · 12-16 +7 · 12-34-1 +1 · 제목 금액·막힘·일부만 그대로 · 잴 시험 넷 빨강→초록 · 끄기 넷 빨강 · 전체 시험 1702 + 362 통과

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

51 lines
2.6 KiB
Python

"""판정표가 안 읽은 줄 — 자동으로 「못 붙은 줄」 목록에 (2026-09-14 브레인 · ㉰ 앞 뿌리 고침).
판정표는 적어 둔 줄만 읽음 → 나머지 줄(거푸집·철근·뚜껑·설치비·비고 …)이 사유 없이 사라지고 있었음
(12-15 · 12-04 비고 · 12-34-1 레미콘). 표를 넣을 때마다 손으로 사유를 달면 다음 표가 또 샘.
⇒ 판정표 공통 한 곳에서 「읽힌 줄 밖의 줄」 을 올림.
㉠ 넘치지 않게 — 자원 머리(첫 줄 머리 모양) · 빈 줄 · 다짐기처럼 다른 줄이 쓴 줄은 뺌
㉡ 손 사유와 안 겹치게 — 공종 사유 한 줄(`known_gap_note`)이 이미 적은 이름은 안 올림
"""
from __future__ import annotations
from B09_Estimation.B09_Estimation_KnownGaps import known_gap_note
from B09_Estimation.B09_Estimation_UnitPrice import cached_build
def _left(build, code: str) -> str:
return " / ".join(build.unattached.get(code, []))
def test_집수정_표의_거푸집_철근_뚜껑_설치비가_목록에_뜸() -> None:
left = _left(cached_build(), "FP-12-15")
for name in ("거 푸 집", "철근", "집수정 뚜껑", "설치비"):
assert name in left, (name, left)
assert "봉상후렉시블" not in left, left # 구체 갈래가 쓴 다짐기 줄은 안 올림(㉠)
def test_합판거푸집_비고는_글과_함께_뜨고_손_사유에_있는_사용고재는_안_겹침() -> None:
left = _left(cached_build(), "FP-12-04")
assert "비고" in left and "7m" in left, left
assert "사용고재" in known_gap_note("FP-12-04") and "사용고재" not in left, left # ㉡
assert "횟수별" not in left, left # 머리 줄(㉠)
def test_토사면_고르기_자원_머리_줄은_안_뜸() -> None:
left = _left(cached_build(), "FP-09-19-01")
assert "보통인부 (인)" not in left and "공기압축기 (시간)" not in left, left
def test_12_34_1_레미콘_별도계상_줄은_이름으로_뜸() -> None:
left = _left(cached_build(), "FP-12-34-01")
assert "콘크리트(레미콘)" in left and "자재" not in left.split(" / "), left
def test_날개벽_면벽_맨홀은_자동_목록이_맡고_손_사유는_줄_목록을_안_되풀이() -> None:
build = cached_build()
assert "원형거푸집" in _left(build, "FP-12-16") and "기초잡석" in _left(build, "FP-12-12")
assert "기초잡석" in _left(build, "FP-12-13")
for code in ("FP-12-12", "FP-12-13", "FP-12-16"):
assert "거푸집" not in known_gap_note(code), code
assert "30%" in known_gap_note("FP-12-12") # 줄이 아닌 [주] 는 손 사유로 남음