diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel
index e232e9d85..4c202bbd8 100644
--- a/bodyshop_translations.babel
+++ b/bodyshop_translations.babel
@@ -1474,6 +1474,27 @@
+
+ admin_jobuninvoice
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
admin_jobunvoid
false
@@ -5776,6 +5797,27 @@
+
+ nextstatus
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
percent
false
@@ -19482,6 +19524,27 @@
actions
+
+ assign_team
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
converttolabor
false
@@ -19503,6 +19566,27 @@
+
+ dispatchparts
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
new
false
@@ -19618,6 +19702,27 @@
+
+ assigned_team
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
db_price
false
@@ -23731,6 +23836,27 @@
+
+ date_void
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
ded_amt
false
@@ -33912,6 +34038,27 @@
tech
+
+ claimtask
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
home
false
@@ -36000,6 +36147,141 @@
+
+ parts_dispatch
+
+
+ errors
+
+
+ creating
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
+
+
+
+ fields
+
+
+ number
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
+
+ percent_accepted
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
+
+
+
+ labels
+
+
+ parts_dispatch
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
+
+
+
+
+
+ parts_dispatch_lines
+
+
+ fields
+
+
+ accepted_at
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
+
+
+
+
parts_orders
@@ -40727,6 +41009,27 @@
+
+ parts_return_slip
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
sublet_order
false
@@ -45750,6 +46053,27 @@
+
+ payall
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
printemployee
false
@@ -46264,6 +46588,27 @@
+
+ task_name
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
@@ -46332,6 +46677,27 @@
+
+ claimtaskpreview
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
clockhours
false
@@ -46521,6 +46887,27 @@
+
+ payrollclaimedtasks
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
pmbreak
false
@@ -46626,6 +47013,27 @@
+
+ task
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
timetickets
false
@@ -46647,6 +47055,27 @@
+
+ unassigned
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
zeroactualnegativeprod
false
@@ -46846,6 +47275,27 @@
+
+ unassignedlines
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
diff --git a/client/src/components/form-items-formatted/read-only-form-item.component.jsx b/client/src/components/form-items-formatted/read-only-form-item.component.jsx
index fd50b9c94..c27944691 100644
--- a/client/src/components/form-items-formatted/read-only-form-item.component.jsx
+++ b/client/src/components/form-items-formatted/read-only-form-item.component.jsx
@@ -1,9 +1,26 @@
import Dinero from "dinero.js";
import React, { forwardRef } from "react";
-const ReadOnlyFormItem = ({ value, type = "text", onChange }, ref) => {
+import { connect } from "react-redux";
+import { createStructuredSelector } from "reselect";
+import { selectBodyshop } from "../../redux/user/user.selectors";
+const mapStateToProps = createStructuredSelector({
+ bodyshop: selectBodyshop,
+});
+const mapDispatchToProps = (dispatch) => ({
+ //setUserLanguage: language => dispatch(setUserLanguage(language))
+});
+
+const ReadOnlyFormItem = (
+ { bodyshop, value, type = "text", onChange },
+ ref
+) => {
if (!value) return null;
switch (type) {
+ case "employee":
+ const emp = bodyshop.employees.find((e) => e.id === value);
+ return `${emp?.first_name} ${emp?.last_name}`;
+
case "text":
return
{value}
;
case "currency":
@@ -14,4 +31,8 @@ const ReadOnlyFormItem = ({ value, type = "text", onChange }, ref) => {
return {value}
;
}
};
-export default forwardRef(ReadOnlyFormItem);
+
+export default connect(
+ mapStateToProps,
+ mapDispatchToProps
+)(forwardRef(ReadOnlyFormItem));
diff --git a/client/src/components/job-detail-lines/job-lines.component.jsx b/client/src/components/job-detail-lines/job-lines.component.jsx
index 9eabf11d7..e34d6a446 100644
--- a/client/src/components/job-detail-lines/job-lines.component.jsx
+++ b/client/src/components/job-detail-lines/job-lines.component.jsx
@@ -45,6 +45,10 @@ import JobSendPartPriceChangeComponent from "../job-send-parts-price-change/job-
import PartsOrderModalContainer from "../parts-order-modal/parts-order-modal.container";
import JobLinesExpander from "./job-lines-expander.component";
import JobLinesPartPriceChange from "./job-lines-part-price-change.component";
+import JoblineTeamAssignment from "../job-line-team-assignment/job-line-team-assignmnent.component";
+import JobLineDispatchButton from "../job-line-dispatch-button/job-line-dispatch-button.component";
+import JobLineBulkAssignComponent from "../job-line-bulk-assign/job-line-bulk-assign.component";
+import { useTreatments } from "@splitsoftware/splitio-react";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
@@ -76,7 +80,11 @@ export function JobLinesComponent({
setBillEnterContext,
}) {
const [deleteJobLine] = useMutation(DELETE_JOB_LINE_BY_PK);
-
+ const { Enhanced_Payroll } = useTreatments(
+ ["Enhanced_Payroll"],
+ {},
+ bodyshop.imexshopid
+ );
const [selectedLines, setSelectedLines] = useState([]);
const [state, setState] = useState({
sortedInfo: {},
@@ -106,7 +114,9 @@ export function JobLinesComponent({
onCell: (record) => ({
className: record.manual_line && "job-line-manual",
style: {
- ...(record.critical ? { boxShadow: " -.5em 0 0 #FFC107" } : {}),
+ ...(record.critical || true
+ ? { boxShadow: " -.5em 0 0 #FFC107" }
+ : {}),
},
}),
sortOrder:
@@ -121,10 +131,21 @@ export function JobLinesComponent({
sortOrder:
state.sortedInfo.columnKey === "oem_partno" && state.sortedInfo.order,
ellipsis: true,
- render: (text, record) =>
- `${record.oem_partno || ""} ${
- record.alt_partno ? `(${record.alt_partno})` : ""
- }`.trim(),
+ onCell: (record) => ({
+ className: record.manual_line && "job-line-manual",
+ style: {
+ ...(record.parts_dispatch_lines[0]?.accepted_at || true
+ ? { boxShadow: " -.5em 0 0 #FFC107" }
+ : {}),
+ },
+ }),
+ render: (text, record) => (
+
+ {`${record.oem_partno || ""} ${
+ record.alt_partno ? `(${record.alt_partno})` : ""
+ }`.trim()}
+
+ ),
},
{
title: t("joblines.fields.op_code_desc"),
@@ -273,6 +294,19 @@ export function JobLinesComponent({
state.sortedInfo.columnKey === "line_ind" && state.sortedInfo.order,
responsive: ["md"],
},
+ ...(Enhanced_Payroll.treatment === "on"
+ ? [
+ {
+ title: t("joblines.fields.assigned_team"),
+ dataIndex: "assigned_team",
+ key: "assigned_team",
+ render: (text, record) => (
+
+ ),
+ },
+ ]
+ : []),
+
{
title: t("joblines.fields.notes"),
dataIndex: "notes",
@@ -391,7 +425,11 @@ export function JobLinesComponent({
setSelectedLines(
_.uniq([
...selectedLines,
- ...jobLines.filter((item) => markedTypes.includes(item.part_type)),
+ ...jobLines.filter(
+ (item) =>
+ markedTypes.includes(item.part_type) ||
+ markedTypes.includes(item.mod_lbr_ty)
+ ),
])
);
}
@@ -404,6 +442,10 @@ export function JobLinesComponent({
{t("joblines.fields.part_types.PAL")}
{t("joblines.fields.part_types.PAS")}
+ {t("joblines.fields.lbr_types.LAB")}
+ {t("joblines.fields.lbr_types.LAR")}
+ {t("joblines.fields.lbr_types.LAM")}
+
{t("general.labels.clear")}
);
@@ -427,6 +469,18 @@ export function JobLinesComponent({
)}
+
+ {Enhanced_Payroll.treatment === "on" && (
+
+ )}