// no-dd-sa:javascript-code-style/assignment-name // Handler for VehicleDamageEstimateChgRq const client = require("../../../graphql-client/graphql-client").client; const { parseXml, normalizeXmlObject } = require("../partsManagementUtils"); const { GET_JOB_BY_CLAIM, UPDATE_JOB_BY_ID, UPSERT_JOBLINES, DELETE_JOBLINES_BY_IDS } = require("../partsManagement.queries"); /** * Finds a job by shop ID and claim number. * @param shopId * @param claimNum * @param logger * @returns {Promise<*|null>} */ const findJob = async (shopId, claimNum, logger) => { try { const { jobs } = await client.request(GET_JOB_BY_CLAIM, { shopid: shopId, clm_no: claimNum }); return jobs?.[0] || null; } catch (err) { logger.log("parts-job-lookup-failed", "error", null, null, { error: err }); return null; } }; /** * Extracts updated job data from the request payload. * @param rq * @returns {{comment: (number|((comment: Comment, helper: postcss.Helpers) => (Promise | void))|string|null), clm_no: null, status: (*|null), policy_no: (*|null)}} */ const extractUpdatedJobData = (rq) => { const doc = rq.DocumentInfo || {}; const claim = rq.ClaimInfo || {}; return { comment: doc.Comment || null, clm_no: claim.ClaimNum || null, status: claim.ClaimStatus || null, policy_no: claim.PolicyInfo?.PolicyNum || null }; }; /** * Extracts updated job lines from the request payload. * @param addsChgs * @param jobId * @returns {{jobid: *, line_no: number, unq_seq: number, status, line_desc, part_type, part_qty: number, oem_partno, db_price: number, act_price: number, mod_lbr_ty, mod_lb_hrs: number, lbr_op, lbr_amt: number, notes, manual_line: boolean}[]} */ const extractUpdatedJobLines = (addsChgs = {}, jobId) => { const lines = Array.isArray(addsChgs.DamageLineInfo) ? addsChgs.DamageLineInfo : [addsChgs.DamageLineInfo || []]; return lines.map((line) => ({ jobid: jobId, line_no: parseInt(line.LineNum, 10), unq_seq: parseInt(line.UniqueSequenceNum, 10), status: line.LineStatusCode || null, line_desc: line.LineDesc || null, part_type: line.PartInfo?.PartType || null, part_qty: parseFloat(line.PartInfo?.Quantity || 0), oem_partno: line.PartInfo?.OEMPartNum || null, db_price: parseFloat(line.PartInfo?.PartPrice || 0), act_price: parseFloat(line.PartInfo?.PartPrice || 0), mod_lbr_ty: line.LaborInfo?.LaborType || null, mod_lb_hrs: parseFloat(line.LaborInfo?.LaborHours || 0), lbr_op: line.LaborInfo?.LaborOperation || null, lbr_amt: parseFloat(line.LaborInfo?.LaborAmt || 0), notes: line.LineMemo || null, manual_line: line.ManualLineInd === "1" })); }; /** * Extracts deletion IDs from the deletions object. * @param deletions * @returns {number[]} */ const extractDeletions = (deletions = {}) => { const lines = Array.isArray(deletions.DamageLineInfo) ? deletions.DamageLineInfo : [deletions.DamageLineInfo || []]; return lines.map((line) => parseInt(line.UniqueSequenceNum, 10)).filter((id) => !isNaN(id)); }; /** * Handles VehicleDamageEstimateChgRq requests. * @param req * @param res * @returns {Promise<*>} */ const partsManagementVehicleDamageEstimateChgRq = async (req, res) => { const { logger } = req; try { const payload = await parseXml(req.body, logger); const rq = normalizeXmlObject(payload.VehicleDamageEstimateChgRq); if (!rq) return res.status(400).send("Missing "); const shopId = rq.ShopID; const claimNum = rq.ClaimInfo?.ClaimNum; if (!shopId || !claimNum) return res.status(400).send("Missing ShopID or ClaimNum"); const job = await findJob(shopId, claimNum, logger); if (!job) return res.status(404).send("Job not found"); const updatedJobData = extractUpdatedJobData(rq); const updatedLines = extractUpdatedJobLines(rq.AddsChgs, job.id); const deletedLineIds = extractDeletions(rq.Deletions); await client.request(UPDATE_JOB_BY_ID, { id: job.id, job: updatedJobData }); if (updatedLines.length > 0) { await client.request(UPSERT_JOBLINES, { joblines: updatedLines }); } if (deletedLineIds.length > 0) { await client.request(DELETE_JOBLINES_BY_IDS, { jobid: job.id, unqSeqs: deletedLineIds }); } logger.log("parts-job-changed", "info", job.id, null); return res.status(200).json({ success: true, jobId: job.id }); } catch (err) { logger.log("parts-chgrq-error", "error", null, null, { error: err }); return res.status(err.status || 500).json({ error: err.message || "Internal error" }); } }; module.exports = partsManagementVehicleDamageEstimateChgRq;