feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checkpoint
This commit is contained in:
82
server/rr/rr-service-vehicles.js
Normal file
82
server/rr/rr-service-vehicles.js
Normal file
@@ -0,0 +1,82 @@
|
||||
// server/rr/rr-service-vehicles.js
|
||||
const { RRClient } = require("./lib/index.cjs");
|
||||
const { getRRConfigFromBodyshop } = require("./rr-config");
|
||||
const RRLogger = require("./rr-logger");
|
||||
|
||||
function buildClientAndOpts(bodyshop) {
|
||||
const cfg = getRRConfigFromBodyshop(bodyshop);
|
||||
const client = new RRClient({
|
||||
baseUrl: cfg.baseUrl,
|
||||
username: cfg.username,
|
||||
password: cfg.password,
|
||||
timeoutMs: cfg.timeoutMs,
|
||||
retries: cfg.retries
|
||||
});
|
||||
const opts = {
|
||||
routing: cfg.routing,
|
||||
envelope: {
|
||||
sender: {
|
||||
component: "Rome",
|
||||
task: "SV", // Service Vehicle op code; adjust if your lib expects another
|
||||
referenceId: "Insert",
|
||||
creator: "RCI",
|
||||
senderName: "RCI"
|
||||
}
|
||||
}
|
||||
};
|
||||
return { client, opts };
|
||||
}
|
||||
|
||||
function buildServiceVehiclePayload({ job, custNo, overrides = {} }) {
|
||||
return {
|
||||
custNo: String(custNo), // tie SV to customer
|
||||
vin: overrides.vin ?? job?.v_vin,
|
||||
year: overrides.year ?? job?.v_model_yr,
|
||||
make: overrides.make ?? job?.dms_make ?? job?.v_make,
|
||||
model: overrides.model ?? job?.dms_model ?? job?.v_model,
|
||||
licensePlate: overrides.plate ?? job?.plate_no
|
||||
// add other safe keys your RR client supports (color, mileage, etc.)
|
||||
};
|
||||
}
|
||||
|
||||
async function ensureRRServiceVehicle({ bodyshop, custNo, job, overrides = {}, socket }) {
|
||||
const log = RRLogger(socket, { ns: "rr" });
|
||||
const { client, opts } = buildClientAndOpts(bodyshop);
|
||||
|
||||
// Optional: first try a combined query by VIN to detect existing SV
|
||||
try {
|
||||
const queryRes = await client.combinedSearch(
|
||||
{ vin: job?.v_vin, maxRecs: 1 },
|
||||
{
|
||||
...opts,
|
||||
envelope: {
|
||||
...opts.envelope,
|
||||
sender: { ...opts.envelope.sender, task: "CVC", referenceId: "Query" }
|
||||
}
|
||||
}
|
||||
);
|
||||
const hasVehicle = Array.isArray(queryRes?.vehicles)
|
||||
? queryRes.vehicles.length > 0
|
||||
: Array.isArray(queryRes) && queryRes.length > 0;
|
||||
if (hasVehicle) {
|
||||
return { created: false, raw: queryRes };
|
||||
}
|
||||
} catch (e) {
|
||||
// non-fatal, continue to insert
|
||||
log("warn", "RR combined search failed before SV insert; proceeding to insert", { err: e?.message });
|
||||
}
|
||||
|
||||
const payload = buildServiceVehiclePayload({ job, custNo, overrides });
|
||||
const res = await client.insertServiceVehicle(payload, opts);
|
||||
const data = res?.data ?? res;
|
||||
|
||||
// Normalize a simple id for later (RR often returns DMSRecKey on insert)
|
||||
const svId = data?.svId ?? data?.serviceVehicleId ?? data?.dmsRecKey ?? data?.DMSRecKey;
|
||||
|
||||
if (!svId) {
|
||||
log("error", "RR insert service vehicle returned no id", { data });
|
||||
}
|
||||
return { created: true, svId, raw: data };
|
||||
}
|
||||
|
||||
module.exports = { ensureRRServiceVehicle };
|
||||
Reference in New Issue
Block a user