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(["vendorId", "apptDate", "apptTime"]); const LOCAL_ONLY_KEYS = new Set([ "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, ): 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; }