- 새 `Labor_RowSk.ts` = 줄 → 이름 없는 SK 문서(lineDoc · 바탕 줄 정체) → 717-2b `mountSangeunDetail` 그대로 얹음 ·
take = 패치 {덮개, 뺀줄, 더한줄}(M02 변경 항목 · M01 안 바뀜) + 옵션(손댄 값만 · 자동값 안 남김)
- `Labor_RowModal.ts` = 717-3 두 보기 갈음 · [적용] 뒤 닫힘 · [단가산출로도 저장] = 개인 층 새 SK(from-line)
- `Sangeun_Detail.ts` handle 에 getValues 한 줄(브레인 허락 · 724 공용 부품이 살림)
- `Labor_Table.ts` = 우클릭 메뉴 두 그림 뒤 엶(칸 초점 밀림에 닫히던 것) · 원문 패널 처음 접힘(표 넓게) · 머리 단추 묶음
- `Hopyo_Relink._total` = 엑셀 수량(본뜬.실무수량)으로 — 705-2 다시 잇기 전 · 후 금액 되살림(723-1 번짐)
- 새 지킴 시험 test_723_labor_table(저장 수량 걷음 · 이은 알약 · 안 줄 알약 · 화면 이음)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
101 lines
5.0 KiB
Python
101 lines
5.0 KiB
Python
"""PLAN 723 — M02 일위대가(사전조합) 수량 = 저장 안 함 · 일위대가표만 · 줄 모달(내역 16 · 17).
|
|
|
|
723-1 서버 — 저장 때 안 줄 · 자재 수량 null(비율 줄 율만) · 펼침 = 쓰는 쪽 알약 값 · 안 이으면 「수량 없음」 ·
|
|
구조물 조합 알약에 안 줄 알약 · 불러오기 엑셀 수량 = `본뜬.실무수량`(셈 안 씀).
|
|
723-2 · 723-3 화면 — 서고 상세 = `Labor_Table`(수량 칸 휘발 임시 입력 · 우클릭) · 줄 모달 = 717-2b 상세 줄 모드.
|
|
"""
|
|
|
|
import os
|
|
|
|
import pytest
|
|
|
|
from M01_MasterData import M01_MasterData_Store as m01
|
|
from M02_MasterTemplete import M02_Labor_Doc as labor
|
|
from M02_MasterTemplete import M02_Labor_Ref as refs
|
|
from M02_MasterTemplete import M02_MasterTemplete_Store as store
|
|
from resources.tester.test_m02_labor_ref import world # noqa: F401 — 임시 층 fixture
|
|
|
|
SRC = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "..", "M02_MasterTemplete")
|
|
SYS = {"층": "system", "주인": None}
|
|
STONE = "GF000219" # 원/㎡
|
|
RATE = {"이름": "공구손료", "단위": "%", "단가": {"노무비": 0, "재료비": 0, "경비": 0}}
|
|
|
|
|
|
def _src(name: str) -> str:
|
|
return open(os.path.join(SRC, name), encoding="utf-8").read()
|
|
|
|
|
|
def test_저장은_안_줄_수량을_걷고_비율_줄_율만_남김(world): # noqa: F811
|
|
rate = {"고정": {**RATE, "비율": {"기준": "노무비", "비목": "경비"}}, "수량": {"손": 3}}
|
|
lines = [{"로직": STONE, "수량": {"손": 2.5}}, rate]
|
|
with store.at(world["system"]):
|
|
key = refs.create("precombo", {"이름": "수량 없음", "단위": "m", "담은로직": lines})["이름"]
|
|
doc = store.read("precombo", key)["문서"]
|
|
assert doc["담은로직"][0]["수량"] is None
|
|
assert doc["담은로직"][1]["수량"] == {"손": 3} # 비율 = 율(기준단위 당 수량 아님)
|
|
frozen = refs.with_pills(doc) # 프로젝트 굳힘도 수량 없이
|
|
assert frozen["담은로직"][0]["수량"] is None and frozen["알약"]
|
|
|
|
|
|
def test_펼침은_이은_알약만_쓰고_층_원본_옛_손은_안_씀(world): # noqa: F811
|
|
with store.at(world["system"]):
|
|
key = refs.create("precombo", {"이름": "옛", "단위": "m", "담은로직": [{"로직": STONE}]})[
|
|
"이름"
|
|
]
|
|
ref = {**SYS, "키": key}
|
|
path = world["system"] / "precombo" / f"{key}.json"
|
|
import json
|
|
|
|
old = json.loads(path.read_bytes())
|
|
old["담은로직"][0]["수량"] = {"손": 9} # 옛 문서(723-1 앞) — 파일은 그대로 둠
|
|
path.write_text(json.dumps(old, ensure_ascii=False), encoding="utf-8")
|
|
whole = m01.loaded()[1]
|
|
with store.at(world["system"]):
|
|
bare = refs.Expand(whole)(ref)
|
|
got = refs.Expand(whole, given={f"{refs.ref_id(ref)}#0": 2})(ref)
|
|
frozen = refs.Expand(whole, read=lambda r: old)(ref) # 굳힌 사본 = 손 그대로
|
|
stone = labor.run_line(whole, STONE, {})["기준"]["계"]
|
|
assert bare["기준"] is None and "수량 없음" in bare["까닭"]
|
|
assert got["기준"]["계"] == pytest.approx(stone * 2)
|
|
assert frozen["기준"]["계"] == pytest.approx(stone * 9)
|
|
|
|
|
|
def test_구조물_조합_알약에_안_줄_알약(world): # noqa: F811
|
|
with store.at(world["system"]):
|
|
key = refs.create(
|
|
"precombo", {"이름": "옹벽", "단위": "m", "담은로직": [{"로직": STONE, "별칭": "돌"}]}
|
|
)["이름"]
|
|
doc = labor.clean({"열": "rv", "담은로직": [{"참조": {**SYS, "키": key}}]})
|
|
pills = labor.pills(doc)
|
|
rid = refs.ref_id({**SYS, "키": key})
|
|
assert [p["키"] for p in pills] == [rid, f"{rid}#0"]
|
|
assert pills[1]["이름"] == "옹벽 · 돌" and pills[1]["단위"] == "㎡"
|
|
|
|
|
|
def test_화면_서고_상세는_일위대가표만_임시_수량_휘발():
|
|
table, detail = (
|
|
_src("M02_MasterTemplete_Labor_Table.ts"),
|
|
_src("M02_MasterTemplete_Labor_Detail.ts"),
|
|
)
|
|
assert 'if (opt.mode === "precombo") return mountLaborTable(host, doc, opt);' in detail
|
|
assert "const temp = new Map<string, number>();" in table # 휘발 — 문서 밖
|
|
assert "calc = calc && settle(calc, withTemp(), {});" in table # 짝 셈 미리 보기
|
|
assert (
|
|
'const out: Record<string, unknown> = { ...cur, 종류: "사전조합" };' in table
|
|
) # temp 안 실음
|
|
for label in ('tc("Up")', 'tc("Down")', 't("Alias")', 'tc("Remove")'):
|
|
assert label in table # 우클릭 메뉴
|
|
assert "fixed: (fx: LaborFixed, name: string)" in table # 721-2 고정 줄 이음
|
|
|
|
|
|
def test_화면_줄_모달은_SK_상세_줄_모드_적용은_덮개와_옵션():
|
|
modal, sk = (
|
|
_src("M02_MasterTemplete_Labor_RowModal.ts"),
|
|
_src("M02_MasterTemplete_Labor_RowSk.ts"),
|
|
)
|
|
detail = _src("M02_MasterTemplete_Sangeun_Detail.ts")
|
|
assert "mountSangeunDetail(box, doc," in sk and "getValues: () => ({ ...values })" in detail
|
|
assert "if (got.patch) row.패치 = got.patch;" in modal and "setValues(got.values);" in modal
|
|
assert 'createCheckbox(t("AlsoSk"), { checked: false })' in modal # 기본 꺼짐
|
|
assert "openRowSangeun" not in modal # 717-3 두 보기 갈음
|