From 2939b5795bf6b3d7a96c6b25ce9900c3b57e7610 Mon Sep 17 00:00:00 2001 From: Dave Date: Wed, 27 Aug 2025 12:35:53 -0400 Subject: [PATCH] feature/IO-3255-simplified-parts-management - Change Parts Status logic for Parts Management --- .../jobs-change-status.component.jsx | 59 ++++++++++++------- .../simplified-parts-jobs-list.component.jsx | 6 +- .../partsManagement/defaultNewShop.json | 9 +++ .../endpoints/vehicleDamageEstimateAddRq.js | 5 +- 4 files changed, 55 insertions(+), 24 deletions(-) diff --git a/client/src/components/jobs-change-status/jobs-change-status.component.jsx b/client/src/components/jobs-change-status/jobs-change-status.component.jsx index c9b2566d2..ad04ee980 100644 --- a/client/src/components/jobs-change-status/jobs-change-status.component.jsx +++ b/client/src/components/jobs-change-status/jobs-change-status.component.jsx @@ -8,19 +8,20 @@ import { createStructuredSelector } from "reselect"; import { useNotification } from "../../contexts/Notifications/notificationContext.jsx"; import { UPDATE_JOB_STATUS } from "../../graphql/jobs.queries"; import { insertAuditTrail } from "../../redux/application/application.actions"; -import { selectJobReadOnly } from "../../redux/application/application.selectors"; +import { selectIsPartsEntry, selectJobReadOnly } from "../../redux/application/application.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, - jobRO: selectJobReadOnly + jobRO: selectJobReadOnly, + isPartsEntry: selectIsPartsEntry }); const mapDispatchToProps = (dispatch) => ({ insertAuditTrail: ({ jobid, operation, type }) => dispatch(insertAuditTrail({ jobid, operation, type })) }); -export function JobsChangeStatus({ job, bodyshop, jobRO, insertAuditTrail }) { +export function JobsChangeStatus({ job, bodyshop, jobRO, insertAuditTrail, isPartsEntry }) { const { t } = useTranslation(); const [availableStatuses, setAvailableStatuses] = useState([]); @@ -45,25 +46,43 @@ export function JobsChangeStatus({ job, bodyshop, jobRO, insertAuditTrail }) { }); }; + // Updates available statuses based on job and bodyshop context useEffect(() => { - //Figure out what scenario were in, populate accodingly - if (job && bodyshop) { - if (bodyshop.md_ro_statuses.pre_production_statuses.includes(job.status)) { - setAvailableStatuses(bodyshop.md_ro_statuses.pre_production_statuses); - } else if (bodyshop.md_ro_statuses.production_statuses.includes(job.status)) { - setAvailableStatuses(bodyshop.md_ro_statuses.production_statuses); - } else if (bodyshop.md_ro_statuses.post_production_statuses.includes(job.status)) { - setAvailableStatuses( - bodyshop.md_ro_statuses.post_production_statuses.filter( - (s) => s !== bodyshop.md_ro_statuses.default_invoiced && s !== bodyshop.md_ro_statuses.default_exported - ) - ); - } else { - console.log("Status didn't match any restrictions. Allowing all status changes."); - setAvailableStatuses(bodyshop.md_ro_statuses.statuses); - } + if (!job || !bodyshop) return; + + const { md_ro_statuses } = bodyshop; + const { + parts_statuses, + pre_production_statuses, + production_statuses, + post_production_statuses, + statuses, + default_invoiced, + default_exported + } = md_ro_statuses; + + if (isPartsEntry) { + // Set parts-specific statuses for parts entry scenario + setAvailableStatuses(parts_statuses); + return; } - }, [job, setAvailableStatuses, bodyshop]); + + // Handle non-parts entry scenarios based on job status + if (pre_production_statuses.includes(job.status)) { + setAvailableStatuses(pre_production_statuses); + } else if (production_statuses.includes(job.status)) { + setAvailableStatuses(production_statuses); + } else if (post_production_statuses.includes(job.status)) { + // Filter out invoiced and exported statuses for post-production + setAvailableStatuses( + post_production_statuses.filter((status) => status !== default_invoiced && status !== default_exported) + ); + } else { + // Default to all statuses if no specific restrictions apply + console.log("Status didn't match any restrictions. Allowing all status changes."); + setAvailableStatuses(statuses); + } + }, [job, bodyshop, isPartsEntry, setAvailableStatuses]); const statusMenu = { items: [ diff --git a/client/src/components/simplified-parts-jobs-list/simplified-parts-jobs-list.component.jsx b/client/src/components/simplified-parts-jobs-list/simplified-parts-jobs-list.component.jsx index 5041ce10f..6b77d5d48 100644 --- a/client/src/components/simplified-parts-jobs-list/simplified-parts-jobs-list.component.jsx +++ b/client/src/components/simplified-parts-jobs-list/simplified-parts-jobs-list.component.jsx @@ -96,13 +96,15 @@ export function SimplifiedPartsJobsListComponent({ key: "status", ellipsis: true, - sorter: search?.search ? (a, b) => statusSort(a.status, b.status, bodyshop.md_ro_statuses.active_statuses) : true, + sorter: search?.search + ? (a, b) => statusSort(a.status, b.status, bodyshop.md_ro_statuses.parts_active_statuses) + : true, sortOrder: sortcolumn === "status" && sortorder, render: (text, record) => { return record.status || t("general.labels.na"); }, filteredValue: filter?.status || null, - filters: bodyshop.md_ro_statuses.statuses.map((s) => { + filters: bodyshop.md_ro_statuses.parts_statuses.map((s) => { return { text: s, value: [s] }; }), onFilter: (value, record) => value.includes(record.status) diff --git a/server/integrations/partsManagement/defaultNewShop.json b/server/integrations/partsManagement/defaultNewShop.json index 281f31dbb..11c7739a1 100644 --- a/server/integrations/partsManagement/defaultNewShop.json +++ b/server/integrations/partsManagement/defaultNewShop.json @@ -35,6 +35,11 @@ "headerMargin": "135" }, "md_ro_statuses": { + "parts_statuses": [ + "Open", + "In Progress", + "Completed" + ], "statuses": [ "Open", "Scheduled", @@ -54,6 +59,10 @@ "Void" ], "default_void": "Void", + "parts_active_statuses": [ + "Open", + "In Progress" + ], "active_statuses": [ "Open", "Scheduled", diff --git a/server/integrations/partsManagement/endpoints/vehicleDamageEstimateAddRq.js b/server/integrations/partsManagement/endpoints/vehicleDamageEstimateAddRq.js index 8970ef5af..cf1c63014 100644 --- a/server/integrations/partsManagement/endpoints/vehicleDamageEstimateAddRq.js +++ b/server/integrations/partsManagement/endpoints/vehicleDamageEstimateAddRq.js @@ -14,7 +14,7 @@ const { } = require("../partsManagement.queries"); // Defaults -const FALLBACK_DEFAULT_ORDER_STATUS = "OPEN"; +const FALLBACK_DEFAULT_ORDER_STATUS = "Open"; /** * Fetches the default order status for a bodyshop. @@ -81,7 +81,8 @@ const extractJobData = (rq) => { scheduled_in: ev.RepairEvent?.RequestedPickUpDateTime || null, scheduled_completion: ev.RepairEvent?.TargetCompletionDateTime || null, clm_no: ci.ClaimNum || null, - status: ci.ClaimStatus || null, + // status: ci.ClaimStatus || null, Proper, setting it default for now + status: FALLBACK_DEFAULT_ORDER_STATUS, policy_no: ci.PolicyInfo?.PolicyInfo?.PolicyNum || ci.PolicyInfo?.PolicyNum || null, ded_amt: parseFloat(ci.PolicyInfo?.CoverageInfo?.Coverage?.DeductibleInfo?.DeductibleAmt || 0) };