diff --git a/client/src/components/job-totals-table/job-totals-table.component.jsx b/client/src/components/job-totals-table/job-totals-table.component.jsx
index 7e3cb0946..8ff022176 100644
--- a/client/src/components/job-totals-table/job-totals-table.component.jsx
+++ b/client/src/components/job-totals-table/job-totals-table.component.jsx
@@ -202,8 +202,6 @@ export function JobsTotalsTableComponent({ bodyshop, job }) {
{`(${Dinero(
job.job_totals.parts.parts.subtotal
- ).toFormat()} ± ${Dinero(
- job.job_totals.parts.parts.adjustments
).toFormat()})`} |
@@ -213,8 +211,6 @@ export function JobsTotalsTableComponent({ bodyshop, job }) {
| {`(${Dinero(
job.job_totals.parts.sublets.subtotal
- ).toFormat()} ± ${Dinero(
- job.job_totals.parts.sublets.adjustments
).toFormat()})`} |
@@ -339,7 +335,10 @@ export function JobsTotalsTableComponent({ bodyshop, job }) {
diff --git a/client/src/components/jobs-close-totals/jobs-close-totals.component.jsx b/client/src/components/jobs-close-totals/jobs-close-totals.component.jsx
index d7a00541b..280ca291a 100644
--- a/client/src/components/jobs-close-totals/jobs-close-totals.component.jsx
+++ b/client/src/components/jobs-close-totals/jobs-close-totals.component.jsx
@@ -19,8 +19,6 @@ export default function JobsCloseTotals({ jobTotals }) {
value={Dinero(jobTotals.parts.parts.total).toFormat()}
suffix={`(${Dinero(
jobTotals.parts.parts.subtotal
- ).toFormat()} ± ${Dinero(
- jobTotals.parts.parts.adjustments
).toFormat()})`}
/>
@@ -29,8 +27,6 @@ export default function JobsCloseTotals({ jobTotals }) {
value={Dinero(jobTotals.parts.sublets.total).toFormat()}
suffix={`(${Dinero(
jobTotals.parts.sublets.subtotal
- ).toFormat()} ± ${Dinero(
- jobTotals.parts.sublets.adjustments
).toFormat()})`}
/>
diff --git a/client/src/components/jobs-detail-rates/jobs-detail-rates.component.jsx b/client/src/components/jobs-detail-rates/jobs-detail-rates.component.jsx
index 66681b5e8..cce719707 100644
--- a/client/src/components/jobs-detail-rates/jobs-detail-rates.component.jsx
+++ b/client/src/components/jobs-detail-rates/jobs-detail-rates.component.jsx
@@ -1,9 +1,9 @@
-import { Form, Select, Switch } from "antd";
+import { Form, InputNumber, Select } from "antd";
import React from "react";
import { useTranslation } from "react-i18next";
import CurrencyInput from "../form-items-formatted/currency-form-item.component";
-import FormRow from "../layout-form-row/layout-form-row.component";
import JobsDetailRatesChangeButton from "../jobs-detail-rates-change-button/jobs-detail-rates-change-button.component";
+import FormRow from "../layout-form-row/layout-form-row.component";
export default function JobsDetailRates({ job, form }) {
const { t } = useTranslation();
@@ -120,6 +120,24 @@ export default function JobsDetailRates({ job, form }) {
+
+
+
+
+
+
+
+
+
);
diff --git a/client/src/graphql/jobs.queries.js b/client/src/graphql/jobs.queries.js
index cb80cf3b5..1343fd46a 100644
--- a/client/src/graphql/jobs.queries.js
+++ b/client/src/graphql/jobs.queries.js
@@ -436,6 +436,9 @@ export const GET_JOB_BY_PK = gql`
rate_mash
rate_matd
actual_in
+ federal_tax_rate
+ local_tax_rate
+ state_tax_rate
scheduled_completion
scheduled_in
actual_completion
diff --git a/client/src/pages/jobs-detail/jobs-detail.page.container.jsx b/client/src/pages/jobs-detail/jobs-detail.page.container.jsx
index 9d02df77f..d36c38a05 100644
--- a/client/src/pages/jobs-detail/jobs-detail.page.container.jsx
+++ b/client/src/pages/jobs-detail/jobs-detail.page.container.jsx
@@ -10,6 +10,7 @@ import { GET_JOB_BY_PK, UPDATE_JOB } from "../../graphql/jobs.queries";
import {
addRecentItem,
setBreadcrumbs,
+ setJobReadOnly,
setSelectedHeader,
} from "../../redux/application/application.actions";
import { CreateRecentItem } from "../../utils/create-recent-item";
@@ -19,6 +20,7 @@ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
addRecentItem: (item) => dispatch(addRecentItem(item)),
setSelectedHeader: (key) => dispatch(setSelectedHeader(key)),
+ setJobReadOnly: (bool) => dispatch(setJobReadOnly(bool)),
});
function JobsDetailPageContainer({
@@ -26,6 +28,7 @@ function JobsDetailPageContainer({
setBreadcrumbs,
addRecentItem,
setSelectedHeader,
+ setJobReadOnly,
}) {
const { jobId } = match.params;
const { t } = useTranslation();
@@ -64,7 +67,9 @@ function JobsDetailPageContainer({
},
]);
- if (data && data.jobs_by_pk)
+ if (data && data.jobs_by_pk) {
+ setJobReadOnly(!!data.jobs_by_pk.date_exported);
+
addRecentItem(
CreateRecentItem(
jobId,
@@ -79,6 +84,7 @@ function JobsDetailPageContainer({
`/manage/jobs/${jobId}`
)
);
+ }
}, [
loading,
data,
@@ -88,6 +94,7 @@ function JobsDetailPageContainer({
jobId,
addRecentItem,
setSelectedHeader,
+ setJobReadOnly,
]);
if (loading) return ;
diff --git a/client/src/redux/application/application.actions.js b/client/src/redux/application/application.actions.js
index 5b3f3a788..b825f15e1 100644
--- a/client/src/redux/application/application.actions.js
+++ b/client/src/redux/application/application.actions.js
@@ -38,3 +38,13 @@ export const setSelectedHeader = (key) => ({
type: ApplicationActionTypes.SET_SELECTED_HEADER,
payload: key,
});
+
+export const setJobReadOnly = (bool) => ({
+ type: ApplicationActionTypes.SET_JOB_READONLY,
+ payload: bool,
+});
+
+export const setBillReadOnly = (bool) => ({
+ type: ApplicationActionTypes.SET_BILL_READONLY,
+ payload: bool,
+});
diff --git a/client/src/redux/application/application.reducer.js b/client/src/redux/application/application.reducer.js
index c87dd0842..af89b631b 100644
--- a/client/src/redux/application/application.reducer.js
+++ b/client/src/redux/application/application.reducer.js
@@ -10,6 +10,8 @@ const INITIAL_STATE = {
calculating: false,
error: null,
},
+ jobReadOnly: false,
+ billReadOnly: false,
};
const applicationReducer = (state = INITIAL_STATE, action) => {
@@ -63,6 +65,11 @@ const applicationReducer = (state = INITIAL_STATE, action) => {
loading: false,
};
+ case ApplicationActionTypes.SET_BILL_READONLY:
+ return { ...state, billReadOnly: action.payload };
+ case ApplicationActionTypes.SET_JOB_READONLY:
+ return { ...state, jobReadOnly: action.payload };
+
default:
return state;
}
diff --git a/client/src/redux/application/application.selectors.js b/client/src/redux/application/application.selectors.js
index b378b50a2..deb4e0abc 100644
--- a/client/src/redux/application/application.selectors.js
+++ b/client/src/redux/application/application.selectors.js
@@ -31,3 +31,13 @@ export const selectSelectedHeader = createSelector(
[selectApplication],
(application) => application.selectedHeader
);
+
+export const selectJobReadOnly = createSelector(
+ [selectApplication],
+ (application) => application.jobReadOnly
+);
+
+export const selectBillReadOnly = createSelector(
+ [selectApplication],
+ (application) => application.billReadOnly
+);
diff --git a/client/src/redux/application/application.types.js b/client/src/redux/application/application.types.js
index a606662cf..b2c3a9804 100644
--- a/client/src/redux/application/application.types.js
+++ b/client/src/redux/application/application.types.js
@@ -7,5 +7,7 @@ const ApplicationActionTypes = {
CALCULATE_SCHEDULE_LOAD_FAILURE: "CALCULATE_SCHEDULE_LOAD_FAILURE",
ADD_RECENT_ITEM: "ADD_RECENT_ITEM",
SET_SELECTED_HEADER: "SET_SELECTED_HEADER",
+ SET_JOB_READONLY: "SET_JOB_READONLY",
+ SET_BILL_READONLY: "SET_BILL_READONLY",
};
export default ApplicationActionTypes;
diff --git a/server/job/job-totals.js b/server/job/job-totals.js
index 9474239ba..f07a4593a 100644
--- a/server/job/job-totals.js
+++ b/server/job/job-totals.js
@@ -61,7 +61,7 @@ function CalculateTaxesTotals(job, otherTotals) {
const statePartsTax = job.joblines
.filter((jl) => !jl.removed)
.reduce((acc, val) => {
- if (!!!val.tax_part) return acc;
+ if (!!!val.tax_part || !!!val.part_type) return acc;
// if (!!job.parts_tax_rates[val.part_type]) {
// console.log("val.line_desc", val.line_desc);
@@ -273,7 +273,6 @@ function CalculatePartsTotals(jobLines) {
subtotal: acc.sublets.subtotal.add(
Dinero({ amount: Math.round(value.act_price * 100) })
),
- //TODO Add Adjustments in
},
};
@@ -306,7 +305,6 @@ function CalculatePartsTotals(jobLines) {
amount: Math.round(value.act_price * 100),
}).multiply(value.part_qty)
),
- //TODO Add Adjustments in
},
};
// default:
@@ -317,12 +315,10 @@ function CalculatePartsTotals(jobLines) {
parts: {
list: {},
subtotal: Dinero({ amount: 0 }),
- adjustments: Dinero({ amount: 0 }),
total: Dinero({ amount: 0 }),
},
sublets: {
subtotal: Dinero({ amount: 0 }),
- adjustments: Dinero({ amount: 0 }),
total: Dinero({ amount: 0 }),
},
}
@@ -331,11 +327,11 @@ function CalculatePartsTotals(jobLines) {
return {
parts: {
...ret.parts,
- total: ret.parts.subtotal, //+ ret.parts.adjustments
+ total: ret.parts.subtotal,
},
sublets: {
...ret.sublets,
- total: ret.sublets.subtotal, // + ret.sublets.adjustments,
+ total: ret.sublets.subtotal,
},
};
}