Files
imexrps/src/ipc/ipc-estimate-utils.js
2020-10-22 12:38:33 -07:00

195 lines
5.3 KiB
JavaScript

import gql from "graphql-tag";
import _ from "lodash";
import moment from "moment";
import client from "../graphql/GraphQLClient";
import {
INSERT_NEW_JOB,
QUERY_JOB_BY_CLM_NO,
UPDATE_JOB
} from "../graphql/jobs.queries";
import { QUERY_GROUPS_BY_MAKE_TYPE } from "../graphql/veh_group.queries";
import { store } from "../redux/store";
const { logger } = window;
export async function UpsertEstimate(job) {
const shopId = store.getState().user.bodyshop.id;
logger.info("Beginning Upserting job from Renderer.");
const parsedYr = parseInt(job.v_model_yr);
logger.info(
moment(job.loss_date).year() -
(parsedYr >= 0 ? 2000 + parsedYr : 1900 + parsedYr)
);
job = {
...job,
group: await DetermineVehicleGroup(job),
v_age:
moment(job.loss_date).year() -
(parsedYr >= 0 ? 2000 + parsedYr : 1900 + parsedYr),
};
const existingJobs = await client.query({
query: QUERY_JOB_BY_CLM_NO,
variables: { clm_no: job.clm_no },
});
if (existingJobs.data.jobs.length === 1) {
let suppDelta = await GetSupplementDelta(
existingJobs.data.jobs[0].id,
existingJobs.data.jobs[0].joblines,
job.joblines.data
);
logger.info("Attemping to update job record.");
await client.mutate({
mutation: gql`
${suppDelta}
`,
});
delete job.joblines;
await client.mutate({
mutation: UPDATE_JOB,
variables: { jobId: existingJobs.data.jobs[0].id, job: job },
});
logger.info("Job updated succesfully.");
} else {
logger.info("Attemping to insert job record.");
const result = await client.mutate({
mutation: INSERT_NEW_JOB,
variables: {
job: { ...job, bodyshopid: shopId },
},
refetchQueries: ["QUERY_ALL_JOBS_PAGINATED"],
});
logger.info("Job inserted succesfully.");
console.log("UpsertEstimate -> result", result);
}
}
export const GetSupplementDelta = async (jobId, existingLinesO, newLines) => {
const existingLines = _.cloneDeep(existingLinesO);
//console.log("GetSupplementDelta -> newLines", newLines);
//console.log("GetSupplementDelta -> existingLines", existingLines);
const linesToInsert = [];
const linesToUpdate = [];
newLines.forEach((newLine) => {
const matchingIndex = existingLines.findIndex(
(eL) => eL.unq_seq === newLine.unq_seq
);
if (matchingIndex >= 0) {
//Found a relevant matching line. Add it to lines to update.
linesToUpdate.push({
id: existingLines[matchingIndex].id,
newData: {
...newLine,
ignore: existingLines[matchingIndex].ignore,
},
});
//Splice out item we found for performance.
existingLines.splice(matchingIndex, 1);
} else {
//Didn't find a match. Must be a new line.
linesToInsert.push(newLine);
}
});
//Wahtever is left in the existing lines, are lines that should be removed.
const insertQueries = linesToInsert.reduce((acc, value, idx) => {
return acc + generateInsertQuery(value, idx, jobId);
}, "");
const updateQueries = linesToUpdate.reduce((acc, value, idx) => {
return acc + generateUpdateQuery(value, idx);
}, "");
const removeQueries = existingLines.reduce((acc, value, idx) => {
return acc + generateRemoveQuery(value, idx);
}, "");
return new Promise((resolve, reject) => {
resolve(gql`
mutation SUPPLEMENT_EST_LINES{
${insertQueries + updateQueries + removeQueries}
}
`);
});
};
const generateInsertQuery = (lineToInsert, index, jobId) => {
lineToInsert.jobid = jobId;
return `
insert_joblines${index}: insert_joblines(objects: ${JSON.stringify(
lineToInsert
).replace(/"(\w+)"\s*:/g, "$1:")}) {
returning {
id
}
}`;
};
const generateUpdateQuery = (lineToUpdate, index) => {
return `
update_joblines${index}: update_joblines(where: { id: { _eq: "${
lineToUpdate.id
}" } }, _set: ${JSON.stringify(lineToUpdate.newData).replace(
/"(\w+)"\s*:/g,
"$1:"
)}) {
returning {
id
}
}`;
};
const generateRemoveQuery = (lineToRemove, index) => {
return `
delete_joblines_r${index}: delete_joblines_by_pk(id: "${lineToRemove.id}") {
id
}`;
};
const DetermineVehicleGroup = async (job) => {
logger.info(
"Searching for vehicle groups.!",
job.v_makedesc.toUpperCase(),
job.v_type ? job.v_type.toUpperCase() : null
);
const vehicleGroups = await client.query({
query: QUERY_GROUPS_BY_MAKE_TYPE,
variables: {
make: job.v_makedesc.toUpperCase(),
type:
job.v_type && job.v_type.toUpperCase() !== "PC"
? job.v_type.toUpperCase()
: null,
isNull: job.v_type && job.v_type.toUpperCase() !== "PC" ? false : true,
},
});
if (vehicleGroups.data.veh_groups.length === 1) {
logger.info("Found 1 vehicle group.!", vehicleGroups.data.veh_groups[0]);
return vehicleGroups.data.veh_groups[0].group;
} else if (vehicleGroups.data.veh_groups.length === 0) {
//Uh-oh, should only be 1.
logger.info("No vehicle groups found.");
return null;
} else {
//Should never be here.
alert("Fatal error. Multiple vehicle groups found for this claim.");
logger.error(
"Found multiple vehicle groups!",
job.v_makedesc.toUpperCase(),
job.v_type ? job.v_type.toUpperCase() : null
);
}
return "";
};