diff --git a/client/src/components/parts-order-modal/parts-order-modal.container.jsx b/client/src/components/parts-order-modal/parts-order-modal.container.jsx index 9c9ccb633..e60ea5d6e 100644 --- a/client/src/components/parts-order-modal/parts-order-modal.container.jsx +++ b/client/src/components/parts-order-modal/parts-order-modal.container.jsx @@ -82,29 +82,40 @@ export function PartsOrderModalContainer({ setSaving(true); let insertResult; - insertResult = await insertPartOrder({ - variables: { - po: [ - { - ...values, - order_date: dayjs().format("YYYY-MM-DD"), - orderedby: currentUser.email, - jobid: jobId, - user_email: currentUser.email, - return: isReturn, - status: is_quote - ? bodyshop.md_order_statuses.default_quote || "Quote" - : bodyshop.md_order_statuses.default_ordered || "Ordered*" - } - ] - }, - refetchQueries: ["QUERY_PARTS_BILLS_BY_JOBID"] - }); - if (insertResult.errors) { + try { + insertResult = await insertPartOrder({ + variables: { + po: [ + { + ...values, + order_date: dayjs().format("YYYY-MM-DD"), + orderedby: currentUser.email, + jobid: jobId, + user_email: currentUser.email, + return: isReturn, + status: is_quote + ? bodyshop.md_order_statuses.default_quote || "Quote" + : bodyshop.md_order_statuses.default_ordered || "Ordered*" + } + ] + }, + refetchQueries: ["QUERY_PARTS_BILLS_BY_JOBID"] + }); + if (insertResult.errors) { + notification.error({ + title: t("parts_orders.errors.creating"), + description: JSON.stringify(insertResult.errors) + }); + setSaving(false); + return; + } + } catch (error) { notification.error({ title: t("parts_orders.errors.creating"), - description: JSON.stringify(insertResult.errors) + description: error.message }); + console.error("Parts order insert error:", error); + setSaving(false); return; } notification.success({ @@ -118,36 +129,54 @@ export function PartsOrderModalContainer({ type: isReturn ? "jobspartsreturn" : "jobspartsorder" }); - const jobLinesResult = await updateJobLines({ - variables: { - ids: values.parts_order_lines.data.filter((item) => item.job_line_id).map((item) => item.job_line_id), - status: isReturn - ? bodyshop.md_order_statuses.default_returned || "Returned*" - : is_quote - ? bodyshop.md_order_statuses.default_quote || "Quote" - : bodyshop.md_order_statuses.default_ordered || "Ordered*" - } - }); + // Use linesToOrder from context instead of form values to preserve job_line_id + const jobLineIds = linesToOrder + .filter((line) => (isReturn ? line.joblineid : line.id)) + .map((line) => (isReturn ? line.joblineid : line.id)); - if (!isReturn && removefrompartsqueue) { - await updateJob({ + try { + const jobLinesResult = await updateJobLines({ variables: { - jobId: jobId, - job: { - queued_for_parts: false - } + ids: jobLineIds, + status: isReturn + ? bodyshop.md_order_statuses.default_returned || "Returned*" + : is_quote + ? bodyshop.md_order_statuses.default_quote || "Quote" + : bodyshop.md_order_statuses.default_ordered || "Ordered*" } }); + + if (jobLinesResult.errors) { + notification.error({ + title: t("parts_orders.errors.updating_status"), + description: JSON.stringify(jobLinesResult.errors) + }); + } + } catch (error) { + notification.error({ + title: t("parts_orders.errors.updating_status"), + description: error.message + }); + console.error("Job lines update error:", error); } - if (jobLinesResult.errors) { - notification.error({ - title: t("parts_orders.errors.creating"), - description: JSON.stringify(jobLinesResult.errors) - }); + if (!isReturn && removefrompartsqueue) { + try { + await updateJob({ + variables: { + jobId: jobId, + job: { + queued_for_parts: false + } + } + }); + } catch (error) { + console.error("Update job queue error:", error); + } } if (values.vendorid === bodyshop.inhousevendorid) { + // Use linesToOrder for job_line_id, merge with form values for other fields setBillEnterContext({ actions: { refetch: refetch }, context: { @@ -159,9 +188,10 @@ export function PartsOrderModalContainer({ isinhouse: true, date: dayjs(), total: 0, - billlines: values.parts_order_lines.data.map((p) => { + billlines: values.parts_order_lines.data.map((p, index) => { + const originalLine = linesToOrder[index]; return { - joblineid: p.job_line_id, + joblineid: isReturn ? originalLine?.joblineid : originalLine?.id, actual_price: p.act_price, actual_cost: 0, //p.act_price, line_desc: p.line_desc,