135 lines
4.6 KiB
JavaScript
135 lines
4.6 KiB
JavaScript
// 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> | 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 <VehicleDamageEstimateChgRq>");
|
|
|
|
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;
|