diff --git a/src/domain/work-orders/mappers/work-order-board-patch-mapper.ts b/src/domain/work-orders/mappers/work-order-board-patch-mapper.ts index c3e55a58..87d68f25 100644 --- a/src/domain/work-orders/mappers/work-order-board-patch-mapper.ts +++ b/src/domain/work-orders/mappers/work-order-board-patch-mapper.ts @@ -42,6 +42,7 @@ const LOCAL_ONLY_KEYS = new Set([ "originalDate", /** Optimistic overlay only — backend owns isAddOn after schedule ops (SH-184). */ "isAddOn", + "primaryDispatchStatus", ]); export function isLocalOnlyTablePatch(patch: WorkOrderTablePatch): boolean { diff --git a/src/test/domain/work-orders/mappers/work-order-board-patch-mapper.test.ts b/src/test/domain/work-orders/mappers/work-order-board-patch-mapper.test.ts index f26d13fe..8e728756 100644 --- a/src/test/domain/work-orders/mappers/work-order-board-patch-mapper.test.ts +++ b/src/test/domain/work-orders/mappers/work-order-board-patch-mapper.test.ts @@ -5,6 +5,7 @@ import { isLocalOnlyTablePatch, mapDocStatusToApi, } from "@/domain/work-orders/mappers/work-order-board-patch-mapper"; +import { toVendorTablePatch } from "@/domain/work-orders/utils/vendor-assignment-patch"; describe("mapDocStatusToApi", () => { it("maps NN to NotNeeded", () => { @@ -25,6 +26,10 @@ describe("isLocalOnlyTablePatch", () => { it("does not treat site as local-only", () => { expect(isLocalOnlyTablePatch({ site: "BK5" })).toBe(false); }); + + it("treats primaryDispatchStatus overlay as local-only", () => { + expect(isLocalOnlyTablePatch({ primaryDispatchStatus: "" })).toBe(true); + }); }); describe("expandTablePatchToBoardFieldOps", () => { @@ -136,6 +141,17 @@ describe("expandTablePatchToBoardFieldOps", () => { }), ).toEqual([{ field: "vendorId", value: "7" }]); + expect( + expandTablePatchToBoardFieldOps( + toVendorTablePatch({ + vendorId: "9", + company: "New Co", + tech: "Pat", + techPhone: "555", + }), + ), + ).toEqual([{ field: "vendorId", value: "9" }]); + expect( expandTablePatchToBoardFieldOps({ site: "BK5", diff --git a/src/test/domain/work-orders/utils/wo-closability.test.ts b/src/test/domain/work-orders/utils/wo-closability.test.ts index 240ed796..9d97358d 100644 --- a/src/test/domain/work-orders/utils/wo-closability.test.ts +++ b/src/test/domain/work-orders/utils/wo-closability.test.ts @@ -449,6 +449,30 @@ describe("tableRowToClosabilityInput", () => { }); expect(getClosabilityGaps(input)).toEqual([]); }); + + it.each(["Pending", "Sent"] as const)( + "keeps company assignment after vendor save when primary dispatch status is %s", + (primaryDispatchStatus) => { + const input = tableRowToClosabilityInput({ + ...closableRow, + company: "New Co", + vendorId: "9", + primaryDispatchStatus, + }); + expect(input.vendorId).toBe("9"); + expect(getClosabilityGaps(input)).not.toContain("Company"); + }, + ); + + it("raises Company when leftover Refused remains on the patched vendor id", () => { + const input = tableRowToClosabilityInput({ + ...closableRow, + company: "New Co", + vendorId: "9", + primaryDispatchStatus: "Refused", + }); + expect(getClosabilityGaps(input)).toContain("Company"); + }); }); describe("readDetailWoType", () => {