diff --git a/client/package-lock.json b/client/package-lock.json
index 97479da81..38d68110f 100644
--- a/client/package-lock.json
+++ b/client/package-lock.json
@@ -9,19 +9,19 @@
"version": "0.2.1",
"dependencies": {
"@ant-design/icons": "^5.3.7",
- "@ant-design/pro-layout": "^7.19.8",
+ "@ant-design/pro-layout": "^7.19.10",
"@apollo/client": "^3.10.8",
"@asseinfo/react-kanban": "^2.2.0",
"@emotion/is-prop-valid": "^1.2.2",
- "@fingerprintjs/fingerprintjs": "^4.4.2",
+ "@fingerprintjs/fingerprintjs": "^4.4.3",
"@jsreport/browser-client": "^3.1.0",
"@reduxjs/toolkit": "^2.2.6",
- "@sentry/cli": "^2.32.1",
+ "@sentry/cli": "^2.32.2",
"@sentry/react": "^7.114.0",
"@splitsoftware/splitio-react": "^1.12.0",
"@tanem/react-nprogress": "^5.0.51",
"@vitejs/plugin-react": "^4.3.1",
- "antd": "^5.19.1",
+ "antd": "^5.19.2",
"apollo-link-logger": "^2.0.1",
"apollo-link-sentry": "^3.3.0",
"autosize": "^6.0.1",
@@ -36,7 +36,7 @@
"exifr": "^7.1.3",
"firebase": "^10.12.3",
"graphql": "^16.9.0",
- "i18next": "^23.11.5",
+ "i18next": "^23.12.1",
"i18next-browser-languagedetector": "^8.0.0",
"immutability-helper": "^3.1.1",
"libphonenumber-js": "^1.11.4",
@@ -48,14 +48,14 @@
"query-string": "^9.0.0",
"raf-schd": "^4.0.3",
"react": "^18.3.1",
- "react-big-calendar": "^1.13.0",
+ "react-big-calendar": "^1.13.1",
"react-color": "^2.19.3",
"react-cookie": "^7.1.4",
"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": "^14.1.2",
+ "react-i18next": "^14.1.3",
"react-icons": "^5.2.1",
"react-image-lightbox": "^5.1.4",
"react-joyride": "^2.8.2",
@@ -68,7 +68,7 @@
"react-router-dom": "^6.24.1",
"react-sticky": "^6.0.3",
"react-virtualized": "^9.22.5",
- "react-virtuoso": "^4.7.11",
+ "react-virtuoso": "^4.7.12",
"recharts": "^2.12.7",
"redux": "^5.0.1",
"redux-actions": "^3.0.0",
@@ -76,7 +76,7 @@
"redux-saga": "^1.3.0",
"redux-state-sync": "^3.1.4",
"reselect": "^5.1.1",
- "sass": "^1.77.6",
+ "sass": "^1.77.8",
"socket.io-client": "^4.7.5",
"styled-components": "^6.1.11",
"subscriptions-transport-ws": "^0.11.0",
@@ -88,12 +88,12 @@
"devDependencies": {
"@babel/plugin-proposal-private-property-in-object": "^7.21.11",
"@babel/preset-react": "^7.24.7",
- "@dotenvx/dotenvx": "^1.5.0",
+ "@dotenvx/dotenvx": "^1.6.4",
"@emotion/babel-plugin": "^11.11.0",
"@emotion/react": "^11.11.4",
- "@sentry/webpack-plugin": "^2.20.1",
+ "@sentry/webpack-plugin": "^2.21.1",
"@testing-library/cypress": "^10.0.2",
- "browserslist": "^4.23.1",
+ "browserslist": "^4.23.2",
"browserslist-to-esbuild": "^2.1.1",
"cross-env": "^7.0.3",
"cypress": "^13.13.0",
@@ -105,7 +105,7 @@
"react-error-overlay": "6.0.11",
"redux-logger": "^3.0.6",
"source-map-explorer": "^2.5.3",
- "vite": "^5.3.3",
+ "vite": "^5.3.4",
"vite-plugin-babel": "^1.2.0",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-legacy": "^2.1.0",
@@ -183,13 +183,13 @@
"integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA=="
},
"node_modules/@ant-design/pro-layout": {
- "version": "7.19.8",
- "resolved": "https://registry.npmjs.org/@ant-design/pro-layout/-/pro-layout-7.19.8.tgz",
- "integrity": "sha512-f/vC83jmCjEDP7rrLBxRBqCK8298keSRrXqpd2RqigYlJpGqeKVGcevmk5ngBjDxz+UqjoNfOokG7cU3t3eIvQ==",
+ "version": "7.19.10",
+ "resolved": "https://registry.npmjs.org/@ant-design/pro-layout/-/pro-layout-7.19.10.tgz",
+ "integrity": "sha512-w2Cbh3Ari1h5e7WBbrZSZi2f3pokpf0Pn+7GQ/PN+cimKBC+BIBgNh6mtpheLlNTdTM3jsgpEpIO+BtiLbjkkg==",
"dependencies": {
"@ant-design/icons": "^5.0.0",
- "@ant-design/pro-provider": "2.14.7",
- "@ant-design/pro-utils": "2.15.14",
+ "@ant-design/pro-provider": "2.14.9",
+ "@ant-design/pro-utils": "2.15.16",
"@babel/runtime": "^7.18.0",
"@umijs/route-utils": "^4.0.0",
"@umijs/use-params": "^1.0.9",
@@ -214,9 +214,9 @@
"integrity": "sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w=="
},
"node_modules/@ant-design/pro-provider": {
- "version": "2.14.7",
- "resolved": "https://registry.npmjs.org/@ant-design/pro-provider/-/pro-provider-2.14.7.tgz",
- "integrity": "sha512-yEAOph/fTzIhOWMtYAbcsjffyYq8tL6IgMQqRlYZmIisVMRDZZ32F+Ab18a4S18foZiDChEr0e6NZuuY7du5rA==",
+ "version": "2.14.9",
+ "resolved": "https://registry.npmjs.org/@ant-design/pro-provider/-/pro-provider-2.14.9.tgz",
+ "integrity": "sha512-4UJr6AHyWKsrhx2KfdkpRQCgjc75oDUDhMHGA2OWqQVI16sMQfeZf6KYfmeiG3Dal1QKFOtSibCdH5G2CDvWlg==",
"dependencies": {
"@ant-design/cssinjs": "^1.11.1",
"@babel/runtime": "^7.18.0",
@@ -231,12 +231,12 @@
}
},
"node_modules/@ant-design/pro-utils": {
- "version": "2.15.14",
- "resolved": "https://registry.npmjs.org/@ant-design/pro-utils/-/pro-utils-2.15.14.tgz",
- "integrity": "sha512-h/GdYDN19dTnyWvbfoEF5DyeTwkB+iRUXlhQ1O1NMkD2eOUpKTjVKF8J+Kekb7Bp7Fkf1dBVktVrcY8sioTkrw==",
+ "version": "2.15.16",
+ "resolved": "https://registry.npmjs.org/@ant-design/pro-utils/-/pro-utils-2.15.16.tgz",
+ "integrity": "sha512-WSyE6dSZOY3aBSdfqzu3HSfV6XbZNQoHOhh6ankEZMgDRiKn1JiDG1CvgjdzFN2N5RULCoCcAHqU784fTEhggA==",
"dependencies": {
"@ant-design/icons": "^5.0.0",
- "@ant-design/pro-provider": "2.14.7",
+ "@ant-design/pro-provider": "2.14.9",
"@babel/runtime": "^7.18.0",
"classnames": "^2.3.2",
"dayjs": "^1.11.10",
@@ -2526,16 +2526,6 @@
"node": ">=6.9.0"
}
},
- "node_modules/@clack/core": {
- "version": "0.3.4",
- "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.3.4.tgz",
- "integrity": "sha512-H4hxZDXgHtWTwV3RAVenqcC4VbJZNegbBjlPvzOzCouXtS2y3sDvlO3IsbrPNWuLWPPlYVYPghQdSF64683Ldw==",
- "dev": true,
- "dependencies": {
- "picocolors": "^1.0.0",
- "sisteransi": "^1.0.5"
- }
- },
"node_modules/@colors/colors": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz",
@@ -2704,13 +2694,11 @@
}
},
"node_modules/@dotenvx/dotenvx": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.5.0.tgz",
- "integrity": "sha512-b+LLl13eGQgXnhe6jb3smZrByVrUm+R+kfy5e15Gq8PqROcU35Txz25PHUPLrAvOiTQHZhIHjwF0XI9CNGVxJQ==",
+ "version": "1.6.4",
+ "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.6.4.tgz",
+ "integrity": "sha512-2jbcxpqbJDafeZo9i2ha38qGyB0KISgCht6KDTyvR4LlWK922pflm9t8M1jY97uYgW3PNZZjCmQjzQ+IB/V4rQ==",
"dev": true,
"dependencies": {
- "@clack/core": "^0.3.4",
- "arch": "^2.1.1",
"chalk": "^4.1.2",
"commander": "^11.1.0",
"conf": "^10.2.0",
@@ -2720,11 +2708,8 @@
"execa": "^5.1.1",
"fdir": "^6.1.1",
"ignore": "^5.3.0",
- "is-wsl": "^2.1.1",
"object-treeify": "1.1.33",
- "open": "^8.4.2",
"picomatch": "^3.0.1",
- "undici": "^5.28.3",
"which": "^4.0.0",
"winston": "^3.11.0",
"xxhashjs": "^0.2.2"
@@ -2746,23 +2731,6 @@
"node": ">=16"
}
},
- "node_modules/@dotenvx/dotenvx/node_modules/open": {
- "version": "8.4.2",
- "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
- "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
- "dev": true,
- "dependencies": {
- "define-lazy-prop": "^2.0.0",
- "is-docker": "^2.1.1",
- "is-wsl": "^2.2.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/@dotenvx/dotenvx/node_modules/picomatch": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz",
@@ -3434,9 +3402,9 @@
}
},
"node_modules/@fingerprintjs/fingerprintjs": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/@fingerprintjs/fingerprintjs/-/fingerprintjs-4.4.2.tgz",
- "integrity": "sha512-ZekjtT4qCXq0pbv6FJqBRdTXajLg+kgQ2Tmrh+aWue5sMWboE9iicpg8JYKI4xhZFwLT7yd1K8Zy+P79XSx/1Q==",
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/@fingerprintjs/fingerprintjs/-/fingerprintjs-4.4.3.tgz",
+ "integrity": "sha512-sm0ZmDp5Oeq8hQTf+bAHKsuuteVAYme/YOY9UPP/GrUBrR5Fzl1P5oOv6F5LvyBrO7qLjU5HQkfU0MmFte/8xA==",
"dependencies": {
"tslib": "^2.4.1"
}
@@ -5167,9 +5135,9 @@
}
},
"node_modules/@sentry/babel-plugin-component-annotate": {
- "version": "2.20.1",
- "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.20.1.tgz",
- "integrity": "sha512-4mhEwYTK00bIb5Y9UWIELVUfru587Vaeg0DQGswv4aIRHIiMKLyNqCEejaaybQ/fNChIZOKmvyqXk430YVd7Qg==",
+ "version": "2.21.1",
+ "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.21.1.tgz",
+ "integrity": "sha512-u1L8gZ4He0WdyiIsohYkA/YOY1b6Oa5yIMRtfZZ9U5TiWYLgOfMWyb88X0GotZeghSbgxrse/yI4WeHnhAUQDQ==",
"dev": true,
"engines": {
"node": ">= 14"
@@ -5194,13 +5162,13 @@
}
},
"node_modules/@sentry/bundler-plugin-core": {
- "version": "2.20.1",
- "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-2.20.1.tgz",
- "integrity": "sha512-6ipbmGzHekxeRCbp7eoefr6bdd/lW4cNA9eNnrmd9+PicubweGaZZbH2NjhFHsaxzgOezwipDHjrTaap2kTHgw==",
+ "version": "2.21.1",
+ "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-2.21.1.tgz",
+ "integrity": "sha512-F8FdL/bS8cy1SY1Gw0Mfo3ROTqlrq9Lvt5QGvhXi22dpVcDkWmoTWE2k+sMEnXOa8SdThMc/gyC8lMwHGd3kFQ==",
"dev": true,
"dependencies": {
"@babel/core": "^7.18.5",
- "@sentry/babel-plugin-component-annotate": "2.20.1",
+ "@sentry/babel-plugin-component-annotate": "2.21.1",
"@sentry/cli": "^2.22.3",
"dotenv": "^16.3.1",
"find-up": "^5.0.0",
@@ -5212,52 +5180,10 @@
"node": ">= 14"
}
},
- "node_modules/@sentry/bundler-plugin-core/node_modules/glob": {
- "version": "9.3.5",
- "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz",
- "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "minimatch": "^8.0.2",
- "minipass": "^4.2.4",
- "path-scurry": "^1.6.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/@sentry/bundler-plugin-core/node_modules/minimatch": {
- "version": "8.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz",
- "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/@sentry/bundler-plugin-core/node_modules/minipass": {
- "version": "4.2.8",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz",
- "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/@sentry/cli": {
- "version": "2.32.1",
- "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.32.1.tgz",
- "integrity": "sha512-MWkbkzZfnlE7s2pPbg4VozRSAeMlIObfZlTIou9ye6XnPt6ZmmxCLOuOgSKMv4sXg6aeqKNzMNiadThxCWyvPg==",
+ "version": "2.32.2",
+ "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.32.2.tgz",
+ "integrity": "sha512-m/6Z3FWu+rTd8jepVlJPKQhvbT8vCjt0N7BSWZiEUVW/8mhwAYJiwO0b+Ch/u4IqbBg1dp3805q5TFPl4AdrNw==",
"hasInstallScript": true,
"dependencies": {
"https-proxy-agent": "^5.0.0",
@@ -5273,19 +5199,19 @@
"node": ">= 10"
},
"optionalDependencies": {
- "@sentry/cli-darwin": "2.32.1",
- "@sentry/cli-linux-arm": "2.32.1",
- "@sentry/cli-linux-arm64": "2.32.1",
- "@sentry/cli-linux-i686": "2.32.1",
- "@sentry/cli-linux-x64": "2.32.1",
- "@sentry/cli-win32-i686": "2.32.1",
- "@sentry/cli-win32-x64": "2.32.1"
+ "@sentry/cli-darwin": "2.32.2",
+ "@sentry/cli-linux-arm": "2.32.2",
+ "@sentry/cli-linux-arm64": "2.32.2",
+ "@sentry/cli-linux-i686": "2.32.2",
+ "@sentry/cli-linux-x64": "2.32.2",
+ "@sentry/cli-win32-i686": "2.32.2",
+ "@sentry/cli-win32-x64": "2.32.2"
}
},
"node_modules/@sentry/cli-darwin": {
- "version": "2.32.1",
- "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.32.1.tgz",
- "integrity": "sha512-z/lEwANTYPCzbWTZ2+eeeNYxRLllC8knd0h+vtAKlhmGw/fyc/N39cznIFyFu+dLJ6tTdjOWOeikHtKuS/7onw==",
+ "version": "2.32.2",
+ "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.32.2.tgz",
+ "integrity": "sha512-GDtePIavx3FKSRowdPdtIssahn46MfFFYNN+s7a9MjlhFwJtvC9A1bSDw7ksEtDaQolepUwmLPHaVe19y0T/zw==",
"optional": true,
"os": [
"darwin"
@@ -5295,9 +5221,9 @@
}
},
"node_modules/@sentry/cli-linux-arm": {
- "version": "2.32.1",
- "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.32.1.tgz",
- "integrity": "sha512-m0lHkn+o4YKBq8KptGZvpT64FAwSl9mYvHZO9/ChnEGIJ/WyJwiN1X1r9JHVaW4iT5lD0Y5FAyq3JLkk0m0XHg==",
+ "version": "2.32.2",
+ "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.32.2.tgz",
+ "integrity": "sha512-u9s08wr8bDDqsAl6pk9iGGlOHtU+T8btU6voNKy71QzeIBpV9c8VVk/OnmP9aswp/ea4NY416yjnzcTvCrFKAw==",
"cpu": [
"arm"
],
@@ -5311,9 +5237,9 @@
}
},
"node_modules/@sentry/cli-linux-arm64": {
- "version": "2.32.1",
- "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.32.1.tgz",
- "integrity": "sha512-hsGqHYuecUl1Yhq4MhiRejfh1gNlmhyNPcQEoO/DDRBnGnJyEAdiDpKXJcc2e/lT9k40B55Ob2CP1SeY040T2w==",
+ "version": "2.32.2",
+ "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.32.2.tgz",
+ "integrity": "sha512-VECLVC1rLyvXk6rTVUfmfs4vhANjMgm4BVKGlA3rydmf2PJw2/NfipH3KeyijdE2vEoyLri+/6HH883pP0iniQ==",
"cpu": [
"arm64"
],
@@ -5327,9 +5253,9 @@
}
},
"node_modules/@sentry/cli-linux-i686": {
- "version": "2.32.1",
- "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.32.1.tgz",
- "integrity": "sha512-SuMLN1/ceFd3Q/B0DVyh5igjetTAF423txiABAHASenEev0lG0vZkRDXFclfgDtDUKRPmOXW7VDMirM3yZWQHQ==",
+ "version": "2.32.2",
+ "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.32.2.tgz",
+ "integrity": "sha512-XhofQz32OqLrQK1DEOsryhT7d29Df6VkccvxueGoIt2gpXEXtgRczsUwZjZqquDdkNCt+HPj9eUGcj8pY8JkmQ==",
"cpu": [
"x86",
"ia32"
@@ -5344,9 +5270,9 @@
}
},
"node_modules/@sentry/cli-linux-x64": {
- "version": "2.32.1",
- "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.32.1.tgz",
- "integrity": "sha512-x4FGd6xgvFddz8V/dh6jii4wy9qjWyvYLBTz8Fhi9rIP+b8wQ3oxwHIdzntareetZP7C1ggx+hZheiYocNYVwA==",
+ "version": "2.32.2",
+ "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.32.2.tgz",
+ "integrity": "sha512-anyng4Qqt7zX4ZY4IzDH1RJWAVZNBe6sUHcuciNy7giCU3B4/XnxAHlwYmBSN5txpaumsWdstPgRKEUJG6AOSA==",
"cpu": [
"x64"
],
@@ -5360,9 +5286,9 @@
}
},
"node_modules/@sentry/cli-win32-i686": {
- "version": "2.32.1",
- "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.32.1.tgz",
- "integrity": "sha512-i6aZma9mFzR+hqMY5VliQZEX6ypP/zUjPK0VtIMYWs5cC6PsQLRmuoeJmy3Z7d4nlh0CdK5NPC813Ej6RY6/vg==",
+ "version": "2.32.2",
+ "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.32.2.tgz",
+ "integrity": "sha512-/auqx7QXG7F556fNK7vaB26pX7Far1CQMfI65iV4u/VWg6gV2WfvJWXB4iowhjqkYv56sZ+zOymLkEVF0R8wtg==",
"cpu": [
"x86",
"ia32"
@@ -5376,9 +5302,9 @@
}
},
"node_modules/@sentry/cli-win32-x64": {
- "version": "2.32.1",
- "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.32.1.tgz",
- "integrity": "sha512-B58w/lRHLb4MUSjJNfMMw2cQykfimDCMLMmeK+1EiT2RmSeNQliwhhBxYcKk82a8kszH6zg3wT2vCea7LyPUyA==",
+ "version": "2.32.2",
+ "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.32.2.tgz",
+ "integrity": "sha512-w7hW2sEWVYQquqdILBSFhcVW+HdoyLqVPPkLPAXRSLTwBnuni9nQEIdXr0h/7db+K3cm7PvWndp5ixVyswLHZA==",
"cpu": [
"x64"
],
@@ -5468,12 +5394,12 @@
}
},
"node_modules/@sentry/webpack-plugin": {
- "version": "2.20.1",
- "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-2.20.1.tgz",
- "integrity": "sha512-U6LzoE09Ndt0OCWROoRaZqqIHGxyMRdKpBhbqoBqyyfVwXN/zGW3I/cWZ1e8rreiKFj+2+c7+X0kOS+NGMTUrg==",
+ "version": "2.21.1",
+ "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-2.21.1.tgz",
+ "integrity": "sha512-mhKWQq7/eC35qrhhD8oXm/37vZ1BQqmCD8dUngFIr4D24rc7dwlGwPGOYv59yiBqjTS0fGJ+o0xC5PTRKljGQQ==",
"dev": true,
"dependencies": {
- "@sentry/bundler-plugin-core": "2.20.1",
+ "@sentry/bundler-plugin-core": "2.21.1",
"unplugin": "1.0.1",
"uuid": "^9.0.0"
},
@@ -6369,9 +6295,9 @@
}
},
"node_modules/antd": {
- "version": "5.19.1",
- "resolved": "https://registry.npmjs.org/antd/-/antd-5.19.1.tgz",
- "integrity": "sha512-ogGEUPaamSZ2HFGvlyLBNfxZ0c4uX5aqEIwMtmqRTPNjcLY/k+qdMmdWrMMiY1CDJ3j1in5wjzQTvREG+do65g==",
+ "version": "5.19.2",
+ "resolved": "https://registry.npmjs.org/antd/-/antd-5.19.2.tgz",
+ "integrity": "sha512-377Sqqbr5PQj1rwLXqjSSAB23sNO6KCsFm0LKjU6OdpHktdDk7MYcqep3q/Azo7tHrqgE+EntxaTk4lY0dx8eA==",
"dependencies": {
"@ant-design/colors": "^7.1.0",
"@ant-design/cssinjs": "^1.21.0",
@@ -6402,7 +6328,7 @@
"rc-motion": "^2.9.2",
"rc-notification": "~5.6.0",
"rc-pagination": "~4.2.0",
- "rc-picker": "~4.6.7",
+ "rc-picker": "~4.6.9",
"rc-progress": "~4.0.0",
"rc-rate": "~2.13.0",
"rc-resize-observer": "^1.4.0",
@@ -6417,7 +6343,7 @@
"rc-tooltip": "~6.2.0",
"rc-tree": "~5.8.8",
"rc-tree-select": "~5.22.1",
- "rc-upload": "~4.5.2",
+ "rc-upload": "~4.6.0",
"rc-util": "^5.43.0",
"scroll-into-view-if-needed": "^3.1.0",
"throttle-debounce": "^5.0.0"
@@ -7303,9 +7229,9 @@
}
},
"node_modules/browserslist": {
- "version": "4.23.1",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz",
- "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==",
+ "version": "4.23.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz",
+ "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==",
"funding": [
{
"type": "opencollective",
@@ -7321,10 +7247,10 @@
}
],
"dependencies": {
- "caniuse-lite": "^1.0.30001629",
- "electron-to-chromium": "^1.4.796",
+ "caniuse-lite": "^1.0.30001640",
+ "electron-to-chromium": "^1.4.820",
"node-releases": "^2.0.14",
- "update-browserslist-db": "^1.0.16"
+ "update-browserslist-db": "^1.1.0"
},
"bin": {
"browserslist": "cli.js"
@@ -7482,9 +7408,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001636",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz",
- "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==",
+ "version": "1.0.30001642",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz",
+ "integrity": "sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==",
"funding": [
{
"type": "opencollective",
@@ -8648,15 +8574,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/define-lazy-prop": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
- "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/define-properties": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
@@ -8890,9 +8807,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.4.805",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.805.tgz",
- "integrity": "sha512-8W4UJwX/w9T0QSzINJckTKG6CYpAUTqsaWcWIsdud3I1FYJcMgW9QqT1/4CBff/pP/TihWh13OmiyY8neto6vw=="
+ "version": "1.4.828",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.828.tgz",
+ "integrity": "sha512-QOIJiWpQJDHAVO4P58pwb133Cwee0nbvy/MV1CwzZVGpkH1RX33N3vsaWRCpR6bF63AAq366neZrRTu7Qlsbbw=="
},
"node_modules/elliptic": {
"version": "6.5.5",
@@ -10581,6 +10498,24 @@
"assert-plus": "^1.0.0"
}
},
+ "node_modules/glob": {
+ "version": "9.3.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz",
+ "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "minimatch": "^8.0.2",
+ "minipass": "^4.2.4",
+ "path-scurry": "^1.6.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/glob-parent": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
@@ -10593,6 +10528,21 @@
"node": ">=10.13.0"
}
},
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz",
+ "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/global-dirs": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz",
@@ -10947,9 +10897,9 @@
}
},
"node_modules/i18next": {
- "version": "23.11.5",
- "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.11.5.tgz",
- "integrity": "sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA==",
+ "version": "23.12.1",
+ "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.12.1.tgz",
+ "integrity": "sha512-l4y291ZGRgUhKuqVSiqyuU2DDzxKStlIWSaoNBR4grYmh0X+pRYbFpTMs3CnJ5ECKbOI8sQcJ3PbTUfLgPRaMA==",
"funding": [
{
"type": "individual",
@@ -13088,12 +13038,12 @@
}
},
"node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz",
+ "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==",
"dev": true,
"engines": {
- "node": ">=16 || 14 >=14.17"
+ "node": ">=8"
}
},
"node_modules/mkdirp": {
@@ -13787,12 +13737,18 @@
}
},
"node_modules/path-scurry/node_modules/lru-cache": {
- "version": "10.2.2",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz",
- "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==",
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true
+ },
+ "node_modules/path-scurry/node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
"dev": true,
"engines": {
- "node": "14 || >=16.14"
+ "node": ">=16 || 14 >=14.17"
}
},
"node_modules/path-type": {
@@ -14487,9 +14443,9 @@
}
},
"node_modules/rc-picker": {
- "version": "4.6.8",
- "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.6.8.tgz",
- "integrity": "sha512-Lq2m68YGcmWXhzAmxTcL3vOjik7NQjcZ6fmZqBlgdrMCg3VnuKHmtk5CHGWd3wCiy2qNxSYIqWAidB1EQViPpQ==",
+ "version": "4.6.9",
+ "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.6.9.tgz",
+ "integrity": "sha512-kwQq5xDNJ1VcX7pauLlVBiuQorpZGUwA/YczVJTO1e33YsTyDuVjaQkYAiAupXbEPUBCU3doGZo0J25HGq2ZOQ==",
"dependencies": {
"@babel/runtime": "^7.24.7",
"@rc-component/trigger": "^2.0.0",
@@ -14761,9 +14717,9 @@
}
},
"node_modules/rc-upload": {
- "version": "4.5.2",
- "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.5.2.tgz",
- "integrity": "sha512-QO3ne77DwnAPKFn0bA5qJM81QBjQi0e0NHdkvpFyY73Bea2NfITiotqJqVjHgeYPOJu5lLVR32TNGP084aSoXA==",
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.6.0.tgz",
+ "integrity": "sha512-Zr0DT1NHw/ApxrP7UAoxOtGaVYuzarrrCVr0ld7RiEFsKX07uFhE1EpCBxwL11ruFn89GMcshOKWp+s6FLyAlA==",
"dependencies": {
"@babel/runtime": "^7.18.3",
"classnames": "^2.2.5",
@@ -14882,9 +14838,9 @@
}
},
"node_modules/react-big-calendar": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/react-big-calendar/-/react-big-calendar-1.13.0.tgz",
- "integrity": "sha512-3ewolEKeBC5CjuxxDbo+IfQXjcd6jIBLSOoMzn1/lVMf+BYhPneifuOjMseXCIIaA4UlGZcy625BIdYgtAx+cA==",
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/react-big-calendar/-/react-big-calendar-1.13.1.tgz",
+ "integrity": "sha512-6qg2ivBPnGPE+iJTJ6nNG/Kol0XElNzywWkwjjN0GtXjooHcS+9/UnpiCDuKzbele3iB6fWeobkSHWhI6xxKYw==",
"dependencies": {
"@babel/runtime": "^7.20.7",
"clsx": "^1.2.1",
@@ -15038,9 +14994,9 @@
}
},
"node_modules/react-i18next": {
- "version": "14.1.2",
- "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-14.1.2.tgz",
- "integrity": "sha512-FSIcJy6oauJbGEXfhUgVeLzvWBhIBIS+/9c6Lj4niwKZyGaGb4V4vUbATXSlsHJDXXB+ociNxqFNiFuV1gmoqg==",
+ "version": "14.1.3",
+ "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-14.1.3.tgz",
+ "integrity": "sha512-wZnpfunU6UIAiJ+bxwOiTmBOAaB14ha97MjOEnLGac2RJ+h/maIYXZuTHlmyqQVX1UVHmU1YDTQ5vxLmwfXTjw==",
"dependencies": {
"@babel/runtime": "^7.23.9",
"html-parse-stringify": "^3.0.1"
@@ -15367,9 +15323,9 @@
}
},
"node_modules/react-virtuoso": {
- "version": "4.7.11",
- "resolved": "https://registry.npmjs.org/react-virtuoso/-/react-virtuoso-4.7.11.tgz",
- "integrity": "sha512-Kdn9qEtQI2ulEuBMzW2BTkDsfijB05QUd6lpZ1K36oyA3k65Cz4lG4EKrh2pCfUafX4C2uMSZOwzMOhbrMOTFA==",
+ "version": "4.7.12",
+ "resolved": "https://registry.npmjs.org/react-virtuoso/-/react-virtuoso-4.7.12.tgz",
+ "integrity": "sha512-q8yaykkVJGJbPNQH2Hgm82ik0LsbNGJpHMEjAGz5ibEsTVHKObs5WtEELAd1A99OKFHs091W1M+HN+1sasL08Q==",
"engines": {
"node": ">=10"
},
@@ -16014,9 +15970,9 @@
"dev": true
},
"node_modules/sass": {
- "version": "1.77.6",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz",
- "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==",
+ "version": "1.77.8",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.8.tgz",
+ "integrity": "sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==",
"dependencies": {
"chokidar": ">=3.0.0 <4.0.0",
"immutable": "^4.0.0",
@@ -16197,12 +16153,6 @@
"is-arrayish": "^0.3.1"
}
},
- "node_modules/sisteransi": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
- "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
- "dev": true
- },
"node_modules/slash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
@@ -17606,9 +17556,9 @@
}
},
"node_modules/update-browserslist-db": {
- "version": "1.0.16",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz",
- "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz",
+ "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==",
"funding": [
{
"type": "opencollective",
@@ -17812,9 +17762,9 @@
}
},
"node_modules/vite": {
- "version": "5.3.3",
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.3.tgz",
- "integrity": "sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==",
+ "version": "5.3.4",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.4.tgz",
+ "integrity": "sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==",
"dev": true,
"dependencies": {
"esbuild": "^0.21.3",
diff --git a/client/package.json b/client/package.json
index 6995a06bd..1d6aff544 100644
--- a/client/package.json
+++ b/client/package.json
@@ -9,19 +9,19 @@
"proxy": "http://localhost:4000",
"dependencies": {
"@ant-design/icons": "^5.3.7",
- "@ant-design/pro-layout": "^7.19.8",
+ "@ant-design/pro-layout": "^7.19.10",
"@apollo/client": "^3.10.8",
"@asseinfo/react-kanban": "^2.2.0",
"@emotion/is-prop-valid": "^1.2.2",
- "@fingerprintjs/fingerprintjs": "^4.4.2",
+ "@fingerprintjs/fingerprintjs": "^4.4.3",
"@jsreport/browser-client": "^3.1.0",
"@reduxjs/toolkit": "^2.2.6",
- "@sentry/cli": "^2.32.1",
+ "@sentry/cli": "^2.32.2",
"@sentry/react": "^7.114.0",
"@splitsoftware/splitio-react": "^1.12.0",
"@tanem/react-nprogress": "^5.0.51",
"@vitejs/plugin-react": "^4.3.1",
- "antd": "^5.19.1",
+ "antd": "^5.19.2",
"apollo-link-logger": "^2.0.1",
"apollo-link-sentry": "^3.3.0",
"autosize": "^6.0.1",
@@ -36,7 +36,7 @@
"exifr": "^7.1.3",
"firebase": "^10.12.3",
"graphql": "^16.9.0",
- "i18next": "^23.11.5",
+ "i18next": "^23.12.1",
"i18next-browser-languagedetector": "^8.0.0",
"immutability-helper": "^3.1.1",
"libphonenumber-js": "^1.11.4",
@@ -48,14 +48,14 @@
"query-string": "^9.0.0",
"raf-schd": "^4.0.3",
"react": "^18.3.1",
- "react-big-calendar": "^1.13.0",
+ "react-big-calendar": "^1.13.1",
"react-color": "^2.19.3",
"react-cookie": "^7.1.4",
"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": "^14.1.2",
+ "react-i18next": "^14.1.3",
"react-icons": "^5.2.1",
"react-image-lightbox": "^5.1.4",
"react-joyride": "^2.8.2",
@@ -68,7 +68,7 @@
"react-router-dom": "^6.24.1",
"react-sticky": "^6.0.3",
"react-virtualized": "^9.22.5",
- "react-virtuoso": "^4.7.11",
+ "react-virtuoso": "^4.7.12",
"recharts": "^2.12.7",
"redux": "^5.0.1",
"redux-actions": "^3.0.0",
@@ -76,7 +76,7 @@
"redux-saga": "^1.3.0",
"redux-state-sync": "^3.1.4",
"reselect": "^5.1.1",
- "sass": "^1.77.6",
+ "sass": "^1.77.8",
"socket.io-client": "^4.7.5",
"styled-components": "^6.1.11",
"subscriptions-transport-ws": "^0.11.0",
@@ -132,12 +132,12 @@
"devDependencies": {
"@babel/plugin-proposal-private-property-in-object": "^7.21.11",
"@babel/preset-react": "^7.24.7",
- "@dotenvx/dotenvx": "^1.5.0",
+ "@dotenvx/dotenvx": "^1.6.4",
"@emotion/babel-plugin": "^11.11.0",
"@emotion/react": "^11.11.4",
- "@sentry/webpack-plugin": "^2.20.1",
+ "@sentry/webpack-plugin": "^2.21.1",
"@testing-library/cypress": "^10.0.2",
- "browserslist": "^4.23.1",
+ "browserslist": "^4.23.2",
"browserslist-to-esbuild": "^2.1.1",
"cross-env": "^7.0.3",
"cypress": "^13.13.0",
@@ -149,7 +149,7 @@
"react-error-overlay": "6.0.11",
"redux-logger": "^3.0.6",
"source-map-explorer": "^2.5.3",
- "vite": "^5.3.3",
+ "vite": "^5.3.4",
"vite-plugin-babel": "^1.2.0",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-legacy": "^2.1.0",
diff --git a/client/src/components/dms-post-form/dms-post-form.component.jsx b/client/src/components/dms-post-form/dms-post-form.component.jsx
index 89738cc95..46bad37c3 100644
--- a/client/src/components/dms-post-form/dms-post-form.component.jsx
+++ b/client/src/components/dms-post-form/dms-post-form.component.jsx
@@ -14,7 +14,6 @@ import {
Typography
} from "antd";
import Dinero from "dinero.js";
-import dayjs from "../../utils/day";
import React from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
@@ -22,6 +21,7 @@ import { createStructuredSelector } from "reselect";
import { determineDmsType } from "../../pages/dms/dms.container";
import { selectBodyshop } from "../../redux/user/user.selectors";
import i18n from "../../translations/i18n";
+import dayjs from "../../utils/day";
import DmsCdkMakes from "../dms-cdk-makes/dms-cdk-makes.component";
import DmsCdkMakesRefetch from "../dms-cdk-makes/dms-cdk-makes.refetch.component";
import FormDatePicker from "../form-date-picker/form-date-picker.component";
@@ -89,7 +89,7 @@ export function DmsPostForm({ bodyshop, socket, job, logsRef }) {
job.area_of_damage && job.area_of_damage.impact1
? " " +
t("jobs.labels.dms.damageto", {
- area_of_damage: (job.area_of_damage && job.area_of_damage.impact1) || "UNKNOWN"
+ area_of_damage: (job.area_of_damage && job.area_of_damage.impact1.padStart(2, "0")) || "UNKNOWN"
})
: ""
}`.slice(0, 239),
diff --git a/client/src/components/job-close-ro-guard/job-close-ro-guard.container.jsx b/client/src/components/job-close-ro-guard/job-close-ro-guard.container.jsx
index 16451593f..3df37d3fa 100644
--- a/client/src/components/job-close-ro-guard/job-close-ro-guard.container.jsx
+++ b/client/src/components/job-close-ro-guard/job-close-ro-guard.container.jsx
@@ -1,6 +1,6 @@
-import React, { useCallback, useState } from "react";
import { LockOutlined } from "@ant-design/icons";
import { Badge, Card, Col, Collapse, Form, Input, Row, Space, Tooltip } from "antd";
+import React, { useCallback, useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
@@ -12,9 +12,9 @@ import JobCloseRoGuardBills from "./job-close-ro-guard.bills";
import JobCloseRoGuardPpd from "./job-close-ro-guard.ppd";
import JobCloseRoGuardProfit from "./job-close-ro-guard.profit";
import "./job-close-ro-guard.styles.scss";
-import JobCloseRoGuardSublet from "./job-close-ro-guard.sublet";
-import JobCloseRoGuardTtLifecycle from "./job-close-ro-guard.tt-lifecycle";
+// import JobCloseRoGuardSublet from "./job-close-ro-guard.sublet";
import InstanceRenderManager from "../../utils/instanceRenderMgr";
+import JobCloseRoGuardTtLifecycle from "./job-close-ro-guard.tt-lifecycle";
const mapStateToProps = createStructuredSelector({
//currentUser: selectCurrentUser
diff --git a/client/src/components/job-detail-cards/job-detail-cards.damage.component.jsx b/client/src/components/job-detail-cards/job-detail-cards.damage.component.jsx
index e899344d4..00e0a01b4 100644
--- a/client/src/components/job-detail-cards/job-detail-cards.damage.component.jsx
+++ b/client/src/components/job-detail-cards/job-detail-cards.damage.component.jsx
@@ -1,14 +1,21 @@
import React from "react";
import { useTranslation } from "react-i18next";
-import CardTemplate from "./job-detail-cards.template.component";
import Car from "../job-damage-visual/job-damage-visual.component";
+import CardTemplate from "./job-detail-cards.template.component";
export default function JobDetailCardsDamageComponent({ loading, data }) {
const { t } = useTranslation();
const { area_of_damage } = data;
return (
- {area_of_damage ? : t("jobs.errors.nodamage")}
+ {area_of_damage ? (
+
+ ) : (
+ t("jobs.errors.nodamage")
+ )}
);
}
diff --git a/client/src/components/job-detail-cards/job-detail-cards.parts.component.jsx b/client/src/components/job-detail-cards/job-detail-cards.parts.component.jsx
index 92e875f99..a567918f5 100644
--- a/client/src/components/job-detail-cards/job-detail-cards.parts.component.jsx
+++ b/client/src/components/job-detail-cards/job-detail-cards.parts.component.jsx
@@ -26,6 +26,16 @@ export function JobDetailCardsPartsComponent({ loading, data, jobRO }) {
const { t } = useTranslation();
const { joblines_status } = data;
+ const filteredJobLines = data.joblines.filter(
+ (j) =>
+ j.part_type !== null &&
+ j.part_type !== "PAE" &&
+ j.part_type !== "PAS" &&
+ j.part_type !== "PASL" &&
+ j.part_qty !== 0 &&
+ j.act_price !== 0
+ );
+//TODO: Correct jobline_statuses view by including the part_qty !== 0 and act_price !== 0
const columns = [
{
title: t("joblines.fields.line_desc"),
@@ -95,7 +105,7 @@ export function JobDetailCardsPartsComponent({ loading, data, jobRO }) {
);
diff --git a/client/src/components/jobs-detail-general/jobs-detail-general.component.jsx b/client/src/components/jobs-detail-general/jobs-detail-general.component.jsx
index ac1976e34..df2b43cd0 100644
--- a/client/src/components/jobs-detail-general/jobs-detail-general.component.jsx
+++ b/client/src/components/jobs-detail-general/jobs-detail-general.component.jsx
@@ -189,7 +189,10 @@ export function JobsDetailGeneral({ bodyshop, jobRO, job, form }) {
{job.area_of_damage ? (
-
+
) : (
t("jobs.errors.nodamage")
)}
diff --git a/client/src/components/production-board-kanban/production-board-kanban.component.jsx b/client/src/components/production-board-kanban/production-board-kanban.component.jsx
index f191bd339..705a15637 100644
--- a/client/src/components/production-board-kanban/production-board-kanban.component.jsx
+++ b/client/src/components/production-board-kanban/production-board-kanban.component.jsx
@@ -72,6 +72,7 @@ export function ProductionBoardKanbanComponent({
setIsMoving(true);
setBoardLanes(moveCard(boardLanes, source, destination));
+
const sameColumnTransfer = source.fromColumnId === destination.toColumnId;
const sourceColumn = boardLanes.columns.find((x) => x.id === source.fromColumnId);
const destinationColumn = boardLanes.columns.find((x) => x.id === destination.toColumnId);
diff --git a/client/src/components/shop-info/shop-info.responsibilitycenters.component.jsx b/client/src/components/shop-info/shop-info.responsibilitycenters.component.jsx
index e0437fef0..ca3c4722d 100644
--- a/client/src/components/shop-info/shop-info.responsibilitycenters.component.jsx
+++ b/client/src/components/shop-info/shop-info.responsibilitycenters.component.jsx
@@ -1,17 +1,17 @@
import { DeleteFilled } from "@ant-design/icons";
-import { Button, Form, Input, InputNumber, Select, Space, Switch, Typography } from "antd";
+import { useSplitTreatments } from "@splitsoftware/splitio-react";
+import { Button, Form, Input, InputNumber, Select, Space, Switch } from "antd";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
-import styled from "styled-components";
-import LayoutFormRow from "../layout-form-row/layout-form-row.component";
-import DataLabel from "../data-label/data-label.component";
-import { selectBodyshop } from "../../redux/user/user.selectors";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
-import { useSplitTreatments } from "@splitsoftware/splitio-react";
-import ShopInfoResponsibilitycentersTaxesComponent from "./shop-info.responsibilitycenters.taxes.component";
+import styled from "styled-components";
+import { selectBodyshop } from "../../redux/user/user.selectors";
import InstanceRenderManager from "../../utils/instanceRenderMgr";
+import DataLabel from "../data-label/data-label.component";
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
+import LayoutFormRow from "../layout-form-row/layout-form-row.component";
+import ShopInfoResponsibilitycentersTaxesComponent from "./shop-info.responsibilitycenters.taxes.component";
const SelectorDiv = styled.div`
.ant-form-item .ant-select {
@@ -214,7 +214,6 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) {
-
{
@@ -274,7 +273,6 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) {
>
-
{
remove(field.name);
@@ -386,7 +384,6 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) {
>
*/}
-
{(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && (
-
{(fields, { add, remove, move }) => {
@@ -579,1631 +575,1632 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) {
}}
-
{(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && (
<>
-
- {(fields, { add, remove, move }) => {
- return (
-
- {fields.map((field, index) => (
-
-
-
-
-
-
-
-
-
- {
- remove(field.name);
- }}
- />
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
- }
- return Promise.reject(t("bodyshop.validation.centermustexist"));
+
+
+ {(fields, { add, remove, move }) => {
+ return (
+
+ {fields.map((field, index) => (
+
+
+ 0 ? false : true}>
+
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ ]}
+ >
+
+
+
+
+
+ {
+ remove(field.name);
+ }}
+ />
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-LAA`}
- name={[field.name, "costs", "LAA"]}
- >
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-ats`}
+ name={[field.name, "costs", "ATS"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-LAB`}
- name={[field.name, "costs", "LAB"]}
- >
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-LAA`}
+ name={[field.name, "costs", "LAA"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-LAD`}
- name={[field.name, "costs", "LAD"]}
- >
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-LAB`}
+ name={[field.name, "costs", "LAB"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-LAE`}
- name={[field.name, "costs", "LAE"]}
- >
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-LAD`}
+ name={[field.name, "costs", "LAD"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-LAF`}
- name={[field.name, "costs", "LAF"]}
- >
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-LAE`}
+ name={[field.name, "costs", "LAE"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-LAG`}
- name={[field.name, "costs", "LAG"]}
- >
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-LAF`}
+ name={[field.name, "costs", "LAF"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-LAM`}
- name={[field.name, "costs", "LAM"]}
- >
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-LAG`}
+ name={[field.name, "costs", "LAG"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-LAR`}
- name={[field.name, "costs", "LAR"]}
- >
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-LAM`}
+ name={[field.name, "costs", "LAM"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-LAS`}
- name={[field.name, "costs", "LAS"]}
- >
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-LAR`}
+ name={[field.name, "costs", "LAR"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-LAU`}
- name={[field.name, "costs", "LAU"]}
- >
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-LAS`}
+ name={[field.name, "costs", "LAS"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-LA1`}
- name={[field.name, "costs", "LA1"]}
- >
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-LAU`}
+ name={[field.name, "costs", "LAU"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-LA2`}
- name={[field.name, "costs", "LA2"]}
- >
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-LA1`}
+ name={[field.name, "costs", "LA1"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-LA3`}
- name={[field.name, "costs", "LA3"]}
- >
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-LA2`}
+ name={[field.name, "costs", "LA2"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-LA4`}
- name={[field.name, "costs", "LA4"]}
- >
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-LA3`}
+ name={[field.name, "costs", "LA3"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-PAA`}
- name={[field.name, "costs", "PAA"]}
- >
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-LA4`}
+ name={[field.name, "costs", "LA4"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-PAC`}
- name={[field.name, "costs", "PAC"]}
- >
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-PAA`}
+ name={[field.name, "costs", "PAA"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-PAG`}
- name={[field.name, "costs", "PAG"]}
- >
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-PAC`}
+ name={[field.name, "costs", "PAC"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-PAL`}
- name={[field.name, "costs", "PAL"]}
- >
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-PAG`}
+ name={[field.name, "costs", "PAG"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-PAM`}
- name={[field.name, "costs", "PAM"]}
- >
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-PAL`}
+ name={[field.name, "costs", "PAL"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-PAN`}
- name={[field.name, "costs", "PAN"]}
- >
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-PAM`}
+ name={[field.name, "costs", "PAM"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-PAO`}
- name={[field.name, "costs", "PAO"]}
- >
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-PAN`}
+ name={[field.name, "costs", "PAN"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-PAP`}
- name={[field.name, "costs", "PAP"]}
- >
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-PAO`}
+ name={[field.name, "costs", "PAO"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-PAR`}
- name={[field.name, "costs", "PAR"]}
- >
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-PAP`}
+ name={[field.name, "costs", "PAP"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-PAS`}
- name={[field.name, "costs", "PAS"]}
- >
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-PAR`}
+ name={[field.name, "costs", "PAR"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-PASL`}
- name={[field.name, "costs", "PASL"]}
- >
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-PAS`}
+ name={[field.name, "costs", "PAS"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-TOW`}
- name={[field.name, "costs", "TOW"]}
- >
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-PASL`}
+ name={[field.name, "costs", "PASL"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-MAPA`}
- name={[field.name, "costs", "MAPA"]}
- >
-
-
- ({
- validator(rule, value) {
- if (costOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-TOW`}
+ name={[field.name, "costs", "TOW"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}costs-MASH`}
- name={[field.name, "costs", "MASH"]}
- >
-
-
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-MAPA`}
+ name={[field.name, "costs", "MAPA"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (costOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-ATS`}
- name={[field.name, "profits", "ATS"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}costs-MASH`}
+ name={[field.name, "costs", "MASH"]}
+ >
+
+
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-LAA`}
- name={[field.name, "profits", "LAA"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}profits-ATS`}
+ name={[field.name, "profits", "ATS"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-LAB`}
- name={[field.name, "profits", "LAB"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}profits-LAA`}
+ name={[field.name, "profits", "LAA"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-LAD`}
- name={[field.name, "profits", "LAD"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}profits-LAB`}
+ name={[field.name, "profits", "LAB"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-LAE`}
- name={[field.name, "profits", "LAE"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}profits-LAD`}
+ name={[field.name, "profits", "LAD"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-LAF`}
- name={[field.name, "profits", "LAF"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}profits-LAE`}
+ name={[field.name, "profits", "LAE"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-LAG`}
- name={[field.name, "profits", "LAG"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}profits-LAF`}
+ name={[field.name, "profits", "LAF"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-LAM`}
- name={[field.name, "profits", "LAM"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}profits-LAG`}
+ name={[field.name, "profits", "LAG"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-LAR`}
- name={[field.name, "profits", "LAR"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}profits-LAM`}
+ name={[field.name, "profits", "LAM"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-LAS`}
- name={[field.name, "profits", "LAS"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}profits-LAR`}
+ name={[field.name, "profits", "LAR"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-LAU`}
- name={[field.name, "profits", "LAU"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}profits-LAS`}
+ name={[field.name, "profits", "LAS"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-LA1`}
- name={[field.name, "profits", "LA1"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}profits-LAU`}
+ name={[field.name, "profits", "LAU"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-LA2`}
- name={[field.name, "profits", "LA2"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}profits-LA1`}
+ name={[field.name, "profits", "LA1"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-LA3`}
- name={[field.name, "profits", "LA3"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}profits-LA2`}
+ name={[field.name, "profits", "LA2"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-LA4`}
- name={[field.name, "profits", "LA4"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}profits-LA3`}
+ name={[field.name, "profits", "LA3"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-PAA`}
- name={[field.name, "profits", "PAA"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}profits-LA4`}
+ name={[field.name, "profits", "LA4"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-PAC`}
- name={[field.name, "profits", "PAC"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}profits-PAA`}
+ name={[field.name, "profits", "PAA"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-PAG`}
- name={[field.name, "profits", "PAG"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}profits-PAC`}
+ name={[field.name, "profits", "PAC"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-PAL`}
- name={[field.name, "profits", "PAL"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}profits-PAG`}
+ name={[field.name, "profits", "PAG"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-PAM`}
- name={[field.name, "profits", "PAM"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}profits-PAL`}
+ name={[field.name, "profits", "PAL"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-PAN`}
- name={[field.name, "profits", "PAN"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}profits-PAM`}
+ name={[field.name, "profits", "PAM"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-PAO`}
- name={[field.name, "profits", "PAO"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}profits-PAN`}
+ name={[field.name, "profits", "PAN"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-PAP`}
- name={[field.name, "profits", "PAP"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}profits-PAO`}
+ name={[field.name, "profits", "PAO"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-PAR`}
- name={[field.name, "profits", "PAR"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}profits-PAP`}
+ name={[field.name, "profits", "PAP"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-PAS`}
- name={[field.name, "profits", "PAS"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}profits-PAR`}
+ name={[field.name, "profits", "PAR"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-PASL`}
- name={[field.name, "profits", "PASL"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}profits-PAS`}
+ name={[field.name, "profits", "PAS"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-TOW`}
- name={[field.name, "profits", "TOW"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}profits-PASL`}
+ name={[field.name, "profits", "PASL"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-MAPA`}
- name={[field.name, "profits", "MAPA"]}
- >
-
-
- ({
- validator(rule, value) {
- if (profitOptions.includes(value)) {
- return Promise.resolve();
+ })
+ ]}
+ key={`${index}profits-TOW`}
+ name={[field.name, "profits", "TOW"]}
+ >
+
+
+ ({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
}
- return Promise.reject(t("bodyshop.validation.centermustexist"));
- }
- })
- ]}
- key={`${index}profits-MASH`}
- name={[field.name, "profits", "MASH"]}
- >
-
-
-
-
+ })
+ ]}
+ key={`${index}profits-MAPA`}
+ name={[field.name, "profits", "MAPA"]}
+ >
+
+
+
({
+ validator(rule, value) {
+ if (profitOptions.includes(value)) {
+ return Promise.resolve();
+ }
+ return Promise.reject(t("bodyshop.validation.centermustexist"));
+ }
+ })
+ ]}
+ key={`${index}profits-MASH`}
+ name={[field.name, "profits", "MASH"]}
+ >
+
+
+
+
+
+ ))}
+
+
- ))}
-
-
-
-
- );
- }}
-
+
+ );
+ }}
+
+
>
)}
@@ -3720,7 +3717,6 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) {
-
)}
- {t("bodyshop.labels.responsibilitycenters.sales_tax_codes")}
-
- {(fields, { add, remove }) => {
- return (
-
+ );
+ }}
+
+
);
}
diff --git a/client/src/graphql/jobs.queries.js b/client/src/graphql/jobs.queries.js
index c6eff8adf..377552b72 100644
--- a/client/src/graphql/jobs.queries.js
+++ b/client/src/graphql/jobs.queries.js
@@ -905,7 +905,7 @@ export const QUERY_JOB_CARD_DETAILS = gql`
}
joblines(
- where: { removed: { _eq: false }, part_type: { _is_null: false, _nin: ["PAE", "PAS", "PASL"] } }
+ where: { removed: { _eq: false } }
order_by: { line_no: asc }
) {
id
diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json
index 7019097ed..6b76a6ed0 100644
--- a/client/src/translations/en_us/common.json
+++ b/client/src/translations/en_us/common.json
@@ -647,7 +647,10 @@
"payers": "Payers"
},
"cdk_dealerid": "CDK Dealer ID",
+ "costsmapping": "Costs Mapping",
+ "dms_allocations": "DMS Allocations",
"pbs_serialnumber": "PBS Serial Number",
+ "profitsmapping": "Profits Mapping",
"title": "DMS"
},
"emaillater": "Email Later",
diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json
index 51a33bc0c..48d6f107d 100644
--- a/client/src/translations/es/common.json
+++ b/client/src/translations/es/common.json
@@ -647,7 +647,10 @@
"payers": ""
},
"cdk_dealerid": "",
+ "costsmapping": "",
+ "dms_allocations": "",
"pbs_serialnumber": "",
+ "profitsmapping": "",
"title": ""
},
"emaillater": "",
diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json
index e3821ef9b..3fd409e2a 100644
--- a/client/src/translations/fr/common.json
+++ b/client/src/translations/fr/common.json
@@ -647,7 +647,10 @@
"payers": ""
},
"cdk_dealerid": "",
+ "costsmapping": "",
+ "dms_allocations": "",
"pbs_serialnumber": "",
+ "profitsmapping": "",
"title": ""
},
"emaillater": "",
diff --git a/hasura/migrations/1720712957502_run_sql_migration/down.sql b/hasura/migrations/1720712957502_run_sql_migration/down.sql
new file mode 100644
index 000000000..25f6a61a9
--- /dev/null
+++ b/hasura/migrations/1720712957502_run_sql_migration/down.sql
@@ -0,0 +1,10 @@
+-- Could not auto-generate a down migration.
+-- Please write an appropriate down migration for the SQL below:
+-- CREATE OR REPLACE VIEW "public"."joblines_status" AS
+-- SELECT j.jobid,
+-- j.status,
+-- count(1) AS count,
+-- j.part_type
+-- FROM joblines j
+-- WHERE ((j.part_type IS NOT NULL) AND (j.part_type <> 'PAE'::text) AND (j.part_type <> 'PAS'::text) AND (j.part_type <> 'PASL'::text) AND (j.part_qty <> 0) AND (j.act_price <> 0) AND (j.removed IS FALSE))
+-- GROUP BY j.jobid, j.status, j.part_type;
diff --git a/hasura/migrations/1720712957502_run_sql_migration/up.sql b/hasura/migrations/1720712957502_run_sql_migration/up.sql
new file mode 100644
index 000000000..8ffd417d5
--- /dev/null
+++ b/hasura/migrations/1720712957502_run_sql_migration/up.sql
@@ -0,0 +1,8 @@
+CREATE OR REPLACE VIEW "public"."joblines_status" AS
+ SELECT j.jobid,
+ j.status,
+ count(1) AS count,
+ j.part_type
+ FROM joblines j
+ WHERE ((j.part_type IS NOT NULL) AND (j.part_type <> 'PAE'::text) AND (j.part_type <> 'PAS'::text) AND (j.part_type <> 'PASL'::text) AND (j.part_qty <> 0) AND (j.act_price <> 0) AND (j.removed IS FALSE))
+ GROUP BY j.jobid, j.status, j.part_type;
diff --git a/hasura/migrations/1720713022389_run_sql_migration/down.sql b/hasura/migrations/1720713022389_run_sql_migration/down.sql
new file mode 100644
index 000000000..6e9bfe3ec
--- /dev/null
+++ b/hasura/migrations/1720713022389_run_sql_migration/down.sql
@@ -0,0 +1,10 @@
+-- Could not auto-generate a down migration.
+-- Please write an appropriate down migration for the SQL below:
+-- CREATE OR REPLACE VIEW "public"."joblines_status" AS
+-- SELECT j.jobid,
+-- j.status,
+-- count(1) AS count,
+-- j.part_type
+-- FROM joblines j
+-- WHERE ((j.part_type IS NOT NULL) AND (j.part_type <> 'PAE'::text) AND (j.part_type <> 'PAS'::text) AND (j.part_type <> 'PASL'::text) AND (j.part_qty <> (0)::numeric) AND (j.act_price <> (0)::numeric) AND (j.removed IS FALSE))
+-- GROUP BY j.jobid, j.status, j.part_type;
diff --git a/hasura/migrations/1720713022389_run_sql_migration/up.sql b/hasura/migrations/1720713022389_run_sql_migration/up.sql
new file mode 100644
index 000000000..109db1e8e
--- /dev/null
+++ b/hasura/migrations/1720713022389_run_sql_migration/up.sql
@@ -0,0 +1,8 @@
+CREATE OR REPLACE VIEW "public"."joblines_status" AS
+ SELECT j.jobid,
+ j.status,
+ count(1) AS count,
+ j.part_type
+ FROM joblines j
+ WHERE ((j.part_type IS NOT NULL) AND (j.part_type <> 'PAE'::text) AND (j.part_type <> 'PAS'::text) AND (j.part_type <> 'PASL'::text) AND (j.part_qty <> (0)::numeric) AND (j.act_price <> (0)::numeric) AND (j.removed IS FALSE))
+ GROUP BY j.jobid, j.status, j.part_type;
diff --git a/package-lock.json b/package-lock.json
index a244f07f8..52ebbb3f5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,15 +9,17 @@
"version": "0.2.0",
"license": "UNLICENSED",
"dependencies": {
- "@aws-sdk/client-secrets-manager": "^3.609.0",
- "@aws-sdk/client-ses": "^3.609.0",
- "@aws-sdk/credential-provider-node": "^3.609.0",
+ "@aws-sdk/client-secrets-manager": "^3.614.0",
+ "@aws-sdk/client-ses": "^3.614.0",
+ "@aws-sdk/credential-provider-node": "^3.614.0",
"@opensearch-project/opensearch": "^2.10.0",
"aws4": "^1.13.0",
"axios": "^1.7.2",
"better-queue": "^3.8.12",
"bluebird": "^3.7.2",
"body-parser": "^1.20.2",
+ "canvas": "^2.11.2",
+ "chart.js": "^4.4.3",
"cloudinary": "^2.2.0",
"compression": "^1.7.4",
"cookie-parser": "^1.4.6",
@@ -42,8 +44,8 @@
"nodemailer": "^6.9.14",
"phone": "^3.1.49",
"recursive-diff": "^1.0.9",
- "rimraf": "^6.0.0",
- "soap": "^1.0.4",
+ "rimraf": "^6.0.1",
+ "soap": "^1.1.0",
"socket.io": "^4.7.5",
"ssh2-sftp-client": "^10.0.3",
"twilio": "^4.23.0",
@@ -54,7 +56,7 @@
"devDependencies": {
"@trivago/prettier-plugin-sort-imports": "^4.3.0",
"concurrently": "^8.2.2",
- "prettier": "^3.3.2",
+ "prettier": "^3.3.3",
"source-map-explorer": "^2.5.2"
},
"engines": {
@@ -178,47 +180,47 @@
}
},
"node_modules/@aws-sdk/client-secrets-manager": {
- "version": "3.609.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.609.0.tgz",
- "integrity": "sha512-1vDLUl0TuZx7TATsYkIaKj9etNzTpFVF95FpfFnJeyen397tYLot5sUNkcMCJvOLbdNVnJo1o5F8GNfU776EIQ==",
+ "version": "3.614.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.614.0.tgz",
+ "integrity": "sha512-gxCYaRYF78R5xBxXoKdF+xiWiElIJqOTSNxjt28ch+GEn9TNAYwpQcTxejBZ5VxeDwbmBjRaB9Vpx9FPeImTMw==",
"dependencies": {
"@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0",
- "@aws-sdk/client-sso-oidc": "3.609.0",
- "@aws-sdk/client-sts": "3.609.0",
- "@aws-sdk/core": "3.609.0",
- "@aws-sdk/credential-provider-node": "3.609.0",
+ "@aws-sdk/client-sso-oidc": "3.614.0",
+ "@aws-sdk/client-sts": "3.614.0",
+ "@aws-sdk/core": "3.614.0",
+ "@aws-sdk/credential-provider-node": "3.614.0",
"@aws-sdk/middleware-host-header": "3.609.0",
"@aws-sdk/middleware-logger": "3.609.0",
"@aws-sdk/middleware-recursion-detection": "3.609.0",
- "@aws-sdk/middleware-user-agent": "3.609.0",
- "@aws-sdk/region-config-resolver": "3.609.0",
+ "@aws-sdk/middleware-user-agent": "3.614.0",
+ "@aws-sdk/region-config-resolver": "3.614.0",
"@aws-sdk/types": "3.609.0",
- "@aws-sdk/util-endpoints": "3.609.0",
+ "@aws-sdk/util-endpoints": "3.614.0",
"@aws-sdk/util-user-agent-browser": "3.609.0",
- "@aws-sdk/util-user-agent-node": "3.609.0",
- "@smithy/config-resolver": "^3.0.4",
- "@smithy/core": "^2.2.4",
- "@smithy/fetch-http-handler": "^3.2.0",
+ "@aws-sdk/util-user-agent-node": "3.614.0",
+ "@smithy/config-resolver": "^3.0.5",
+ "@smithy/core": "^2.2.6",
+ "@smithy/fetch-http-handler": "^3.2.1",
"@smithy/hash-node": "^3.0.3",
"@smithy/invalid-dependency": "^3.0.3",
"@smithy/middleware-content-length": "^3.0.3",
- "@smithy/middleware-endpoint": "^3.0.4",
- "@smithy/middleware-retry": "^3.0.7",
+ "@smithy/middleware-endpoint": "^3.0.5",
+ "@smithy/middleware-retry": "^3.0.9",
"@smithy/middleware-serde": "^3.0.3",
"@smithy/middleware-stack": "^3.0.3",
- "@smithy/node-config-provider": "^3.1.3",
- "@smithy/node-http-handler": "^3.1.1",
+ "@smithy/node-config-provider": "^3.1.4",
+ "@smithy/node-http-handler": "^3.1.2",
"@smithy/protocol-http": "^4.0.3",
- "@smithy/smithy-client": "^3.1.5",
+ "@smithy/smithy-client": "^3.1.7",
"@smithy/types": "^3.3.0",
"@smithy/url-parser": "^3.0.3",
"@smithy/util-base64": "^3.0.0",
"@smithy/util-body-length-browser": "^3.0.0",
"@smithy/util-body-length-node": "^3.0.0",
- "@smithy/util-defaults-mode-browser": "^3.0.7",
- "@smithy/util-defaults-mode-node": "^3.0.7",
- "@smithy/util-endpoints": "^2.0.4",
+ "@smithy/util-defaults-mode-browser": "^3.0.9",
+ "@smithy/util-defaults-mode-node": "^3.0.9",
+ "@smithy/util-endpoints": "^2.0.5",
"@smithy/util-middleware": "^3.0.3",
"@smithy/util-retry": "^3.0.3",
"@smithy/util-utf8": "^3.0.0",
@@ -242,47 +244,47 @@
}
},
"node_modules/@aws-sdk/client-ses": {
- "version": "3.609.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-ses/-/client-ses-3.609.0.tgz",
- "integrity": "sha512-tfTfTl8IuKcOLFSlUA6XCSbzAVQ+MCdCl0Fme2Rd/GsKgB3Momyh4HcVHI09S5HaYTo/7P3ovJBOdv6JcKVDDw==",
+ "version": "3.614.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-ses/-/client-ses-3.614.0.tgz",
+ "integrity": "sha512-PbnnfIq2oNy+Um++rzqAk+7+OXtRzv6EymiIhvRYCq/T5rRVPjuIgV3mjrxl8hrF4SIAq40YVojzT1DITERFiw==",
"dependencies": {
"@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0",
- "@aws-sdk/client-sso-oidc": "3.609.0",
- "@aws-sdk/client-sts": "3.609.0",
- "@aws-sdk/core": "3.609.0",
- "@aws-sdk/credential-provider-node": "3.609.0",
+ "@aws-sdk/client-sso-oidc": "3.614.0",
+ "@aws-sdk/client-sts": "3.614.0",
+ "@aws-sdk/core": "3.614.0",
+ "@aws-sdk/credential-provider-node": "3.614.0",
"@aws-sdk/middleware-host-header": "3.609.0",
"@aws-sdk/middleware-logger": "3.609.0",
"@aws-sdk/middleware-recursion-detection": "3.609.0",
- "@aws-sdk/middleware-user-agent": "3.609.0",
- "@aws-sdk/region-config-resolver": "3.609.0",
+ "@aws-sdk/middleware-user-agent": "3.614.0",
+ "@aws-sdk/region-config-resolver": "3.614.0",
"@aws-sdk/types": "3.609.0",
- "@aws-sdk/util-endpoints": "3.609.0",
+ "@aws-sdk/util-endpoints": "3.614.0",
"@aws-sdk/util-user-agent-browser": "3.609.0",
- "@aws-sdk/util-user-agent-node": "3.609.0",
- "@smithy/config-resolver": "^3.0.4",
- "@smithy/core": "^2.2.4",
- "@smithy/fetch-http-handler": "^3.2.0",
+ "@aws-sdk/util-user-agent-node": "3.614.0",
+ "@smithy/config-resolver": "^3.0.5",
+ "@smithy/core": "^2.2.6",
+ "@smithy/fetch-http-handler": "^3.2.1",
"@smithy/hash-node": "^3.0.3",
"@smithy/invalid-dependency": "^3.0.3",
"@smithy/middleware-content-length": "^3.0.3",
- "@smithy/middleware-endpoint": "^3.0.4",
- "@smithy/middleware-retry": "^3.0.7",
+ "@smithy/middleware-endpoint": "^3.0.5",
+ "@smithy/middleware-retry": "^3.0.9",
"@smithy/middleware-serde": "^3.0.3",
"@smithy/middleware-stack": "^3.0.3",
- "@smithy/node-config-provider": "^3.1.3",
- "@smithy/node-http-handler": "^3.1.1",
+ "@smithy/node-config-provider": "^3.1.4",
+ "@smithy/node-http-handler": "^3.1.2",
"@smithy/protocol-http": "^4.0.3",
- "@smithy/smithy-client": "^3.1.5",
+ "@smithy/smithy-client": "^3.1.7",
"@smithy/types": "^3.3.0",
"@smithy/url-parser": "^3.0.3",
"@smithy/util-base64": "^3.0.0",
"@smithy/util-body-length-browser": "^3.0.0",
"@smithy/util-body-length-node": "^3.0.0",
- "@smithy/util-defaults-mode-browser": "^3.0.7",
- "@smithy/util-defaults-mode-node": "^3.0.7",
- "@smithy/util-endpoints": "^2.0.4",
+ "@smithy/util-defaults-mode-browser": "^3.0.9",
+ "@smithy/util-defaults-mode-node": "^3.0.9",
+ "@smithy/util-endpoints": "^2.0.5",
"@smithy/util-middleware": "^3.0.3",
"@smithy/util-retry": "^3.0.3",
"@smithy/util-utf8": "^3.0.0",
@@ -294,44 +296,44 @@
}
},
"node_modules/@aws-sdk/client-sso": {
- "version": "3.609.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.609.0.tgz",
- "integrity": "sha512-gqXGFDkIpKHCKAbeJK4aIDt3tiwJ26Rf5Tqw9JS6BYXsdMeOB8FTzqD9R+Yc1epHd8s5L94sdqXT5PapgxFZrg==",
+ "version": "3.614.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.614.0.tgz",
+ "integrity": "sha512-p5pyYaxRzBttjBkqfc8i3K7DzBdTg3ECdVgBo6INIUxfvDy0J8QUE8vNtCgvFIkq+uPw/8M+Eo4zzln7anuO0Q==",
"dependencies": {
"@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0",
- "@aws-sdk/core": "3.609.0",
+ "@aws-sdk/core": "3.614.0",
"@aws-sdk/middleware-host-header": "3.609.0",
"@aws-sdk/middleware-logger": "3.609.0",
"@aws-sdk/middleware-recursion-detection": "3.609.0",
- "@aws-sdk/middleware-user-agent": "3.609.0",
- "@aws-sdk/region-config-resolver": "3.609.0",
+ "@aws-sdk/middleware-user-agent": "3.614.0",
+ "@aws-sdk/region-config-resolver": "3.614.0",
"@aws-sdk/types": "3.609.0",
- "@aws-sdk/util-endpoints": "3.609.0",
+ "@aws-sdk/util-endpoints": "3.614.0",
"@aws-sdk/util-user-agent-browser": "3.609.0",
- "@aws-sdk/util-user-agent-node": "3.609.0",
- "@smithy/config-resolver": "^3.0.4",
- "@smithy/core": "^2.2.4",
- "@smithy/fetch-http-handler": "^3.2.0",
+ "@aws-sdk/util-user-agent-node": "3.614.0",
+ "@smithy/config-resolver": "^3.0.5",
+ "@smithy/core": "^2.2.6",
+ "@smithy/fetch-http-handler": "^3.2.1",
"@smithy/hash-node": "^3.0.3",
"@smithy/invalid-dependency": "^3.0.3",
"@smithy/middleware-content-length": "^3.0.3",
- "@smithy/middleware-endpoint": "^3.0.4",
- "@smithy/middleware-retry": "^3.0.7",
+ "@smithy/middleware-endpoint": "^3.0.5",
+ "@smithy/middleware-retry": "^3.0.9",
"@smithy/middleware-serde": "^3.0.3",
"@smithy/middleware-stack": "^3.0.3",
- "@smithy/node-config-provider": "^3.1.3",
- "@smithy/node-http-handler": "^3.1.1",
+ "@smithy/node-config-provider": "^3.1.4",
+ "@smithy/node-http-handler": "^3.1.2",
"@smithy/protocol-http": "^4.0.3",
- "@smithy/smithy-client": "^3.1.5",
+ "@smithy/smithy-client": "^3.1.7",
"@smithy/types": "^3.3.0",
"@smithy/url-parser": "^3.0.3",
"@smithy/util-base64": "^3.0.0",
"@smithy/util-body-length-browser": "^3.0.0",
"@smithy/util-body-length-node": "^3.0.0",
- "@smithy/util-defaults-mode-browser": "^3.0.7",
- "@smithy/util-defaults-mode-node": "^3.0.7",
- "@smithy/util-endpoints": "^2.0.4",
+ "@smithy/util-defaults-mode-browser": "^3.0.9",
+ "@smithy/util-defaults-mode-node": "^3.0.9",
+ "@smithy/util-endpoints": "^2.0.5",
"@smithy/util-middleware": "^3.0.3",
"@smithy/util-retry": "^3.0.3",
"@smithy/util-utf8": "^3.0.0",
@@ -342,45 +344,45 @@
}
},
"node_modules/@aws-sdk/client-sso-oidc": {
- "version": "3.609.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.609.0.tgz",
- "integrity": "sha512-0bNPAyPdkWkS9EGB2A9BZDkBNrnVCBzk5lYRezoT4K3/gi9w1DTYH5tuRdwaTZdxW19U1mq7CV0YJJARKO1L9Q==",
+ "version": "3.614.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.614.0.tgz",
+ "integrity": "sha512-BI1NWcpppbHg/28zbUg54dZeckork8BItZIcjls12vxasy+p3iEzrJVG60jcbUTTsk3Qc1tyxNfrdcVqx0y7Ww==",
"dependencies": {
"@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0",
- "@aws-sdk/core": "3.609.0",
- "@aws-sdk/credential-provider-node": "3.609.0",
+ "@aws-sdk/core": "3.614.0",
+ "@aws-sdk/credential-provider-node": "3.614.0",
"@aws-sdk/middleware-host-header": "3.609.0",
"@aws-sdk/middleware-logger": "3.609.0",
"@aws-sdk/middleware-recursion-detection": "3.609.0",
- "@aws-sdk/middleware-user-agent": "3.609.0",
- "@aws-sdk/region-config-resolver": "3.609.0",
+ "@aws-sdk/middleware-user-agent": "3.614.0",
+ "@aws-sdk/region-config-resolver": "3.614.0",
"@aws-sdk/types": "3.609.0",
- "@aws-sdk/util-endpoints": "3.609.0",
+ "@aws-sdk/util-endpoints": "3.614.0",
"@aws-sdk/util-user-agent-browser": "3.609.0",
- "@aws-sdk/util-user-agent-node": "3.609.0",
- "@smithy/config-resolver": "^3.0.4",
- "@smithy/core": "^2.2.4",
- "@smithy/fetch-http-handler": "^3.2.0",
+ "@aws-sdk/util-user-agent-node": "3.614.0",
+ "@smithy/config-resolver": "^3.0.5",
+ "@smithy/core": "^2.2.6",
+ "@smithy/fetch-http-handler": "^3.2.1",
"@smithy/hash-node": "^3.0.3",
"@smithy/invalid-dependency": "^3.0.3",
"@smithy/middleware-content-length": "^3.0.3",
- "@smithy/middleware-endpoint": "^3.0.4",
- "@smithy/middleware-retry": "^3.0.7",
+ "@smithy/middleware-endpoint": "^3.0.5",
+ "@smithy/middleware-retry": "^3.0.9",
"@smithy/middleware-serde": "^3.0.3",
"@smithy/middleware-stack": "^3.0.3",
- "@smithy/node-config-provider": "^3.1.3",
- "@smithy/node-http-handler": "^3.1.1",
+ "@smithy/node-config-provider": "^3.1.4",
+ "@smithy/node-http-handler": "^3.1.2",
"@smithy/protocol-http": "^4.0.3",
- "@smithy/smithy-client": "^3.1.5",
+ "@smithy/smithy-client": "^3.1.7",
"@smithy/types": "^3.3.0",
"@smithy/url-parser": "^3.0.3",
"@smithy/util-base64": "^3.0.0",
"@smithy/util-body-length-browser": "^3.0.0",
"@smithy/util-body-length-node": "^3.0.0",
- "@smithy/util-defaults-mode-browser": "^3.0.7",
- "@smithy/util-defaults-mode-node": "^3.0.7",
- "@smithy/util-endpoints": "^2.0.4",
+ "@smithy/util-defaults-mode-browser": "^3.0.9",
+ "@smithy/util-defaults-mode-node": "^3.0.9",
+ "@smithy/util-endpoints": "^2.0.5",
"@smithy/util-middleware": "^3.0.3",
"@smithy/util-retry": "^3.0.3",
"@smithy/util-utf8": "^3.0.0",
@@ -390,50 +392,50 @@
"node": ">=16.0.0"
},
"peerDependencies": {
- "@aws-sdk/client-sts": "^3.609.0"
+ "@aws-sdk/client-sts": "^3.614.0"
}
},
"node_modules/@aws-sdk/client-sts": {
- "version": "3.609.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.609.0.tgz",
- "integrity": "sha512-A0B3sDKFoFlGo8RYRjDBWHXpbgirer2bZBkCIzhSPHc1vOFHt/m2NcUoE2xnBKXJFrptL1xDkvo1P+XYp/BfcQ==",
+ "version": "3.614.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.614.0.tgz",
+ "integrity": "sha512-i6QmaVA1KHHYNnI2VYQy/sc31rLm4+jSp8b/YbQpFnD0w3aXsrEEHHlxek45uSkHb4Nrj1omFBVy/xp1WVYx2Q==",
"dependencies": {
"@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0",
- "@aws-sdk/client-sso-oidc": "3.609.0",
- "@aws-sdk/core": "3.609.0",
- "@aws-sdk/credential-provider-node": "3.609.0",
+ "@aws-sdk/client-sso-oidc": "3.614.0",
+ "@aws-sdk/core": "3.614.0",
+ "@aws-sdk/credential-provider-node": "3.614.0",
"@aws-sdk/middleware-host-header": "3.609.0",
"@aws-sdk/middleware-logger": "3.609.0",
"@aws-sdk/middleware-recursion-detection": "3.609.0",
- "@aws-sdk/middleware-user-agent": "3.609.0",
- "@aws-sdk/region-config-resolver": "3.609.0",
+ "@aws-sdk/middleware-user-agent": "3.614.0",
+ "@aws-sdk/region-config-resolver": "3.614.0",
"@aws-sdk/types": "3.609.0",
- "@aws-sdk/util-endpoints": "3.609.0",
+ "@aws-sdk/util-endpoints": "3.614.0",
"@aws-sdk/util-user-agent-browser": "3.609.0",
- "@aws-sdk/util-user-agent-node": "3.609.0",
- "@smithy/config-resolver": "^3.0.4",
- "@smithy/core": "^2.2.4",
- "@smithy/fetch-http-handler": "^3.2.0",
+ "@aws-sdk/util-user-agent-node": "3.614.0",
+ "@smithy/config-resolver": "^3.0.5",
+ "@smithy/core": "^2.2.6",
+ "@smithy/fetch-http-handler": "^3.2.1",
"@smithy/hash-node": "^3.0.3",
"@smithy/invalid-dependency": "^3.0.3",
"@smithy/middleware-content-length": "^3.0.3",
- "@smithy/middleware-endpoint": "^3.0.4",
- "@smithy/middleware-retry": "^3.0.7",
+ "@smithy/middleware-endpoint": "^3.0.5",
+ "@smithy/middleware-retry": "^3.0.9",
"@smithy/middleware-serde": "^3.0.3",
"@smithy/middleware-stack": "^3.0.3",
- "@smithy/node-config-provider": "^3.1.3",
- "@smithy/node-http-handler": "^3.1.1",
+ "@smithy/node-config-provider": "^3.1.4",
+ "@smithy/node-http-handler": "^3.1.2",
"@smithy/protocol-http": "^4.0.3",
- "@smithy/smithy-client": "^3.1.5",
+ "@smithy/smithy-client": "^3.1.7",
"@smithy/types": "^3.3.0",
"@smithy/url-parser": "^3.0.3",
"@smithy/util-base64": "^3.0.0",
"@smithy/util-body-length-browser": "^3.0.0",
"@smithy/util-body-length-node": "^3.0.0",
- "@smithy/util-defaults-mode-browser": "^3.0.7",
- "@smithy/util-defaults-mode-node": "^3.0.7",
- "@smithy/util-endpoints": "^2.0.4",
+ "@smithy/util-defaults-mode-browser": "^3.0.9",
+ "@smithy/util-defaults-mode-node": "^3.0.9",
+ "@smithy/util-endpoints": "^2.0.5",
"@smithy/util-middleware": "^3.0.3",
"@smithy/util-retry": "^3.0.3",
"@smithy/util-utf8": "^3.0.0",
@@ -444,14 +446,14 @@
}
},
"node_modules/@aws-sdk/core": {
- "version": "3.609.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.609.0.tgz",
- "integrity": "sha512-ptqw+DTxLr01+pKjDUuo53SEDzI+7nFM3WfQaEo0yhDg8vWw8PER4sWj1Ysx67ksctnZesPUjqxd5SHbtdBxiA==",
+ "version": "3.614.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.614.0.tgz",
+ "integrity": "sha512-BUuS5/1YkgmKc4J0bg83XEtMyDHVyqG2QDzfmhYe8gbOIZabUl1FlrFVwhCAthtrrI6MPGTQcERB4BtJKUSplw==",
"dependencies": {
- "@smithy/core": "^2.2.4",
+ "@smithy/core": "^2.2.6",
"@smithy/protocol-http": "^4.0.3",
"@smithy/signature-v4": "^3.1.2",
- "@smithy/smithy-client": "^3.1.5",
+ "@smithy/smithy-client": "^3.1.7",
"@smithy/types": "^3.3.0",
"fast-xml-parser": "4.2.5",
"tslib": "^2.6.2"
@@ -475,18 +477,18 @@
}
},
"node_modules/@aws-sdk/credential-provider-http": {
- "version": "3.609.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.609.0.tgz",
- "integrity": "sha512-GQQfB9Mk4XUZwaPsk4V3w8MqleS6ApkZKVQn3vTLAKa8Y7B2Imcpe5zWbKYjDd8MPpMWjHcBGFTVlDRFP4zwSQ==",
+ "version": "3.614.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.614.0.tgz",
+ "integrity": "sha512-YIEjlNUKb3Vo/iTnGAPdsiDC3FUUnNoex2OwU8LmR7AkYZiWdB8nx99DfgkkY+OFMUpw7nKD2PCOtuFONelfGA==",
"dependencies": {
"@aws-sdk/types": "3.609.0",
- "@smithy/fetch-http-handler": "^3.2.0",
- "@smithy/node-http-handler": "^3.1.1",
+ "@smithy/fetch-http-handler": "^3.2.1",
+ "@smithy/node-http-handler": "^3.1.2",
"@smithy/property-provider": "^3.1.3",
"@smithy/protocol-http": "^4.0.3",
- "@smithy/smithy-client": "^3.1.5",
+ "@smithy/smithy-client": "^3.1.7",
"@smithy/types": "^3.3.0",
- "@smithy/util-stream": "^3.0.5",
+ "@smithy/util-stream": "^3.0.6",
"tslib": "^2.6.2"
},
"engines": {
@@ -494,19 +496,19 @@
}
},
"node_modules/@aws-sdk/credential-provider-ini": {
- "version": "3.609.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.609.0.tgz",
- "integrity": "sha512-hwaBfXuBTv6/eAdEsDfGcteYUW6Km7lvvubbxEdxIuJNF3vswR7RMGIXaEC37hhPkTTgd3H0TONammhwZIfkog==",
+ "version": "3.614.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.614.0.tgz",
+ "integrity": "sha512-KfLuLFGwlvFSZ2MuzYwWGPb1y5TeiwX5okIDe0aQ1h10oD3924FXbN+mabOnUHQ8EFcGAtCaWbrC86mI7ktC6A==",
"dependencies": {
"@aws-sdk/credential-provider-env": "3.609.0",
- "@aws-sdk/credential-provider-http": "3.609.0",
- "@aws-sdk/credential-provider-process": "3.609.0",
- "@aws-sdk/credential-provider-sso": "3.609.0",
+ "@aws-sdk/credential-provider-http": "3.614.0",
+ "@aws-sdk/credential-provider-process": "3.614.0",
+ "@aws-sdk/credential-provider-sso": "3.614.0",
"@aws-sdk/credential-provider-web-identity": "3.609.0",
"@aws-sdk/types": "3.609.0",
- "@smithy/credential-provider-imds": "^3.1.3",
+ "@smithy/credential-provider-imds": "^3.1.4",
"@smithy/property-provider": "^3.1.3",
- "@smithy/shared-ini-file-loader": "^3.1.3",
+ "@smithy/shared-ini-file-loader": "^3.1.4",
"@smithy/types": "^3.3.0",
"tslib": "^2.6.2"
},
@@ -514,24 +516,24 @@
"node": ">=16.0.0"
},
"peerDependencies": {
- "@aws-sdk/client-sts": "^3.609.0"
+ "@aws-sdk/client-sts": "^3.614.0"
}
},
"node_modules/@aws-sdk/credential-provider-node": {
- "version": "3.609.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.609.0.tgz",
- "integrity": "sha512-4J8/JRuqfxJDGD9jTHVCBxCvYt7/Vgj2Stlhj930mrjFPO/yRw8ilAAZxBWe0JHPX3QwepCmh4ErZe53F5ysxQ==",
+ "version": "3.614.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.614.0.tgz",
+ "integrity": "sha512-4J6gPEuFZP0mkWq5E//oMS1vrmMM88iNNcv7TEljYnsc6JTAlKejCyFwx6CN+nkIhmIZsl06SXIhBemzBdBPfg==",
"dependencies": {
"@aws-sdk/credential-provider-env": "3.609.0",
- "@aws-sdk/credential-provider-http": "3.609.0",
- "@aws-sdk/credential-provider-ini": "3.609.0",
- "@aws-sdk/credential-provider-process": "3.609.0",
- "@aws-sdk/credential-provider-sso": "3.609.0",
+ "@aws-sdk/credential-provider-http": "3.614.0",
+ "@aws-sdk/credential-provider-ini": "3.614.0",
+ "@aws-sdk/credential-provider-process": "3.614.0",
+ "@aws-sdk/credential-provider-sso": "3.614.0",
"@aws-sdk/credential-provider-web-identity": "3.609.0",
"@aws-sdk/types": "3.609.0",
- "@smithy/credential-provider-imds": "^3.1.3",
+ "@smithy/credential-provider-imds": "^3.1.4",
"@smithy/property-provider": "^3.1.3",
- "@smithy/shared-ini-file-loader": "^3.1.3",
+ "@smithy/shared-ini-file-loader": "^3.1.4",
"@smithy/types": "^3.3.0",
"tslib": "^2.6.2"
},
@@ -540,13 +542,13 @@
}
},
"node_modules/@aws-sdk/credential-provider-process": {
- "version": "3.609.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.609.0.tgz",
- "integrity": "sha512-Ux35nGOSJKZWUIM3Ny0ROZ8cqPRUEkh+tR3X2o9ydEbFiLq3eMMyEnHJqx4EeUjLRchidlm4CCid9GxMe5/gdw==",
+ "version": "3.614.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.614.0.tgz",
+ "integrity": "sha512-Q0SI0sTRwi8iNODLs5+bbv8vgz8Qy2QdxbCHnPk/6Cx6LMf7i3dqmWquFbspqFRd8QiqxStrblwxrUYZi09tkA==",
"dependencies": {
"@aws-sdk/types": "3.609.0",
"@smithy/property-provider": "^3.1.3",
- "@smithy/shared-ini-file-loader": "^3.1.3",
+ "@smithy/shared-ini-file-loader": "^3.1.4",
"@smithy/types": "^3.3.0",
"tslib": "^2.6.2"
},
@@ -555,15 +557,15 @@
}
},
"node_modules/@aws-sdk/credential-provider-sso": {
- "version": "3.609.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.609.0.tgz",
- "integrity": "sha512-oQPGDKMMIxjvTcm86g07RPYeC7mCNk+29dPpY15ZAPRpAF7F0tircsC3wT9fHzNaKShEyK5LuI5Kg/uxsdy+Iw==",
+ "version": "3.614.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.614.0.tgz",
+ "integrity": "sha512-55+gp0JY4451cWI1qXmVMFM0GQaBKiQpXv2P0xmd9P3qLDyeFUSEW8XPh0d2lb1ICr6x4s47ynXVdGCIv2mXMg==",
"dependencies": {
- "@aws-sdk/client-sso": "3.609.0",
- "@aws-sdk/token-providers": "3.609.0",
+ "@aws-sdk/client-sso": "3.614.0",
+ "@aws-sdk/token-providers": "3.614.0",
"@aws-sdk/types": "3.609.0",
"@smithy/property-provider": "^3.1.3",
- "@smithy/shared-ini-file-loader": "^3.1.3",
+ "@smithy/shared-ini-file-loader": "^3.1.4",
"@smithy/types": "^3.3.0",
"tslib": "^2.6.2"
},
@@ -630,12 +632,12 @@
}
},
"node_modules/@aws-sdk/middleware-user-agent": {
- "version": "3.609.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.609.0.tgz",
- "integrity": "sha512-nbq7MXRmeXm4IDqh+sJRAxGPAq0OfGmGIwKvJcw66hLoG8CmhhVMZmIAEBDFr57S+YajGwnLLRt+eMI05MMeVA==",
+ "version": "3.614.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.614.0.tgz",
+ "integrity": "sha512-xUxh0UPQiMTG6E31Yvu6zVYlikrIcFDKljM11CaatInzvZubGTGiX0DjpqRlfGzUNsuPc/zNrKwRP2+wypgqIw==",
"dependencies": {
"@aws-sdk/types": "3.609.0",
- "@aws-sdk/util-endpoints": "3.609.0",
+ "@aws-sdk/util-endpoints": "3.614.0",
"@smithy/protocol-http": "^4.0.3",
"@smithy/types": "^3.3.0",
"tslib": "^2.6.2"
@@ -645,12 +647,12 @@
}
},
"node_modules/@aws-sdk/region-config-resolver": {
- "version": "3.609.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.609.0.tgz",
- "integrity": "sha512-lMHBG8zg9GWYBc9/XVPKyuAUd7iKqfPP7z04zGta2kGNOKbUTeqmAdc1gJGku75p4kglIPlGBorOxti8DhRmKw==",
+ "version": "3.614.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz",
+ "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==",
"dependencies": {
"@aws-sdk/types": "3.609.0",
- "@smithy/node-config-provider": "^3.1.3",
+ "@smithy/node-config-provider": "^3.1.4",
"@smithy/types": "^3.3.0",
"@smithy/util-config-provider": "^3.0.0",
"@smithy/util-middleware": "^3.0.3",
@@ -661,13 +663,13 @@
}
},
"node_modules/@aws-sdk/token-providers": {
- "version": "3.609.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.609.0.tgz",
- "integrity": "sha512-WvhW/7XSf+H7YmtiIigQxfDVZVZI7mbKikQ09YpzN7FeN3TmYib1+0tB+EE9TbICkwssjiFc71FEBEh4K9grKQ==",
+ "version": "3.614.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz",
+ "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==",
"dependencies": {
"@aws-sdk/types": "3.609.0",
"@smithy/property-provider": "^3.1.3",
- "@smithy/shared-ini-file-loader": "^3.1.3",
+ "@smithy/shared-ini-file-loader": "^3.1.4",
"@smithy/types": "^3.3.0",
"tslib": "^2.6.2"
},
@@ -675,7 +677,7 @@
"node": ">=16.0.0"
},
"peerDependencies": {
- "@aws-sdk/client-sso-oidc": "^3.609.0"
+ "@aws-sdk/client-sso-oidc": "^3.614.0"
}
},
"node_modules/@aws-sdk/types": {
@@ -691,13 +693,13 @@
}
},
"node_modules/@aws-sdk/util-endpoints": {
- "version": "3.609.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.609.0.tgz",
- "integrity": "sha512-Rh+3V8dOvEeE1aQmUy904DYWtLUEJ7Vf5XBPlQ6At3pBhp+zpXbsnpZzVL33c8lW1xfj6YPwtO6gOeEsl1juCQ==",
+ "version": "3.614.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.614.0.tgz",
+ "integrity": "sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==",
"dependencies": {
"@aws-sdk/types": "3.609.0",
"@smithy/types": "^3.3.0",
- "@smithy/util-endpoints": "^2.0.4",
+ "@smithy/util-endpoints": "^2.0.5",
"tslib": "^2.6.2"
},
"engines": {
@@ -727,12 +729,12 @@
}
},
"node_modules/@aws-sdk/util-user-agent-node": {
- "version": "3.609.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.609.0.tgz",
- "integrity": "sha512-DlZBwQ/HkZyf3pOWc7+wjJRk5R7x9YxHhs2szHwtv1IW30KMabjjjX0GMlGJ9LLkBHkbaaEY/w9Tkj12XRLhRg==",
+ "version": "3.614.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz",
+ "integrity": "sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==",
"dependencies": {
"@aws-sdk/types": "3.609.0",
- "@smithy/node-config-provider": "^3.1.3",
+ "@smithy/node-config-provider": "^3.1.4",
"@smithy/types": "^3.3.0",
"tslib": "^2.6.2"
},
@@ -1541,6 +1543,85 @@
"url": "https://opencollective.com/js-sdsl"
}
},
+ "node_modules/@kurkle/color": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz",
+ "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw=="
+ },
+ "node_modules/@mapbox/node-pre-gyp": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz",
+ "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==",
+ "dependencies": {
+ "detect-libc": "^2.0.0",
+ "https-proxy-agent": "^5.0.0",
+ "make-dir": "^3.1.0",
+ "node-fetch": "^2.6.7",
+ "nopt": "^5.0.0",
+ "npmlog": "^5.0.1",
+ "rimraf": "^3.0.2",
+ "semver": "^7.3.5",
+ "tar": "^6.1.11"
+ },
+ "bin": {
+ "node-pre-gyp": "bin/node-pre-gyp"
+ }
+ },
+ "node_modules/@mapbox/node-pre-gyp/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/@mapbox/node-pre-gyp/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@mapbox/node-pre-gyp/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@mapbox/node-pre-gyp/node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/@oozcitak/dom": {
"version": "1.15.10",
"resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-1.15.10.tgz",
@@ -2403,6 +2484,14 @@
"resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz",
"integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw=="
},
+ "node_modules/@xmldom/is-dom-node": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@xmldom/is-dom-node/-/is-dom-node-1.0.1.tgz",
+ "integrity": "sha512-CJDxIgE5I0FH+ttq/Fxy6nRpxP70+e2O048EPe85J2use3XKdatVM7dDVvFNjQudd9B49NPoZ+8PG49zj4Er8Q==",
+ "engines": {
+ "node": ">= 16"
+ }
+ },
"node_modules/@xmldom/xmldom": {
"version": "0.8.10",
"resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
@@ -2411,6 +2500,11 @@
"node": ">=10.0.0"
}
},
+ "node_modules/abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
+ },
"node_modules/abort-controller": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
@@ -2492,6 +2586,24 @@
"resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
"integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw=="
},
+ "node_modules/aproba": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
+ "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ=="
+ },
+ "node_modules/are-we-there-yet": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
+ "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
+ "deprecated": "This package is no longer supported.",
+ "dependencies": {
+ "delegates": "^1.0.0",
+ "readable-stream": "^3.6.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
@@ -2789,6 +2901,20 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/canvas": {
+ "version": "2.11.2",
+ "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz",
+ "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@mapbox/node-pre-gyp": "^1.0.0",
+ "nan": "^2.17.0",
+ "simple-get": "^3.0.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@@ -2817,6 +2943,17 @@
"node": ">=8"
}
},
+ "node_modules/chart.js": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.3.tgz",
+ "integrity": "sha512-qK1gkGSRYcJzqrrzdR6a+I0vQ4/R+SoODXyAjscQ/4mzuNzySaMCd+hyVxitSY1+L2fjPD1Gbn+ibNqRmwQeLw==",
+ "dependencies": {
+ "@kurkle/color": "^0.3.0"
+ },
+ "engines": {
+ "pnpm": ">=8"
+ }
+ },
"node_modules/cheerio": {
"version": "1.0.0-rc.12",
"resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz",
@@ -2853,6 +2990,14 @@
"url": "https://github.com/sponsors/fb55"
}
},
+ "node_modules/chownr": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/cliui": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
@@ -2913,6 +3058,14 @@
"simple-swizzle": "^0.2.2"
}
},
+ "node_modules/color-support": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+ "bin": {
+ "color-support": "bin.js"
+ }
+ },
"node_modules/color/node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
@@ -3006,8 +3159,7 @@
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
},
"node_modules/concat-stream": {
"version": "1.6.2",
@@ -3072,6 +3224,11 @@
"url": "https://github.com/open-cli-tools/concurrently?sponsor=1"
}
},
+ "node_modules/console-control-strings": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+ "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="
+ },
"node_modules/content-disposition": {
"version": "0.5.4",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
@@ -3280,9 +3437,9 @@
"integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ=="
},
"node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "version": "4.3.5",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
"dependencies": {
"ms": "2.1.2"
},
@@ -3308,6 +3465,17 @@
"node": ">=0.10"
}
},
+ "node_modules/decompress-response": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz",
+ "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==",
+ "dependencies": {
+ "mimic-response": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/deeks": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/deeks/-/deeks-3.1.0.tgz",
@@ -3356,6 +3524,11 @@
"node": ">=0.4.0"
}
},
+ "node_modules/delegates": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="
+ },
"node_modules/depd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -3382,6 +3555,14 @@
"npm": "1.2.8000 || >= 1.4.16"
}
},
+ "node_modules/detect-libc": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
+ "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/dev-null": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/dev-null/-/dev-null-0.1.1.tgz",
@@ -4028,11 +4209,32 @@
"node": ">=6 <7 || >=8"
}
},
+ "node_modules/fs-minipass": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+ "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/fs-minipass/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
},
"node_modules/ftp": {
"version": "0.3.10",
@@ -4081,6 +4283,31 @@
"integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
"optional": true
},
+ "node_modules/gauge": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
+ "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
+ "deprecated": "This package is no longer supported.",
+ "dependencies": {
+ "aproba": "^1.0.3 || ^2.0.0",
+ "color-support": "^1.1.2",
+ "console-control-strings": "^1.0.0",
+ "has-unicode": "^2.0.1",
+ "object-assign": "^4.1.1",
+ "signal-exit": "^3.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1",
+ "wide-align": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/gauge/node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
+ },
"node_modules/gaxios": {
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.1.1.tgz",
@@ -4396,6 +4623,11 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/has-unicode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="
+ },
"node_modules/hasown": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
@@ -4509,7 +4741,6 @@
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "dev": true,
"dependencies": {
"once": "^1.3.0",
"wrappy": "1"
@@ -4992,6 +5223,28 @@
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
"integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A=="
},
+ "node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
"node_modules/media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@@ -5052,6 +5305,17 @@
"node": ">= 0.6"
}
},
+ "node_modules/mimic-response": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
+ "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/minimalistic-assert": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
@@ -5085,6 +5349,29 @@
"node": ">=16 || 14 >=14.17"
}
},
+ "node_modules/minizlib": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+ "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+ "dependencies": {
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/minizlib/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/mkdirp": {
"version": "0.5.6",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
@@ -5140,8 +5427,7 @@
"node_modules/nan": {
"version": "2.18.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz",
- "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==",
- "optional": true
+ "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w=="
},
"node_modules/negotiator": {
"version": "0.6.3",
@@ -5231,6 +5517,32 @@
"node": ">=6.0.0"
}
},
+ "node_modules/nopt": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
+ "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
+ "dependencies": {
+ "abbrev": "1"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/npmlog": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
+ "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
+ "deprecated": "This package is no longer supported.",
+ "dependencies": {
+ "are-we-there-yet": "^2.0.0",
+ "console-control-strings": "^1.1.0",
+ "gauge": "^3.0.0",
+ "set-blocking": "^2.0.0"
+ }
+ },
"node_modules/nth-check": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
@@ -5421,7 +5733,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -5487,9 +5798,9 @@
}
},
"node_modules/prettier": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz",
- "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==",
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
+ "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
"dev": true,
"bin": {
"prettier": "bin/prettier.cjs"
@@ -5762,11 +6073,12 @@
}
},
"node_modules/rimraf": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.0.tgz",
- "integrity": "sha512-u+yqhM92LW+89cxUQK0SRyvXYQmyuKHx0jkx4W7KfwLGLqJnQM5031Uv1trE4gB9XEXBM/s6MxKlfW95IidqaA==",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz",
+ "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==",
"dependencies": {
- "glob": "^11.0.0"
+ "glob": "^11.0.0",
+ "package-json-from-dist": "^1.0.0"
},
"bin": {
"rimraf": "dist/esm/bin.mjs"
@@ -5816,9 +6128,9 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"node_modules/sax": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz",
- "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA=="
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
+ "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg=="
},
"node_modules/scmp": {
"version": "2.1.0",
@@ -5905,6 +6217,11 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
+ },
"node_modules/set-function-length": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz",
@@ -5976,6 +6293,35 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/simple-concat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/simple-get": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz",
+ "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==",
+ "dependencies": {
+ "decompress-response": "^4.2.0",
+ "once": "^1.3.1",
+ "simple-concat": "^1.0.0"
+ }
+ },
"node_modules/simple-swizzle": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
@@ -6002,34 +6348,25 @@
}
},
"node_modules/soap": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/soap/-/soap-1.0.4.tgz",
- "integrity": "sha512-NOjmUAFI18HqL/tVND1wr27QGOQNOp7u6kS28zIAyiMQeVHOa00HDtI6HrUKi5hmPx+QaHspTYYsMnrdtRNIlA==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/soap/-/soap-1.1.0.tgz",
+ "integrity": "sha512-5C9PT00v9KygPviQCSuwCobeERV+zQV0t0qUPW6kAw3Vs69UmG64h2zJhMcK/NNOMmUnVEOnHevMfCXc68O2Vw==",
"dependencies": {
- "axios": "^1.6.8",
+ "axios": "^1.7.2",
"axios-ntlm": "^1.4.2",
- "debug": "^4.3.2",
- "formidable": "^3.2.4",
+ "debug": "^4.3.5",
+ "formidable": "^3.5.1",
"get-stream": "^6.0.1",
"lodash": "^4.17.21",
- "sax": ">=0.6",
+ "sax": "^1.4.1",
"strip-bom": "^3.0.0",
- "uuid": "^8.3.2",
- "whatwg-mimetype": "3.0.0",
- "xml-crypto": "^3.0.0"
+ "whatwg-mimetype": "4.0.0",
+ "xml-crypto": "^6.0.0"
},
"engines": {
"node": ">=14.0.0"
}
},
- "node_modules/soap/node_modules/uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
"node_modules/socket.io": {
"version": "4.7.5",
"resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz",
@@ -6526,6 +6863,41 @@
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
+ "node_modules/tar": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
+ "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
+ "dependencies": {
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.0.0",
+ "minipass": "^5.0.0",
+ "minizlib": "^2.1.1",
+ "mkdirp": "^1.0.3",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/tar/node_modules/minipass": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tar/node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/teeny-request": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz",
@@ -6875,11 +7247,11 @@
}
},
"node_modules/whatwg-mimetype": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
- "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
+ "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/whatwg-url": {
@@ -6905,6 +7277,14 @@
"node": ">= 8"
}
},
+ "node_modules/wide-align": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
+ "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
+ "dependencies": {
+ "string-width": "^1.0.2 || 2 || 3 || 4"
+ }
+ },
"node_modules/winston": {
"version": "3.11.0",
"resolved": "https://registry.npmjs.org/winston/-/winston-3.11.0.tgz",
@@ -7007,15 +7387,16 @@
}
},
"node_modules/xml-crypto": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/xml-crypto/-/xml-crypto-3.2.0.tgz",
- "integrity": "sha512-qVurBUOQrmvlgmZqIVBqmb06TD2a/PpEUfFPgD7BuBfjmoH4zgkqaWSIJrnymlCvM2GGt9x+XtJFA+ttoAufqg==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/xml-crypto/-/xml-crypto-6.0.0.tgz",
+ "integrity": "sha512-L3RgnkaDrHaYcCnoENv4Idzt1ZRj5U1z1BDH98QdDTQfssScx8adgxhd9qwyYo+E3fXbQZjEQH7aiXHLVgxGvw==",
"dependencies": {
- "@xmldom/xmldom": "^0.8.8",
- "xpath": "0.0.32"
+ "@xmldom/is-dom-node": "^1.0.1",
+ "@xmldom/xmldom": "^0.8.10",
+ "xpath": "^0.0.33"
},
"engines": {
- "node": ">=4.0.0"
+ "node": ">=16"
}
},
"node_modules/xml2js": {
@@ -7061,9 +7442,9 @@
}
},
"node_modules/xpath": {
- "version": "0.0.32",
- "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.32.tgz",
- "integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==",
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.33.tgz",
+ "integrity": "sha512-NNXnzrkDrAzalLhIUc01jO2mOzXGXh1JwPgkihcLLzw98c0WgYDmmjSh1Kl3wzaxSVWMuA+fe0WTWOBDWCBmNA==",
"engines": {
"node": ">=0.6.0"
}
diff --git a/package.json b/package.json
index 6f3898b47..77e80b531 100644
--- a/package.json
+++ b/package.json
@@ -19,15 +19,17 @@
"makeitpretty": "prettier --write \"**/*.{css,js,json,jsx,scss}\""
},
"dependencies": {
- "@aws-sdk/client-secrets-manager": "^3.609.0",
- "@aws-sdk/client-ses": "^3.609.0",
- "@aws-sdk/credential-provider-node": "^3.609.0",
+ "@aws-sdk/client-secrets-manager": "^3.614.0",
+ "@aws-sdk/client-ses": "^3.614.0",
+ "@aws-sdk/credential-provider-node": "^3.614.0",
"@opensearch-project/opensearch": "^2.10.0",
"aws4": "^1.13.0",
"axios": "^1.7.2",
"better-queue": "^3.8.12",
"bluebird": "^3.7.2",
"body-parser": "^1.20.2",
+ "canvas": "^2.11.2",
+ "chart.js": "^4.4.3",
"cloudinary": "^2.2.0",
"compression": "^1.7.4",
"cookie-parser": "^1.4.6",
@@ -52,8 +54,8 @@
"nodemailer": "^6.9.14",
"phone": "^3.1.49",
"recursive-diff": "^1.0.9",
- "rimraf": "^6.0.0",
- "soap": "^1.0.4",
+ "rimraf": "^6.0.1",
+ "soap": "^1.1.0",
"socket.io": "^4.7.5",
"ssh2-sftp-client": "^10.0.3",
"twilio": "^4.23.0",
@@ -64,7 +66,7 @@
"devDependencies": {
"@trivago/prettier-plugin-sort-imports": "^4.3.0",
"concurrently": "^8.2.2",
- "prettier": "^3.3.2",
+ "prettier": "^3.3.3",
"source-map-explorer": "^2.5.2"
}
}
diff --git a/server/cdk/cdk-calculate-allocations.js b/server/cdk/cdk-calculate-allocations.js
index b557f322d..c47addbfe 100644
--- a/server/cdk/cdk-calculate-allocations.js
+++ b/server/cdk/cdk-calculate-allocations.js
@@ -16,403 +16,402 @@ const { DiscountNotAlreadyCounted } = InstanceManager({
promanager: "USE_ROME"
});
+exports.defaultRoute = async function (req, res) {
+ try {
+ CdkBase.createLogEvent(req, "DEBUG", `Received request to calculate allocations for ${req.body.jobid}`);
+ const jobData = await QueryJobData(req, req.BearerToken, req.body.jobid);
+ return res.status(200).json({ data: calculateAllocations(req, jobData) });
+ } catch (error) {
+ console.log(error);
+ CdkBase.createLogEvent(req, "ERROR", `Error encountered in CdkCalculateAllocations. ${error}`);
+ res.status(500).json({ error: `Error encountered in CdkCalculateAllocations. ${error}` });
+ }
+};
+
exports.default = async function (socket, jobid) {
try {
- CdkBase.createLogEvent(socket, "DEBUG", `Received request to calculate allocations for ${jobid}`);
- const job = await QueryJobData(socket, jobid);
- const { bodyshop } = job;
-
- const taxAllocations = InstanceManager({
- executeFunction: true,
- deubg: true,
- args: [],
- imex: () => ({
- local: {
- center: bodyshop.md_responsibility_centers.taxes.local.name,
- sale: Dinero(job.job_totals.totals.local_tax),
- cost: Dinero(),
- profitCenter: bodyshop.md_responsibility_centers.taxes.local,
- costCenter: bodyshop.md_responsibility_centers.taxes.local
- },
- state: {
- center: bodyshop.md_responsibility_centers.taxes.state.name,
- sale: Dinero(job.job_totals.totals.state_tax),
- cost: Dinero(),
- profitCenter: bodyshop.md_responsibility_centers.taxes.state,
- costCenter: bodyshop.md_responsibility_centers.taxes.state
- },
- federal: {
- center: bodyshop.md_responsibility_centers.taxes.federal.name,
- sale: Dinero(job.job_totals.totals.federal_tax),
- cost: Dinero(),
- profitCenter: bodyshop.md_responsibility_centers.taxes.federal,
- costCenter: bodyshop.md_responsibility_centers.taxes.federal
- }
- }),
- rome: () => ({
- tax_ty1: {
- center: bodyshop.md_responsibility_centers.taxes[`tax_ty1`].name,
- sale: Dinero(job.job_totals.totals.us_sales_tax_breakdown[`ty1Tax`]),
- cost: Dinero(),
- profitCenter: bodyshop.md_responsibility_centers.taxes[`tax_ty1`],
- costCenter: bodyshop.md_responsibility_centers.taxes[`tax_ty1`]
- },
- tax_ty2: {
- center: bodyshop.md_responsibility_centers.taxes[`tax_ty2`].name,
- sale: Dinero(job.job_totals.totals.us_sales_tax_breakdown[`ty2Tax`]),
- cost: Dinero(),
- profitCenter: bodyshop.md_responsibility_centers.taxes[`tax_ty2`],
- costCenter: bodyshop.md_responsibility_centers.taxes[`tax_ty2`]
- },
- tax_ty3: {
- center: bodyshop.md_responsibility_centers.taxes[`tax_ty3`].name,
- sale: Dinero(job.job_totals.totals.us_sales_tax_breakdown[`ty3Tax`]),
- cost: Dinero(),
- profitCenter: bodyshop.md_responsibility_centers.taxes[`tax_ty3`],
- costCenter: bodyshop.md_responsibility_centers.taxes[`tax_ty3`]
- },
- tax_ty4: {
- center: bodyshop.md_responsibility_centers.taxes[`tax_ty4`].name,
- sale: Dinero(job.job_totals.totals.us_sales_tax_breakdown[`ty4Tax`]),
- cost: Dinero(),
- profitCenter: bodyshop.md_responsibility_centers.taxes[`tax_ty4`],
- costCenter: bodyshop.md_responsibility_centers.taxes[`tax_ty4`]
- },
- tax_ty5: {
- center: bodyshop.md_responsibility_centers.taxes[`tax_ty5`].name,
- sale: Dinero(job.job_totals.totals.us_sales_tax_breakdown[`ty5Tax`]),
- cost: Dinero(),
- profitCenter: bodyshop.md_responsibility_centers.taxes[`tax_ty5`],
- costCenter: bodyshop.md_responsibility_centers.taxes[`tax_ty5`]
- }
- })
- });
-
- //Determine if there are MAPA and MASH lines already on the estimate.
- //If there are, don't do anything extra (mitchell estimate)
- //Otherwise, calculate them and add them to the default MAPA and MASH centers.
- let hasMapaLine = false;
- let hasMashLine = false;
-
- const profitCenterHash = job.joblines.reduce((acc, val) => {
- //Check the Parts Assignment
- if (val.db_ref === "936008") {
- //If either of these DB REFs change, they also need to change in job-totals/job-costing calculations.
- hasMapaLine = true;
- }
- if (val.db_ref === "936007") {
- hasMashLine = true;
- }
-
- if (val.profitcenter_part) {
- if (!acc[val.profitcenter_part]) acc[val.profitcenter_part] = Dinero();
-
- let DineroAmount = Dinero({
- amount: Math.round(val.act_price * 100)
- }).multiply(val.part_qty || 1);
-
- DineroAmount = DineroAmount.add(
- ((val.prt_dsmk_m && val.prt_dsmk_m !== 0) || (val.prt_dsmk_p && val.prt_dsmk_p !== 0)) &&
- DiscountNotAlreadyCounted(val, job.joblines)
- ? val.prt_dsmk_m
- ? Dinero({ amount: Math.round(val.prt_dsmk_m * 100) })
- : Dinero({
- amount: Math.round(val.act_price * 100)
- })
- .multiply(val.part_qty || 0)
- .percentage(Math.abs(val.prt_dsmk_p || 0))
- .multiply(val.prt_dsmk_p > 0 ? 1 : -1)
- : Dinero()
- );
-
- acc[val.profitcenter_part] = acc[val.profitcenter_part].add(DineroAmount);
- }
- if (val.profitcenter_labor && val.mod_lbr_ty) {
- //Check the Labor Assignment.
-
- if (!acc[val.profitcenter_labor]) acc[val.profitcenter_labor] = Dinero();
-
- acc[val.profitcenter_labor] = acc[val.profitcenter_labor].add(
- Dinero({
- amount: Math.round(job[`rate_${val.mod_lbr_ty.toLowerCase()}`] * 100)
- }).multiply(val.mod_lb_hrs)
- );
- }
- return acc;
- }, {});
-
- const selectedDmsAllocationConfig = bodyshop.md_responsibility_centers.dms_defaults.find(
- (d) => d.name === job.dms_allocation
- );
- CdkBase.createLogEvent(
- socket,
- "DEBUG",
- `Using DMS Allocation ${selectedDmsAllocationConfig && selectedDmsAllocationConfig.name} for cost export.`
- );
-
- let costCenterHash = {};
- //Check whether to skip this if PBS and using AP module.
- const disablebillwip = !!bodyshop?.pbs_configuration?.disablebillwip;
-
- if (!disablebillwip) {
- costCenterHash = job.bills.reduce((bill_acc, bill_val) => {
- bill_val.billlines.map((line_val) => {
- if (!bill_acc[selectedDmsAllocationConfig.costs[line_val.cost_center]])
- bill_acc[selectedDmsAllocationConfig.costs[line_val.cost_center]] = Dinero();
-
- let lineDinero = Dinero({
- amount: Math.round((line_val.actual_cost || 0) * 100)
- })
- .multiply(line_val.quantity)
- .multiply(bill_val.is_credit_memo ? -1 : 1);
-
- bill_acc[selectedDmsAllocationConfig.costs[line_val.cost_center]] =
- bill_acc[selectedDmsAllocationConfig.costs[line_val.cost_center]].add(lineDinero);
- return null;
- });
- return bill_acc;
- }, {});
- }
-
- job.timetickets.forEach((ticket) => {
- //Get the total amount of the ticket.
- let TicketTotal = Dinero({
- amount: Math.round(
- ticket.rate *
- (ticket.employee && ticket.employee.flat_rate ? ticket.productivehrs || 0 : ticket.actualhrs || 0) *
- 100
- )
- });
- //Add it to the right cost center.
- if (!costCenterHash[selectedDmsAllocationConfig.costs[ticket.ciecacode]])
- costCenterHash[selectedDmsAllocationConfig.costs[ticket.ciecacode]] = Dinero();
-
- costCenterHash[selectedDmsAllocationConfig.costs[ticket.ciecacode]] =
- costCenterHash[selectedDmsAllocationConfig.costs[ticket.ciecacode]].add(TicketTotal);
- });
-
- if (!hasMapaLine && job.job_totals.rates.mapa.total.amount > 0) {
- // console.log("Adding MAPA Line Manually.");
- const mapaAccountName = selectedDmsAllocationConfig.profits.MAPA;
-
- const mapaAccount = bodyshop.md_responsibility_centers.profits.find((c) => c.name === mapaAccountName);
-
- if (mapaAccount) {
- if (!profitCenterHash[mapaAccountName]) profitCenterHash[mapaAccountName] = Dinero();
-
- profitCenterHash[mapaAccountName] = profitCenterHash[mapaAccountName].add(
- Dinero(job.job_totals.rates.mapa.total)
- );
- } else {
- //console.log("NO MAPA ACCOUNT FOUND!!");
- }
- }
-
- if (!hasMashLine && job.job_totals.rates.mash.total.amount > 0) {
- // console.log("Adding MASH Line Manually.");
-
- const mashAccountName = selectedDmsAllocationConfig.profits.MASH;
-
- const mashAccount = bodyshop.md_responsibility_centers.profits.find((c) => c.name === mashAccountName);
-
- if (mashAccount) {
- if (!profitCenterHash[mashAccountName]) profitCenterHash[mashAccountName] = Dinero();
-
- profitCenterHash[mashAccountName] = profitCenterHash[mashAccountName].add(
- Dinero(job.job_totals.rates.mash.total)
- );
- } else {
- // console.log("NO MASH ACCOUNT FOUND!!");
- }
- }
- console.log(
- Number.isInteger(bodyshop?.cdk_configuration?.sendmaterialscosting),
- typeof Number.isInteger(bodyshop?.cdk_configuration?.sendmaterialscosting)
- );
- if (!!bodyshop?.cdk_configuration?.sendmaterialscosting) {
- //Manually send the percentage of the costing.
-
- //Paint Mat
- const mapaAccountName = selectedDmsAllocationConfig.costs.MAPA;
- const mapaAccount = bodyshop.md_responsibility_centers.costs.find((c) => c.name === mapaAccountName);
- if (mapaAccount) {
- if (!costCenterHash[mapaAccountName])
- costCenterHash[mapaAccountName] = Dinero();
- if (job.bodyshop.use_paint_scale_data === true) {
- if (job.mixdata.length > 0) {
- costCenterHash[mapaAccountName] = costCenterHash[
- mapaAccountName
- ].add(
- Dinero({
- amount: Math.round(
- ((job.mixdata[0] && job.mixdata[0].totalliquidcost) || 0) *
- 100
- ),
- })
- );
- } else {
- costCenterHash[mapaAccountName] = costCenterHash[
- mapaAccountName
- ].add(
- Dinero(job.job_totals.rates.mapa.total).percentage(
- bodyshop?.cdk_configuration?.sendmaterialscosting
- )
- );
- }
- } else {
- costCenterHash[mapaAccountName] = costCenterHash[mapaAccountName].add(
- Dinero(job.job_totals.rates.mapa.total).percentage(
- bodyshop?.cdk_configuration?.sendmaterialscosting
- )
- );
- }
- } else {
- //console.log("NO MAPA ACCOUNT FOUND!!");
- }
-
- //Shop Mat
- const mashAccountName = selectedDmsAllocationConfig.costs.MASH;
- const mashAccount = bodyshop.md_responsibility_centers.costs.find((c) => c.name === mashAccountName);
- if (mashAccount) {
- if (!costCenterHash[mashAccountName]) costCenterHash[mashAccountName] = Dinero();
- costCenterHash[mashAccountName] = costCenterHash[mashAccountName].add(
- Dinero(job.job_totals.rates.mash.total).percentage(bodyshop?.cdk_configuration?.sendmaterialscosting)
- );
- } else {
- // console.log("NO MASH ACCOUNT FOUND!!");
- }
- }
-
- const { ca_bc_pvrt } = job;
- if (ca_bc_pvrt) {
- // const pvrtAccount = bodyshop.md_responsibility_centers.profits.find(
- // (c) => c.name === mashAccountName
- // );
-
- taxAllocations.state.sale = taxAllocations.state.sale.add(
- Dinero({ amount: Math.round((ca_bc_pvrt || 0) * 100) })
- );
- }
-
- if (job.towing_payable && job.towing_payable !== 0) {
- const towAccountName = selectedDmsAllocationConfig.profits.TOW;
-
- const towAccount = bodyshop.md_responsibility_centers.profits.find((c) => c.name === towAccountName);
-
- if (towAccount) {
- if (!profitCenterHash[towAccountName]) profitCenterHash[towAccountName] = Dinero();
-
- profitCenterHash[towAccountName] = profitCenterHash[towAccountName].add(
- Dinero({
- amount: Math.round((job.towing_payable || 0) * 100)
- })
- );
- } else {
- // console.log("NO MASH ACCOUNT FOUND!!");
- }
- }
- if (job.storage_payable && job.storage_payable !== 0) {
- const storageAccountName = selectedDmsAllocationConfig.profits.TOW;
-
- const towAccount = bodyshop.md_responsibility_centers.profits.find((c) => c.name === storageAccountName);
-
- if (towAccount) {
- if (!profitCenterHash[storageAccountName]) profitCenterHash[storageAccountName] = Dinero();
-
- profitCenterHash[storageAccountName] = profitCenterHash[storageAccountName].add(
- Dinero({
- amount: Math.round((job.storage_payable || 0) * 100)
- })
- );
- } else {
- // console.log("NO MASH ACCOUNT FOUND!!");
- }
- }
-
- if (job.adjustment_bottom_line && job.adjustment_bottom_line !== 0) {
- const otherAccountName = selectedDmsAllocationConfig.profits.PAO;
-
- const otherAccount = bodyshop.md_responsibility_centers.profits.find((c) => c.name === otherAccountName);
-
- if (otherAccount) {
- if (!profitCenterHash[otherAccountName]) profitCenterHash[otherAccountName] = Dinero();
-
- profitCenterHash[otherAccountName] = profitCenterHash[otherAccountName].add(
- Dinero({
- amount: Math.round((job.adjustment_bottom_line || 0) * 100)
- })
- );
- } else {
- // console.log("NO MASH ACCOUNT FOUND!!");
- }
- }
- if (InstanceManager({ rome: true })) {
- //profile level adjustments
- Object.keys(job.job_totals.parts.adjustments).forEach((key) => {
- const accountName = selectedDmsAllocationConfig.profits[key];
-
- const otherAccount = bodyshop.md_responsibility_centers.profits.find((c) => c.name === accountName);
-
- if (otherAccount) {
- if (!profitCenterHash[accountName]) profitCenterHash[accountName] = Dinero();
-
- profitCenterHash[accountName] = profitCenterHash[accountName].add(
- Dinero(job.job_totals.parts.adjustments[key])
- );
- } else {
- CdkBase.createLogEvent(
- socket,
- "ERROR",
- `Error encountered in CdkCalculateAllocations. Unable to find adjustment account. ${error}`
- );
- }
- });
- }
-
- const jobAllocations = _.union(Object.keys(profitCenterHash), Object.keys(costCenterHash)).map((key) => {
- const profitCenter = bodyshop.md_responsibility_centers.profits.find((c) => c.name === key);
- const costCenter = bodyshop.md_responsibility_centers.costs.find((c) => c.name === key);
-
- return {
- center: key,
- sale: profitCenterHash[key] ? profitCenterHash[key] : Dinero(),
- cost: costCenterHash[key] ? costCenterHash[key] : Dinero(),
- profitCenter,
- costCenter
- };
- });
-
- return [
- ...jobAllocations,
- ...Object.keys(taxAllocations)
- .filter((key) => taxAllocations[key].sale.getAmount() > 0 || taxAllocations[key].cost.getAmount() > 0)
- .map((key) => {
- if (
- key === "federal" &&
- selectedDmsAllocationConfig.gst_override &&
- selectedDmsAllocationConfig.gst_override !== ""
- ) {
- const ret = { ...taxAllocations[key], tax: key };
- ret.costCenter.dms_acctnumber = selectedDmsAllocationConfig.gst_override;
- ret.profitCenter.dms_acctnumber = selectedDmsAllocationConfig.gst_override;
- return ret;
- } else {
- return { ...taxAllocations[key], tax: key };
- }
- })
- ];
+ const jobData = await QueryJobData(socket, "Bearer " + socket.handshake.auth.token, jobid);
+ return calculateAllocations(socket, jobData);
} catch (error) {
console.log(error);
CdkBase.createLogEvent(socket, "ERROR", `Error encountered in CdkCalculateAllocations. ${error}`);
}
};
-async function QueryJobData(socket, jobid) {
- CdkBase.createLogEvent(socket, "DEBUG", `Querying job data for id ${jobid}`);
+async function QueryJobData(connectionData, token, jobid) {
+ CdkBase.createLogEvent(connectionData, "DEBUG", `Querying job data for id ${jobid}`);
const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, {});
- const result = await client
- .setHeaders({ Authorization: `Bearer ${socket.handshake.auth.token}` })
- .request(queries.GET_CDK_ALLOCATIONS, { id: jobid });
- CdkBase.createLogEvent(socket, "TRACE", `Job data query result ${JSON.stringify(result, null, 2)}`);
+ const result = await client.setHeaders({ Authorization: token }).request(queries.GET_CDK_ALLOCATIONS, { id: jobid });
+ CdkBase.createLogEvent(connectionData, "TRACE", `Job data query result ${JSON.stringify(result, null, 2)}`);
return result.jobs_by_pk;
}
+
+function calculateAllocations(connectionData, job) {
+ const { bodyshop } = job;
+
+ const taxAllocations = InstanceManager({
+ executeFunction: true,
+ deubg: true,
+ args: [],
+ imex: () => ({
+ local: {
+ center: bodyshop.md_responsibility_centers.taxes.local.name,
+ sale: Dinero(job.job_totals.totals.local_tax),
+ cost: Dinero(),
+ profitCenter: bodyshop.md_responsibility_centers.taxes.local,
+ costCenter: bodyshop.md_responsibility_centers.taxes.local
+ },
+ state: {
+ center: bodyshop.md_responsibility_centers.taxes.state.name,
+ sale: Dinero(job.job_totals.totals.state_tax),
+ cost: Dinero(),
+ profitCenter: bodyshop.md_responsibility_centers.taxes.state,
+ costCenter: bodyshop.md_responsibility_centers.taxes.state
+ },
+ federal: {
+ center: bodyshop.md_responsibility_centers.taxes.federal.name,
+ sale: Dinero(job.job_totals.totals.federal_tax),
+ cost: Dinero(),
+ profitCenter: bodyshop.md_responsibility_centers.taxes.federal,
+ costCenter: bodyshop.md_responsibility_centers.taxes.federal
+ }
+ }),
+ rome: () => ({
+ tax_ty1: {
+ center: bodyshop.md_responsibility_centers.taxes[`tax_ty1`].name,
+ sale: Dinero(job.job_totals.totals.us_sales_tax_breakdown[`ty1Tax`]),
+ cost: Dinero(),
+ profitCenter: bodyshop.md_responsibility_centers.taxes[`tax_ty1`],
+ costCenter: bodyshop.md_responsibility_centers.taxes[`tax_ty1`]
+ },
+ tax_ty2: {
+ center: bodyshop.md_responsibility_centers.taxes[`tax_ty2`].name,
+ sale: Dinero(job.job_totals.totals.us_sales_tax_breakdown[`ty2Tax`]),
+ cost: Dinero(),
+ profitCenter: bodyshop.md_responsibility_centers.taxes[`tax_ty2`],
+ costCenter: bodyshop.md_responsibility_centers.taxes[`tax_ty2`]
+ },
+ tax_ty3: {
+ center: bodyshop.md_responsibility_centers.taxes[`tax_ty3`].name,
+ sale: Dinero(job.job_totals.totals.us_sales_tax_breakdown[`ty3Tax`]),
+ cost: Dinero(),
+ profitCenter: bodyshop.md_responsibility_centers.taxes[`tax_ty3`],
+ costCenter: bodyshop.md_responsibility_centers.taxes[`tax_ty3`]
+ },
+ tax_ty4: {
+ center: bodyshop.md_responsibility_centers.taxes[`tax_ty4`].name,
+ sale: Dinero(job.job_totals.totals.us_sales_tax_breakdown[`ty4Tax`]),
+ cost: Dinero(),
+ profitCenter: bodyshop.md_responsibility_centers.taxes[`tax_ty4`],
+ costCenter: bodyshop.md_responsibility_centers.taxes[`tax_ty4`]
+ },
+ tax_ty5: {
+ center: bodyshop.md_responsibility_centers.taxes[`tax_ty5`].name,
+ sale: Dinero(job.job_totals.totals.us_sales_tax_breakdown[`ty5Tax`]),
+ cost: Dinero(),
+ profitCenter: bodyshop.md_responsibility_centers.taxes[`tax_ty5`],
+ costCenter: bodyshop.md_responsibility_centers.taxes[`tax_ty5`]
+ }
+ })
+ });
+
+ //Determine if there are MAPA and MASH lines already on the estimate.
+ //If there are, don't do anything extra (mitchell estimate)
+ //Otherwise, calculate them and add them to the default MAPA and MASH centers.
+ let hasMapaLine = false;
+ let hasMashLine = false;
+
+ const profitCenterHash = job.joblines.reduce((acc, val) => {
+ //Check the Parts Assignment
+ if (val.db_ref === "936008") {
+ //If either of these DB REFs change, they also need to change in job-totals/job-costing calculations.
+ hasMapaLine = true;
+ }
+ if (val.db_ref === "936007") {
+ hasMashLine = true;
+ }
+
+ if (val.profitcenter_part) {
+ if (!acc[val.profitcenter_part]) acc[val.profitcenter_part] = Dinero();
+
+ let DineroAmount = Dinero({
+ amount: Math.round(val.act_price * 100)
+ }).multiply(val.part_qty || 1);
+
+ DineroAmount = DineroAmount.add(
+ ((val.prt_dsmk_m && val.prt_dsmk_m !== 0) || (val.prt_dsmk_p && val.prt_dsmk_p !== 0)) &&
+ DiscountNotAlreadyCounted(val, job.joblines)
+ ? val.prt_dsmk_m
+ ? Dinero({ amount: Math.round(val.prt_dsmk_m * 100) })
+ : Dinero({
+ amount: Math.round(val.act_price * 100)
+ })
+ .multiply(val.part_qty || 0)
+ .percentage(Math.abs(val.prt_dsmk_p || 0))
+ .multiply(val.prt_dsmk_p > 0 ? 1 : -1)
+ : Dinero()
+ );
+
+ acc[val.profitcenter_part] = acc[val.profitcenter_part].add(DineroAmount);
+ }
+ if (val.profitcenter_labor && val.mod_lbr_ty) {
+ //Check the Labor Assignment.
+
+ if (!acc[val.profitcenter_labor]) acc[val.profitcenter_labor] = Dinero();
+
+ acc[val.profitcenter_labor] = acc[val.profitcenter_labor].add(
+ Dinero({
+ amount: Math.round(job[`rate_${val.mod_lbr_ty.toLowerCase()}`] * 100)
+ }).multiply(val.mod_lb_hrs)
+ );
+ }
+ return acc;
+ }, {});
+
+ const selectedDmsAllocationConfig = bodyshop.md_responsibility_centers.dms_defaults.find(
+ (d) => d.name === job.dms_allocation
+ );
+ CdkBase.createLogEvent(
+ connectionData,
+ "DEBUG",
+ `Using DMS Allocation ${selectedDmsAllocationConfig && selectedDmsAllocationConfig.name} for cost export.`
+ );
+
+ let costCenterHash = {};
+ //Check whether to skip this if PBS and using AP module.
+ const disablebillwip = !!bodyshop?.pbs_configuration?.disablebillwip;
+
+ if (!disablebillwip) {
+ costCenterHash = job.bills.reduce((bill_acc, bill_val) => {
+ bill_val.billlines.map((line_val) => {
+ if (!bill_acc[selectedDmsAllocationConfig.costs[line_val.cost_center]])
+ bill_acc[selectedDmsAllocationConfig.costs[line_val.cost_center]] = Dinero();
+
+ let lineDinero = Dinero({
+ amount: Math.round((line_val.actual_cost || 0) * 100)
+ })
+ .multiply(line_val.quantity)
+ .multiply(bill_val.is_credit_memo ? -1 : 1);
+
+ bill_acc[selectedDmsAllocationConfig.costs[line_val.cost_center]] =
+ bill_acc[selectedDmsAllocationConfig.costs[line_val.cost_center]].add(lineDinero);
+ return null;
+ });
+ return bill_acc;
+ }, {});
+ }
+
+ job.timetickets.forEach((ticket) => {
+ //Get the total amount of the ticket.
+ let TicketTotal = Dinero({
+ amount: Math.round(
+ ticket.rate *
+ (ticket.employee && ticket.employee.flat_rate ? ticket.productivehrs || 0 : ticket.actualhrs || 0) *
+ 100
+ )
+ });
+ //Add it to the right cost center.
+ if (!costCenterHash[selectedDmsAllocationConfig.costs[ticket.ciecacode]])
+ costCenterHash[selectedDmsAllocationConfig.costs[ticket.ciecacode]] = Dinero();
+
+ costCenterHash[selectedDmsAllocationConfig.costs[ticket.ciecacode]] =
+ costCenterHash[selectedDmsAllocationConfig.costs[ticket.ciecacode]].add(TicketTotal);
+ });
+
+ if (!hasMapaLine && job.job_totals.rates.mapa.total.amount > 0) {
+ // console.log("Adding MAPA Line Manually.");
+ const mapaAccountName = selectedDmsAllocationConfig.profits.MAPA;
+
+ const mapaAccount = bodyshop.md_responsibility_centers.profits.find((c) => c.name === mapaAccountName);
+
+ if (mapaAccount) {
+ if (!profitCenterHash[mapaAccountName]) profitCenterHash[mapaAccountName] = Dinero();
+
+ profitCenterHash[mapaAccountName] = profitCenterHash[mapaAccountName].add(
+ Dinero(job.job_totals.rates.mapa.total)
+ );
+ } else {
+ //console.log("NO MAPA ACCOUNT FOUND!!");
+ }
+ }
+
+ if (!hasMashLine && job.job_totals.rates.mash.total.amount > 0) {
+ // console.log("Adding MASH Line Manually.");
+
+ const mashAccountName = selectedDmsAllocationConfig.profits.MASH;
+
+ const mashAccount = bodyshop.md_responsibility_centers.profits.find((c) => c.name === mashAccountName);
+
+ if (mashAccount) {
+ if (!profitCenterHash[mashAccountName]) profitCenterHash[mashAccountName] = Dinero();
+
+ profitCenterHash[mashAccountName] = profitCenterHash[mashAccountName].add(
+ Dinero(job.job_totals.rates.mash.total)
+ );
+ } else {
+ // console.log("NO MASH ACCOUNT FOUND!!");
+ }
+ }
+ // console.log(
+ // Number.isInteger(bodyshop?.cdk_configuration?.sendmaterialscosting),
+ // typeof Number.isInteger(bodyshop?.cdk_configuration?.sendmaterialscosting)
+ // );
+ if (!!bodyshop?.cdk_configuration?.sendmaterialscosting) {
+ //Manually send the percentage of the costing.
+
+ //Paint Mat
+ const mapaAccountName = selectedDmsAllocationConfig.costs.MAPA;
+ const mapaAccount = bodyshop.md_responsibility_centers.costs.find((c) => c.name === mapaAccountName);
+ if (mapaAccount) {
+ if (!costCenterHash[mapaAccountName]) costCenterHash[mapaAccountName] = Dinero();
+ if (job.bodyshop.use_paint_scale_data === true) {
+ if (job.mixdata.length > 0) {
+ costCenterHash[mapaAccountName] = costCenterHash[mapaAccountName].add(
+ Dinero({
+ amount: Math.round(((job.mixdata[0] && job.mixdata[0].totalliquidcost) || 0) * 100)
+ })
+ );
+ } else {
+ costCenterHash[mapaAccountName] = costCenterHash[mapaAccountName].add(
+ Dinero(job.job_totals.rates.mapa.total).percentage(bodyshop?.cdk_configuration?.sendmaterialscosting)
+ );
+ }
+ } else {
+ costCenterHash[mapaAccountName] = costCenterHash[mapaAccountName].add(
+ Dinero(job.job_totals.rates.mapa.total).percentage(bodyshop?.cdk_configuration?.sendmaterialscosting)
+ );
+ }
+ } else {
+ //console.log("NO MAPA ACCOUNT FOUND!!");
+ }
+
+ //Shop Mat
+ const mashAccountName = selectedDmsAllocationConfig.costs.MASH;
+ const mashAccount = bodyshop.md_responsibility_centers.costs.find((c) => c.name === mashAccountName);
+ if (mashAccount) {
+ if (!costCenterHash[mashAccountName]) costCenterHash[mashAccountName] = Dinero();
+ costCenterHash[mashAccountName] = costCenterHash[mashAccountName].add(
+ Dinero(job.job_totals.rates.mash.total).percentage(bodyshop?.cdk_configuration?.sendmaterialscosting)
+ );
+ } else {
+ // console.log("NO MASH ACCOUNT FOUND!!");
+ }
+ }
+
+ const { ca_bc_pvrt } = job;
+ if (ca_bc_pvrt) {
+ // const pvrtAccount = bodyshop.md_responsibility_centers.profits.find(
+ // (c) => c.name === mashAccountName
+ // );
+
+ taxAllocations.state.sale = taxAllocations.state.sale.add(Dinero({ amount: Math.round((ca_bc_pvrt || 0) * 100) }));
+ }
+
+ if (job.towing_payable && job.towing_payable !== 0) {
+ const towAccountName = selectedDmsAllocationConfig.profits.TOW;
+
+ const towAccount = bodyshop.md_responsibility_centers.profits.find((c) => c.name === towAccountName);
+
+ if (towAccount) {
+ if (!profitCenterHash[towAccountName]) profitCenterHash[towAccountName] = Dinero();
+
+ profitCenterHash[towAccountName] = profitCenterHash[towAccountName].add(
+ Dinero({
+ amount: Math.round((job.towing_payable || 0) * 100)
+ })
+ );
+ } else {
+ // console.log("NO MASH ACCOUNT FOUND!!");
+ }
+ }
+ if (job.storage_payable && job.storage_payable !== 0) {
+ const storageAccountName = selectedDmsAllocationConfig.profits.TOW;
+
+ const towAccount = bodyshop.md_responsibility_centers.profits.find((c) => c.name === storageAccountName);
+
+ if (towAccount) {
+ if (!profitCenterHash[storageAccountName]) profitCenterHash[storageAccountName] = Dinero();
+
+ profitCenterHash[storageAccountName] = profitCenterHash[storageAccountName].add(
+ Dinero({
+ amount: Math.round((job.storage_payable || 0) * 100)
+ })
+ );
+ } else {
+ // console.log("NO MASH ACCOUNT FOUND!!");
+ }
+ }
+
+ if (job.adjustment_bottom_line && job.adjustment_bottom_line !== 0) {
+ const otherAccountName = selectedDmsAllocationConfig.profits.PAO;
+
+ const otherAccount = bodyshop.md_responsibility_centers.profits.find((c) => c.name === otherAccountName);
+
+ if (otherAccount) {
+ if (!profitCenterHash[otherAccountName]) profitCenterHash[otherAccountName] = Dinero();
+
+ profitCenterHash[otherAccountName] = profitCenterHash[otherAccountName].add(
+ Dinero({
+ amount: Math.round((job.adjustment_bottom_line || 0) * 100)
+ })
+ );
+ } else {
+ // console.log("NO MASH ACCOUNT FOUND!!");
+ }
+ }
+ if (InstanceManager({ rome: true })) {
+ //profile level adjustments
+ Object.keys(job.job_totals.parts.adjustments).forEach((key) => {
+ const accountName = selectedDmsAllocationConfig.profits[key];
+
+ const otherAccount = bodyshop.md_responsibility_centers.profits.find((c) => c.name === accountName);
+
+ if (otherAccount) {
+ if (!profitCenterHash[accountName]) profitCenterHash[accountName] = Dinero();
+
+ profitCenterHash[accountName] = profitCenterHash[accountName].add(
+ Dinero(job.job_totals.parts.adjustments[key])
+ );
+ } else {
+ CdkBase.createLogEvent(
+ connectionData,
+ "ERROR",
+ `Error encountered in CdkCalculateAllocations. Unable to find adjustment account. ${error}`
+ );
+ }
+ });
+ }
+
+ const jobAllocations = _.union(Object.keys(profitCenterHash), Object.keys(costCenterHash)).map((key) => {
+ const profitCenter = bodyshop.md_responsibility_centers.profits.find((c) => c.name === key);
+ const costCenter = bodyshop.md_responsibility_centers.costs.find((c) => c.name === key);
+
+ return {
+ center: key,
+ sale: profitCenterHash[key] ? profitCenterHash[key] : Dinero(),
+ cost: costCenterHash[key] ? costCenterHash[key] : Dinero(),
+ profitCenter,
+ costCenter
+ };
+ });
+
+ return [
+ ...jobAllocations,
+ ...Object.keys(taxAllocations)
+ .filter((key) => taxAllocations[key].sale.getAmount() > 0 || taxAllocations[key].cost.getAmount() > 0)
+ .map((key) => {
+ if (
+ key === "federal" &&
+ selectedDmsAllocationConfig.gst_override &&
+ selectedDmsAllocationConfig.gst_override !== ""
+ ) {
+ const ret = { ...taxAllocations[key], tax: key };
+ ret.costCenter.dms_acctnumber = selectedDmsAllocationConfig.gst_override;
+ ret.profitCenter.dms_acctnumber = selectedDmsAllocationConfig.gst_override;
+ return ret;
+ } else {
+ return { ...taxAllocations[key], tax: key };
+ }
+ })
+ ];
+}
diff --git a/server/data/kaizen.js b/server/data/kaizen.js
index e0f82b58a..60e307956 100644
--- a/server/data/kaizen.js
+++ b/server/data/kaizen.js
@@ -244,6 +244,7 @@ const CreateRepairOrderTag = (job, errorCallback) => {
},
InsuranceCompany: job.ins_co_nm || "",
Claim: job.clm_no || "",
+ DMSAllocation: job.dms_allocation || "",
Contacts: {
CSR: job.employee_csr_rel
? `${
@@ -643,7 +644,8 @@ const CreateJobLines = (joblines) => {
part_qty: jobline.part_qty,
part_price: jobline.act_price,
labor_type: jobline.mod_lbr_ty,
- labor_hours: jobline.mod_lb_hrs
+ labor_hours: jobline.mod_lb_hrs,
+ labor_sale: jobline.lbr_amt
});
});
return repairLines;
@@ -660,7 +662,10 @@ const CreateTimeTickets = (timetickets) => {
.trim(),
productive_hrs: ticket.productivehrs,
actual_hrs: ticket.actualhrs,
- cost_center: ticket.cost_center
+ cost_center: ticket.cost_center,
+ flat_rate: ticket.flat_rate,
+ rate: ticket.rate,
+ ticket_cost: ticket.flat_rate ? ticket.rate * ticket.productive_hrs : ticket.rate * ticket.actual_hrs
});
});
return timeTickets;
diff --git a/server/graphql-client/queries.js b/server/graphql-client/queries.js
index 4e63fff7e..9a2e139b4 100644
--- a/server/graphql-client/queries.js
+++ b/server/graphql-client/queries.js
@@ -1139,6 +1139,7 @@ exports.KAIZEN_QUERY = `query KAIZEN_EXPORT($start: timestamptz, $bodyshopid: uu
date_open
date_repairstarted
date_void
+ dms_allocation
employee_body_rel {
first_name
last_name
@@ -1184,6 +1185,7 @@ exports.KAIZEN_QUERY = `query KAIZEN_EXPORT($start: timestamptz, $bodyshopid: uu
}
db_price
id
+ lbr_amt
lbr_op
line_desc
line_ind
diff --git a/server/render/canvas-colors.js b/server/render/canvas-colors.js
new file mode 100644
index 000000000..a23208b2a
--- /dev/null
+++ b/server/render/canvas-colors.js
@@ -0,0 +1,76 @@
+const borderColors = [
+ "rgba(193, 0, 50, 1)",
+ "rgba(0, 101, 68, 1)",
+ "rgba(0, 45, 98, 1)",
+ "rgba(253, 184, 0, 1)",
+ "rgba(200, 112, 126, 1)",
+ "rgba(228, 142, 88, 1)",
+ "rgba(90, 160, 141, 1)",
+ "rgba(103, 143, 174, 1)",
+ "rgba(192, 136, 99, 1)",
+ "rgba(234, 3, 55, 1)",
+ "rgba(0, 149, 67, 1)",
+ "rgba(0, 81, 155, 1)",
+ "rgba(226, 143, 173, 1)",
+ "rgba(237, 170, 125, 1)",
+ "rgba(76, 146, 177, 1)",
+ "rgba(172, 153, 193, 1)",
+ "rgba(173, 167, 89, 1)",
+ "rgba(254, 197, 222, 1)",
+ "rgba(177, 231, 223, 1)",
+ "rgba(120, 199, 235, 1)",
+ "rgba(239, 180, 193, 1)",
+ "rgba(240, 199, 171, 1)",
+ "rgba(168, 200, 121, 1)",
+ "rgba(150, 177, 208, 1)",
+ "rgba(200, 194, 189, 1)",
+ "rgba(244, 244, 244, 1)",
+ "rgba(255, 99, 132, 1)",
+ "rgba(54, 162, 235, 1)",
+ "rgba(255, 206, 86, 1)",
+ "rgba(75, 192, 192, 1)",
+ "rgba(153, 102, 255, 1)",
+ "rgba(255, 159, 64, 1)",
+ "rgba(170, 183, 184, 1)",
+];
+
+const backgroundColors = [
+ 'rgba(193, 0, 50, 0.2)',
+ 'rgba(0, 101, 68, 0.2)',
+ 'rgba(0, 45, 98, 0.2)',
+ 'rgba(253, 184, 0, 0.2)',
+ 'rgba(200, 112, 126, 0.2)',
+ 'rgba(228, 142, 88, 0.2)',
+ 'rgba(90, 160, 141, 0.2)',
+ 'rgba(103, 143, 174, 0.2)',
+ 'rgba(192, 136, 99, 0.2)',
+ 'rgba(234, 3, 55, 0.2)',
+ 'rgba(0, 149, 67, 0.2)',
+ 'rgba(0, 81, 155, 0.2)',
+ 'rgba(226, 143, 173, 0.2)',
+ 'rgba(237, 170, 125, 0.2)',
+ 'rgba(76, 146, 177, 0.2)',
+ 'rgba(172, 153, 193, 0.2)',
+ 'rgba(173, 167, 89, 0.2)',
+ 'rgba(254, 197, 222, 0.2)',
+ 'rgba(177, 231, 223, 0.2)',
+ 'rgba(120, 199, 235, 0.2)',
+ 'rgba(239, 180, 193, 0.2)',
+ 'rgba(240, 199, 171, 0.2)',
+ 'rgba(168, 200, 121, 0.2)',
+ 'rgba(150, 177, 208, 0.2)',
+ 'rgba(200, 194, 189, 0.2)',
+ 'rgba(244, 244, 244, 0.2)',
+ 'rgba(255, 99, 132, 0.2)',
+ 'rgba(54, 162, 235, 0.2)',
+ 'rgba(255, 206, 86, 0.2)',
+ 'rgba(75, 192, 192, 0.2)',
+ 'rgba(153, 102, 255, 0.2)',
+ 'rgba(255, 159, 64, 0.2)',
+ 'rgba(170, 183, 184, 0.2)',
+];
+
+module.exports = {
+ borderColors,
+ backgroundColors,
+};
diff --git a/server/render/canvas-handler.js b/server/render/canvas-handler.js
new file mode 100644
index 000000000..010a3bec3
--- /dev/null
+++ b/server/render/canvas-handler.js
@@ -0,0 +1,92 @@
+const { createCanvas } = require("canvas");
+const Chart = require("chart.js/auto");
+
+const { backgroundColors, borderColors } = require("./canvas-colors");
+const { isObject, defaultsDeep, isNumber } = require("lodash");
+
+exports.canvastest = function (req, res) {
+ console.log("Incoming test request.", req);
+ res.status(200).send("OK");
+};
+
+exports.canvas = function (req, res) {
+ const { w, h, values, keys, override } = req.body;
+ console.log("Incoming Canvas Request:", w, h, values, keys, override);
+
+ // Gate required values
+ if (!values || !keys) {
+ res.status(400).send("Missing required data");
+ return;
+ }
+
+ // Override must be an object if it exists
+ if (override && !isObject(override)) {
+ res.status(400).send("Override must be an object");
+ return;
+ }
+
+ // Set the default Width and Height
+ let [width, height] = [500, 275];
+
+ // Allow for custom width and height
+ if (isNumber(w)) {
+ width = w;
+ }
+ if (isNumber(h)) {
+ height = h;
+ }
+
+ const configuration = {
+ type: "doughnut",
+ data: {
+ labels: keys,
+ datasets: [
+ {
+ data: values,
+ backgroundColor: backgroundColors,
+ borderColor: borderColors,
+ borderWidth: 1
+ }
+ ]
+ },
+ options: {
+ devicePixelRatio: 4,
+ responsive: false,
+ maintainAspectRatio: true,
+ circumference: 180,
+ rotation: -90,
+ plugins: {
+ legend: {
+ labels: {
+ boxWidth: 20,
+ font: {
+ family: "'Montserrat'",
+ size: 10,
+ style: "normal",
+ weight: "normal"
+ }
+ },
+ position: "left"
+ }
+ }
+ }
+ };
+
+ // If we have a valid override object, merge it with the default configuration object.
+ // This allows for you to override the default configuration with a custom one.
+ const defaults = () => {
+ if (!override || !isObject(override)) {
+ return configuration;
+ }
+ return defaultsDeep(override, configuration);
+ };
+
+ res.status(200).send(
+ (() => {
+ const canvas = createCanvas(width, height);
+ const ctx = canvas.getContext("2d");
+ new Chart(ctx, defaults());
+ return canvas.toDataURL();
+ })()
+ );
+};
diff --git a/server/routes/cdkRoutes.js b/server/routes/cdkRoutes.js
index 5fd0536cb..614e59d2b 100644
--- a/server/routes/cdkRoutes.js
+++ b/server/routes/cdkRoutes.js
@@ -1,11 +1,13 @@
const express = require("express");
const router = express.Router();
const cdkGetMake = require("../cdk/cdk-get-makes");
+const cdkCalculateAllocations = require("../cdk/cdk-calculate-allocations");
const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware");
const withUserGraphQLClientMiddleware = require("../middleware/withUserGraphQLClientMiddleware");
router.use(validateFirebaseIdTokenMiddleware);
router.post("/getvehicles", withUserGraphQLClientMiddleware, cdkGetMake.default);
+router.post("/calculate-allocations", withUserGraphQLClientMiddleware, cdkCalculateAllocations.defaultRoute);
module.exports = router;
diff --git a/server/routes/miscellaneousRoutes.js b/server/routes/miscellaneousRoutes.js
index b2dd80b26..fded5f44b 100644
--- a/server/routes/miscellaneousRoutes.js
+++ b/server/routes/miscellaneousRoutes.js
@@ -11,6 +11,7 @@ const eventAuthorizationMiddleware = require("../middleware/eventAuthorizationMI
const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware");
const withUserGraphQLClientMiddleware = require("../middleware/withUserGraphQLClientMiddleware");
const { taskAssignedEmail, tasksRemindEmail } = require("../email/tasksEmails");
+const { canvastest } = require("../render/canvas-handler");
//Test route to ensure Express is responding.
router.get("/test", async function (req, res) {
@@ -49,4 +50,7 @@ router.post("/tasks-remind-handler", eventAuthorizationMiddleware, tasksRemindEm
router.post("/record-handler/arms", data.arms);
router.post("/taskHandler", validateFirebaseIdTokenMiddleware, taskHandler.taskHandler);
+// Canvas Test
+router.post("/canvastest", validateFirebaseIdTokenMiddleware, canvastest);
+
module.exports = router;
diff --git a/server/routes/renderRoutes.js b/server/routes/renderRoutes.js
index 5bb91616a..13288d989 100644
--- a/server/routes/renderRoutes.js
+++ b/server/routes/renderRoutes.js
@@ -2,8 +2,10 @@ const express = require("express");
const router = express.Router();
const { inlinecss } = require("../render/inlinecss");
const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware");
+const { canvas } = require("../render/canvas-handler");
// Define the route for inline CSS rendering
router.post("/inlinecss", validateFirebaseIdTokenMiddleware, inlinecss);
+router.post("/canvas", validateFirebaseIdTokenMiddleware, canvas);
module.exports = router;