From bffb4bbeebae61acaea0a066e9d844a70e099197 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Thu, 1 Oct 2026 09:29:11 +0900 Subject: [PATCH] =?UTF-8?q?feat(m01-easycalc):=20=EC=89=AC=EC=9A=B4=20?= =?UTF-8?q?=EB=8B=A8=EA=B0=80=EC=82=B0=EC=B6=9C=20Model=20=ED=83=80?= =?UTF-8?q?=EC=9E=85=20=C2=B7=20=ED=95=A8=EC=88=98=20=EB=A8=B8=EB=A6=AC=20?= =?UTF-8?q?=EC=98=AC=EB=A6=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 설계.md 3절 CardKind · CostKind · EasyCard · EasyDoc · PickResult 와 함수 머리(속은 준비 중) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01VBToTCGk5dqDKeXCEP3vhk --- M01_MasterData/EasyCalc/M01_EasyCalc_Model.ts | 120 ++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 M01_MasterData/EasyCalc/M01_EasyCalc_Model.ts diff --git a/M01_MasterData/EasyCalc/M01_EasyCalc_Model.ts b/M01_MasterData/EasyCalc/M01_EasyCalc_Model.ts new file mode 100644 index 000000000..6768e03d2 --- /dev/null +++ b/M01_MasterData/EasyCalc/M01_EasyCalc_Model.ts @@ -0,0 +1,120 @@ +/* ============================================================================= + * M01_EasyCalc_Model.ts + * 쉬운 단가산출 Model — 로직 줄(LogicRow) ↔ 카드(EasyDoc · EasyCard) 바꾸기 · 카드 조작 · 검사 · 되돌리기 + * DOM 없음 · 모양은 `docs/raw/M01_쉬운단가/설계.md` 3절 그대로 + * ========================================================================== */ + +import type { LogicInput, LogicRow } from "../M01_MasterData_UI_Logic_Api"; + +export type CardKind = "person" | "material" | "machine" | "logic" | "percent" | "locked"; +export type CostKind = "노무비" | "재료비" | "경비"; + +export interface EasyCard { + /** 화면 번호 · 저장 안 함 */ + id: string; + kind: CardKind; + /** 보이는 이름(호표 · 덧줄 이름) */ + name: string; + /** 크기(규격) · 없으면 "" */ + spec: string; + /** 인 · ㎥ · 시간 · % … */ + unit: string; + /** 숫자 수량 · 식이면 null */ + qty: number | null; + /** 잠금 식(원문 그대로) · 숫자면 null */ + qtyFormula: string | null; + /** 넣을 자리 · 다른 일위대가 · 기계는 null(엔진이 나눔) */ + cost: CostKind | null; + /** 덧붙임 바탕 · 덧붙임 아니면 null */ + percentBase: CostKind | "사람줄합" | null; + /** 호표 「요소」 칸 값 그대로(인력 LB 키 · 재료 검색어 묶음 · 로직 부름 글) */ + element: unknown; + /** 잠금 까닭 쉬운 말 · 아니면 null */ + lockedWhy: string | null; + /** 원래 자리 · 새 카드 null */ + source: { part: "호표" | "덧줄"; index: number } | null; + /** 원래 줄 통째 — 카드가 안 다룬 칸을 저장 때 그대로 살림 */ + raw: unknown; +} + +export interface EasyDoc { + /** 새 로직 null */ + key: string | null; + /** 판본(409 대조) */ + version: string | null; + /** 품셈 기본 = 읽기만 */ + isBase: boolean; + name: string; + spec: string; + /** 결과단위 「원/㎡」 */ + resultUnit: string; + /** 설계 때 정하는 값 */ + inputs: LogicInput[]; + cards: EasyCard[]; + /** 원래 로직 줄(새 로직은 최소 칸 줄) */ + row: LogicRow; +} + +/** 물음 셋 고르기 결과 — Pick 이 가져다 씀 */ +export interface PickResult { + kind: "person" | "material" | "machine" | "logic"; + name: string; + spec: string; + unit: string; + element: unknown; + qty: number | null; + needInputs?: LogicInput[]; +} + +const notReady = (): never => { + throw new Error("준비 중"); +}; + +export function toDoc( + _row: LogicRow, + _meta: { key: string | null; version: string | null; isBase: boolean }, +): EasyDoc { + return notReady(); +} + +export function toRow(_doc: EasyDoc): LogicRow { + return notReady(); +} + +export function addCard(_doc: EasyDoc, _pick: PickResult): EasyDoc { + return notReady(); +} + +export function updateCard(_doc: EasyDoc, _id: string, _patch: Partial): EasyDoc { + return notReady(); +} + +export function removeCard(_doc: EasyDoc, _id: string): EasyDoc { + return notReady(); +} + +export function moveCard(_doc: EasyDoc, _id: string, _step: -1 | 1): EasyDoc { + return notReady(); +} + +export function checkCard(_card: EasyCard, _doc: EasyDoc): string | null { + return notReady(); +} + +export class EasyHistory { + push(_doc: EasyDoc): void { + notReady(); + } + undo(): EasyDoc | null { + return notReady(); + } + get canUndo(): boolean { + return notReady(); + } + get dirty(): boolean { + return notReady(); + } + markSaved(): void { + notReady(); + } +}