-
- {steps.map((item, idx) => (
- {
- form
- .validateFields()
- .then((r) => {
- if (steps[pageIndex].validation) {
- setErrorMessage(null);
- setPageIndex(idx);
- } else {
- setErrorMessage(steps[pageIndex].error);
- }
- })
- .catch((error) => console.log("error", error));
- }}
- />
- ))}
-
-
+
{errorMessage ? (
diff --git a/client/src/pages/jobs-create/jobs-create.container.jsx b/client/src/pages/jobs-create/jobs-create.container.jsx
index 68c589314..2bf15463b 100644
--- a/client/src/pages/jobs-create/jobs-create.container.jsx
+++ b/client/src/pages/jobs-create/jobs-create.container.jsx
@@ -149,6 +149,7 @@ function JobsCreateContainer({ bodyshop, setBreadcrumbs, setSelectedHeader }) {
+
+
+
+
+
+
+
+
+
);
}
diff --git a/client/src/pages/parts-queue/parts-queue.page.component.jsx b/client/src/pages/parts-queue/parts-queue.page.component.jsx
index ba317706d..1c1031eb8 100644
--- a/client/src/pages/parts-queue/parts-queue.page.component.jsx
+++ b/client/src/pages/parts-queue/parts-queue.page.component.jsx
@@ -1,6 +1,6 @@
import { SyncOutlined } from "@ant-design/icons";
import { useQuery } from "@apollo/client";
-import { Button, Input, Table } from "antd";
+import { Button, Card, Input, Space, Table } from "antd";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
@@ -212,35 +212,35 @@ export function PartsQueuePageComponent({ bodyshop }) {
];
return (
-
{
- return (
-
-
- {
- setSearchText(e.target.value);
- }}
- value={searchText}
- enterButton
- />
-
- );
- }}
- onChange={handleTableChange}
- />
+
+
+ {
+ setSearchText(e.target.value);
+ }}
+ value={searchText}
+ enterButton
+ />
+
+ }
+ >
+
+
);
}
diff --git a/client/src/pages/production-list/production-list.component.jsx b/client/src/pages/production-list/production-list.component.jsx
index 0049d759c..116d6cb20 100644
--- a/client/src/pages/production-list/production-list.component.jsx
+++ b/client/src/pages/production-list/production-list.component.jsx
@@ -1,6 +1,6 @@
import React from "react";
import ProductionListTable from "../../components/production-list-table/production-list-table.container";
-export default function ProductionListComponent({ columnState }) {
+export default function ProductionListComponent() {
return ;
}
diff --git a/client/src/pages/production-list/production-list.container.jsx b/client/src/pages/production-list/production-list.container.jsx
index 51bbf092a..c8275c1ea 100644
--- a/client/src/pages/production-list/production-list.container.jsx
+++ b/client/src/pages/production-list/production-list.container.jsx
@@ -1,18 +1,12 @@
import React, { useEffect } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
-import { createStructuredSelector } from "reselect";
+import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import {
setBreadcrumbs,
setSelectedHeader,
} from "../../redux/application/application.actions";
-import { selectBodyshop } from "../../redux/user/user.selectors";
import ProductionListComponent from "./production-list.component";
-import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
-
-const mapStateToProps = createStructuredSelector({
- bodyshop: selectBodyshop,
-});
const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
@@ -21,7 +15,7 @@ const mapDispatchToProps = (dispatch) => ({
export function ProductionListContainer({
setBreadcrumbs,
- bodyshop,
+
setSelectedHeader,
}) {
const { t } = useTranslation();
@@ -40,7 +34,4 @@ export function ProductionListContainer({
);
}
-export default connect(
- mapStateToProps,
- mapDispatchToProps
-)(ProductionListContainer);
+export default connect(null, mapDispatchToProps)(ProductionListContainer);
diff --git a/client/src/pages/vehicles-detail/vehicles-detail.page.component.jsx b/client/src/pages/vehicles-detail/vehicles-detail.page.component.jsx
index 3cc260675..6f8489f62 100644
--- a/client/src/pages/vehicles-detail/vehicles-detail.page.component.jsx
+++ b/client/src/pages/vehicles-detail/vehicles-detail.page.component.jsx
@@ -1,3 +1,4 @@
+import { Col, Divider, Row } from "antd";
import React from "react";
import VehicleDetailFormContainer from "../../components/vehicle-detail-form/vehicle-detail-form.container";
import VehicleDetailJobsComponent from "../../components/vehicle-detail-jobs/vehicle-detail-jobs.component";
@@ -5,8 +6,15 @@ import VehicleDetailJobsComponent from "../../components/vehicle-detail-jobs/veh
export default function VehicleDetailComponent({ vehicle, refetch }) {
return (
);
}
diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json
index a7675e0c5..ae44b0a0b 100644
--- a/client/src/translations/en_us/common.json
+++ b/client/src/translations/en_us/common.json
@@ -141,6 +141,8 @@
"bill_total": "Bill Total Amount",
"billcmtotal": "Retail Total of Credit Memos",
"bills": "Bills",
+ "creditsnotreceived": "Credits Not Received",
+ "creditsreceived": "Credits Received",
"dedfromlbr": "Deducted from Labor",
"deleteconfirm": "Are you sure you want to delete this bill? It cannot be undone. If this bill has deductions from labors, manual changes may be required.",
"discrepancy": "Discrepancy",
@@ -155,7 +157,8 @@
"noneselected": "No bill selected.",
"retailtotal": "Retail Total of Bill (Ex. Taxes)",
"state_tax": "State Tax",
- "subtotal": "Subtotal"
+ "subtotal": "Subtotal",
+ "totalreturns": "Total Returns"
},
"successes": {
"created": "Invoice added successfully.",
@@ -517,13 +520,17 @@
"status": "Status"
},
"labels": {
+ "agreement": "Agreement {{agreement_num}} - {{status}}",
+ "availablecars": "Available Cars",
"convertform": {
"applycleanupcharge": "Apply cleanup charge?",
"refuelqty": "Refuel qty.?"
},
"correctdataonform": "Please review the information above. If any of it is not correct, you can fix it later.",
+ "driverinformation": "Driver's Information",
"noteconvertedfrom": "R.O. created from converted Courtesy Car Contract {{agreementnumber}}.",
"populatefromjob": "Populate from Job",
+ "rates": "Contract Rates",
"vehicle": "Vehicle",
"waitingforscan": "Please scan driver's license barcode..."
},
@@ -582,6 +589,8 @@
},
"outwith": "Out With",
"return": "Return Courtesy Car",
+ "status": "Status",
+ "usage": "Usage",
"vehicle": "Vehicle Description"
},
"status": {
@@ -872,6 +881,7 @@
"PAM": "Remanufactured",
"PAN": "New/OEM",
"PAO": "Other",
+ "PAP": "OEM Partial",
"PAR": "Recored",
"PAS": "Sublet",
"PASL": "Sublet"
@@ -1053,7 +1063,7 @@
"pam": "Remanufactured",
"pan": "OEM/New",
"pao": "Other",
- "pap": "EOM Partial",
+ "pap": "OEM Partial",
"par": "Re-cored",
"parts_tax_rates": {
"prt_discp": "Discount %",
@@ -1446,6 +1456,7 @@
"existing_owners": "Existing Owners",
"fromclaim": "Current Claim",
"fromowner": "Historical Owner Record",
+ "relatedjobs": "Related Jobs",
"updateowner": "Update Owner"
},
"successes": {
@@ -1674,6 +1685,14 @@
"vendor": "Vendor"
},
"templates": {
+ "hours_sold_detail_closed": "Hours Sold Detail - Closed",
+ "hours_sold_detail_closed_source": "Hours Sold Detail - Closed by Source",
+ "hours_sold_detail_open": "Hours Sold Detail - Open",
+ "hours_sold_detail_open_source": "Hours Sold Detail - Open by Source",
+ "hours_sold_summary_closed": "Hours Sold Summary - Closed",
+ "hours_sold_summary_closed_source": "Hours Sold Summary - Closed by Source",
+ "hours_sold_summary_open": "Hours Sold Summary - Open",
+ "hours_sold_summary_open_source": "Hours Sold Summary - Open by Source",
"payments_by_date_type": "Payments by Date Range",
"purchases_by_date_range_detail": "Purchases by Date - Detail",
"purchases_by_date_range_summary": "Purchases by Date - Summary",
@@ -1776,7 +1795,8 @@
"pmshift": "PM Shift",
"shift": "Shift",
"shiftalreadyclockedon": "Active Shift Time Tickets",
- "straight_time": "Straight Time"
+ "straight_time": "Straight Time",
+ "timetickets": "Time Tickets"
},
"successes": {
"clockedin": "Clocked in successfully.",
@@ -1924,6 +1944,7 @@
},
"labels": {
"fromvehicle": "Historical Vehicle Record",
+ "relatedjobs": "Related Jobs",
"updatevehicle": "Update Vehicle Information"
},
"successes": {
diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json
index 979c96b54..2ef0ac47c 100644
--- a/client/src/translations/es/common.json
+++ b/client/src/translations/es/common.json
@@ -141,6 +141,8 @@
"bill_total": "",
"billcmtotal": "",
"bills": "",
+ "creditsnotreceived": "",
+ "creditsreceived": "",
"dedfromlbr": "",
"deleteconfirm": "",
"discrepancy": "",
@@ -155,7 +157,8 @@
"noneselected": "",
"retailtotal": "",
"state_tax": "",
- "subtotal": ""
+ "subtotal": "",
+ "totalreturns": ""
},
"successes": {
"created": "",
@@ -517,13 +520,17 @@
"status": ""
},
"labels": {
+ "agreement": "",
+ "availablecars": "",
"convertform": {
"applycleanupcharge": "",
"refuelqty": ""
},
"correctdataonform": "",
+ "driverinformation": "",
"noteconvertedfrom": "",
"populatefromjob": "",
+ "rates": "",
"vehicle": "",
"waitingforscan": ""
},
@@ -582,6 +589,8 @@
},
"outwith": "",
"return": "",
+ "status": "",
+ "usage": "",
"vehicle": ""
},
"status": {
@@ -872,6 +881,7 @@
"PAM": "",
"PAN": "",
"PAO": "",
+ "PAP": "",
"PAR": "",
"PAS": "",
"PASL": ""
@@ -1446,6 +1456,7 @@
"existing_owners": "Propietarios existentes",
"fromclaim": "",
"fromowner": "",
+ "relatedjobs": "",
"updateowner": ""
},
"successes": {
@@ -1674,6 +1685,14 @@
"vendor": ""
},
"templates": {
+ "hours_sold_detail_closed": "",
+ "hours_sold_detail_closed_source": "",
+ "hours_sold_detail_open": "",
+ "hours_sold_detail_open_source": "",
+ "hours_sold_summary_closed": "",
+ "hours_sold_summary_closed_source": "",
+ "hours_sold_summary_open": "",
+ "hours_sold_summary_open_source": "",
"payments_by_date_type": "",
"purchases_by_date_range_detail": "",
"purchases_by_date_range_summary": "",
@@ -1776,7 +1795,8 @@
"pmshift": "",
"shift": "",
"shiftalreadyclockedon": "",
- "straight_time": ""
+ "straight_time": "",
+ "timetickets": ""
},
"successes": {
"clockedin": "",
@@ -1924,6 +1944,7 @@
},
"labels": {
"fromvehicle": "",
+ "relatedjobs": "",
"updatevehicle": ""
},
"successes": {
diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json
index 7dc306750..b942637d7 100644
--- a/client/src/translations/fr/common.json
+++ b/client/src/translations/fr/common.json
@@ -141,6 +141,8 @@
"bill_total": "",
"billcmtotal": "",
"bills": "",
+ "creditsnotreceived": "",
+ "creditsreceived": "",
"dedfromlbr": "",
"deleteconfirm": "",
"discrepancy": "",
@@ -155,7 +157,8 @@
"noneselected": "",
"retailtotal": "",
"state_tax": "",
- "subtotal": ""
+ "subtotal": "",
+ "totalreturns": ""
},
"successes": {
"created": "",
@@ -517,13 +520,17 @@
"status": ""
},
"labels": {
+ "agreement": "",
+ "availablecars": "",
"convertform": {
"applycleanupcharge": "",
"refuelqty": ""
},
"correctdataonform": "",
+ "driverinformation": "",
"noteconvertedfrom": "",
"populatefromjob": "",
+ "rates": "",
"vehicle": "",
"waitingforscan": ""
},
@@ -582,6 +589,8 @@
},
"outwith": "",
"return": "",
+ "status": "",
+ "usage": "",
"vehicle": ""
},
"status": {
@@ -872,6 +881,7 @@
"PAM": "",
"PAN": "",
"PAO": "",
+ "PAP": "",
"PAR": "",
"PAS": "",
"PASL": ""
@@ -1446,6 +1456,7 @@
"existing_owners": "Propriétaires existants",
"fromclaim": "",
"fromowner": "",
+ "relatedjobs": "",
"updateowner": ""
},
"successes": {
@@ -1674,6 +1685,14 @@
"vendor": ""
},
"templates": {
+ "hours_sold_detail_closed": "",
+ "hours_sold_detail_closed_source": "",
+ "hours_sold_detail_open": "",
+ "hours_sold_detail_open_source": "",
+ "hours_sold_summary_closed": "",
+ "hours_sold_summary_closed_source": "",
+ "hours_sold_summary_open": "",
+ "hours_sold_summary_open_source": "",
"payments_by_date_type": "",
"purchases_by_date_range_detail": "",
"purchases_by_date_range_summary": "",
@@ -1776,7 +1795,8 @@
"pmshift": "",
"shift": "",
"shiftalreadyclockedon": "",
- "straight_time": ""
+ "straight_time": "",
+ "timetickets": ""
},
"successes": {
"clockedin": "",
@@ -1924,6 +1944,7 @@
},
"labels": {
"fromvehicle": "",
+ "relatedjobs": "",
"updatevehicle": ""
},
"successes": {
diff --git a/client/src/utils/TemplateConstants.js b/client/src/utils/TemplateConstants.js
index c0133c618..6a52f1810 100644
--- a/client/src/utils/TemplateConstants.js
+++ b/client/src/utils/TemplateConstants.js
@@ -374,6 +374,94 @@ export const TemplateList = (type, context) => {
//idtype: "vendor",
disabled: false,
},
+
+ hours_sold_detail_closed: {
+ title: i18n.t("reportcenter.templates.hours_sold_detail_closed"),
+ description: "",
+ subject: i18n.t("reportcenter.templates.hours_sold_detail_closed"),
+ key: "hours_sold_detail_closed",
+ //idtype: "vendor",
+ disabled: false,
+ },
+
+ hours_sold_detail_closed_source: {
+ title: i18n.t(
+ "reportcenter.templates.hours_sold_detail_closed_source"
+ ),
+ description: "",
+ subject: i18n.t(
+ "reportcenter.templates.hours_sold_detail_closed_source"
+ ),
+ key: "hours_sold_detail_closed_source",
+ //idtype: "vendor",
+ disabled: false,
+ },
+
+ hours_sold_summary_closed: {
+ title: i18n.t("reportcenter.templates.hours_sold_summary_closed"),
+ description: "",
+ subject: i18n.t("reportcenter.templates.hours_sold_summary_closed"),
+ key: "hours_sold_summary_closed",
+ //idtype: "vendor",
+ disabled: false,
+ },
+
+ hours_sold_summary_closed_source: {
+ title: i18n.t(
+ "reportcenter.templates.hours_sold_summary_closed_source"
+ ),
+ description: "",
+ subject: i18n.t(
+ "reportcenter.templates.hours_sold_summary_closed_source"
+ ),
+ key: "hours_sold_summary_closed_source",
+ //idtype: "vendor",
+ disabled: false,
+ },
+
+ hours_sold_detail_open: {
+ title: i18n.t("reportcenter.templates.hours_sold_detail_open"),
+ description: "",
+ subject: i18n.t("reportcenter.templates.hours_sold_detail_open"),
+ key: "hours_sold_detail_open",
+ //idtype: "vendor",
+ disabled: false,
+ },
+
+ hours_sold_detail_open_source: {
+ title: i18n.t(
+ "reportcenter.templates.hours_sold_detail_open_source"
+ ),
+ description: "",
+ subject: i18n.t(
+ "reportcenter.templates.hours_sold_detail_open_source"
+ ),
+ key: "hours_sold_detail_open_source",
+ //idtype: "vendor",
+ disabled: false,
+ },
+
+ hours_sold_summary_open: {
+ title: i18n.t("reportcenter.templates.hours_sold_summary_open"),
+ description: "",
+ subject: i18n.t("reportcenter.templates.hours_sold_summary_open"),
+ key: "hours_sold_summary_open",
+ //idtype: "vendor",
+ disabled: false,
+ },
+
+ hours_sold_summary_open_source: {
+ title: i18n.t(
+ "reportcenter.templates.hours_sold_summary_open_source"
+ ),
+ description: "",
+ subject: i18n.t(
+ "reportcenter.templates.hours_sold_summary_open_source"
+ ),
+ key: "hours_sold_summary_open_source",
+ //idtype: "vendor",
+ disabled: false,
+ },
}
: {}),
...(!type || type === "courtesycarcontract"
diff --git a/server/job/job-totals.js b/server/job/job-totals.js
index a05c0835c..f17a32e5c 100644
--- a/server/job/job-totals.js
+++ b/server/job/job-totals.js
@@ -86,7 +86,7 @@ async function Totals(req, res) {
res.status(400).send(JSON.stringify(error));
}
}
-function CalculateRatesTotals(ratesList, shoprates) {
+function CalculateRatesTotals(ratesList) {
const jobLines = ratesList.joblines.filter((jl) => !jl.removed);
let ret = {
@@ -322,6 +322,14 @@ function CalculateTaxesTotals(job, otherTotals) {
let statePartsTax = Dinero();
let additionalItemsTax = Dinero();
+ //Audatex sends additional glass part types. IO-774
+ const BackupGlassTax =
+ job.parts_tax_rates.PAGD ||
+ job.parts_tax_rates.PAGF ||
+ job.parts_tax_rates.PAGP ||
+ job.parts_tax_rates.PAGQ ||
+ job.parts_tax_rates.PAGR;
+
job.joblines
.filter((jl) => !jl.removed)
.forEach((val) => {
@@ -344,6 +352,10 @@ function CalculateTaxesTotals(job, otherTotals) {
((job.parts_tax_rates &&
job.parts_tax_rates[val.part_type] &&
job.parts_tax_rates[val.part_type].prt_tax_rt) ||
+ (val.part_type &&
+ val.part_type.startsWith("PAG") &&
+ BackupGlassTax &&
+ BackupGlassTax.prt_tax_rt) ||
0) * 100
)
);