From 67c4ee81190b187e81a9d0e888995eb6487819c2 Mon Sep 17 00:00:00 2001 From: "arthur.bassi" Date: Tue, 4 Aug 2026 14:49:16 -0300 Subject: [PATCH] fix(work-orders): only block Completed on evidenced pending uplift Absence of optional uplift fields means no pending, per SH-188. --- src/domain/work-orders/utils/wo-closability.ts | 12 ++---------- .../domain/work-orders/utils/wo-closability.test.ts | 5 ++--- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/src/domain/work-orders/utils/wo-closability.ts b/src/domain/work-orders/utils/wo-closability.ts index 606f9369..24617591 100644 --- a/src/domain/work-orders/utils/wo-closability.ts +++ b/src/domain/work-orders/utils/wo-closability.ts @@ -24,7 +24,6 @@ export type WoClosabilityInput = { }; export const PENDING_UPLIFT_GAP = "Pending uplift approval"; -export const UPLIFT_STATUS_UNAVAILABLE_GAP = "Uplift status unavailable"; /** Design copy when Completed is blocked solely by a pending uplift. */ export const UPLIFT_PENDING_COMPLETED_TITLE = @@ -48,12 +47,6 @@ export function hasPendingUplift( return (row.upliftSummary?.pendingCount ?? 0) > 0; } -function hasKnownUpliftStatus( - row: Pick, -): boolean { - return typeof row.hasPendingUplift === "boolean" || row.upliftSummary != null; -} - function hasDispatcher(row: Pick): boolean { return Boolean(row.dispatcherId.trim() || row.dispatcherName.trim()); } @@ -90,9 +83,8 @@ export function getClosabilityGaps(row: WoClosabilityInput): string[] { gaps.push("Service"); } - if (!hasKnownUpliftStatus(row)) { - gaps.push(UPLIFT_STATUS_UNAVAILABLE_GAP); - } else if (hasPendingUplift(row)) { + // Only an actually pending uplift blocks completion; missing uplift fields mean no pending evidence. + if (hasPendingUplift(row)) { gaps.push(PENDING_UPLIFT_GAP); } 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 079ac992..a55938e7 100644 --- a/src/test/domain/work-orders/utils/wo-closability.test.ts +++ b/src/test/domain/work-orders/utils/wo-closability.test.ts @@ -2,7 +2,6 @@ import { describe, expect, it } from "vitest"; import type { WoClosabilityInput } from "@/domain/work-orders/utils/wo-closability"; import { PENDING_UPLIFT_GAP, - UPLIFT_STATUS_UNAVAILABLE_GAP, UPLIFT_PENDING_COMPLETED_TITLE, canGenerateCompDoc, formatClosabilityMissingTitle, @@ -106,10 +105,10 @@ describe("getClosabilityGaps", () => { expect(getClosabilityGaps(makeInput({ hasPendingUplift: true }))).toEqual([PENDING_UPLIFT_GAP]); }); - it("blocks Completed when the backend does not provide uplift status", () => { + it("allows Completed when uplift status fields are absent (no pending evidence)", () => { expect( getClosabilityGaps(makeInput({ hasPendingUplift: undefined, upliftSummary: undefined })), - ).toEqual([UPLIFT_STATUS_UNAVAILABLE_GAP]); + ).toEqual([]); }); it("requires a photo for Emergency / Reactive", () => {