diff --git a/src/app/(protected)/workorders/_components/wizard/wizard-step-type-schedule.tsx b/src/app/(protected)/workorders/_components/wizard/wizard-step-type-schedule.tsx index f4df71a3..96f2a62d 100644 --- a/src/app/(protected)/workorders/_components/wizard/wizard-step-type-schedule.tsx +++ b/src/app/(protected)/workorders/_components/wizard/wizard-step-type-schedule.tsx @@ -262,9 +262,23 @@ export function WizardStepTypeSchedule({ { + const typeChanged = t !== draft.type; onPatch({ type: t, severity: nextSeverityForType(draft.type, t, draft.severity), + // A registry service is scoped to its work-order type, so a service picked + // under the previous type fails backend ResolveServiceAsync (SH-187/#131). + // Clear the service (and its vendor, filtered by the service) on a type change. + ...(typeChanged + ? { + pm: "", + serviceId: null, + extraServices: [], + vendorId: "", + vendorName: "", + techPhone: "", + } + : {}), }); }} /> diff --git a/src/test/app/(protected)/workorders/wizard-step-type-schedule-clears-service.test.tsx b/src/test/app/(protected)/workorders/wizard-step-type-schedule-clears-service.test.tsx new file mode 100644 index 00000000..9c9582ee --- /dev/null +++ b/src/test/app/(protected)/workorders/wizard-step-type-schedule-clears-service.test.tsx @@ -0,0 +1,69 @@ +import { fireEvent, render, screen } from "@testing-library/react"; +import { describe, expect, it, vi } from "vitest"; +import { WizardStepTypeSchedule } from "@/app/(protected)/workorders/_components/wizard/wizard-step-type-schedule"; +import { + EMPTY_WIZARD_DRAFT, + type WorkOrderWizardDraft, +} from "@/domain/work-orders/types/work-order-wizard"; + +const USERS = [{ id: "sarah", name: "Sarah Chen" }]; + +describe("WizardStepTypeSchedule — service clear on type change", () => { + it("clears the service and its vendor when the work-order type changes", () => { + const onPatch = vi.fn(); + const draft: WorkOrderWizardDraft = { + ...EMPTY_WIZARD_DRAFT, + type: "PM", + pm: "HVAC", + serviceId: "1", + extraServices: ["Plumbing"], + vendorId: "9", + vendorName: "Old Vendor", + techPhone: "555-0100", + }; + + render( + , + ); + + fireEvent.click(screen.getByRole("button", { name: /Reactive/ })); + + expect(onPatch).toHaveBeenCalledWith( + expect.objectContaining({ + type: "Reactive", + pm: "", + serviceId: null, + extraServices: [], + vendorId: "", + vendorName: "", + techPhone: "", + }), + ); + }); + + it("keeps the selected service when the same type is re-selected", () => { + const onPatch = vi.fn(); + const draft: WorkOrderWizardDraft = { + ...EMPTY_WIZARD_DRAFT, + type: "PM", + pm: "HVAC", + serviceId: "1", + extraServices: ["Plumbing"], + vendorId: "9", + vendorName: "Old Vendor", + techPhone: "555-0100", + }; + + render( + , + ); + + fireEvent.click(screen.getByRole("button", { name: /Scheduled preventive maintenance/ })); + + const patch = onPatch.mock.calls[0][0] as Partial; + expect(patch).not.toHaveProperty("pm"); + expect(patch).not.toHaveProperty("serviceId"); + expect(patch).not.toHaveProperty("extraServices"); + expect(patch).not.toHaveProperty("vendorId"); + }); +});