diff --git a/client/package-lock.json b/client/package-lock.json index 30de262cd..eb559a8f2 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -21,15 +21,15 @@ "@jsreport/browser-client": "^3.1.0", "@reduxjs/toolkit": "^2.8.2", "@sentry/cli": "^2.46.0", - "@sentry/react": "^9.28.1", + "@sentry/react": "^9.30.0", "@sentry/vite-plugin": "^3.5.0", "@splitsoftware/splitio-react": "^2.3.1", "@tanem/react-nprogress": "^5.0.53", - "antd": "^5.26.0", + "antd": "^5.26.1", "apollo-link-logger": "^2.0.1", "apollo-link-sentry": "^4.3.0", "autosize": "^6.0.1", - "axios": "^1.8.4", + "axios": "^1.10.0", "classnames": "^2.5.1", "css-box-model": "^1.2.1", "dayjs": "^1.11.13", @@ -48,19 +48,19 @@ "memoize-one": "^6.0.0", "normalize-url": "^8.0.2", "object-hash": "^3.0.0", - "phone": "^3.1.59", + "phone": "^3.1.62", "prop-types": "^15.8.1", - "query-string": "^9.2.0", + "query-string": "^9.2.1", "raf-schd": "^4.0.3", "react": "^18.3.1", - "react-big-calendar": "^1.19.3", + "react-big-calendar": "^1.19.4", "react-color": "^2.19.3", "react-cookie": "^8.0.1", "react-dom": "^18.3.1", "react-drag-listview": "^2.0.0", "react-grid-gallery": "^1.0.1", "react-grid-layout": "1.3.4", - "react-i18next": "^15.5.2", + "react-i18next": "^15.5.3", "react-icons": "^5.5.0", "react-image-lightbox": "^5.1.4", "react-markdown": "^10.1.0", @@ -71,7 +71,7 @@ "react-resizable": "^3.0.5", "react-router-dom": "^6.30.0", "react-sticky": "^6.0.3", - "react-virtuoso": "^4.12.8", + "react-virtuoso": "^4.13.0", "recharts": "^2.15.2", "redux": "^5.0.1", "redux-actions": "^3.0.3", @@ -81,7 +81,7 @@ "reselect": "^5.1.1", "sass": "^1.89.2", "socket.io-client": "^4.8.1", - "styled-components": "^6.1.18", + "styled-components": "^6.1.19", "subscriptions-transport-ws": "^0.11.0", "use-memo-one": "^1.1.3", "vite-plugin-ejs": "^1.7.0", @@ -94,7 +94,7 @@ "@dotenvx/dotenvx": "^1.44.2", "@emotion/babel-plugin": "^11.13.5", "@emotion/react": "^11.14.0", - "@eslint/js": "^9.28.0", + "@eslint/js": "^9.29.0", "@playwright/test": "^1.53.0", "@sentry/webpack-plugin": "^3.5.0", "@testing-library/dom": "^10.4.0", @@ -2398,13 +2398,10 @@ } }, "node_modules/@babel/runtime": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", - "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", + "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, "engines": { "node": ">=6.9.0" } @@ -2913,9 +2910,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.28.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.28.0.tgz", - "integrity": "sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==", + "version": "9.29.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.29.0.tgz", + "integrity": "sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==", "dev": true, "license": "MIT", "engines": { @@ -4469,50 +4466,50 @@ "license": "MIT" }, "node_modules/@sentry-internal/browser-utils": { - "version": "9.28.1", - "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-9.28.1.tgz", - "integrity": "sha512-P/FEZkT7UqTw9P/2n/Y4Aa1OtGP6dnCvyqzPPkjiRdVa7Ep7S5ElBJloGv7077TLLBtAfCsEUVRlM1F6/jQoaA==", + "version": "9.30.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-9.30.0.tgz", + "integrity": "sha512-e6ZlN8oWheCB0YJSGlBNUlh6UPnY5Ecj1P+/cgeKBhNm7c3bIx4J50485hB8LQsu+b7Q11L2o/wucZ//Pb6FCg==", "license": "MIT", "dependencies": { - "@sentry/core": "9.28.1" + "@sentry/core": "9.30.0" }, "engines": { "node": ">=18" } }, "node_modules/@sentry-internal/feedback": { - "version": "9.28.1", - "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-9.28.1.tgz", - "integrity": "sha512-HOk/c26D3nlClO/xEefev8fIJzRA621PFQvNFPu/y0Z5HujEqSmIsrff0cXszPPYD95h4Mwk63E0ZYdspdeXcw==", + "version": "9.30.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-9.30.0.tgz", + "integrity": "sha512-qAZ7xxLqZM7GlEvmSUmTHnoueg+fc7esMQD4vH8pS7HI3n9C5MjGn3HHlndRpD8lL7iUUQ0TPZQgU6McbzMDyw==", "license": "MIT", "dependencies": { - "@sentry/core": "9.28.1" + "@sentry/core": "9.30.0" }, "engines": { "node": ">=18" } }, "node_modules/@sentry-internal/replay": { - "version": "9.28.1", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-9.28.1.tgz", - "integrity": "sha512-Tv9pkfAX+1bmhxF42TL0c4uTiK2+rp5LMYEPdz6JBfpfvG/Z1unPGsuB7fQmHYKyfHBQJmi92DZV+smljm7w/g==", + "version": "9.30.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-9.30.0.tgz", + "integrity": "sha512-+6wkqQGLJuFUzvGRzbh3iIhFGyxQx/Oxc0ODDKmz9ag2xYRjCYb3UUQXmQX9navAF0HXUsq8ajoJPm2L1ZyWVg==", "license": "MIT", "dependencies": { - "@sentry-internal/browser-utils": "9.28.1", - "@sentry/core": "9.28.1" + "@sentry-internal/browser-utils": "9.30.0", + "@sentry/core": "9.30.0" }, "engines": { "node": ">=18" } }, "node_modules/@sentry-internal/replay-canvas": { - "version": "9.28.1", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-9.28.1.tgz", - "integrity": "sha512-RtkogfcIpXLFCyV8CTnXmVTH2QauT/KwmUAXBbeOz3rRWsM19yjN1moHrsjxn7OdjTv+D4qWSCA8Ka1aKSpr7g==", + "version": "9.30.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-9.30.0.tgz", + "integrity": "sha512-I4MxS27rfV7vnOU29L80y4baZ4I1XqpnYvC/yLN7C17nA8eDCufQ8WVomli41y8JETnfcxlm68z7CS0sO4RCSA==", "license": "MIT", "dependencies": { - "@sentry-internal/replay": "9.28.1", - "@sentry/core": "9.28.1" + "@sentry-internal/replay": "9.30.0", + "@sentry/core": "9.30.0" }, "engines": { "node": ">=18" @@ -4528,16 +4525,16 @@ } }, "node_modules/@sentry/browser": { - "version": "9.28.1", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-9.28.1.tgz", - "integrity": "sha512-XAS46iQSq8lXTnv9udQP025JTf3PwSVRE9ePJVQhx25QBWxedqGhEOv5qqX9b1Ijf8KiZYXXhBWMQxBBXVzUaw==", + "version": "9.30.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-9.30.0.tgz", + "integrity": "sha512-sRyW6A9nIieTTI26MYXk1DmWEhmphTjZevusNWla+vvUigCmSjuH+xZw19w43OyvF3bu261Skypnm/mAalOTwg==", "license": "MIT", "dependencies": { - "@sentry-internal/browser-utils": "9.28.1", - "@sentry-internal/feedback": "9.28.1", - "@sentry-internal/replay": "9.28.1", - "@sentry-internal/replay-canvas": "9.28.1", - "@sentry/core": "9.28.1" + "@sentry-internal/browser-utils": "9.30.0", + "@sentry-internal/feedback": "9.30.0", + "@sentry-internal/replay": "9.30.0", + "@sentry-internal/replay-canvas": "9.30.0", + "@sentry/core": "9.30.0" }, "engines": { "node": ">=18" @@ -4914,22 +4911,22 @@ } }, "node_modules/@sentry/core": { - "version": "9.28.1", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-9.28.1.tgz", - "integrity": "sha512-6q59r/71MeE+4StkvwdKAAyhBBNpWcii0HeiWBZ3l1gaFYQlb6bChjZJRZmxSzF5dnvkdF4duQbAC3JmjeIbPA==", + "version": "9.30.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-9.30.0.tgz", + "integrity": "sha512-JfEpeQ8a1qVJEb9DxpFTFy1J1gkNdlgKAPiqYGNnm4yQbnfl2Kb/iEo1if70FkiHc52H8fJwISEF90pzMm6lPg==", "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/@sentry/react": { - "version": "9.28.1", - "resolved": "https://registry.npmjs.org/@sentry/react/-/react-9.28.1.tgz", - "integrity": "sha512-XnEURhb2wG7FFCGMuW/IJc8YeDMb9LM7cZSBwBDcplR11mCRsLpf4AGm6K1nWmAn5ZvWrXRO/TBAf9DNRAfnfg==", + "version": "9.30.0", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-9.30.0.tgz", + "integrity": "sha512-asA49AkZ/g9CCeW0eA0Ent0DF60S4k2IHxbu+Q1mqgbRRmbn859oL2Bgsu/EvzWf5edeQtuUml8LIo4YoFwfMA==", "license": "MIT", "dependencies": { - "@sentry/browser": "9.28.1", - "@sentry/core": "9.28.1", + "@sentry/browser": "9.30.0", + "@sentry/core": "9.30.0", "hoist-non-react-statics": "^3.3.2" }, "engines": { @@ -6123,9 +6120,9 @@ } }, "node_modules/antd": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/antd/-/antd-5.26.0.tgz", - "integrity": "sha512-iMPYKFTo2HvIRGutUOuN5AG+Uf+B2QaqcGQbdPp/100fqV3FAil6vFZLVuV3C4XEUOlDNkkUlJKhLR9V5rzIEg==", + "version": "5.26.1", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.26.1.tgz", + "integrity": "sha512-CiLGZ2Ftld+fuoj+U3OL8uouuqUppqFJnW4O/4bOgSWzM9XsJGibpNtUa9QArhrZ5ndfnzlPP/4RVXUK/xfSvQ==", "license": "MIT", "dependencies": { "@ant-design/colors": "^7.2.1", @@ -6585,9 +6582,9 @@ } }, "node_modules/axios": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", + "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -13299,9 +13296,9 @@ "license": "MIT" }, "node_modules/phone": { - "version": "3.1.59", - "resolved": "https://registry.npmjs.org/phone/-/phone-3.1.59.tgz", - "integrity": "sha512-CUv22jw0Zgrb/h7v3sEd262zJXS/66h7zyCCRIynx+2FswAJuuFsXsJkIxMUT4UcosKxDx1bJwdZeGnDELLsCw==", + "version": "3.1.62", + "resolved": "https://registry.npmjs.org/phone/-/phone-3.1.62.tgz", + "integrity": "sha512-mxUdq2nULKg6ukgVr4GSF9/sQiAa6e3AJy2HNE3UJA+lqdEF+Cko2RhKHhZRHtFaLKuBLPptitIwjv0uHG+vhw==", "license": "MIT", "engines": { "node": ">=12" @@ -13613,9 +13610,9 @@ } }, "node_modules/query-string": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-9.2.0.tgz", - "integrity": "sha512-YIRhrHujoQxhexwRLxfy3VSjOXmvZRd2nyw1PwL1UUqZ/ys1dEZd1+NSgXkne2l/4X/7OXkigEAuhTX0g/ivJQ==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-9.2.1.tgz", + "integrity": "sha512-3jTGGLRzlhu/1ws2zlr4Q+GVMLCQTLFOj8CMX5x44cdZG9FQE07x2mQhaNxaKVPNmIDu0mvJ/cEwtY7Pim7hqA==", "license": "MIT", "dependencies": { "decode-uri-component": "^0.4.1", @@ -14314,9 +14311,9 @@ } }, "node_modules/react-big-calendar": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/react-big-calendar/-/react-big-calendar-1.19.3.tgz", - "integrity": "sha512-+P/9X54QxvBcbJhtyxSBoXEj3enSXSxJw76RWlP8IUhHUQQREpwdzld0dcJpfDTvp8c/aFzzKx7KZjZtiOusdA==", + "version": "1.19.4", + "resolved": "https://registry.npmjs.org/react-big-calendar/-/react-big-calendar-1.19.4.tgz", + "integrity": "sha512-FrvbDx2LF6JAWFD96LU1jjloppC5OgIvMYUYIPzAw5Aq+ArYFPxAjLqXc4DyxfsQDN0TJTMuS/BIbcSB7Pg0YA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.7", @@ -14444,12 +14441,12 @@ } }, "node_modules/react-i18next": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.5.2.tgz", - "integrity": "sha512-ePODyXgmZQAOYTbZXQn5rRsSBu3Gszo69jxW6aKmlSgxKAI1fOhDwSu6bT4EKHciWPKQ7v7lPrjeiadR6Gi+1A==", + "version": "15.5.3", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.5.3.tgz", + "integrity": "sha512-ypYmOKOnjqPEJZO4m1BI0kS8kWqkBNsKYyhVUfij0gvjy9xJNoG/VcGkxq5dRlVwzmrmY1BQMAmpbbUBLwC4Kw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.0", + "@babel/runtime": "^7.27.6", "html-parse-stringify": "^3.0.1" }, "peerDependencies": { @@ -14742,9 +14739,9 @@ } }, "node_modules/react-virtuoso": { - "version": "4.12.8", - "resolved": "https://registry.npmjs.org/react-virtuoso/-/react-virtuoso-4.12.8.tgz", - "integrity": "sha512-NMMKfDBr/+xZZqCQF3tN1SZsh6FwOJkYgThlfnsPLkaEhdyQo0EuWUzu3ix6qjnI7rYwJhMwRGoJBi+aiDfGsA==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/react-virtuoso/-/react-virtuoso-4.13.0.tgz", + "integrity": "sha512-XHv2Fglpx80yFPdjZkV9d1baACKghg/ucpDFEXwaix7z0AfVQj+mF6lM+YQR6UC/TwzXG2rJKydRMb3+7iV3PA==", "license": "MIT", "peerDependencies": { "react": ">=16 || >=17 || >= 18 || >= 19", @@ -14981,12 +14978,6 @@ "node": ">=4" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "license": "MIT" - }, "node_modules/regenerator-transform": { "version": "0.15.2", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", @@ -16339,9 +16330,9 @@ } }, "node_modules/styled-components": { - "version": "6.1.18", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.18.tgz", - "integrity": "sha512-Mvf3gJFzZCkhjY2Y/Fx9z1m3dxbza0uI9H1CbNZm/jSHCojzJhQ0R7bByrlFJINnMzz/gPulpoFFGymNwrsMcw==", + "version": "6.1.19", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.19.tgz", + "integrity": "sha512-1v/e3Dl1BknC37cXMhwGomhO8AkYmN41CqyX9xhUDxry1ns3BFQy2lLDRQXJRdVVWB9OHemv/53xaStimvWyuA==", "license": "MIT", "dependencies": { "@emotion/is-prop-valid": "1.2.2", diff --git a/client/package.json b/client/package.json index 39205af35..c85b2eb5f 100644 --- a/client/package.json +++ b/client/package.json @@ -20,15 +20,15 @@ "@jsreport/browser-client": "^3.1.0", "@reduxjs/toolkit": "^2.8.2", "@sentry/cli": "^2.46.0", - "@sentry/react": "^9.28.1", + "@sentry/react": "^9.30.0", "@sentry/vite-plugin": "^3.5.0", "@splitsoftware/splitio-react": "^2.3.1", "@tanem/react-nprogress": "^5.0.53", - "antd": "^5.26.0", + "antd": "^5.26.1", "apollo-link-logger": "^2.0.1", "apollo-link-sentry": "^4.3.0", "autosize": "^6.0.1", - "axios": "^1.8.4", + "axios": "^1.10.0", "classnames": "^2.5.1", "css-box-model": "^1.2.1", "dayjs": "^1.11.13", @@ -47,19 +47,19 @@ "memoize-one": "^6.0.0", "normalize-url": "^8.0.2", "object-hash": "^3.0.0", - "phone": "^3.1.59", + "phone": "^3.1.62", "prop-types": "^15.8.1", - "query-string": "^9.2.0", + "query-string": "^9.2.1", "raf-schd": "^4.0.3", "react": "^18.3.1", - "react-big-calendar": "^1.19.3", + "react-big-calendar": "^1.19.4", "react-color": "^2.19.3", "react-cookie": "^8.0.1", "react-dom": "^18.3.1", "react-drag-listview": "^2.0.0", "react-grid-gallery": "^1.0.1", "react-grid-layout": "1.3.4", - "react-i18next": "^15.5.2", + "react-i18next": "^15.5.3", "react-icons": "^5.5.0", "react-image-lightbox": "^5.1.4", "react-markdown": "^10.1.0", @@ -70,7 +70,7 @@ "react-resizable": "^3.0.5", "react-router-dom": "^6.30.0", "react-sticky": "^6.0.3", - "react-virtuoso": "^4.12.8", + "react-virtuoso": "^4.13.0", "recharts": "^2.15.2", "redux": "^5.0.1", "redux-actions": "^3.0.3", @@ -80,7 +80,7 @@ "reselect": "^5.1.1", "sass": "^1.89.2", "socket.io-client": "^4.8.1", - "styled-components": "^6.1.18", + "styled-components": "^6.1.19", "subscriptions-transport-ws": "^0.11.0", "use-memo-one": "^1.1.3", "vite-plugin-ejs": "^1.7.0", @@ -134,7 +134,7 @@ "@dotenvx/dotenvx": "^1.44.2", "@emotion/babel-plugin": "^11.13.5", "@emotion/react": "^11.14.0", - "@eslint/js": "^9.28.0", + "@eslint/js": "^9.29.0", "@playwright/test": "^1.53.0", "@sentry/webpack-plugin": "^3.5.0", "@testing-library/dom": "^10.4.0", diff --git a/client/src/pages/simplified-parts-jobs-detail/simplified-parts-jobs-detail.component.jsx b/client/src/pages/simplified-parts-jobs-detail/simplified-parts-jobs-detail.component.jsx index faff65ce0..195f1da18 100644 --- a/client/src/pages/simplified-parts-jobs-detail/simplified-parts-jobs-detail.component.jsx +++ b/client/src/pages/simplified-parts-jobs-detail/simplified-parts-jobs-detail.component.jsx @@ -2,8 +2,6 @@ import { BarsOutlined, PrinterFilled, SyncOutlined, ToolFilled } from "@ant-desi import { PageHeader } from "@ant-design/pro-layout"; import { useQuery } from "@apollo/client"; import { Button, Divider, Form, Space, Tabs } from "antd"; -import Axios from "axios"; -import _ from "lodash"; import queryString from "query-string"; import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; @@ -25,11 +23,6 @@ import { insertAuditTrail } from "../../redux/application/application.actions.js import { selectJobReadOnly } from "../../redux/application/application.selectors.js"; import { setModalContext } from "../../redux/modals/modals.actions.js"; import { selectBodyshop } from "../../redux/user/user.selectors.js"; -import AuditTrailMapping from "../../utils/AuditTrailMappings.js"; -import { DateTimeFormat } from "../../utils/DateFormatter.jsx"; -import dayjs from "../../utils/day.js"; -import UndefinedToNull from "../../utils/undefinedtonull.js"; -import { transformJobToForm } from "../jobs-detail/jobs-detail.page.component.jsx"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, diff --git a/client/src/pages/simplified-parts/simplified-parts.page.component.jsx b/client/src/pages/simplified-parts/simplified-parts.page.component.jsx index a7a30c198..5180feaff 100644 --- a/client/src/pages/simplified-parts/simplified-parts.page.component.jsx +++ b/client/src/pages/simplified-parts/simplified-parts.page.component.jsx @@ -9,7 +9,6 @@ import { createStructuredSelector } from "reselect"; import BreadCrumbs from "../../components/breadcrumbs/breadcrumbs.component.jsx"; import ConflictComponent from "../../components/conflict/conflict.component.jsx"; import ErrorBoundary from "../../components/error-boundary/error-boundary.component.jsx"; -import HeaderContainer from "../../components/header/header.container.jsx"; import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component.jsx"; import PrintCenterModalContainer from "../../components/print-center-modal/print-center-modal.container.jsx"; import ShopSubStatusComponent from "../../components/shop-sub-status/shop-sub-status.component.jsx"; @@ -208,50 +207,48 @@ export function SimplifiedPartsPage({ conflict, bodyshop, alerts, setAlerts }) { }; return ( - <> - - - {/* */} - - } showDialog> - {PageContent} - - - - - - + + + {/* */} + + } showDialog> + {PageContent} + + + + + ); } diff --git a/package-lock.json b/package-lock.json index 184fcfe4b..e99e38a05 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,23 +9,23 @@ "version": "0.2.0", "license": "UNLICENSED", "dependencies": { - "@aws-sdk/client-cloudwatch-logs": "^3.828.0", - "@aws-sdk/client-elasticache": "^3.828.0", - "@aws-sdk/client-s3": "^3.828.0", - "@aws-sdk/client-secrets-manager": "^3.828.0", - "@aws-sdk/client-ses": "^3.828.0", - "@aws-sdk/credential-provider-node": "^3.828.0", - "@aws-sdk/lib-storage": "^3.828.0", - "@aws-sdk/s3-request-presigner": "^3.828.0", + "@aws-sdk/client-cloudwatch-logs": "^3.830.0", + "@aws-sdk/client-elasticache": "^3.830.0", + "@aws-sdk/client-s3": "^3.830.0", + "@aws-sdk/client-secrets-manager": "^3.830.0", + "@aws-sdk/client-ses": "^3.830.0", + "@aws-sdk/credential-provider-node": "^3.830.0", + "@aws-sdk/lib-storage": "^3.830.0", + "@aws-sdk/s3-request-presigner": "^3.830.0", "@opensearch-project/opensearch": "^2.13.0", "@socket.io/admin-ui": "^0.5.1", "@socket.io/redis-adapter": "^8.3.0", "archiver": "^7.0.1", "aws4": "^1.13.2", - "axios": "^1.8.4", + "axios": "^1.10.0", "better-queue": "^3.8.12", - "bullmq": "^5.53.2", - "chart.js": "^4.4.8", + "bullmq": "^5.54.2", + "chart.js": "^4.5.0", "cloudinary": "^2.6.1", "compression": "^1.8.0", "cookie-parser": "^1.4.7", @@ -49,7 +49,7 @@ "multer": "^1.4.5-lts.1", "node-persist": "^4.0.4", "nodemailer": "^6.10.0", - "phone": "^3.1.58", + "phone": "^3.1.62", "query-string": "7.1.3", "recursive-diff": "^1.0.9", "rimraf": "^6.0.1", @@ -66,8 +66,8 @@ "xmlbuilder2": "^3.1.1" }, "devDependencies": { - "@eslint/js": "^9.28.0", - "eslint": "^9.28.0", + "@eslint/js": "^9.29.0", + "eslint": "^9.29.0", "eslint-plugin-react": "^7.37.5", "globals": "^15.15.0", "mock-require": "^3.0.3", @@ -284,15 +284,15 @@ } }, "node_modules/@aws-sdk/client-cloudwatch-logs": { - "version": "3.828.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.828.0.tgz", - "integrity": "sha512-EeDYXwwWv+1Xk5lVehpf+9SH0N2xMU1ypJ9o7ifYL/G4dXI0us7k23Ds0UHescziQMFJKGJ9yAmCTY791QAsyw==", + "version": "3.830.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.830.0.tgz", + "integrity": "sha512-jg4kpECjBcNemGtVr5IK3ZMKRZzrmG4VbxhgECHgxqNPgb+HeAcSOMa3ZsgStRnpwDEazfgYTJyBktZIC/XuuA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.826.0", - "@aws-sdk/credential-provider-node": "3.828.0", + "@aws-sdk/credential-provider-node": "3.830.0", "@aws-sdk/middleware-host-header": "3.821.0", "@aws-sdk/middleware-logger": "3.821.0", "@aws-sdk/middleware-recursion-detection": "3.821.0", @@ -352,15 +352,15 @@ } }, "node_modules/@aws-sdk/client-elasticache": { - "version": "3.828.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-elasticache/-/client-elasticache-3.828.0.tgz", - "integrity": "sha512-N9mJwke+ax96Oc50fnrH2jiQrqMAJkTi7iK+eJiiN3Pu1eXvCYAvtz2Vf66/55Me7lfjV0xyrXSIhF9YgcI0uw==", + "version": "3.830.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-elasticache/-/client-elasticache-3.830.0.tgz", + "integrity": "sha512-ln7OISYRUasEL54B0+UEeJLISd3vG2zkdRCCIEVUzh7SOGiHADgCaQAk6WFiGAy4F9uGUWiI5qDkvddTBZT3tw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.826.0", - "@aws-sdk/credential-provider-node": "3.828.0", + "@aws-sdk/credential-provider-node": "3.830.0", "@aws-sdk/middleware-host-header": "3.821.0", "@aws-sdk/middleware-logger": "3.821.0", "@aws-sdk/middleware-recursion-detection": "3.821.0", @@ -403,17 +403,17 @@ } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.828.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.828.0.tgz", - "integrity": "sha512-TvFyrEfJkf9NN3cq5mXCgFv/sPaA8Rm5tEPgV5emuLedeGsORlWmVpdSKqfZ4lSoED1tMfNM6LY4uA9D8/RS5g==", + "version": "3.830.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.830.0.tgz", + "integrity": "sha512-Cti+zj1lqvQIScXFQv8/t1xo3pvcvk/ObmGIbyLzfgcYpKMHaIWhzhi6aN+z4dYEv1EwrukC9tNoqScyShc5tw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.826.0", - "@aws-sdk/credential-provider-node": "3.828.0", - "@aws-sdk/middleware-bucket-endpoint": "3.821.0", + "@aws-sdk/credential-provider-node": "3.830.0", + "@aws-sdk/middleware-bucket-endpoint": "3.830.0", "@aws-sdk/middleware-expect-continue": "3.821.0", "@aws-sdk/middleware-flexible-checksums": "3.826.0", "@aws-sdk/middleware-host-header": "3.821.0", @@ -470,15 +470,15 @@ } }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.828.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.828.0.tgz", - "integrity": "sha512-q6PO03nzWn4DCaZjwobB9GPjhaF2C0PUeCsmqymNbSjMPn1rVgpi1fbeCE6ZnS2jmv1lOF6FTAXfG0cGF+iT4Q==", + "version": "3.830.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.830.0.tgz", + "integrity": "sha512-St2EK5i91vwv9LmDUmWevZYl+Y/TYRP/AHm7gxZm1LkEf1VEjkSizUMm91JOnH6y+0Clok9mqe6jZ/XossMXlw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.826.0", - "@aws-sdk/credential-provider-node": "3.828.0", + "@aws-sdk/credential-provider-node": "3.830.0", "@aws-sdk/middleware-host-header": "3.821.0", "@aws-sdk/middleware-logger": "3.821.0", "@aws-sdk/middleware-recursion-detection": "3.821.0", @@ -535,15 +535,15 @@ } }, "node_modules/@aws-sdk/client-ses": { - "version": "3.828.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ses/-/client-ses-3.828.0.tgz", - "integrity": "sha512-j2w9HugNIJUA202o9YKGuN84GY+swNIjHch6vSrpARYISkzUr+zIYp7u/ygmUjeBtsnjM6RsmGU7miGs9Xt7bA==", + "version": "3.830.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ses/-/client-ses-3.830.0.tgz", + "integrity": "sha512-Y2XaJkqHJ7qM4cpCw3YS96fMZgT44mP3HLP+9dU0ct29L+iwf3zhigJGQzakieMdJfuTFZe7Vi6s1RbcWv5v5w==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.826.0", - "@aws-sdk/credential-provider-node": "3.828.0", + "@aws-sdk/credential-provider-node": "3.830.0", "@aws-sdk/middleware-host-header": "3.821.0", "@aws-sdk/middleware-logger": "3.821.0", "@aws-sdk/middleware-recursion-detection": "3.821.0", @@ -586,9 +586,9 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.828.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.828.0.tgz", - "integrity": "sha512-qxw8JcPTaFaBwTBUr4YmLajaMh3En65SuBWAKEtjctbITRRekzR7tvr/TkwoyVOh+XoAtkwOn+BQeQbX+/wgHw==", + "version": "3.830.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.830.0.tgz", + "integrity": "sha512-5zCEpfI+zwX2SIa258L+TItNbBoAvQQ6w74qdFM6YJufQ1F9tvwjTX8T+eSTT9nsFIvfYnUaGalWwJVfmJUgVQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -698,18 +698,18 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.828.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.828.0.tgz", - "integrity": "sha512-T3DJMo2/j7gCPpFg2+xEHWgua05t8WP89ye7PaZxA2Fc6CgScHkZsJZTri1QQIU2h+eOZ75EZWkeFLIPgN0kRQ==", + "version": "3.830.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.830.0.tgz", + "integrity": "sha512-zeQenzvh8JRY5nULd8izdjVGoCM1tgsVVsrLSwDkHxZTTW0hW/bmOmXfvdaE0wDdomXW7m2CkQDSmP7XdvNXZg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.826.0", "@aws-sdk/credential-provider-env": "3.826.0", "@aws-sdk/credential-provider-http": "3.826.0", "@aws-sdk/credential-provider-process": "3.826.0", - "@aws-sdk/credential-provider-sso": "3.828.0", - "@aws-sdk/credential-provider-web-identity": "3.828.0", - "@aws-sdk/nested-clients": "3.828.0", + "@aws-sdk/credential-provider-sso": "3.830.0", + "@aws-sdk/credential-provider-web-identity": "3.830.0", + "@aws-sdk/nested-clients": "3.830.0", "@aws-sdk/types": "3.821.0", "@smithy/credential-provider-imds": "^4.0.6", "@smithy/property-provider": "^4.0.4", @@ -722,17 +722,17 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.828.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.828.0.tgz", - "integrity": "sha512-9z3iPwVYOQYNzVZj8qycZaS/BOSKRXWA+QVNQlfEnQ4sA4sOcKR4kmV2h+rJcuBsSFfmOF62ZDxyIBGvvM4t/w==", + "version": "3.830.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.830.0.tgz", + "integrity": "sha512-X/2LrTgwtK1pkWrvofxQBI8VTi6QVLtSMpsKKPPnJQ0vgqC0e4czSIs3ZxiEsOkCBaQ2usXSiKyh0ccsQ6k2OA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.826.0", "@aws-sdk/credential-provider-http": "3.826.0", - "@aws-sdk/credential-provider-ini": "3.828.0", + "@aws-sdk/credential-provider-ini": "3.830.0", "@aws-sdk/credential-provider-process": "3.826.0", - "@aws-sdk/credential-provider-sso": "3.828.0", - "@aws-sdk/credential-provider-web-identity": "3.828.0", + "@aws-sdk/credential-provider-sso": "3.830.0", + "@aws-sdk/credential-provider-web-identity": "3.830.0", "@aws-sdk/types": "3.821.0", "@smithy/credential-provider-imds": "^4.0.6", "@smithy/property-provider": "^4.0.4", @@ -762,14 +762,14 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.828.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.828.0.tgz", - "integrity": "sha512-9CEAXzUDSzOjOCb3XfM15TZhTaM+l07kumZyx2z8NC6T2U4qbCJqn4h8mFlRvYrs6cBj2SN40sD3r5Wp0Cq2Kw==", + "version": "3.830.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.830.0.tgz", + "integrity": "sha512-+VdRpZmfekzpySqZikAKx6l5ndnLGluioIgUG4ZznrButgFD/iogzFtGmBDFB3ZLViX1l4pMXru0zFwJEZT21Q==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.828.0", + "@aws-sdk/client-sso": "3.830.0", "@aws-sdk/core": "3.826.0", - "@aws-sdk/token-providers": "3.828.0", + "@aws-sdk/token-providers": "3.830.0", "@aws-sdk/types": "3.821.0", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", @@ -781,13 +781,13 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.828.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.828.0.tgz", - "integrity": "sha512-MguDhGHlQBeK9CQ/P4NOY0whAJ4HJU4x+f1dphg3I1sGlccFqfB8Moor2vXNKu0Th2kvAwkn9pr7gGb/+NGR9g==", + "version": "3.830.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.830.0.tgz", + "integrity": "sha512-hPYrKsZeeOdLROJ59T6Y8yZ0iwC/60L3qhZXjapBFjbqBtMaQiMTI645K6xVXBioA6vxXq7B4aLOhYqk6Fy/Ww==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.826.0", - "@aws-sdk/nested-clients": "3.828.0", + "@aws-sdk/nested-clients": "3.830.0", "@aws-sdk/types": "3.821.0", "@smithy/property-provider": "^4.0.4", "@smithy/types": "^4.3.1", @@ -798,9 +798,9 @@ } }, "node_modules/@aws-sdk/lib-storage": { - "version": "3.828.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.828.0.tgz", - "integrity": "sha512-nBJmRzveYtdqL0u76tv62JGtkUfvyyZhAKNHFlzO8lCO7lxa0muRTG/ptUSS0ruFHq1K2MXHnDtLX90xiErIsQ==", + "version": "3.830.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.830.0.tgz", + "integrity": "sha512-jHNM1HhOmwMB5sguttXozL1HiDPf0yovu2o2L3ijMvexSUlrtqE2b2JjevMfVq7xZ5RYhBnQ+T8Q4MUclI8GnQ==", "license": "Apache-2.0", "dependencies": { "@smithy/abort-controller": "^4.0.4", @@ -815,13 +815,13 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-s3": "^3.828.0" + "@aws-sdk/client-s3": "^3.830.0" } }, "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.821.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.821.0.tgz", - "integrity": "sha512-cebgeytKlWOgGczLo3BPvNY9XlzAzGZQANSysgJ2/8PSldmUpXRIF+GKPXDVhXeInWYHIfB8zZi3RqrPoXcNYQ==", + "version": "3.830.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.830.0.tgz", + "integrity": "sha512-ElVeCReZSH5Ds+/pkL5ebneJjuo8f49e9JXV1cYizuH0OAOQfYaBU9+M+7+rn61pTttOFE8W//qKzrXBBJhfMg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.821.0", @@ -991,9 +991,9 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.828.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.828.0.tgz", - "integrity": "sha512-xmeOILiR9LvfC8MctgeRXXN8nQTwbOvO4wHvgE8tDRsjnBpyyO0j50R4+viHXdMUGtgGkHEXRv8fFNBq54RgnA==", + "version": "3.830.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.830.0.tgz", + "integrity": "sha512-5N5YTlBr1vtxf7+t+UaIQ625KEAmm7fY9o1e3MgGOi/paBoI0+axr3ud24qLIy0NSzFlAHEaxUSWxcERNjIoZw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -1057,9 +1057,9 @@ } }, "node_modules/@aws-sdk/s3-request-presigner": { - "version": "3.828.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.828.0.tgz", - "integrity": "sha512-6817h11Xi6LqnmTnHIwZf4PQB0rIMaRFwkq8/mfR9oOn+hsahxBVDbpgu+q4xzP5q+W3m5Y/din0cJPVrnP6yQ==", + "version": "3.830.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.830.0.tgz", + "integrity": "sha512-IEiSJfuf/hcf9WvCmvV35ci1yGcV3IYKS0e6l5xPRLYDNBrAWao9j8mrp0N4WCD3Nr+3xZRY5JglEFAH6CN3OQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/signature-v4-multi-region": "3.826.0", @@ -1093,13 +1093,13 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.828.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.828.0.tgz", - "integrity": "sha512-JdOjI/TxkfQpY/bWbdGMdCiePESXTbtl6MfnJxz35zZ3tfHvBnxAWCoYJirdmjzY/j/dFo5oEyS6mQuXAG9w2w==", + "version": "3.830.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.830.0.tgz", + "integrity": "sha512-aJ4guFwj92nV9D+EgJPaCFKK0I3y2uMchiDfh69Zqnmwfxxxfxat6F79VA7PS0BdbjRfhLbn+Ghjftnomu2c1g==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.826.0", - "@aws-sdk/nested-clients": "3.828.0", + "@aws-sdk/nested-clients": "3.830.0", "@aws-sdk/types": "3.821.0", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", @@ -1806,9 +1806,9 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", - "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.1.tgz", + "integrity": "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1881,9 +1881,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.28.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.28.0.tgz", - "integrity": "sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==", + "version": "9.29.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.29.0.tgz", + "integrity": "sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==", "dev": true, "license": "MIT", "engines": { @@ -4054,9 +4054,9 @@ } }, "node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -4472,9 +4472,9 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", + "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -4659,9 +4659,9 @@ } }, "node_modules/bullmq": { - "version": "5.53.2", - "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.53.2.tgz", - "integrity": "sha512-xHgxrP/yNJHD7VCw1h+eRBh+2TCPBCM39uC9gCyksYc6ufcJP+HTZ/A2lzB2x7qMFWrvsX7tM40AT2BmdkYL/Q==", + "version": "5.54.2", + "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.54.2.tgz", + "integrity": "sha512-Qm75wtgKLP1FH92N+l01D1AErX+uLdMlfadvY2XMBmE4gx5qeTbat4b2Zil1U82Ipqn5Vz7kpNE0cgw/hznAGA==", "license": "MIT", "dependencies": { "cron-parser": "^4.9.0", @@ -4817,9 +4817,9 @@ } }, "node_modules/chart.js": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.9.tgz", - "integrity": "sha512-EyZ9wWKgpAU0fLJ43YAEIF8sr5F2W3LqbS40ZJyHIner2lY14ufqv2VMp69MAiZ2rpwxEUxEhIH/0U3xyRynxg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.0.tgz", + "integrity": "sha512-aYeC/jDgSEx8SHWZvANYMioYMZ2KX02W6f6uVfyteuCGcadDLcYVHdfdygsTQkQ4TKn5lghoojAsPj5pu0SnvQ==", "license": "MIT", "dependencies": { "@kurkle/color": "^0.3.0" @@ -6273,19 +6273,19 @@ } }, "node_modules/eslint": { - "version": "9.28.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.28.0.tgz", - "integrity": "sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==", + "version": "9.29.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.29.0.tgz", + "integrity": "sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.20.0", + "@eslint/config-array": "^0.20.1", "@eslint/config-helpers": "^0.2.1", "@eslint/core": "^0.14.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.29.0", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -6297,9 +6297,9 @@ "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.3.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -6377,9 +6377,9 @@ } }, "node_modules/eslint-scope": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", - "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -6394,9 +6394,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -6407,15 +6407,15 @@ } }, "node_modules/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.14.0", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -9726,9 +9726,9 @@ } }, "node_modules/phone": { - "version": "3.1.59", - "resolved": "https://registry.npmjs.org/phone/-/phone-3.1.59.tgz", - "integrity": "sha512-CUv22jw0Zgrb/h7v3sEd262zJXS/66h7zyCCRIynx+2FswAJuuFsXsJkIxMUT4UcosKxDx1bJwdZeGnDELLsCw==", + "version": "3.1.62", + "resolved": "https://registry.npmjs.org/phone/-/phone-3.1.62.tgz", + "integrity": "sha512-mxUdq2nULKg6ukgVr4GSF9/sQiAa6e3AJy2HNE3UJA+lqdEF+Cko2RhKHhZRHtFaLKuBLPptitIwjv0uHG+vhw==", "license": "MIT", "engines": { "node": ">=12" diff --git a/package.json b/package.json index 6a905c90b..951fc588a 100644 --- a/package.json +++ b/package.json @@ -16,23 +16,23 @@ "job-totals-fixtures:local": "docker exec node-app /usr/bin/node /app/download-job-totals-fixtures.js" }, "dependencies": { - "@aws-sdk/client-cloudwatch-logs": "^3.828.0", - "@aws-sdk/client-elasticache": "^3.828.0", - "@aws-sdk/client-s3": "^3.828.0", - "@aws-sdk/client-secrets-manager": "^3.828.0", - "@aws-sdk/client-ses": "^3.828.0", - "@aws-sdk/credential-provider-node": "^3.828.0", - "@aws-sdk/lib-storage": "^3.828.0", - "@aws-sdk/s3-request-presigner": "^3.828.0", + "@aws-sdk/client-cloudwatch-logs": "^3.830.0", + "@aws-sdk/client-elasticache": "^3.830.0", + "@aws-sdk/client-s3": "^3.830.0", + "@aws-sdk/client-secrets-manager": "^3.830.0", + "@aws-sdk/client-ses": "^3.830.0", + "@aws-sdk/credential-provider-node": "^3.830.0", + "@aws-sdk/lib-storage": "^3.830.0", + "@aws-sdk/s3-request-presigner": "^3.830.0", "@opensearch-project/opensearch": "^2.13.0", "@socket.io/admin-ui": "^0.5.1", "@socket.io/redis-adapter": "^8.3.0", "archiver": "^7.0.1", "aws4": "^1.13.2", - "axios": "^1.8.4", + "axios": "^1.10.0", "better-queue": "^3.8.12", - "bullmq": "^5.53.2", - "chart.js": "^4.4.8", + "bullmq": "^5.54.2", + "chart.js": "^4.5.0", "cloudinary": "^2.6.1", "compression": "^1.8.0", "cookie-parser": "^1.4.7", @@ -56,7 +56,7 @@ "multer": "^1.4.5-lts.1", "node-persist": "^4.0.4", "nodemailer": "^6.10.0", - "phone": "^3.1.58", + "phone": "^3.1.62", "query-string": "7.1.3", "recursive-diff": "^1.0.9", "rimraf": "^6.0.1", @@ -73,8 +73,8 @@ "xmlbuilder2": "^3.1.1" }, "devDependencies": { - "@eslint/js": "^9.28.0", - "eslint": "^9.28.0", + "@eslint/js": "^9.29.0", + "eslint": "^9.29.0", "eslint-plugin-react": "^7.37.5", "globals": "^15.15.0", "mock-require": "^3.0.3", diff --git a/server/integrations/partsManagement/partsManagementProvisioning.js b/server/integrations/partsManagement/partsManagementProvisioning.js index 8e2213bdf..4fe5970e9 100644 --- a/server/integrations/partsManagement/partsManagementProvisioning.js +++ b/server/integrations/partsManagement/partsManagementProvisioning.js @@ -1,4 +1,3 @@ -const crypto = require("crypto"); const admin = require("firebase-admin"); const client = require("../../graphql-client/graphql-client").client; const DefaultNewShop = require("./defaultNewShop.json"); @@ -243,11 +242,17 @@ const partsManagementProvisioning = async (req, res) => { // Cleanup on failure if (err.userRecord) { - await deleteFirebaseUser(err.userRecord.uid).catch(() => {}); + await deleteFirebaseUser(err.userRecord.uid).catch(() => { + // Ignore errors during user deletion cleanup + }); } if (err.newShopId) { - await deleteVendorsByShop(err.newShopId).catch(() => {}); - await deleteBodyshop(err.newShopId).catch(() => {}); + await deleteVendorsByShop(err.newShopId).catch(() => { + // Ignore errors during vendor deletion cleanup + }); + await deleteBodyshop(err.newShopId).catch(() => { + // Ignore errors during shop deletion cleanup + }); } return res.status(err.status || 500).json({ error: err.message || "Internal server error" }); diff --git a/server/integrations/partsManagement/partsManagementVehicleDamageEstimateAddRq.js b/server/integrations/partsManagement/partsManagementVehicleDamageEstimateAddRq.js new file mode 100644 index 000000000..03a68ca0d --- /dev/null +++ b/server/integrations/partsManagement/partsManagementVehicleDamageEstimateAddRq.js @@ -0,0 +1,356 @@ +const xml2js = require("xml2js"); +const client = require("../../graphql-client/graphql-client").client; + +// GraphQL statements +const INSERT_JOB_WITH_LINES = ` + mutation InsertJob($job: jobs_insert_input!) { + insert_jobs_one(object: $job) { + id + joblines { id unq_seq } + } + } +`; + +const INSERT_PARTS_ORDERS = ` + mutation InsertPartsOrders($po: [parts_orders_insert_input!]!) { + insert_parts_orders(objects: $po) { + returning { id order_number } + } + } +`; + +/** + * Handles incoming VehicleDamageEstimateAddRq XML, + * parses every known field, inserts a Job + nested JobLines, + * then any PartsOrders (grouped per SupplierRefNum). + */ +const partsManagementVehicleDamageEstimateAddRq = async (req, res) => { + const { logger } = req; + const xml = req.body; + + let payload; + try { + payload = await xml2js.parseStringPromise(xml, { + explicitArray: false, + tagNameProcessors: [xml2js.processors.stripPrefix] + }); + logger.log("parts-xml-parse", "debug", null, null, { success: true }); + } catch (err) { + logger.log("parts-xml-parse-error", "error", null, null, { error: err }); + return res.status(400).send("Invalid XML"); + } + + const rq = payload.VehicleDamageEstimateAddRq; + if (!rq) { + logger.log("parts-missing-root", "error"); + return res.status(400).send("Missing "); + } + + try { + // + // ── SHOP ID ─────────────────────────────────────────────────────────────────── + // + // pulled directly from in your XML + // + const shopId = rq.ShopID || rq.shopId; + if (!shopId) { + throw { status: 400, message: "Missing in XML" }; + } + + // + // ── DOCUMENT INFO ───────────────────────────────────────────────────────────── + // + const { RqUID, RefClaimNum } = rq; + const doc = rq.DocumentInfo || {}; + const comment = doc.Comment || null; + const transmitDate = doc.TransmitDateTime || null; + + // capture all entries + const docVers = doc.DocumentVer ? (Array.isArray(doc.DocumentVer) ? doc.DocumentVer : [doc.DocumentVer]) : []; + const documentVersions = docVers.map((dv) => ({ + code: dv.DocumentVerCode, + num: dv.DocumentVerNum + })); + + // pull out any OtherReferenceInfo (RO Number + Job UUID) + const otherRefs = doc.ReferenceInfo?.OtherReferenceInfo + ? Array.isArray(doc.ReferenceInfo.OtherReferenceInfo) + ? doc.ReferenceInfo.OtherReferenceInfo + : [doc.ReferenceInfo.OtherReferenceInfo] + : []; + const originalRoNumber = otherRefs.find((r) => r.OtherReferenceName === "RO Number")?.OtherRefNum; + const originalJobUuid = otherRefs.find((r) => r.OtherReferenceName === "Job UUID")?.OtherRefNum; + + // + // ── EVENT INFO ──────────────────────────────────────────────────────────────── + // + const ev = rq.EventInfo || {}; + const assignEv = ev.AssignmentEvent || {}; + const assignmentEvent = { + number: assignEv.AssignmentNumber, + type: assignEv.AssignmentType, + date: assignEv.AssignmentDate, + createdAt: assignEv.CreateDateTime + }; + const repairEv = ev.RepairEvent || {}; + const scheduled_completion = repairEv.TargetCompletionDateTime || null; + const scheduled_in = repairEv.RequestedPickUpDateTime || null; + + // + // ── CLAIM INFO ──────────────────────────────────────────────────────────────── + // + const ci = rq.ClaimInfo || {}; + const clm_no = ci.ClaimNum; + const ClaimStatus = ci.ClaimStatus || null; + const policy_no = ci.PolicyInfo?.PolicyNum || null; + const ded_amt = parseFloat(ci.PolicyInfo?.CoverageInfo?.Coverage?.DeductibleInfo?.DeductibleAmt || 0); + // if your XML ever has a `` you'd parse it here + const clm_total = parseFloat(ci.Cieca_ttl || 0); + + // + // ── OWNER ───────────────────────────────────────────────────────────────────── + // + const ownerParty = rq.AdminInfo?.Owner?.Party || {}; + const ownerName = ownerParty.PersonInfo?.PersonName || {}; + const ownerOrg = ownerParty.OrgInfo || {}; + const ownerAddr = ownerParty.PersonInfo?.Communications?.Address || {}; + const ownerComms = ownerParty.ContactInfo?.Communications + ? Array.isArray(ownerParty.ContactInfo.Communications) + ? ownerParty.ContactInfo.Communications + : [ownerParty.ContactInfo.Communications] + : []; + let ownerPhone = null, + ownerEmail = null; + ownerComms.forEach((c) => { + if (c.CommQualifier === "CP") ownerPhone = c.CommPhone; + if (c.CommQualifier === "EM") ownerEmail = c.CommEmail; + }); + const ownerPrefContact = ownerParty.PreferredContactMethod || null; + + // + // ── VEHICLE INFO ────────────────────────────────────────────────────────────── + // + const vin = rq.VehicleInfo?.VINInfo?.VINNum || null; + const plate_no = rq.VehicleInfo?.License?.LicensePlateNum || null; + const plate_st = rq.VehicleInfo?.License?.LicensePlateStateProvince || null; + const desc = rq.VehicleInfo?.VehicleDesc || {}; + const v_model_yr = desc.ModelYear || null; + const v_make_desc = desc.MakeDesc || null; + const v_model_desc = desc.ModelName || null; + const body_style = desc.BodyStyle || null; + const engine_desc = desc.EngineDesc || null; + const production_date = desc.ProductionDate || null; + const sub_model_desc = desc.SubModelDesc || null; + const fuel_type = desc.FuelType || null; + const v_color = rq.VehicleInfo?.Paint?.Exterior?.ColorName || null; + const drivable = rq.VehicleInfo?.Condition?.DrivableInd === "Y"; + + // + // ── PROFILE & RATES ─────────────────────────────────────────────────────────── + // + const rateInfos = rq.ProfileInfo?.RateInfo + ? Array.isArray(rq.ProfileInfo.RateInfo) + ? rq.ProfileInfo.RateInfo + : [rq.ProfileInfo.RateInfo] + : []; + const rates = {}; // main { rate_lab, rate_laf, … } + const rateTier = {}; // e.g. { MA2S: [ {tier, pct}, … ] } + const materialCalc = {}; // e.g. { LAR: { CalcMethodCode, CalcMaxHours }, … } + + rateInfos.forEach((r) => { + if (!r || !r.RateType) return; + const t = r.RateType; + // main per‐unit rate + if (r.Rate) rates[`rate_${t.toLowerCase()}`] = parseFloat(r.Rate) || 0; + // any tier settings + if (r.RateTierInfo) { + const tiers = Array.isArray(r.RateTierInfo) ? r.RateTierInfo : [r.RateTierInfo]; + rateTier[t] = tiers.map((ti) => ({ + tier: ti.TierNum, + pct: parseFloat(ti.Percentage) || 0 + })); + } + // any material‐calc limits + if (r.MaterialCalcSettings) { + materialCalc[t] = r.MaterialCalcSettings; + } + }); + + // + // ── DAMAGE LINES → joblinesData ───────────────────────────────────────────── + // + const damageLines = Array.isArray(rq.DamageLineInfo) ? rq.DamageLineInfo : [rq.DamageLineInfo]; + const joblinesData = damageLines.map((line) => ({ + line_no: parseInt(line.LineNum, 10), + unq_seq: parseInt(line.UniqueSequenceNum, 10), + manual_line: line.ManualLineInd === "1", + automated_entry: line.AutomatedEntry === "1", + desc_judgment_ind: line.DescJudgmentInd === "1", + status: line.LineStatusCode || null, + line_desc: line.LineDesc || null, + + // parts + part_type: line.PartInfo.PartType || null, + part_qty: parseInt(line.PartInfo.Quantity || 0, 10), + db_price: parseFloat(line.PartInfo.PartPrice || 0), + act_price: parseFloat(line.PartInfo.PartPrice || 0), + oem_partno: line.PartInfo.OEMPartNum || null, + + // non-OEM block + non_oem_part_num: line.PartInfo?.NonOEM?.NonOEMPartNum || null, + non_oem_part_price: parseFloat(line.PartInfo?.NonOEM?.NonOEMPartPrice || 0), + supplier_ref_num: line.PartInfo?.NonOEM?.SupplierRefNum || null, + part_selected_ind: line.PartInfo?.NonOEM?.PartSelectedInd === "1", + + after_market_usage: line.PartInfo.AfterMarketUsage || null, + certification_type: line.PartInfo.CertificationType || null, + tax_part: line.PartInfo.TaxableInd === "1", + glass_flag: line.PartInfo.GlassPartInd === "1", + price_j: line.PriceJudgmentInd === "1", + price_inc: line.PriceInclInd === "1", + order_by_application_ind: String(line.PartInfo.OrderByApplicationInd).toLowerCase() === "true", + + // labor + mod_lbr_ty: line.LaborInfo?.LaborType || null, + mod_lb_hrs: parseFloat(line.LaborInfo?.LaborHours || 0), + lbr_op: line.LaborInfo?.LaborOperation || null, + lbr_amt: parseFloat(line.LaborInfo?.LaborAmt || 0), + + // linkage & memo + parent_line_no: line.ParentLineNum ? parseInt(line.ParentLineNum, 10) : null, + notes: line.LineMemo || null + })); + + // + // ── BUILD & INSERT THE JOB ─────────────────────────────────────────────────── + // + const jobInput = { + shopid: shopId, + + // identifiers + ro_number: RefClaimNum, + original_ro_number: originalRoNumber, + original_job_uuid: originalJobUuid, + + // claim & policy + clm_no, + status: ClaimStatus, + clm_total, + policy_no, + ded_amt, + + // timestamps & comments + comment, + date_exported: transmitDate, + + // owner + ownr_fn: ownerName.FirstName || null, + ownr_ln: ownerName.LastName || null, + ownr_co_nm: ownerOrg.CompanyName || null, + ownr_addr1: ownerAddr.Address1 || null, + ownr_city: ownerAddr.City || null, + ownr_st: ownerAddr.StateProvince || null, + ownr_zip: ownerAddr.PostalCode || null, + ownr_country: ownerAddr.Country || null, + ownr_ph1: ownerPhone, + ownr_ea: ownerEmail, + ownr_pref_contact: ownerPrefContact, + + // vehicle + v_vin: vin, + plate_no, + plate_st, + v_model_yr, + v_make_desc, + v_model_desc, + v_color, + body_style, + engine_desc, + production_date, + sub_model_desc, + fuel_type, + drivable, + + // labor & material rates + ...rates, + + // everything extra in one JSON column + production_vars: { + rqUid: RqUID, + documentVersions, + assignmentEvent, + scheduled_completion, + scheduled_in, + rateTier, + materialCalc + }, + + // nested joblines + joblines: { data: joblinesData } + }; + + logger.log("parts-insert-job", "debug", null, null, { jobInput }); + const jobResp = await client.request(INSERT_JOB_WITH_LINES, { + job: jobInput + }); + const newJob = jobResp.insert_jobs_one; + const jobId = newJob.id; + logger.log("parts-job-created", "info", jobId, null); + + // + // ── BUILD & INSERT PARTS ORDERS ──────────────────────────────────────────── + // + // group lines by their SupplierRefNum + const insertedMap = newJob.joblines.reduce((m, ln) => { + m[ln.unq_seq] = ln.id; + return m; + }, {}); + const poGroups = {}; + damageLines.forEach((line) => { + const pt = line.PartInfo.PartType; + const qty = parseInt(line.PartInfo.Quantity || 0, 10); + if (["PAN", "PAC", "PAM", "PAA"].includes(pt) && qty > 0) { + const vendorid = line.PartInfo?.NonOEM?.SupplierRefNum || process.env.DEFAULT_VENDOR_ID; + if (!poGroups[vendorid]) poGroups[vendorid] = []; + poGroups[vendorid].push({ + line, + unq_seq: parseInt(line.UniqueSequenceNum, 10) + }); + } + }); + + const partsOrders = Object.entries(poGroups).map(([vendorid, entries]) => ({ + jobid: jobId, + vendorid, + order_number: `${clm_no}-${entries[0].line.LineNum}`, + parts_order_lines: { + data: entries.map(({ line, unq_seq }) => ({ + job_line_id: insertedMap[unq_seq], + part_type: line.PartInfo.PartType, + quantity: parseInt(line.PartInfo.Quantity || 0, 10), + act_price: parseFloat(line.PartInfo.PartPrice || 0), + db_price: parseFloat(line.PartInfo.PartPrice || 0), + line_desc: line.LineDesc, + non_oem_part_num: line.PartInfo?.NonOEM?.NonOEMPartNum || null, + non_oem_part_price: parseFloat(line.PartInfo?.NonOEM?.NonOEMPartPrice || 0), + part_selected_ind: line.PartInfo?.NonOEM?.PartSelectedInd === "1" + })) + } + })); + + if (partsOrders.length) { + logger.log("parts-insert-orders", "debug", null, null, { + partsOrders + }); + await client.request(INSERT_PARTS_ORDERS, { po: partsOrders }); + logger.log("parts-orders-created", "info", jobId, null); + } + + return res.status(200).json({ success: true, jobId }); + } catch (err) { + logger.log("parts-route-error", "error", null, null, { error: err }); + return res.status(err.status || 500).json({ error: err.message || "Internal error" }); + } +}; + +module.exports = partsManagementVehicleDamageEstimateAddRq; diff --git a/server/routes/intergrationRoutes.js b/server/routes/intergrationRoutes.js index 46826d28e..38b8d44fb 100644 --- a/server/routes/intergrationRoutes.js +++ b/server/routes/intergrationRoutes.js @@ -18,8 +18,14 @@ if (typeof VSSTA_INTEGRATION_SECRET === "string" && VSSTA_INTEGRATION_SECRET.len if (typeof PARTS_MANAGEMENT_INTEGRATION_SECRET === "string" && PARTS_MANAGEMENT_INTEGRATION_SECRET.length > 0) { const partsManagementProvisioning = require("../integrations/partsManagement/partsManagementProvisioning"); const partsManagementIntegrationMiddleware = require("../middleware/partsManagementIntegrationMiddleware"); + const partsManagementVehicleDamageEstimateAddRq = require("../integrations/partsManagement/partsManagementVehicleDamageEstimateAddRq"); router.post("/parts-management/provision", partsManagementIntegrationMiddleware, partsManagementProvisioning); + router.post( + "/parts-management/VehicleDamageEstimateAddRq", + partsManagementIntegrationMiddleware, + partsManagementVehicleDamageEstimateAddRq + ); } else { console.warn("PARTS_MANAGEMENT_INTEGRATION_SECRET is not set — skipping /parts-management/provision route"); } diff --git a/static-analysis.datadog.yml b/static-analysis.datadog.yml new file mode 100644 index 000000000..223543d2c --- /dev/null +++ b/static-analysis.datadog.yml @@ -0,0 +1,10 @@ +schema-version: v1 +rulesets: + - javascript-best-practices + - javascript-browser-security + - javascript-code-style + - javascript-common-security + - javascript-express + - javascript-inclusive + - javascript-node-security + - jsx-react