84 lines
2.6 KiB
JavaScript
84 lines
2.6 KiB
JavaScript
// 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 {
|
|
customerNo: String(custNo), // tie SV to customer
|
|
vin: overrides.vin ?? job?.v_vin,
|
|
year: overrides.year ?? job?.v_model_yr,
|
|
make: overrides.make ?? job?.v_make_des,
|
|
model: overrides.model ?? job?.v_model_desc,
|
|
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, kind: "vin" },
|
|
{
|
|
...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 };
|