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