feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Enhance logging

This commit is contained in:
Dave
2025-11-13 15:39:29 -05:00
parent 9c2c0b665d
commit 4c250f6189
9 changed files with 98 additions and 128 deletions

View File

@@ -1,5 +1,5 @@
const RRLogger = require("./rr-logger");
const { buildClientAndOpts, rrCombinedSearch } = require("./rr-lookup");
const CreateRRLogEvent = require("./rr-logger-event");
/**
* Pick and normalize VIN from inputs
@@ -36,7 +36,7 @@ const pickCustNo = ({ selectedCustomerNo, custNo, customerNo }) => {
* @returns {Set<any>}
*/
const ownersFromCombined = (res, wantedVin) => {
const blocks = Array.isArray(res?.data) ? res.data : Array.isArray(res) ? res : [];
const blocks = Array.isArray(res?.data) ? res.data : [];
const owners = new Set();
for (const blk of blocks) {
const serv = Array.isArray(blk?.ServVehicle) ? blk.ServVehicle : [];
@@ -72,7 +72,6 @@ const isAlreadyExistsError = (e) => {
* - selectedCustomerNo / custNo / customerNo
* - license (optional)
* - socket (for logging)
* - logNs (namespace for logs)
*
* Returns: { created:boolean, exists:boolean, vin, customerNo, svId?, status? }
*/
@@ -87,12 +86,9 @@ const ensureRRServiceVehicle = async (args = {}) => {
custNo,
customerNo,
license,
socket,
logNs = "rr-service-vehicles"
socket
} = args;
const log = RRLogger(socket, { ns: logNs });
// Build/derive essentials
let client = inClient;
let routing = inRouting;
@@ -116,17 +112,24 @@ const ensureRRServiceVehicle = async (args = {}) => {
try {
let owners = new Set();
if (bodyshop) {
const comb = await rrCombinedSearch(bodyshop, { kind: "vin", vin: vinStr, maxResults: 50 });
owners = ownersFromCombined(comb, vinStr);
const combinedSearchResponse = await rrCombinedSearch(bodyshop, { kind: "vin", vin: vinStr, maxResults: 50 });
CreateRRLogEvent(socket, "silly", "{SV} Preflight combined search by VIN: raw response", {
response: combinedSearchResponse
});
owners = ownersFromCombined(combinedSearchResponse, vinStr);
}
// Short-circuit: VIN exists anywhere -> don't try to insert
if (owners.size > 0) {
const ownedBySame = owners.has(custNoStr);
log(ownedBySame ? "info" : "warn", "{SV} VIN already present in RR; skipping insert", {
CreateRRLogEvent(socket, ownedBySame ? "info" : "warn", "{SV} VIN already present in RR; skipping insert", {
vin: vinStr,
selectedCustomerNo: custNoStr,
owners: Array.from(owners)
});
return {
created: false,
exists: true,
@@ -137,7 +140,10 @@ const ensureRRServiceVehicle = async (args = {}) => {
}
} catch (e) {
// Preflight shouldn't be fatal; log and continue to insert (idempotency will still be handled)
log("warn", "{SV} VIN preflight lookup failed; continuing to insert", { vin: vinStr, error: e?.message });
CreateRRLogEvent(socket, "WARN", "{SV} VIN preflight lookup failed; continuing to insert", {
vin: vinStr,
error: e?.message
});
}
// --- Attempt insert (idempotent) ---
@@ -163,30 +169,26 @@ const ensureRRServiceVehicle = async (args = {}) => {
}
};
log("debug", "{SV} Inserting service vehicle", {
CreateRRLogEvent(socket, "info", "{SV} Inserting service vehicle", {
vin: vinStr,
selectedCustomerNo: custNoStr,
payloadShape: Object.keys(insertPayload).filter((k) => insertPayload[k] != null)
});
// Be tolerant to method name differences
const fnName =
typeof client.insertServiceVehicle === "function"
? "insertServiceVehicle"
: typeof client.serviceVehicleInsert === "function"
? "serviceVehicleInsert"
: null;
if (!fnName) {
throw new Error("RR client does not expose insertServiceVehicle/serviceVehicleInsert");
}
try {
const res = await client[fnName](insertPayload, insertOpts);
const res = await client.insertServiceVehicle(insertPayload, insertOpts);
CreateRRLogEvent(socket, "silly", "{SV} insertServiceVehicle: raw response", { res });
const data = res?.data ?? {};
const svId = data?.dmsRecKey || data?.svId || undefined;
log("info", "{SV} insertServiceVehicle: success", { vin: vinStr, customerNo: custNoStr, svId });
CreateRRLogEvent(socket, "info", "{SV} insertServiceVehicle: success", {
vin: vinStr,
customerNo: custNoStr,
svId
});
return {
created: true,
exists: false,
@@ -198,12 +200,13 @@ const ensureRRServiceVehicle = async (args = {}) => {
} catch (e) {
if (isAlreadyExistsError(e)) {
// Treat as idempotent success
log("warn", "{SV} insertServiceVehicle: already exists; treating as success", {
CreateRRLogEvent(socket, "warn", "{SV} insertServiceVehicle: already exists; treating as success", {
vin: vinStr,
customerNo: custNoStr,
code: e?.code,
status: e?.meta?.status || e?.status
});
return {
created: false,
exists: true,
@@ -212,11 +215,13 @@ const ensureRRServiceVehicle = async (args = {}) => {
status: e?.meta?.status || e?.status
};
}
log("error", "{SV} insertServiceVehicle: failure", {
CreateRRLogEvent(socket, "error", "{SV} insertServiceVehicle: failure", {
message: e?.message,
code: e?.code,
status: e?.meta?.status || e?.status
});
throw e;
}
};