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", {