feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration / RRScratch2 / Checkpoint
This commit is contained in:
@@ -26,6 +26,7 @@ import DmsPostForm from "../../components/dms-post-form/dms-post-form.component"
|
||||
import DmsLogEvents from "../../components/dms-log-events/dms-log-events.component";
|
||||
import DmsCustomerSelector from "../../components/dms-customer-selector/dms-customer-selector.component";
|
||||
import DmsAllocationsSummary from "../../components/dms-allocations-summary/dms-allocations-summary.component";
|
||||
import RrAllocationsSummary from "../../components/dms-allocations-summary/rr-dms-allocations-summary.component";
|
||||
|
||||
const mapStateToProps = createStructuredSelector({
|
||||
bodyshop: selectBodyshop
|
||||
@@ -82,6 +83,7 @@ export function DmsContainer({ bodyshop, setBreadcrumbs, setSelectedHeader, inse
|
||||
|
||||
// Compute a single normalized mode and pick the proper socket
|
||||
const mode = getDmsMode(bodyshop, Fortellis.treatment); // "rr" | "fortellis" | "cdk" | "pbs" | "none"
|
||||
const isRrMode = mode === DMS_MAP.reynolds;
|
||||
|
||||
const { socket: wsssocket } = useSocket();
|
||||
const activeSocket = useMemo(() => (isWssMode(mode) ? wsssocket : legacySocket), [mode, wsssocket]);
|
||||
@@ -134,7 +136,7 @@ export function DmsContainer({ bodyshop, setBreadcrumbs, setSelectedHeader, inse
|
||||
[mode]
|
||||
);
|
||||
|
||||
const transportLabel = isWssMode(mode) ? "App Socket (WSS)" : "Legacy Socket (WS)";
|
||||
const transportLabel = isWssMode(mode) ? "(WSS)" : "(WS)";
|
||||
|
||||
const bannerMessage = `Posting to ${providerLabel} | ${transportLabel} | ${
|
||||
isConnected ? "Connected" : "Disconnected"
|
||||
@@ -148,10 +150,10 @@ export function DmsContainer({ bodyshop, setBreadcrumbs, setSelectedHeader, inse
|
||||
errText ||
|
||||
t("dms.errors.exportfailedgeneric", "We couldn't complete the export. Please try again.");
|
||||
|
||||
const vendorTitle = title || (mode === DMS_MAP.reynolds ? "Reynolds" : "DMS");
|
||||
const vendorTitle = title || (isRrMode ? "Reynolds" : "DMS");
|
||||
|
||||
const isRrOpenRoLimit =
|
||||
mode === DMS_MAP.reynolds &&
|
||||
isRrMode &&
|
||||
(vendorStatusCode === 507 ||
|
||||
/MAX_OPEN_ROS/i.test(String(errorCode || "")) ||
|
||||
/maximum number of open repair orders/i.test(String(msg || "").toLowerCase()));
|
||||
@@ -187,8 +189,8 @@ export function DmsContainer({ bodyshop, setBreadcrumbs, setSelectedHeader, inse
|
||||
});
|
||||
setSelectedHeader("dms");
|
||||
setBreadcrumbs([
|
||||
{ link: "/manage/accounting/receivables", label: t("titles.bc.accounting-receivables") },
|
||||
{ link: "/manage/dms", label: t("titles.bc.dms") }
|
||||
{ link: "/manage/accounting/receivables", label: t("titles.bc.accounting-receivables") }
|
||||
// { link: "/manage/dms", label: t("titles.bc.dms") }
|
||||
]);
|
||||
}, [t, setBreadcrumbs, setSelectedHeader]);
|
||||
|
||||
@@ -218,7 +220,7 @@ export function DmsContainer({ bodyshop, setBreadcrumbs, setSelectedHeader, inse
|
||||
{
|
||||
timestamp: new Date(),
|
||||
level: "warn",
|
||||
message: `Reconnected to ${mode === DMS_MAP.reynolds ? "RR" : mode === DMS_MAP.fortellis ? "Fortellis" : "DMS"} Export Service`
|
||||
message: `Reconnected to ${isRrMode ? "RR" : mode === DMS_MAP.fortellis ? "Fortellis" : "DMS"} Export Service`
|
||||
}
|
||||
]);
|
||||
};
|
||||
@@ -235,22 +237,17 @@ export function DmsContainer({ bodyshop, setBreadcrumbs, setSelectedHeader, inse
|
||||
activeSocket.on("connect_error", onConnectError);
|
||||
|
||||
// Logs
|
||||
const onLog =
|
||||
mode === DMS_MAP.reynolds
|
||||
? (payload = {}) => {
|
||||
const normalized = {
|
||||
timestamp: payload.timestamp
|
||||
? new Date(payload.timestamp)
|
||||
: payload.ts
|
||||
? new Date(payload.ts)
|
||||
: new Date(),
|
||||
level: (payload.level || "INFO").toUpperCase(),
|
||||
message: payload.message || payload.msg || "",
|
||||
meta: payload.meta ?? payload.ctx ?? payload.details ?? null
|
||||
};
|
||||
setLogs((prev) => [...prev, normalized]);
|
||||
}
|
||||
: (payload) => setLogs((prev) => [...prev, payload]);
|
||||
const onLog = isRrMode
|
||||
? (payload = {}) => {
|
||||
const normalized = {
|
||||
timestamp: payload.timestamp ? new Date(payload.timestamp) : payload.ts ? new Date(payload.ts) : new Date(),
|
||||
level: (payload.level || "INFO").toUpperCase(),
|
||||
message: payload.message || payload.msg || "",
|
||||
meta: payload.meta ?? payload.ctx ?? payload.details ?? null
|
||||
};
|
||||
setLogs((prev) => [...prev, normalized]);
|
||||
}
|
||||
: (payload) => setLogs((prev) => [...prev, payload]);
|
||||
|
||||
if (channels.log) activeSocket.on(channels.log, onLog);
|
||||
|
||||
@@ -308,9 +305,8 @@ export function DmsContainer({ bodyshop, setBreadcrumbs, setSelectedHeader, inse
|
||||
]);
|
||||
};
|
||||
|
||||
if (mode === DMS_MAP.reynolds && channels.partialResult) activeSocket.on(channels.partialResult, onPartialResult);
|
||||
if (mode === DMS_MAP.reynolds && channels.validationNeeded)
|
||||
activeSocket.on(channels.validationNeeded, onValidationRequired);
|
||||
if (isRrMode && channels.partialResult) activeSocket.on(channels.partialResult, onPartialResult);
|
||||
if (isRrMode && channels.validationNeeded) activeSocket.on(channels.validationNeeded, onValidationRequired);
|
||||
|
||||
return () => {
|
||||
activeSocket.off("connect", onConnect);
|
||||
@@ -322,10 +318,8 @@ export function DmsContainer({ bodyshop, setBreadcrumbs, setSelectedHeader, inse
|
||||
if (channels.exportSuccess) activeSocket.off(channels.exportSuccess, onExportSuccess);
|
||||
if (channels.exportFailed) activeSocket.off(channels.exportFailed, handleExportFailed);
|
||||
|
||||
if (mode === DMS_MAP.reynolds && channels.partialResult)
|
||||
activeSocket.off(channels.partialResult, onPartialResult);
|
||||
if (mode === DMS_MAP.reynolds && channels.validationNeeded)
|
||||
activeSocket.off(channels.validationNeeded, onValidationRequired);
|
||||
if (isRrMode && channels.partialResult) activeSocket.off(channels.partialResult, onPartialResult);
|
||||
if (isRrMode && channels.validationNeeded) activeSocket.off(channels.validationNeeded, onValidationRequired);
|
||||
|
||||
// Only tear down legacy socket listeners; don't disconnect WSS from here
|
||||
if (!isWssMode(mode)) {
|
||||
@@ -359,19 +353,38 @@ export function DmsContainer({ bodyshop, setBreadcrumbs, setSelectedHeader, inse
|
||||
|
||||
<Row gutter={[16, 16]}>
|
||||
<Col md={24} lg={10}>
|
||||
<DmsAllocationsSummary
|
||||
title={
|
||||
<span>
|
||||
<Link
|
||||
to={`/manage/jobs/${data && data.jobs_by_pk.id}`}
|
||||
>{`${data?.jobs_by_pk && data.jobs_by_pk.ro_number}`}</Link>
|
||||
{` | ${OwnerNameDisplayFunction(data.jobs_by_pk)} | ${data.jobs_by_pk.v_model_yr || ""} ${data.jobs_by_pk.v_make_desc || ""} ${data.jobs_by_pk.v_model_desc || ""}`}
|
||||
</span>
|
||||
}
|
||||
socket={activeSocket}
|
||||
jobId={jobId}
|
||||
mode={mode}
|
||||
/>
|
||||
{!isRrMode ? (
|
||||
<DmsAllocationsSummary
|
||||
title={
|
||||
<span>
|
||||
<Link
|
||||
to={`/manage/jobs/${data && data.jobs_by_pk.id}`}
|
||||
>{`${data?.jobs_by_pk && data.jobs_by_pk.ro_number}`}</Link>
|
||||
{` | ${OwnerNameDisplayFunction(data.jobs_by_pk)} | ${data.jobs_by_pk.v_model_yr || ""} ${
|
||||
data.jobs_by_pk.v_make_desc || ""
|
||||
} ${data.jobs_by_pk.v_model_desc || ""}`}
|
||||
</span>
|
||||
}
|
||||
socket={activeSocket}
|
||||
jobId={jobId}
|
||||
mode={mode}
|
||||
/>
|
||||
) : (
|
||||
<RrAllocationsSummary
|
||||
title={
|
||||
<span>
|
||||
<Link to={`/manage/jobs/${data && data.jobs_by_pk.id}`}>
|
||||
{data?.jobs_by_pk && data.jobs_by_pk.ro_number}
|
||||
</Link>
|
||||
{` | ${OwnerNameDisplayFunction(data.jobs_by_pk)} | ${
|
||||
data.jobs_by_pk.v_model_yr || ""
|
||||
} ${data.jobs_by_pk.v_make_desc || ""} ${data.jobs_by_pk.v_model_desc || ""}`}
|
||||
</span>
|
||||
}
|
||||
socket={activeSocket}
|
||||
jobId={jobId}
|
||||
/>
|
||||
)}
|
||||
</Col>
|
||||
|
||||
<Col md={24} lg={14}>
|
||||
@@ -397,13 +410,18 @@ export function DmsContainer({ bodyshop, setBreadcrumbs, setSelectedHeader, inse
|
||||
title={t("jobs.labels.dms.logs")}
|
||||
extra={
|
||||
<Space wrap>
|
||||
<Switch
|
||||
checked={colorizeJson}
|
||||
onChange={setColorizeJson}
|
||||
checkedChildren="Color JSON"
|
||||
unCheckedChildren="Plain JSON"
|
||||
/>
|
||||
<Button onClick={toggleDetailsAll}>{detailsOpen ? "Collapse All" : "Expand All"}</Button>
|
||||
{isRrMode && (
|
||||
<>
|
||||
<Switch
|
||||
checked={colorizeJson}
|
||||
onChange={setColorizeJson}
|
||||
checkedChildren="Color JSON"
|
||||
unCheckedChildren="Plain JSON"
|
||||
/>
|
||||
<Button onClick={toggleDetailsAll}>{detailsOpen ? "Collapse All" : "Expand All"}</Button>
|
||||
</>
|
||||
)}
|
||||
|
||||
<Select
|
||||
placeholder="Log Level"
|
||||
value={logLevel}
|
||||
@@ -425,8 +443,10 @@ export function DmsContainer({ bodyshop, setBreadcrumbs, setSelectedHeader, inse
|
||||
if (isWssMode(mode)) {
|
||||
setActiveLogLevel(logLevel);
|
||||
}
|
||||
activeSocket.disconnect();
|
||||
activeSocket.connect();
|
||||
if (activeSocket) {
|
||||
activeSocket.disconnect();
|
||||
activeSocket.connect();
|
||||
}
|
||||
}}
|
||||
>
|
||||
Reconnect
|
||||
@@ -436,9 +456,12 @@ export function DmsContainer({ bodyshop, setBreadcrumbs, setSelectedHeader, inse
|
||||
>
|
||||
<DmsLogEvents
|
||||
logs={logs}
|
||||
detailsOpen={detailsOpen}
|
||||
// Only honour details/colorized JSON in RR mode;
|
||||
// in other modes DmsLogEvents can render a simple, flat list.
|
||||
detailsOpen={isRrMode ? detailsOpen : false}
|
||||
detailsNonce={detailsNonce}
|
||||
colorizeJson={colorizeJson}
|
||||
colorizeJson={isRrMode ? colorizeJson : false}
|
||||
showDetails={isRrMode}
|
||||
/>
|
||||
</Card>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user