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 };