export function isWorkOrderCanceled(status: string | null | undefined): boolean { return status === "Canceled" || status === "Cancelled"; } export function isWorkOrderCompleted(status: string | null | undefined): boolean { return status === "Completed" || status === "Done"; } export function isWorkOrderCoreLocked(status: string | null | undefined): boolean { return isWorkOrderCompleted(status); } export function isWorkOrderFullyLocked(status: string | null | undefined): boolean { return isWorkOrderCanceled(status); } export function canMutateWorkOrderFlag(status: string | null | undefined): boolean { return !isWorkOrderFullyLocked(status); } export function canMutateWorkOrderComments(status: string | null | undefined): boolean { return !isWorkOrderFullyLocked(status); } export function canMutateWorkOrderExtraDocs(status: string | null | undefined): boolean { return !isWorkOrderFullyLocked(status); } const COMPLETED_BOARD_PATCH_KEYS = new Set(["flagColor"]); /** * Board PATCH policy for Completed: only `flagColor`. Comments and Extra Docs use * dedicated endpoints (`canMutateWorkOrderComments` / `canMutateWorkOrderExtraDocs`). */ export function canApplyWorkOrderTablePatch( status: string | null | undefined, patch: Record, ): boolean { if (isWorkOrderFullyLocked(status)) { return false; } if (!isWorkOrderCoreLocked(status)) { return true; } const keys = Object.keys(patch); return keys.length > 0 && keys.every((key) => COMPLETED_BOARD_PATCH_KEYS.has(key)); } /** Completion document / completion-media surface — not Extra Docs or comments. */ export function isWorkOrderCompletionSurfaceReadOnly(status: string | null | undefined): boolean { return isWorkOrderFullyLocked(status) || isWorkOrderCoreLocked(status); }