From c6af2b34b272186f9a24fa6884e8cc76d795c820 Mon Sep 17 00:00:00 2001 From: Dave Date: Tue, 5 May 2026 13:41:50 -0400 Subject: [PATCH] feature/IO-3676-Order-As-In-House-Quantity - Fix --- .../job-detail-lines/job-lines.component.jsx | 12 ++----- .../job-lines.in-house-bill-lines.utils.js | 11 +++++++ ...ob-lines.in-house-bill-lines.utils.test.js | 33 +++++++++++++++++++ 3 files changed, 46 insertions(+), 10 deletions(-) create mode 100644 client/src/components/job-detail-lines/job-lines.in-house-bill-lines.utils.js create mode 100644 client/src/components/job-detail-lines/job-lines.in-house-bill-lines.utils.test.js diff --git a/client/src/components/job-detail-lines/job-lines.component.jsx b/client/src/components/job-detail-lines/job-lines.component.jsx index 16a3d6c87..7e3ce8b85 100644 --- a/client/src/components/job-detail-lines/job-lines.component.jsx +++ b/client/src/components/job-detail-lines/job-lines.component.jsx @@ -44,6 +44,7 @@ import JoblineTeamAssignment from "../job-line-team-assignment/job-line-team-ass import JobSendPartPriceChangeComponent from "../job-send-parts-price-change/job-send-parts-price-change.component"; import PartsOrderDrawer from "../parts-order-list-table/parts-order-list-table-drawer.component"; import PartsOrderModalContainer from "../parts-order-modal/parts-order-modal.container"; +import { buildInHouseBillLines } from "./job-lines.in-house-bill-lines.utils"; import JobLinesExpander from "./job-lines-expander.component"; import JobLinesPartPriceChange from "./job-lines-part-price-change.component"; import JobLinesExpanderSimple from "./jobs-lines-expander-simple.component"; @@ -595,16 +596,7 @@ export function JobLinesComponent({ isinhouse: true, date: dayjs(), total: 0, - billlines: selectedLines.map((p) => ({ - joblineid: p.id, - actual_price: p.act_price, - actual_cost: 0, - line_desc: p.line_desc, - line_remarks: p.line_remarks, - part_type: p.part_type, - quantity: p.quantity || 1, - applicable_taxes: { local: false, state: false, federal: false } - })) + billlines: buildInHouseBillLines(selectedLines) } } }); diff --git a/client/src/components/job-detail-lines/job-lines.in-house-bill-lines.utils.js b/client/src/components/job-detail-lines/job-lines.in-house-bill-lines.utils.js new file mode 100644 index 000000000..8a75d1755 --- /dev/null +++ b/client/src/components/job-detail-lines/job-lines.in-house-bill-lines.utils.js @@ -0,0 +1,11 @@ +export const buildInHouseBillLines = (lines) => + lines.map((line) => ({ + joblineid: line.id, + actual_price: line.act_price, + actual_cost: 0, + line_desc: line.line_desc, + line_remarks: line.line_remarks, + part_type: line.part_type, + quantity: line.part_qty ?? line.quantity ?? 1, + applicable_taxes: { local: false, state: false, federal: false } + })); diff --git a/client/src/components/job-detail-lines/job-lines.in-house-bill-lines.utils.test.js b/client/src/components/job-detail-lines/job-lines.in-house-bill-lines.utils.test.js new file mode 100644 index 000000000..27f5f731b --- /dev/null +++ b/client/src/components/job-detail-lines/job-lines.in-house-bill-lines.utils.test.js @@ -0,0 +1,33 @@ +import { describe, expect, it } from "vitest"; +import { buildInHouseBillLines } from "./job-lines.in-house-bill-lines.utils"; + +describe("buildInHouseBillLines", () => { + it("carries job line part quantity into the in-house bill line", () => { + const billLines = buildInHouseBillLines([ + { + id: "job-line-1", + act_price: 125, + line_desc: "Door shell", + line_remarks: "Left", + part_type: "PAA", + part_qty: 3 + } + ]); + + expect(billLines[0]).toMatchObject({ + joblineid: "job-line-1", + actual_price: 125, + actual_cost: 0, + line_desc: "Door shell", + line_remarks: "Left", + part_type: "PAA", + quantity: 3, + applicable_taxes: { local: false, state: false, federal: false } + }); + }); + + it("falls back to legacy quantity and then one when part quantity is absent", () => { + expect(buildInHouseBillLines([{ id: "legacy", quantity: 2 }])[0].quantity).toBe(2); + expect(buildInHouseBillLines([{ id: "missing" }])[0].quantity).toBe(1); + }); +});