// 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 || selectedCustomer?.custNo; 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 { 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 DeptType/departmentType + variants) const payload = buildRRRepairOrderPayload({ job, selectedCustomer: { customerNo: String(selected), custNo: 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 };