feat(axis): 이중계상 경계를 갈 곳 칸으로 판정 — 어기면 내역서가 멈춤
① 구조물 터파기·되메우기는 토공집계로만 — 토공·사토 공제·참고로 가는 성분을 구조물 줄·묶음 조각·타설·기초잡석이 또 집으면 오류. ② 시멘트·모래·자갈이 자재총괄에 뜨면 오류. ③ 원단위표가 할증을 붙였거나, 자재 합계가 순수량 × (1+율) 과 다르거나, 할증 포함 재료량을 준 공종에 자재가 일위대가 재료비로 붙으면 오류. 판정은 B08 인계(double_count_violations), 멈춤은 B09 build_bill 한 자리. 배정 프로젝트 실측 어긴 자리 0건. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BW6Jdsh18WPtYUR6THZJqn
This commit is contained in:
@@ -181,6 +181,15 @@ def _assemble(
|
||||
"reason": "",
|
||||
}
|
||||
source = sheet_rows.get(row.get("from_row")) if "from_row" in row else None
|
||||
# 이중계상 경계 ①(명세 6장) — 토공집계·사토 공제·참고로 가는 줄을 일위대가에 또 넣지 않음.
|
||||
from B08_Quantity.B08_Quantity_Engine_Handoff_Boundaries import NOT_BILLED_BY_WORK_ITEM
|
||||
|
||||
owner = NOT_BILLED_BY_WORK_ITEM.get(str((source or {}).get("destination") or ""))
|
||||
if owner:
|
||||
out["reason"] = f"이중계상 — 원단위 줄 {row['from_row']} 은 {owner}로 가는 줄"
|
||||
blocked += 1
|
||||
rows.append(out)
|
||||
continue
|
||||
if source is not None and (source.get("skipped") or source.get("error")):
|
||||
# 원단위 줄이 안 선 장이면 일위대가 줄도 안 섬 — 막힘이 아님(버림 「안 넣음」 등).
|
||||
out.update(skipped=bool(source.get("skipped")), reason=source.get("reason") or "")
|
||||
|
||||
Reference in New Issue
Block a user