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, }, }; }