diff --git a/client/src/components/jobs-convert-button/jobs-convert-button.component.jsx b/client/src/components/jobs-convert-button/jobs-convert-button.component.jsx index 692150a5a..ee06e93d0 100644 --- a/client/src/components/jobs-convert-button/jobs-convert-button.component.jsx +++ b/client/src/components/jobs-convert-button/jobs-convert-button.component.jsx @@ -111,8 +111,14 @@ export function JobsConvertButton({ bodyshop, job, refetch, jobRO, insertAuditTr title: t("jobs.successes.early_ro_created", "Early RO Created"), message: `RO Number: ${result.roNumber || "N/A"}` }); - // Don't close the modal - just refetch so the form updates - refetch?.(); + // Delay refetch to keep success message visible for 2 seconds + setTimeout(() => { + refetch?.(); + }, 2000); + }; + + const handleModalClose = () => { + setOpen(false); }; if (job.converted) return <>; @@ -136,7 +142,9 @@ export function JobsConvertButton({ bodyshop, job, refetch, jobRO, insertAuditTr {/* Convert Job Modal */} setOpen(false)} + onCancel={handleModalClose} + closable={!(earlyRoCreated && !job.converted)} // Disable X button if early RO created but not converted + maskClosable={!(earlyRoCreated && !job.converted)} // Disable clicking outside to close title={t("jobs.actions.convert")} footer={null} width={700} @@ -157,6 +165,20 @@ export function JobsConvertButton({ bodyshop, job, refetch, jobRO, insertAuditTr referral_source_extra: job.referral_source_extra ?? "" }} > + {/* Show Reynolds Early RO section at the top if applicable */} + {isReynoldsMode && !job.dms_id && !earlyRoCreated && ( + <> + + + + )} + - {/* Show Reynolds Early RO section if applicable */} - {isReynoldsMode && !job.dms_id && !earlyRoCreated && ( - <> - - - - )} - - + diff --git a/server/graphql-client/queries.js b/server/graphql-client/queries.js index 131a7643c..b174f79c5 100644 --- a/server/graphql-client/queries.js +++ b/server/graphql-client/queries.js @@ -3206,11 +3206,12 @@ exports.UPDATE_USER_FCM_TOKENS_BY_EMAIL = /* GraphQL */ ` } `; -exports.SET_JOB_DMS_ID = `mutation SetJobDmsId($id: uuid!, $dms_id: String!, $dms_customer_id: String, $dms_advisor_id: String) { - update_jobs_by_pk(pk_columns: { id: $id }, _set: { dms_id: $dms_id, dms_customer_id: $dms_customer_id, dms_advisor_id: $dms_advisor_id }) { +exports.SET_JOB_DMS_ID = `mutation SetJobDmsId($id: uuid!, $dms_id: String!, $dms_customer_id: String, $dms_advisor_id: String, $kmin: Int) { + update_jobs_by_pk(pk_columns: { id: $id }, _set: { dms_id: $dms_id, dms_customer_id: $dms_customer_id, dms_advisor_id: $dms_advisor_id, kmin: $kmin }) { id dms_id dms_customer_id dms_advisor_id + kmin } }`; diff --git a/server/rr/rr-register-socket-events.js b/server/rr/rr-register-socket-events.js index b0d20ae80..98897eaa7 100644 --- a/server/rr/rr-register-socket-events.js +++ b/server/rr/rr-register-socket-events.js @@ -137,7 +137,7 @@ const getBodyshopForSocket = async ({ bodyshopId, socket }) => { * @param dmsAdvisorId * @returns {Promise} */ -const setJobDmsIdForSocket = async ({ socket, jobId, dmsId, dmsCustomerId, dmsAdvisorId }) => { +const setJobDmsIdForSocket = async ({ socket, jobId, dmsId, dmsCustomerId, dmsAdvisorId, mileageIn }) => { if (!jobId || !dmsId) { CreateRRLogEvent(socket, "WARN", "setJobDmsIdForSocket called without jobId or dmsId", { jobId, @@ -160,14 +160,16 @@ const setJobDmsIdForSocket = async ({ socket, jobId, dmsId, dmsCustomerId, dmsAd id: jobId, dms_id: String(dmsId), dms_customer_id: dmsCustomerId ? String(dmsCustomerId) : null, - dms_advisor_id: dmsAdvisorId ? String(dmsAdvisorId) : null + dms_advisor_id: dmsAdvisorId ? String(dmsAdvisorId) : null, + kmin: mileageIn != null && mileageIn > 0 ? parseInt(mileageIn, 10) : null }); CreateRRLogEvent(socket, "INFO", "Linked job.dms_id to RR RO", { jobId, dmsId: String(dmsId), dmsCustomerId, - dmsAdvisorId + dmsAdvisorId, + mileageIn }); } catch (err) { CreateRRLogEvent(socket, "ERROR", "Failed to set job.dms_id after RR create/update", { @@ -175,6 +177,7 @@ const setJobDmsIdForSocket = async ({ socket, jobId, dmsId, dmsCustomerId, dmsAd dmsId, dmsCustomerId, dmsAdvisorId, + mileageIn, message: err?.message || String(err), stack: err?.stack }); @@ -709,20 +712,23 @@ const registerRREvents = ({ socket, redisHelpers }) => { jobId: rid }); - // ✅ Persist DMS RO number, customer ID, and advisor ID on the job + // ✅ Persist DMS RO number, customer ID, advisor ID, and mileage on the job if (dmsRoNo) { + const mileageIn = txEnvelope?.kmin ?? null; CreateRRLogEvent(socket, "DEBUG", "Calling setJobDmsIdForSocket", { jobId: rid, dmsId: dmsRoNo, customerId: effectiveCustNo, - advisorId: String(advisorNo) + advisorId: String(advisorNo), + mileageIn }); await setJobDmsIdForSocket({ socket, jobId: rid, dmsId: dmsRoNo, dmsCustomerId: effectiveCustNo, - dmsAdvisorId: String(advisorNo) + dmsAdvisorId: String(advisorNo), + mileageIn }); } else { CreateRRLogEvent(socket, "WARN", "RR early RO creation succeeded but no DMS RO number was returned", {