- [수정] 모달 = Labor_Table(읽기 · 덧칸 표지 · 엑셀 금액) · 줄 = 로직(단가산출 · 일위대가) / 요소(연결됨 · 후보 · 못 이음) · 단가산출 줄 = 가져온 식 SK 수식 탭 모달(Labor_SkEdit) · 서버 hopyo-view(M02_Hopyo_View) - 엑셀 보기 목록 · 칠 = 줄 표지(View.listing) · 단가산출 탭 = 블록 목록 + [가져온 식으로 열기] · [내 단가산출로] - 걷음(요구 703): 판정 체계 785(Judge · Solve · Bind · San_Basis 다섯 · Make.Move · Row 1차 판정 · 화면 Check · CheckRows · Rows · Block · JudgeApi · Picks · Judge.css) · [우리 기초로 바꾸기](to-base) · 근거 기초 제안 · Clause 기초 판정 - 시험 지움: 642_2(Bind · Solve) · 642_3(Row 1차 판정) · 642_5(옮기기 Move) · 642_6(판정 화면) · 786_2(옛 [수정] 모달) · 793_3a(근거 → 기초 제안) — 모두 걷은 기초 판정 길 몫 - 시험 고침: 642_1 · 794_2a2 · 794_2b(근거 제안 부분만 뺌) · 793_2 · 793_3b(기초 바꾸기 기대 → 없음) · 627 · 779_2 · 785_4 · 807_1 · m02_hopyo_excel · grid · stmate(judge 길 → view 길) - 새 시험 test_809_1_import_labor(기초 길 0 · 표지 1,350 줄 · 가져온 식 SK · 모달 = Labor_Table · 금액 = 엑셀) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
64 lines
2.0 KiB
TypeScript
64 lines
2.0 KiB
TypeScript
/* =============================================================================
|
|
* logic/M02_Hopyo_Imported_Model.ts
|
|
* 불러오기 단산 블록 = 가져온 식 단가산출(PLAN 793-3b · 809-1 · 요구 646 · 702) — 꼴 · 읽기만.
|
|
* · SK `가져온` 덧칸 꼴(793-2 `M02_Sangeun_Imported.py` 머리) · 경쟁사 로직 그대로(기초로 바꾸기 없음 · 요구 703)
|
|
* 화면 · fetch · sessionStorage 없음(`CLAUDE.md` 4장).
|
|
* ========================================================================== */
|
|
|
|
export type Money4 = Record<"노무비" | "재료비" | "경비" | "계", number>;
|
|
|
|
export interface CheckLine {
|
|
자리: string;
|
|
행?: number | null;
|
|
셈?: number | null;
|
|
엑셀?: number | null;
|
|
같음: boolean;
|
|
까닭?: string;
|
|
}
|
|
|
|
/** SK 문서 덧칸 `가져온` */
|
|
export interface ImportedMeta {
|
|
로직?: { 이름?: string; 호표?: { 이름?: string; 이음?: string | null }[] };
|
|
단가기준?: "엑셀" | "우리";
|
|
원본?: {
|
|
파일?: string;
|
|
시트?: string;
|
|
행?: number[];
|
|
갈래?: string;
|
|
엑셀금액?: Money4;
|
|
글줄?: { 행?: number | null; 글?: string; 자리?: string; 값?: number | null }[];
|
|
};
|
|
검산?: {
|
|
같음: boolean;
|
|
까닭?: string | null;
|
|
셈?: Money4 | null;
|
|
엑셀?: Money4;
|
|
줄: CheckLine[];
|
|
};
|
|
}
|
|
|
|
export interface ImportedDoc {
|
|
이름?: string;
|
|
단위?: string;
|
|
입력값?: Record<string, unknown>;
|
|
가져온?: ImportedMeta;
|
|
[k: string]: unknown;
|
|
}
|
|
|
|
/** 가져온 식(경쟁사 로직이 든 SK) */
|
|
export const isImported = (d: ImportedDoc | null | undefined): boolean => !!d?.가져온?.로직;
|
|
|
|
/** 검산 다른 줄 */
|
|
export const wrongLines = (d: ImportedDoc): CheckLine[] =>
|
|
(d.가져온?.검산?.줄 ?? []).filter((x) => !x.같음);
|
|
|
|
/** 금액 차이 글(후 − 전) */
|
|
export function gapText(
|
|
before: Money4 | null | undefined,
|
|
after: Money4 | null | undefined,
|
|
): string {
|
|
if (!before || !after) return "—";
|
|
const d = after.계 - before.계;
|
|
return `${d > 0 ? "+" : ""}${d.toLocaleString("ko-KR")}`;
|
|
}
|