diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel
index b94eb957c..e3e62a467 100644
--- a/bodyshop_translations.babel
+++ b/bodyshop_translations.babel
@@ -34752,6 +34752,27 @@
+
+ mechanical_authorization
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
mpi_animal_checklist
false
@@ -43353,6 +43374,27 @@
+
+ novehinfo
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
relatedjobs
false
diff --git a/client/src/components/job-bills-total/job-bills-total.component.jsx b/client/src/components/job-bills-total/job-bills-total.component.jsx
index 011a9b80f..ef9e0da35 100644
--- a/client/src/components/job-bills-total/job-bills-total.component.jsx
+++ b/client/src/components/job-bills-total/job-bills-total.component.jsx
@@ -64,9 +64,9 @@ export default function JobBillsTotalComponent({
})
);
- const totalPartsSublet = Dinero(totals.parts.parts.total).add(
- Dinero(totals.parts.sublets.total)
- );
+ const totalPartsSublet = Dinero(totals.parts.parts.total)
+ .add(Dinero(totals.parts.sublets.total))
+ .add(Dinero(totals.additional.towing));
const discrepancy = totalPartsSublet.subtract(billTotals);
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 d23e1d090..e00fa21c3 100644
--- a/client/src/components/job-detail-lines/job-lines.component.jsx
+++ b/client/src/components/job-detail-lines/job-lines.component.jsx
@@ -462,7 +462,7 @@ export function JobLinesComponent({
};
}}
rowSelection={{
- selectedRowKeys: selectedLines.map((item) => item.id),
+ selectedRowKeys: selectedLines.map((item) => item && item.id),
onSelectAll: (selected, selectedRows, changeRows) => {
setSelectedLines(selectedRows);
},
diff --git a/client/src/components/job-reconciliation-modal/job-reconciliation-modal.component.jsx b/client/src/components/job-reconciliation-modal/job-reconciliation-modal.component.jsx
index f817a4e73..cde3abc6c 100644
--- a/client/src/components/job-reconciliation-modal/job-reconciliation-modal.component.jsx
+++ b/client/src/components/job-reconciliation-modal/job-reconciliation-modal.component.jsx
@@ -18,7 +18,11 @@ export default function JobReconciliationModalComponent({ job, bills }) {
.flat() || [];
const jobLineData = job.joblines.filter(
- (j) => j.part_type !== null && j.part_type !== "PAE"
+ (j) =>
+ (j.part_type !== null && j.part_type !== "PAE") ||
+ (j.line_desc &&
+ j.line_desc.toLowerCase().includes("towing") &&
+ j.lbr_op === "OP13")
);
return (
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 59ca3821c..0e1ddc327 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
@@ -60,6 +60,13 @@ export function JobsDetailHeader({ job, bodyshop, disabled }) {
);
}, [job.status, bodyshop.md_ro_statuses.post_production_statuses]);
+ const vehicleTitle = `${job.v_model_yr || ""} ${job.v_color || ""}
+ ${job.v_make_desc || ""}
+ ${job.v_model_desc || ""}`.trim();
+ console.log(
+ "🚀 ~ file: jobs-detail-header.component.jsx ~ line 64 ~ vehicleTitle",
+ vehicleTitle.length
+ );
return (
@@ -188,9 +195,9 @@ export function JobsDetailHeader({ job, bodyshop, disabled }) {
: job.vehicle && `/manage/vehicles/${job.vehicle.id}`
}
>
- {`${job.v_model_yr || ""} ${job.v_color || ""}
- ${job.v_make_desc || ""}
- ${job.v_model_desc || ""}`}
+ {vehicleTitle.length > 0
+ ? vehicleTitle
+ : t("vehicles.labels.novehinfo")}
) : (
diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json
index d8f5825dc..9cee773e8 100644
--- a/client/src/translations/en_us/common.json
+++ b/client/src/translations/en_us/common.json
@@ -2068,6 +2068,7 @@
"labels": "Labels",
"position": "Starting Position"
},
+ "mechanical_authorization": "Mechanical Authorization",
"mpi_animal_checklist": "MPI - Animal Checklist",
"mpi_eglass_auth": "MPI - eGlass Auth",
"mpi_final_acct_sheet": "MPI - Final Accounting Sheet",
@@ -2578,6 +2579,7 @@
},
"labels": {
"fromvehicle": "Historical Vehicle Record",
+ "novehinfo": "No Vehicle Information",
"relatedjobs": "Related Jobs",
"updatevehicle": "Update Vehicle Information"
},
diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json
index 7b695ceef..fffc38b2b 100644
--- a/client/src/translations/es/common.json
+++ b/client/src/translations/es/common.json
@@ -2068,6 +2068,7 @@
"labels": "",
"position": ""
},
+ "mechanical_authorization": "",
"mpi_animal_checklist": "",
"mpi_eglass_auth": "",
"mpi_final_acct_sheet": "",
@@ -2578,6 +2579,7 @@
},
"labels": {
"fromvehicle": "",
+ "novehinfo": "",
"relatedjobs": "",
"updatevehicle": ""
},
diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json
index 7bfc53f31..faf9dfd0b 100644
--- a/client/src/translations/fr/common.json
+++ b/client/src/translations/fr/common.json
@@ -2068,6 +2068,7 @@
"labels": "",
"position": ""
},
+ "mechanical_authorization": "",
"mpi_animal_checklist": "",
"mpi_eglass_auth": "",
"mpi_final_acct_sheet": "",
@@ -2578,6 +2579,7 @@
},
"labels": {
"fromvehicle": "",
+ "novehinfo": "",
"relatedjobs": "",
"updatevehicle": ""
},
diff --git a/client/src/utils/TemplateConstants.js b/client/src/utils/TemplateConstants.js
index b478fd969..8f7db6bad 100644
--- a/client/src/utils/TemplateConstants.js
+++ b/client/src/utils/TemplateConstants.js
@@ -37,6 +37,14 @@ export const TemplateList = (type, context) => {
disabled: false,
group: "authorization",
},
+ mechanical_authorization: {
+ title: i18n.t("printcenter.jobs.mechanical_authorization"),
+ description: "Diagnostic Authorization",
+ subject: i18n.t("printcenter.jobs.mechanical_authorization"),
+ key: "mechanical_authorization",
+ disabled: false,
+ group: "authorization",
+ },
appointment_reminder: {
title: i18n.t("printcenter.jobs.appointment_reminder"),
description: "All Jobs Notes",
diff --git a/server/job/job-totals.js b/server/job/job-totals.js
index 31dc995a6..f6ef1fda6 100644
--- a/server/job/job-totals.js
+++ b/server/job/job-totals.js
@@ -418,21 +418,27 @@ function CalculateAdditional(job) {
pvrt: null,
total: null,
};
+ ret.towing = Dinero({
+ amount: Math.round((job.towing_payable || 0) * 100),
+ });
ret.additionalCosts = job.joblines
.filter((jl) => !jl.removed && IsAdditionalCost(jl))
.reduce((acc, val) => {
const lineValue = Dinero({
amount: Math.round((val.act_price || 0) * 100),
}).multiply(val.part_qty || 1);
- ret.additionalCostItems.push({ key: val.line_desc, total: lineValue });
- return acc.add(lineValue);
+
+ if (val.line_desc.toLowerCase().includes("towing")) {
+ ret.towing = lineValue;
+ return acc;
+ } else {
+ ret.additionalCostItems.push({ key: val.line_desc, total: lineValue });
+ return acc.add(lineValue);
+ }
}, Dinero());
ret.adjustments = Dinero({
amount: Math.round((job.adjustment_bottom_line || 0) * 100),
});
- ret.towing = Dinero({
- amount: Math.round((job.towing_payable || 0) * 100),
- });
ret.storage = Dinero({
amount: Math.round((job.storage_payable || 0) * 100),
});