From 84b39f3d2b21f09251dddaa9e4da150cc889fcae Mon Sep 17 00:00:00 2001 From: Patrick Fic <> Date: Fri, 2 Jul 2021 12:53:18 -0700 Subject: [PATCH] IO-233 WIP CDK --- .../dms-customer-selector.component.jsx | 79 +++++++++++ client/src/pages/dms/dms.container.jsx | 76 +++++++---- server/cdk/cdk-job-export.js | 128 +++++++++--------- 3 files changed, 197 insertions(+), 86 deletions(-) create mode 100644 client/src/components/dms-customer-selector/dms-customer-selector.component.jsx diff --git a/client/src/components/dms-customer-selector/dms-customer-selector.component.jsx b/client/src/components/dms-customer-selector/dms-customer-selector.component.jsx new file mode 100644 index 000000000..e0f41dd97 --- /dev/null +++ b/client/src/components/dms-customer-selector/dms-customer-selector.component.jsx @@ -0,0 +1,79 @@ +import React, { useEffect, useState } from "react"; +import { socket } from "../../pages/dms/dms.container"; +import { alphaSort } from "../../utils/sorters"; +import { Table } from "antd"; +import { useTranslation } from "react-i18next"; + +export default function DmsCustomerSelector() { + const { t } = useTranslation(); + const [customerList, setcustomerList] = useState([]); + const [selectedCustomer, setSelectedCustomer] = useState(null); + useEffect(() => { + socket.on("cdk-select-customer", (customerList) => { + setcustomerList(customerList); + console.log("Received a customer list.", customerList); + }); + + return () => { + socket.removeListener("cdk-select-customer"); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const columns = [ + { + title: t("owners.fields.ownr_ln"), + dataIndex: "ownr_ln", + key: "ownr_ln", + sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), + }, + { + title: t("owners.fields.ownr_fn"), + dataIndex: "ownr_fn", + key: "ownr_fn", + sorter: (a, b) => alphaSort(a.ownr_fn, b.ownr_fn), + }, + { + title: t("owners.fields.ownr_co_nm"), + dataIndex: "ownr_co_nm", + key: "ownr_co_nm", + sorter: (a, b) => alphaSort(a.ownr_co_nm, b.ownr_co_nm), + }, + { + title: t("owners.fields.ownr_addr1"), + dataIndex: "ownr_addr1", + key: "ownr_addr1", + sorter: (a, b) => alphaSort(a.ownr_addr1, b.ownr_addr1), + }, + { + title: t("owners.fields.ownr_city"), + dataIndex: "ownr_city", + key: "ownr_city", + sorter: (a, b) => alphaSort(a.ownr_city, b.ownr_city), + }, + { + title: t("owners.fields.ownr_ea"), + dataIndex: "ownr_ea", + key: "ownr_ea", + sorter: (a, b) => alphaSort(a.ownr_ea, b.ownr_ea), + }, + ]; + + return ( + { + setSelectedCustomer(props.id); + }, + type: "radio", + selectedRowKeys: [selectedCustomer], + }} + /> + ); +} diff --git a/client/src/pages/dms/dms.container.jsx b/client/src/pages/dms/dms.container.jsx index 85fb8e233..f171daa75 100644 --- a/client/src/pages/dms/dms.container.jsx +++ b/client/src/pages/dms/dms.container.jsx @@ -1,4 +1,4 @@ -import { Result, Timeline, Space, Tag, Divider, Button } from "antd"; +import { Result, Timeline, Space, Tag, Divider, Button, Select } from "antd"; import React, { useEffect, useState } from "react"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; @@ -11,6 +11,7 @@ import { useTranslation } from "react-i18next"; import SocketIO from "socket.io-client"; import { auth } from "../../firebase/firebase.utils"; import moment from "moment"; +import DmsCustomerSelector from "../../components/dms-customer-selector/dms-customer-selector.component"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, @@ -38,6 +39,7 @@ export const socket = SocketIO( export function DmsContainer({ bodyshop, setBreadcrumbs, setSelectedHeader }) { const { t } = useTranslation(); + const [logLevel, setLogLevel] = useState("DEBUG"); const [logs, setLogs] = useState([]); useEffect(() => { @@ -57,7 +59,16 @@ export function DmsContainer({ bodyshop, setBreadcrumbs, setSelectedHeader }) { }); socket.on("reconnect", () => { console.log("Connected again."); - setLogs([]); + setLogs((logs) => { + return [ + ...logs, + { + timestamp: new Date(), + level: "WARNING", + message: "Reconnected to CDK Export Service", + }, + ]; + }); }); socket.on("log-event", (payload) => { @@ -67,12 +78,13 @@ export function DmsContainer({ bodyshop, setBreadcrumbs, setSelectedHeader }) { }); socket.connect(); - socket.emit("set-log-level", "TRACE"); + socket.emit("set-log-level", logLevel); return () => { socket.removeAllListeners(); socket.disconnect(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); if (!bodyshop.cdk_dealerid) return ; @@ -81,27 +93,43 @@ export function DmsContainer({ bodyshop, setBreadcrumbs, setSelectedHeader }) { return (
- - - - + + + + + + + {logs.map((log, idx) => ( diff --git a/server/cdk/cdk-job-export.js b/server/cdk/cdk-job-export.js index 178eab6a7..f09af0edc 100644 --- a/server/cdk/cdk-job-export.js +++ b/server/cdk/cdk-job-export.js @@ -44,13 +44,13 @@ exports.default = async function (socket, jobid) { CdkBase.createLogEvent( socket, "DEBUG", - `{1.2} clVFV DMSVid does *not* exist. clVFV: ${JSON.stringify( - clVFV, - null, - 2 - )}` + `{1.2} clVFV DMSVid does *not* exist.` + ); + CdkBase.createLogEvent( + socket, + "TRACE", + `{1.2} clVFV: ${JSON.stringify(clVFV, null, 2)}` ); - //Check if DMSCustId is Empty - which it should always be? //{6.6} Should check to see if a customer exists so that we can marry it to the new vehicle. CdkBase.createLogEvent( @@ -65,12 +65,30 @@ exports.default = async function (socket, jobid) { CdkBase.createLogEvent( socket, "DEBUG", - `{8.2} Customer ID(s) found. strIDS: ${JSON.stringify( - strIDS, - null, - 2 - )}` + `{8.2} ${strIDS.length} Customer ID(s) found.` ); + CdkBase.createLogEvent( + socket, + "TRACE", + `{8.2} strIDS: ${JSON.stringify(strIDS, null, 2)}` + ); + if (strIDS.length > 1) { + //We have multiple IDs + //TODO: Do we need to let the person select it? + CdkBase.createLogEvent( + socket, + "WARNING", + `{F} Mutliple customer ids have been found (${strIDS.length})` + ); + CdkBase.createLogEvent( + socket, + "DEBUG", + `Asking for user intervention to select customer.` + ); + socket.emit("cdk-select-customer", strIDS); + + //TOOD: Need to find a way to wait and determine which customer to use. + } } else { CdkBase.createLogEvent( socket, @@ -94,22 +112,20 @@ exports.default = async function (socket, jobid) { CdkBase.createLogEvent( socket, "DEBUG", - `{11.1} New Customer inserted. customer: ${JSON.stringify( - clADPC, - null, - 2 - )}` + `{11.1} New Customer inserted.` + ); + CdkBase.createLogEvent( + socket, + "TRACE", + `{11.1} clADPC: ${JSON.stringify(clADPC, null, 2)}` ); } } else { + CdkBase.createLogEvent(socket, "DEBUG", `{1.1} clVFV DMSVid does exist.`); CdkBase.createLogEvent( socket, - "DEBUG", - `{1.1} clVFV DMSVid does exist. clVFV: ${JSON.stringify( - clVFV, - null, - 2 - )}` + "TRACE", + `{1.1} clVFV: ${JSON.stringify(clVFV, null, 2)}` ); //{2} Begin Find Vehicle in DMS @@ -121,22 +137,24 @@ exports.default = async function (socket, jobid) { CdkBase.createLogEvent( socket, "DEBUG", - `{1.4} Vehicle was found in the DMS. clADPV: ${JSON.stringify( - clADPV, - null, - 2 - )}` + `{1.4} Vehicle was found in the DMS.` + ); + CdkBase.createLogEvent( + socket, + "TRACE", + `{1.4} clADPV: ${JSON.stringify(clADPV, null, 2)}` ); } else { //Vehicle was not found. CdkBase.createLogEvent( socket, "DEBUG", - `{6.4} Vehicle does not exist in DMS. Will have to create one. clVFV: ${JSON.stringify( - clVFV, - null, - 2 - )}` + `{6.4} Vehicle does not exist in DMS. Will have to create one.` + ); + CdkBase.createLogEvent( + socket, + "TRACE", + `{6.4} clVFV: ${JSON.stringify(clVFV, null, 2)}` ); } } @@ -167,7 +185,7 @@ async function QueryJobData(socket, jobid) { } async function CreateCustomerInDms(socket, JobData, newCustomerNumber) { - CdkBase.createLogEvent(socket, "DEBUG", `{10} Begin Create Customer in DMS`); + CdkBase.createLogEvent(socket, "DEBUG", `{11} Begin Create Customer in DMS`); try { const soapClientCustomerInsertUpdate = await soap.createClientAsync( @@ -209,8 +227,9 @@ async function CreateCustomerInDms(socket, JobData, newCustomerNumber) { {} ); CheckCdkResponseForError(socket, soapResponseCustomerInsertUpdate); - const [result, rawResponse, soapheader, rawRequest] = - soapResponseCustomerInsertUpdate; + const [ + result, //rawResponse, soapheader, rawRequest + ] = soapResponseCustomerInsertUpdate; CdkBase.createLogEvent( socket, @@ -303,7 +322,7 @@ async function FindCustomerIdFromDms(socket, JobData) { arg0: CDK_CREDENTIALS, arg1: { dealerId: JobData.bodyshop.cdk_dealerid }, //TODO: Verify why this does not follow the other standards. arg2: { - // verb: "EXACT", + verb: "EXACT", key: ownerName, }, }, @@ -363,17 +382,6 @@ async function FindVehicleInDms(socket, JobData, clVFV) { const [ result, //rawResponse, soapheader, rawRequest ] = soapResponseVehicleInsertUpdate; - //result format - // return: [ - // { - // code: 'success', - // carInvStockNo: '', - // errorLevel: '0', - // errorMessage: '', - // newId: 'Y', - // vehiclesVehId: 'HM263407' - // } - // ] CdkBase.createLogEvent( socket, "TRACE", @@ -420,17 +428,6 @@ async function CalculateDmsVid(socket, JobData) { const [ result, //rawResponse, soapheader, rawRequest ] = soapResponseVehicleInsertUpdate; - //result format - // return: [ - // { - // code: 'success', - // carInvStockNo: '', - // errorLevel: '0', - // errorMessage: '', - // newId: 'Y', - // vehiclesVehId: 'HM263407' - // } - // ] CdkBase.createLogEvent( socket, "TRACE", @@ -465,14 +462,21 @@ function CheckCdkResponseForError(socket, soapResponse) { return; } - const ResultToCheck = Array.isArray(soapResponse[0] && soapResponse[0].return) - ? soapResponse[0].return[0] - : soapResponse[0].return; + const ResultToCheck = soapResponse[0].return; + if (Array.isArray(ResultToCheck)) { + ResultToCheck.forEach((result) => checkIndividualResult(socket, result)); + } else { + checkIndividualResult(socket, ResultToCheck); + } +} + +function checkIndividualResult(socket, ResultToCheck) { if ( ResultToCheck.errorLevel === 0 || ResultToCheck.errorLevel === "0" || - ResultToCheck.code === "success" + ResultToCheck.code === "success" || + (!ResultToCheck.code && !ResultToCheck.errorLevel) ) //TODO: Verify that this is the best way to detect errors. return;