feature/IO-3558-Reynolds-Part-2 - Admin Panel

This commit is contained in:
Dave
2026-02-11 16:57:13 -05:00
parent 331dcfc063
commit 0ea254ed4e
3 changed files with 46 additions and 26 deletions

View File

@@ -111,8 +111,14 @@ export function JobsConvertButton({ bodyshop, job, refetch, jobRO, insertAuditTr
title: t("jobs.successes.early_ro_created", "Early RO Created"), title: t("jobs.successes.early_ro_created", "Early RO Created"),
message: `RO Number: ${result.roNumber || "N/A"}` message: `RO Number: ${result.roNumber || "N/A"}`
}); });
// Don't close the modal - just refetch so the form updates // Delay refetch to keep success message visible for 2 seconds
refetch?.(); setTimeout(() => {
refetch?.();
}, 2000);
};
const handleModalClose = () => {
setOpen(false);
}; };
if (job.converted) return <></>; if (job.converted) return <></>;
@@ -136,7 +142,9 @@ export function JobsConvertButton({ bodyshop, job, refetch, jobRO, insertAuditTr
{/* Convert Job Modal */} {/* Convert Job Modal */}
<Modal <Modal
open={open} open={open}
onCancel={() => 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")} title={t("jobs.actions.convert")}
footer={null} footer={null}
width={700} width={700}
@@ -157,6 +165,20 @@ export function JobsConvertButton({ bodyshop, job, refetch, jobRO, insertAuditTr
referral_source_extra: job.referral_source_extra ?? "" referral_source_extra: job.referral_source_extra ?? ""
}} }}
> >
{/* Show Reynolds Early RO section at the top if applicable */}
{isReynoldsMode && !job.dms_id && !earlyRoCreated && (
<>
<RREarlyROForm
bodyshop={bodyshop}
socket={socket}
job={job}
onSuccess={handleEarlyROSuccess}
showCancelButton={false}
/>
<Divider />
</>
)}
<Form.Item <Form.Item
name={["ins_co_nm"]} name={["ins_co_nm"]}
label={t("jobs.fields.ins_co_nm")} label={t("jobs.fields.ins_co_nm")}
@@ -285,20 +307,6 @@ export function JobsConvertButton({ bodyshop, job, refetch, jobRO, insertAuditTr
<Switch /> <Switch />
</Form.Item> </Form.Item>
{/* Show Reynolds Early RO section if applicable */}
{isReynoldsMode && !job.dms_id && !earlyRoCreated && (
<>
<Divider />
<RREarlyROForm
bodyshop={bodyshop}
socket={socket}
job={job}
onSuccess={handleEarlyROSuccess}
showCancelButton={false}
/>
</>
)}
<Space wrap style={{ marginTop: 16 }}> <Space wrap style={{ marginTop: 16 }}>
<Button <Button
disabled={submitDisabled() || (isReynoldsMode && !job.dms_id && !earlyRoCreated)} disabled={submitDisabled() || (isReynoldsMode && !job.dms_id && !earlyRoCreated)}
@@ -309,7 +317,12 @@ export function JobsConvertButton({ bodyshop, job, refetch, jobRO, insertAuditTr
> >
{t("jobs.actions.convert")} {t("jobs.actions.convert")}
</Button> </Button>
<Button onClick={() => setOpen(false)}>{t("general.actions.close")}</Button> <Button
onClick={handleModalClose}
disabled={earlyRoCreated && !job.converted}
>
{t("general.actions.close")}
</Button>
</Space> </Space>
</Form> </Form>
</Modal> </Modal>

View File

@@ -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) { 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 }) { 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 id
dms_id dms_id
dms_customer_id dms_customer_id
dms_advisor_id dms_advisor_id
kmin
} }
}`; }`;

View File

@@ -137,7 +137,7 @@ const getBodyshopForSocket = async ({ bodyshopId, socket }) => {
* @param dmsAdvisorId * @param dmsAdvisorId
* @returns {Promise<void>} * @returns {Promise<void>}
*/ */
const setJobDmsIdForSocket = async ({ socket, jobId, dmsId, dmsCustomerId, dmsAdvisorId }) => { const setJobDmsIdForSocket = async ({ socket, jobId, dmsId, dmsCustomerId, dmsAdvisorId, mileageIn }) => {
if (!jobId || !dmsId) { if (!jobId || !dmsId) {
CreateRRLogEvent(socket, "WARN", "setJobDmsIdForSocket called without jobId or dmsId", { CreateRRLogEvent(socket, "WARN", "setJobDmsIdForSocket called without jobId or dmsId", {
jobId, jobId,
@@ -160,14 +160,16 @@ const setJobDmsIdForSocket = async ({ socket, jobId, dmsId, dmsCustomerId, dmsAd
id: jobId, id: jobId,
dms_id: String(dmsId), dms_id: String(dmsId),
dms_customer_id: dmsCustomerId ? String(dmsCustomerId) : null, 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", { CreateRRLogEvent(socket, "INFO", "Linked job.dms_id to RR RO", {
jobId, jobId,
dmsId: String(dmsId), dmsId: String(dmsId),
dmsCustomerId, dmsCustomerId,
dmsAdvisorId dmsAdvisorId,
mileageIn
}); });
} catch (err) { } catch (err) {
CreateRRLogEvent(socket, "ERROR", "Failed to set job.dms_id after RR create/update", { 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, dmsId,
dmsCustomerId, dmsCustomerId,
dmsAdvisorId, dmsAdvisorId,
mileageIn,
message: err?.message || String(err), message: err?.message || String(err),
stack: err?.stack stack: err?.stack
}); });
@@ -709,20 +712,23 @@ const registerRREvents = ({ socket, redisHelpers }) => {
jobId: rid 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) { if (dmsRoNo) {
const mileageIn = txEnvelope?.kmin ?? null;
CreateRRLogEvent(socket, "DEBUG", "Calling setJobDmsIdForSocket", { CreateRRLogEvent(socket, "DEBUG", "Calling setJobDmsIdForSocket", {
jobId: rid, jobId: rid,
dmsId: dmsRoNo, dmsId: dmsRoNo,
customerId: effectiveCustNo, customerId: effectiveCustNo,
advisorId: String(advisorNo) advisorId: String(advisorNo),
mileageIn
}); });
await setJobDmsIdForSocket({ await setJobDmsIdForSocket({
socket, socket,
jobId: rid, jobId: rid,
dmsId: dmsRoNo, dmsId: dmsRoNo,
dmsCustomerId: effectiveCustNo, dmsCustomerId: effectiveCustNo,
dmsAdvisorId: String(advisorNo) dmsAdvisorId: String(advisorNo),
mileageIn
}); });
} else { } else {
CreateRRLogEvent(socket, "WARN", "RR early RO creation succeeded but no DMS RO number was returned", { CreateRRLogEvent(socket, "WARN", "RR early RO creation succeeded but no DMS RO number was returned", {