diff --git a/client/src/pages/dms/dms.container.jsx b/client/src/pages/dms/dms.container.jsx index 342035ec5..3af437f24 100644 --- a/client/src/pages/dms/dms.container.jsx +++ b/client/src/pages/dms/dms.container.jsx @@ -105,7 +105,7 @@ export function DmsContainer({ bodyshop, setBreadcrumbs, setSelectedHeader }) { {log.level} {moment(log.timestamp).format("MM/DD/YYYY HH:MM:ss")} - {log.message} + {log.message} ))} diff --git a/server/cdk/cdk-job-export.js b/server/cdk/cdk-job-export.js index f4e7ee993..56362086e 100644 --- a/server/cdk/cdk-job-export.js +++ b/server/cdk/cdk-job-export.js @@ -13,6 +13,10 @@ const CdkWsdl = require("./cdk-wsdl").default; 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.default = async function (socket, jobid) { socket.logEvents = []; @@ -22,24 +26,94 @@ exports.default = async function (socket, jobid) { "DEBUG", `Received Job export request for id ${jobid}` ); - + socket["cdk-job-export"] = {}; + let clVFV, clADPV, clADPC; const JobData = await QueryJobData(socket, jobid); console.log(JSON.stringify(JobData, null, 2)); const DealerId = JobData.bodyshop.cdk_dealerid; - CdkBase.createLogEvent( socket, "TRACE", `Dealer ID detected: ${JSON.stringify(DealerId)}` ); - // Begin Calculate VID from DMS {1} - await DetermineDMSVid(socket, JobData); + //{1} Begin Calculate DMS Vehicle Id + clVFV = await CalculateDmsVid(socket, JobData); + if (clVFV.newId === "Y") { + //{1.2} This is a new Vehicle ID + CdkBase.createLogEvent( + socket, + "DEBUG", + `{1.2} clVFV DMSVid does *not* exist. 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( + socket, + "DEBUG", + `{6.6} Trying to find customer ID in DMS.` + ); + + //Array + const strIDS = await FindCustomerIdFromDms(socket, JobData); + if (strIDS.length > 0) { + CdkBase.createLogEvent(socket, "DEBUG", `{8.2} Customer ID(s) found.`); + } else { + CdkBase.createLogEvent( + socket, + "DEBUG", + `{8.5} Customer ID(s) *not* found.` + ); + } + } else { + CdkBase.createLogEvent( + socket, + "DEBUG", + `{1.2} clVFV DMSVid does exist. clVFV: ${JSON.stringify( + clVFV, + null, + 2 + )}` + ); + + //{2} Begin Find Vehicle in DMS + clADPV = await FindVehicleInDms(socket, JobData, clVFV); //TODO: Verify that this should always return a result. If an ID was found previously, it should be correct? + + //{2.2} Check if the vehicle was found in the DMS. + if (clADPV.AppErrorNo === "0") { + //Vehicle was found. + CdkBase.createLogEvent( + socket, + "DEBUG", + `{1.4} Vehicle was found in the DMS. 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 + )}` + ); + } + } } catch (error) { CdkBase.createLogEvent( socket, "ERROR", - `Error encountered in JobExport. ${error}` + `Error encountered in CdkJobExport. ${error}` ); } finally { //Ensure we always insert logEvents @@ -61,27 +135,200 @@ async function QueryJobData(socket, jobid) { return result.jobs_by_pk; } -async function DetermineDMSVid(socket, JobData) { - CdkBase.createLogEvent(socket, "TRACE", "{1} Begin Determine DMS VehicleID"); +async function FindCustomerIdFromDms(socket, JobData) { + const ownerName = `${JobData.ownr_ln},${JobData.ownr_fn}`; + CdkBase.createLogEvent( + socket, + "DEBUG", + `{8} Begin Read Customer from DMS using OWNER NAME: ${ownerName}` + ); try { - //Create SOAP Request for - const soapClient = await soap.createClientAsync(CdkWsdl.VehicleSearch); - const result = await soapClient.searchIDsByVINAsync( - { - arg0: { password: IMEX_CDK_PASSWORD, username: IMEX_CDK_USER }, - arg1: { id: JobData.bodyshop.cdk_dealerid }, - arg2: { VIN: JobData.v_vin }, - }, - - {} + const soapClientCustomerSearch = await soap.createClientAsync( + CdkWsdl.CustomerSearch ); - console.log(result); + const soapResponseCustomerSearch = + await soapClientCustomerSearch.executeSearchBulkAsync( + { + arg0: CDK_CREDENTIALS, + arg1: { id: JobData.bodyshop.cdk_dealerid }, + arg2: { + verb: "EXACT", + key: ownerName, + }, + }, + + {} + ); + CheckCdkResponseForError(socket, soapResponseCustomerSearch); + const [result, rawResponse, soapheader, rawRequest] = + soapResponseCustomerSearch; + //result format + // return: [ + // { + // code: 'success', + // carInvStockNo: '', + // errorLevel: '0', + // errorMessage: '', + // newId: 'Y', + // vehiclesVehId: 'HM263407' + // } + // ] + CdkBase.createLogEvent( + socket, + "TRACE", + `soapClientCustomerSearch.executeSearchBulkAsync Result ${JSON.stringify( + result, + null, + 2 + )}` + ); + const CustomersFromDms = result && result.return; + return CustomersFromDms; } catch (error) { CdkBase.createLogEvent( socket, "ERROR", - `Error in DetermineDMSVid - ${JSON.stringify(error, null, 2)}` + `Error in FindCustomerIdFromDms - ${JSON.stringify(error, null, 2)}` ); } } + +async function FindVehicleInDms(socket, JobData, clVFV) { + CdkBase.createLogEvent( + socket, + "DEBUG", + `{2}/{6} Begin Find Vehicle In DMS using clVFV: ${clVFV}` + ); + + try { + const soapClientVehicleInsertUpdate = await soap.createClientAsync( + CdkWsdl.VehicleInsertUpdate + ); + const soapResponseVehicleInsertUpdate = + await soapClientVehicleInsertUpdate.readBulkAsync( + { + arg0: CDK_CREDENTIALS, + arg1: { id: JobData.bodyshop.cdk_dealerid }, + arg2: { + fileType: "VEHICLES", + vehiclesVehicleId: clVFV.vehiclesVehId, + }, + }, + + {} + ); + CheckCdkResponseForError(socket, soapResponseVehicleInsertUpdate); + const [result, rawResponse, soapheader, rawRequest] = + soapResponseVehicleInsertUpdate; + //result format + // return: [ + // { + // code: 'success', + // carInvStockNo: '', + // errorLevel: '0', + // errorMessage: '', + // newId: 'Y', + // vehiclesVehId: 'HM263407' + // } + // ] + CdkBase.createLogEvent( + socket, + "TRACE", + `soapClientVehicleInsertUpdate.readBulkAsync Result ${JSON.stringify( + result, + null, + 2 + )}` + ); + const VehicleFromDMS = result && result.return && result.return[0]; + return VehicleFromDMS; + } catch (error) { + CdkBase.createLogEvent( + socket, + "ERROR", + `Error in FindVehicleInDms - ${JSON.stringify(error, null, 2)}` + ); + } +} + +async function CalculateDmsVid(socket, JobData) { + CdkBase.createLogEvent( + socket, + "TRACE", + `{1} Begin Calculate DMS Vehicle ID using VIN: ${JobData.v_vin}` + ); + + try { + const soapClientVehicleInsertUpdate = await soap.createClientAsync( + CdkWsdl.VehicleInsertUpdate + ); + const soapResponseVehicleInsertUpdate = + await soapClientVehicleInsertUpdate.getVehIdsAsync( + { + arg0: CDK_CREDENTIALS, + arg1: { id: JobData.bodyshop.cdk_dealerid }, + arg2: { VIN: JobData.v_vin }, + }, + + {} + ); + CheckCdkResponseForError(socket, soapResponseVehicleInsertUpdate); + const [result, rawResponse, soapheader, rawRequest] = + soapResponseVehicleInsertUpdate; + //result format + // return: [ + // { + // code: 'success', + // carInvStockNo: '', + // errorLevel: '0', + // errorMessage: '', + // newId: 'Y', + // vehiclesVehId: 'HM263407' + // } + // ] + CdkBase.createLogEvent( + socket, + "TRACE", + `soapClientVehicleInsertUpdate.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)}` + ); + } +} + +function CheckCdkResponseForError(socket, soapResponse) { + const ResultToCheck = Array.isArray(soapResponse[0].return) + ? soapResponse[0].return[0] + : soapResponse[0].return; + + if (ResultToCheck.errorLevel === 0 || ResultToCheck.errorLevel === "0") + //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 { + errorLevel: ResultToCheck.errorLevel, + errorMessage: ResultToCheck.errorMessage, + }; + } +} diff --git a/server/cdk/cdk-wsdl.js b/server/cdk/cdk-wsdl.js index acf66a0b5..9364dcdc3 100644 --- a/server/cdk/cdk-wsdl.js +++ b/server/cdk/cdk-wsdl.js @@ -1,4 +1,33 @@ +const path = require("path"); +require("dotenv").config({ + path: path.resolve( + process.cwd(), + `.env.${process.env.NODE_ENV || "development"}` + ), +}); + +// const cdkDomain = +// process.env.NODE_ENV === "production" +// ? "https://3pa.dmotorworks.com" +// : "https://uat-3pa.dmotorworks.com"; + +const cdkDomain = "https://uat-3pa.dmotorworks.com"; exports.default = { - VehicleSearch: - "https://uat-3pa.dmotorworks.com/pip-vehicle/services/VehicleSearch?wsdl", + // 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`, }; + +// The following login credentials will be used for all PIPs and all environments (User Acceptance Testing and Production). +// Only the URLs will change from https://uat-3pa.dmoto... to https://3pa.dmoto... or https://api-dit.connect... to https://api.connect... +// Accounting GL/Accounting GL WIP Update - https://uat-3pa.dmotorworks.com/pip-accounting-gl/services/AccountingGLInsertUpdate?wsdl +// Customer Insert Update - https://uat-3pa.dmotorworks.com/pip-customer/services/CustomerInsertUpdate?wsdl +// Help Database Location - https://uat-3pa.dmotorworks.com/pip-help-database-location/services/HelpDatabaseLocation?wsdl +// Parts Inventory Insert Update - https://uat-3pa.dmotorworks.com/pip-parts-inventory/services/PartsInventoryInsertUpdate?wsdl +// Purchase Order Insert - https://uat-3pa.dmotorworks.com/pip-purchase-order/services/PurchaseOrderInsert?wsdl +// Repair Order MLS Insert Update - https://uat-3pa.dmotorworks.com/pip-repair-order-mls/services/RepairOrderMLSInsertUpdate?wsdl +// Repair Order Parts Insert Update - https://uat-3pa.dmotorworks.com/pip-repair-order-parts/services/RepairOrderPartsInsertUpdate?wsdl +// Service History Insert - https://uat-3pa.dmotorworks.com/pip-service-history-insert/services/ServiceHistoryInsert?wsdl +// Service Repair Order Update - https://uat-3pa.dmotorworks.com/pip-service-repair-order/services/ServiceRepairOrderUpdate?wsdl +// Service Vehicle Insert Update - https://uat-3pa.dmotorworks.com/pip-vehicle/services/VehicleInsertUpdate?wsdl