/* ============================================================================= * common_util_machine_symbol_name.ts * 기계경비식(부품 갈래) 기호 → 짧은 한글 이름(PLAN 839-1 · 요구 858 안 2) — 그림 전용 사전 * 「P_기계」 → 「가격」 · 「k_기계상각비」 → 「상각」 · 「C_손료」 → 「손료」 · 「r_기계잡재료」 → 「잡품」 * 화면 글만 바꿈 — 문서 자료 · 식 글 · 열쇠 · 계산 불변 · 식 글 고침 칸은 `tableAlias` 길이 이름 ↔ 기호로 오감 * 기계경비식 밖 문서 · 사용자가 손으로 바꾼 기호(사전에 없는 꼴)는 그대로 · 이름이 겹치면 그 기호만 그대로 * 화면 없음(시험이 Node 로 돌림) · 기계 제어 구역(836-1)도 `machineAlias` 로 같은 이름 * 인력 · 잡품 줄 여럿(842-3 — 덮음이 더한 `w_조종원N` · `P_잡품N`) = 줄마다 「인력N」 · 「잡품N」 * 겹분수 중간 줄 이름(845-2 `partName`) — 산출근거가 손료 식을 「손료계수」 줄 + 「손료」 줄로 나눠 그림 * ========================================================================== */ import type { FormulaDoc } from "./common_util_formula_doc"; import { symbols } from "./common_util_line_stack"; /** 기호 → 이름(품셈 말 줄임 — 가격 · 상각 · 정비 · 관리 · 손료 · 가산 · 잡품) */ const NAME: Record = { C_손료: "손료", C_브레이커: "브레이커손료", C_집게: "집게손료", P_기계: "가격", P_기계전력: "전력", P_기계주연료: "주연료", P_덤프트럭: "가격", P_덤프트럭2: "주연료", P_브레이커: "브레이커가격", P_집게: "집게가격", P_전력: "전력단가", P_자동차용경유: "경유", P_휘발유: "휘발유", P_체인오일: "체인오일", P_체인톱손료: "체인톱손료", P_MO연료지역: "연료단가", P_LB직종: "조종원노임", Q_기계조종원: "조종원", Q_덤프트럭: "조종원", Q_시간환산: "환산", "Q_분자^표": "환산분자", "Q_분모^표": "환산분모", "Q_분자2^표": "상여분자", "Q_분모2^표": "상여분모", "Q_분자3^표": "휴지분자", "Q_분모3^표": "휴지분모", "Q_주연료^표": "휘발유량", "Q_주연료2^표": "오일량", "Q_잡^표": "잡품", S_기계: "기계", S_지역: "지역", S_보정작업: "보정작업", S_보정기종: "보정기종", S_브레이커: "브레이커", S_집게: "집게", S_연료: "연료", S_직종: "직종", S_조종원직종: "조종원직종", S_전력계약종별: "전력계약", k_기계상각비: "상각", k_기계정비비: "정비", k_기계관리비: "관리", k_기계손료: "계수", k_덤프트럭: "상각", k_덤프트럭2: "정비", k_덤프트럭3: "관리", k_브레이커상각: "브레이커상각", k_브레이커정비: "브레이커정비", k_브레이커관리: "브레이커관리", k_집게상각비: "집게상각", k_집게정비비: "집게정비", k_집게관리비: "집게관리", k_체인톱: "체인톱계수", r_가산: "가산", "r_가산^표": "가산표", r_기계잡재료: "잡품", r_덤프트럭: "잡품", r_비율: "연료비율", r_조합잡재료: "조합잡품", w_기계운전사: "운전사", w_일반기계운전: "운전사", w_화물차운전사: "운전사", }; /** 기계 한 줄 칸 이름 → 화면 이름(기계 제어 구역 값 칸 이름표) */ const CELL: Record = { 가격: "가격", 상각비계수: "상각", 정비비계수: "정비", 관리비계수: "관리", 주연료종류: "연료", 손료계수: "계수", 주연료: "주연료", 전력: "전력", 조종원: "조종원", 잡재료율: "잡품", 인력: "인력", 잡품: "잡품", 노무비: "시간노무", 재료비: "시간재료", 경비: "시간경비", }; /** 「P_EQ기계…」 차례 이름 — 그 기호 개수로 문서 꼴을 앎(셋 = 시간당 값 · 다섯 = 연료 · 전력 · 여섯 = 조종원도) · 칸 연결이 직접 입력으로 바뀌어도 같음 */ const SLOTS: Record = { 3: ["시간노무", "시간재료", "시간경비"], 5: ["가격", "계수", "주연료", "전력", "잡품"], 6: ["가격", "계수", "주연료", "전력", "조종원", "잡품"], }; /** 기계경비식 문서의 기호 → 화면 이름(이름 없는 · 겹치는 기호는 빠짐) */ export function machineAlias(doc: FormulaDoc): Record { if (doc.부품?.갈래 !== "기계경비식") return {}; const ids = symbols(doc); const slot = SLOTS[ids.filter((x) => x.startsWith("P_EQ기계")).length] ?? []; const row = (id: string): string | undefined => { const m = /^(?:w_조종원|P_잡품)(\d+)$/.exec(id); // 842-3 인력 · 잡품 줄마다 return m ? `${id.startsWith("w_") ? "인력" : "잡품"}${m[1]}` : undefined; }; const want = (id: string): string | undefined => NAME[id] ?? row(id) ?? (id.startsWith("P_EQ기계") ? slot[Number(id.slice(6) || 1) - 1] : undefined); const count = new Map(); const plain = new Set(ids); for (const id of ids) { const n = want(id); if (n) count.set(n, (count.get(n) ?? 0) + 1); } const out: Record = {}; for (const id of ids) { const n = want(id); // 겹침(같은 이름 둘 · 안 바뀌는 다른 기호가 이미 그 이름) = 그 기호는 그대로 if (n && count.get(n) === 1 && !(plain.has(n) && !want(n))) out[id] = n; } return out; } /** 기계 칸 이름(상각비계수 …) → 짧은 이름 · 없으면 그대로 — 기계 제어 구역(836-1) 값 칸 이름표 */ export const machineCellName = (col: string): string => CELL[col] ?? col; /** 겹분수 중간 줄 이름(845-2 · `splitFrac` ③) — 손료 식 분자 안 「(상각 + 정비) × (1 + 가산 ÷ 100) + 관리」 */ const PART: Record = { C_손료: "손료계수" }; export const partName = (id: string): string | undefined => PART[id];