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 CalcualteAllocations = require("../cdk/cdk-calculate-allocations").default; const InstanceMgr = require("../utils/instanceMgr").default; const CreateFortellisLogEvent = require("./fortellis-logger"); const queries = require("../graphql-client/queries"); const { MakeFortellisCall, FortellisActions, getTransactionType, defaultFortellisTTL, FortellisCacheEnums } = require("./fortellis-helpers"); const _ = require("lodash"); const moment = require("moment-timezone"); const replaceSpecialRegex = /[^a-zA-Z0-9 .,\n #]+/g; async function FortellisJobExport({ socket, redisHelpers, ioHelpers: { getBodyshopRoom, getBodyshopConversationRoom }, txEnvelope, jobid }) { const { // setSessionData, // getSessionData, // addUserSocketMapping, // removeUserSocketMapping, // refreshUserSocketTTL, // getUserSocketMappingByBodyshop, setSessionTransactionData, // getSessionTransactionData, // clearSessionTransactionData } = redisHelpers; try { CreateFortellisLogEvent(socket, "debug", `Received Job export request for id ${jobid}`); await setSessionTransactionData( socket.id, getTransactionType(jobid), FortellisCacheEnums.txEnvelope, txEnvelope, defaultFortellisTTL ); const JobData = await QueryJobData({ socket, jobid }); //TODO: Need to remove unnecessary stuff here to reduce the payload. await setSessionTransactionData(socket.id, getTransactionType(jobid), FortellisCacheEnums.JobData, JobData, defaultFortellisTTL); CreateFortellisLogEvent(socket, "DEBUG", `{1} Begin Calculate DMS Vehicle ID using VIN: ${JobData.v_vin}`); const DMSVid = await CalculateDmsVid({ socket, JobData, redisHelpers }); await setSessionTransactionData(socket.id, getTransactionType(jobid), FortellisCacheEnums.DMSVid, DMSVid, defaultFortellisTTL); let DMSVehCustomer; if (!DMSVid.newId) { CreateFortellisLogEvent( socket, "DEBUG", `{2.1} Querying the Vehicle using the DMSVid: ${DMSVid.vehiclesVehId}` ); const DMSVeh = await QueryDmsVehicleById({ socket, redisHelpers, JobData, DMSVid }); await setSessionTransactionData(socket.id, getTransactionType(jobid), FortellisCacheEnums.DMSVeh, DMSVeh, defaultFortellisTTL); const DMSVehCustomerFromVehicle = DMSVeh && DMSVeh.owners && DMSVeh.owners.find((o) => o.id.assigningPartyId === "CURRENT"); if (DMSVehCustomerFromVehicle && DMSVehCustomerFromVehicle.id && DMSVehCustomerFromVehicle.id.value) { CreateFortellisLogEvent( socket, "DEBUG", `{2.2} Querying the Customer using the ID from DMSVeh: ${DMSVehCustomerFromVehicle.id.value}` ); DMSVehCustomer = await QueryDmsCustomerById({ socket, redisHelpers, JobData, CustomerId: DMSVehCustomerFromVehicle.id.value }); await setSessionTransactionData(socket.id, getTransactionType(jobid), FortellisCacheEnums.DMSVehCustomer, DMSVehCustomer, defaultFortellisTTL); } } CreateFortellisLogEvent(socket, "DEBUG", `{2.3} Querying the Customer using the name.`); const DMSCustList = await QueryDmsCustomerByName({ socket, redisHelpers, JobData }); await setSessionTransactionData(socket.id, getTransactionType(jobid), FortellisCacheEnums.DMSCustList, DMSCustList, defaultFortellisTTL); socket.emit("fortellis-select-customer", [ ...(DMSVehCustomer ? [{ ...DMSVehCustomer, vinOwner: true }] : []), ...DMSCustList ]); } catch (error) { CreateFortellisLogEvent(socket, "ERROR", `Error in FortellisJobExport - ${error}`, { error: error.message, stack: error.stack }); } } async function FortellisSelectedCustomer({ socket, redisHelpers, ioHelpers, selectedCustomerId, jobid }) { try { const { // setSessionData, // getSessionData, // addUserSocketMapping, // removeUserSocketMapping, // refreshUserSocketTTL, // getUserSocketMappingByBodyshop, setSessionTransactionData, getSessionTransactionData, //clearSessionTransactionData } = redisHelpers; await setSessionTransactionData(socket.id, getTransactionType(jobid), FortellisCacheEnums.selectedCustomerId, selectedCustomerId, defaultFortellisTTL); const JobData = await getSessionTransactionData(socket.id, getTransactionType(jobid), FortellisCacheEnums.JobData); const txEnvelope = await getSessionTransactionData(socket.id, getTransactionType(jobid), FortellisCacheEnums.txEnvelope); const DMSVid = await redisHelpers.getSessionTransactionData(socket.id, getTransactionType(JobData.id), FortellisCacheEnums.DMSVid); 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`); // socket.DMSTransHeader = await InsertDmsStartWip(socket); // CdkBase.createLogEvent(socket, "DEBUG", `{5.1} Creating Transaction with ID ${socket.DMSTransHeader.transID}`); // socket.DMSBatchTxn = await InsertDmsBatchWip(socket); // CdkBase.createLogEvent( // socket, // "DEBUG", // `{6} Attempting to post Transaction with ID ${socket.DMSTransHeader.transID}` // ); // socket.DmsBatchTxnPost = await PostDmsBatchWip(socket); // if (socket.DmsBatchTxnPost.code === "success") { // //something // CdkBase.createLogEvent(socket, "DEBUG", `{6} Successfully posted sransaction to DMS.`); // await MarkJobExported(socket, socket.JobData.id); // CdkBase.createLogEvent(socket, "DEBUG", `{5} Updating Service Vehicle History.`); // socket.DMSVehHistory = await InsertServiceVehicleHistory(socket); // socket.emit("export-success", socket.JobData.id); // } else { // //Get the error code // CdkBase.createLogEvent( // socket, // "DEBUG", // `{6.1} Getting errors for Transaction ID ${socket.DMSTransHeader.transID}` // ); // socket.DmsError = await QueryDmsErrWip(socket); // //Delete the transaction // CdkBase.createLogEvent(socket, "DEBUG", `{6.2} Deleting Transaction ID ${socket.DMSTransHeader.transID}`); // socket.DmsBatchTxnPost = await DeleteDmsWip(socket); // socket.DmsError.errMsg // .split("|") // .map( // (e) => // e !== null && // e !== "" && // CdkBase.createLogEvent(socket, "ERROR", `Error(s) encountered in posting transaction. ${e}`) // ); // } } catch (error) { // CdkBase.createLogEvent(socket, "ERROR", `Error encountered in CdkSelectedCustomer. ${error}`); // await InsertFailedExportLog(socket, error); } finally { //Ensure we always insert logEvents //GQL to insert logevents. //CdkBase.createLogEvent(socket, "DEBUG", `Capturing log events to database.`); } } exports.FortellisSelectedCustomer = FortellisSelectedCustomer; async function QueryJobData({ socket, jobid }) { const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, {}); const result = await client .setHeaders({ Authorization: `Bearer ${socket.handshake?.auth?.token}` }) .request(queries.QUERY_JOBS_FOR_CDK_EXPORT, { id: jobid }); return result.jobs_by_pk; } async function CalculateDmsVid({ socket, JobData, redisHelpers }) { try { const result = await MakeFortellisCall({ ...FortellisActions.GetVehicleId, requestPathParams: JobData.v_vin, headers: {}, redisHelpers, socket, jobid: JobData.id, body: {}, }); return result; } catch (error) { CreateFortellisLogEvent(socket, "ERROR", `Error in CalculateDmsVid - ${error}`, { request: error.request }); } } async function QueryDmsVehicleById({ socket, redisHelpers, JobData, DMSVid }) { try { const result = await MakeFortellisCall({ ...FortellisActions.GetVehicleById, requestPathParams: DMSVid.vehiclesVehId, headers: {}, redisHelpers, socket, jobid: JobData.id, body: {}, }); return result; } catch (error) { CreateFortellisLogEvent(socket, "ERROR", `Error in QueryDmsVehicleById - ${error}`, { request: error.request }); } } async function QueryDmsCustomerById({ socket, redisHelpers, JobData, CustomerId }) { try { const result = await MakeFortellisCall({ ...FortellisActions.ReadCustomer, requestPathParams: CustomerId, headers: {}, redisHelpers, socket, jobid: JobData.id, body: {}, }); return result.data; } catch (error) { CreateFortellisLogEvent(socket, "ERROR", `Error in QueryDmsCustomerById - ${error}`, { request: error.request }); } } async function QueryDmsCustomerByName({ socket, redisHelpers, JobData }) { const ownerName = JobData.ownr_co_nm && JobData.ownr_co_nm.trim() !== "" ? [["lastName", JobData.ownr_co_nm.replace(replaceSpecialRegex, "")]] : [["firstName", JobData.ownr_fn.replace(replaceSpecialRegex, "")], ["lastName", JobData.ownr_ln.replace(replaceSpecialRegex, "")]]; CreateFortellisLogEvent( socket, "DEBUG", `Begin query DMS Customer by Name using ${JSON.stringify(ownerName)}` ); try { const result = await MakeFortellisCall({ ...FortellisActions.QueryCustomerByName, requestSearchParams: ownerName, headers: {}, redisHelpers, socket, jobid: JobData.id, body: {}, }); return result.data; } catch (error) { CreateFortellisLogEvent(socket, "ERROR", `Error in QueryDmsCustomerByName - ${error}`, { request: error.request }); } } async function InsertDmsCustomer({ socket, redisHelpers, JobData }) { try { const result = await MakeFortellisCall({ ...FortellisActions.CreateCustomer, headers: {}, redisHelpers, 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": "", "address": socket.JobData.ownr_ea, // "type": "PERSONAL", // "doNotEmailSource": "", // "doNotEmail": false, // "isPreferred": true, // "transactionEmailNotificationOptIn": false, // "optInRequestDate": null, // "optInDate": null }] : [], // { // "uuid": "", // "address": "jilldoe@test.com", // "type": "WORK", // "doNotEmailSource": "", // "doNotEmail": false, // "isPreferred": false, // "transactionEmailNotificationOptIn": false, // "optInRequestDate": null, // "optInDate": null // } ] }, // // "doNotContact": false, // // "optOutDate": "", // // "optOutTime": "", // // "optOutFlag": false, // // "isDeleteDataFlag": false, // // "deleteDataDate": "", // // "deleteDataTime": "", // // "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 }); } // try { // const soapClientCustomerInsertUpdate = await soap.createClientAsync(CdkWsdl.CustomerInsertUpdate); // const soapResponseCustomerInsertUpdate = await soapClientCustomerInsertUpdate.insertAsync( // { // arg0: CDK_CREDENTIALS, // arg1: { dealerId: socket.JobData.bodyshop.cdk_dealerid }, // arg2: { userId: null }, // arg3: { // //Copied the required fields from the other integration. // //TODO: Verify whether we need to bring more information in. // id: { value: newCustomerNumber }, // address: { // addressLine: socket.JobData.ownr_addr1 && socket.JobData.ownr_addr1.replace(replaceSpecialRegex, ""), // city: socket.JobData.ownr_city && socket.JobData.ownr_city.replace(replaceSpecialRegex, ""), // country: socket.JobData.ownr_ctry && socket.JobData.ownr_ctry.replace(replaceSpecialRegex, ""), // postalCode: InstanceMgr({ // imex: // socket.JobData.ownr_zip && // socket.JobData.ownr_zip //TODO Need to remove for US Based customers. // .toUpperCase() // .replace(/\W/g, "") // .replace(/(...)/, "$1 "), // rome: socket.JobData.ownr_zip // }), // stateOrProvince: socket.JobData.ownr_st && socket.JobData.ownr_st.replace(replaceSpecialRegex, "") // }, // contactInfo: { // mainTelephoneNumber: { // main: true, // value: socket.JobData.ownr_ph1 && socket.JobData.ownr_ph1.replace(replaceSpecialRegex, "") // }, // email: { // desc: socket.JobData.ownr_ea ? "Other" : "CustomerDeclined", // value: socket.JobData.ownr_ea ? socket.JobData.ownr_ea : null // } // }, // demographics: null, // name1: { // companyName: // socket.JobData.ownr_co_nm && socket.JobData.ownr_co_nm.replace(replaceSpecialRegex, "").toUpperCase(), // firstName: socket.JobData.ownr_fn && socket.JobData.ownr_fn.replace(replaceSpecialRegex, "").toUpperCase(), // fullname: null, // lastName: socket.JobData.ownr_ln && socket.JobData.ownr_ln.replace(replaceSpecialRegex, "").toUpperCase(), // middleName: null, // nameType: // socket.JobData.ownr_co_nm && String(socket.JobData.ownr_co_nm).trim() !== "" ? "Business" : "Person", // suffix: null, // title: null // } // } // }, // {} // ); // const [result, rawResponse, , rawRequest] = soapResponseCustomerInsertUpdate; // CdkBase.createXmlEvent(socket, rawRequest, `soapClientCustomerInsertUpdate.insertAsync request.`); // CdkBase.createXmlEvent(socket, rawResponse, `soapClientCustomerInsertUpdate.insertAsync response.`); // CdkBase.createLogEvent( // socket, // "SILLY", // `soapClientCustomerInsertUpdate.insertAsync Result ${JSON.stringify(result, null, 2)}` // ); // CheckCdkResponseForError(socket, soapResponseCustomerInsertUpdate); // const customer = result && result.return && result.return.customerParty; // return customer; // } catch (error) { // CdkBase.createXmlEvent(socket, error.request, `soapClientCustomerInsertUpdate.insertAsync request.`, true); // CdkBase.createXmlEvent( // socket, // error.response && error.response.data, // `soapClientCustomerInsertUpdate.insertAsync response.`, // true // ); // CdkBase.createLogEvent(socket, "ERROR", `Error in InsertDmsCustomer - ${error}`); // throw new Error(error); // } } async function InsertDmsVehicle({ socket, redisHelpers, JobData, txEnvelope, DMSVid, DMSCust }) { try { const result = await MakeFortellisCall({ ...FortellisActions.InsertVehicle, requestSearchParams: {}, headers: {}, redisHelpers, socket, jobid: JobData.id, body: { "dealer": { "company": JobData.bodyshop.cdk_configuration.srcco || "77", // "dealNumber": "", // "dealerAssignedNumber": "82268", // "dealerDefined1": "2WDSP", // "dealerDefined2": "33732.71", // "dealerDefined3": "", // "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" // }, // "invoice": { // "entryDate": "2012-01-19", // "freight": { // "freightInCharge": 995.95, // "freightOutCharge": 95.95, // "freightTaxCharge": 5.95 // }, // "vehicleAcquisitionDate": "2012-01-18", // "vehicleOrderDate": "2012-01-12", // "vehicleOrderNumber": "", // "vehicleOrderPriority": "", // "vehicleOrderType": "TRE RETAIL - STOCK" // }, "vehicle": { // "axleCode": "GU6/3.42 REAR AXLE RATIO", // "axleCount": 2, // "bodyStyle": "PU", // "brakeSystem": "", // "cabType": "", // "certifiedPreownedInd": false, // "certifiedPreownedNumber": "", // "chassis": "", // "color": "", // "dealerBodyStyle": "", deliveryDate: txEnvelope.dms_unsold === true ? "" : moment() // .tz(JobData.bodyshop.timezone) .format("YYYY-MM-DD"), // "deliveryMileage": 4, // "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 }); } // // try { // const soapClientVehicleInsertUpdate = await soap.createClientAsync(CdkWsdl.VehicleInsertUpdate); // let ids = []; // //if it's a generic customer, don't update the vehicle owners. // if (socket.selectedCustomerId === socket.JobData.bodyshop.cdk_configuration.generic_customer_number) { // ids = socket.DMSVeh && socket.DMSVeh.owners && socket.DMSVeh.owners; // } else { // const existingOwnerinVeh = // socket.DMSVeh && // socket.DMSVeh.owners && // socket.DMSVeh.owners.find((o) => o.id.value === socket.DMSCust.id.value); // if (existingOwnerinVeh) { // ids = socket.DMSVeh.owners.map((o) => { // return { // id: { // assigningPartyId: o.id.value === socket.DMSCust.id.value ? "CURRENT" : "PREVIOUS", // value: o.id.value // } // }; // }); // } else { // const oldOwner = // socket.DMSVeh && // socket.DMSVeh.owners && // socket.DMSVeh.owners.find((o) => o.id.assigningPartyId === "CURRENT"); // ids = [ // { // id: { // assigningPartyId: "CURRENT", // value: socket.DMSCust.id.value // } // }, // ...(oldOwner // ? [ // { // id: { // assigningPartyId: "PREVIOUS", // value: oldOwner.id.value // } // } // ] // : []) // ]; // } // } // const soapResponseVehicleInsertUpdate = await soapClientVehicleInsertUpdate.updateAsync({ // arg0: CDK_CREDENTIALS, // arg1: { id: socket.JobData.bodyshop.cdk_dealerid }, // arg2: { // ...socket.DMSVeh, // dealer: { // ...socket.DMSVeh.dealer, // ...((socket.txEnvelope.inservicedate || socket.DMSVeh.dealer.inServiceDate) && { // inServiceDate: // socket.txEnvelope.dms_unsold === true // ? "" // : moment(socket.DMSVeh.dealer.inServiceDate || socket.txEnvelope.inservicedate) // // .tz(socket.JobData.bodyshop.timezone) // .toISOString() // }) // }, // vehicle: { // ...socket.DMSVeh.vehicle, // ...(socket.txEnvelope.dms_model_override // ? { // make: socket.txEnvelope.dms_make, // modelAbrev: socket.txEnvelope.dms_model // } // : {}), // deliveryDate: // socket.txEnvelope.dms_unsold === true // ? "" // : moment(socket.DMSVeh.vehicle.deliveryDate) // //.tz(socket.JobData.bodyshop.timezone) // .toISOString() // }, // owners: ids // }, // arg3: "VEHICLES" // }); // const [result, rawResponse, , rawRequest] = soapResponseVehicleInsertUpdate; // CdkBase.createXmlEvent(socket, rawRequest, `soapClientVehicleInsertUpdate.updateAsync request.`); // CdkBase.createLogEvent( // socket, // "DEBUG", // `soapClientVehicleInsertUpdate.updateAsync Result ${JSON.stringify(result, null, 2)}` // ); // CdkBase.createXmlEvent(socket, rawResponse, `soapClientVehicleInsertUpdate.updateAsync response.`); // CheckCdkResponseForError(socket, soapResponseVehicleInsertUpdate); // const VehicleFromDMS = result && result.return && result.return.vehicle; // return VehicleFromDMS; // } catch (error) { // CdkBase.createLogEvent(socket, "ERROR", `Error in UpdateDmsVehicle - ${error}`); // throw new Error(error); // } } // async function InsertServiceVehicleHistory(socket) { // try { // const soapClientServiceHistoryInsert = await soap.createClientAsync(CdkWsdl.ServiceHistoryInsert); // const soapResponseServiceHistoryInsert = await soapClientServiceHistoryInsert.serviceHistoryHeaderInsertAsync({ // authToken: CDK_CREDENTIALS, // dealerId: { dealerId: socket.JobData.bodyshop.cdk_dealerid }, // serviceHistoryHeader: { // vehID: socket.DMSVid.vehiclesVehId, // roNumber: socket.JobData.ro_number.match(/\d+/g), // mileage: socket.txEnvelope.kmout, // openDate: moment(socket.JobData.actual_in).tz(socket.JobData.bodyshop.timezone).format("YYYY-MM-DD"), // openTime: moment(socket.JobData.actual_in).tz(socket.JobData.bodyshop.timezone).format("HH:mm:ss"), // closeDate: moment(socket.JobData.invoice_date).tz(socket.JobData.bodyshop.timezone).format("YYYY-MM-DD"), // closeTime: moment(socket.JobData.invoice_date).tz(socket.JobData.bodyshop.timezone).format("HH:mm:ss"), // comments: socket.txEnvelope.story, // cashierID: socket.JobData.bodyshop.cdk_configuration.cashierid // } // }); // const [result, rawResponse, , rawRequest] = soapResponseServiceHistoryInsert; // CdkBase.createXmlEvent(socket, rawRequest, `soapClientServiceHistoryInsert.serviceHistoryHeaderInsert request.`); // CdkBase.createLogEvent( // socket, // "SILLY", // `soapClientServiceHistoryInsert.serviceHistoryHeaderInsert Result ${JSON.stringify(result, null, 2)}` // ); // CdkBase.createXmlEvent(socket, rawResponse, `soapClientServiceHistoryInsert.serviceHistoryHeaderInsert response.`); // CheckCdkResponseForError(socket, soapResponseServiceHistoryInsert); // return result && result.return; // } catch (error) { // CdkBase.createLogEvent(socket, "ERROR", `Error in InsertServiceVehicleHistory - ${error}`); // throw new Error(error); // } // } // async function InsertDmsStartWip(socket) { // try { // const soapClientAccountingGLInsertUpdate = await soap.createClientAsync(CdkWsdl.AccountingGLInsertUpdate); // const soapResponseAccountingGLInsertUpdate = await soapClientAccountingGLInsertUpdate.doStartWIPAsync({ // arg0: CDK_CREDENTIALS, // arg1: { dealerId: socket.JobData.bodyshop.cdk_dealerid }, // arg2: { // acctgDate: moment().tz(socket.JobData.bodyshop.timezone).format("YYYY-MM-DD"), // //socket.JobData.invoice_date // desc: socket.txEnvelope.story && socket.txEnvelope.story.replace(replaceSpecialRegex, ""), // docType: 10 || 7, //Need to check what this usually would be? Apparently it is almost always 10 or 7. // //1 Cash Receipt , 2 Check, 3 Journal Voucher, 4 Parts invoice, 5 Payable Invoice, 6 Recurring Entry, 7 Repair Order Invoice, 8 Vehicle Purchase Invoice, 9 Vehicle Sale Invoice, 10 Other, 11 Payroll, 12 Finance Charge, 13 FMLR Invoice, 14 Parts Credit Memo, 15 Manufacturer Document, 16 FMLR Credit Memo // m13Flag: 0, // refer: socket.JobData.ro_number, // srcCo: socket.JobData.bodyshop.cdk_configuration.srcco, // srcJrnl: socket.txEnvelope.journal, // userID: socket.JobData.bodyshop.cdk_configuration.cashierid //Where is this coming from? // //userName: "IMEX", // } // }); // const [result, rawResponse, , rawRequest] = soapResponseAccountingGLInsertUpdate; // CdkBase.createXmlEvent(socket, rawRequest, `soapClientAccountingGLInsertUpdate.doStartWIPAsync request.`); // CdkBase.createLogEvent( // socket, // "SILLY", // `soapClientAccountingGLInsertUpdate.doStartWIPAsync Result ${JSON.stringify(result, null, 2)}` // ); // CdkBase.createXmlEvent(socket, rawResponse, `soapClientAccountingGLInsertUpdate.doStartWIPAsync response.`); // CheckCdkResponseForError(socket, soapResponseAccountingGLInsertUpdate); // const TransactionHeader = result && result.return; // return TransactionHeader; // } catch (error) { // CdkBase.createLogEvent(socket, "ERROR", `Error in InsertDmsStartWip - ${error}`); // throw new Error(error); // } // } // async function InsertDmsBatchWip(socket) { // try { // const soapClientAccountingGLInsertUpdate = await soap.createClientAsync(CdkWsdl.AccountingGLInsertUpdate); // const soapResponseAccountingGLInsertUpdate = await soapClientAccountingGLInsertUpdate.doTransBatchWIPAsync({ // arg0: CDK_CREDENTIALS, // arg1: { dealerId: socket.JobData.bodyshop.cdk_dealerid }, // arg2: { // transWIPs: await GenerateTransWips(socket) // } // }); // const [result, rawResponse, , rawRequest] = soapResponseAccountingGLInsertUpdate; // CdkBase.createXmlEvent(socket, rawRequest, `soapClientAccountingGLInsertUpdate.doTransBatchWIPAsync request.`); // CdkBase.createLogEvent( // socket, // "SILLY", // `soapClientAccountingGLInsertUpdate.doTransBatchWIPAsync Result ${JSON.stringify(result, null, 2)}` // ); // CdkBase.createXmlEvent(socket, rawResponse, `soapClientAccountingGLInsertUpdate.doTransBatchWIPAsync response.`); // CheckCdkResponseForError(socket, soapResponseAccountingGLInsertUpdate); // const BatchWipResult = result && result.return; // return BatchWipResult; // } catch (error) { // CdkBase.createLogEvent(socket, "ERROR", `Error in InsertDmsBatchWip - ${error}`); // throw new Error(error); // } // } // async function GenerateTransWips(socket) { // const allocations = await CalcualteAllocations(socket, socket.JobData.id); // const wips = []; // allocations.forEach((alloc) => { // //Add the sale item from each allocation. // if (alloc.sale.getAmount() > 0 && !alloc.tax) { // const item = { // acct: alloc.profitCenter.dms_acctnumber, // cntl: // alloc.profitCenter.dms_control_override && // alloc.profitCenter.dms_control_override !== null && // alloc.profitCenter.dms_control_override !== undefined && // alloc.profitCenter.dms_control_override?.trim() !== "" // ? alloc.profitCenter.dms_control_override // : socket.JobData.ro_number, // cntl2: null, // credtMemoNo: null, // postAmt: alloc.sale.multiply(-1).getAmount(), // postDesc: null, // prod: null, // statCnt: 1, // transID: socket.DMSTransHeader.transID, // trgtCoID: socket.JobData.bodyshop.cdk_configuration.srcco // }; // wips.push(item); // } // //Add the cost Item. // if (alloc.cost.getAmount() > 0 && !alloc.tax) { // const item = { // acct: alloc.costCenter.dms_acctnumber, // cntl: // alloc.costCenter.dms_control_override && // alloc.costCenter.dms_control_override !== null && // alloc.costCenter.dms_control_override !== undefined && // alloc.costCenter.dms_control_override?.trim() !== "" // ? alloc.costCenter.dms_control_override // : socket.JobData.ro_number, // cntl2: null, // credtMemoNo: null, // postAmt: alloc.cost.getAmount(), // postDesc: null, // prod: null, // statCnt: 1, // transID: socket.DMSTransHeader.transID, // trgtCoID: socket.JobData.bodyshop.cdk_configuration.srcco // }; // wips.push(item); // const itemWip = { // acct: alloc.costCenter.dms_wip_acctnumber, // cntl: // alloc.costCenter.dms_control_override && // alloc.costCenter.dms_control_override !== null && // alloc.costCenter.dms_control_override !== undefined && // alloc.costCenter.dms_control_override?.trim() !== "" // ? alloc.costCenter.dms_control_override // : socket.JobData.ro_number, // cntl2: null, // credtMemoNo: null, // postAmt: alloc.cost.multiply(-1).getAmount(), // postDesc: null, // prod: null, // statCnt: 1, // transID: socket.DMSTransHeader.transID, // trgtCoID: socket.JobData.bodyshop.cdk_configuration.srcco // }; // wips.push(itemWip); // //Add to the WIP account. // } // if (alloc.tax) { // // if (alloc.cost.getAmount() > 0) { // // const item = { // // acct: alloc.costCenter.dms_acctnumber, // // cntl: socket.JobData.ro_number, // // cntl2: null, // // credtMemoNo: null, // // postAmt: alloc.cost.getAmount(), // // postDesc: null, // // prod: null, // // statCnt: 1, // // transID: socket.DMSTransHeader.transID, // // trgtCoID: socket.JobData.bodyshop.cdk_configuration.srcco, // // }; // // wips.push(item); // // } // if (alloc.sale.getAmount() > 0) { // const item2 = { // acct: alloc.profitCenter.dms_acctnumber, // cntl: // alloc.profitCenter.dms_control_override && // alloc.profitCenter.dms_control_override !== null && // alloc.profitCenter.dms_control_override !== undefined && // alloc.profitCenter.dms_control_override?.trim() !== "" // ? alloc.profitCenter.dms_control_override // : socket.JobData.ro_number, // cntl2: null, // credtMemoNo: null, // postAmt: alloc.sale.multiply(-1).getAmount(), // postDesc: null, // prod: null, // statCnt: 1, // transID: socket.DMSTransHeader.transID, // trgtCoID: socket.JobData.bodyshop.cdk_configuration.srcco // }; // wips.push(item2); // } // } // }); // socket.txEnvelope.payers.forEach((payer) => { // const item = { // acct: payer.dms_acctnumber, // cntl: payer.controlnumber, // cntl2: null, // credtMemoNo: null, // postAmt: Math.round(payer.amount * 100), // postDesc: null, // prod: null, // statCnt: 1, // transID: socket.DMSTransHeader.transID, // trgtCoID: socket.JobData.bodyshop.cdk_configuration.srcco // }; // wips.push(item); // }); // socket.transWips = wips; // return wips; // } // async function PostDmsBatchWip(socket) { // try { // const soapClientAccountingGLInsertUpdate = await soap.createClientAsync(CdkWsdl.AccountingGLInsertUpdate); // const soapResponseAccountingGLInsertUpdate = await soapClientAccountingGLInsertUpdate.doPostBatchWIPAsync({ // arg0: CDK_CREDENTIALS, // arg1: { dealerId: socket.JobData.bodyshop.cdk_dealerid }, // arg2: { // postWIP: { opCode: "P", transID: socket.DMSTransHeader.transID } // } // }); // const [result, rawResponse, , rawRequest] = soapResponseAccountingGLInsertUpdate; // CdkBase.createXmlEvent(socket, rawRequest, `soapClientAccountingGLInsertUpdate.doPostBatchWIPAsync request.`); // CdkBase.createLogEvent( // socket, // "SILLY", // `soapClientAccountingGLInsertUpdate.doPostBatchWIPAsync Result ${JSON.stringify(result, null, 2)}` // ); // CdkBase.createXmlEvent(socket, rawResponse, `soapClientAccountingGLInsertUpdate.doPostBatchWIPAsync response.`); // // CheckCdkResponseForError(socket, soapResponseAccountingGLInsertUpdate); // const PostResult = result && result.return; // return PostResult; // } catch (error) { // CdkBase.createLogEvent(socket, "ERROR", `Error in PostDmsBatchWip - ${error}`); // throw new Error(error); // } // } // async function QueryDmsErrWip(socket) { // try { // const soapClientAccountingGLInsertUpdate = await soap.createClientAsync(CdkWsdl.AccountingGLInsertUpdate); // const soapResponseAccountingGLInsertUpdate = await soapClientAccountingGLInsertUpdate.doErrWIPAsync({ // arg0: CDK_CREDENTIALS, // arg1: { dealerId: socket.JobData.bodyshop.cdk_dealerid }, // arg2: socket.DMSTransHeader.transID // }); // const [result, rawResponse, , rawRequest] = soapResponseAccountingGLInsertUpdate; // CdkBase.createXmlEvent(socket, rawRequest, `soapClientAccountingGLInsertUpdate.doErrWIPAsync request.`); // CdkBase.createLogEvent( // socket, // "DEBUG", // `soapClientAccountingGLInsertUpdate.doErrWIPAsync Result ${JSON.stringify(result, null, 2)}` // ); // CdkBase.createXmlEvent(socket, rawResponse, `soapClientAccountingGLInsertUpdate.doErrWIPAsync response.`); // CheckCdkResponseForError(socket, soapResponseAccountingGLInsertUpdate); // const PostResult = result && result.return; // return PostResult; // } catch (error) { // CdkBase.createLogEvent(socket, "ERROR", `Error in QueryDmsErrWip - ${error}`); // throw new Error(error); // } // } // async function DeleteDmsWip(socket) { // try { // const soapClientAccountingGLInsertUpdate = await soap.createClientAsync(CdkWsdl.AccountingGLInsertUpdate); // const soapResponseAccountingGLInsertUpdate = await soapClientAccountingGLInsertUpdate.doPostBatchWIPAsync({ // arg0: CDK_CREDENTIALS, // arg1: { dealerId: socket.JobData.bodyshop.cdk_dealerid }, // arg2: { // postWIP: { opCode: "D", transID: socket.DMSTransHeader.transID } // } // }); // const [result, rawResponse, , rawRequest] = soapResponseAccountingGLInsertUpdate; // CdkBase.createXmlEvent(socket, rawRequest, `soapClientAccountingGLInsertUpdate.doPostBatchWIPAsync request.`); // CdkBase.createLogEvent( // socket, // "SILLY", // `soapClientAccountingGLInsertUpdate.doPostBatchWIPAsync Result ${JSON.stringify(result, null, 2)}` // ); // CdkBase.createXmlEvent(socket, rawResponse, `soapClientAccountingGLInsertUpdate.doPostBatchWIPAsync response.`); // CheckCdkResponseForError(socket, soapResponseAccountingGLInsertUpdate); // const PostResult = result && result.return; // return PostResult; // } catch (error) { // CdkBase.createLogEvent(socket, "ERROR", `Error in PostDmsBatchWip - ${error}`); // throw new Error(error); // } // } // async function MarkJobExported(socket, jobid) { // CdkBase.createLogEvent(socket, "DEBUG", `Marking job as exported for id ${jobid}`); // const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, {}); // const result = await client // .setHeaders({ Authorization: `Bearer ${socket.handshake.auth.token}` }) // .request(queries.MARK_JOB_EXPORTED, { // jobId: jobid, // job: { // status: socket.JobData.bodyshop.md_ro_statuses.default_exported || "Exported*", // date_exported: new Date() // }, // log: { // bodyshopid: socket.JobData.bodyshop.id, // jobid: jobid, // successful: true, // useremail: socket.user.email, // metadata: socket.transWips // }, // bill: { // exported: true, // exported_at: new Date() // } // }); // return result; // } // async function InsertFailedExportLog(socket, error) { // try { // const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, {}); // const result = await client // .setHeaders({ Authorization: `Bearer ${socket.handshake.auth.token}` }) // .request(queries.INSERT_EXPORT_LOG, { // log: { // bodyshopid: socket.JobData.bodyshop.id, // jobid: socket.JobData.id, // successful: false, // message: JSON.stringify(error), // useremail: socket.user.email // } // }); // return result; // } catch (error2) { // CdkBase.createLogEvent(socket, "ERROR", `Error in InsertFailedExportLog - ${error} - ${JSON.stringify(error2)}`); // } // } exports.getTransactionType = getTransactionType; exports.FortellisJobExport = FortellisJobExport;