98 lines
2.7 KiB
TypeScript
98 lines
2.7 KiB
TypeScript
import {
|
|
ELAPR_APLN_SAVE_MODE,
|
|
type ElaprApln,
|
|
type ElaprAplnSaveRequest,
|
|
} from "../model/elapr-apln-interface";
|
|
import type { ElaprAplnRow } from "../model/elapr-apln-row-types";
|
|
|
|
import { getVisibleRows } from "./apln-validators";
|
|
|
|
/** 그리드 행 순서(1-based)로 결재순서번호 일괄 채번 */
|
|
export function assignAtrzSeqNumbers(rows: ElaprAplnRow[]): ElaprAplnRow[] {
|
|
return rows.map((row, index) => ({ ...row, atrzSeqNo: index + 1 }));
|
|
}
|
|
|
|
function rowDiffersFromServer(row: ElaprAplnRow, serverRow: ElaprApln): boolean {
|
|
return (
|
|
row.aprvrUuid !== serverRow.aprvrUuid ||
|
|
row.atrzSeComCd !== serverRow.atrzSeComCd ||
|
|
row.atrzSeqNo !== serverRow.atrzSeqNo
|
|
);
|
|
}
|
|
|
|
function shouldIncludeUpdate(row: ElaprAplnRow, serverRows: ElaprApln[]): boolean {
|
|
if (row.isDirty) return true;
|
|
if (!row.aplnId) return false;
|
|
|
|
const serverRow = serverRows.find((s) => s.aplnId === row.aplnId);
|
|
if (!serverRow) return false;
|
|
|
|
return rowDiffersFromServer(row, serverRow);
|
|
}
|
|
|
|
export function hasUnsavedChanges(rows: ElaprAplnRow[], serverRows: ElaprApln[]): boolean {
|
|
if (rows.some((row) => row.isDeleted && row.aplnId)) return true;
|
|
if (rows.some((row) => row.isNew && !row.isDeleted)) return true;
|
|
|
|
const visibleWithSeq = assignAtrzSeqNumbers(getVisibleRows(rows));
|
|
|
|
for (const row of visibleWithSeq) {
|
|
if (row.isNew) continue;
|
|
if (!row.aplnId) continue;
|
|
if (row.isDirty) return true;
|
|
|
|
const serverRow = serverRows.find((s) => s.aplnId === row.aplnId);
|
|
if (!serverRow) continue;
|
|
if (rowDiffersFromServer(row, serverRow)) return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
export function buildSaveMultiPayload(
|
|
rows: ElaprAplnRow[],
|
|
elaprTmpltId: string,
|
|
serverRows: ElaprApln[],
|
|
): ElaprAplnSaveRequest[] {
|
|
const payload: ElaprAplnSaveRequest[] = [];
|
|
|
|
for (const row of rows) {
|
|
if (row.isDeleted && row.aplnId) {
|
|
payload.push({
|
|
mode: ELAPR_APLN_SAVE_MODE.DELETE,
|
|
aplnId: row.aplnId,
|
|
});
|
|
}
|
|
}
|
|
|
|
const visibleWithSeq = assignAtrzSeqNumbers(getVisibleRows(rows));
|
|
|
|
for (const row of visibleWithSeq) {
|
|
if (row.isNew) {
|
|
payload.push({
|
|
mode: ELAPR_APLN_SAVE_MODE.CREATE,
|
|
elaprTmpltId,
|
|
aprvrUuid: row.aprvrUuid,
|
|
atrzSeComCd: row.atrzSeComCd,
|
|
atrzSeqNo: row.atrzSeqNo,
|
|
});
|
|
continue;
|
|
}
|
|
|
|
if (!row.aplnId) continue;
|
|
|
|
if (shouldIncludeUpdate(row, serverRows)) {
|
|
payload.push({
|
|
mode: ELAPR_APLN_SAVE_MODE.UPDATE,
|
|
aplnId: row.aplnId,
|
|
elaprTmpltId,
|
|
aprvrUuid: row.aprvrUuid,
|
|
atrzSeComCd: row.atrzSeComCd,
|
|
atrzSeqNo: row.atrzSeqNo,
|
|
});
|
|
}
|
|
}
|
|
|
|
return payload;
|
|
}
|