fix(work-orders): stop uplift column reading WO status; strip blank techs

mapUpliftSummary no longer treats row status as uplift primaryStatus, getUpliftCellLabel hides pills without hasUplift, and vendor submit filters blank new technicians.
This commit is contained in:
arthur.bassi 2026-08-10 19:09:25 -03:00
parent 31c5559d23
commit d5fd6aa5d6
4 changed files with 60 additions and 4 deletions

View file

@ -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,

View file

@ -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,

View file

@ -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`;
}

View file

@ -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();
});
});