WIP Fortellis.

This commit is contained in:
Patrick Fic
2025-04-25 11:58:38 -07:00
parent e2b4b408ed
commit 19ce1c66ad
7 changed files with 895 additions and 414 deletions

View File

@@ -0,0 +1,5 @@
Fortellis Feedback
Create Customer
https://apidocs.fortellis.io/apis/c5cfb5b3-2013-4870-8645-0379c01ae56b
Request Body compoennts do not show on website. Unable to determine which components are required.

View File

@@ -17,7 +17,7 @@ const mapDispatchToProps = (dispatch) => ({
}); });
export default connect(mapStateToProps, mapDispatchToProps)(DmsCustomerSelector); export default connect(mapStateToProps, mapDispatchToProps)(DmsCustomerSelector);
export function DmsCustomerSelector({ bodyshop }) { export function DmsCustomerSelector({ bodyshop, jobid }) {
const { t } = useTranslation(); const { t } = useTranslation();
const [customerList, setcustomerList] = useState([]); const [customerList, setcustomerList] = useState([]);
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
@@ -38,7 +38,7 @@ export function DmsCustomerSelector({ bodyshop }) {
if (Fortellis.treatment === "on") { if (Fortellis.treatment === "on") {
const handleFortellisSelectCustomer = (customerList, callback) => { const handleFortellisSelectCustomer = (customerList, callback) => {
setOpen(true); setOpen(true);
setDmsType("fortellis"); setDmsType("cdk");
setcustomerList(customerList); setcustomerList(customerList);
}; };
wsssocket.on("fortellis-select-customer", handleFortellisSelectCustomer); wsssocket.on("fortellis-select-customer", handleFortellisSelectCustomer);
@@ -67,7 +67,11 @@ export function DmsCustomerSelector({ bodyshop }) {
const onUseSelected = () => { const onUseSelected = () => {
setOpen(false); setOpen(false);
if (Fortellis.treatment === "on") {
wsssocket.emit(`fortellis-selected-customer`, { selectedCustomerId: selectedCustomer, jobid });
} else {
socket.emit(`${dmsType}-selected-customer`, selectedCustomer); socket.emit(`${dmsType}-selected-customer`, selectedCustomer);
}
setSelectedCustomer(null); setSelectedCustomer(null);
}; };

View File

@@ -72,7 +72,13 @@ export function DmsPostForm({ bodyshop, socket, job, logsRef }) {
const handleFinish = (values) => { const handleFinish = (values) => {
//TODO: Add this as a split instead. //TODO: Add this as a split instead.
if (Fortellis.treatment === "on") { if (Fortellis.treatment === "on") {
wsssocket.emit("fortellis-export-job", { jobid: job.id, txEnvelope: values }); wsssocket.emit("fortellis-export-job", {
jobid: job.id,
txEnvelope: {
...values,
SubscriptionID: "5b527d7d-baf3-40bc-adae-e7a541e37363" //bodyshop.cdk_dealerid
}
});
} else { } else {
socket.emit(`${determineDmsType(bodyshop)}-export-job`, { socket.emit(`${determineDmsType(bodyshop)}-export-job`, {
jobid: job.id, jobid: job.id,

View File

@@ -201,7 +201,7 @@ export function DmsContainer({ bodyshop, setBreadcrumbs, setSelectedHeader, inse
<DmsPostForm socket={socket} jobId={jobId} job={data && data.jobs_by_pk} logsRef={logsRef} /> <DmsPostForm socket={socket} jobId={jobId} job={data && data.jobs_by_pk} logsRef={logsRef} />
</Col> </Col>
<DmsCustomerSelector /> <DmsCustomerSelector jobid={jobId} />
<Col span={24}> <Col span={24}>
<div ref={logsRef}> <div ref={logsRef}>

View File

@@ -175,6 +175,17 @@ async function MakeFortellisCall({
} }
}); });
break; break;
case "put":
result = await axios.put(fullUrl, body, {
headers: {
Authorization: `Bearer ${access_token}`,
"Subscription-Id": SubscriptionMeta.subscriptionId,
"Request-Id": ReqId,
"Department-Id": DepartmentId,
...headers
}
});
break;
} }
if (debug) { if (debug) {
@@ -266,6 +277,34 @@ const FortellisActions = {
type: "get", type: "get",
apiName: "CDK Drive Post Customer", apiName: "CDK Drive Post Customer",
}, },
ReadCustomer: {
url: isProduction
? "https://api.fortellis.io/cdk/drive/customerpost/v1/" //Customer ID is request param.
: "https://api.fortellis.io/cdk-test/drive/customerpost/v1/",
type: "get",
apiName: "CDK Drive Post Customer",
},
CreateCustomer: {
url: isProduction
? "https://api.fortellis.io/cdk/drive/customerpost/v1/"
: "https://api.fortellis.io/cdk-test/drive/customerpost/v1/",
type: "post",
apiName: "CDK Drive Post Customer",
},
InsertVehicle: {
url: isProduction
? "https://api.fortellis.io/cdk/drive/service-vehicle-mgmt/v2/"
: "https://api.fortellis.io/cdk-test/drive/service-vehicle-mgmt/v2/",
type: "post",
apiName: "CDK Drive Post Service Vehicle",
},
UpdateVehicle: {
url: isProduction
? "https://api.fortellis.io/cdk/drive/service-vehicle-mgmt/v2/"
: "https://api.fortellis.io/cdk-test/drive/service-vehicle-mgmt/v2/",
type: "put",
apiName: "CDK Drive Post Customer",
},
GetCOA: { GetCOA: {
type: "get", type: "get",
apiName: "CDK Drive Post Accounts GL WIP", apiName: "CDK Drive Post Accounts GL WIP",
@@ -277,7 +316,14 @@ const FortellisActions = {
const FortellisCacheEnums = { const FortellisCacheEnums = {
txEnvelope: "txEnvelope", txEnvelope: "txEnvelope",
SubscriptionMeta: "SubscriptionMeta", SubscriptionMeta: "SubscriptionMeta",
DepartmentId: "DepartmentId" DepartmentId: "DepartmentId",
JobData: "JobData",
DMSVid: "DMSVid",
DMSVeh: "DMSVeh",
DMSVehCustomer: "DMSVehCustomer",
DMSCustList: "DMSCustList",
DMSCust: "DMSCust",
selectedCustomerId: "selectedCustomerId",
}; };
function constructFullUrl({ url, pathParams = "", requestSearchParams = [] }) { function constructFullUrl({ url, pathParams = "", requestSearchParams = [] }) {

View File

@@ -14,9 +14,8 @@ const {
defaultFortellisTTL, defaultFortellisTTL,
FortellisCacheEnums FortellisCacheEnums
} = require("./fortellis-helpers"); } = require("./fortellis-helpers");
const { last } = require("lodash"); const _ = require("lodash");
const moment = require("moment-timezone");
// const moment = require("moment-timezone");
const replaceSpecialRegex = /[^a-zA-Z0-9 .,\n #]+/g; const replaceSpecialRegex = /[^a-zA-Z0-9 .,\n #]+/g;
@@ -28,15 +27,15 @@ async function FortellisJobExport({
jobid jobid
}) { }) {
const { const {
setSessionData, // setSessionData,
getSessionData, // getSessionData,
addUserSocketMapping, // addUserSocketMapping,
removeUserSocketMapping, // removeUserSocketMapping,
refreshUserSocketTTL, // refreshUserSocketTTL,
getUserSocketMappingByBodyshop, // getUserSocketMappingByBodyshop,
setSessionTransactionData, setSessionTransactionData,
getSessionTransactionData, // getSessionTransactionData,
clearSessionTransactionData // clearSessionTransactionData
} = redisHelpers; } = redisHelpers;
try { try {
CreateFortellisLogEvent(socket, "debug", `Received Job export request for id ${jobid}`); CreateFortellisLogEvent(socket, "debug", `Received Job export request for id ${jobid}`);
@@ -49,21 +48,21 @@ async function FortellisJobExport({
); );
const JobData = await QueryJobData({ socket, jobid }); //TODO: Need to remove unnecessary stuff here to reduce the payload. const JobData = await QueryJobData({ socket, jobid }); //TODO: Need to remove unnecessary stuff here to reduce the payload.
await setSessionTransactionData(socket.id, getTransactionType(jobid), `JobData`, JobData, defaultFortellisTTL); await setSessionTransactionData(socket.id, getTransactionType(jobid), FortellisCacheEnums.JobData, JobData, defaultFortellisTTL);
CreateFortellisLogEvent(socket, "DEBUG", `{1} Begin Calculate DMS Vehicle ID using VIN: ${JobData.v_vin}`); CreateFortellisLogEvent(socket, "DEBUG", `{1} Begin Calculate DMS Vehicle ID using VIN: ${JobData.v_vin}`);
const DMSVid = await CalculateDmsVid({ socket, JobData, redisHelpers }); const DMSVid = await CalculateDmsVid({ socket, JobData, redisHelpers });
await setSessionTransactionData(socket.id, getTransactionType(jobid), `DMSVid`, DMSVid, defaultFortellisTTL); await setSessionTransactionData(socket.id, getTransactionType(jobid), FortellisCacheEnums.DMSVid, DMSVid, defaultFortellisTTL);
let DMSVehCustomer; let DMSVehCustomer;
if (DMSVid.newId === "N") { if (!DMSVid.newId) {
CreateFortellisLogEvent( CreateFortellisLogEvent(
socket, socket,
"DEBUG", "DEBUG",
`{2.1} Querying the Vehicle using the DMSVid: ${socket.DMSVid.vehiclesVehId}` `{2.1} Querying the Vehicle using the DMSVid: ${DMSVid.vehiclesVehId}`
); );
const DMSVeh = await QueryDmsVehicleById({ socket, redisHelpers, JobData, DMSVid }); const DMSVeh = await QueryDmsVehicleById({ socket, redisHelpers, JobData, DMSVid });
await setSessionTransactionData(socket.id, getTransactionType(jobid), `DMSVeh`, DMSVeh, defaultFortellisTTL); await setSessionTransactionData(socket.id, getTransactionType(jobid), FortellisCacheEnums.DMSVeh, DMSVeh, defaultFortellisTTL);
const DMSVehCustomerFromVehicle = const DMSVehCustomerFromVehicle =
DMSVeh && DMSVeh.owners && DMSVeh.owners.find((o) => o.id.assigningPartyId === "CURRENT"); DMSVeh && DMSVeh.owners && DMSVeh.owners.find((o) => o.id.assigningPartyId === "CURRENT");
@@ -75,13 +74,13 @@ async function FortellisJobExport({
`{2.2} Querying the Customer using the ID from DMSVeh: ${DMSVehCustomerFromVehicle.id.value}` `{2.2} Querying the Customer using the ID from DMSVeh: ${DMSVehCustomerFromVehicle.id.value}`
); );
DMSVehCustomer = await QueryDmsCustomerById({ socket, redisHelpers, JobData, CustomerId: DMSVehCustomerFromVehicle.id.value }); DMSVehCustomer = await QueryDmsCustomerById({ socket, redisHelpers, JobData, CustomerId: DMSVehCustomerFromVehicle.id.value });
await setSessionTransactionData(socket.id, getTransactionType(jobid), `DMSVehCustomer`, DMSVehCustomer, defaultFortellisTTL); await setSessionTransactionData(socket.id, getTransactionType(jobid), FortellisCacheEnums.DMSVehCustomer, DMSVehCustomer, defaultFortellisTTL);
} }
} }
CreateFortellisLogEvent(socket, "DEBUG", `{2.3} Querying the Customer using the name.`); CreateFortellisLogEvent(socket, "DEBUG", `{2.3} Querying the Customer using the name.`);
const DMSCustList = await QueryDmsCustomerByName({ socket, redisHelpers, JobData }); const DMSCustList = await QueryDmsCustomerByName({ socket, redisHelpers, JobData });
await setSessionTransactionData(socket.id, getTransactionType(jobid), `DMSCustList`, DMSCustList, defaultFortellisTTL); await setSessionTransactionData(socket.id, getTransactionType(jobid), FortellisCacheEnums.DMSCustList, DMSCustList, defaultFortellisTTL);
socket.emit("fortellis-select-customer", [ socket.emit("fortellis-select-customer", [
@@ -99,33 +98,73 @@ async function FortellisJobExport({
// async function CdkSelectedCustomer(socket, selectedCustomerId) { async function FortellisSelectedCustomer({ socket, redisHelpers, ioHelpers, selectedCustomerId, jobid }) {
// try { try {
// socket.selectedCustomerId = selectedCustomerId; const {
// if (selectedCustomerId) { // setSessionData,
// CdkBase.createLogEvent(socket, "DEBUG", `{3.1} Querying the Customer using Customer ID: ${selectedCustomerId}`); // getSessionData,
// socket.DMSCust = await QueryDmsCustomerById(socket, socket.JobData, selectedCustomerId); // addUserSocketMapping,
// } else { // removeUserSocketMapping,
// CdkBase.createLogEvent(socket, "DEBUG", `{3.2} Generating a new customer ID.`); // refreshUserSocketTTL,
// const newCustomerId = await GenerateDmsCustomerNumber(socket); // getUserSocketMappingByBodyshop,
// CdkBase.createLogEvent(socket, "DEBUG", `{3.3} Inserting new customer with ID: ${newCustomerId}`); setSessionTransactionData,
// socket.DMSCust = await InsertDmsCustomer(socket, newCustomerId); getSessionTransactionData,
// } //clearSessionTransactionData
} = redisHelpers;
// if (socket.DMSVid.newId === "Y") { await setSessionTransactionData(socket.id, getTransactionType(jobid), FortellisCacheEnums.selectedCustomerId, selectedCustomerId, defaultFortellisTTL);
// CdkBase.createLogEvent(socket, "DEBUG", `{4.1} Inserting new vehicle with ID: ID ${socket.DMSVid.vehiclesVehId}`); const JobData = await getSessionTransactionData(socket.id, getTransactionType(jobid), FortellisCacheEnums.JobData);
// socket.DMSVeh = await InsertDmsVehicle(socket); const txEnvelope = await getSessionTransactionData(socket.id, getTransactionType(jobid), FortellisCacheEnums.txEnvelope);
// } else { const DMSVid = await redisHelpers.getSessionTransactionData(socket.id, getTransactionType(JobData.id), FortellisCacheEnums.DMSVid);
// CdkBase.createLogEvent(
// socket,
// "DEBUG",
// `{4.2} Querying Existing Vehicle using ID ${socket.DMSVid.vehiclesVehId}`
// );
// socket.DMSVeh = await QueryDmsVehicleById(socket, socket.JobData, socket.DMSVid);
// CdkBase.createLogEvent(socket, "DEBUG", `{4.3} Updating Existing Vehicle to associate to owner.`);
// socket.DMSVeh = await UpdateDmsVehicle(socket);
// }
let DMSCust;
if (selectedCustomerId) {
CreateFortellisLogEvent(
socket,
"DEBUG",
`{3.1} Querying the Customer using Customer ID: ${selectedCustomerId}`
);
DMSCust = await QueryDmsCustomerById({ socket, redisHelpers, JobData, CustomerId: selectedCustomerId });
await setSessionTransactionData(socket.id, getTransactionType(jobid), FortellisCacheEnums.DMSCust, DMSCust, defaultFortellisTTL);
} else {
CreateFortellisLogEvent(
socket,
"DEBUG",
`{3.2} Creating new customer.`
);
DMSCust = await InsertDmsCustomer({ socket, redisHelpers, JobData });
await setSessionTransactionData(socket.id, getTransactionType(jobid), FortellisCacheEnums.DMSCust, DMSCust, defaultFortellisTTL);
}
let DMSVeh;
if (DMSVid.newId) {
CreateFortellisLogEvent(
socket,
"DEBUG",
`{4.1} Inserting new vehicle with ID: ID ${DMSVid.vehiclesVehId}`
);
DMSVeh = await InsertDmsVehicle({ socket, redisHelpers, JobData, txEnvelope, DMSVid, DMSCust });
} else {
CreateFortellisLogEvent(
socket,
"DEBUG",
`{4.2} Querying Existing Vehicle using ID ${DMSVid.vehiclesVehId}`
);
DMSVeh = await QueryDmsVehicleById({ socket, redisHelpers, JobData, DMSVid });
CreateFortellisLogEvent(
socket,
"DEBUG",
`{4.3} Updating Existing Vehicle to associate to owner.`
);
DMSVeh = await UpdateDmsVehicle({ socket, redisHelpers, JobData, DMSVeh, DMSCust, selectedCustomerId, txEnvelope });
}
////New code above.
/// Old code below.
console.log(DMSVeh)
// CdkBase.createLogEvent(socket, "DEBUG", `{5} Creating Transaction header with Dms Start WIP`); // CdkBase.createLogEvent(socket, "DEBUG", `{5} Creating Transaction header with Dms Start WIP`);
// socket.DMSTransHeader = await InsertDmsStartWip(socket); // socket.DMSTransHeader = await InsertDmsStartWip(socket);
// CdkBase.createLogEvent(socket, "DEBUG", `{5.1} Creating Transaction with ID ${socket.DMSTransHeader.transID}`); // CdkBase.createLogEvent(socket, "DEBUG", `{5.1} Creating Transaction with ID ${socket.DMSTransHeader.transID}`);
@@ -167,18 +206,18 @@ async function FortellisJobExport({
// CdkBase.createLogEvent(socket, "ERROR", `Error(s) encountered in posting transaction. ${e}`) // CdkBase.createLogEvent(socket, "ERROR", `Error(s) encountered in posting transaction. ${e}`)
// ); // );
// } // }
// } catch (error) { } catch (error) {
// CdkBase.createLogEvent(socket, "ERROR", `Error encountered in CdkSelectedCustomer. ${error}`); // CdkBase.createLogEvent(socket, "ERROR", `Error encountered in CdkSelectedCustomer. ${error}`);
// await InsertFailedExportLog(socket, error); // await InsertFailedExportLog(socket, error);
// } finally { } finally {
// //Ensure we always insert logEvents //Ensure we always insert logEvents
// //GQL to insert logevents. //GQL to insert logevents.
//CdkBase.createLogEvent(socket, "DEBUG", `Capturing log events to database.`); //CdkBase.createLogEvent(socket, "DEBUG", `Capturing log events to database.`);
// } }
//} }
// exports.CdkSelectedCustomer = CdkSelectedCustomer; exports.FortellisSelectedCustomer = FortellisSelectedCustomer;
async function QueryJobData({ socket, jobid }) { async function QueryJobData({ socket, jobid }) {
const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, {}); const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, {});
@@ -217,8 +256,7 @@ async function QueryDmsVehicleById({ socket, redisHelpers, JobData, DMSVid }) {
jobid: JobData.id, jobid: JobData.id,
body: {}, body: {},
}); });
const VehicleFromDMS = result && result.return && result.return.vehicle; return result;
return VehicleFromDMS;
} catch (error) { } catch (error) {
CreateFortellisLogEvent(socket, "ERROR", `Error in QueryDmsVehicleById - ${error}`, { request: error.request }); CreateFortellisLogEvent(socket, "ERROR", `Error in QueryDmsVehicleById - ${error}`, { request: error.request });
} }
@@ -226,41 +264,19 @@ async function QueryDmsVehicleById({ socket, redisHelpers, JobData, DMSVid }) {
async function QueryDmsCustomerById({ socket, redisHelpers, JobData, CustomerId }) { async function QueryDmsCustomerById({ socket, redisHelpers, JobData, CustomerId }) {
try { try {
const soapClientCustomerInsertUpdate = await soap.createClientAsync(CdkWsdl.CustomerInsertUpdate); const result = await MakeFortellisCall({
const soapResponseCustomerInsertUpdate = await soapClientCustomerInsertUpdate.readAsync({ ...FortellisActions.ReadCustomer,
arg0: CDK_CREDENTIALS, requestPathParams: CustomerId,
arg1: { dealerId: JobData.bodyshop.cdk_dealerid }, //TODO: Verify why this does not follow the other standards. headers: {},
arg2: { redisHelpers,
// userId: CustomerId, socket,
}, jobid: JobData.id,
arg3: CustomerId body: {},
}); });
return result.data;
const [result, rawResponse, , rawRequest] = soapResponseCustomerInsertUpdate;
CdkBase.createXmlEvent(socket, rawRequest, `soapClientCustomerInsertUpdate.readAsync request.`);
CdkBase.createXmlEvent(socket, rawResponse, `soapClientCustomerInsertUpdate.readAsync response.`);
CdkBase.createLogEvent(
socket,
"SILLY",
`soapClientCustomerInsertUpdate.readAsync Result ${JSON.stringify(result, null, 2)}`
);
CheckCdkResponseForError(socket, soapResponseCustomerInsertUpdate);
const CustomersFromDms = result && result.return && result.return.customerParty;
return CustomersFromDms;
} catch (error) { } catch (error) {
CdkBase.createXmlEvent(socket, error.request, `soapClientCustomerInsertUpdate.readAsync request.`, true); CreateFortellisLogEvent(socket, "ERROR", `Error in QueryDmsCustomerById - ${error}`, { request: error.request });
CdkBase.createXmlEvent(
socket,
error.response && error.response.data,
`soapClientCustomerInsertUpdate.readAsync response.`,
true
);
CdkBase.createLogEvent(socket, "ERROR", `Error in QueryDmsCustomerById - ${error}`);
throw new Error(error);
} }
} }
@@ -293,53 +309,205 @@ async function QueryDmsCustomerByName({ socket, redisHelpers, JobData }) {
} }
} }
// async function GenerateDmsCustomerNumber(socket) { async function InsertDmsCustomer({ socket, redisHelpers, JobData }) {
// try {
// const soapClientCustomerInsertUpdate = await soap.createClientAsync(CdkWsdl.CustomerInsertUpdate); try {
// const soapResponseCustomerInsertUpdate = await soapClientCustomerInsertUpdate.getCustomerNumberAsync( const result = await MakeFortellisCall({
// { ...FortellisActions.CreateCustomer,
// arg0: CDK_CREDENTIALS, headers: {},
// arg1: { dealerId: socket.JobData.bodyshop.cdk_dealerid }, //TODO: Verify why this does not follow the other standards. redisHelpers,
// arg2: { userId: null } socket,
jobid: JobData.id,
body: {
"customerType": "INDIVIDUAL",
"customerName": {
//"suffix": "Mr.",
"firstName": JobData.ownr_fn && JobData.ownr_fn.replace(replaceSpecialRegex, "").toUpperCase(),
//"middleName": "",
"lastName": JobData.ownr_ln && JobData.ownr_ln.replace(replaceSpecialRegex, "").toUpperCase(),
//"title": "",
//"nickName": ""
},
"companyName": JobData.ownr_co_nm && JobData.ownr_co_nm.replace(replaceSpecialRegex, "").toUpperCase(),
"postalAddress": {
"addressLine1": JobData.ownr_addr1?.replace(replaceSpecialRegex, "").trim(),
"addressLine2": JobData.ownr_addr2?.replace(replaceSpecialRegex, "").trim(),
"city": JobData.ownr_city?.replace(replaceSpecialRegex, "").trim(),
"state": JobData.ownr_state?.replace(replaceSpecialRegex, "").trim(),
"postalCode": InstanceMgr({
imex:
JobData.ownr_zip &&
JobData.ownr_zip
.toUpperCase()
.replace(/\W/g, "")
.replace(/(...)/, "$1 "),
rome: JobData.ownr_zip
}),
//"county": JobData.ownr_county?.trim(),
"country": JobData.ownr_ctry?.replace(replaceSpecialRegex, "").trim(),
"province": JobData.ownr_st?.replace(replaceSpecialRegex, "").trim(),
//"territory": ""
},
// "birthDate": {
// "day": "15",
// "month": "07",
// "year": "1979"
// }, // },
//"gender": "M",
//"language": "English",
"contactMethods": {
"phones": [
{
//"uuid": "",
"number": JobData.ownr_ph1?.replace(replaceSpecialRegex, ""),
// "type": "MOBILE",
// "doNotCallIndicator": true,
// "doNotCallIndicatorDate": `null,
// "doNotCallRegistrySource": "",
// "isOnDoNotCallRegistry": false,
// "isPrimary": false,
// "isPreferred": false,
// "isTextMessageAllowed": false,
// "textMessageCarrier": "",
// "optInDate": null,
// "optInRequestedDate": null,
// "preferredDay": "",
// "preferredTime": ""
},
// {
// "uuid": "",
// "number": "6666666666",
// "type": "MOBILE",
// "doNotCallIndicator": true,
// "doNotCallIndicatorDate": null,
// "doNotCallRegistrySource": "",
// "isOnDoNotCallRegistry": false,
// "isPrimary": true,
// "isPreferred": true,
// "isTextMessageAllowed": false,
// "textMessageCarrier": "",
// "optInDate": null,
// "optInRequestedDate": null,
// "preferredDay": "",
// "preferredTime": ""
// }
],
"emailAddresses": [
// {} !_.isEmpty(socket.JobData.ownr_ea) ?
// ); [{
//"uuid": "",
// const [result, rawResponse, , rawRequest] = soapResponseCustomerInsertUpdate; "address": socket.JobData.ownr_ea,
// "type": "PERSONAL",
// CdkBase.createXmlEvent(socket, rawRequest, `soapClientCustomerInsertUpdate.getCustomerNumberAsync request.`); // "doNotEmailSource": "",
// "doNotEmail": false,
// CdkBase.createXmlEvent(socket, rawResponse, `soapClientCustomerInsertUpdate.getCustomerNumberAsync response.`); // "isPreferred": true,
// "transactionEmailNotificationOptIn": false,
// CdkBase.createLogEvent( // "optInRequestDate": null,
// socket, // "optInDate": null
// "SILLY", }] : [],
// `soapClientCustomerInsertUpdate.getCustomerNumberAsync Result ${JSON.stringify(result, null, 2)}` // {
// ); // "uuid": "",
// CheckCdkResponseForError(socket, soapResponseCustomerInsertUpdate); // "address": "jilldoe@test.com",
// const customerNumber = result && result.return && result.return.customerNumber; // "type": "WORK",
// return customerNumber; // "doNotEmailSource": "",
// } catch (error) { // "doNotEmail": false,
// CdkBase.createXmlEvent( // "isPreferred": false,
// socket, // "transactionEmailNotificationOptIn": false,
// error.request, // "optInRequestDate": null,
// `soapClientCustomerInsertUpdate.getCustomerNumberAsync request.`, // "optInDate": null
// true // }
// ); ]
},
// CdkBase.createXmlEvent( // // "doNotContact": false,
// socket, // // "optOutDate": "",
// error.response && error.response.data, // // "optOutTime": "",
// `soapClientCustomerInsertUpdate.getCustomerNumberAsync response.`, // // "optOutFlag": false,
// true // // "isDeleteDataFlag": false,
// ); // // "deleteDataDate": "",
// CdkBase.createLogEvent(socket, "ERROR", `Error in GenerateDmsCustomerNumber - ${error}`); // // "deleteDataTime": "",
// throw new Error(error); // // "blockMailFlag": true,
// // "dateAdded": "",
// // "employer": "employer",
// "insurance": {
// "policy": {
// "effectiveDate": "2022-01-01",
// "expirationDate": "2023-01-01",
// "number": "12345",
// "verifiedBy": "Agent",
// "verifiedDate": "2023-01-01",
// "insPolicyCollisionDed": "",
// "insPolicyComprehensiveDed": "",
// "insPolicyFireTheftDed": ""
// },
// "insuranceAgency": {
// "agencyName": "InsAgency",
// "agentName": "agent",
// "phoneNumber": "9999999999",
// "postalAddress": {
// "addressLine1": "999 Main St",
// "addressLine2": "Suite 999",
// "city": "Austin",
// "state": "TX",
// "postalCode": "78750",
// "county": "Travis",
// "country": "USA"
// }
// },
// "insuranceCompany": {
// "name": "InsCompany",
// "phoneNumber": "8888888888",
// "postalAddress": {
// "addressLine1": "888 Main St",
// "addressLine2": "Suite 888",
// "city": "Austin",
// "state": "TX",
// "postalCode": "78750",
// "county": "Travis",
// "country": "USA"
// } // }
// } // }
// },
// "specialInstructions": [
// {
// "lineNuber": "1",
// "specialInstruction": "specialInstruction1"
// },
// {
// "lineNuber": "2",
// "specialInstruction": "specialInstruction2"
// }
// ],
// "groupCode": "PT",
// "priceCode": "5",
// "roPriceCode": "5",
// "taxCode": "3145",
// "dealerLoyaltyIndicator": "PN612345",
// "delCdeServiceNames": "99",
// "deleteCode": "9999",
// "fleetFlag": "1",
// "dealerFields": [
// {
// "lineNumber": null,
// "dealerField": "Custom dealer field value 1"
// },
// {
// "lineNumber": null,
// "dealerField": "Custom dealer field value 2"
// },
// {
// "lineNumber": null,
// "dealerField": "Custom dealer field value 3"
// }
// ]
},
});
return result;
} catch (error) {
CreateFortellisLogEvent(socket, "ERROR", `Error in InsertDmsCustomer - ${error}`, { request: error.request });
}
// async function InsertDmsCustomer(socket, newCustomerNumber) {
// try { // try {
// const soapClientCustomerInsertUpdate = await soap.createClientAsync(CdkWsdl.CustomerInsertUpdate); // const soapClientCustomerInsertUpdate = await soap.createClientAsync(CdkWsdl.CustomerInsertUpdate);
// const soapResponseCustomerInsertUpdate = await soapClientCustomerInsertUpdate.insertAsync( // const soapResponseCustomerInsertUpdate = await soapClientCustomerInsertUpdate.insertAsync(
@@ -420,82 +588,307 @@ async function QueryDmsCustomerByName({ socket, redisHelpers, JobData }) {
// CdkBase.createLogEvent(socket, "ERROR", `Error in InsertDmsCustomer - ${error}`); // CdkBase.createLogEvent(socket, "ERROR", `Error in InsertDmsCustomer - ${error}`);
// throw new Error(error); // throw new Error(error);
// } // }
// } }
// async function InsertDmsVehicle(socket) { async function InsertDmsVehicle({ socket, redisHelpers, JobData, txEnvelope, DMSVid, DMSCust }) {
// try { try {
// const soapClientVehicleInsertUpdate = await soap.createClientAsync(CdkWsdl.VehicleInsertUpdate);
// const soapResponseVehicleInsertUpdate = await soapClientVehicleInsertUpdate.insertAsync({ const result = await MakeFortellisCall({
// arg0: CDK_CREDENTIALS, ...FortellisActions.InsertVehicle,
// arg1: { id: socket.JobData.bodyshop.cdk_dealerid }, requestSearchParams: {},
// arg2: { headers: {},
// dealer: { redisHelpers,
// dealerNumber: socket.JobData.bodyshop.cdk_dealerid, socket,
// ...(socket.txEnvelope.inservicedate && { jobid: JobData.id,
// inServiceDate: body: {
// socket.txEnvelope.dms_unsold === true "dealer": {
// ? "" "company": JobData.bodyshop.cdk_configuration.srcco || "77",
// : moment(socket.txEnvelope.inservicedate) // "dealNumber": "",
// //.tz(socket.JobData.bodyshop.timezone) // "dealerAssignedNumber": "82268",
// .startOf("day") // "dealerDefined1": "2WDSP",
// .toISOString() // "dealerDefined2": "33732.71",
// }), // "dealerDefined3": "",
// vehicleId: socket.DMSVid.vehiclesVehId // "dealerDefined4": "G0901",
// "dealerDefined5": "",
// "dealerDefined6": "",
// "dealerDefined7": "",
// "dealerDefined8": "",
// "dealerNumber": "",
...(txEnvelope.inservicedate && {
inServiceDate:
txEnvelope.dms_unsold === true
? ""
: moment(txEnvelope.inservicedate)
//.tz(JobData.bodyshop.timezone)
.startOf("day")
.toISOString()
}),
//"lastServiceDate": "2011-11-23",
"vehicleId": DMSVid.vehiclesVehId,
// "vehicleLocation": "",
// "vehicleSoldDate": "2021-04-06",
// "wholesaleVehicleInd": false
},
// "manufacturer": {
// "name": "",
// "plant": "",
// "productionNumber": "PZPKM6",
// "vehicleProductionDate": "2020-04-06"
// }, // },
// manufacturer: {}, // "invoice": {
// vehicle: { // "entryDate": "2012-01-19",
// deliveryDate: // "freight": {
// socket.txEnvelope.dms_unsold === true // "freightInCharge": 995.95,
// ? "" // "freightOutCharge": 95.95,
// : moment() // "freightTaxCharge": 5.95
// // .tz(socket.JobData.bodyshop.timezone)
// .format("YYYYMMDD"),
// licensePlateNo:
// socket.JobData.plate_no === null
// ? null
// : String(socket.JobData.plate_no).replace(/([^\w]|_)/g, "").length === 0
// ? null
// : String(socket.JobData.plate_no)
// .replace(/([^\w]|_)/g, "")
// .toUpperCase(),
// make: socket.txEnvelope.dms_make,
// modelAbrev: socket.txEnvelope.dms_model,
// modelYear: socket.JobData.v_model_yr,
// odometerStatus: socket.txEnvelope.kmout,
// saleClassValue: "MISC",
// VIN: socket.JobData.v_vin
// }, // },
// owners: { // "vehicleAcquisitionDate": "2012-01-18",
// id: { // "vehicleOrderDate": "2012-01-12",
// assigningPartyId: "CURRENT", // "vehicleOrderNumber": "",
// value: socket.DMSCust.id.value // "vehicleOrderPriority": "",
// } // "vehicleOrderType": "TRE RETAIL - STOCK"
// }
// }, // },
// arg3: "VEHICLES" "vehicle": {
// }); // "axleCode": "GU6/3.42 REAR AXLE RATIO",
// "axleCount": 2,
// const [result, rawResponse, , rawRequest] = soapResponseVehicleInsertUpdate; // "bodyStyle": "PU",
// "brakeSystem": "",
// CdkBase.createXmlEvent(socket, rawRequest, `soapClientVehicleInsertUpdate.insertAsync request.`); // "cabType": "",
// "certifiedPreownedInd": false,
// CdkBase.createLogEvent( // "certifiedPreownedNumber": "",
// socket, // "chassis": "",
// "SILLY", // "color": "",
// `soapClientVehicleInsertUpdate.insertAsync Result ${JSON.stringify(result, null, 2)}` // "dealerBodyStyle": "",
// ); deliveryDate:
// CdkBase.createXmlEvent(socket, rawResponse, `soapClientVehicleInsertUpdate.insertAsync response.`); txEnvelope.dms_unsold === true
// CheckCdkResponseForError(socket, soapResponseVehicleInsertUpdate); ? ""
// const VehicleFromDMS = result && result.return && result.return.vehicle; : moment()
// return VehicleFromDMS; // .tz(JobData.bodyshop.timezone)
// } catch (error) { .format("YYYY-MM-DD"),
// CdkBase.createLogEvent(socket, "ERROR", `Error in InsertDmsVehicle - ${error}`); // "deliveryMileage": 4,
// throw new Error(error); // "doorsQuantity": 4,
// "engineNumber": "",
// "engineType": "LMG/VORTEC 5.3L VVT V8 SFI FLEXFUEL",
// "exteriorColor": "",
// "fleetVehicleId": "",
// "frontTireCode": "",
// "gmRPOCode": "",
// "ignitionKeyNumber": "",
// "interiorColor": "EBONY",
licensePlateNo:
JobData.plate_no === null
? null
: String(JobData.plate_no).replace(/([^\w]|_)/g, "").length === 0
? null
: String(JobData.plate_no)
.replace(/([^\w]|_)/g, "")
.toUpperCase(),
make: txEnvelope.dms_make,
// "model": "CC10753",
modelAbrev: txEnvelope.dms_model,
// "modelDescription": "SILVERADO 1500 2WD EXT CAB LT",
// "modelType": "T",
modelYear: JobData.v_model_yr,
// "numberOfEngineCylinders": 4,
odometerStatus: txEnvelope.kmout,
// "options": [
// {
// "optionCategory": "SS",
// "optionCode": "A95",
// "optionCost": 875.6,
// "optionDescription": "FRONT BUCKET SEATS INCLUDING: PWR SEAT ADJUST DRIVER 6-WAY",
// "optionPrices": [
// {
// "optionPricingType": "RETAIL",
// "price": 995
// },
// {
// "optionPricingType": "INVOICE",
// "price": 875.6
// } // }
// ]
// },
// {
// "optionCategory": "E",
// "optionCode": "LMG",
// "optionCost": 0,
// "optionDescription": "VORTEC 5.3L V8 SFI ENGINE W/ACTIVE FUEL MANAGEMENT",
// "optionPrices": [
// {
// "optionPricingType": "RETAIL",
// "price": 0
// },
// {
// "optionPricingType": "INVOICE",
// "price": 0
// } // }
// ]
// }
// ],
// "rearTireCode": "",
// "restraintSystem": "",
saleClassValue: "MISC",
// "sourceCodeValue": "",
// "sourceDescription": "",
// "standardEquipment": "",
// "stickerNumber": "",
// "transmissionType": "A",
// "transmissionNo": "MYC/ELECTRONIC 6-SPEED AUTOMATIC W/OD",
// "trimCode": "",
// "vehicleNote": "",
// "vehiclePrices": [
// {
// "price": 35894,
// "vehiclePricingType": "SELLINGPRICE"
// },
// {
// "price": 33749.87,
// "vehiclePricingType": "INVOICE"
// },
// {
// "price": 36472,
// "vehiclePricingType": "RETAIL"
// },
// {
// "price": 28276.66,
// "vehiclePricingType": "BASEINVOICE"
// },
// {
// "price": 30405,
// "vehiclePricingType": "BASERETAIL"
// },
// {
// "price": 33749.87,
// "vehiclePricingType": "COMMISSIONPRICE"
// },
// {
// "price": 32702.9,
// "vehiclePricingType": "DRAFTAMOUNT"
// }
// ],
// "vehicleStatus": "G",
// "vehicleStock": "82268",
// "vehicleWeight": "6800",
vin: JobData.v_vin
// "warrantyExpDate": "2015-01-12",
// "wheelbase": ""
},
"owners": [
{
"id": {
assigningPartyId: "CURRENT",
value: DMSCust.customerId
},
}
],
//"inventoryAccount": "237"
},
});
return result.data;
} catch (error) {
CreateFortellisLogEvent(socket, "ERROR", `Error in InsertDmsVehicle - ${error}`, { request: error.request });
}
}
async function UpdateDmsVehicle({ socket, redisHelpers, JobData, DMSVeh, DMSCust, selectedCustomerId, txEnvelope }) {
try {
let ids = [];
//if it's a generic customer, don't update the vehicle owners.
if (selectedCustomerId === JobData.bodyshop.cdk_configuration.generic_customer_number) {
ids = DMSVeh && DMSVeh.owners && DMSVeh.owners;
} else {
const existingOwnerinVeh =
DMSVeh &&
DMSVeh.owners &&
DMSVeh.owners.find((o) => o.id.value === DMSCust.customerId);
if (existingOwnerinVeh) {
ids = DMSVeh.owners.map((o) => {
return {
id: {
assigningPartyId: o.id.value === DMSCust.customerId ? "CURRENT" : "PREVIOUS",
value: o.id.value
}
};
});
} else {
const oldOwner =
DMSVeh &&
DMSVeh.owners &&
DMSVeh.owners.find((o) => o.id.assigningPartyId === "CURRENT");
ids = [
{
id: {
assigningPartyId: "CURRENT",
value: DMSCust.customerId
}
},
...(oldOwner
? [
{
id: {
assigningPartyId: "PREVIOUS",
value: oldOwner.id
}
}
]
: [])
];
}
}
const result = await MakeFortellisCall({
...FortellisActions.UpdateVehicle,
requestSearchParams: {},
headers: {},
redisHelpers,
socket,
jobid: JobData.id,
body: {
...DMSVeh,
dealer: {
...DMSVeh.dealer,
...((txEnvelope.inservicedate || DMSVeh.dealer.inServiceDate) && {
inServiceDate:
txEnvelope.dms_unsold === true
? ""
: moment(DMSVeh.dealer.inServiceDate || txEnvelope.inservicedate)
// .tz(JobData.bodyshop.timezone)
.toISOString()
})
},
vehicle: {
...DMSVeh.vehicle,
...(txEnvelope.dms_model_override
? {
make: txEnvelope.dms_make,
modelAbrev: txEnvelope.dms_model
}
: {}),
deliveryDate:
txEnvelope.dms_unsold === true
? ""
: moment(DMSVeh.vehicle.deliveryDate)
//.tz(JobData.bodyshop.timezone)
.toISOString()
},
owners: ids
},
});
return result;
} catch (error) {
CreateFortellisLogEvent(socket, "ERROR", `Error in UpdateDmsVehicle - ${error}`, { request: error.request });
}
//
// async function UpdateDmsVehicle(socket) {
// try { // try {
// const soapClientVehicleInsertUpdate = await soap.createClientAsync(CdkWsdl.VehicleInsertUpdate); // const soapClientVehicleInsertUpdate = await soap.createClientAsync(CdkWsdl.VehicleInsertUpdate);
@@ -599,7 +992,7 @@ async function QueryDmsCustomerByName({ socket, redisHelpers, JobData }) {
// CdkBase.createLogEvent(socket, "ERROR", `Error in UpdateDmsVehicle - ${error}`); // CdkBase.createLogEvent(socket, "ERROR", `Error in UpdateDmsVehicle - ${error}`);
// throw new Error(error); // throw new Error(error);
// } // }
// } }
// async function InsertServiceVehicleHistory(socket) { // async function InsertServiceVehicleHistory(socket) {
// try { // try {
@@ -984,4 +1377,4 @@ async function QueryDmsCustomerByName({ socket, redisHelpers, JobData }) {
// } // }
exports.getTransactionType = getTransactionType; exports.getTransactionType = getTransactionType;
exports.default = FortellisJobExport; exports.FortellisJobExport = FortellisJobExport;

View File

@@ -1,5 +1,5 @@
const { admin } = require("../firebase/firebase-handler"); const { admin } = require("../firebase/firebase-handler");
const FortellisJobExport = require("../fortellis/fortellis").default; const { FortellisJobExport, FortellisSelectedCustomer } = require("../fortellis/fortellis");
const FortellisLogger = require("../fortellis/fortellis-logger"); const FortellisLogger = require("../fortellis/fortellis-logger");
const redisSocketEvents = ({ const redisSocketEvents = ({
@@ -272,6 +272,33 @@ const redisSocketEvents = ({
}); });
} }
}); });
socket.on("fortellis-selected-customer", async ({ jobid, selectedCustomerId }) => {
try {
await FortellisSelectedCustomer({
socket,
redisHelpers: {
setSessionData,
getSessionData,
addUserSocketMapping,
removeUserSocketMapping,
refreshUserSocketTTL,
getUserSocketMappingByBodyshop,
setSessionTransactionData,
getSessionTransactionData,
clearSessionTransactionData
},
ioHelpers: { getBodyshopRoom, getBodyshopConversationRoom },
jobid,
selectedCustomerId
});
} catch (error) {
FortellisLogger(socket, "error", `Error during Fortellis export : ${error.message}`);
logger.log("fortellis-selectd-customer-error", "error", null, null, {
message: error.message,
stack: error.stack
});
}
});
}; };
// Call Handlers // Call Handlers