Files
eomsangdonandClaude Opus 5.5 d8834c1d63 feat(792-4): B09 일위대가 대가 블록이 엔진 새 의미를 따름 — 다섯 길 같은 금액 · 가져온 식 SK 내역 = 엑셀
- 새 B09_Estimation_Labor_Rule: 새 의미 로직만 대가 블록 줄 `place`(줄 자리) · `out`(합밖 · 제외 단계) · 덧줄 = 수 하나 × 밑 합 꼴이면 `rows:` % 줄(줄.'이름' · 앞 덧줄 · 번지 · 단계 · 비목 합 · 793-2a 괄호 꼴) · 이름 없는 수 식 덧줄 = 고정 줄 · 블록 `rule` {끝전, 조정, 끝수} · 다른 꼴 = 빈 줄 그대로(틀린 값 대신 빈칸)
- Labor_Source: 품셈 블록에 표지 · 단가산출 블록이 줄을 바꿔도 표지 이어 받음(657 줄)
- Calc_Labor .py · .ts 짝: 줄 금액 `cut`(place) · `out` 줄은 비목 합 · part: 밑에서 뺌 · 블록 비목 합 `settle`(큰나머지 → 끝수 → 조정 → 원 버림 · master_cut.settle 차례) · 옛 블록 = 표지 없음 = 전과 같음
- 산근 글 로직 부르기 줄(중기 세 줄 · 하위 산근) 금액도 줄 자리 규칙(792-3 남은 것)
- test_792_3: 다섯째 길 B09 대가(SC → 굳힌 SK 수량 1 → 내역 단가 · 파이썬 = TS 거울) · 실무 봉화 D00102 · 북부청임도 18 을 793-2 길(임시 층)로 가져온 식 SK → 내역 단가 = 엑셀
- test_712_3 낡은 기대: 표 비율 0.78 → 단위 수 1,601 이상 · 0.76 — 782-1 · 782-2 · 782-3 계수 표 94 가 로직에 붙음(그중 단위 기준 25 · 시공능력 · 적용기준 계수 = 단위 기준 없음) · 712-3 때 2,023 중 1,601 그대로 · 마스터 자료 안 고침

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 18:26:03 +09:00

82 lines
3.1 KiB
Python

"""712-3 지킴 — 표 기준 → 기준배 · 기준단위 읽을 때 파생 · 배 대조 · 정본 안 씀(`master_basis`)."""
from __future__ import annotations
import json
import sys
from decimal import Decimal
from pathlib import Path
ROOT = Path(__file__).resolve().parents[2]
sys.path.insert(0, str(ROOT / "resources/master_data/scripts"))
sys.path.insert(0, str(ROOT))
import check_master as cm # noqa: E402
import master_basis as mbs # noqa: E402
def _p(text):
got = mbs.parse(text)
return None if got is None else (got["배"], got["단위"])
def test_parse_forms():
assert _p("10㎡당") == (Decimal(10), "㎡")
assert _p("인/100본당") == (Decimal(100), "본")
assert _p("ton 당") == _p("톤당") == _p("1t") == (Decimal(1), "ton")
assert _p("1,000본당") == (Decimal(1000), "본")
assert _p("1필지당 1,500㎡") == (Decimal(1), "필지")
assert _p("일당 — 편성 1조 기준") == (Decimal(1), "일")
assert _p("세면기 개당") == (Decimal(1), "개")
assert _p("바닥면적㎡당") == (Decimal(1), "㎡")
for text in (
"인력품",
"정의",
"할증",
"참조",
"Joint당",
"단위: 인",
"구하는점 5점, 주어진점 3점",
):
assert _p(text) is None, text
def test_fill_ratio_and_no_write():
files = cm.load()
before = json.dumps(files, default=str, ensure_ascii=False)
called = [
mbs.basis(t)
for d in files.values()
for t in d.get("표") or []
if (t.get("용도") or {}).get("로직키")
]
unit = sum(1 for b in called if b["갈래"] == "단위")
from_body = sum(1 for b in called if str(b["기준근거"] or "").startswith("원문"))
# 로직이 부르는 표 2,117 중 1,626(76.8 %) — 712-3 때 2,023 중 1,601(79 %) · 782 계수 표 94 중
# 단위 기준 25(시공능력 · 적용기준 계수 = 단위 기준 없음) · 단위 수가 줄면 잡음
assert unit >= 1601 and unit / len(called) >= 0.76
assert from_body >= 280 # 빈 기준 579 중 원문 머리로 채움 285
assert json.dumps(files, default=str, ensure_ascii=False) == before # 읽기만
def test_times_mismatch_list():
"""배 어긋남 = 시스템 관리자 원문 확인 거리 — 늘거나 줄면 PLAN 712-3 목록도 고침."""
found = {line.split(" · ")[0] for line in mbs.check_times(cm.load())}
known = {"GC000482", "GC000483", "GC000484", "GC000485", "GF000081"}
assert found == known | {"GC000522", "GC000524"}
def test_edition():
assert mbs.edition("2026-01-01") == mbs.edition("2026") == "2026"
assert mbs.edition(None) == ""
def test_router_basis_outside_table():
from M01_MasterData import M01_MasterData_Router as router
got = router.get_table("소요량_산림품셈_13장_구조물.json", "QF000443")
assert got["기준파생"]["기준배"] == 10 and got["기준파생"]["기준단위"] == "㎡"
assert "기준배" not in got["table"] and "기준파생" not in got["table"]
listed = router.get_tables(file="소요량_산림품셈_13장_구조물.json", q="QF000443")
assert listed["tables"][0]["기준파생"]["기준배"] == 10