Merge remote-tracking branches 'origin/main_laptop_1', 'origin/sub_laptop_7' and 'origin/sub_laptop_8' into sub_laptop_6
This commit is contained in:
@@ -3,7 +3,8 @@
|
||||
* B09 대가 탭 둘(PLAN 145-2) — 일위대가목록표 · 일위대가표(실무 엑셀 꼴 · 값 = `B09_Estimation_Calc_Labor`).
|
||||
*
|
||||
* 목록표 = 호표 한 줄(합계 · 노무비 · 재료비 · 경비) · 줄 누름 = 그 블록으로
|
||||
* 일위대가표 = 블록(머리 · [품셈 인용] · 줄 · 합계) · 줄 누름 = 단가를 낸 탭 · 줄(대가 줄 = 그 블록)
|
||||
* 일위대가표 = 공용 일위대가 격자(704-3 · `ui_template_hopyo_grid` · 머리 · [품셈 인용] · 줄 · 합계 · 줄 꼬리표) ·
|
||||
* 줄 누름 = 단가를 낸 탭 · 줄(대가 줄 = 그 블록)
|
||||
* 줄 꼴(155-2) = 머리 · 합계 굵게(`is-title`) · 인용 · 줄 = 들여쓰기 「ㄴ」(2단 · 겹 대가는 안 펼침)
|
||||
* 연결된 구조물 조합 사본이 없으면 빈 표 「연결 없음」
|
||||
* 빈 줄(166-6) = 합계 = 아는 줄 합 · 옆 「빈 줄 n」 · 풍선 = 빈 줄 이름 · 내역 단가엔 안 넘김
|
||||
@@ -14,7 +15,6 @@ import type { Row } from "./B09_Estimation_Calc_Base";
|
||||
import {
|
||||
blockLevel,
|
||||
money,
|
||||
qty,
|
||||
text,
|
||||
type Link,
|
||||
type TabBuild,
|
||||
@@ -22,11 +22,10 @@ import {
|
||||
type TabTable,
|
||||
} from "./B09_Estimation_UI_Tabs";
|
||||
import { raw } from "./B09_Estimation_UI_Tabs_Sangeun";
|
||||
import { HOPYO_TAG, hopyoCellClass, hopyoGrid } from "@ui/ui_template_hopyo_grid";
|
||||
|
||||
const EMPTY =
|
||||
"연결 없음 — 연결된 구조물 조합 사본(일위대가)이 없음 · B05 · B06 에서 조합을 고르고 [저장]";
|
||||
/** 하위 줄 앞 — 들여쓰기 + 「ㄴ」(공용 표가 앞 빈칸을 접지 않음) */
|
||||
const CHILD = "ㄴ "; // 들여쓰기 = 공용 표 level(201-1)
|
||||
const BLANK = "빈 줄은 금액을 모르는 줄(합계는 아는 줄만)";
|
||||
/** 「빈 줄 n」 작은 글 · 풍선 = 빈 줄 이름 */
|
||||
const blankNote = (b: Row): string => (b.blank ? `빈 줄 ${b.blank}` : "");
|
||||
@@ -78,82 +77,48 @@ export const buildDaegaList: TabBuild = ({ sheets }): TabTable | string => {
|
||||
export const buildDaegaBlocks: TabBuild = ({ sheets }): TabTable | string => {
|
||||
const blocks: Row[] = sheets.daega_blocks || [];
|
||||
if (!blocks.length) return EMPTY;
|
||||
const rows: DataRow[] = [];
|
||||
const links: Array<Link | null> = [];
|
||||
const titles = new Set<number>();
|
||||
for (const b of blocks) {
|
||||
titles.add(rows.length);
|
||||
rows.push({
|
||||
// 704-3 — 공용 일위대가 격자(M02 카드 · 상세와 같은 열 · 줄 꼴) · 값 = 서버 `Calc_Labor` 그대로
|
||||
const grid = hopyoGrid(
|
||||
blocks.map((b) => ({
|
||||
key: b.id,
|
||||
name: `제 ${b.no} 호표 ${b.name}`,
|
||||
no: b.no,
|
||||
title: b.name, // 171-3 묶음 카드 머리
|
||||
name: b.name,
|
||||
spec: b.spec,
|
||||
spec_raw: b.spec_raw,
|
||||
unit: b.unit,
|
||||
note: b.kind,
|
||||
});
|
||||
links.push(null);
|
||||
if (b.cite) {
|
||||
rows.push({ key: `${b.id}|cite`, name: `${CHILD}${b.cite}`, note: "품셈 인용" });
|
||||
links.push(null);
|
||||
}
|
||||
b.lines.forEach((ln: Row, n: number) => {
|
||||
rows.push({
|
||||
key: `${b.id}|${n}`,
|
||||
name: `${CHILD}${ln.name || ""}`,
|
||||
kind: b.kind,
|
||||
cite: b.cite,
|
||||
total: { sum: b.sum, labor: b.labor, material: b.material, expense: b.expense },
|
||||
blank: b.blank ?? 0,
|
||||
blank_names: b.blank_names ?? [],
|
||||
lines: b.lines.map((ln: Row) => ({
|
||||
name: ln.name || "",
|
||||
spec: ln.spec || "",
|
||||
spec_raw: ln.spec_raw,
|
||||
qty: ln.qty,
|
||||
unit: ln.unit || "",
|
||||
sum_price: ln.price,
|
||||
sum: ln.amount,
|
||||
labor_price: ln.prices.labor,
|
||||
labor: ln.amounts.labor,
|
||||
material_price: ln.prices.material,
|
||||
material: ln.amounts.material,
|
||||
expense_price: ln.prices.expense,
|
||||
expense: ln.amounts.expense,
|
||||
prices: { sum: ln.price, ...ln.prices },
|
||||
amounts: { sum: ln.amount, ...ln.amounts },
|
||||
note: ln.ref_no || ln.why || "",
|
||||
});
|
||||
const tab = LINE_TAB[ln.kind];
|
||||
links.push(tab && ln.key ? { tab, key: String(ln.key) } : null);
|
||||
});
|
||||
titles.add(rows.length);
|
||||
rows.push({
|
||||
key: `${b.id}|합계`,
|
||||
name: "합 계",
|
||||
sum: b.sum,
|
||||
labor: b.labor,
|
||||
material: b.material,
|
||||
expense: b.expense,
|
||||
note: blankNote(b),
|
||||
blank: b.blank,
|
||||
blank_names: b.blank_names,
|
||||
});
|
||||
links.push(null);
|
||||
}
|
||||
const pair = (key: string, label: string) => [
|
||||
money(`${key}_price`, "단가", [label], 1),
|
||||
money(key, "금액", [label], 1),
|
||||
];
|
||||
tag: HOPYO_TAG.pum,
|
||||
})),
|
||||
})),
|
||||
);
|
||||
const { rows, titles } = grid;
|
||||
const links: Array<Link | null> = rows.map((_, i) => {
|
||||
const at = grid.at.get(i);
|
||||
const ln: Row | undefined = at && blocks[at[0]].lines[at[1]];
|
||||
const tab = ln && LINE_TAB[ln.kind];
|
||||
return tab && ln.key ? { tab, key: String(ln.key) } : null;
|
||||
});
|
||||
return {
|
||||
columns: [
|
||||
text("name", "명칭", 240),
|
||||
text("spec", "규격", 160),
|
||||
qty("qty", "수량"),
|
||||
text("unit", "단위", 56),
|
||||
...pair("sum", "합계"),
|
||||
...pair("labor", "노무비"),
|
||||
...pair("material", "재료비"),
|
||||
...pair("expense", "경비"),
|
||||
text("note", "비고", 120),
|
||||
],
|
||||
columns: grid.columns,
|
||||
rows,
|
||||
frozen: 1,
|
||||
hint: `줄을 누르면 단가를 낸 탭으로 이동 · ${BLANK}`,
|
||||
link: (i: number) => links[i] ?? null,
|
||||
rowClass: (i: number) => (titles.has(i) ? "is-title" : null),
|
||||
cellClass: (i: number, key: string) => hopyoCellClass(rows, i, key),
|
||||
level: blockLevel("name", (i) => titles.has(i)),
|
||||
tip: (i: number, key: string) =>
|
||||
key === "spec"
|
||||
|
||||
Reference in New Issue
Block a user