- Shipped
- August 27, 2026 at 5:02 PM UTC
- Author
- kamo
- Commit
- f51c91e
Restores the rest of SW6c Task 4, which landed as d58a6aba and was dropped by a history rewrite in a concurrent session; the detail page survived inside bddd3617 and has been importing `serviceQuoteWorkOrder` since. `PipelineServiceRequestsTab` calls `GET /service-quotes` instead of `generateMockServiceRequests`. The requester, department, category, priority, SLA, technician and team columns are gone: none has a source on the wire, and a column that renders an em dash forever reads as "nothing recorded" rather than as "this was never real" — how `serviceName`, `serviceId` and `engagementId` survived a whole screen's lifetime before SW6a. Status is `IntentStatus`'s five values, not the fixture's six, and the status buttons are gone with it: they moved a local array and raised a success toast for a write that never left the browser. Create sends exactly one offering and says so. `CreateServiceQuoteRequest` advertises `List<Long> serviceOfferingUids` and the service keeps only `.get(0)`, silently. The New button used to point at **************** which does not exist; it opens a dialog. `marketId` cannot filter this list, so the `data.filter(() => true)` that dressed up as a filter is gone and a caption says every market shows the same rows. `posApi.ServiceQuote` declared `serviceId` and `serviceName` against a DTO sending `serviceOfferingUid` and `serviceOfferingName` — the same defect on the sibling type — and now mirrors `ServiceQuoteDTO`. `WorkOrder`'s phantom members are corrected too, because one of them turns out to be load-bearing: `acceptServiceQuote` answers with the `FulfillmentOrder`, whose uid is not the `ServiceJob`'s, and `engagementUid` is the only thread across. `serviceQuoteWorkOrder.ts` follows it, and its test pins the part that would work on a seeded database and stop in production — `JsSafeLongSerializer` quotes a `Long` by value, so the same field arrives as a string on a 19-digit id and a number on a small one.