From fd7c907b8fa7580fec351c716c7c2df50a4c7b39 Mon Sep 17 00:00:00 2001 From: Patrick Fic <> Date: Wed, 11 Aug 2021 11:08:03 -0700 Subject: [PATCH] IO-233 Beging get vehicle makes --- bodyshop_translations.babel | 21 +++ .../dms-cdk-makes/dms-cdk-makes.component.jsx | 43 +++++ .../dms-post-form/dms-post-form.component.jsx | 150 ++++++++++++++++++ ...p-info.responsibilitycenters.component.jsx | 24 ++- client/src/pages/dms/dms.container.jsx | 22 +-- client/src/translations/en_us/common.json | 1 + client/src/translations/es/common.json | 1 + client/src/translations/fr/common.json | 1 + server/cdk/cdk-calculate-allocations.js | 5 +- server/cdk/cdk-get-makes.js | 80 ++++++++++ server/cdk/cdk-job-export.js | 64 +------- server/cdk/cdk-wsdl.js | 65 ++++++++ server/web-sockets/web-socket.js | 6 + 13 files changed, 408 insertions(+), 75 deletions(-) create mode 100644 client/src/components/dms-cdk-makes/dms-cdk-makes.component.jsx create mode 100644 client/src/components/dms-post-form/dms-post-form.component.jsx create mode 100644 server/cdk/cdk-get-makes.js diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel index 2d2352892..9533a47db 100644 --- a/bodyshop_translations.babel +++ b/bodyshop_translations.babel @@ -3578,6 +3578,27 @@ dms + + default_journal + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + dms_acctnumber false diff --git a/client/src/components/dms-cdk-makes/dms-cdk-makes.component.jsx b/client/src/components/dms-cdk-makes/dms-cdk-makes.component.jsx new file mode 100644 index 000000000..27be85602 --- /dev/null +++ b/client/src/components/dms-cdk-makes/dms-cdk-makes.component.jsx @@ -0,0 +1,43 @@ +import React, { useState } from "react"; +import { Modal, Button, Table } from "antd"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +const mapStateToProps = createStructuredSelector({ + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); +export default connect(mapStateToProps, mapDispatchToProps)(DmsCdkMakes); + +export function DmsCdkMakes({ bodyshop, form, socket }) { + const [makesList, setMakesList] = useState([]); + const [loading, setLoading] = useState(false); + const [visible, setVisible] = useState(false); + return ( +
+ setVisible(false)}> + {JSON.stringify(makesList, null, 2)} + + + + + ); +} diff --git a/client/src/components/dms-post-form/dms-post-form.component.jsx b/client/src/components/dms-post-form/dms-post-form.component.jsx new file mode 100644 index 000000000..8bef25c4b --- /dev/null +++ b/client/src/components/dms-post-form/dms-post-form.component.jsx @@ -0,0 +1,150 @@ +import { DeleteFilled } from "@ant-design/icons"; +import { Button, Form, Input } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import DmsCdkMakes from "../dms-cdk-makes/dms-cdk-makes.component"; +import CurrencyInput from "../form-items-formatted/currency-form-item.component"; +import LayoutFormRow from "../layout-form-row/layout-form-row.component"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); +export default connect(mapStateToProps, mapDispatchToProps)(DmsPostForm); + +export function DmsPostForm({ bodyshop, socket, jobId }) { + const [form] = Form.useForm(); + const { t } = useTranslation(); + return ( + + + + + + + + + + + + + + + + {(fields, { add, remove }) => { + return ( +
+ {fields.map((field, index) => ( + + + + + + + + + + + + + + + + + + { + remove(field.name); + }} + /> + + + ))} + + + +
+ ); + }} +
+ + ); +} diff --git a/client/src/components/shop-info/shop-info.responsibilitycenters.component.jsx b/client/src/components/shop-info/shop-info.responsibilitycenters.component.jsx index b9201fcef..aafb41bf8 100644 --- a/client/src/components/shop-info/shop-info.responsibilitycenters.component.jsx +++ b/client/src/components/shop-info/shop-info.responsibilitycenters.component.jsx @@ -69,9 +69,27 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { return (
- - {form.getFieldValue("cdk_dealerid")} - + {bodyshop.cdk_dealerid && ( + <> + + {form.getFieldValue("cdk_dealerid")} + + + + + + + + )} {(fields, { add, remove }) => { diff --git a/client/src/pages/dms/dms.container.jsx b/client/src/pages/dms/dms.container.jsx index 37c67fda9..293e58cd4 100644 --- a/client/src/pages/dms/dms.container.jsx +++ b/client/src/pages/dms/dms.container.jsx @@ -1,4 +1,4 @@ -import { useQuery } from "@apollo/client"; +//import { useQuery } from "@apollo/client"; import { Button, Col, Result, Row, Select, Space } from "antd"; import queryString from "query-string"; import React, { useEffect, useState } from "react"; @@ -7,13 +7,14 @@ import { connect } from "react-redux"; import { useLocation } from "react-router-dom"; import { createStructuredSelector } from "reselect"; import SocketIO from "socket.io-client"; -import AlertComponent from "../../components/alert/alert.component"; +//import AlertComponent from "../../components/alert/alert.component"; import DmsAllocationsSummary from "../../components/dms-allocations-summary/dms-allocations-summary.component"; import DmsCustomerSelector from "../../components/dms-customer-selector/dms-customer-selector.component"; import DmsLogEvents from "../../components/dms-log-events/dms-log-events.component"; -import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; +import DmsPostForm from "../../components/dms-post-form/dms-post-form.component"; +//import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; import { auth } from "../../firebase/firebase.utils"; -import { QUERY_JOB_EXPORT_DMS } from "../../graphql/jobs.queries"; +//import { QUERY_JOB_EXPORT_DMS } from "../../graphql/jobs.queries"; import { setBreadcrumbs, setSelectedHeader, @@ -51,10 +52,10 @@ export function DmsContainer({ bodyshop, setBreadcrumbs, setSelectedHeader }) { const search = queryString.parse(useLocation().search); const { jobId } = search; - const { loading, error, data } = useQuery(QUERY_JOB_EXPORT_DMS, { - variables: { id: jobId }, - skip: true, //!jobId, - }); + // const { loading, error } = useQuery(QUERY_JOB_EXPORT_DMS, { + // variables: { id: jobId }, + // skip: true, //!jobId, + // }); useEffect(() => { document.title = t("titles.dms"); @@ -105,8 +106,8 @@ export function DmsContainer({ bodyshop, setBreadcrumbs, setSelectedHeader }) { const dmsType = determineDmsType(bodyshop); - if (loading) return ; - if (error) return ; + // if (loading) return ; + // if (error) return ; return (
@@ -140,6 +141,7 @@ export function DmsContainer({ bodyshop, setBreadcrumbs, setSelectedHeader }) {
+
diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index 5d160c0d7..f9331b5ae 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -232,6 +232,7 @@ "templates": "Delivery Templates" }, "dms": { + "default_journal": "Default Journal", "dms_acctnumber": "DMS Account #", "dms_wip_acctnumber": "DMS W.I.P. Account #", "mappingname": "DMS Mapping Name" diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index b66911cad..a94a19a5d 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -232,6 +232,7 @@ "templates": "" }, "dms": { + "default_journal": "", "dms_acctnumber": "", "dms_wip_acctnumber": "", "mappingname": "" diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index 435a10e71..c224706ef 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -232,6 +232,7 @@ "templates": "" }, "dms": { + "default_journal": "", "dms_acctnumber": "", "dms_wip_acctnumber": "", "mappingname": "" diff --git a/server/cdk/cdk-calculate-allocations.js b/server/cdk/cdk-calculate-allocations.js index f17682876..9b39719a3 100644 --- a/server/cdk/cdk-calculate-allocations.js +++ b/server/cdk/cdk-calculate-allocations.js @@ -6,11 +6,10 @@ require("dotenv").config({ ), }); const GraphQLClient = require("graphql-request").GraphQLClient; -const soap = require("soap"); + const queries = require("../graphql-client/queries"); const CdkBase = require("../web-sockets/web-socket"); -const CdkWsdl = require("./cdk-wsdl").default; -const logger = require("../utils/logger"); + const Dinero = require("dinero.js"); const _ = require("lodash"); diff --git a/server/cdk/cdk-get-makes.js b/server/cdk/cdk-get-makes.js new file mode 100644 index 000000000..c928f2125 --- /dev/null +++ b/server/cdk/cdk-get-makes.js @@ -0,0 +1,80 @@ +const path = require("path"); +require("dotenv").config({ + path: path.resolve( + process.cwd(), + `.env.${process.env.NODE_ENV || "development"}` + ), +}); +const GraphQLClient = require("graphql-request").GraphQLClient; +const soap = require("soap"); +const queries = require("../graphql-client/queries"); +const CdkBase = require("../web-sockets/web-socket"); +const CdkWsdl = require("./cdk-wsdl").default; +const logger = require("../utils/logger"); +const Dinero = require("dinero.js"); +const _ = require("lodash"); +const { + CDK_CREDENTIALS, + CheckCdkResponseForError, + checkIndividualResult, +} = require("./cdk-wsdl"); + +exports.default = async function (socket, cdk_dealerid) { + try { + CdkBase.createLogEvent( + socket, + "DEBUG", + `Getting makes and models list from CDK.` + ); + const t = await GetCdkMakes(socket, cdk_dealerid); + console.log(t); + return []; + } catch (error) { + CdkBase.createLogEvent( + socket, + "ERROR", + `Error encountered in CdkGetMakes. ${error}` + ); + } +}; + +async function GetCdkMakes(socket, cdk_dealerid) { + CdkBase.createLogEvent(socket, "TRACE", `{1} Begin GetCDkMakes WSDL Call`); + + try { + const soapClientVehicleSearch = await soap.createClientAsync( + CdkWsdl.VehicleSearch + ); + const soapResponseVehicleSearch = + await soapClientVehicleSearch.getVehIdsAsync( + { + arg0: CDK_CREDENTIALS, + arg1: { id: cdk_dealerid }, + }, + + {} + ); + CheckCdkResponseForError(socket, soapResponseVehicleSearch); + const [ + result, //rawResponse, soapheader, rawRequest + ] = soapResponseVehicleSearch; + CdkBase.createLogEvent( + socket, + "TRACE", + `soapResponseVehicleSearch.searchIDsByVINAsync Result ${JSON.stringify( + result, + null, + 2 + )}` + ); + const DmsVehicle = result && result.return && result.return[0]; + return DmsVehicle; + } catch (error) { + CdkBase.createLogEvent( + socket, + "ERROR", + `Error in CalculateDmsVid - ${JSON.stringify(error, null, 2)}` + ); + throw new Error(error); + } +} diff --git a/server/cdk/cdk-job-export.js b/server/cdk/cdk-job-export.js index eb28c98dc..78f28e47e 100644 --- a/server/cdk/cdk-job-export.js +++ b/server/cdk/cdk-job-export.js @@ -11,13 +11,11 @@ const queries = require("../graphql-client/queries"); const CdkBase = require("../web-sockets/web-socket"); const CdkWsdl = require("./cdk-wsdl").default; const logger = require("../utils/logger"); - -const IMEX_CDK_USER = process.env.IMEX_CDK_USER, - IMEX_CDK_PASSWORD = process.env.IMEX_CDK_PASSWORD; -const CDK_CREDENTIALS = { - password: IMEX_CDK_PASSWORD, - username: IMEX_CDK_USER, -}; +const { + CDK_CREDENTIALS, + CheckCdkResponseForError, + checkIndividualResult, +} = require("./cdk-wsdl"); exports.default = async function (socket, jobid) { socket.logEvents = []; @@ -458,55 +456,3 @@ async function CalculateDmsVid(socket, JobData) { throw new Error(error); } } - -function CheckCdkResponseForError(socket, soapResponse) { - if (!soapResponse[0]) { - //The response was null, this might be ok, it might not. - CdkBase.createLogEvent( - socket, - "WARNING", - `Warning detected in CDK Response - it appears to be null. Stack: ${ - new Error().stack - }` - ); - 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 && !ResultToCheck.errorLevel) - ) - //TODO: Verify that this is the best way to detect errors. - return; - else { - CdkBase.createLogEvent( - socket, - "ERROR", - `Error detected in CDK Response - ${JSON.stringify( - ResultToCheck, - null, - 2 - )}` - ); - - throw new Error( - `Error found while validating CDK response for ${JSON.stringify( - ResultToCheck, - null, - 2 - )}:` - ); - } -} diff --git a/server/cdk/cdk-wsdl.js b/server/cdk/cdk-wsdl.js index 9364dcdc3..c30f582f7 100644 --- a/server/cdk/cdk-wsdl.js +++ b/server/cdk/cdk-wsdl.js @@ -5,18 +5,83 @@ require("dotenv").config({ `.env.${process.env.NODE_ENV || "development"}` ), }); +const CdkBase = require("../web-sockets/web-socket"); +const IMEX_CDK_USER = process.env.IMEX_CDK_USER, + IMEX_CDK_PASSWORD = process.env.IMEX_CDK_PASSWORD; +const CDK_CREDENTIALS = { + password: IMEX_CDK_PASSWORD, + username: IMEX_CDK_USER, +}; + +exports.CDK_CREDENTIALS = CDK_CREDENTIALS; // const cdkDomain = // process.env.NODE_ENV === "production" // ? "https://3pa.dmotorworks.com" // : "https://uat-3pa.dmotorworks.com"; +function CheckCdkResponseForError(socket, soapResponse) { + if (!soapResponse[0]) { + //The response was null, this might be ok, it might not. + CdkBase.createLogEvent( + socket, + "WARNING", + `Warning detected in CDK Response - it appears to be null. Stack: ${ + new Error().stack + }` + ); + return; + } + + const ResultToCheck = soapResponse[0].return; + + if (Array.isArray(ResultToCheck)) { + ResultToCheck.forEach((result) => checkIndividualResult(socket, result)); + } else { + checkIndividualResult(socket, ResultToCheck); + } +} +exports.CheckCdkResponseForError = CheckCdkResponseForError; + +function checkIndividualResult(socket, ResultToCheck) { + if ( + ResultToCheck.errorLevel === 0 || + ResultToCheck.errorLevel === "0" || + ResultToCheck.code === "success" || + (!ResultToCheck.code && !ResultToCheck.errorLevel) + ) + //TODO: Verify that this is the best way to detect errors. + return; + else { + CdkBase.createLogEvent( + socket, + "ERROR", + `Error detected in CDK Response - ${JSON.stringify( + ResultToCheck, + null, + 2 + )}` + ); + + throw new Error( + `Error found while validating CDK response for ${JSON.stringify( + ResultToCheck, + null, + 2 + )}:` + ); + } +} + +exports.checkIndividualResult = checkIndividualResult; + const cdkDomain = "https://uat-3pa.dmotorworks.com"; exports.default = { // VehicleSearch: `${cdkDomain}/pip-vehicle/services/VehicleSearch?wsdl`, VehicleInsertUpdate: `${cdkDomain}/pip-vehicle/services/VehicleInsertUpdate?wsdl`, CustomerInsertUpdate: `${cdkDomain}/pip-customer/services/CustomerInsertUpdate?wsdl`, CustomerSearch: `${cdkDomain}/pip-customer/services/CustomerSearch?wsdl`, + VehicleSearch: `${cdkDomain}/pip-vehicle/services/VehicleSearch?wsdl`, }; // The following login credentials will be used for all PIPs and all environments (User Acceptance Testing and Production). diff --git a/server/web-sockets/web-socket.js b/server/web-sockets/web-socket.js index 61ef31557..3520266fe 100644 --- a/server/web-sockets/web-socket.js +++ b/server/web-sockets/web-socket.js @@ -9,6 +9,7 @@ require("dotenv").config({ const { io } = require("../../server"); const { admin } = require("../firebase/firebase-handler"); const CdkJobExport = require("../cdk/cdk-job-export").default; +const CdkGetMakes = require("../cdk/cdk-get-makes").default; const CdkCalculateAllocations = require("../cdk/cdk-calculate-allocations").default; const { isArray } = require("lodash"); @@ -62,6 +63,11 @@ io.on("connection", (socket) => { //CdkJobExport(socket, jobid); }); + socket.on("cdk-get-makes", async (cdk_dealerid, callback) => { + const makes = await CdkGetMakes(socket, cdk_dealerid); + callback(makes); + }); + socket.on("cdk-calculate-allocations", async (jobid, callback) => { const allocations = await CdkCalculateAllocations(socket, jobid); createLogEvent(socket, "DEBUG", `Allocations calculated.`);