From 01fc0cbc08c7ddf9df2f5418004e42e59cebf8ba Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Fri, 5 Sep 2025 10:45:59 -0700 Subject: [PATCH] IO-3356 PBS posting initial working commit. --- server/accounting/pbs/pbs-constants.js | 4 - server/accounting/pbs/pbs-job-export.js | 142 ++++++++++++++++-------- 2 files changed, 97 insertions(+), 49 deletions(-) diff --git a/server/accounting/pbs/pbs-constants.js b/server/accounting/pbs/pbs-constants.js index b3636eca3..14d44afef 100644 --- a/server/accounting/pbs/pbs-constants.js +++ b/server/accounting/pbs/pbs-constants.js @@ -11,10 +11,6 @@ const PBS_CREDENTIALS = { }; exports.PBS_CREDENTIALS = PBS_CREDENTIALS; -// const cdkDomain = -// process.env.NODE_ENV === "production" -// ? "https://3pa.dmotorworks.com" -// : "https://uat-3pa.dmotorworks.com"; const pbsDomain = `https://partnerhub.pbsdealers.com/json/reply`; exports.PBS_ENDPOINTS = { diff --git a/server/accounting/pbs/pbs-job-export.js b/server/accounting/pbs/pbs-job-export.js index 74ee22739..d4c01bf25 100644 --- a/server/accounting/pbs/pbs-job-export.js +++ b/server/accounting/pbs/pbs-job-export.js @@ -27,7 +27,7 @@ axios.interceptors.request.use((x) => { } | ${JSON.stringify(x.data)} | ${JSON.stringify(headers)}`; //console.log(printable); - CdkBase.createJsonEvent(socket, "SILLY", `Raw Request: ${printable}`, x.data); + CdkBase.createJsonEvent(socket, "DEBUG", `Raw Request: ${printable}`, x.data); return x; }); @@ -37,7 +37,7 @@ axios.interceptors.response.use((x) => { const printable = `${new Date()} | Response: ${x.status} | ${JSON.stringify(x.data)}`; //console.log(printable); - CdkBase.createJsonEvent(socket, "SILLY", `Raw Response: ${printable}`, x.data); + CdkBase.createJsonEvent(socket, "DEBUG", `Raw Response: ${printable}`, x.data); return x; }); @@ -104,16 +104,15 @@ exports.PbsSelectedCustomer = async function PbsSelectedCustomer(socket, selecte //If export succesful, check to see if an RO exists. //If it does, update necessary elements, otherwise create it. - - if (socket.jobData.bodyshop.pbs_configuration.ro_posting) { //TODO: Create `ro_posting` field on - await CreateRepairOrderInPBS(socket, socket.ownerRef, socket.VehicleRef) - } + // if (socket.jobData.bodyshop.pbs_configuration.ro_posting) { //TODO: Create `ro_posting` field on + await CreateRepairOrderInPBS(socket, socket.ownerRef, socket.VehicleRef) + // } socket.emit("export-success", socket.JobData.id); } else { CdkBase.createLogEvent(socket, "ERROR", `Export was not successful.`); } } catch (error) { - CdkBase.createLogEvent(socket, "ERROR", `Error encountered in CdkSelectedCustomer. ${error}`); + CdkBase.createLogEvent(socket, "ERROR", `Error encountered in PbsSelectedCustomer. ${error}`); await InsertFailedExportLog(socket, error); } }; @@ -631,17 +630,17 @@ async function InsertFailedExportLog(socket, error) { async function CreateRepairOrderInPBS(socket) { try { - const ExistingRepairOrderData = await RepairOrderGet(socket); + const { RepairOrders } = await RepairOrderGet(socket); - if (ExistingRepairOrderData.RepairOrders.length === 0) { + if (RepairOrders.length === 0) { const InsertedRepairOrder = await RepairOrderChange(socket) - } else if (ExistingRepairOrderData.RepairOrders.length === 1) { + } else if (RepairOrders.length === 1) { //Upsert Scenario const InsertedRepairOrder = await RepairOrderChange(socket) } else { //We had too many matches come back. Shouldn't be here. - CdkBase.createLogEvent(socket, "ERROR", `Error in CreateRepairOrderInPBS - Multiple RO's returned by PBS. ${JSON.stringify(ExistingRepairOrderData.RepairOrders)}`); + CdkBase.createLogEvent(socket, "ERROR", `Error in CreateRepairOrderInPBS - Multiple RO's returned by PBS. ${JSON.stringify(ExistingRepairOrderData)}`); } } catch (error) { CdkBase.createLogEvent(socket, "ERROR", `Error in CreateRepairOrderInPBS - ${error} - ${JSON.stringify(error)}`); @@ -654,11 +653,11 @@ async function RepairOrderGet(socket) { PBS_ENDPOINTS.RepairOrderGet, { SerialNumber: socket.JobData.bodyshop.pbs_serialnumber, - //"RepairOrderId": "00000000000000000000000000000000", - "RepairOrderNumber": socket.JobData.ro_number, - // "RawRepairOrderNumber": "String", + //"RepairOrderId": "374728766", + //"RepairOrderNumber": "4" || socket.JobData.ro_number, + "RawRepairOrderNumber": socket.JobData.ro_number, // "Tag": "String", - // "ContactRef": "00000000000000000000000000000000", + //"ContactRef": "701de19bb6c146ffb90b9aead4ba0a82", // "ContactRefList": ["00000000000000000000000000000000"], // "VehicleRef": "00000000000000000000000000000000", // "VehicleRefList": ["00000000000000000000000000000000"], @@ -667,7 +666,7 @@ async function RepairOrderGet(socket) { // "CashieredUntil": "0001-01-01T00:00:00.0000000Z", // "OpenDateSince": "0001-01-01T00:00:00.0000000Z", // "OpenDateUntil": "0001-01-01T00:00:00.0000000Z", - // "ModifiedSince": "0001-01-01T00:00:00.0000000Z", + //"ModifiedSince": "2025-01-01T00:00:00.0000000Z", // "ModifiedUntil": "0001-01-01T00:00:00.0000000Z", // "Shop": "String" }, @@ -681,22 +680,20 @@ async function RepairOrderGet(socket) { } } -async function RepairOrderChange(socket) { +async function RepairOrderChange(socket, PbsROObject) { try { const { data: RepairOrderChangeResponse } = await axios.post( PBS_ENDPOINTS.RepairOrderChange, { "RepairOrderInfo": { - "Id": "string/00000000-0000-0000-0000-000000000000", - "RepairOrderId": "00000000000000000000000000000000", - + //"Id": "string/00000000-0000-0000-0000-000000000000", + //"RepairOrderId": "00000000000000000000000000000000", SerialNumber: socket.JobData.bodyshop.pbs_serialnumber, - - "RepairOrderNumber": socket.JobData.ro_number.match(/\d+/g), //TODO Verify if this is only the numbers. + "RepairOrderNumber": socket.JobData.ro_number, "RawRepairOrderNumber": socket.JobData.ro_number, - "DateOpened": moment(), //Confirm this is today. - //"DateOpenedUTC": "0001-01-01T00:00:00.0000000Z", - //"DateCashiered": "0001-01-01T00:00:00.0000000Z", + "DateOpened": moment(), + // "DateOpenedUTC": "0001-01-01T00:00:00.0000000Z", + // "DateCashiered": "0001-01-01T00:00:00.0000000Z", // "DateCashieredUTC": "0001-01-01T00:00:00.0000000Z", "DatePromised": socket.JobData.scheduled_completion, // "DatePromisedUTC": "0001-01-01T00:00:00.0000000Z", @@ -706,11 +703,11 @@ async function RepairOrderChange(socket) { // "CSRRef": "00000000000000000000000000000000", // "BookingUser": "String", // "BookingUserRef": "00000000000000000000000000000000", - "ContactRef": socket.ownerRef?.Contact?.Id, //TODO: Verify the structure of this, it's a resoponse object from PBS. - "VehicleRef": socket.vehicleRef?.Vehicle?.Id, + "ContactRef": socket.ownerRef?.ReferenceId, + "VehicleRef": socket.vehicleRef?.ReferenceId, "MileageIn": socket.JobData.km_in, - //"MileageOut": 0,//KM out not tracked. - //"Tag": "String", + // "MileageOut": 0, + "Tag": "BODYSHOP", // "Location": "String", // "IsWaiter": false, // "IsComeback": false, @@ -718,7 +715,63 @@ async function RepairOrderChange(socket) { // "ChargeType": "String", // "PurchaseOrderNumber": "String", // "Transportation": "String", - "Status": "Closed", + "Status": "CLOSED", //This doesn't seem to apply. + Requests: [ + { + // "RepairOrderRequestRef": "b1842ecad62c4279bbc2fef4f6bf6cde", + // "RepairOrderRequestId": 1, + // "CSR": "PBS", + // "CSRRef": "1ce12ac692564e94bda955d529ee911a", + // "Skill": "GEN", + "RequestCode": "MISC", + "RequestDescription": "REPAIR VEHICLE AT BODYSHOP", + "Status": "Completed", + // "TechRef": "00000000000000000000000000000000", + "AllowedHours": 0, + "EstimateLabour": 0, + "EstimateParts": 0, + "ComeBack": false, + "AddedOperation": true, + "PartLines": [], + "PartRequestLines": [], + "LabourLines": [], + "SubletLines": [], + "TimePunches": [], + "Summary": { + "Labour": 0, + "Parts": 0, + "OilGas": 0, + "SubletTow": 0, + "Misc": 0, + "Environment": 0, + "ShopSupplies": 0, + "Freight": 0, + "WarrantyDeductible": 0, + "Discount": 0, + "SubTotal": 0, + "Tax1": 0, + "Tax2": 0, + "InvoiceTotal": 0, + "CustomerDeductible": 0, + "GrandTotal": 0, + "LabourDiscount": 0, + "PartDiscount": 0, + "ServiceFeeTotal": 0, + "OEMDiscount": 0 + }, + // "Coupons": [], + // "PriceCode": "C", + // "JobGoodWill": false, + // "OriginType": "OperationCode", + "LineType": "RequestLine", + // "TireStorageType": 0, + // "IsDeleted": false, + // "InspectionRef": "00000000000000000000000000000000", + // "AWRTechCSRRef": "00000000000000000000000000000000", + // "DisplayInWebAppointments": false, + // "Severity": "Low" + }, + ], // "Requests": [ // { // "RepairOrderRequestRef": "00000000000000000000000000000000", @@ -1552,22 +1605,21 @@ async function RepairOrderChange(socket) { // "PostalCode": "String", // "AdditionalInfo": "String" // }, - // "AlternateEndAddress": { - // "Name": "String", - // "Address": "String", - // "City": "String", - // "Province": "String", - // "PostalCode": "String", - // "AdditionalInfo": "String" - // } - // }, - "IsAsynchronous": false, - // "UserRequest": "String", - // "UserRef": "00000000000000000000000000000000" - } + // "AlternateEndAddress": { + // "Name": "String", + // "Address": "String", + // "City": "String", + // "Province": "String", + // "PostalCode": "String", + // "AdditionalInfo": "String" + // } + }, + "IsAsynchronous": false, + // "UserRequest": "String", + // "UserRef": "00000000000000000000000000000000" + } - - , + , { auth: PBS_CREDENTIALS, socket } ); CheckForErrors(socket, RepairOrderChangeResponse);