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

77 lines
2.3 KiB
JavaScript

const { GraphQLClient } = require("graphql-request");
const queries = require("../graphql-client/queries");
/**
* Query job + related entities.
* Supports { socket } (GraphQL) and/or { redisHelpers } (cache/fetch).
*/
async function QueryJobData(ctx = {}, jobId) {
if (!jobId) throw new Error("jobId required");
const { redisHelpers, socket } = ctx;
if (redisHelpers) {
if (typeof redisHelpers.getJobFromCache === "function") {
try {
const hit = await redisHelpers.getJobFromCache(jobId);
if (hit) return hit;
} catch {}
}
if (typeof redisHelpers.fetchJobById === "function") {
const full = await redisHelpers.fetchJobById(jobId);
if (full) return full;
}
}
if (socket) {
const endpoint = process.env.GRAPHQL_ENDPOINT;
if (!endpoint) throw new Error("GRAPHQL_ENDPOINT not configured");
const token = (socket?.data && socket.data.authToken) || (socket?.handshake?.auth && socket.handshake.auth.token);
if (!token) throw new Error("Missing bearer token on socket for GraphQL fetch");
const client = new GraphQLClient(endpoint, {});
const resp = await client
.setHeaders({ Authorization: `Bearer ${token}` })
.request(queries.QUERY_JOBS_FOR_CDK_EXPORT, { id: jobId });
const job = resp?.jobs_by_pk;
if (job) return job;
throw new Error("QueryJobData: job not found via GraphQL");
}
throw new Error("QueryJobData: no available method to load job (need socket or redisHelpers)");
}
/**
* Build RR create/update RO payload.
* Prefers selectedVehicle.vin (if present) over job VIN.
*/
function buildRRRepairOrderPayload({ job, selectedCustomer, selectedVehicle, advisorNo }) {
const custNo =
selectedCustomer?.custNo ||
selectedCustomer?.customerNo ||
selectedCustomer?.CustNo ||
selectedCustomer?.CustomerNo;
if (!custNo) throw new Error("No RR customer selected (custNo missing)");
const vin = selectedVehicle?.vin || job?.vehicle?.vin || job?.v_vin || job?.vehicle_vin;
if (!vin) throw new Error("No VIN available (select or create a vehicle)");
return {
repairOrderNumber: String(job?.job_number || job?.id),
deptType: "B",
vin,
custNo,
advNo: advisorNo || undefined
};
}
module.exports = {
QueryJobData,
buildRRRepairOrderPayload
};