// 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 };