diff --git a/client/src/components/job-totals-table/job-totals-table.container.jsx b/client/src/components/job-totals-table/job-totals-table.container.jsx
deleted file mode 100644
index f4cf9f19f..000000000
--- a/client/src/components/job-totals-table/job-totals-table.container.jsx
+++ /dev/null
@@ -1,39 +0,0 @@
-import { useQuery } from "@apollo/react-hooks";
-import React, { useEffect, useState } from "react";
-import { QUERY_JOB_FINANCIALS } from "../../graphql/jobs.queries";
-import AlertComponent from "../alert/alert.component";
-import LoadingSpinner from "../loading-spinner/loading-spinner.component";
-import JobTotalsTableComponent from "./job-totals-table.component";
-import { CalculateJob } from "./job-totals.utility";
-
-import { connect } from "react-redux";
-import { createStructuredSelector } from "reselect";
-import { selectBodyshop } from "../../redux/user/user.selectors";
-const mapStateToProps = createStructuredSelector({
- bodyshop: selectBodyshop
-});
-
-export function JobTotalsTableContainer({ jobId, bodyshop }) {
- const { loading, error, data } = useQuery(QUERY_JOB_FINANCIALS, {
- variables: { jobId: jobId }
- });
-
- const [totals, setTotals] = useState(null);
-
- useEffect(() => {
- if (!!data) {
- setTotals(CalculateJob(data.jobs_by_pk, bodyshop.shoprates));
- }
- }, [data, setTotals, bodyshop.shoprates]);
-
- if (loading) return ;
- if (error) return ;
-
- return (
-
-
-
- );
-}
-
-export default connect(mapStateToProps, null)(JobTotalsTableContainer);
diff --git a/client/src/components/job-totals-table/job-totals.utility.js b/client/src/components/job-totals-table/job-totals.utility.js
index a3c327997..3b31eb11c 100644
--- a/client/src/components/job-totals-table/job-totals.utility.js
+++ b/client/src/components/job-totals-table/job-totals.utility.js
@@ -15,11 +15,10 @@ function CalculateTaxesTotals(job, otherTotals) {
otherTotals.parts.parts.subtotal +
otherTotals.parts.sublets.subtotal +
otherTotals.rates.subtotal +
- job.towing_payable +
- job.storage_payable; //Levies should be included??
+ (job.towing_payable || 0) +
+ (job.storage_payable || 0); //Levies should be included??
const statePartsTax = job.joblines.reduce((acc, val) => {
- console.log("val", val);
if (!!!val.tax_part) return acc;
if (!!job.parts_tax_rates[val.part_type]) {
return (
@@ -75,82 +74,82 @@ function CalculateRatesTotals(ratesList, shoprates) {
hours: jobLines
.filter((item) => item.mod_lbr_ty === "LA1")
.reduce((acc, value) => acc + value.mod_lb_hrs, 0),
- rate: ratesList.rate_la1,
+ rate: ratesList.rate_la1 || 0,
},
rate_la2: {
hours: jobLines
.filter((item) => item.mod_lbr_ty === "LA2")
.reduce((acc, value) => acc + value.mod_lb_hrs, 0),
- rate: ratesList.rate_la2,
+ rate: ratesList.rate_la2 || 0,
},
rate_la3: {
- rate: ratesList.rate_la3,
+ rate: ratesList.rate_la3 || 0,
hours: jobLines
.filter((item) => item.mod_lbr_ty === "LA3")
.reduce((acc, value) => acc + value.mod_lb_hrs, 0),
},
rate_la4: {
- rate: ratesList.rate_la4,
+ rate: ratesList.rate_la4 || 0,
hours: jobLines
.filter((item) => item.mod_lbr_ty === "LA4")
.reduce((acc, value) => acc + value.mod_lb_hrs, 0),
},
rate_laa: {
- rate: ratesList.rate_laa,
+ rate: ratesList.rate_laa || 0,
hours: jobLines
.filter((item) => item.mod_lbr_ty === "LAA")
.reduce((acc, value) => acc + value.mod_lb_hrs, 0),
},
rate_lab: {
- rate: ratesList.rate_lab,
+ rate: ratesList.rate_lab || 0,
hours: jobLines
.filter((item) => item.mod_lbr_ty === "LAB")
.reduce((acc, value) => acc + value.mod_lb_hrs, 0),
},
rate_lad: {
- rate: ratesList.rate_lad,
+ rate: ratesList.rate_lad || 0,
hours: jobLines
.filter((item) => item.mod_lbr_ty === "LAD")
.reduce((acc, value) => acc + value.mod_lb_hrs, 0),
},
rate_lae: {
- rate: ratesList.rate_lae,
+ rate: ratesList.rate_lae || 0,
hours: jobLines
.filter((item) => item.mod_lbr_ty === "LAE")
.reduce((acc, value) => acc + value.mod_lb_hrs, 0),
},
rate_laf: {
- rate: ratesList.rate_laf,
+ rate: ratesList.rate_laf || 0,
hours: jobLines
.filter((item) => item.mod_lbr_ty === "LAF")
.reduce((acc, value) => acc + value.mod_lb_hrs, 0),
},
rate_lag: {
- rate: ratesList.rate_lag,
+ rate: ratesList.rate_lag || 0,
hours: jobLines
.filter((item) => item.mod_lbr_ty === "LAG")
.reduce((acc, value) => acc + value.mod_lb_hrs, 0),
},
rate_lam: {
- rate: ratesList.rate_lam,
+ rate: ratesList.rate_lam || 0,
hours: jobLines
.filter((item) => item.mod_lbr_ty === "LAM")
.reduce((acc, value) => acc + value.mod_lb_hrs, 0),
},
rate_lar: {
- rate: ratesList.rate_lar,
+ rate: ratesList.rate_lar || 0,
hours: jobLines
.filter((item) => item.mod_lbr_ty === "LAR")
.reduce((acc, value) => acc + value.mod_lb_hrs, 0),
},
rate_las: {
- rate: ratesList.rate_las,
+ rate: ratesList.rate_las || 0,
hours: jobLines
.filter((item) => item.mod_lbr_ty === "LAS")
.reduce((acc, value) => acc + value.mod_lb_hrs, 0),
},
rate_lau: {
- rate: ratesList.rate_lau,
+ rate: ratesList.rate_lau || 0,
hours: jobLines
.filter((item) => item.mod_lbr_ty === "LAU")
.reduce((acc, value) => acc + value.mod_lb_hrs, 0),
@@ -176,13 +175,13 @@ function CalculateRatesTotals(ratesList, shoprates) {
: 0,
},
paint_mat: {
- rate: ratesList.rate_mapa,
+ rate: ratesList.rate_mapa || 0,
hours: jobLines
.filter((item) => item.mod_lbr_ty === "LAR")
.reduce((acc, value) => acc + value.mod_lb_hrs, 0),
},
shop_mat: {
- rate: ratesList.rate_mash,
+ rate: ratesList.rate_mash || 0,
hours: jobLines
.filter((item) => item.mod_lbr_ty !== "LAR")
.reduce((acc, value) => acc + value.mod_lb_hrs, 0),
diff --git a/client/src/components/jobs-available-new/jobs-available-new.container.jsx b/client/src/components/jobs-available-new/jobs-available-new.container.jsx
index ba4e5cfbc..645013d71 100644
--- a/client/src/components/jobs-available-new/jobs-available-new.container.jsx
+++ b/client/src/components/jobs-available-new/jobs-available-new.container.jsx
@@ -1,23 +1,35 @@
+import { useMutation, useQuery } from "@apollo/react-hooks";
import { notification } from "antd";
import React, { useState } from "react";
-import { useMutation, useQuery } from "@apollo/react-hooks";
import { useTranslation } from "react-i18next";
-import { withRouter } from "react-router-dom";
-import { DELETE_ALL_AVAILABLE_NEW_JOBS, QUERY_AVAILABLE_NEW_JOBS } from "../../graphql/available-jobs.queries";
+import { connect } from "react-redux";
+import { useHistory } from "react-router-dom";
+import { createStructuredSelector } from "reselect";
+import { CalculateJob } from "../../components/job-totals-table/job-totals.utility";
+import {
+ DELETE_ALL_AVAILABLE_NEW_JOBS,
+ QUERY_AVAILABLE_NEW_JOBS,
+} from "../../graphql/available-jobs.queries";
import { INSERT_NEW_JOB } from "../../graphql/jobs.queries";
+import { selectBodyshop } from "../../redux/user/user.selectors";
import AlertComponent from "../alert/alert.component";
import LoadingSpinner from "../loading-spinner/loading-spinner.component";
import JobsAvailableComponent from "./jobs-available-new.component";
-export default withRouter(function JobsAvailableContainer({
+const mapStateToProps = createStructuredSelector({
+ bodyshop: selectBodyshop,
+});
+
+export function JobsAvailableContainer({
deleteJob,
estDataLazyLoad,
- history
+ bodyshop,
}) {
const { loading, error, data, refetch } = useQuery(QUERY_AVAILABLE_NEW_JOBS, {
- fetchPolicy: "network-only"
+ fetchPolicy: "network-only",
});
+ const history = useHistory();
const { t } = useTranslation();
const [modalVisible, setModalVisible] = useState(false);
@@ -41,22 +53,38 @@ export default withRouter(function JobsAvailableContainer({
//We don't have the right data. Error!
setInsertLoading(false);
notification["error"]({
- message: t("jobs.errors.creating", { error: "No job data present." })
+ message: t("jobs.errors.creating", { error: "No job data present." }),
});
} else {
+ const newTotals = CalculateJob(
+ {
+ ...estData.data.available_jobs_by_pk.est_data,
+ joblines: estData.data.available_jobs_by_pk.est_data.joblines.data,
+ },
+ bodyshop.shoprates
+ );
+
+ const newJob = {
+ ...estData.data.available_jobs_by_pk.est_data,
+ clm_total: newTotals.totals.total_repairs,
+ owner_owing: newTotals.custPayable.total,
+ job_totals: newTotals,
+ };
+
+ console.log("newTotals", newTotals);
insertNewJob({
variables: {
job: selectedOwner
? Object.assign(
{},
- estData.data.available_jobs_by_pk.est_data,
+ newJob,
{ owner: null },
{ ownerid: selectedOwner }
)
- : estData.data.available_jobs_by_pk.est_data
- }
+ : newJob,
+ },
})
- .then(r => {
+ .then((r) => {
notification["success"]({
message: t("jobs.successes.created"),
onClick: () => {
@@ -64,20 +92,21 @@ export default withRouter(function JobsAvailableContainer({
history.push(
`/manage/jobs/${r.data.insert_jobs.returning[0].id}`
);
- }
+ },
});
//Job has been inserted. Clean up the available jobs record.
+
deleteJob({
- variables: { id: estData.data.available_jobs_by_pk.id }
- }).then(r => {
+ variables: { id: estData.data.available_jobs_by_pk.id },
+ }).then((r) => {
refetch();
setInsertLoading(false);
});
})
- .catch(r => {
+ .catch((r) => {
//error while inserting
notification["error"]({
- message: t("jobs.errors.creating", { error: r.message })
+ message: t("jobs.errors.creating", { error: r.message }),
});
refetch();
setInsertLoading(false);
@@ -115,4 +144,5 @@ export default withRouter(function JobsAvailableContainer({
/>
);
-});
+}
+export default connect(mapStateToProps, null)(JobsAvailableContainer);
diff --git a/client/src/components/jobs-available-supplement/jobs-available-supplement.container.jsx b/client/src/components/jobs-available-supplement/jobs-available-supplement.container.jsx
index b771a76f5..a341f920f 100644
--- a/client/src/components/jobs-available-supplement/jobs-available-supplement.container.jsx
+++ b/client/src/components/jobs-available-supplement/jobs-available-supplement.container.jsx
@@ -1,31 +1,36 @@
+import { useMutation, useQuery } from "@apollo/react-hooks";
import { notification } from "antd";
import React, { useState } from "react";
-import { useMutation, useQuery } from "@apollo/react-hooks";
import { useTranslation } from "react-i18next";
-import { withRouter } from "react-router-dom";
-import {
- DELETE_ALL_AVAILABLE_SUPPLEMENT_JOBS,
- QUERY_AVAILABLE_SUPPLEMENT_JOBS
-} from "../../graphql/available-jobs.queries";
+import { connect } from "react-redux";
+import { useHistory } from "react-router-dom";
+import { createStructuredSelector } from "reselect";
+import { CalculateJob } from "../../components/job-totals-table/job-totals.utility";
+import { DELETE_ALL_AVAILABLE_SUPPLEMENT_JOBS, QUERY_AVAILABLE_SUPPLEMENT_JOBS } from "../../graphql/available-jobs.queries";
import { UPDATE_JOB } from "../../graphql/jobs.queries";
+import { selectBodyshop } from "../../redux/user/user.selectors";
import AlertComponent from "../alert/alert.component";
import LoadingSpinner from "../loading-spinner/loading-spinner.component";
import JobsAvailableSupplementComponent from "./jobs-available-supplement.component";
import HeaderFields from "./jobs-available-supplement.headerfields";
-export default withRouter(function JobsAvailableSupplementContainer({
+const mapStateToProps = createStructuredSelector({
+ bodyshop: selectBodyshop,
+});
+
+export function JobsAvailableSupplementContainer({
deleteJob,
estDataLazyLoad,
- history
+ bodyshop,
}) {
const { loading, error, data, refetch } = useQuery(
QUERY_AVAILABLE_SUPPLEMENT_JOBS,
{
- fetchPolicy: "network-only"
+ fetchPolicy: "network-only",
}
);
const { t } = useTranslation();
-
+ const history = useHistory();
const [deleteAllNewJobs] = useMutation(DELETE_ALL_AVAILABLE_SUPPLEMENT_JOBS);
const [modalVisible, setModalVisible] = useState(false);
@@ -49,48 +54,63 @@ export default withRouter(function JobsAvailableSupplementContainer({
//We don't have the right data. Error!
setInsertLoading(false);
notification["error"]({
- message: t("jobs.errors.creating", { error: "No job data present." })
+ message: t("jobs.errors.creating", { error: "No job data present." }),
});
} else {
//create upsert job
let supp = estData.data.available_jobs_by_pk.est_data;
console.log("supp before", supp);
- delete supp.joblines;
+
//TODO How to update the estimate lines.
delete supp.owner;
delete supp.vehicle;
if (importOptions.overrideHeaders) {
- HeaderFields.forEach(item => delete supp[item]);
+ HeaderFields.forEach((item) => delete supp[item]);
}
+ const newTotals = CalculateJob(
+ {
+ ...estData.data.available_jobs_by_pk.est_data,
+ joblines: estData.data.available_jobs_by_pk.est_data.joblines.data,
+ },
+ bodyshop.shoprates
+ );
+
+ console.log('newTotals', newTotals)
+ delete supp.joblines;
updateJob({
variables: {
jobId: selectedJob,
- job: supp
- }
+ job: {
+ ...supp,
+ clm_total: newTotals.totals.total_repairs,
+ owner_owing: newTotals.custPayable.total,
+ job_totals: newTotals,
+ },
+ },
})
- .then(r => {
+ .then((r) => {
notification["success"]({
message: t("jobs.successes.supplemented"),
onClick: () => {
history.push(
`/manage/jobs/${r.data.update_jobs.returning[0].id}`
);
- }
+ },
});
//Job has been inserted. Clean up the available jobs record.
deleteJob({
- variables: { id: estData.data.available_jobs_by_pk.id }
- }).then(r => {
+ variables: { id: estData.data.available_jobs_by_pk.id },
+ }).then((r) => {
refetch();
setInsertLoading(false);
});
})
- .catch(r => {
+ .catch((r) => {
//error while inserting
notification["error"]({
- message: t("jobs.errors.creating", { error: r.message })
+ message: t("jobs.errors.creating", { error: r.message }),
});
refetch();
setInsertLoading(false);
@@ -128,4 +148,5 @@ export default withRouter(function JobsAvailableSupplementContainer({
/>
);
-});
+}
+export default connect(mapStateToProps, null)(JobsAvailableSupplementContainer);
diff --git a/client/src/components/jobs-detail-financial/jobs-detail-financial.component.jsx b/client/src/components/jobs-detail-financial/jobs-detail-financial.component.jsx
index 13b27d957..8b5a820cd 100644
--- a/client/src/components/jobs-detail-financial/jobs-detail-financial.component.jsx
+++ b/client/src/components/jobs-detail-financial/jobs-detail-financial.component.jsx
@@ -1,7 +1,7 @@
import { Divider, Form, Input, InputNumber, Row, Col } from "antd";
import React from "react";
import { useTranslation } from "react-i18next";
-import JobTotalsTableContainer from "../job-totals-table/job-totals-table.container";
+import JobTotalsTable from "../job-totals-table/job-totals-table.component";
export default function JobsDetailFinancials({ job }) {
const { t } = useTranslation();
@@ -9,123 +9,130 @@ export default function JobsDetailFinancials({ job }) {
return (
-
+
-
+
+ name="depreciation_taxes"
+ >
TODO This is equivalent of GST payable.
+ name="federal_tax_payable"
+ >
TODO equivalent of other customer amount
+ name="other_amount_payable"
+ >
+ name="towing_payable"
+ >
+ name="storage_payable"
+ >
+ name="adjustment_bottom_line"
+ >
+ name="labor_rate_desc"
+ >
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
Note //TODO Remove ATP rate?
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
);
diff --git a/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx b/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx
index d84de214a..0678c2622 100644
--- a/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx
+++ b/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx
@@ -9,7 +9,7 @@ import {
Menu,
notification,
PageHeader,
- Tag
+ Tag,
} from "antd";
import React from "react";
import { useTranslation } from "react-i18next";
@@ -26,11 +26,11 @@ import VehicleTagPopoverComponent from "../vehicle-tag-popover/vehicle-tag-popov
import JobsDetailHeaderActions from "../jobs-detail-header-actions/jobs-detail-header-actions.component";
import { setModalContext } from "../../redux/modals/modals.actions";
const mapStateToProps = createStructuredSelector({
- bodyshop: selectBodyshop
+ bodyshop: selectBodyshop,
});
-const mapDispatchToProps = dispatch => ({
- setScheduleContext: context =>
- dispatch(setModalContext({ context: context, modal: "schedule" }))
+const mapDispatchToProps = (dispatch) => ({
+ setScheduleContext: (context) =>
+ dispatch(setModalContext({ context: context, modal: "schedule" })),
});
export function JobsDetailHeader({
@@ -40,7 +40,7 @@ export function JobsDetailHeader({
bodyshop,
updateJobStatus,
- setScheduleContext
+ setScheduleContext,
}) {
const { t } = useTranslation();
@@ -55,11 +55,11 @@ export function JobsDetailHeader({
const statusmenu = (
@@ -78,8 +78,8 @@ export function JobsDetailHeader({
setScheduleContext({
actions: { refetch: refetch },
context: {
- jobId: job.id
- }
+ jobId: job.id,
+ },
});
}}
>
@@ -92,12 +92,12 @@ export function JobsDetailHeader({
disabled={job.converted}
onClick={() => {
mutationConvertJob({
- variables: { jobId: job.id }
- }).then(r => {
+ variables: { jobId: job.id },
+ }).then((r) => {
refetch();
notification["success"]({
- message: t("jobs.successes.converted")
+ message: t("jobs.successes.converted"),
});
});
}}
@@ -107,13 +107,13 @@ export function JobsDetailHeader({
,
+ ,
];
return (
- ##NO BINDING YET##
+ {job.owner_owing}
{job.cccontracts &&
- job.cccontracts.map(item => (
+ job.cccontracts.map((item) => (
{
- return record.owner_owing ? (
- {record.owner_owing}
- ) : (
- t("general.labels.unknown")
- );
- },
+ render: (text, record) => (
+ {record.owner_owing}
+ ),
},
];
diff --git a/client/src/firebase/firebase.utils.js b/client/src/firebase/firebase.utils.js
index 3d07894bc..4b1cea785 100644
--- a/client/src/firebase/firebase.utils.js
+++ b/client/src/firebase/firebase.utils.js
@@ -4,7 +4,6 @@ import "firebase/auth";
import "firebase/database";
import "firebase/analytics";
-console.log("REACT_APP_FIREBASE_CONFIG", process.env.REACT_APP_FIREBASE_CONFIG);
const config = JSON.parse(process.env.REACT_APP_FIREBASE_CONFIG);
firebase.initializeApp(config);
diff --git a/client/src/graphql/jobs.queries.js b/client/src/graphql/jobs.queries.js
index 5c98851e9..4e6484020 100644
--- a/client/src/graphql/jobs.queries.js
+++ b/client/src/graphql/jobs.queries.js
@@ -149,6 +149,17 @@ export const GET_JOB_BY_PK = gql`
towing_payable
storage_payable
adjustment_bottom_line
+ federal_tax_rate
+ state_tax_rate
+ local_tax_rate
+ tax_tow_rt
+ tax_str_rt
+ tax_paint_mat_rt
+ tax_sub_rt
+ tax_lbr_rt
+ tax_levies_rt
+ parts_tax_rates
+ job_totals
ownr_fn
ownr_ln
ownr_ea
@@ -173,28 +184,29 @@ export const GET_JOB_BY_PK = gql`
ownr_ph1
}
labor_rate_desc
- rate_lab
- rate_lad
- rate_lae
- rate_lar
- rate_las
- rate_laf
- rate_lam
- rate_lag
rate_atp
- rate_lau
rate_la1
rate_la2
rate_la3
rate_la4
- rate_mapa
- rate_mash
- rate_mahw
+ rate_laa
+ rate_lab
+ rate_lad
+ rate_lae
+ rate_laf
+ rate_lag
+ rate_lam
+ rate_lar
+ rate_las
+ rate_lau
rate_ma2s
+ rate_ma2t
rate_ma3s
rate_mabl
rate_macs
- rate_laa
+ rate_mahw
+ rate_mapa
+ rate_mash
rate_matd
actual_in
scheduled_completion
@@ -209,11 +221,15 @@ export const GET_JOB_BY_PK = gql`
date_closed
date_exported
status
+ owner_owing
joblines {
id
unq_seq
line_ind
+ tax_part
line_desc
+ prt_dsmk_p
+ prt_dsmk_m
part_type
oem_partno
db_price
@@ -385,66 +401,3 @@ export const ACTIVE_JOBS_FOR_AUTOCOMPLETE = gql`
}
}
`;
-
-export const QUERY_JOB_FINANCIALS = gql`
- query QUERY_JOB_FINANCIALS($jobId: uuid!) {
- jobs_by_pk(id: $jobId) {
- id
- cieca_ttl
- cieca_stl
- ded_amt
- depreciation_taxes
- federal_tax_payable
- other_amount_payable
- adjustment_bottom_line
- towing_payable
- storage_payable
- federal_tax_rate
- state_tax_rate
- local_tax_rate
- tax_tow_rt
- tax_str_rt
- tax_paint_mat_rt
- tax_sub_rt
- tax_lbr_rt
- tax_levies_rt
- parts_tax_rates
- rate_atp
- rate_la1
- rate_la2
- rate_la3
- rate_la4
- rate_laa
- rate_lab
- rate_lad
- rate_lae
- rate_laf
- rate_lag
- rate_lam
- rate_lar
- rate_las
- rate_lau
- rate_ma2s
- rate_ma2t
- rate_ma3s
- rate_mabl
- rate_macs
- rate_mahw
- rate_mapa
- rate_mash
- rate_matd
- joblines {
- id
- line_desc
- tax_part
- prt_dsmk_p
- prt_dsmk_m
- mod_lbr_ty
- act_price
- mod_lb_hrs
- part_type
- part_qty
- }
- }
- }
-`;
diff --git a/client/src/pages/jobs-detail/jobs-detail.page.component.jsx b/client/src/pages/jobs-detail/jobs-detail.page.component.jsx
index aa8ebb72a..a25b9ab1b 100644
--- a/client/src/pages/jobs-detail/jobs-detail.page.component.jsx
+++ b/client/src/pages/jobs-detail/jobs-detail.page.component.jsx
@@ -19,6 +19,11 @@ import {
import { useHistory, useLocation } from "react-router-dom";
import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component";
import queryString from "query-string";
+import { connect } from "react-redux";
+import { createStructuredSelector } from "reselect";
+import { selectBodyshop } from "../../redux/user/user.selectors";
+import { CalculateJob } from "../../components/job-totals-table/job-totals.utility";
+
const JobsLinesContainer = lazy(() =>
import("../../components/job-detail-lines/job-lines.container")
);
@@ -65,13 +70,18 @@ const JobsDetailAuditContainer = lazy(() =>
import("../../components/audit-trail-list/audit-trail-list.container")
);
-export default function JobsDetailPage({
+const mapStateToProps = createStructuredSelector({
+ bodyshop: selectBodyshop,
+});
+
+export function JobsDetailPage({
job,
mutationUpdateJob,
mutationConvertJob,
handleSubmit,
refetch,
updateJobStatus,
+ bodyshop,
}) {
const { t } = useTranslation();
const [form] = Form.useForm();
@@ -90,8 +100,17 @@ export default function JobsDetailPage({
};
const handleFinish = (values) => {
+ const newTotals = CalculateJob({ ...job, ...values }, bodyshop.shoprates);
mutationUpdateJob({
- variables: { jobId: job.id, job: values },
+ variables: {
+ jobId: job.id,
+ job: {
+ ...values,
+ clm_total: newTotals.totals.total_repairs,
+ owner_owing: newTotals.custPayable.total,
+ job_totals: newTotals,
+ },
+ },
}).then((r) => {
notification["success"]({
message: t("jobs.successes.savetitle"),
@@ -270,3 +289,4 @@ export default function JobsDetailPage({
);
}
+export default connect(mapStateToProps, null)(JobsDetailPage);
diff --git a/hasura/migrations/1586879989913_alter_table_public_jobs_add_column_job_totals/down.yaml b/hasura/migrations/1586879989913_alter_table_public_jobs_add_column_job_totals/down.yaml
new file mode 100644
index 000000000..371308f87
--- /dev/null
+++ b/hasura/migrations/1586879989913_alter_table_public_jobs_add_column_job_totals/down.yaml
@@ -0,0 +1,5 @@
+- args:
+ cascade: false
+ read_only: false
+ sql: ALTER TABLE "public"."jobs" DROP COLUMN "job_totals";
+ type: run_sql
diff --git a/hasura/migrations/1586879989913_alter_table_public_jobs_add_column_job_totals/up.yaml b/hasura/migrations/1586879989913_alter_table_public_jobs_add_column_job_totals/up.yaml
new file mode 100644
index 000000000..2c1b18561
--- /dev/null
+++ b/hasura/migrations/1586879989913_alter_table_public_jobs_add_column_job_totals/up.yaml
@@ -0,0 +1,5 @@
+- args:
+ cascade: false
+ read_only: false
+ sql: ALTER TABLE "public"."jobs" ADD COLUMN "job_totals" jsonb NULL;
+ type: run_sql
diff --git a/hasura/migrations/1586880003979_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1586880003979_update_permission_user_public_table_jobs/down.yaml
new file mode 100644
index 000000000..43bf2e0ab
--- /dev/null
+++ b/hasura/migrations/1586880003979_update_permission_user_public_table_jobs/down.yaml
@@ -0,0 +1,253 @@
+- args:
+ role: user
+ table:
+ name: jobs
+ schema: public
+ type: drop_insert_permission
+- args:
+ permission:
+ check:
+ bodyshop:
+ associations:
+ _and:
+ - user:
+ authid:
+ _eq: X-Hasura-User-Id
+ - active:
+ _eq: true
+ columns:
+ - actual_completion
+ - actual_delivery
+ - actual_in
+ - adj_g_disc
+ - adj_strdis
+ - adj_towdis
+ - adjustment_bottom_line
+ - agt_addr1
+ - agt_addr2
+ - agt_city
+ - agt_co_id
+ - agt_co_nm
+ - agt_ct_fn
+ - agt_ct_ln
+ - agt_ct_ph
+ - agt_ct_phx
+ - agt_ctry
+ - agt_ea
+ - agt_fax
+ - agt_faxx
+ - agt_lic_no
+ - agt_ph1
+ - agt_ph1x
+ - agt_ph2
+ - agt_ph2x
+ - agt_st
+ - agt_zip
+ - area_of_damage
+ - asgn_date
+ - asgn_no
+ - asgn_type
+ - cat_no
+ - cieca_stl
+ - cieca_ttl
+ - ciecaid
+ - clm_addr1
+ - clm_addr2
+ - clm_city
+ - clm_ct_fn
+ - clm_ct_ln
+ - clm_ct_ph
+ - clm_ct_phx
+ - clm_ctry
+ - clm_ea
+ - clm_fax
+ - clm_faxx
+ - clm_no
+ - clm_ofc_id
+ - clm_ofc_nm
+ - clm_ph1
+ - clm_ph1x
+ - clm_ph2
+ - clm_ph2x
+ - clm_st
+ - clm_title
+ - clm_total
+ - clm_zip
+ - converted
+ - created_at
+ - csr
+ - cust_pr
+ - date_closed
+ - date_estimated
+ - date_exported
+ - date_invoiced
+ - date_open
+ - date_scheduled
+ - ded_amt
+ - ded_status
+ - depreciation_taxes
+ - est_addr1
+ - est_addr2
+ - est_city
+ - est_co_nm
+ - est_ct_fn
+ - est_ct_ln
+ - est_ctry
+ - est_ea
+ - est_number
+ - est_ph1
+ - est_st
+ - est_zip
+ - federal_tax_payable
+ - federal_tax_rate
+ - g_bett_amt
+ - id
+ - inproduction
+ - ins_addr1
+ - ins_addr2
+ - ins_city
+ - ins_co_id
+ - ins_co_nm
+ - ins_ct_fn
+ - ins_ct_ln
+ - ins_ct_ph
+ - ins_ct_phx
+ - ins_ctry
+ - ins_ea
+ - ins_fax
+ - ins_faxx
+ - ins_memo
+ - ins_ph1
+ - ins_ph1x
+ - ins_ph2
+ - ins_ph2x
+ - ins_st
+ - ins_title
+ - ins_zip
+ - insd_addr1
+ - insd_addr2
+ - insd_city
+ - insd_co_nm
+ - insd_ctry
+ - insd_ea
+ - insd_fax
+ - insd_faxx
+ - insd_fn
+ - insd_ln
+ - insd_ph1
+ - insd_ph1x
+ - insd_ph2
+ - insd_ph2x
+ - insd_st
+ - insd_title
+ - insd_zip
+ - invoice_date
+ - kmin
+ - kmout
+ - labor_rate_desc
+ - labor_rate_id
+ - local_tax_rate
+ - loss_cat
+ - loss_date
+ - loss_desc
+ - loss_type
+ - other_amount_payable
+ - owner_owing
+ - ownerid
+ - ownr_addr1
+ - ownr_addr2
+ - ownr_city
+ - ownr_co_nm
+ - ownr_ctry
+ - ownr_ea
+ - ownr_fax
+ - ownr_faxx
+ - ownr_fn
+ - ownr_ln
+ - ownr_ph1
+ - ownr_ph1x
+ - ownr_ph2
+ - ownr_ph2x
+ - ownr_st
+ - ownr_title
+ - ownr_zip
+ - parts_tax_rates
+ - pay_amt
+ - pay_chknm
+ - pay_date
+ - pay_type
+ - payee_nms
+ - plate_no
+ - plate_st
+ - po_number
+ - policy_no
+ - rate_atp
+ - rate_la1
+ - rate_la2
+ - rate_la3
+ - rate_la4
+ - rate_laa
+ - rate_lab
+ - rate_lad
+ - rate_lae
+ - rate_laf
+ - rate_lag
+ - rate_lam
+ - rate_lar
+ - rate_las
+ - rate_lau
+ - rate_ma2s
+ - rate_ma2t
+ - rate_ma3s
+ - rate_mabl
+ - rate_macs
+ - rate_mahw
+ - rate_mapa
+ - rate_mash
+ - rate_matd
+ - referral_source
+ - regie_number
+ - ro_number
+ - scheduled_completion
+ - scheduled_delivery
+ - scheduled_in
+ - selling_dealer
+ - selling_dealer_contact
+ - servicing_dealer
+ - servicing_dealer_contact
+ - shopid
+ - special_coverage_policy
+ - state_tax_rate
+ - status
+ - statusid
+ - storage_payable
+ - tax_lbr_rt
+ - tax_levies_rt
+ - tax_paint_mat_rt
+ - tax_predis
+ - tax_prethr
+ - tax_pstthr
+ - tax_str_rt
+ - tax_sub_rt
+ - tax_thramt
+ - tax_tow_rt
+ - theft_ind
+ - tlos_ind
+ - towing_payable
+ - unit_number
+ - updated_at
+ - v_color
+ - v_make_desc
+ - v_model_desc
+ - v_model_yr
+ - v_vin
+ - vehicleid
+ localPresets:
+ - key: ""
+ value: ""
+ set: {}
+ role: user
+ table:
+ name: jobs
+ schema: public
+ type: create_insert_permission
diff --git a/hasura/migrations/1586880003979_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1586880003979_update_permission_user_public_table_jobs/up.yaml
new file mode 100644
index 000000000..785d7b5d3
--- /dev/null
+++ b/hasura/migrations/1586880003979_update_permission_user_public_table_jobs/up.yaml
@@ -0,0 +1,254 @@
+- args:
+ role: user
+ table:
+ name: jobs
+ schema: public
+ type: drop_insert_permission
+- args:
+ permission:
+ check:
+ bodyshop:
+ associations:
+ _and:
+ - user:
+ authid:
+ _eq: X-Hasura-User-Id
+ - active:
+ _eq: true
+ columns:
+ - actual_completion
+ - actual_delivery
+ - actual_in
+ - adj_g_disc
+ - adj_strdis
+ - adj_towdis
+ - adjustment_bottom_line
+ - agt_addr1
+ - agt_addr2
+ - agt_city
+ - agt_co_id
+ - agt_co_nm
+ - agt_ct_fn
+ - agt_ct_ln
+ - agt_ct_ph
+ - agt_ct_phx
+ - agt_ctry
+ - agt_ea
+ - agt_fax
+ - agt_faxx
+ - agt_lic_no
+ - agt_ph1
+ - agt_ph1x
+ - agt_ph2
+ - agt_ph2x
+ - agt_st
+ - agt_zip
+ - area_of_damage
+ - asgn_date
+ - asgn_no
+ - asgn_type
+ - cat_no
+ - cieca_stl
+ - cieca_ttl
+ - ciecaid
+ - clm_addr1
+ - clm_addr2
+ - clm_city
+ - clm_ct_fn
+ - clm_ct_ln
+ - clm_ct_ph
+ - clm_ct_phx
+ - clm_ctry
+ - clm_ea
+ - clm_fax
+ - clm_faxx
+ - clm_no
+ - clm_ofc_id
+ - clm_ofc_nm
+ - clm_ph1
+ - clm_ph1x
+ - clm_ph2
+ - clm_ph2x
+ - clm_st
+ - clm_title
+ - clm_total
+ - clm_zip
+ - converted
+ - created_at
+ - csr
+ - cust_pr
+ - date_closed
+ - date_estimated
+ - date_exported
+ - date_invoiced
+ - date_open
+ - date_scheduled
+ - ded_amt
+ - ded_status
+ - depreciation_taxes
+ - est_addr1
+ - est_addr2
+ - est_city
+ - est_co_nm
+ - est_ct_fn
+ - est_ct_ln
+ - est_ctry
+ - est_ea
+ - est_number
+ - est_ph1
+ - est_st
+ - est_zip
+ - federal_tax_payable
+ - federal_tax_rate
+ - g_bett_amt
+ - id
+ - inproduction
+ - ins_addr1
+ - ins_addr2
+ - ins_city
+ - ins_co_id
+ - ins_co_nm
+ - ins_ct_fn
+ - ins_ct_ln
+ - ins_ct_ph
+ - ins_ct_phx
+ - ins_ctry
+ - ins_ea
+ - ins_fax
+ - ins_faxx
+ - ins_memo
+ - ins_ph1
+ - ins_ph1x
+ - ins_ph2
+ - ins_ph2x
+ - ins_st
+ - ins_title
+ - ins_zip
+ - insd_addr1
+ - insd_addr2
+ - insd_city
+ - insd_co_nm
+ - insd_ctry
+ - insd_ea
+ - insd_fax
+ - insd_faxx
+ - insd_fn
+ - insd_ln
+ - insd_ph1
+ - insd_ph1x
+ - insd_ph2
+ - insd_ph2x
+ - insd_st
+ - insd_title
+ - insd_zip
+ - invoice_date
+ - job_totals
+ - kmin
+ - kmout
+ - labor_rate_desc
+ - labor_rate_id
+ - local_tax_rate
+ - loss_cat
+ - loss_date
+ - loss_desc
+ - loss_type
+ - other_amount_payable
+ - owner_owing
+ - ownerid
+ - ownr_addr1
+ - ownr_addr2
+ - ownr_city
+ - ownr_co_nm
+ - ownr_ctry
+ - ownr_ea
+ - ownr_fax
+ - ownr_faxx
+ - ownr_fn
+ - ownr_ln
+ - ownr_ph1
+ - ownr_ph1x
+ - ownr_ph2
+ - ownr_ph2x
+ - ownr_st
+ - ownr_title
+ - ownr_zip
+ - parts_tax_rates
+ - pay_amt
+ - pay_chknm
+ - pay_date
+ - pay_type
+ - payee_nms
+ - plate_no
+ - plate_st
+ - po_number
+ - policy_no
+ - rate_atp
+ - rate_la1
+ - rate_la2
+ - rate_la3
+ - rate_la4
+ - rate_laa
+ - rate_lab
+ - rate_lad
+ - rate_lae
+ - rate_laf
+ - rate_lag
+ - rate_lam
+ - rate_lar
+ - rate_las
+ - rate_lau
+ - rate_ma2s
+ - rate_ma2t
+ - rate_ma3s
+ - rate_mabl
+ - rate_macs
+ - rate_mahw
+ - rate_mapa
+ - rate_mash
+ - rate_matd
+ - referral_source
+ - regie_number
+ - ro_number
+ - scheduled_completion
+ - scheduled_delivery
+ - scheduled_in
+ - selling_dealer
+ - selling_dealer_contact
+ - servicing_dealer
+ - servicing_dealer_contact
+ - shopid
+ - special_coverage_policy
+ - state_tax_rate
+ - status
+ - statusid
+ - storage_payable
+ - tax_lbr_rt
+ - tax_levies_rt
+ - tax_paint_mat_rt
+ - tax_predis
+ - tax_prethr
+ - tax_pstthr
+ - tax_str_rt
+ - tax_sub_rt
+ - tax_thramt
+ - tax_tow_rt
+ - theft_ind
+ - tlos_ind
+ - towing_payable
+ - unit_number
+ - updated_at
+ - v_color
+ - v_make_desc
+ - v_model_desc
+ - v_model_yr
+ - v_vin
+ - vehicleid
+ localPresets:
+ - key: ""
+ value: ""
+ set: {}
+ role: user
+ table:
+ name: jobs
+ schema: public
+ type: create_insert_permission
diff --git a/hasura/migrations/1586880014259_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1586880014259_update_permission_user_public_table_jobs/down.yaml
new file mode 100644
index 000000000..1f52ac4cf
--- /dev/null
+++ b/hasura/migrations/1586880014259_update_permission_user_public_table_jobs/down.yaml
@@ -0,0 +1,251 @@
+- args:
+ role: user
+ table:
+ name: jobs
+ schema: public
+ type: drop_select_permission
+- args:
+ permission:
+ allow_aggregations: false
+ columns:
+ - actual_completion
+ - actual_delivery
+ - actual_in
+ - adj_g_disc
+ - adj_strdis
+ - adj_towdis
+ - adjustment_bottom_line
+ - agt_addr1
+ - agt_addr2
+ - agt_city
+ - agt_co_id
+ - agt_co_nm
+ - agt_ct_fn
+ - agt_ct_ln
+ - agt_ct_ph
+ - agt_ct_phx
+ - agt_ctry
+ - agt_ea
+ - agt_fax
+ - agt_faxx
+ - agt_lic_no
+ - agt_ph1
+ - agt_ph1x
+ - agt_ph2
+ - agt_ph2x
+ - agt_st
+ - agt_zip
+ - area_of_damage
+ - asgn_date
+ - asgn_no
+ - asgn_type
+ - cat_no
+ - cieca_stl
+ - cieca_ttl
+ - ciecaid
+ - clm_addr1
+ - clm_addr2
+ - clm_city
+ - clm_ct_fn
+ - clm_ct_ln
+ - clm_ct_ph
+ - clm_ct_phx
+ - clm_ctry
+ - clm_ea
+ - clm_fax
+ - clm_faxx
+ - clm_no
+ - clm_ofc_id
+ - clm_ofc_nm
+ - clm_ph1
+ - clm_ph1x
+ - clm_ph2
+ - clm_ph2x
+ - clm_st
+ - clm_title
+ - clm_total
+ - clm_zip
+ - converted
+ - created_at
+ - csr
+ - cust_pr
+ - date_closed
+ - date_estimated
+ - date_exported
+ - date_invoiced
+ - date_open
+ - date_scheduled
+ - ded_amt
+ - ded_status
+ - depreciation_taxes
+ - est_addr1
+ - est_addr2
+ - est_city
+ - est_co_nm
+ - est_ct_fn
+ - est_ct_ln
+ - est_ctry
+ - est_ea
+ - est_number
+ - est_ph1
+ - est_st
+ - est_zip
+ - federal_tax_payable
+ - federal_tax_rate
+ - g_bett_amt
+ - id
+ - inproduction
+ - ins_addr1
+ - ins_addr2
+ - ins_city
+ - ins_co_id
+ - ins_co_nm
+ - ins_ct_fn
+ - ins_ct_ln
+ - ins_ct_ph
+ - ins_ct_phx
+ - ins_ctry
+ - ins_ea
+ - ins_fax
+ - ins_faxx
+ - ins_memo
+ - ins_ph1
+ - ins_ph1x
+ - ins_ph2
+ - ins_ph2x
+ - ins_st
+ - ins_title
+ - ins_zip
+ - insd_addr1
+ - insd_addr2
+ - insd_city
+ - insd_co_nm
+ - insd_ctry
+ - insd_ea
+ - insd_fax
+ - insd_faxx
+ - insd_fn
+ - insd_ln
+ - insd_ph1
+ - insd_ph1x
+ - insd_ph2
+ - insd_ph2x
+ - insd_st
+ - insd_title
+ - insd_zip
+ - invoice_date
+ - kmin
+ - kmout
+ - labor_rate_desc
+ - labor_rate_id
+ - local_tax_rate
+ - loss_cat
+ - loss_date
+ - loss_desc
+ - loss_type
+ - other_amount_payable
+ - owner_owing
+ - ownerid
+ - ownr_addr1
+ - ownr_addr2
+ - ownr_city
+ - ownr_co_nm
+ - ownr_ctry
+ - ownr_ea
+ - ownr_fax
+ - ownr_faxx
+ - ownr_fn
+ - ownr_ln
+ - ownr_ph1
+ - ownr_ph1x
+ - ownr_ph2
+ - ownr_ph2x
+ - ownr_st
+ - ownr_title
+ - ownr_zip
+ - parts_tax_rates
+ - pay_amt
+ - pay_chknm
+ - pay_date
+ - pay_type
+ - payee_nms
+ - plate_no
+ - plate_st
+ - po_number
+ - policy_no
+ - rate_atp
+ - rate_la1
+ - rate_la2
+ - rate_la3
+ - rate_la4
+ - rate_laa
+ - rate_lab
+ - rate_lad
+ - rate_lae
+ - rate_laf
+ - rate_lag
+ - rate_lam
+ - rate_lar
+ - rate_las
+ - rate_lau
+ - rate_ma2s
+ - rate_ma2t
+ - rate_ma3s
+ - rate_mabl
+ - rate_macs
+ - rate_mahw
+ - rate_mapa
+ - rate_mash
+ - rate_matd
+ - referral_source
+ - regie_number
+ - ro_number
+ - scheduled_completion
+ - scheduled_delivery
+ - scheduled_in
+ - selling_dealer
+ - selling_dealer_contact
+ - servicing_dealer
+ - servicing_dealer_contact
+ - shopid
+ - special_coverage_policy
+ - state_tax_rate
+ - status
+ - statusid
+ - storage_payable
+ - tax_lbr_rt
+ - tax_levies_rt
+ - tax_paint_mat_rt
+ - tax_predis
+ - tax_prethr
+ - tax_pstthr
+ - tax_str_rt
+ - tax_sub_rt
+ - tax_thramt
+ - tax_tow_rt
+ - theft_ind
+ - tlos_ind
+ - towing_payable
+ - unit_number
+ - updated_at
+ - v_color
+ - v_make_desc
+ - v_model_desc
+ - v_model_yr
+ - v_vin
+ - vehicleid
+ computed_fields: []
+ filter:
+ bodyshop:
+ associations:
+ _and:
+ - user:
+ authid:
+ _eq: X-Hasura-User-Id
+ - active:
+ _eq: true
+ role: user
+ table:
+ name: jobs
+ schema: public
+ type: create_select_permission
diff --git a/hasura/migrations/1586880014259_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1586880014259_update_permission_user_public_table_jobs/up.yaml
new file mode 100644
index 000000000..4364ff937
--- /dev/null
+++ b/hasura/migrations/1586880014259_update_permission_user_public_table_jobs/up.yaml
@@ -0,0 +1,252 @@
+- args:
+ role: user
+ table:
+ name: jobs
+ schema: public
+ type: drop_select_permission
+- args:
+ permission:
+ allow_aggregations: false
+ columns:
+ - actual_completion
+ - actual_delivery
+ - actual_in
+ - adj_g_disc
+ - adj_strdis
+ - adj_towdis
+ - adjustment_bottom_line
+ - agt_addr1
+ - agt_addr2
+ - agt_city
+ - agt_co_id
+ - agt_co_nm
+ - agt_ct_fn
+ - agt_ct_ln
+ - agt_ct_ph
+ - agt_ct_phx
+ - agt_ctry
+ - agt_ea
+ - agt_fax
+ - agt_faxx
+ - agt_lic_no
+ - agt_ph1
+ - agt_ph1x
+ - agt_ph2
+ - agt_ph2x
+ - agt_st
+ - agt_zip
+ - area_of_damage
+ - asgn_date
+ - asgn_no
+ - asgn_type
+ - cat_no
+ - cieca_stl
+ - cieca_ttl
+ - ciecaid
+ - clm_addr1
+ - clm_addr2
+ - clm_city
+ - clm_ct_fn
+ - clm_ct_ln
+ - clm_ct_ph
+ - clm_ct_phx
+ - clm_ctry
+ - clm_ea
+ - clm_fax
+ - clm_faxx
+ - clm_no
+ - clm_ofc_id
+ - clm_ofc_nm
+ - clm_ph1
+ - clm_ph1x
+ - clm_ph2
+ - clm_ph2x
+ - clm_st
+ - clm_title
+ - clm_total
+ - clm_zip
+ - converted
+ - created_at
+ - csr
+ - cust_pr
+ - date_closed
+ - date_estimated
+ - date_exported
+ - date_invoiced
+ - date_open
+ - date_scheduled
+ - ded_amt
+ - ded_status
+ - depreciation_taxes
+ - est_addr1
+ - est_addr2
+ - est_city
+ - est_co_nm
+ - est_ct_fn
+ - est_ct_ln
+ - est_ctry
+ - est_ea
+ - est_number
+ - est_ph1
+ - est_st
+ - est_zip
+ - federal_tax_payable
+ - federal_tax_rate
+ - g_bett_amt
+ - id
+ - inproduction
+ - ins_addr1
+ - ins_addr2
+ - ins_city
+ - ins_co_id
+ - ins_co_nm
+ - ins_ct_fn
+ - ins_ct_ln
+ - ins_ct_ph
+ - ins_ct_phx
+ - ins_ctry
+ - ins_ea
+ - ins_fax
+ - ins_faxx
+ - ins_memo
+ - ins_ph1
+ - ins_ph1x
+ - ins_ph2
+ - ins_ph2x
+ - ins_st
+ - ins_title
+ - ins_zip
+ - insd_addr1
+ - insd_addr2
+ - insd_city
+ - insd_co_nm
+ - insd_ctry
+ - insd_ea
+ - insd_fax
+ - insd_faxx
+ - insd_fn
+ - insd_ln
+ - insd_ph1
+ - insd_ph1x
+ - insd_ph2
+ - insd_ph2x
+ - insd_st
+ - insd_title
+ - insd_zip
+ - invoice_date
+ - job_totals
+ - kmin
+ - kmout
+ - labor_rate_desc
+ - labor_rate_id
+ - local_tax_rate
+ - loss_cat
+ - loss_date
+ - loss_desc
+ - loss_type
+ - other_amount_payable
+ - owner_owing
+ - ownerid
+ - ownr_addr1
+ - ownr_addr2
+ - ownr_city
+ - ownr_co_nm
+ - ownr_ctry
+ - ownr_ea
+ - ownr_fax
+ - ownr_faxx
+ - ownr_fn
+ - ownr_ln
+ - ownr_ph1
+ - ownr_ph1x
+ - ownr_ph2
+ - ownr_ph2x
+ - ownr_st
+ - ownr_title
+ - ownr_zip
+ - parts_tax_rates
+ - pay_amt
+ - pay_chknm
+ - pay_date
+ - pay_type
+ - payee_nms
+ - plate_no
+ - plate_st
+ - po_number
+ - policy_no
+ - rate_atp
+ - rate_la1
+ - rate_la2
+ - rate_la3
+ - rate_la4
+ - rate_laa
+ - rate_lab
+ - rate_lad
+ - rate_lae
+ - rate_laf
+ - rate_lag
+ - rate_lam
+ - rate_lar
+ - rate_las
+ - rate_lau
+ - rate_ma2s
+ - rate_ma2t
+ - rate_ma3s
+ - rate_mabl
+ - rate_macs
+ - rate_mahw
+ - rate_mapa
+ - rate_mash
+ - rate_matd
+ - referral_source
+ - regie_number
+ - ro_number
+ - scheduled_completion
+ - scheduled_delivery
+ - scheduled_in
+ - selling_dealer
+ - selling_dealer_contact
+ - servicing_dealer
+ - servicing_dealer_contact
+ - shopid
+ - special_coverage_policy
+ - state_tax_rate
+ - status
+ - statusid
+ - storage_payable
+ - tax_lbr_rt
+ - tax_levies_rt
+ - tax_paint_mat_rt
+ - tax_predis
+ - tax_prethr
+ - tax_pstthr
+ - tax_str_rt
+ - tax_sub_rt
+ - tax_thramt
+ - tax_tow_rt
+ - theft_ind
+ - tlos_ind
+ - towing_payable
+ - unit_number
+ - updated_at
+ - v_color
+ - v_make_desc
+ - v_model_desc
+ - v_model_yr
+ - v_vin
+ - vehicleid
+ computed_fields: []
+ filter:
+ bodyshop:
+ associations:
+ _and:
+ - user:
+ authid:
+ _eq: X-Hasura-User-Id
+ - active:
+ _eq: true
+ role: user
+ table:
+ name: jobs
+ schema: public
+ type: create_select_permission
diff --git a/hasura/migrations/1586880020786_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1586880020786_update_permission_user_public_table_jobs/down.yaml
new file mode 100644
index 000000000..68a2a7ed5
--- /dev/null
+++ b/hasura/migrations/1586880020786_update_permission_user_public_table_jobs/down.yaml
@@ -0,0 +1,253 @@
+- args:
+ role: user
+ table:
+ name: jobs
+ schema: public
+ type: drop_update_permission
+- args:
+ permission:
+ columns:
+ - actual_completion
+ - actual_delivery
+ - actual_in
+ - adj_g_disc
+ - adj_strdis
+ - adj_towdis
+ - adjustment_bottom_line
+ - agt_addr1
+ - agt_addr2
+ - agt_city
+ - agt_co_id
+ - agt_co_nm
+ - agt_ct_fn
+ - agt_ct_ln
+ - agt_ct_ph
+ - agt_ct_phx
+ - agt_ctry
+ - agt_ea
+ - agt_fax
+ - agt_faxx
+ - agt_lic_no
+ - agt_ph1
+ - agt_ph1x
+ - agt_ph2
+ - agt_ph2x
+ - agt_st
+ - agt_zip
+ - area_of_damage
+ - asgn_date
+ - asgn_no
+ - asgn_type
+ - cat_no
+ - cieca_stl
+ - cieca_ttl
+ - ciecaid
+ - clm_addr1
+ - clm_addr2
+ - clm_city
+ - clm_ct_fn
+ - clm_ct_ln
+ - clm_ct_ph
+ - clm_ct_phx
+ - clm_ctry
+ - clm_ea
+ - clm_fax
+ - clm_faxx
+ - clm_no
+ - clm_ofc_id
+ - clm_ofc_nm
+ - clm_ph1
+ - clm_ph1x
+ - clm_ph2
+ - clm_ph2x
+ - clm_st
+ - clm_title
+ - clm_total
+ - clm_zip
+ - converted
+ - created_at
+ - csr
+ - cust_pr
+ - date_closed
+ - date_estimated
+ - date_exported
+ - date_invoiced
+ - date_open
+ - date_scheduled
+ - ded_amt
+ - ded_status
+ - depreciation_taxes
+ - est_addr1
+ - est_addr2
+ - est_city
+ - est_co_nm
+ - est_ct_fn
+ - est_ct_ln
+ - est_ctry
+ - est_ea
+ - est_number
+ - est_ph1
+ - est_st
+ - est_zip
+ - federal_tax_payable
+ - federal_tax_rate
+ - g_bett_amt
+ - id
+ - inproduction
+ - ins_addr1
+ - ins_addr2
+ - ins_city
+ - ins_co_id
+ - ins_co_nm
+ - ins_ct_fn
+ - ins_ct_ln
+ - ins_ct_ph
+ - ins_ct_phx
+ - ins_ctry
+ - ins_ea
+ - ins_fax
+ - ins_faxx
+ - ins_memo
+ - ins_ph1
+ - ins_ph1x
+ - ins_ph2
+ - ins_ph2x
+ - ins_st
+ - ins_title
+ - ins_zip
+ - insd_addr1
+ - insd_addr2
+ - insd_city
+ - insd_co_nm
+ - insd_ctry
+ - insd_ea
+ - insd_fax
+ - insd_faxx
+ - insd_fn
+ - insd_ln
+ - insd_ph1
+ - insd_ph1x
+ - insd_ph2
+ - insd_ph2x
+ - insd_st
+ - insd_title
+ - insd_zip
+ - invoice_date
+ - kmin
+ - kmout
+ - labor_rate_desc
+ - labor_rate_id
+ - local_tax_rate
+ - loss_cat
+ - loss_date
+ - loss_desc
+ - loss_type
+ - other_amount_payable
+ - owner_owing
+ - ownerid
+ - ownr_addr1
+ - ownr_addr2
+ - ownr_city
+ - ownr_co_nm
+ - ownr_ctry
+ - ownr_ea
+ - ownr_fax
+ - ownr_faxx
+ - ownr_fn
+ - ownr_ln
+ - ownr_ph1
+ - ownr_ph1x
+ - ownr_ph2
+ - ownr_ph2x
+ - ownr_st
+ - ownr_title
+ - ownr_zip
+ - parts_tax_rates
+ - pay_amt
+ - pay_chknm
+ - pay_date
+ - pay_type
+ - payee_nms
+ - plate_no
+ - plate_st
+ - po_number
+ - policy_no
+ - rate_atp
+ - rate_la1
+ - rate_la2
+ - rate_la3
+ - rate_la4
+ - rate_laa
+ - rate_lab
+ - rate_lad
+ - rate_lae
+ - rate_laf
+ - rate_lag
+ - rate_lam
+ - rate_lar
+ - rate_las
+ - rate_lau
+ - rate_ma2s
+ - rate_ma2t
+ - rate_ma3s
+ - rate_mabl
+ - rate_macs
+ - rate_mahw
+ - rate_mapa
+ - rate_mash
+ - rate_matd
+ - referral_source
+ - regie_number
+ - ro_number
+ - scheduled_completion
+ - scheduled_delivery
+ - scheduled_in
+ - selling_dealer
+ - selling_dealer_contact
+ - servicing_dealer
+ - servicing_dealer_contact
+ - shopid
+ - special_coverage_policy
+ - state_tax_rate
+ - status
+ - statusid
+ - storage_payable
+ - tax_lbr_rt
+ - tax_levies_rt
+ - tax_paint_mat_rt
+ - tax_predis
+ - tax_prethr
+ - tax_pstthr
+ - tax_str_rt
+ - tax_sub_rt
+ - tax_thramt
+ - tax_tow_rt
+ - theft_ind
+ - tlos_ind
+ - towing_payable
+ - unit_number
+ - updated_at
+ - v_color
+ - v_make_desc
+ - v_model_desc
+ - v_model_yr
+ - v_vin
+ - vehicleid
+ filter:
+ bodyshop:
+ associations:
+ _and:
+ - user:
+ authid:
+ _eq: X-Hasura-User-Id
+ - active:
+ _eq: true
+ localPresets:
+ - key: ""
+ value: ""
+ set: {}
+ role: user
+ table:
+ name: jobs
+ schema: public
+ type: create_update_permission
diff --git a/hasura/migrations/1586880020786_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1586880020786_update_permission_user_public_table_jobs/up.yaml
new file mode 100644
index 000000000..06e843cbc
--- /dev/null
+++ b/hasura/migrations/1586880020786_update_permission_user_public_table_jobs/up.yaml
@@ -0,0 +1,254 @@
+- args:
+ role: user
+ table:
+ name: jobs
+ schema: public
+ type: drop_update_permission
+- args:
+ permission:
+ columns:
+ - actual_completion
+ - actual_delivery
+ - actual_in
+ - adj_g_disc
+ - adj_strdis
+ - adj_towdis
+ - adjustment_bottom_line
+ - agt_addr1
+ - agt_addr2
+ - agt_city
+ - agt_co_id
+ - agt_co_nm
+ - agt_ct_fn
+ - agt_ct_ln
+ - agt_ct_ph
+ - agt_ct_phx
+ - agt_ctry
+ - agt_ea
+ - agt_fax
+ - agt_faxx
+ - agt_lic_no
+ - agt_ph1
+ - agt_ph1x
+ - agt_ph2
+ - agt_ph2x
+ - agt_st
+ - agt_zip
+ - area_of_damage
+ - asgn_date
+ - asgn_no
+ - asgn_type
+ - cat_no
+ - cieca_stl
+ - cieca_ttl
+ - ciecaid
+ - clm_addr1
+ - clm_addr2
+ - clm_city
+ - clm_ct_fn
+ - clm_ct_ln
+ - clm_ct_ph
+ - clm_ct_phx
+ - clm_ctry
+ - clm_ea
+ - clm_fax
+ - clm_faxx
+ - clm_no
+ - clm_ofc_id
+ - clm_ofc_nm
+ - clm_ph1
+ - clm_ph1x
+ - clm_ph2
+ - clm_ph2x
+ - clm_st
+ - clm_title
+ - clm_total
+ - clm_zip
+ - converted
+ - created_at
+ - csr
+ - cust_pr
+ - date_closed
+ - date_estimated
+ - date_exported
+ - date_invoiced
+ - date_open
+ - date_scheduled
+ - ded_amt
+ - ded_status
+ - depreciation_taxes
+ - est_addr1
+ - est_addr2
+ - est_city
+ - est_co_nm
+ - est_ct_fn
+ - est_ct_ln
+ - est_ctry
+ - est_ea
+ - est_number
+ - est_ph1
+ - est_st
+ - est_zip
+ - federal_tax_payable
+ - federal_tax_rate
+ - g_bett_amt
+ - id
+ - inproduction
+ - ins_addr1
+ - ins_addr2
+ - ins_city
+ - ins_co_id
+ - ins_co_nm
+ - ins_ct_fn
+ - ins_ct_ln
+ - ins_ct_ph
+ - ins_ct_phx
+ - ins_ctry
+ - ins_ea
+ - ins_fax
+ - ins_faxx
+ - ins_memo
+ - ins_ph1
+ - ins_ph1x
+ - ins_ph2
+ - ins_ph2x
+ - ins_st
+ - ins_title
+ - ins_zip
+ - insd_addr1
+ - insd_addr2
+ - insd_city
+ - insd_co_nm
+ - insd_ctry
+ - insd_ea
+ - insd_fax
+ - insd_faxx
+ - insd_fn
+ - insd_ln
+ - insd_ph1
+ - insd_ph1x
+ - insd_ph2
+ - insd_ph2x
+ - insd_st
+ - insd_title
+ - insd_zip
+ - invoice_date
+ - job_totals
+ - kmin
+ - kmout
+ - labor_rate_desc
+ - labor_rate_id
+ - local_tax_rate
+ - loss_cat
+ - loss_date
+ - loss_desc
+ - loss_type
+ - other_amount_payable
+ - owner_owing
+ - ownerid
+ - ownr_addr1
+ - ownr_addr2
+ - ownr_city
+ - ownr_co_nm
+ - ownr_ctry
+ - ownr_ea
+ - ownr_fax
+ - ownr_faxx
+ - ownr_fn
+ - ownr_ln
+ - ownr_ph1
+ - ownr_ph1x
+ - ownr_ph2
+ - ownr_ph2x
+ - ownr_st
+ - ownr_title
+ - ownr_zip
+ - parts_tax_rates
+ - pay_amt
+ - pay_chknm
+ - pay_date
+ - pay_type
+ - payee_nms
+ - plate_no
+ - plate_st
+ - po_number
+ - policy_no
+ - rate_atp
+ - rate_la1
+ - rate_la2
+ - rate_la3
+ - rate_la4
+ - rate_laa
+ - rate_lab
+ - rate_lad
+ - rate_lae
+ - rate_laf
+ - rate_lag
+ - rate_lam
+ - rate_lar
+ - rate_las
+ - rate_lau
+ - rate_ma2s
+ - rate_ma2t
+ - rate_ma3s
+ - rate_mabl
+ - rate_macs
+ - rate_mahw
+ - rate_mapa
+ - rate_mash
+ - rate_matd
+ - referral_source
+ - regie_number
+ - ro_number
+ - scheduled_completion
+ - scheduled_delivery
+ - scheduled_in
+ - selling_dealer
+ - selling_dealer_contact
+ - servicing_dealer
+ - servicing_dealer_contact
+ - shopid
+ - special_coverage_policy
+ - state_tax_rate
+ - status
+ - statusid
+ - storage_payable
+ - tax_lbr_rt
+ - tax_levies_rt
+ - tax_paint_mat_rt
+ - tax_predis
+ - tax_prethr
+ - tax_pstthr
+ - tax_str_rt
+ - tax_sub_rt
+ - tax_thramt
+ - tax_tow_rt
+ - theft_ind
+ - tlos_ind
+ - towing_payable
+ - unit_number
+ - updated_at
+ - v_color
+ - v_make_desc
+ - v_model_desc
+ - v_model_yr
+ - v_vin
+ - vehicleid
+ filter:
+ bodyshop:
+ associations:
+ _and:
+ - user:
+ authid:
+ _eq: X-Hasura-User-Id
+ - active:
+ _eq: true
+ localPresets:
+ - key: ""
+ value: ""
+ set: {}
+ role: user
+ table:
+ name: jobs
+ schema: public
+ type: create_update_permission