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

This commit is contained in:
Dave
2025-11-13 16:38:00 -05:00
parent 4c250f6189
commit 9cb1b25b1d
6 changed files with 66 additions and 15 deletions

View File

@@ -208,17 +208,27 @@ const buildCustomerPayloadFromJob = (job, overrides = {}) => {
const createRRCustomer = async ({ bodyshop, job, overrides = {}, socket }) => {
const { client, opts } = buildClientAndOpts(bodyshop);
const payload = buildCustomerPayloadFromJob(job, overrides);
const safePayload = sanitizeRRCustomerPayload(payload);
// Story step: clearly show we are about to hit Reynolds insertCustomer
CreateRRLogEvent(socket, "DEBUG", "{CU} insertCustomer: begin", {
ibFlag: safePayload.ibFlag,
hasAddress: Array.isArray(safePayload.addresses) && safePayload.addresses.length > 0,
hasPhones: Array.isArray(safePayload.phones) && safePayload.phones.length > 0,
hasEmails: Array.isArray(safePayload.emails) && safePayload.emails.length > 0
});
let response;
try {
const safePayload = sanitizeRRCustomerPayload(payload);
response = await client.insertCustomer(safePayload, opts);
CreateRRLogEvent(socket, "SILLY", "RR createRRCustomer called", { response });
// Very noisy; only show when log level is cranked to SILLY
CreateRRLogEvent(socket, "SILLY", "{CU} insertCustomer: raw response", { response });
} catch (e) {
CreateRRLogEvent(socket, "ERROR", "RR insertCustomer transport error", {
message: e?.message,
stack: e?.stack,
payload
code: e?.code,
status: e?.meta?.status || e?.status,
payload: safePayload
});
throw e;
}
@@ -242,7 +252,14 @@ const createRRCustomer = async ({ bodyshop, job, overrides = {}, socket }) => {
);
}
return { customerNo: String(customerNo), raw: data };
const out = { customerNo: String(customerNo), raw: data };
CreateRRLogEvent(socket, "INFO", "{CU} insertCustomer: success", {
customerNo: out.customerNo,
status: trx || null
});
return out;
};
module.exports = {

View File

@@ -9,7 +9,8 @@ const CreateRRLogEvent = require("./rr-logger-event");
* @returns {Promise<{success, data: *, roStatus: *, statusBlocks,customerNo: string, svId: null, roNo: *}>}
*/
const exportJobToRR = async (args) => {
const { bodyshop, job, advisorNo, selectedCustomer, existing, socket } = args || {};
const { bodyshop, job, advisorNo, selectedCustomer, txEnvelope, socket } = args || {};
const existing = txEnvelope?.existing || {};
if (!bodyshop) throw new Error("exportJobToRR: bodyshop is required");
if (!job) throw new Error("exportJobToRR: job is required");
@@ -22,6 +23,7 @@ const exportJobToRR = async (args) => {
if (!selected) throw new Error("exportJobToRR: selectedCustomer.custNo/customerNo is required");
const { client, opts } = buildClientAndOpts(bodyshop);
const finalOpts = {
...opts,
envelope: {
@@ -37,6 +39,7 @@ const exportJobToRR = async (args) => {
// Ensure service vehicle for create flows (best-effort)
let svId = null;
if (!(existing?.roNo || existing?.dmsRoNo || existing?.dmsRepairOrderId)) {
try {
const svRes = await ensureRRServiceVehicle({
@@ -53,11 +56,16 @@ const exportJobToRR = async (args) => {
}
}
const story = txEnvelope?.story ? String(txEnvelope.story).trim() : null;
const makeOverride = txEnvelope?.makeOverride ? String(txEnvelope.makeOverride).trim() : null;
// Build RO payload for create/update
const payload = buildRRRepairOrderPayload({
job,
selectedCustomer: { customerNo: String(selected), custNo: String(selected) },
advisorNo: String(advisorNo)
advisorNo: String(advisorNo),
story,
makeOverride
});
// Canonical update key is "roNo" (prefer DMS RO number); accept fallbacks from "existing"
@@ -68,6 +76,7 @@ const exportJobToRR = async (args) => {
: await client.createRepairOrder(payload, finalOpts);
CreateRRLogEvent(socket, "INFO", `RR raw Repair Order ${roNoForUpdate ? "updated" : "created"}`, {
payload,
response
});
@@ -150,6 +159,12 @@ const finalizeRRRepairOrder = async (args) => {
});
const rrRes = await client.updateRepairOrder(payload, finalOpts);
CreateRRLogEvent(socket, "SILLY", "RR Repair Order finalized", {
payload,
response: rrRes
});
const data = rrRes?.data || null;
const roStatus = data?.roStatus || null;

View File

@@ -62,13 +62,15 @@ const QueryJobData = async (ctx = {}, jobId) => {
};
/**
* Build RR Repair Order payload from job and customer data.
* Build Repair Order payload for RR from job and customer data.
* @param job
* @param selectedCustomer
* @param advisorNo
* @param story
* @param makeOverride
* @returns {{outsdRoNo: string, repairOrderNumber: string, departmentType: string, vin: string, customerNo: string, advisorNo: string, mileageIn: *|null}}
*/
const buildRRRepairOrderPayload = ({ job, selectedCustomer, advisorNo }) => {
const buildRRRepairOrderPayload = ({ job, selectedCustomer, advisorNo, story }) => {
const customerNo = selectedCustomer?.customerNo
? String(selectedCustomer.customerNo).trim()
: selectedCustomer?.custNo
@@ -97,7 +99,7 @@ const buildRRRepairOrderPayload = ({ job, selectedCustomer, advisorNo }) => {
const roStr = String(ro);
return {
const output = {
// ---- RO Number (all variants; library currently requires `outsdRoNo`) ----
outsdRoNo: roStr,
repairOrderNumber: roStr,
@@ -112,6 +114,12 @@ const buildRRRepairOrderPayload = ({ job, selectedCustomer, advisorNo }) => {
// ---- Mileage In (new) ----
mileageIn
};
if (story) {
output.roComment = String(story).trim();
}
return output;
};
/**

View File

@@ -409,6 +409,7 @@ const registerRREvents = ({ socket, redisHelpers }) => {
const rid = resolveJobId(jobid || jobId, { jobid, jobId }, null);
let bodyshop = null;
let job = null;
let createdCustomer = false;
try {
if (!rid) throw new Error("jobid required");
@@ -445,6 +446,8 @@ const registerRREvents = ({ socket, redisHelpers }) => {
if (!selectedCustNo) throw new Error("RR create customer returned no custNo");
createdCustomer = true;
CreateRRLogEvent(socket, "DEBUG", `{3.2} Created customer`, { custNo: selectedCustNo });
}
@@ -594,7 +597,7 @@ const registerRREvents = ({ socket, redisHelpers }) => {
job,
selectedCustomer: { customerNo: effectiveCustNo, custNo: effectiveCustNo },
advisorNo: String(advisorNo),
existing: txEnvelope?.existing,
txEnvelope,
socket
});
@@ -640,8 +643,16 @@ const registerRREvents = ({ socket, redisHelpers }) => {
// Still emit info result if you want
socket.emit("rr-export-job:result", { jobId: rid, bodyshopId: bodyshop?.id, result });
// ACK but indicate it's pending finalize
ack?.({ ok: true, pendingFinalize: true, dmsRoNo, outsdRoNo, result });
// ACK but indicate it's pending finalize + include customer number + created flag
ack?.({
ok: true,
pendingFinalize: true,
dmsRoNo,
outsdRoNo,
result,
custNo: String(effectiveCustNo),
createdCustomer
});
} else {
// classify & fail (no finalize)
const vendorStatusCode = Number(