fix(m02): 일위대가 별도계상 자재 셈에서 뺌 · 원문 같은 책 절 모두 · 단위 까닭 시험(222-1)

- 로직 자재 별도계상(빈 칸 = 기본) = 기준에서 빼고 일위대가 상세 줄에서 지움 · 자재목록엔 남김
- 사용자 자재 별도계상 = 합에서 뺌(파이썬 · TS settle 짝 · 거울 시험)
- 사전조합 안 줄 · 프로젝트 사본 셈도 같은 길
- 별도계상 바꾸면 다시 셈(로직 자재 = 서버 · 사용자 자재 = 짝 셈)
- 원문 출처 = 로직 출처 + 호표 · 입력 출처 같은 책 절(산림품셈 12-1-2 · 12-1-3)
- 기존 시험 셋 = 직접계산 표시 · 대조용 apart 끔

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F3mdb91125mPoC6tpsQx4P
This commit is contained in:
2026-10-10 16:39:00 +09:00
co-authored by Claude Opus 5.5
parent 9085a51056
commit 9a850212d5
9 changed files with 230 additions and 14 deletions
+23 -1
View File
@@ -8,6 +8,7 @@
from __future__ import annotations
import re
from decimal import Decimal
from typing import Any
@@ -16,6 +17,7 @@ from M01_MasterData import M01_MasterData_Store_Combo as combo_store
_SPEC = ("이름", "설명", "단위", "고르기", "범위")
_LAYERED = "골쌓기 기준" # 85-2 — 표 주문에 이 글이 있으면 켜쌓기율 대상 로직
_NUMBER = re.compile(r"(?<![\d-])\d+(?:-\d+)+(?![\d-])") # 품셈 절 번호(「12-1-3」)
def _num(value: Any) -> Any:
@@ -63,6 +65,26 @@ def _labels(whole: Any, spec: dict) -> dict[str, str]:
return out
def sources(logic: dict) -> Any:
"""원문 출처(222-1) — 로직 `출처` + 호표 · 입력 · 중간 · 덧줄 `출처` 가운데 같은 책(번호 앞 글이
같음)의 절 번호를 덧붙임(「산림품셈 12-1-2 · 12-1-3」 · 원문 패널이 절마다 찾음 · M01
`make.source`) · 다른 책 절은 안 붙임 · 번호 없는 출처는 그대로."""
main = str(logic.get("출처") or "")
head = _NUMBER.search(main)
if not head:
return logic.get("출처")
book, seen = main[: head.start()], set(_NUMBER.findall(main))
extra = []
for part in ("호표", "입력", "중간", "덧줄"):
for row in logic.get(part) or []:
src = str(row.get("출처") or "") if isinstance(row, dict) else ""
hit = _NUMBER.search(src)
if hit and src[: hit.start()] == book and hit.group() not in seen:
seen.add(hit.group())
extra.append(hit.group())
return " · ".join([main, *extra])
def _listed(logics: list[dict]) -> list[dict[str, Any]]:
"""로직 줄마다 `{로직, 이름, 결과단위, 출처, 켜쌓기, 입력: [{이름, 설명, 단위, 고르기?, 고르기이름?, 범위?, 자동값}]}`."""
whole = m01.loaded()[1]
@@ -84,7 +106,7 @@ def _listed(logics: list[dict]) -> list[dict[str, Any]]:
"로직": logic.get("키"),
"이름": logic.get("이름"),
"결과단위": logic.get("결과단위"),
"출처": logic.get("출처"),
"출처": sources(logic),
"켜쌓기": logic.get("키") in layers,
"입력": specs,
}