From 3435922131c171c143bb23392b13d8d88d11e6ba Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 31 Oct 2026 15:18:10 +0900 Subject: [PATCH] =?UTF-8?q?feat(B09=C2=B7B08):=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EB=82=B1=EB=A7=90=20=EC=8B=A4=EB=AC=B4=20=EB=A7=90=EB=A1=9C=20?= =?UTF-8?q?=C2=B7=20=EB=B2=88=ED=98=B8=20=EC=88=A8=EA=B9=80=20=C2=B7=20?= =?UTF-8?q?=E2=98=B0=20=EC=84=9C=EB=9E=8D=20=EB=82=B4=20=EC=9E=90=EB=A3=8C?= =?UTF-8?q?=EC=A7=91=20=EA=B8=B8(PLAN=20703-4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - B09 데이터 점검 → 내역 점검 · 공기 옵션 → 공사기간 조건 · 박스보기/호표보기 → 카드 보기/표 보기 · 하이퍼링크/팝업 → 탭 이동/곁 창 · 굳힌 단가 → 이 공사 단가 책 · 산식/요율 출처 → 계산식/요율 근거 · 빈 줄 → 금액 빈 줄 · 단가연결 칸 램프 → 단가연결 칸 ● · 새 산근 → 새 단가산출(산근) · 연결 없음 → 일위대가 없음 - 단가연결 창 종류 일위대가 사전조합 → 일위대가(자료집) · 일위대가 호표 → 이 공사 일위대가 · 단가산출 호표 → 이 공사 단가산출 · 대가N/산근 N호표 → 일위대가 N호/단가산출 N호 · 구조물 조합 줄 번호(SS…) 숨김 · 넣을 값 창 제목 번호 → 알림 글 끝 - B08 조합 사본 · 조합 연결 · 노랑 램프 → 구조물 조합 · 구조물 조합 고르기 · 노랑 ●(locale_b4 B08_Quantity_* 글만 · 한시 브레인 승인) - ☰ 서랍 · 진행 판 끝 「내 자료집(일위대가 · 구조물 조합)」 = M02 일위대가조합 개인 층(떠남 물음 뒤) - 낡은 시험 글 고침(새 낱말): 143-1 · 157-2 · 182 · 203-1 · 204-2 · 304 · 311 · 701-3 Co-Authored-By: Claude Opus 5.5 --- B08_Quantity/B08_Quantity_Router_Summary.py | 4 +++- B09_Estimation/B09_Estimation_UI_Check.ts | 4 ++-- B09_Estimation/B09_Estimation_UI_Dock.ts | 2 +- B09_Estimation/B09_Estimation_UI_Haul_Modal.ts | 2 +- B09_Estimation/B09_Estimation_UI_Live.ts | 5 ++++- B09_Estimation/B09_Estimation_UI_Shell.ts | 17 +++++++++++++++-- B09_Estimation/B09_Estimation_UI_Tabs.ts | 2 +- B09_Estimation/B09_Estimation_UI_Tabs_Base.ts | 6 +++--- B09_Estimation/B09_Estimation_UI_Tabs_Bill.ts | 4 ++-- .../B09_Estimation_UI_Tabs_Bill_Fold_Menu.ts | 2 +- .../B09_Estimation_UI_Tabs_Bill_Link.ts | 16 ++++++++-------- B09_Estimation/B09_Estimation_UI_Tabs_Groups.ts | 2 +- B09_Estimation/B09_Estimation_UI_Tabs_Labor.ts | 2 +- .../B09_Estimation_UI_Tabs_Summary.ts | 2 +- B09_Estimation/B09_Estimation_UI_Tabs_Total.ts | 8 ++++---- .../draft/B09_Draft_Schedule_Panel.ts | 2 +- B09_Estimation/draft/B09_Draft_Schedule_UI.ts | 2 +- .../tester/test_143_1_b08_linked_snapshots.py | 2 +- .../tester/test_157_2_b09_sangeun_views.py | 2 +- resources/tester/test_182_b09_bill_level.py | 6 +++--- resources/tester/test_203_1_b09_data_check.py | 6 +++--- resources/tester/test_204_2_b09_bill_library.py | 2 +- resources/tester/test_304_b09_view_setting.py | 2 +- resources/tester/test_311_panel_folded.py | 4 ++-- .../tester/test_701_3_b09_cost_unfinished.py | 2 +- ui_template/ui_template_locale_b4.ts | 14 +++++++------- 26 files changed, 70 insertions(+), 52 deletions(-) diff --git a/B08_Quantity/B08_Quantity_Router_Summary.py b/B08_Quantity/B08_Quantity_Router_Summary.py index 23afc7b27..2e0051722 100644 --- a/B08_Quantity/B08_Quantity_Router_Summary.py +++ b/B08_Quantity/B08_Quantity_Router_Summary.py @@ -632,7 +632,9 @@ def pipe_summary( notes = [] missing = sheet.unlinked | {key for key, found in others.items() if not found} if missing: - notes.append(f"조합 사본 없는 시설 {len(missing)}곳 — 노랑 램프 줄을 눌러 조합 연결") + notes.append( + f"구조물 조합 없는 시설 {len(missing)}곳 — 노랑 ● 줄을 눌러 구조물 조합 고르기" + ) if no_length: notes.append(f"관 연장 없음 {no_length}곳 — B06 횡단 [저장] 뒤 채워짐") if no_basin: diff --git a/B09_Estimation/B09_Estimation_UI_Check.ts b/B09_Estimation/B09_Estimation_UI_Check.ts index 19d56c11f..430a73b10 100644 --- a/B09_Estimation/B09_Estimation_UI_Check.ts +++ b/B09_Estimation/B09_Estimation_UI_Check.ts @@ -30,7 +30,7 @@ export interface CheckItem { why: string; } -const BLANK_WHY = "금액 모름 — 단가연결 칸 램프 · 이은 호표의 빈 줄을 확인"; +const BLANK_WHY = "금액 모름 — 단가연결 칸 ● · 이은 호표의 빈 줄을 확인"; /** 빈 줄(설계내역서 줄마다 하나 · 까닭 모음) · 그 밖 확인 줄(탭 · 키마다 하나) · 알림 글 */ export function checkItems( @@ -175,7 +175,7 @@ export function createCheckPanel(refresh: HTMLElement, goto: (link: Link) => voi const made = checkItems(sheets, next); items = [...made.items, ...made.others]; const blank = [ - head(`빈 줄 ${made.items.length}`), + head(`금액 빈 줄 ${made.items.length}`), ...(made.items.length ? [list(made.items, 0)] : []), ]; const others = made.others.length diff --git a/B09_Estimation/B09_Estimation_UI_Dock.ts b/B09_Estimation/B09_Estimation_UI_Dock.ts index 7d7b19796..9276e8487 100644 --- a/B09_Estimation/B09_Estimation_UI_Dock.ts +++ b/B09_Estimation/B09_Estimation_UI_Dock.ts @@ -21,7 +21,7 @@ import { export type LinkMode = "popup" | "link"; -const LINK_LABEL: Record = { link: "하이퍼링크", popup: "팝업" }; +const LINK_LABEL: Record = { link: "탭 이동", popup: "곁 창" }; /** 행 누름 길 — 모르는 값 · 못 읽음 = 팝업 */ export function linkMode(): LinkMode { diff --git a/B09_Estimation/B09_Estimation_UI_Haul_Modal.ts b/B09_Estimation/B09_Estimation_UI_Haul_Modal.ts index cb83320de..6727552f1 100644 --- a/B09_Estimation/B09_Estimation_UI_Haul_Modal.ts +++ b/B09_Estimation/B09_Estimation_UI_Haul_Modal.ts @@ -86,7 +86,7 @@ async function preview(code: string, given: Row, rate: unknown, picks: unknown): const label = (text: string, unit: string): string => (unit ? `${text} (${unit})` : text); const KIND_TEXT: Record = { logic: "단가산출", - precombo: "일위대가 사전조합", + precombo: "일위대가(자료집)", combo: "구조물 조합", dg: "일위대가 호표", sg: "단가산출 호표", diff --git a/B09_Estimation/B09_Estimation_UI_Live.ts b/B09_Estimation/B09_Estimation_UI_Live.ts index 8c3bcccdd..ecf65c5de 100644 --- a/B09_Estimation/B09_Estimation_UI_Live.ts +++ b/B09_Estimation/B09_Estimation_UI_Live.ts @@ -97,7 +97,10 @@ export function createLiveCalc( if (mine !== seq || me.signal.aborted) return; ctrl = null; failedSig = sig; - showToast(`새 산근 단가를 못 받음 — [저장] 때 다시 셈 · ${String(error)}`, "warning"); + showToast( + `새 단가산출 단가를 못 받음 — [저장] 때 다시 셈 · ${String(error)}`, + "warning", + ); settle(null, user); }, ); diff --git a/B09_Estimation/B09_Estimation_UI_Shell.ts b/B09_Estimation/B09_Estimation_UI_Shell.ts index a315898fa..25811e184 100644 --- a/B09_Estimation/B09_Estimation_UI_Shell.ts +++ b/B09_Estimation/B09_Estimation_UI_Shell.ts @@ -13,7 +13,7 @@ import "@ui/ui_template_general_layout.css"; import "./B09_Estimation_UI_Page.css"; -import { API_BASE_URL } from "@config/config_frontend"; +import { API_BASE_URL, ROUTES } from "@config/config_frontend"; import { createWorkflowLayout } from "@ui/ui_template_workflow_layout"; import { createText } from "@ui/ui_template_text"; import { createBanner } from "@ui/ui_template_banner"; @@ -32,6 +32,7 @@ import { ui_locales, currentLanguageIndex } from "@ui/ui_template_locale"; import { clearState, readState, writeState } from "../A00_Common/b_page_state"; import { workflowSteps } from "../A00_Common/b_page_scaffold"; import { moveStage, WORKFLOW_STEP_ROUTES } from "../A00_Common/b_workflow_nav"; +import { navigateTo } from "../A00_Common/router"; import { computeBase, type Row } from "./B09_Estimation_Calc_Base"; import { computeEstimation } from "./B09_Estimation_Calc_Bill"; import { computeLabor, daegaPrice } from "./B09_Estimation_Calc_Labor"; @@ -381,7 +382,7 @@ export function renderB09Estimation(root: HTMLElement): void { }); save.dataset.b09Save = ""; // 카드 = 좌측 패널 공용 카드(269 · 「구조물 배치」 양식) - const section = createPanelCard("데이터 점검", true); // 311 기본 접힘 + const section = createPanelCard("내역 점검", true); // 311 기본 접힘 section.append(refresh, check.list); // 303-1 · 304-1 하단 고정 줄 — [박스보기|호표보기] · [하이퍼링크|팝업] · 초안 단추 · [?][<][>][초기화] const actions = createDock([save, reset], () => isGroupTab(current) && show(current)); @@ -420,6 +421,18 @@ export function renderB09Estimation(root: HTMLElement): void { if (go) void moveStage(projectId, goNext, [{ name: "원가 계산 단계 완료", run: complete }]); }); }); + // 703-4 진행 판 · ☰ 서랍(같은 단계 막대) 끝 = M02 「내 자료집」(일위대가 · 구조물 조합) 길 + layout.root.querySelector(".ui-workflow-layout__steps.is-vertical")?.append( + createButton({ + label: "내 자료집(일위대가 · 구조물 조합)", + variant: "pill", + onClick: () => + void askProjectLeave().then((go) => { + if (go) + navigateTo(ROUTES.M02_MASTER_TEMPLATE, { open: "일위대가조합", root: "personal" }); + }), + }), + ); root.append(layout.root); show(current); // 572-2 떠남 물음 — 고침 = 세션 칸(불러온 뒤) · 저장 = 단계 이동과 같은 길 diff --git a/B09_Estimation/B09_Estimation_UI_Tabs.ts b/B09_Estimation/B09_Estimation_UI_Tabs.ts index 7a116957a..1a0c479a3 100644 --- a/B09_Estimation/B09_Estimation_UI_Tabs.ts +++ b/B09_Estimation/B09_Estimation_UI_Tabs.ts @@ -65,7 +65,7 @@ export const blankRows = (sheets: Row): Row[] => /** 「빈 줄 n · 미완성」 띠 글(701-3) — 빈 줄 0 = null */ export const unfinished = (sheets: Row): string | null => { const n = blankRows(sheets).length; - return n ? `빈 줄 ${n} · 미완성 — 금액은 아는 줄까지 · 인쇄 · 확정은 빈 줄 0 일 때만` : null; + return n ? `금액 빈 줄 ${n} · 미완성 — 금액은 아는 줄까지 · 인쇄 · 확정은 빈 줄 0 일 때만` : null; }; /** 위 탭(181-1) — [위 탭 이름, 아래 탭들] · 아래 탭 하나뿐 = 위 탭 단독 · 첫 아래 탭 = 위 탭 키 */ diff --git a/B09_Estimation/B09_Estimation_UI_Tabs_Base.ts b/B09_Estimation/B09_Estimation_UI_Tabs_Base.ts index 1091fc393..f11a5f6e6 100644 --- a/B09_Estimation/B09_Estimation_UI_Tabs_Base.ts +++ b/B09_Estimation/B09_Estimation_UI_Tabs_Base.ts @@ -54,18 +54,18 @@ export const buildLabor: TabBuild = ({ sheets, payload }) => priceList( sheets.labor || [], "단가(원/인)", - `굳힌 단가(${madeText(payload)}) 기준 · 바꾸려면 [업데이트]`, + `이 공사 단가 책(${madeText(payload)}) 기준 · 새 노임은 [업데이트]`, ); export const buildExpense: TabBuild = ({ sheets, payload }) => priceList( sheets.expense || [], "기준가(천원)", - `굳힌 단가(${madeText(payload)}) 기준 · 바꾸려면 [업데이트]`, + `이 공사 단가 책(${madeText(payload)}) 기준 · 새 노임은 [업데이트]`, ); function madeText(payload: Row): string { - return payload.book?.made ? `${dateText(String(payload.book.made))} 굳힘` : "아직 안 굳힘"; + return payload.book?.made ? `${dateText(String(payload.book.made))} 정함` : "아직 안 정함"; } export const buildBasis: TabBuild = ({ sheets }): TabTable => { diff --git a/B09_Estimation/B09_Estimation_UI_Tabs_Bill.ts b/B09_Estimation/B09_Estimation_UI_Tabs_Bill.ts index 2bca9c6f8..2f02ab6c2 100644 --- a/B09_Estimation/B09_Estimation_UI_Tabs_Bill.ts +++ b/B09_Estimation/B09_Estimation_UI_Tabs_Bill.ts @@ -69,9 +69,9 @@ export const buildBill: TabBuild = (ctx): BillTable => { total: { name: "순공사비 계(관급 제외)", ...direct }, frozen: 1, hint: - "줄을 우클릭하면 항목 추가 · 줄 삭제 · 옮김 · 단가연결 칸 램프를 누르면 일위대가 · 단가산출 연결" + + "줄을 우클릭하면 항목 추가 · 줄 삭제 · 옮김 · 단가연결 칸 ● 을 누르면 일위대가 · 단가산출 연결" + (direct.blank - ? ` · 빈 줄 ${direct.blank} — 계는 아는 금액만 · 원가계산서도 아는 금액까지 · 인쇄 · 확정은 빈 줄 0 일 때만` + ? ` · 금액 빈 줄 ${direct.blank} — 계는 아는 금액만 · 원가계산서도 아는 금액까지 · 인쇄 · 확정은 빈 줄 0 일 때만` : ""), editOnDouble: true, editable: (i, key) => { diff --git a/B09_Estimation/B09_Estimation_UI_Tabs_Bill_Fold_Menu.ts b/B09_Estimation/B09_Estimation_UI_Tabs_Bill_Fold_Menu.ts index b0ec94253..95b7fef78 100644 --- a/B09_Estimation/B09_Estimation_UI_Tabs_Bill_Fold_Menu.ts +++ b/B09_Estimation/B09_Estimation_UI_Tabs_Bill_Fold_Menu.ts @@ -91,7 +91,7 @@ async function postPersonal(body: Row): Promise<{ ok: boolean; status: number; g async function savePersonal(ctx: TabContext, block: Row): Promise { let name = await askText({ title: "내 자료집에 저장", - message: "개인 층 일위대가 사전조합으로 — 넣을 값 · 고른 자재 · 줄 수량 고친 칸까지", + message: "내 자료집 일위대가로 — 옵션 값 · 고른 자재 · 줄 수량 고친 칸까지", value: block.name || "", okLabel: "저장", }); diff --git a/B09_Estimation/B09_Estimation_UI_Tabs_Bill_Link.ts b/B09_Estimation/B09_Estimation_UI_Tabs_Bill_Link.ts index 4f5451c58..1e358ccf5 100644 --- a/B09_Estimation/B09_Estimation_UI_Tabs_Bill_Link.ts +++ b/B09_Estimation/B09_Estimation_UI_Tabs_Bill_Link.ts @@ -41,21 +41,21 @@ export function askInputs(apply: ApplyRef, code: string, name: string, old?: Row (got) => { const logic = got.로직[0] ?? null; openLaborInput({ - title: `${code} ${name}`.trim(), + title: name || code, // 703-4 번호 = 알림 글 끝(자세히) logic, values: old?.given || {}, memo: null, rate: old?.rate ?? null, readOnly: false, okLabel: "연결", - notice: "새 산근 = 단가산출근거 뒤 번호 · 단가는 연결 뒤 서버가 바로 셈", + notice: `새 단가산출(산근) = 단가산출근거 끝 호표 · 금액은 연결 뒤 바로 셈 · 번호 ${code}`, done: (next) => { const unit = String(logic?.결과단위 || "") .replace(/^원\//, "") .replace(/^[\d.]+/, ""); const ref = { tab: "logic", code, name, given: next.입력값, rate: next.켜쌓기율 }; apply({ ...ref, picks: old?.picks ?? null }, { name, unit }); - showToast("연결함 — 새 산근 단가 셈 중", "success"); + showToast("연결함 — 단가 셈 중", "success"); }, }); }, @@ -194,7 +194,7 @@ export async function openPriceLink(o: PriceLinkOpts): Promise { ((tab === "dg" ? o.hopyo?.dg : o.hopyo?.sg) ?? []).map((r) => ({ kind: tab, key: String(r.key), - tag: tab === "dg" ? `대가${r.no}` : `산근 ${r.no}호표`, + tag: tab === "dg" ? `일위대가 ${r.no}호` : `단가산출 ${r.no}호`, name: String(r.name || ""), sub: String(r.spec || ""), unit: String(r.unit || ""), @@ -206,7 +206,7 @@ export async function openPriceLink(o: PriceLinkOpts): Promise { key: `${r.layer}:${r.owner ?? ""}:${r.key}`, tag: "구조물 조합", name: itemName(r), - sub: `${LAYER_TEXT[r.layer ?? "system"]} · ${r.key}`, + sub: LAYER_TEXT[r.layer ?? "system"], // 703-4 번호 숨김 unit: String(r.단위 || ""), onPick: () => pick({ @@ -225,12 +225,12 @@ export async function openPriceLink(o: PriceLinkOpts): Promise { extra: [...combos, ...hop("dg"), ...hop("sg")], kindFilter: [ { value: "logic", text: "단가산출" }, - { value: "precombo", text: "일위대가 사전조합" }, + { value: "precombo", text: "일위대가(자료집)" }, { value: "combo", text: "구조물 조합" }, ...(o.hopyo ? [ - { value: "dg", text: "일위대가 호표" }, - { value: "sg", text: "단가산출 호표" }, + { value: "dg", text: "이 공사 일위대가" }, + { value: "sg", text: "이 공사 단가산출" }, ] : []), ], diff --git a/B09_Estimation/B09_Estimation_UI_Tabs_Groups.ts b/B09_Estimation/B09_Estimation_UI_Tabs_Groups.ts index 1cc4f2af6..ecefe2180 100644 --- a/B09_Estimation/B09_Estimation_UI_Tabs_Groups.ts +++ b/B09_Estimation/B09_Estimation_UI_Tabs_Groups.ts @@ -39,7 +39,7 @@ export const GROUP_TABS: TabId[] = ["dg", "machine_blocks", "sg"]; export const isGroupTab = (tab: TabId): boolean => GROUP_TABS.includes(tab); /** 단추 글 = 그 보기 이름(304-1 좌측 스위치) */ -export const viewLabel = (view: GroupView): string => (view === "cards" ? "박스보기" : "호표보기"); +export const viewLabel = (view: GroupView): string => (view === "cards" ? "카드 보기" : "표 보기"); type Saved = Record | null; diff --git a/B09_Estimation/B09_Estimation_UI_Tabs_Labor.ts b/B09_Estimation/B09_Estimation_UI_Tabs_Labor.ts index 074f3bc64..11bbd0ade 100644 --- a/B09_Estimation/B09_Estimation_UI_Tabs_Labor.ts +++ b/B09_Estimation/B09_Estimation_UI_Tabs_Labor.ts @@ -25,7 +25,7 @@ import { raw } from "./B09_Estimation_UI_Tabs_Sangeun"; import { HOPYO_TAG, hopyoCellClass, hopyoGrid } from "@ui/ui_template_hopyo_grid"; const EMPTY = - "연결 없음 — 연결된 구조물 조합 사본(일위대가)이 없음 · B05 · B06 에서 조합을 고르고 [저장]"; + "일위대가 없음 — 이 공사에 고른 구조물 조합이 없음 · B05 · B06 에서 구조물 조합을 고르고 [저장] · 또는 설계내역서 오른쪽 재료 창고"; const BLANK = "빈 줄은 금액을 모르는 줄(합계는 아는 줄만)"; /** 「빈 줄 n」 작은 글 · 풍선 = 빈 줄 이름 */ const blankNote = (b: Row): string => (b.blank ? `빈 줄 ${b.blank}` : ""); diff --git a/B09_Estimation/B09_Estimation_UI_Tabs_Summary.ts b/B09_Estimation/B09_Estimation_UI_Tabs_Summary.ts index 489268092..3a70481f6 100644 --- a/B09_Estimation/B09_Estimation_UI_Tabs_Summary.ts +++ b/B09_Estimation/B09_Estimation_UI_Tabs_Summary.ts @@ -28,7 +28,7 @@ const hint = (sheets: Row, payload: Row): string => { const fixed = Number((payload.summary || {}).fixed) || 0; return [ HINT, - ...(n ? [`빈 줄 ${n} — 집계에서 빠짐(좌측 데이터 점검)`] : []), + ...(n ? [`금액 빈 줄 ${n} — 집계에서 빠짐(왼쪽 내역 점검)`] : []), ...(fixed ? [`고정 줄 ${fixed} — 이은 단가 없어 집계에서 빠짐`] : []), ].join(" · "); }; diff --git a/B09_Estimation/B09_Estimation_UI_Tabs_Total.ts b/B09_Estimation/B09_Estimation_UI_Tabs_Total.ts index 1fb329ba6..0c761f055 100644 --- a/B09_Estimation/B09_Estimation_UI_Tabs_Total.ts +++ b/B09_Estimation/B09_Estimation_UI_Tabs_Total.ts @@ -100,7 +100,7 @@ function billRows(bill: Row | undefined): DataRow[] { material: r.material ?? null, expense: r.expense ?? null, }); - const blank = direct.blank ? ` · 빈 줄 ${direct.blank} — 아는 금액만` : ""; + const blank = direct.blank ? ` · 금액 빈 줄 ${direct.blank} — 아는 금액만` : ""; return [ ...top.map((r: Row) => ({ key: `bill:${r.key}`, @@ -243,8 +243,8 @@ export const buildTotal: TabBuild = (ctx): TabTable => { money("expense", "경비"), qty("rate", "요율(%)", 5), money("hand", "수기 입력", undefined, 2), - text("note", "산식", 320), - text("candidate", "요율 출처", 260), + text("note", "계산식", 320), + text("candidate", "요율 근거", 260), ], rows, total: grand, @@ -253,7 +253,7 @@ export const buildTotal: TabBuild = (ctx): TabTable => { level: nameLevel(rows), mergeSame: ["part"], banner: unfinished(ctx.sheets) ?? undefined, - hint: "맨 위 내역 줄을 누르면 설계내역서 그 줄로 · 요율 칸에 적으면 사용자 값 · 지우거나 출처 칸을 누르면 자동 값", + hint: "맨 위 내역 줄을 누르면 설계내역서 그 줄로 · 요율 칸에 적으면 사용자 값 · 지우거나 근거 칸을 누르면 자동 값", editable: (i, key) => (key === "rate" && RATE_KEYS.has(String(rows[i]?.key))) || (key === "hand" && String(rows[i]?.key) in HAND), diff --git a/B09_Estimation/draft/B09_Draft_Schedule_Panel.ts b/B09_Estimation/draft/B09_Draft_Schedule_Panel.ts index e68bc0e6a..521cf8436 100644 --- a/B09_Estimation/draft/B09_Draft_Schedule_Panel.ts +++ b/B09_Estimation/draft/B09_Draft_Schedule_Panel.ts @@ -160,7 +160,7 @@ export function createSchedulePanel(user: () => Row, setUser: (next: Row) => voi holidayCaption.textContent = "공휴일 넣기(그 밖 법정공휴일은 늘 넣음)"; holidayBox.append(holidayCaption, ...checks); - const section = createPanelCard("공기 옵션", true); // 311 기본 접힘 + const section = createPanelCard("공사기간 조건", true); // 311 기본 접힘 section.dataset.b09SchedulePanel = ""; section.style.display = "none"; // 원천(서버 공기 자료)이 오면 보임 · hidden 은 공용 카드 flex 가 덮음 section.append( diff --git a/B09_Estimation/draft/B09_Draft_Schedule_UI.ts b/B09_Estimation/draft/B09_Draft_Schedule_UI.ts index 45f700bdf..6f5e83d41 100644 --- a/B09_Estimation/draft/B09_Draft_Schedule_UI.ts +++ b/B09_Estimation/draft/B09_Draft_Schedule_UI.ts @@ -263,7 +263,7 @@ export function buildScheduleSum(ctx: TabContext): TabTable | string { frozen: 2, mergeSame: ["label"], rowClass: (i) => (rows[i].key === "span" || rows[i].key === "start" ? "is-title" : null), - hint: "공사기간 = 준비기간 + 작업일수 + 비작업일수 + 정리기간 · 착공 = 「연.월」 또는 「연.월.일」(왼쪽 「공기 옵션」과 같은 값) · 강수 · 혹서 · 공휴일 칸은 더블클릭으로 고침(빈칸 = 기본값)", + hint: "공사기간 = 준비기간 + 작업일수 + 비작업일수 + 정리기간 · 착공 = 「연.월」 또는 「연.월.일」(왼쪽 「공사기간 조건」과 같은 값) · 강수 · 혹서 · 공휴일 칸은 더블클릭으로 고침(빈칸 = 기본값)", tip: (i, key) => { const m = months[monthOf(key)]; if (!m || rows[i].key !== "b") return null; diff --git a/resources/tester/test_143_1_b08_linked_snapshots.py b/resources/tester/test_143_1_b08_linked_snapshots.py index 360925cb0..07b794fff 100644 --- a/resources/tester/test_143_1_b08_linked_snapshots.py +++ b/resources/tester/test_143_1_b08_linked_snapshots.py @@ -154,7 +154,7 @@ def test_사본_없는_시설_알림_응답에_사본(root): out = _run(root) # 100(유출 흙막이) · 200 · 300 · 400 · 500(기본 날개벽 잇기) · 600 · 개거 700 = 7곳 assert not any("wing" in c["id"] for c in out["columns"]) - assert "조합 사본 없는 시설 7곳 — 노랑 램프 줄을 눌러 조합 연결" in out["notes"] + assert "구조물 조합 없는 시설 7곳 — 노랑 ● 줄을 눌러 구조물 조합 고르기" in out["notes"] assert not any("관 연장 없음" in n for n in out["notes"]) assert set(out["linked"]) == {"pipe@100.0", "pipe@500.0__gford"} diff --git a/resources/tester/test_157_2_b09_sangeun_views.py b/resources/tester/test_157_2_b09_sangeun_views.py index 068632436..d08829249 100644 --- a/resources/tester/test_157_2_b09_sangeun_views.py +++ b/resources/tester/test_157_2_b09_sangeun_views.py @@ -63,7 +63,7 @@ def test_157_2_두_보기_같은_값(): def test_157_2_단추_바꿈(): out = _node("\nconsole.log(JSON.stringify([viewLabel('table'), viewLabel('cards')]));") - assert out == ["호표보기", "박스보기"] # 304-1 단추 글 = 그 보기 이름 + assert out == ["표 보기", "카드 보기"] # 304-1 단추 글 = 그 보기 이름 def test_157_2_기억_실패_때_카드(): diff --git a/resources/tester/test_182_b09_bill_level.py b/resources/tester/test_182_b09_bill_level.py index 6b9129080..1feb0f283 100644 --- a/resources/tester/test_182_b09_bill_level.py +++ b/resources/tester/test_182_b09_bill_level.py @@ -298,7 +298,7 @@ table.onCell(at("earth:4"), "connect"); table.onCell(at("hand:c"), "connect"); // 연결 없음 = 단가연결 창 바로(메뉴 없음) await new Promise((r) => setTimeout(r, 0)); out.menus = opened.map((m) => [m.x, m.y, m.items.map(name)]); -picked.rows.find((r) => r.tag === "대가3").onPick(); +picked.rows.find((r) => r.tag === "일위대가 3호").onPick(); out.picked = [picked.title, picked.kinds, picked.rows.map((r) => r.tag)]; out.ref = user.bill.rows.find((r) => r.key === "hand:c").ref; console.log(JSON.stringify(out)); @@ -329,8 +329,8 @@ def test_연결_단추_칸_메뉴_고르기_창_TS(): # 연결 없는 줄 = 단가연결 창 바로(종류 = 단가산출 · 사전조합 · 구조물 조합 · 호표 둘) unlink = [10, 40, ["단가연결", "-", "단가연결 풀기"]] assert out["menus"] == [unlink, unlink] - kinds = ["단가산출", "일위대가 사전조합", "구조물 조합", "일위대가 호표", "단가산출 호표"] - assert out["picked"] == ["단가연결", kinds, ["대가3"]] + kinds = ["단가산출", "일위대가(자료집)", "구조물 조합", "이 공사 일위대가", "이 공사 단가산출"] + assert out["picked"] == ["단가연결", kinds, ["일위대가 3호"]] assert out["ref"] == DG diff --git a/resources/tester/test_203_1_b09_data_check.py b/resources/tester/test_203_1_b09_data_check.py index 10103fa8a..ecf77a12a 100644 --- a/resources/tester/test_203_1_b09_data_check.py +++ b/resources/tester/test_203_1_b09_data_check.py @@ -24,7 +24,7 @@ SHELL = (ROOT / "B09_Estimation/B09_Estimation_UI_Shell.ts").read_text("utf-8") def test_묶음_이름_단추_글_설명_없음(): assert ( - 'createPanelCard("데이터 점검", true)' in SHELL and "원가 단가" not in SHELL + 'createPanelCard("내역 점검", true)' in SHELL and "원가 단가" not in SHELL ) # 269 공용 카드 assert 'label: "업데이트",' in SHELL and "단가 갱신" not in SHELL # 옛 굳힌 시각 안내 글(made) 없음 · 묶음 = 제목 · [업데이트] · 연결 점검 @@ -95,7 +95,7 @@ console.log(JSON.stringify({ a, b, moves, tipRefresh, tipRow, tipBlank, selector a, b = out["a"], out["b"] assert a["pending"] and not b["pending"] # 빈 줄 = 직접공사 항목 중 금액 모름(관급 · 제목 · 아는 줄 빼고) · 같은 줄 까닭은 하나로 - assert a["texts"][0] == "빈 줄 2" and a["texts"][2] == "그 밖 확인 2곳" + assert a["texts"][0] == "금액 빈 줄 2" and a["texts"][2] == "그 밖 확인 2곳" assert a["rows"] == [ ["0", "ui-sidebar-row", "제근설계내역서"], ["1", "ui-sidebar-row", "옹벽설계내역서"], @@ -109,7 +109,7 @@ console.log(JSON.stringify({ a, b, moves, tipRefresh, tipRow, tipBlank, selector assert out["tipRow"] == "대가 원천 없음" and out["selector"] == "[data-i]" assert "단가 굳힘 2026-10-01 09:00:00" in out["tipRefresh"] assert "업데이트 필요 — M01 에서 바뀐 단가 2" in out["tipRefresh"] - assert b["texts"] == ["빈 줄 0"] and b["rows"] == [] + assert b["texts"] == ["금액 빈 줄 0"] and b["rows"] == [] assert out["tipEmpty"].startswith("단가 아직 안 굳힘") and "업데이트 필요" in out["tipEmpty"] diff --git a/resources/tester/test_204_2_b09_bill_library.py b/resources/tester/test_204_2_b09_bill_library.py index bcba88818..e0cfa1ebf 100644 --- a/resources/tester/test_204_2_b09_bill_library.py +++ b/resources/tester/test_204_2_b09_bill_library.py @@ -231,7 +231,7 @@ def test_화면_출처_다섯_사전조합_창_들여오기_줄_연결_TS(): pre, (url, body) = out["sent"][0], out["sent"][1] kinds = ["logic", "precombo", "combo", "dg", "sg"] assert pre == ["pre", "personal", kinds, "단가연결"] # 층 셋 단추 · 종류 고르기 - assert out["combo"] == [["구조물 조합", "관매설", "마스터 · SS000011"]] + assert out["combo"] == [["구조물 조합", "관매설", "마스터"]] # 703-4 번호 숨김 assert url == "/api/projects/P1/estimation/library" assert body == {"kind": "precombo", "layer": "company", "owner": "7", "key": "SC-000002"} assert out["sent"][2][1] == {"kind": "combo", "layer": "system", "owner": None, diff --git a/resources/tester/test_304_b09_view_setting.py b/resources/tester/test_304_b09_view_setting.py index aa6a57a0f..76f31cbce 100644 --- a/resources/tester/test_304_b09_view_setting.py +++ b/resources/tester/test_304_b09_view_setting.py @@ -87,7 +87,7 @@ def test_좌측_스위치_누름(): "\nconsole.log(JSON.stringify({ name: row.dataset.b09Switch, labels, a, b, c: [redraws, pressed()]," " view: groupView(), kept: Object.fromEntries(kept) }));", ) - assert out["name"] == "view" and out["labels"] == ["박스보기", "호표보기"] + assert out["name"] == "view" and out["labels"] == ["카드 보기", "표 보기"] assert out["a"] == ["true", "false"] # 기본 = 박스보기 assert out["b"] == [0, ["true", "false"]] assert out["c"] == [1, ["false", "true"]] and out["view"] == "table" diff --git a/resources/tester/test_311_panel_folded.py b/resources/tester/test_311_panel_folded.py index 6a6ff2864..ca9729091 100644 --- a/resources/tester/test_311_panel_folded.py +++ b/resources/tester/test_311_panel_folded.py @@ -100,8 +100,8 @@ def test_B07_첫_장은_표지_기억_있으면_그_장(): def test_B09_기본_접힘_좌측은_한_번만_세움(): shell = _read("B09_Estimation/B09_Estimation_UI_Shell.ts") - assert 'createPanelCard("데이터 점검", true)' in shell - assert 'createPanelCard("공기 옵션", true)' in _read( + assert 'createPanelCard("내역 점검", true)' in shell + assert 'createPanelCard("공사기간 조건", true)' in _read( "B09_Estimation/draft/B09_Draft_Schedule_Panel.ts" ) # 다시 그림(show) 은 가운데 판만 바꿈 — 좌측 카드는 쪽 그릴 때 한 번 diff --git a/resources/tester/test_701_3_b09_cost_unfinished.py b/resources/tester/test_701_3_b09_cost_unfinished.py index fdc18a385..943b0e089 100644 --- a/resources/tester/test_701_3_b09_cost_unfinished.py +++ b/resources/tester/test_701_3_b09_cost_unfinished.py @@ -92,5 +92,5 @@ def test_띠_글_빈_줄_0_이면_없음(): ) # fmt: skip assert result.returncode == 0, result.stderr banner, none = json.loads(result.stdout) - assert banner.startswith("빈 줄 1 · 미완성") and "인쇄 · 확정은 빈 줄 0 일 때만" in banner + assert banner.startswith("금액 빈 줄 1 · 미완성") and "인쇄 · 확정은 빈 줄 0 일 때만" in banner assert none is None diff --git a/ui_template/ui_template_locale_b4.ts b/ui_template/ui_template_locale_b4.ts index 8758bc4ef..856ce208f 100644 --- a/ui_template/ui_template_locale_b4.ts +++ b/ui_template/ui_template_locale_b4.ts @@ -31,7 +31,7 @@ export const ui_locales_b4 = { B08_Quantity_Sheets_FromCopy: ["프로젝트 복사본", "Project copy"], B08_Quantity_Sheets_NoCopy: ["복사본에 없음", "Not in the project copy"], B08_Quantity_Sheets_InputsOnly: [ - "일위대가는 넣을 값만 이 사본에서 고침 — 담은로직 · 자재는 원본 층(M02)에서 고침", + "이 공사에서는 일위대가 옵션 값만 고침 — 품 · 자재 구성은 내 자료집(M02) · 품 · 수량은 원가계산 설계내역서 줄 펼침에서", "Only inputs are edited in this copy — logic lines and materials are edited in the source layer (M02)", ], B08_Quantity_Drawing_Loading: ["구조물도를 불러오는 중…", "Loading structure sheets…"], @@ -40,11 +40,11 @@ export const ui_locales_b4 = { "Failed to load structure sheets", ], B08_Quantity_Drawing_Missing: [ - "사본 없음 — B05 · B06 좌측 패널에서 조합 연결 · [저장] 뒤 보입니다.", + "구조물 조합 없음 — B05 · B06 왼쪽 패널에서 구조물 조합을 고르고 [저장] 하면 보임", "No project copy — link the combination in the B05 · B06 panel and save.", ], B08_Quantity_Drawing_NoDrawing: [ - "이 조합 사본은 도면이 없습니다 — M02 구조물 조합에서 그린 뒤 [재적용].", + "이 구조물 조합에는 도면이 없음 — 내 자료집(M02) 구조물 조합에서 그린 뒤 [재적용]", "This copy has no drawing — draw it in M02 structure combinations, then reapply.", ], B08_Quantity_Summary_Station: ["측점", "Station"], @@ -66,22 +66,22 @@ export const ui_locales_b4 = { B08_Quantity_Summary_Unlinked: ["미연결", "Unlinked"], B08_Quantity_Summary_LampTip: ["구조물 조합 미연결", "Structure combination unlinked"], B08_Quantity_Summary_LampOk: ["모두 연결됨", "All linked"], - B08_Quantity_Link_Title: ["조합 연결", "Link combinations"], + B08_Quantity_Link_Title: ["구조물 조합 고르기", "Link combinations"], B08_Quantity_Link_Body: ["본체", "Body"], B08_Quantity_Link_Linked: ["연결됨", "Linked"], B08_Quantity_Link_Pick: ["선택", "Select"], B08_Quantity_Link_Saved: ["조합을 연결했습니다.", "Combination linked."], B08_Quantity_Link_Failed: ["조합을 연결하지 못했습니다", "Failed to link the combination"], B08_Quantity_Link_CopyFailed: [ - "연결은 저장했으나 사본을 못 만듦", + "골랐으나 이 공사 사본을 못 만듦", "Linked, but the project copy could not be made", ], B08_Quantity_Link_Unlink: ["연결 끊기", "Unlink"], B08_Quantity_Link_UnlinkAsk: [ - "이 칸의 조합 연결을 끊습니다 — 프로젝트 사본은 남습니다.", + "이 칸의 구조물 조합을 풂 — 이 공사 사본은 남음", "Unlink this slot — the project copy is kept.", ], - B08_Quantity_Link_Unlinked: ["조합 연결을 끊었습니다.", "Combination unlinked."], + B08_Quantity_Link_Unlinked: ["구조물 조합을 풀었음", "Combination unlinked."], B08_Quantity_Link_UnlinkFailed: ["연결을 끊지 못했습니다", "Failed to unlink"], B08_Quantity_Link_Update: ["업데이트", "Update"], B08_Quantity_Link_UpdateTip: [