feat(786-1): 별도계상 줄 품목 고르기 없앰 — 후보 고정 줄 하나 · SC 합 밖 고정 줄

- Row.judge: 별도계상 줄은 M01 · 사전 · 장부 후보 안 찾고 고정 줄 하나(품목 「프로젝트에서」 표지) · 갈래 수 그대로
- Make: 별도계상 고정 줄 = 단가 0 · 메모 「별도계상 · 품목은 프로젝트에서」(합 밖)
- Picks.ts: apartPick 표지 셈
- 시험 642_3 · 642_5 · 642_6 Picks 몫을 새 꼴로 고침(옛 단언: 레미콘 자재 목록 별도계상 칸)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-05 07:17:50 +09:00
co-authored by Claude Sonnet 5.5
parent bcc570ff31
commit e23fec8c9c
6 changed files with 80 additions and 12 deletions
+10 -6
View File
@@ -13,7 +13,8 @@
그 밖 = 고정.
후보 찾기 차례 = 장부(`Ledger.recall` · 고른 것 꼴) › M01 표마다(LB · MT · MO · EQ) › M02 층
SK · SC 같은 이름(위 층까지 · 참고).
판정 = 제안 있음(장부 짝 · 후보 하나 · 별도계상 · 하위 호표 · 율) · 2차 필요(단가산출 줄 =
판정 = 제안 있음(장부 짝 · 후보 하나 · 별도계상 = 고정 줄 하나(`품목` 표지) · 하위 호표 · 율) ·
2차 필요(단가산출 줄 =
`Bind` · `Solve` 몫) · 후보 여럿 · 후보 없음(고정 금액 제안).
고른 것 = `{갈래 기초|단가산출|일위대가|인력|재료|유가|기계|율|고정, 키, 이름, 규격, 단위, 단가,
입력값, 출처, 몫, 비목?, 기준?, 별도계상?, 층?, 주인?}`(설계 2-1 · 만들기 = `Make` 몫).
@@ -310,9 +311,13 @@ def _rate_pick(line: dict[str, Any]) -> dict[str, Any]:
return one
# 별도계상 줄 표지 `품목` — 품목은 프로젝트에 복사할 때 정함(요구 645-2)
ITEM_LATER = "프로젝트에서"
def _fixed(line: dict[str, Any], apart: bool = False) -> dict[str, Any]:
price = {k: _plain((line.get("단가") or {}).get(k)) or 0 for k in COSTS}
more = {"별도계상": True} if apart else {}
more = {"별도계상": True, "품목": ITEM_LATER} if apart else {}
return pick(
"고정", None, line.get("이름"), line.get("규격"), line.get("단위"), 단가=price, **more
)
@@ -354,12 +359,13 @@ def judge(
out["번"] = no
qty = {"엑셀": line.get("수량"), "배": 1, "갈래": "같음"}
picks: list[dict[str, Any]] = []
if why == "별도계상": # 모아서 한 번에 셈 — 품목 후보 · 장부 짝 안 찾음(고정 줄 하나 · 786-1)
return {**out, "후보": [_fixed(line, True)], "판정": "제안 있음", "수량": qty}
found = None
if folder is not None:
found = ledger.recall(line, folder, book, doc=doc)
if found and found.get("갈래") == "짝":
picks = _from_ledger(found)
apart = why == "별도계상"
for k in kinds if not picks else ():
if k == "일위대가" and no is not None:
picks.append(pick("일위대가", f"제{no}호표", line.get("이름"), line.get("규격"),
@@ -374,8 +380,6 @@ def judge(
picks += m01_picks(k, line)
if not found:
picks += [p for p in (docs or {}).get(mm.plain(line.get("이름")), []) if p["갈래"] in kinds]
if apart:
picks = [{**p, "별도계상": True} for p in picks] or [_fixed(line, True)]
picks = list({(p["갈래"], p.get("키"), p.get("층")): p for p in picks}.values())
if found and found.get("갈래") in ("짝", "우리에 없음", "안 씀"):
out["장부"] = {k: found.get(k) for k in ("갈래", "층", "제안", "규격다름")}
@@ -385,7 +389,7 @@ def judge(
found and found.get("갈래") in ("짝", "안 씀", "우리에 없음") and not found.get("규격다름")
):
verdict = "제안 있음"
elif apart or kinds[0] in ("일위대가", "율") or len(picks) == 1:
elif kinds[0] in ("일위대가", "율") or len(picks) == 1:
verdict = "제안 있음"
elif picks:
verdict = "후보 여럿"