diff --git a/src/app/(protected)/vendors/_components/use-vendor-roster-form.ts b/src/app/(protected)/vendors/_components/use-vendor-roster-form.ts index f6ea637a..b4c3a51f 100644 --- a/src/app/(protected)/vendors/_components/use-vendor-roster-form.ts +++ b/src/app/(protected)/vendors/_components/use-vendor-roster-form.ts @@ -20,6 +20,24 @@ import type { VendorRosterConflict, } from "@/domain/vendors/types/vendor"; +function withoutBlankNewTechnicians( + values: VendorCompanyRosterFormValues, +): VendorCompanyRosterFormValues { + return { + ...values, + technicians: values.technicians.filter( + (technician) => + technician.id != null || + Boolean( + technician.contactName.trim() || + technician.phone.trim() || + technician.email.trim() || + technician.tradeSpecialties.trim(), + ), + ), + }; +} + export interface VendorRosterFormProps { mode: "create" | "update"; vendorId?: string | number; @@ -109,7 +127,7 @@ export function useVendorRosterForm({ save.mutate( { mode: isUpdate ? "update" : "create", - values: formValues, + values: withoutBlankNewTechnicians(formValues), companyId: isUpdate ? (committedRoster?.companyId ?? companyId) : undefined, rowVersion: isUpdate ? committedRoster?.rowVersion : undefined, originalRoster: mode === "update" ? routeRoster : undefined, diff --git a/src/domain/work-orders/mappers/work-order-uplift-mapper.ts b/src/domain/work-orders/mappers/work-order-uplift-mapper.ts index a4e9f32f..ec712467 100644 --- a/src/domain/work-orders/mappers/work-order-uplift-mapper.ts +++ b/src/domain/work-orders/mappers/work-order-uplift-mapper.ts @@ -88,7 +88,8 @@ function normalizeUpliftStatus(raw: string): WorkOrderUpliftStatus { export function mapUpliftSummary(raw: unknown): UpliftSummary { const item = asRecord(raw); const nested = asRecord(item.upliftSummary ?? item.UpliftSummary); - const source = Object.keys(nested).length > 0 ? nested : item; + const hasNested = Object.keys(nested).length > 0; + const source = hasNested ? nested : item; const pendingCount = readNumber(source, "pendingCount", "PendingCount") ?? @@ -99,8 +100,13 @@ export function mapUpliftSummary(raw: unknown): UpliftSummary { readBool(item, "hasUplift", "HasUplift") || pendingCount > 0; - const primaryStatusRaw = readString(source, "primaryStatus", "PrimaryStatus", "status", "Status"); - const amount = readNumber(source, "amount", "Amount"); + // Never treat the work-order lifecycle status/Status as uplift primaryStatus. + const primaryStatusRaw = hasNested + ? readString(source, "primaryStatus", "PrimaryStatus", "status", "Status") + : readString(item, "primaryStatus", "PrimaryStatus"); + const amount = hasNested + ? readNumber(source, "amount", "Amount") + : readNumber(item, "amount", "Amount"); const summary: UpliftSummary = { hasUplift, diff --git a/src/domain/work-orders/utils/uplift-display-utils.ts b/src/domain/work-orders/utils/uplift-display-utils.ts index 431f74c1..49c9da15 100644 --- a/src/domain/work-orders/utils/uplift-display-utils.ts +++ b/src/domain/work-orders/utils/uplift-display-utils.ts @@ -30,6 +30,9 @@ export function formatUpliftStatusLabel(status: WorkOrderUpliftStatus): string { } export function getUpliftCellLabel(summary: UpliftSummary): string | null { + if (!summary.hasUplift && summary.pendingCount <= 0) { + return null; + } if (summary.pendingCount > 0) { return summary.pendingCount === 1 ? "1 Pending" : `${summary.pendingCount} Pending`; } diff --git a/src/test/domain/work-orders/mappers/work-order-uplift-mapper.test.ts b/src/test/domain/work-orders/mappers/work-order-uplift-mapper.test.ts index 9eb56502..d765c4d5 100644 --- a/src/test/domain/work-orders/mappers/work-order-uplift-mapper.test.ts +++ b/src/test/domain/work-orders/mappers/work-order-uplift-mapper.test.ts @@ -37,6 +37,18 @@ describe("mapUpliftSummary", () => { expect(result.pendingCount).toBe(1); }); + it("does not treat work-order status as uplift primaryStatus when nested summary is absent", () => { + const result = mapUpliftSummary({ + status: "Cancelled", + Status: "Cancelled", + hasUplift: false, + }); + + expect(result.hasUplift).toBe(false); + expect(result.primaryStatus).toBeUndefined(); + expect(getUpliftCellLabel(result)).toBeNull(); + }); + it("normalizes auto-approved and canceled status aliases", () => { expect(mapUpliftSummary({ primaryStatus: "AutoApproved" }).primaryStatus).toBe("auto_approved"); expect(mapWorkOrderUplift({ status: "Canceled" }).status).toBe("cancelled"); @@ -69,4 +81,21 @@ describe("uplift display utils", () => { }), ).toBe("Approved $1,200"); }); + + it("hides Pending/Cancelled when hasUplift is false", () => { + expect( + getUpliftCellLabel({ + hasUplift: false, + pendingCount: 0, + primaryStatus: "pending", + }), + ).toBeNull(); + expect( + getUpliftCellLabel({ + hasUplift: false, + pendingCount: 0, + primaryStatus: "cancelled", + }), + ).toBeNull(); + }); });