Files
bodyshop/server/rr/rr-job-export.js

78 lines
2.6 KiB
JavaScript

// server/rr/rr-job-export.js
const { buildRRRepairOrderPayload } = require("./rr-job-helpers");
const { buildClientAndOpts } = require("./rr-lookup");
const { ensureRRServiceVehicle } = require("./rr-service-vehicles");
const RRLogger = require("./rr-logger");
/**
* Orchestrate an RR export (assumes custNo already resolved):
* - Ensure service vehicle (create flows)
* - Create or update the Repair Order
*/
async function exportJobToRR(args) {
const { bodyshop, job, advisorNo, selectedCustomer, existing, socket } = args || {};
const log = RRLogger(socket, { ns: "rr-export" });
if (!bodyshop) throw new Error("exportJobToRR: bodyshop is required");
if (!job) throw new Error("exportJobToRR: job is required");
if (advisorNo == null || String(advisorNo).trim() === "") {
throw new Error("exportJobToRR: advisorNo is required for RR");
}
// Now strictly require custNo here
const custNo =
(selectedCustomer && (selectedCustomer.custNo || selectedCustomer.CustNo || selectedCustomer.customerNo)) ||
(typeof selectedCustomer === "string" || typeof selectedCustomer === "number" ? String(selectedCustomer) : null);
if (!custNo) throw new Error("exportJobToRR: selectedCustomer.custNo is required");
const { client, opts } = buildClientAndOpts(bodyshop);
const finalOpts = {
...opts,
envelope: {
...(opts?.envelope || {}),
sender: {
...(opts?.envelope?.sender || {}),
task: "BSMRO",
referenceId: existing?.dmsRepairOrderId ? "Update" : "Insert"
}
}
};
// Ensure service vehicle for create flows (best-effort)
let svId = null;
if (!existing?.dmsRepairOrderId) {
try {
const svRes = await ensureRRServiceVehicle({ bodyshop, custNo, job, overrides: {}, socket });
svId = svRes?.svId || null;
log("info", "RR service vehicle ensured", { created: svRes?.created, svId });
} catch (e) {
log("warn", "RR ensure service vehicle failed; continuing", { error: e?.message });
}
}
const payload = buildRRRepairOrderPayload({
job,
selectedCustomer: { custNo },
advisorNo
});
const rrRes = existing?.dmsRepairOrderId
? await client.updateRepairOrder({ ...payload, dmsRepairOrderId: existing.dmsRepairOrderId }, finalOpts)
: await client.createRepairOrder(payload, finalOpts);
const data = rrRes?.data || null;
const roStatus = data?.roStatus || null;
return {
success: rrRes?.success === true || roStatus?.status === "Success",
data,
roStatus,
statusBlocks: rrRes?.statusBlocks || [],
xml: rrRes?.xml,
parsed: rrRes?.parsed,
custNo,
svId
};
}
module.exports = { exportJobToRR };