87 lines
2.7 KiB
JavaScript
87 lines
2.7 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");
|
|
}
|
|
|
|
// Resolve customer number (accept multiple shapes)
|
|
const selected = selectedCustomer?.customerNo;
|
|
|
|
if (!selected) throw new Error("exportJobToRR: selectedCustomer.custNo/customerNo 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 {
|
|
// Provide both customerNo and custNo for safety
|
|
const svRes = await ensureRRServiceVehicle({
|
|
bodyshop,
|
|
job,
|
|
overrides: {},
|
|
customerNo: String(selected),
|
|
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 });
|
|
}
|
|
}
|
|
|
|
// Build RO payload (now includes both customerNo & custNo; advisorNo & advNo)
|
|
const payload = buildRRRepairOrderPayload({
|
|
job,
|
|
selectedCustomer: { customerNo: String(selected) },
|
|
advisorNo: String(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,
|
|
customerNo: String(selected),
|
|
svId
|
|
};
|
|
}
|
|
|
|
module.exports = { exportJobToRR };
|