shoc-frontend-new/src/domain/work-orders/mappers/work-order-board-patch-mapper.ts
Arthur Bassi 8a2bc21845 fix(work-orders): sync addon-indicator with platform-polish parent
[recover] remove malicious eslint payload (was 692598b7)
2026-08-11 15:08:27 -03:00

92 lines
2.5 KiB
TypeScript

import type {
WorkOrderBoardEditableField,
WorkOrderBoardPatchPayload,
} from "@/domain/work-orders/types/work-order-board";
import type {
WorkOrderTablePatch,
WorkOrderTableRow,
} from "@/domain/work-orders/types/work-order-table-row";
import {
expandScalarBoardOps,
mapDocStatusToApi,
type BoardFieldOp,
} from "@/domain/work-orders/mappers/expand-scalar-board-ops";
import { expandScheduleBoardOps } from "@/domain/work-orders/mappers/expand-schedule-board-ops";
export type { BoardFieldOp };
export { mapDocStatusToApi };
const DISPATCH_FIELDS = new Set<WorkOrderBoardEditableField>(["vendorId", "apptDate", "apptTime"]);
const LOCAL_ONLY_KEYS = new Set<keyof WorkOrderTablePatch>([
"mediaCount",
"dayGroup",
"dayLabel",
"dispatcherName",
"company",
"tech",
"techPhone",
"location",
"locationId",
"pocName",
"pocPhone",
"pocNotes",
"title",
"priority",
"apptStart",
"apptEnd",
"rescheduleCount",
"carriedOver",
"isPastDue",
"originalWeek",
"originalDate",
/** Optimistic overlay only — backend owns isAddOn after schedule ops (SH-184). */
"isAddOn",
]);
export function isLocalOnlyTablePatch(patch: WorkOrderTablePatch): boolean {
const keys = Object.keys(patch) as (keyof WorkOrderTablePatch)[];
return keys.length > 0 && keys.every((key) => LOCAL_ONLY_KEYS.has(key));
}
/**
* Expands a UI table patch into ordered board field ops (one PATCH each).
* Schedule/week-only fields are emitted first in a stable order.
*/
export function expandTablePatchToBoardFieldOps(patch: WorkOrderTablePatch): BoardFieldOp[] {
if (isLocalOnlyTablePatch(patch)) {
return [];
}
return [...expandScheduleBoardOps(patch), ...expandScalarBoardOps(patch)];
}
export function isDispatchBoardField(field: WorkOrderBoardEditableField): boolean {
return DISPATCH_FIELDS.has(field);
}
export function buildBoardPatchPayload(
op: BoardFieldOp,
row: Pick<WorkOrderTableRow, "rowVersion" | "dispatchRowVersion" | "primaryDispatchId">,
): WorkOrderBoardPatchPayload {
if (!row.rowVersion) {
throw new Error("workOrderVersion is required for board patch");
}
const payload: WorkOrderBoardPatchPayload = {
field: op.field,
value: op.value,
workOrderVersion: row.rowVersion,
};
if (isDispatchBoardField(op.field)) {
if (row.dispatchRowVersion) {
payload.dispatchVersion = row.dispatchRowVersion;
}
if (row.primaryDispatchId != null) {
payload.primaryDispatchId = row.primaryDispatchId;
}
}
return payload;
}