feat(est): add document and exchange workflows

This commit is contained in:
2026-11-06 15:13:29 +09:00
parent 74ab66b00e
commit a5157dd3a9
27 changed files with 8131 additions and 26 deletions
+139
View File
@@ -0,0 +1,139 @@
const EstForms = (() => {
const common = ["Code", "Name", "Size", "Unite"];
function data(id, project) {
if (id === 109)
return {
columns: ["Code", "Name", "start", "end", "weight", "progress"],
rows: EstSchedule.calculate(project).rows,
};
const table = {
1: "EstMainDat",
117: "EstMainDat",
2: "HeadMainDat",
115: "HeadMainDat",
3: "CostMainDat",
4: "MachMainDat",
119: "MachGijunDat",
101: "EstiMateDat",
21: "SilJukDat",
5: "StuffcDat",
6: "LaborcDat",
7: "Wonga",
22: "Wonga",
}[id];
if (table) {
const columns =
table === "Wonga"
? ["Gubun", "Name", "Youl", "VSusic", "Cost"]
: table === "CostMainDat"
? ["Code", "LineData"]
: table === "HeadMainDat"
? [...common, "GN", "NU", "GU", "JU", "SU", "TC"]
: [...common, "GN", "TU", "TC", "NC", "GC", "JC", "SC"];
return { table, columns, rows: project.tables[table] || [] };
}
const totals = {
106: "EstMainDat",
118: "EstMainDat",
103: "HeadMainDat",
116: "HeadMainDat",
104: "CostMainDat",
105: "MachMainDat",
}[id];
if (totals) {
const rows =
totals === "EstMainDat"
? (project.tables[totals] || []).filter((r) => Number(r.Level) > 0)
: [...EstNative.groups(project.tables[totals] || []).values()].map((group) => {
const row = { ...group.rows[0] };
const titleTable = {
HeadMainDat: "HeadTitleDat",
CostMainDat: "CostTitleDat",
MachMainDat: "MachTitleDat",
}[totals];
const title = project.tables[titleTable]?.find((item) => item.Code === row.Code);
if (title) return { ...row, ...title };
for (const key of [...EstMath.components, "TC"])
row[key] = group.rows
.slice(1)
.filter((r) => Number(r.CalcIndex || 0) < 2)
.reduce((n, r) => n + EstMath.num(r[key]), 0);
return row;
});
return { table: totals, columns: [...common, "NC", "GC", "JC", "SC", "TC"], rows };
}
if ([107, 108].includes(id))
return {
columns: ["Code", "Name", "originalGN", "GN", "originalTC", "TC", "difference", "status"],
rows: EstBusiness.changes(project),
};
const kinds = {
13: 6,
110: 5,
111: 105,
161: 21,
162: 101,
112: 6,
113: 5,
114: 105,
163: 21,
164: 101,
};
if (kinds[id]) {
const output = EstResources.calculate(project, [112, 113, 114, 163, 164].includes(id));
return {
columns: [
...([112, 113, 114, 163, 164].includes(id) ? ["WorkCode", "WorkName"] : []),
"Code",
"Name",
"Size",
"Unite",
"quantity",
"amount",
],
errors: output.errors,
rows: output.rows.filter((r) => r.kind === kinds[id]),
};
}
if (id === 14)
return {
columns: ["Code", "Name", "formula", "GN", "TargetCode"],
rows: (project.quantitySheets || []).flatMap((sheet) =>
EstQuantity.calculate(sheet).items.map((item) => ({
...item,
Code: sheet.Code,
Name: item.Name || sheet.Name,
})),
),
};
return null;
}
const labels = {
originalGN: "당초 수량",
originalTC: "당초 금액",
difference: "증감",
status: "상태",
quantity: "소요량/시간",
amount: "금액",
start: "시작일",
end: "종료일",
weight: "가중치",
progress: "진도(%)",
WorkCode: "공종 코드",
WorkName: "공종명",
formula: "산식",
TargetCode: "연결 내역",
TU: "단가",
TC: "금액",
NC: "노무비",
GC: "재료비",
JC: "경비",
SC: "산출경비",
};
function grid(output) {
const { esc } = EstApp,
number = (v) => new Intl.NumberFormat("ko-KR", { maximumFractionDigits: 12 }).format(v);
return `<table><thead><tr>${output.columns.map((key) => `<th>${esc(labels[key] || EstModel.labels[key] || key)}</th>`).join("")}</tr></thead><tbody>${output.rows.map((row) => `<tr>${output.columns.map((key) => `<td class="${typeof row[key] === "number" ? "numeric" : ""}">${esc(typeof row[key] === "number" ? number(row[key]) : key === "LineData" ? EstText.clean(row[key] || "") : (row[key] ?? ""))}</td>`).join("")}</tr>`).join("")}</tbody></table>`;
}
return { data, grid };
})();