From 9698c7b14a0a6b3b136c90fa973d8b8c0c7d87c2 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Wed, 16 Sep 2026 15:59:14 +0900 Subject: [PATCH] =?UTF-8?q?feat(z01):=20=EA=B8=B0=EC=B4=88=EB=8B=A8?= =?UTF-8?q?=EA=B0=80=20=EC=83=81=EC=9E=90=20=EC=9D=B4=EB=A6=84=20=EB=91=98?= =?UTF-8?q?=20=E2=80=94=20base=5Fprice=20=E3=80=8C=EA=B8=B0=EC=B4=88?= =?UTF-8?q?=EB=8B=A8=EA=B0=80=E3=80=8D=20=C2=B7=20pumsem=5Fbasis=20?= =?UTF-8?q?=E3=80=8C=ED=92=88=EC=85=88=20=EA=B8=B0=EC=A4=80=E3=80=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 서버 `kind_group()` 이 내는 갈래 둘에 한글 이름을 붙임. 상자 설명도 한 줄씩 — 기초단가는 「**얼마인가** · 때가 되면 갈아 끼우는 값」, 품셈 기준은 「**얼마나 드나** · 품셈·법령이 정한 계수」 - ⭐ **서버가 읽을 자리를 못박음** — `labels["base_price_groups"][group]["name_ko"]`. 지금 서버에 갈래 이름 읽는 코드가 아직 없어, 두 창이 서로 다른 자리를 보면 2026-09-15 의 「26칸이 영문으로 뜸」 사고가 되풀이됨 - 시험 둘 더함 — 서버가 내는 갈래마다 이름표에 이름이 있는지 · 상자마다 kind 가 서고 그 kind 이름이 영문 그대로가 아닌지(빈 상자·영문 상자 막음) - 새 kind 열 15칸은 앞 커밋(`46fe2bc0`)에서 이미 이름 붙음 — 지금 영문으로 뜨는 열 0 Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01FFCnEYNH4tsS2MbHvzBhZk --- .../data_master_labels/labels_2026-01-01.json | 12 ++++++++- .../tester/test_master_labels_base_prices.py | 27 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/resources/data_master_labels/labels_2026-01-01.json b/resources/data_master_labels/labels_2026-01-01.json index bf0f046d..4014b7ed 100644 --- a/resources/data_master_labels/labels_2026-01-01.json +++ b/resources/data_master_labels/labels_2026-01-01.json @@ -2,7 +2,7 @@ "schema_version": "1.0", "dataset_id": "data_master_labels", "effective_date": "2026-01-01", - "generated_at": "2026-09-16T15:44:59+09:00", + "generated_at": "2026-09-16T15:58:32+09:00", "note": "마스터 자료의 **사람이 읽을 이름표**. 값이 아니라 이름만 담는다 — 여기를 고쳐도 계산은 안 바뀐다. Z01 마스터 관리 화면이 표·열 이름을 여기서 읽는다.", "policy": { "labels_only": "값·수식·단가를 담지 않는다. 마스터 파일은 손대지 않는다.", @@ -54,6 +54,16 @@ "summary": "앞으로 늘려 갈 첫 벌. 모양을 잡아 두려고 먼저 놓은 것이다." } }, + "base_price_groups": { + "base_price": { + "name_ko": "기초단가", + "summary": "**얼마인가** — 때가 되면 갈아 끼우는 값(노임·기계·자재·유가·제비율)." + }, + "pumsem_basis": { + "name_ko": "품셈 기준", + "summary": "**얼마나 드나** — 품셈·법령이 정해 둔 계수와 갈래(토량환산·할증·거푸집·철근·돌쌓기 따위)." + } + }, "merged_tables": [ { "key": "labor", diff --git a/resources/tester/test_master_labels_base_prices.py b/resources/tester/test_master_labels_base_prices.py index 92a36288..67ec9b59 100644 --- a/resources/tester/test_master_labels_base_prices.py +++ b/resources/tester/test_master_labels_base_prices.py @@ -209,3 +209,30 @@ def test_축_칸은_못_고친다(): if axis in meta["editable"] and f"{kind}/{axis}" not in AXIS_ALSO_VALUE: bad.append(f"{kind}/{axis} 가 고칠 수 있는 칸으로 섰다") assert not bad, bad + + +def test_기초단가_상자_이름이_이름표에_있다(labels): + """⭐ 서버가 내는 갈래(`group`)마다 한글 이름이 있어야 화면이 영문으로 안 뜬다. + + 서버가 읽을 자리는 `labels["base_price_groups"][group]["name_ko"]` 다 — + 두 창이 서로 다른 자리를 보면 2026-09-15 의 26칸 사고가 되풀이된다. + """ + named = labels["base_price_groups"] + groups = {base_prices.kind_group(kind) for kind in base_prices.KINDS} + missing = groups - set(named) + assert not missing, f"이름표에 없는 갈래: {sorted(missing)}" + for key, entry in named.items(): + assert entry["name_ko"].strip(), key + assert entry["summary"].strip(), key + assert named["base_price"]["name_ko"] == "기초단가" + assert named["pumsem_basis"]["name_ko"] == "품셈 기준" + + +def test_상자마다_kind_가_있다(): + """빈 상자가 서면 화면에 이름만 뜨고 아무것도 안 열린다.""" + counted: dict[str, int] = {} + for entry in base_prices.kinds(): + counted[entry["group"]] = counted.get(entry["group"], 0) + 1 + assert entry["label"] != entry["kind"], f"{entry['kind']} 이름이 영문 그대로다" + assert entry["rows"] > 0, entry["kind"] + assert all(n > 0 for n in counted.values()), counted