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;