From dc94fa0a490ac58609a047ed0622b68cd400a8af Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Tue, 6 Aug 2024 15:21:46 -0700 Subject: [PATCH] Add in $0 target for jobs under 20000 KM. --- electron/decoder/constants.js | 6 ++- .../jobs-detail-description.molecule.jsx | 3 +- .../jobs-detail/jobs-detail.organism.jsx | 45 +++++-------------- src/graphql/jobs.queries.js | 2 + src/graphql/reporting.queries.js | 1 + src/redux/application/application.actions.js | 26 +++++------ src/redux/application/application.sagas.js | 9 ++-- src/redux/reporting/reporting.sagas.js | 8 +++- src/util/GetJobTarget.js | 15 ++++--- 9 files changed, 53 insertions(+), 62 deletions(-) diff --git a/electron/decoder/constants.js b/electron/decoder/constants.js index f4dd377..4952729 100644 --- a/electron/decoder/constants.js +++ b/electron/decoder/constants.js @@ -8,7 +8,11 @@ const RuleSets = [ }, { title: "V2", - range: [moment("2023-04-01"), moment("2040-01-01")], + range: [moment("2023-04-01"), moment("2024-09-01")], + }, + { + title: "V3", + range: [moment("2024-09-01"), moment("2040-01-01")], }, ]; diff --git a/src/components/molecules/jobs-detail-description/jobs-detail-description.molecule.jsx b/src/components/molecules/jobs-detail-description/jobs-detail-description.molecule.jsx index a47efd1..c8820a1 100644 --- a/src/components/molecules/jobs-detail-description/jobs-detail-description.molecule.jsx +++ b/src/components/molecules/jobs-detail-description/jobs-detail-description.molecule.jsx @@ -8,7 +8,7 @@ import JobGroupMolecule from "../job-group/job-group.molecule"; import DeleteJobAtom from "../../atoms/delete-job/delete-job.atom"; import VehicleGroupAlertAtom from "../../atoms/vehicle-group-alert/vehicle-group-alert.atom"; import { DateFormat } from "../../../util/constants"; -import dayjs from '../../../util/day.js'; +import dayjs from "../../../util/day.js"; import { PageHeader } from "@ant-design/pro-layout"; export default function JobsDetailDescriptionMolecule({ loading, job }) { @@ -71,6 +71,7 @@ export default function JobsDetailDescriptionMolecule({ loading, job }) { {job.loss_date ? dayjs(job.loss_date).format(DateFormat) : "No Loss Date"} + {job.v_mileage} diff --git a/src/components/organisms/jobs-detail/jobs-detail.organism.jsx b/src/components/organisms/jobs-detail/jobs-detail.organism.jsx index 29c7864..9bc9080 100644 --- a/src/components/organisms/jobs-detail/jobs-detail.organism.jsx +++ b/src/components/organisms/jobs-detail/jobs-detail.organism.jsx @@ -15,17 +15,17 @@ import "./jobs-detail.organism.styles.scss"; const mapStateToProps = createStructuredSelector({ //currentUser: selectCurrentUser - selectedJobId: selectSelectedJobId, + selectedJobId: selectSelectedJobId }); const mapDispatchToProps = (dispatch) => ({ //setUserLanguage: language => dispatch(setUserLanguage(language)) - setSelectedJobTargetPc: (job) => dispatch(setSelectedJobTargetPc(job)), + setSelectedJobTargetPc: (job) => dispatch(setSelectedJobTargetPc(job)) }); export function JobsDetailOrganism({ selectedJobId, setSelectedJobTargetPc }) { const { loading, error, data } = useQuery(QUERY_JOB_BY_PK, { variables: { jobId: selectedJobId }, - skip: !selectedJobId, + skip: !selectedJobId }); useEffect(() => { @@ -34,6 +34,7 @@ export function JobsDetailOrganism({ selectedJobId, setSelectedJobTargetPc }) { group: data.jobs_by_pk && data.jobs_by_pk.group, v_age: data.jobs_by_pk && data.jobs_by_pk.v_age, close_date: data.jobs_by_pk && data.jobs_by_pk.close_date, + v_mileage: data.jobs_by_pk && data.jobs_by_pk.v_mileage }); }, [data, setSelectedJobTargetPc]); @@ -44,56 +45,34 @@ export function JobsDetailOrganism({ selectedJobId, setSelectedJobTargetPc }) { display: "flex", height: "100%", justifyContent: "center", - alignItems: "center", + alignItems: "center" }} > ); - if (error) - return ( - - ); + if (error) return ; return (
- + - + - +
- - + +
diff --git a/src/graphql/jobs.queries.js b/src/graphql/jobs.queries.js index 8b225ef..d656f35 100644 --- a/src/graphql/jobs.queries.js +++ b/src/graphql/jobs.queries.js @@ -100,6 +100,7 @@ export const QUERY_JOB_BY_PK = gql` close_date updated_at requires_reimport + v_mileage joblines(order_by: { line_no: asc }) { id line_no @@ -170,6 +171,7 @@ export const UPDATE_JOB = gql` group group_verified requires_reimport + v_mileage joblines(order_by: { line_no: asc }) { id act_price diff --git a/src/graphql/reporting.queries.js b/src/graphql/reporting.queries.js index 012ba15..4226e1e 100644 --- a/src/graphql/reporting.queries.js +++ b/src/graphql/reporting.queries.js @@ -29,6 +29,7 @@ export const REPORTING_GET_JOBS = gql` v_vin v_type requires_reimport + v_mileage joblines { act_price db_price diff --git a/src/redux/application/application.actions.js b/src/redux/application/application.actions.js index f2b54e7..c2451b0 100644 --- a/src/redux/application/application.actions.js +++ b/src/redux/application/application.actions.js @@ -2,58 +2,58 @@ import ApplicationActionTypes from "./application.types"; export const setWatchedPaths = (watchedPaths) => ({ type: ApplicationActionTypes.SET_WATCHED_PATHS, - payload: watchedPaths, + payload: watchedPaths }); export const addWatchedPath = (path) => ({ type: ApplicationActionTypes.ADD_WATCHED_PATH, - payload: path, + payload: path }); export const removeWatchedPath = (path) => ({ type: ApplicationActionTypes.REMOVE_WATCHED_PATH, - payload: path, + payload: path }); export const setWatcherStatus = (status) => ({ type: ApplicationActionTypes.SET_WATCHER_STATUS, - payload: status, + payload: status }); export const setWatcherError = (error) => ({ type: ApplicationActionTypes.SET_WATCHER_ERROR, - payload: error, + payload: error }); export const setSelectedJobId = (jobId) => ({ type: ApplicationActionTypes.SET_SELECTED_JOB_ID, - payload: jobId, + payload: jobId }); -export const setSelectedJobTargetPc = ({ group, v_age,close_date }) => ({ +export const setSelectedJobTargetPc = ({ group, v_age, close_date, v_mileage }) => ({ type: ApplicationActionTypes.SET_SELECTED_JOB_TARGET_PC, - payload: { group, v_age, close_date }, + payload: { group, v_age, close_date, v_mileage } }); export const setSelectedJobTargetPcSuccess = (pct) => ({ type: ApplicationActionTypes.SET_SELECTED_JOB_TARGET_PC_SUCCESS, - payload: pct, + payload: pct }); export const setSettings = (settingsObj) => ({ type: ApplicationActionTypes.SET_SETTINGS, - payload: settingsObj, + payload: settingsObj }); export const setUpdateAvailable = (available) => ({ type: ApplicationActionTypes.SET_UPDATE_AVAILABLE, - payload: available, + payload: available }); export const setUpdateProgress = (progress) => ({ type: ApplicationActionTypes.SET_UPDATE_PROGRESS, - payload: progress, + payload: progress }); export const setReleaseNotes = (releaseNotes) => ({ type: ApplicationActionTypes.SET_RELEASE_NOTES, - payload: releaseNotes, + payload: releaseNotes }); diff --git a/src/redux/application/application.sagas.js b/src/redux/application/application.sagas.js index 849e0f5..75bd11d 100644 --- a/src/redux/application/application.sagas.js +++ b/src/redux/application/application.sagas.js @@ -4,16 +4,13 @@ import { setSelectedJobTargetPcSuccess } from "./application.actions"; import ApplicationActionTypes from "./application.types"; export function* onSetTargetPc() { - yield takeLatest( - ApplicationActionTypes.SET_SELECTED_JOB_TARGET_PC, - CalculateTarget - ); + yield takeLatest(ApplicationActionTypes.SET_SELECTED_JOB_TARGET_PC, CalculateTarget); } export function* CalculateTarget({ payload }) { - const { group, v_age, close_date } = payload; + const { group, v_age, close_date, v_mileage } = payload; const targets = yield select((state) => state.user.bodyshop.targets); - yield put(setSelectedJobTargetPcSuccess(GetJobTarget({group, v_age, targets, close_date}))); + yield put(setSelectedJobTargetPcSuccess(GetJobTarget({ group, v_age, targets, close_date, v_mileage }))); // const targetsForGroup = targets.filter((t) => t.group === group); // if (!targetsForGroup) return 0; // const targetPc = targetsForGroup.filter( diff --git a/src/redux/reporting/reporting.sagas.js b/src/redux/reporting/reporting.sagas.js index b0ff34d..5e2ca73 100644 --- a/src/redux/reporting/reporting.sagas.js +++ b/src/redux/reporting/reporting.sagas.js @@ -134,7 +134,13 @@ export function* handleCalculateScoreCard({ payload: jobs }) { jobs = jobs.map((job) => { const { actPriceSum, jobRpsDollars } = CalculateJobRpsDollars(job, true); const { dbPriceSum, jobRpsPc } = CalculateJobRpsPc(job, jobRpsDollars, true); - const jobTarget = GetJobTarget({ group: job.group, v_age: job.v_age, targets, close_date: job.close_date }); + const jobTarget = GetJobTarget({ + group: job.group, + v_age: job.v_age, + targets, + close_date: job.close_date, + v_mileage: job.v_mileage + }); scoreCard.shopRpsTotalDollars = scoreCard.shopRpsTotalDollars.add(jobRpsDollars); const expectedRpsDollars = dbPriceSum.percentage(jobTarget * 100); scoreCard.shopRpsExpectedDollars = scoreCard.shopRpsExpectedDollars.add(expectedRpsDollars); diff --git a/src/util/GetJobTarget.js b/src/util/GetJobTarget.js index 61a949f..4d007af 100644 --- a/src/util/GetJobTarget.js +++ b/src/util/GetJobTarget.js @@ -1,7 +1,7 @@ import { store } from "../redux/store"; import { WhichRulesetToApply } from "./constants"; -export default function GetJobTarget({ group, v_age, targets, close_date }) { +export default function GetJobTarget({ group, v_age, targets, close_date, v_mileage }) { // //Old Validation // const targetsForGroup = targets.filter((t) => t.group === group); // console.log( @@ -20,17 +20,18 @@ export default function GetJobTarget({ group, v_age, targets, close_date }) { // console.log("Result:", 1); // } + //V3 Check - If vehicle is less than 20,000KM, there is NO TARGET. + if (v_mileage && v_mileage <= 20000) { + return 0; + } + //V2 Check const newTargets = store.getState().user.targets; const rulesToApply = WhichRulesetToApply(close_date); - const newTargetsForGroup = newTargets.filter( - (t) => t.name === rulesToApply && t.group === group - ); + const newTargetsForGroup = newTargets.filter((t) => t.name === rulesToApply && t.group === group); if (!newTargetsForGroup) return 0; - const newTargetPc = newTargetsForGroup.filter( - (t) => t.ageGte <= v_age && (t.ageLt ? t.ageLt > v_age : true) - ); + const newTargetPc = newTargetsForGroup.filter((t) => t.ageGte <= v_age && (t.ageLt ? t.ageLt > v_age : true)); if (newTargetPc.length === 0) return 1; else if (newTargetPc.length === 1) return newTargetPc[0].target;