diff --git a/ecole/.env b/ecole/.env
index dbf91105..70eccd34 100644
--- a/ecole/.env
+++ b/ecole/.env
@@ -1,5 +1,6 @@
+#DB_URL=http://ppsi_nanterre.axa-fr.intraxa:3005/
DB_URL=http://127.0.0.1:8091/
DB_ADMIN=admin@axa.fr
DB_PASSWORD=DTadmin123TT
NODE_ENV=developpement
-PORT=8082
+PORT=8082
\ No newline at end of file
diff --git a/ecole/.gitignore b/ecole/.gitignore
index 316c585e..275e677e 100644
--- a/ecole/.gitignore
+++ b/ecole/.gitignore
@@ -1,33 +1,13 @@
-# Dependencies
-node_modules/
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-
-# Classique
-package-lock.json
-
-# Logs
-logs/
+# Ignore files type
*.log
+*.env
+*.exe
+*.wbk
+*.cmd
+*~*
-# Environment variables
-.env
-.env.local
-.env.*.local
-
-# OS files
-.DS_Store
-Thumbs.db
-
-# IDE
-.vscode/
-.idea/
-*.swp
-*.swo
-*~
-
-# Build outputs
-dist/
-build/
-
+# Ignore directory
+**/vbs/
+**/node_modules/
+**/logs/
+**/.vscode/
\ No newline at end of file
diff --git a/ecole/README.md b/ecole/README.md
new file mode 100644
index 00000000..a67aaad8
--- /dev/null
+++ b/ecole/README.md
@@ -0,0 +1,2 @@
+Description
+EasyTransport est une application en cours de transition technologique, destinée à la plateforme AxA IARD Transport. Le backend est écrit en Node.js avec une base de données embarquée PocketBase, et le frontend utilise EJS et Materialize CSS. L'application propose divers modules tels que la tarification, la génération de contrats à partir de formulaires, l'authentification via JWT, et la génération d'attestations.
diff --git a/ecole/package-lock.json b/ecole/package-lock.json
index 048beaef..fe6fae15 100644
--- a/ecole/package-lock.json
+++ b/ecole/package-lock.json
@@ -33,53 +33,61 @@
"supertest": "^6.3.3"
}
},
- "node_modules/@babel/code-frame": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
- "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
+ "node_modules/@ampproject/remapping": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
+ "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@babel/helper-validator-identifier": "^7.27.1",
- "js-tokens": "^4.0.0",
- "picocolors": "^1.1.1"
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz",
+ "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/compat-data": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz",
- "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==",
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz",
+ "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/core": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz",
- "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==",
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.6.tgz",
+ "integrity": "sha512-HPIyDa6n+HKw5dEuway3vVAhBboYCtREBMp+IWeseZy6TFtzn6MHkCH2KKYUOC/vKKwgSMHQW4htBOrmuRPXfw==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.27.1",
- "@babel/generator": "^7.28.5",
- "@babel/helper-compilation-targets": "^7.27.2",
- "@babel/helper-module-transforms": "^7.28.3",
- "@babel/helpers": "^7.28.4",
- "@babel/parser": "^7.28.5",
- "@babel/template": "^7.27.2",
- "@babel/traverse": "^7.28.5",
- "@babel/types": "^7.28.5",
- "@jridgewell/remapping": "^2.3.5",
- "convert-source-map": "^2.0.0",
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.22.5",
+ "@babel/generator": "^7.22.5",
+ "@babel/helper-compilation-targets": "^7.22.6",
+ "@babel/helper-module-transforms": "^7.22.5",
+ "@babel/helpers": "^7.22.6",
+ "@babel/parser": "^7.22.6",
+ "@babel/template": "^7.22.5",
+ "@babel/traverse": "^7.22.6",
+ "@babel/types": "^7.22.5",
+ "@nicolo-ribaudo/semver-v6": "^6.3.3",
+ "convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
- "json5": "^2.2.3",
- "semver": "^6.3.1"
+ "json5": "^2.2.2"
},
"engines": {
"node": ">=6.9.0"
@@ -89,14 +97,19 @@
"url": "https://opencollective.com/babel"
}
},
+ "node_modules/@babel/core/node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "dev": true
+ },
"node_modules/@babel/core/node_modules/debug": {
- "version": "4.4.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
- "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "ms": "^2.1.3"
+ "ms": "2.1.2"
},
"engines": {
"node": ">=6.0"
@@ -108,80 +121,37 @@
}
},
"node_modules/@babel/core/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true,
- "license": "MIT"
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
},
"node_modules/@babel/generator": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz",
- "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz",
+ "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@babel/parser": "^7.28.5",
- "@babel/types": "^7.28.5",
- "@jridgewell/gen-mapping": "^0.3.12",
- "@jridgewell/trace-mapping": "^0.3.28",
- "jsesc": "^3.0.2"
+ "@babel/types": "^7.22.5",
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "@jridgewell/trace-mapping": "^0.3.17",
+ "jsesc": "^2.5.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-compilation-targets": {
- "version": "7.27.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
- "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz",
+ "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@babel/compat-data": "^7.27.2",
- "@babel/helper-validator-option": "^7.27.1",
- "browserslist": "^4.24.0",
- "lru-cache": "^5.1.1",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-globals": {
- "version": "7.28.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
- "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-imports": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
- "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/traverse": "^7.27.1",
- "@babel/types": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-transforms": {
- "version": "7.28.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz",
- "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-imports": "^7.27.1",
- "@babel/helper-validator-identifier": "^7.27.1",
- "@babel/traverse": "^7.28.3"
+ "@babel/compat-data": "^7.22.6",
+ "@babel/helper-validator-option": "^7.22.5",
+ "@nicolo-ribaudo/semver-v6": "^6.3.3",
+ "browserslist": "^4.21.9",
+ "lru-cache": "^5.1.1"
},
"engines": {
"node": ">=6.9.0"
@@ -190,69 +160,214 @@
"@babel/core": "^7.0.0"
}
},
- "node_modules/@babel/helper-plugin-utils": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
- "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
+ "node_modules/@babel/helper-environment-visitor": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz",
+ "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==",
"dev": true,
- "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-function-name": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz",
+ "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.22.5",
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-hoist-variables": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
+ "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz",
+ "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz",
+ "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.22.5",
+ "@babel/helper-module-imports": "^7.22.5",
+ "@babel/helper-simple-access": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.5",
+ "@babel/helper-validator-identifier": "^7.22.5",
+ "@babel/template": "^7.22.5",
+ "@babel/traverse": "^7.22.5",
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz",
+ "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-simple-access": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
+ "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
+ "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-string-parser": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
- "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
+ "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
- "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz",
+ "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-option": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
- "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz",
+ "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helpers": {
- "version": "7.28.4",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz",
- "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==",
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz",
+ "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@babel/template": "^7.27.2",
- "@babel/types": "^7.28.4"
+ "@babel/template": "^7.22.5",
+ "@babel/traverse": "^7.22.6",
+ "@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
- "node_modules/@babel/parser": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz",
- "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==",
+ "node_modules/@babel/highlight": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz",
+ "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@babel/types": "^7.28.5"
+ "@babel/helper-validator-identifier": "^7.22.5",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
},
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.6.tgz",
+ "integrity": "sha512-EIQu22vNkceq3LbjAq7knDf/UmtI2qbcNI8GRBlijez6TpQLvSodJPYfydQmNA5buwkxxxa/PVI44jjYZ+/cLw==",
+ "dev": true,
"bin": {
"parser": "bin/babel-parser.js"
},
@@ -265,7 +380,6 @@
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
"integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
@@ -278,7 +392,6 @@
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
"integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
@@ -291,7 +404,6 @@
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
"integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.12.13"
},
@@ -299,44 +411,11 @@
"@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-syntax-class-static-block": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
- "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-import-attributes": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz",
- "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
"node_modules/@babel/plugin-syntax-import-meta": {
"version": "7.10.4",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
"integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.10.4"
},
@@ -349,7 +428,6 @@
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
"integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
@@ -358,13 +436,12 @@
}
},
"node_modules/@babel/plugin-syntax-jsx": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz",
- "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz",
+ "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
@@ -378,7 +455,6 @@
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
"integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.10.4"
},
@@ -391,7 +467,6 @@
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
"integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
@@ -404,7 +479,6 @@
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
"integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.10.4"
},
@@ -417,7 +491,6 @@
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
"integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
@@ -430,7 +503,6 @@
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
"integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
@@ -443,7 +515,6 @@
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
"integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
@@ -451,28 +522,11 @@
"@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-syntax-private-property-in-object": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
- "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
"node_modules/@babel/plugin-syntax-top-level-await": {
"version": "7.14.5",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
"integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.14.5"
},
@@ -484,13 +538,12 @@
}
},
"node_modules/@babel/plugin-syntax-typescript": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz",
- "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz",
+ "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
@@ -500,47 +553,47 @@
}
},
"node_modules/@babel/template": {
- "version": "7.27.2",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
- "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz",
+ "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.27.1",
- "@babel/parser": "^7.27.2",
- "@babel/types": "^7.27.1"
+ "@babel/code-frame": "^7.22.5",
+ "@babel/parser": "^7.22.5",
+ "@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz",
- "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==",
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.6.tgz",
+ "integrity": "sha512-53CijMvKlLIDlOTrdWiHileRddlIiwUIyCKqYa7lYnnPldXCG5dUSN38uT0cA6i7rHWNKJLH0VU/Kxdr1GzB3w==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.27.1",
- "@babel/generator": "^7.28.5",
- "@babel/helper-globals": "^7.28.0",
- "@babel/parser": "^7.28.5",
- "@babel/template": "^7.27.2",
- "@babel/types": "^7.28.5",
- "debug": "^4.3.1"
+ "@babel/code-frame": "^7.22.5",
+ "@babel/generator": "^7.22.5",
+ "@babel/helper-environment-visitor": "^7.22.5",
+ "@babel/helper-function-name": "^7.22.5",
+ "@babel/helper-hoist-variables": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/parser": "^7.22.6",
+ "@babel/types": "^7.22.5",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse/node_modules/debug": {
- "version": "4.4.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
- "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "ms": "^2.1.3"
+ "ms": "2.1.2"
},
"engines": {
"node": ">=6.0"
@@ -552,21 +605,20 @@
}
},
"node_modules/@babel/traverse/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true,
- "license": "MIT"
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
},
"node_modules/@babel/types": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz",
- "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz",
+ "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@babel/helper-string-parser": "^7.27.1",
- "@babel/helper-validator-identifier": "^7.28.5"
+ "@babel/helper-string-parser": "^7.22.5",
+ "@babel/helper-validator-identifier": "^7.22.5",
+ "to-fast-properties": "^2.0.0"
},
"engines": {
"node": ">=6.9.0"
@@ -576,25 +628,22 @@
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
"integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/@colors/colors": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz",
- "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==",
- "license": "MIT",
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
+ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
"engines": {
"node": ">=0.1.90"
}
},
"node_modules/@dabh/diagnostics": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz",
- "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==",
- "license": "MIT",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz",
+ "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==",
"dependencies": {
- "@so-ric/colorspace": "^1.1.6",
+ "colorspace": "1.1.x",
"enabled": "2.0.x",
"kuler": "^2.0.0"
}
@@ -604,7 +653,6 @@
"resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
"integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
"dev": true,
- "license": "ISC",
"dependencies": {
"camelcase": "^5.3.1",
"find-up": "^4.1.0",
@@ -621,23 +669,21 @@
"resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
"integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/@jest/console": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz",
- "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.0.tgz",
+ "integrity": "sha512-anb6L1yg7uPQpytNVA5skRaXy3BmrsU8icRhTVNbWdjYWDDfy8M1Kq5HIVRpYoABdbpqsc5Dr+jtu4+qWRQBiQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@jest/types": "^29.6.3",
+ "@jest/types": "^29.6.0",
"@types/node": "*",
"chalk": "^4.0.0",
- "jest-message-util": "^29.7.0",
- "jest-util": "^29.7.0",
+ "jest-message-util": "^29.6.0",
+ "jest-util": "^29.6.0",
"slash": "^3.0.0"
},
"engines": {
@@ -645,38 +691,37 @@
}
},
"node_modules/@jest/core": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz",
- "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.0.tgz",
+ "integrity": "sha512-5dbMHfY/5R9m8NbgmB3JlxQqooZ/ooPSOiwEQZZ+HODwJTbIu37seVcZNBK29aMdXtjvTRB3f6LCvkKq+r8uQA==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@jest/console": "^29.7.0",
- "@jest/reporters": "^29.7.0",
- "@jest/test-result": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
+ "@jest/console": "^29.6.0",
+ "@jest/reporters": "^29.6.0",
+ "@jest/test-result": "^29.6.0",
+ "@jest/transform": "^29.6.0",
+ "@jest/types": "^29.6.0",
"@types/node": "*",
"ansi-escapes": "^4.2.1",
"chalk": "^4.0.0",
"ci-info": "^3.2.0",
"exit": "^0.1.2",
"graceful-fs": "^4.2.9",
- "jest-changed-files": "^29.7.0",
- "jest-config": "^29.7.0",
- "jest-haste-map": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-regex-util": "^29.6.3",
- "jest-resolve": "^29.7.0",
- "jest-resolve-dependencies": "^29.7.0",
- "jest-runner": "^29.7.0",
- "jest-runtime": "^29.7.0",
- "jest-snapshot": "^29.7.0",
- "jest-util": "^29.7.0",
- "jest-validate": "^29.7.0",
- "jest-watcher": "^29.7.0",
+ "jest-changed-files": "^29.5.0",
+ "jest-config": "^29.6.0",
+ "jest-haste-map": "^29.6.0",
+ "jest-message-util": "^29.6.0",
+ "jest-regex-util": "^29.4.3",
+ "jest-resolve": "^29.6.0",
+ "jest-resolve-dependencies": "^29.6.0",
+ "jest-runner": "^29.6.0",
+ "jest-runtime": "^29.6.0",
+ "jest-snapshot": "^29.6.0",
+ "jest-util": "^29.6.0",
+ "jest-validate": "^29.6.0",
+ "jest-watcher": "^29.6.0",
"micromatch": "^4.0.4",
- "pretty-format": "^29.7.0",
+ "pretty-format": "^29.6.0",
"slash": "^3.0.0",
"strip-ansi": "^6.0.0"
},
@@ -693,94 +738,88 @@
}
},
"node_modules/@jest/environment": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz",
- "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.0.tgz",
+ "integrity": "sha512-bUZLYUxYlUIsslBbxII0fq0kr1+friI3Gty+cRLmocGB1jdcAHs7FS8QdCDqedE8q4DZE1g/AJHH6OJZBLGGsg==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@jest/fake-timers": "^29.7.0",
- "@jest/types": "^29.6.3",
+ "@jest/fake-timers": "^29.6.0",
+ "@jest/types": "^29.6.0",
"@types/node": "*",
- "jest-mock": "^29.7.0"
+ "jest-mock": "^29.6.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/expect": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz",
- "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.0.tgz",
+ "integrity": "sha512-a7pISPW28Q3c0/pLwz4mQ6tbAI+hc8/0CJp9ix6e9U4dQ6TiHQX82CT5DV5BMWaw8bFH4E6zsfZxXdn6Ka23Bw==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "expect": "^29.7.0",
- "jest-snapshot": "^29.7.0"
+ "expect": "^29.6.0",
+ "jest-snapshot": "^29.6.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/expect-utils": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz",
- "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.0.tgz",
+ "integrity": "sha512-LLSQQN7oypMSETKoPWpsWYVKJd9LQWmSDDAc4hUQ4JocVC7LAMy9R3ZMhlnLwbcFvQORZnZR7HM893Px6cJhvA==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "jest-get-type": "^29.6.3"
+ "jest-get-type": "^29.4.3"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/fake-timers": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz",
- "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.0.tgz",
+ "integrity": "sha512-nuCU46AsZoskthWSDS2Aj6LARgyNcp5Fjx2qxsO/fPl1Wp1CJ+dBDqs0OkEcJK8FBeV/MbjH5efe79M2sHcV+A==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@jest/types": "^29.6.3",
+ "@jest/types": "^29.6.0",
"@sinonjs/fake-timers": "^10.0.2",
"@types/node": "*",
- "jest-message-util": "^29.7.0",
- "jest-mock": "^29.7.0",
- "jest-util": "^29.7.0"
+ "jest-message-util": "^29.6.0",
+ "jest-mock": "^29.6.0",
+ "jest-util": "^29.6.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/globals": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz",
- "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.0.tgz",
+ "integrity": "sha512-IQQ3hZ2D/hwEwXSMv5GbfhzdH0nTQR3KPYxnuW6gYWbd6+7/zgMz7Okn6EgBbNtJNONq03k5EKA6HqGyzRbpeg==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@jest/environment": "^29.7.0",
- "@jest/expect": "^29.7.0",
- "@jest/types": "^29.6.3",
- "jest-mock": "^29.7.0"
+ "@jest/environment": "^29.6.0",
+ "@jest/expect": "^29.6.0",
+ "@jest/types": "^29.6.0",
+ "jest-mock": "^29.6.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/reporters": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz",
- "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.0.tgz",
+ "integrity": "sha512-dWEq4HI0VvHcAD6XTtyBKKARLytyyWPIy1SvGOcU91106MfvHPdxZgupFwVHd8TFpZPpA3SebYjtwS5BUS76Rw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@bcoe/v8-coverage": "^0.2.3",
- "@jest/console": "^29.7.0",
- "@jest/test-result": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
+ "@jest/console": "^29.6.0",
+ "@jest/test-result": "^29.6.0",
+ "@jest/transform": "^29.6.0",
+ "@jest/types": "^29.6.0",
"@jridgewell/trace-mapping": "^0.3.18",
"@types/node": "*",
"chalk": "^4.0.0",
@@ -789,13 +828,13 @@
"glob": "^7.1.3",
"graceful-fs": "^4.2.9",
"istanbul-lib-coverage": "^3.0.0",
- "istanbul-lib-instrument": "^6.0.0",
+ "istanbul-lib-instrument": "^5.1.0",
"istanbul-lib-report": "^3.0.0",
"istanbul-lib-source-maps": "^4.0.0",
"istanbul-reports": "^3.1.3",
- "jest-message-util": "^29.7.0",
- "jest-util": "^29.7.0",
- "jest-worker": "^29.7.0",
+ "jest-message-util": "^29.6.0",
+ "jest-util": "^29.6.0",
+ "jest-worker": "^29.6.0",
"slash": "^3.0.0",
"string-length": "^4.0.1",
"strip-ansi": "^6.0.0",
@@ -814,11 +853,10 @@
}
},
"node_modules/@jest/schemas": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
- "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz",
+ "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@sinclair/typebox": "^0.27.8"
},
@@ -827,11 +865,10 @@
}
},
"node_modules/@jest/source-map": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz",
- "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz",
+ "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.18",
"callsites": "^3.0.0",
@@ -842,14 +879,13 @@
}
},
"node_modules/@jest/test-result": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz",
- "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.0.tgz",
+ "integrity": "sha512-9qLb7xITeyWhM4yatn2muqfomuoCTOhv0QV9i7XiIyYi3QLfnvPv5NeJp5u0PZeutAOROMLKakOkmoAisOr3YQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@jest/console": "^29.7.0",
- "@jest/types": "^29.6.3",
+ "@jest/console": "^29.6.0",
+ "@jest/types": "^29.6.0",
"@types/istanbul-lib-coverage": "^2.0.0",
"collect-v8-coverage": "^1.0.0"
},
@@ -858,15 +894,14 @@
}
},
"node_modules/@jest/test-sequencer": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz",
- "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.0.tgz",
+ "integrity": "sha512-HYCS3LKRQotKWj2mnA3AN13PPevYZu8MJKm12lzYojpJNnn6kI/3PWmr1At/e3tUu+FHQDiOyaDVuR4EV3ezBw==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@jest/test-result": "^29.7.0",
+ "@jest/test-result": "^29.6.0",
"graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.7.0",
+ "jest-haste-map": "^29.6.0",
"slash": "^3.0.0"
},
"engines": {
@@ -874,23 +909,22 @@
}
},
"node_modules/@jest/transform": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz",
- "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.0.tgz",
+ "integrity": "sha512-bhP/KxPo3e322FJ0nKAcb6WVK76ZYyQd1lWygJzoSqP8SYMSLdxHqP4wnPTI4WvbB8PKPDV30y5y7Tya4RHOBA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@babel/core": "^7.11.6",
- "@jest/types": "^29.6.3",
+ "@jest/types": "^29.6.0",
"@jridgewell/trace-mapping": "^0.3.18",
"babel-plugin-istanbul": "^6.1.1",
"chalk": "^4.0.0",
"convert-source-map": "^2.0.0",
"fast-json-stable-stringify": "^2.1.0",
"graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.7.0",
- "jest-regex-util": "^29.6.3",
- "jest-util": "^29.7.0",
+ "jest-haste-map": "^29.6.0",
+ "jest-regex-util": "^29.4.3",
+ "jest-util": "^29.6.0",
"micromatch": "^4.0.4",
"pirates": "^4.0.4",
"slash": "^3.0.0",
@@ -901,13 +935,12 @@
}
},
"node_modules/@jest/types": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
- "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.0.tgz",
+ "integrity": "sha512-8XCgL9JhqbJTFnMRjEAO+TuW251+MoMd5BSzLiE3vvzpQ8RlBxy8NoyNkDhs3K3OL3HeVinlOl9or5p7GTeOLg==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@jest/schemas": "^29.6.3",
+ "@jest/schemas": "^29.6.0",
"@types/istanbul-lib-coverage": "^2.0.0",
"@types/istanbul-reports": "^3.0.0",
"@types/node": "*",
@@ -919,66 +952,66 @@
}
},
"node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.13",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
- "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+ "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@jridgewell/sourcemap-codec": "^1.5.0",
- "@jridgewell/trace-mapping": "^0.3.24"
- }
- },
- "node_modules/@jridgewell/remapping": {
- "version": "2.3.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
- "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.24"
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
}
},
"node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
- "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.5.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
- "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
- "dev": true,
- "license": "MIT"
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+ "dev": true
},
"node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.31",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
- "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "version": "0.3.18",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
+ "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
+ "@jridgewell/resolve-uri": "3.1.0",
+ "@jridgewell/sourcemap-codec": "1.4.14"
}
},
- "node_modules/@noble/hashes": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz",
- "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==",
+ "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+ "dev": true
+ },
+ "node_modules/@nicolo-ribaudo/semver-v6": {
+ "version": "6.3.3",
+ "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz",
+ "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==",
"dev": true,
- "license": "MIT",
- "engines": {
- "node": "^14.21.3 || >=16"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
+ "bin": {
+ "semver": "bin/semver.js"
}
},
"node_modules/@nodelib/fs.scandir": {
@@ -986,7 +1019,6 @@
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
"integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@nodelib/fs.stat": "2.0.5",
"run-parallel": "^1.1.9"
@@ -1000,7 +1032,6 @@
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
"integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">= 8"
}
@@ -1010,7 +1041,6 @@
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
"integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@nodelib/fs.scandir": "2.1.5",
"fastq": "^1.6.0"
@@ -1019,29 +1049,17 @@
"node": ">= 8"
}
},
- "node_modules/@paralleldrive/cuid2": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz",
- "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@noble/hashes": "^1.1.5"
- }
- },
"node_modules/@sinclair/typebox": {
"version": "0.27.8",
"resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
"integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/@sinonjs/commons": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz",
- "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz",
+ "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==",
"dev": true,
- "license": "BSD-3-Clause",
"dependencies": {
"type-detect": "4.0.8"
}
@@ -1051,27 +1069,15 @@
"resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
"integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
"dev": true,
- "license": "BSD-3-Clause",
"dependencies": {
"@sinonjs/commons": "^3.0.0"
}
},
- "node_modules/@so-ric/colorspace": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz",
- "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==",
- "license": "MIT",
- "dependencies": {
- "color": "^5.0.2",
- "text-hex": "1.0.x"
- }
- },
"node_modules/@types/babel__core": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
- "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "version": "7.20.1",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz",
+ "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@babel/parser": "^7.20.7",
"@babel/types": "^7.20.7",
@@ -1081,127 +1087,122 @@
}
},
"node_modules/@types/babel__generator": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
- "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
+ "version": "7.6.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz",
+ "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@babel/types": "^7.0.0"
}
},
"node_modules/@types/babel__template": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
- "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz",
+ "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@babel/parser": "^7.1.0",
"@babel/types": "^7.0.0"
}
},
"node_modules/@types/babel__traverse": {
- "version": "7.28.0",
- "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
- "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
+ "version": "7.20.1",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz",
+ "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@babel/types": "^7.28.2"
+ "@babel/types": "^7.20.7"
}
},
"node_modules/@types/graceful-fs": {
- "version": "4.1.9",
- "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
- "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==",
+ "version": "4.1.6",
+ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz",
+ "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/istanbul-lib-coverage": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
- "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
- "dev": true,
- "license": "MIT"
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
+ "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==",
+ "dev": true
},
"node_modules/@types/istanbul-lib-report": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
- "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+ "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@types/istanbul-lib-coverage": "*"
}
},
"node_modules/@types/istanbul-reports": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
- "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
+ "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@types/istanbul-lib-report": "*"
}
},
"node_modules/@types/node": {
- "version": "25.0.3",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.3.tgz",
- "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "undici-types": "~7.16.0"
- }
+ "version": "20.3.3",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.3.tgz",
+ "integrity": "sha512-wheIYdr4NYML61AjC8MKj/2jrR/kDQri/CIpVoZwldwhnIrD/j9jIU5bJ8yBKuB2VhpFV7Ab6G2XkBjv9r9Zzw==",
+ "dev": true
+ },
+ "node_modules/@types/prettier": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz",
+ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==",
+ "dev": true
},
"node_modules/@types/stack-utils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
- "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
- "dev": true,
- "license": "MIT"
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz",
+ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==",
+ "dev": true
},
"node_modules/@types/triple-beam": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz",
- "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==",
- "license": "MIT"
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.2.tgz",
+ "integrity": "sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g=="
},
"node_modules/@types/yargs": {
- "version": "17.0.35",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz",
- "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==",
+ "version": "17.0.24",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz",
+ "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@types/yargs-parser": "*"
}
},
"node_modules/@types/yargs-parser": {
- "version": "21.0.3",
- "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
- "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
- "dev": true,
- "license": "MIT"
+ "version": "21.0.0",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz",
+ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==",
+ "dev": true
},
"node_modules/@xmldom/xmldom": {
- "version": "0.9.8",
- "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.8.tgz",
- "integrity": "sha512-p96FSY54r+WJ50FIOsCOjyj/wavs8921hG5+kVMmZgKcvIKxMXHTrjNJvRgWa/zuX3B6t2lijLNFaOyuxUH+2A==",
- "license": "MIT",
+ "version": "0.8.10",
+ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
+ "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==",
"engines": {
- "node": ">=14.6"
+ "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==",
+ "dev": true
+ },
"node_modules/accepts": {
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
"integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
- "license": "MIT",
"dependencies": {
"mime-types": "~2.1.34",
"negotiator": "0.6.3"
@@ -1215,7 +1216,6 @@
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
"integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"debug": "4"
},
@@ -1224,13 +1224,12 @@
}
},
"node_modules/agent-base/node_modules/debug": {
- "version": "4.4.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
- "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "ms": "^2.1.3"
+ "ms": "2.1.2"
},
"engines": {
"node": ">=6.0"
@@ -1242,18 +1241,16 @@
}
},
"node_modules/agent-base/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true,
- "license": "MIT"
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
},
"node_modules/ansi-escapes": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
"integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"type-fest": "^0.21.3"
},
@@ -1269,7 +1266,6 @@
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -1278,8 +1274,6 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -1295,7 +1289,6 @@
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
"integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
"dev": true,
- "license": "ISC",
"dependencies": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
@@ -1309,7 +1302,6 @@
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
- "license": "MIT",
"dependencies": {
"sprintf-js": "~1.0.2"
}
@@ -1317,15 +1309,13 @@
"node_modules/array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
- "license": "MIT"
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
},
"node_modules/array-union": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
"integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -1334,53 +1324,47 @@
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
"integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/async": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
- "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
- "license": "MIT"
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
+ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
- "license": "MIT"
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"node_modules/at-least-node": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
"integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
"dev": true,
- "license": "ISC",
"engines": {
"node": ">= 4.0.0"
}
},
"node_modules/axios": {
- "version": "1.13.2",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz",
- "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==",
- "license": "MIT",
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz",
+ "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==",
"dependencies": {
"follow-redirects": "^1.15.6",
- "form-data": "^4.0.4",
+ "form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
},
"node_modules/babel-jest": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz",
- "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.0.tgz",
+ "integrity": "sha512-Jj8Bq2yKsk11XLk06Nm8SdvYkAcecH+GuhxB8DnK5SncjHnJ88TQjSnGgE7jpajpnSvz9DZ6X8hXrDkD/6/TPQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@jest/transform": "^29.7.0",
+ "@jest/transform": "^29.6.0",
"@types/babel__core": "^7.1.14",
"babel-plugin-istanbul": "^6.1.1",
- "babel-preset-jest": "^29.6.3",
+ "babel-preset-jest": "^29.5.0",
"chalk": "^4.0.0",
"graceful-fs": "^4.2.9",
"slash": "^3.0.0"
@@ -1397,7 +1381,6 @@
"resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
"integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
"dev": true,
- "license": "BSD-3-Clause",
"dependencies": {
"@babel/helper-plugin-utils": "^7.0.0",
"@istanbuljs/load-nyc-config": "^1.0.0",
@@ -1409,29 +1392,11 @@
"node": ">=8"
}
},
- "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
- "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "@babel/core": "^7.12.3",
- "@babel/parser": "^7.14.7",
- "@istanbuljs/schema": "^0.1.2",
- "istanbul-lib-coverage": "^3.2.0",
- "semver": "^6.3.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/babel-plugin-jest-hoist": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz",
- "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz",
+ "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@babel/template": "^7.3.3",
"@babel/types": "^7.3.3",
@@ -1443,40 +1408,35 @@
}
},
"node_modules/babel-preset-current-node-syntax": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz",
- "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
+ "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@babel/plugin-syntax-async-generators": "^7.8.4",
"@babel/plugin-syntax-bigint": "^7.8.3",
- "@babel/plugin-syntax-class-properties": "^7.12.13",
- "@babel/plugin-syntax-class-static-block": "^7.14.5",
- "@babel/plugin-syntax-import-attributes": "^7.24.7",
- "@babel/plugin-syntax-import-meta": "^7.10.4",
+ "@babel/plugin-syntax-class-properties": "^7.8.3",
+ "@babel/plugin-syntax-import-meta": "^7.8.3",
"@babel/plugin-syntax-json-strings": "^7.8.3",
- "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
"@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
- "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-numeric-separator": "^7.8.3",
"@babel/plugin-syntax-object-rest-spread": "^7.8.3",
"@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
"@babel/plugin-syntax-optional-chaining": "^7.8.3",
- "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
- "@babel/plugin-syntax-top-level-await": "^7.14.5"
+ "@babel/plugin-syntax-top-level-await": "^7.8.3"
},
"peerDependencies": {
- "@babel/core": "^7.0.0 || ^8.0.0-0"
+ "@babel/core": "^7.0.0"
}
},
"node_modules/babel-preset-jest": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz",
- "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz",
+ "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "babel-plugin-jest-hoist": "^29.6.3",
+ "babel-plugin-jest-hoist": "^29.5.0",
"babel-preset-current-node-syntax": "^1.0.0"
},
"engines": {
@@ -1489,8 +1449,7 @@
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "license": "MIT"
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
"node_modules/base64-js": {
"version": "1.5.1",
@@ -1510,30 +1469,15 @@
"type": "consulting",
"url": "https://feross.org/support"
}
- ],
- "license": "MIT"
- },
- "node_modules/baseline-browser-mapping": {
- "version": "2.9.10",
- "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.10.tgz",
- "integrity": "sha512-2VIKvDx8Z1a9rTB2eCkdPE5nSe28XnA+qivGnWHoB40hMMt/h1hSz0960Zqsn6ZyxWXUie0EBdElKv8may20AA==",
- "dev": true,
- "license": "Apache-2.0",
- "bin": {
- "baseline-browser-mapping": "dist/cli.js"
- }
+ ]
},
"node_modules/binary-extensions": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
- "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/bl": {
@@ -1541,46 +1485,29 @@
"resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
"integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
"dev": true,
- "license": "MIT",
"dependencies": {
"buffer": "^5.5.0",
"inherits": "^2.0.4",
"readable-stream": "^3.4.0"
}
},
- "node_modules/bl/node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/body-parser": {
- "version": "1.20.4",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz",
- "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==",
- "license": "MIT",
+ "version": "1.20.2",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
+ "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
"dependencies": {
- "bytes": "~3.1.2",
+ "bytes": "3.1.2",
"content-type": "~1.0.5",
"debug": "2.6.9",
"depd": "2.0.0",
- "destroy": "~1.2.0",
- "http-errors": "~2.0.1",
- "iconv-lite": "~0.4.24",
- "on-finished": "~2.4.1",
- "qs": "~6.14.0",
- "raw-body": "~2.5.3",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.11.0",
+ "raw-body": "2.5.2",
"type-is": "~1.6.18",
- "unpipe": "~1.0.0"
+ "unpipe": "1.0.0"
},
"engines": {
"node": ">= 0.8",
@@ -1588,31 +1515,30 @@
}
},
"node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
- "license": "MIT",
+ "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"
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
}
},
"node_modules/braces": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
- "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "fill-range": "^7.1.1"
+ "fill-range": "^7.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/browserslist": {
- "version": "4.28.1",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
- "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
+ "version": "4.21.9",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz",
+ "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==",
"dev": true,
"funding": [
{
@@ -1628,13 +1554,11 @@
"url": "https://github.com/sponsors/ai"
}
],
- "license": "MIT",
"dependencies": {
- "baseline-browser-mapping": "^2.9.0",
- "caniuse-lite": "^1.0.30001759",
- "electron-to-chromium": "^1.5.263",
- "node-releases": "^2.0.27",
- "update-browserslist-db": "^1.2.0"
+ "caniuse-lite": "^1.0.30001503",
+ "electron-to-chromium": "^1.4.431",
+ "node-releases": "^2.0.12",
+ "update-browserslist-db": "^1.0.11"
},
"bin": {
"browserslist": "cli.js"
@@ -1648,7 +1572,6 @@
"resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
"integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
"dev": true,
- "license": "Apache-2.0",
"dependencies": {
"node-int64": "^0.4.0"
}
@@ -1672,7 +1595,6 @@
"url": "https://feross.org/support"
}
],
- "license": "MIT",
"dependencies": {
"base64-js": "^1.3.1",
"ieee754": "^1.1.13"
@@ -1681,49 +1603,29 @@
"node_modules/buffer-equal-constant-time": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
- "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
- "license": "BSD-3-Clause"
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
},
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/bytes": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
- "license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
- "node_modules/call-bind-apply-helpers": {
+ "node_modules/call-bind": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
- "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
- "license": "MIT",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"dependencies": {
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/call-bound": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
- "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
- "license": "MIT",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.2",
- "get-intrinsic": "^1.3.0"
- },
- "engines": {
- "node": ">= 0.4"
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -1734,7 +1636,6 @@
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=6"
}
@@ -1744,15 +1645,14 @@
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001761",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz",
- "integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==",
+ "version": "1.0.30001512",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001512.tgz",
+ "integrity": "sha512-2S9nK0G/mE+jasCUsMPlARhRCts1ebcp2Ji8Y8PWi4NDE1iRdLCnEPHkEfeBrGC45L4isBx5ur3IQ6yTE2mRZw==",
"dev": true,
"funding": [
{
@@ -1767,15 +1667,12 @@
"type": "github",
"url": "https://github.com/sponsors/ai"
}
- ],
- "license": "CC-BY-4.0"
+ ]
},
"node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -1787,22 +1684,45 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
+ "node_modules/chalk/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/chalk/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/char-regex": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
"integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=10"
}
},
"node_modules/chokidar": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
- "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
"dev": true,
- "license": "MIT",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
"dependencies": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
@@ -1815,9 +1735,6 @@
"engines": {
"node": ">= 8.10.0"
},
- "funding": {
- "url": "https://paulmillr.com/funding/"
- },
"optionalDependencies": {
"fsevents": "~2.3.2"
}
@@ -1826,13 +1743,12 @@
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
- "dev": true,
- "license": "ISC"
+ "dev": true
},
"node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz",
+ "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==",
"dev": true,
"funding": [
{
@@ -1840,7 +1756,6 @@
"url": "https://github.com/sponsors/sibiraj-s"
}
],
- "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -1849,24 +1764,21 @@
"version": "0.0.11",
"resolved": "https://registry.npmjs.org/cjs/-/cjs-0.0.11.tgz",
"integrity": "sha512-aLndk8BnpIOy/ZxmLGCNTSFoLm0+OyZDtxNCV6jUBHBkLICanUAlkIGtnaQrCBMYTebOmWHNg8+vxtaYZ8LSfA==",
- "license": "BSD",
"dependencies": {
"sync-channel": "*"
}
},
"node_modules/cjs-module-lexer": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz",
- "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==",
- "dev": true,
- "license": "MIT"
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz",
+ "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==",
+ "dev": true
},
"node_modules/cliui": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
"dev": true,
- "license": "ISC",
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.1",
@@ -1881,38 +1793,30 @@
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
"integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
"dev": true,
- "license": "MIT",
"engines": {
"iojs": ">= 1.0.0",
"node": ">= 0.12.0"
}
},
"node_modules/collect-v8-coverage": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz",
- "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==",
- "dev": true,
- "license": "MIT"
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
+ "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==",
+ "dev": true
},
"node_modules/color": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz",
- "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==",
- "license": "MIT",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
+ "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
"dependencies": {
- "color-convert": "^3.1.3",
- "color-string": "^2.1.3"
- },
- "engines": {
- "node": ">=18"
+ "color-convert": "^1.9.3",
+ "color-string": "^1.6.0"
}
},
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
@@ -1923,57 +1827,43 @@
"node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true,
- "license": "MIT"
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"node_modules/color-string": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz",
- "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==",
- "license": "MIT",
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
"dependencies": {
- "color-name": "^2.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/color-string/node_modules/color-name": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz",
- "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==",
- "license": "MIT",
- "engines": {
- "node": ">=12.20"
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
}
},
"node_modules/color/node_modules/color-convert": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz",
- "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==",
- "license": "MIT",
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dependencies": {
- "color-name": "^2.0.0"
- },
- "engines": {
- "node": ">=14.6"
+ "color-name": "1.1.3"
}
},
"node_modules/color/node_modules/color-name": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz",
- "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==",
- "license": "MIT",
- "engines": {
- "node": ">=12.20"
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "node_modules/colorspace": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz",
+ "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==",
+ "dependencies": {
+ "color": "^3.1.3",
+ "text-hex": "1.0.x"
}
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "license": "MIT",
"dependencies": {
"delayed-stream": "~1.0.0"
},
@@ -1982,27 +1872,20 @@
}
},
"node_modules/component-emitter": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz",
- "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
+ "dev": true
},
"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,
- "license": "MIT"
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
},
"node_modules/content-disposition": {
"version": "0.5.4",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
"integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
- "license": "MIT",
"dependencies": {
"safe-buffer": "5.2.1"
},
@@ -2014,7 +1897,6 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
"integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
- "license": "MIT",
"engines": {
"node": ">= 0.6"
}
@@ -2023,66 +1905,38 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/cookie": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
- "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
- "license": "MIT",
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
+ "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/cookie-signature": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz",
- "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==",
- "license": "MIT"
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
},
"node_modules/cookiejar": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz",
"integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/core-util-is": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/create-jest": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz",
- "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^29.6.3",
- "chalk": "^4.0.0",
- "exit": "^0.1.2",
- "graceful-fs": "^4.2.9",
- "jest-config": "^29.7.0",
- "jest-util": "^29.7.0",
- "prompts": "^2.0.1"
- },
- "bin": {
- "create-jest": "bin/create-jest.js"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
+ "dev": true
},
"node_modules/cross-spawn": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
- "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
"dev": true,
- "license": "MIT",
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
@@ -2096,7 +1950,6 @@
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "license": "MIT",
"dependencies": {
"ms": "2.0.0"
}
@@ -2106,7 +1959,6 @@
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
"integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"mimic-response": "^3.1.0"
},
@@ -2118,26 +1970,16 @@
}
},
"node_modules/dedent": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz",
- "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "babel-plugin-macros": "^3.1.0"
- },
- "peerDependenciesMeta": {
- "babel-plugin-macros": {
- "optional": true
- }
- }
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
+ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
+ "dev": true
},
"node_modules/deep-extend": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=4.0.0"
}
@@ -2147,7 +1989,6 @@
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
"integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@@ -2156,7 +1997,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
- "license": "MIT",
"engines": {
"node": ">=0.4.0"
}
@@ -2165,7 +2005,6 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
- "license": "MIT",
"engines": {
"node": ">= 0.8"
}
@@ -2174,18 +2013,16 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
"integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
- "license": "MIT",
"engines": {
"node": ">= 0.8",
"npm": "1.2.8000 || >= 1.4.16"
}
},
"node_modules/detect-libc": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
- "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz",
+ "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==",
"dev": true,
- "license": "Apache-2.0",
"engines": {
"node": ">=8"
}
@@ -2195,7 +2032,6 @@
"resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
"integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -2205,18 +2041,16 @@
"resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz",
"integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==",
"dev": true,
- "license": "ISC",
"dependencies": {
"asap": "^2.0.0",
"wrappy": "1"
}
},
"node_modules/diff-sequences": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
- "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
+ "version": "29.4.3",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz",
+ "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==",
"dev": true,
- "license": "MIT",
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
@@ -2226,7 +2060,6 @@
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
"integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"path-type": "^4.0.0"
},
@@ -2235,48 +2068,31 @@
}
},
"node_modules/docxtemplater": {
- "version": "3.67.6",
- "resolved": "https://registry.npmjs.org/docxtemplater/-/docxtemplater-3.67.6.tgz",
- "integrity": "sha512-IvdTz9druTlQrsB0zlqvAqrImEydFgtvHp0uUnx+hQ9W4hmBsorrJIBJKCfkhK6QRz/jpJnA6BaTd6rEK6/Usw==",
- "license": "MIT",
+ "version": "3.46.1",
+ "resolved": "https://registry.npmjs.org/docxtemplater/-/docxtemplater-3.46.1.tgz",
+ "integrity": "sha512-n4nlNXb9GfUYe7REJD30qrKzWqpHFYZbnT43AzIwVZODA+M5InJhH7iI3rRNkintufZxwch04eTTyoSfR51b0Q==",
"dependencies": {
- "@xmldom/xmldom": "^0.9.8"
+ "@xmldom/xmldom": "^0.8.10"
},
"engines": {
"node": ">=0.10"
}
},
"node_modules/dotenv": {
- "version": "16.6.1",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz",
- "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==",
- "license": "BSD-2-Clause",
+ "version": "16.3.1",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz",
+ "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==",
"engines": {
"node": ">=12"
},
"funding": {
- "url": "https://dotenvx.com"
- }
- },
- "node_modules/dunder-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
- "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
- "license": "MIT",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.1",
- "es-errors": "^1.3.0",
- "gopd": "^1.2.0"
- },
- "engines": {
- "node": ">= 0.4"
+ "url": "https://github.com/motdotla/dotenv?sponsor=1"
}
},
"node_modules/ecdsa-sig-formatter": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
"integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
- "license": "Apache-2.0",
"dependencies": {
"safe-buffer": "^5.0.1"
}
@@ -2284,14 +2100,12 @@
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
- "license": "MIT"
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
},
"node_modules/ejs": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
- "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
- "license": "Apache-2.0",
+ "version": "3.1.9",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz",
+ "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==",
"dependencies": {
"jake": "^10.8.5"
},
@@ -2303,18 +2117,16 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.5.267",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz",
- "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==",
- "dev": true,
- "license": "ISC"
+ "version": "1.4.450",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.450.tgz",
+ "integrity": "sha512-BLG5HxSELlrMx7dJ2s+8SFlsCtJp37Zpk2VAxyC6CZtbc+9AJeZHfYHbrlSgdXp6saQ8StMqOTEDaBKgA7u1sw==",
+ "dev": true
},
"node_modules/emittery": {
"version": "0.13.1",
"resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz",
"integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=12"
},
@@ -2326,95 +2138,44 @@
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/enabled": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz",
- "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==",
- "license": "MIT"
+ "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ=="
},
"node_modules/encodeurl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
- "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
- "license": "MIT",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/end-of-stream": {
- "version": "1.4.5",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
- "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
"dev": true,
- "license": "MIT",
"dependencies": {
"once": "^1.4.0"
}
},
"node_modules/error-ex": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
- "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
"dev": true,
- "license": "MIT",
"dependencies": {
"is-arrayish": "^0.2.1"
}
},
- "node_modules/es-define-property": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
- "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-errors": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-object-atoms": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
- "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-set-tostringtag": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
- "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.6",
- "has-tostringtag": "^1.0.2",
- "hasown": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
"node_modules/escalade": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
- "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=6"
}
@@ -2422,15 +2183,13 @@
"node_modules/escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
- "license": "MIT"
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
},
"node_modules/escape-string-regexp": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
"integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -2440,7 +2199,6 @@
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"dev": true,
- "license": "BSD-2-Clause",
"bin": {
"esparse": "bin/esparse.js",
"esvalidate": "bin/esvalidate.js"
@@ -2453,7 +2211,6 @@
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
"integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
- "license": "MIT",
"engines": {
"node": ">= 0.6"
}
@@ -2463,7 +2220,6 @@
"resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
"integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
"dev": true,
- "license": "MIT",
"dependencies": {
"cross-spawn": "^7.0.3",
"get-stream": "^6.0.0",
@@ -2496,86 +2252,79 @@
"resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
"integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
"dev": true,
- "license": "(MIT OR WTFPL)",
"engines": {
"node": ">=6"
}
},
"node_modules/expect": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz",
- "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.0.tgz",
+ "integrity": "sha512-AV+HaBtnDJ2YEUhPPo25HyUHBLaetM+y/Dq6pEC8VPQyt1dK+k8MfGkMy46djy2bddcqESc1kl4/K1uLWSfk9g==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@jest/expect-utils": "^29.7.0",
- "jest-get-type": "^29.6.3",
- "jest-matcher-utils": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-util": "^29.7.0"
+ "@jest/expect-utils": "^29.6.0",
+ "@types/node": "*",
+ "jest-get-type": "^29.4.3",
+ "jest-matcher-utils": "^29.6.0",
+ "jest-message-util": "^29.6.0",
+ "jest-util": "^29.6.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/express": {
- "version": "4.22.1",
- "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz",
- "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==",
- "license": "MIT",
+ "version": "4.19.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
+ "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
- "body-parser": "~1.20.3",
- "content-disposition": "~0.5.4",
+ "body-parser": "1.20.2",
+ "content-disposition": "0.5.4",
"content-type": "~1.0.4",
- "cookie": "~0.7.1",
- "cookie-signature": "~1.0.6",
+ "cookie": "0.6.0",
+ "cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "2.0.0",
- "encodeurl": "~2.0.0",
+ "encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
- "finalhandler": "~1.3.1",
- "fresh": "~0.5.2",
- "http-errors": "~2.0.0",
- "merge-descriptors": "1.0.3",
+ "finalhandler": "1.2.0",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "merge-descriptors": "1.0.1",
"methods": "~1.1.2",
- "on-finished": "~2.4.1",
+ "on-finished": "2.4.1",
"parseurl": "~1.3.3",
- "path-to-regexp": "~0.1.12",
+ "path-to-regexp": "0.1.7",
"proxy-addr": "~2.0.7",
- "qs": "~6.14.0",
+ "qs": "6.11.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.2.1",
- "send": "~0.19.0",
- "serve-static": "~1.16.2",
+ "send": "0.18.0",
+ "serve-static": "1.15.0",
"setprototypeof": "1.2.0",
- "statuses": "~2.0.1",
+ "statuses": "2.0.1",
"type-is": "~1.6.18",
"utils-merge": "1.0.1",
"vary": "~1.1.2"
},
"engines": {
"node": ">= 0.10.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/express"
}
},
"node_modules/fast-glob": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
- "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
+ "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
"glob-parent": "^5.1.2",
"merge2": "^1.3.0",
- "micromatch": "^4.0.8"
+ "micromatch": "^4.0.4"
},
"engines": {
"node": ">=8.6.0"
@@ -2585,22 +2334,19 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/fast-safe-stringify": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
"integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/fastq": {
- "version": "1.19.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
- "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+ "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
"dev": true,
- "license": "ISC",
"dependencies": {
"reusify": "^1.0.4"
}
@@ -2610,7 +2356,6 @@
"resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
"integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
"dev": true,
- "license": "Apache-2.0",
"dependencies": {
"bser": "2.1.1"
}
@@ -2618,14 +2363,12 @@
"node_modules/fecha": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz",
- "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==",
- "license": "MIT"
+ "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw=="
},
"node_modules/file-stream-rotator": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.6.1.tgz",
"integrity": "sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==",
- "license": "MIT",
"dependencies": {
"moment": "^2.29.1"
}
@@ -2634,17 +2377,34 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
"integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
- "license": "Apache-2.0",
"dependencies": {
"minimatch": "^5.0.1"
}
},
+ "node_modules/filelist/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/filelist/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/fill-range": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
- "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"to-regex-range": "^5.0.1"
},
@@ -2653,17 +2413,16 @@
}
},
"node_modules/finalhandler": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz",
- "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==",
- "license": "MIT",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
+ "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
"dependencies": {
"debug": "2.6.9",
- "encodeurl": "~2.0.0",
+ "encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
- "on-finished": "~2.4.1",
+ "on-finished": "2.4.1",
"parseurl": "~1.3.3",
- "statuses": "~2.0.2",
+ "statuses": "2.0.1",
"unpipe": "~1.0.0"
},
"engines": {
@@ -2675,7 +2434,6 @@
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
@@ -2687,20 +2445,18 @@
"node_modules/fn.name": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
- "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==",
- "license": "MIT"
+ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="
},
"node_modules/follow-redirects": {
- "version": "1.15.11",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
- "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
+ "version": "1.15.6",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
+ "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
- "license": "MIT",
"engines": {
"node": ">=4.0"
},
@@ -2711,15 +2467,12 @@
}
},
"node_modules/form-data": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
- "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
- "license": "MIT",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
- "es-set-tostringtag": "^2.1.0",
- "hasown": "^2.0.2",
"mime-types": "^2.1.12"
},
"engines": {
@@ -2727,14 +2480,13 @@
}
},
"node_modules/formidable": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.5.tgz",
- "integrity": "sha512-Oz5Hwvwak/DCaXVVUtPn4oLMLLy1CdclLKO1LFgU7XzDpVMUU5UjlSLpGMocyQNNk8F6IJW9M/YdooSn2MRI+Q==",
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz",
+ "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@paralleldrive/cuid2": "^2.2.2",
"dezalgo": "^1.0.4",
+ "hexoid": "^1.0.0",
"once": "^1.4.0",
"qs": "^6.11.0"
},
@@ -2746,7 +2498,6 @@
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
"integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
- "license": "MIT",
"engines": {
"node": ">= 0.6"
}
@@ -2755,7 +2506,6 @@
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
- "license": "MIT",
"engines": {
"node": ">= 0.6"
}
@@ -2765,31 +2515,57 @@
"resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
"integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==",
"dev": true,
- "license": "MIT",
"dependencies": {
"inherits": "^2.0.1",
"readable-stream": "^2.0.0"
}
},
+ "node_modules/from2/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/from2/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "node_modules/from2/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
"node_modules/fs": {
"version": "0.0.1-security",
"resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz",
- "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==",
- "license": "ISC"
+ "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w=="
},
"node_modules/fs-constants": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/fs-extra": {
"version": "9.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
"integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"at-least-node": "^1.0.0",
"graceful-fs": "^4.2.0",
@@ -2804,16 +2580,14 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true,
- "license": "ISC"
+ "dev": true
},
"node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
"hasInstallScript": true,
- "license": "MIT",
"optional": true,
"os": [
"darwin"
@@ -2823,20 +2597,15 @@
}
},
"node_modules/function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
},
"node_modules/gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
"integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=6.9.0"
}
@@ -2846,30 +2615,19 @@
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"dev": true,
- "license": "ISC",
"engines": {
"node": "6.* || 8.* || >= 10.*"
}
},
"node_modules/get-intrinsic": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
- "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
- "license": "MIT",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
+ "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
"dependencies": {
- "call-bind-apply-helpers": "^1.0.2",
- "es-define-property": "^1.0.1",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.1.1",
- "function-bind": "^1.1.2",
- "get-proto": "^1.0.1",
- "gopd": "^1.2.0",
- "has-symbols": "^1.1.0",
- "hasown": "^2.0.2",
- "math-intrinsics": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -2880,30 +2638,15 @@
"resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
"integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=8.0.0"
}
},
- "node_modules/get-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
- "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
- "license": "MIT",
- "dependencies": {
- "dunder-proto": "^1.0.1",
- "es-object-atoms": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
"node_modules/get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
"integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=10"
},
@@ -2915,16 +2658,13 @@
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
"integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"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",
"dev": true,
- "license": "ISC",
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -2945,7 +2685,6 @@
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
- "license": "ISC",
"dependencies": {
"is-glob": "^4.0.1"
},
@@ -2953,28 +2692,13 @@
"node": ">= 6"
}
},
- "node_modules/glob/node_modules/brace-expansion": {
- "version": "1.1.12",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
- "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/glob/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
"engines": {
- "node": "*"
+ "node": ">=4"
}
},
"node_modules/globby": {
@@ -2982,7 +2706,6 @@
"resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
"integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
"dev": true,
- "license": "MIT",
"dependencies": {
"array-union": "^2.1.0",
"dir-glob": "^3.0.1",
@@ -2998,50 +2721,47 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/gopd": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
- "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/graceful-fs": {
"version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
- "dev": true,
- "license": "ISC"
+ "dev": true
},
"node_modules/has": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz",
- "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==",
- "dev": true,
- "license": "MIT",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"dev": true,
- "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=4"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+ "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-symbols": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
- "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
- "license": "MIT",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
"engines": {
"node": ">= 0.4"
},
@@ -3049,58 +2769,34 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/has-tostringtag": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
- "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
- "license": "MIT",
- "dependencies": {
- "has-symbols": "^1.0.3"
- },
+ "node_modules/hexoid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz",
+ "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==",
+ "dev": true,
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
- "license": "MIT",
- "dependencies": {
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
+ "node": ">=8"
}
},
"node_modules/html-escaper": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
"integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/http-errors": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
- "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
- "license": "MIT",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
"dependencies": {
- "depd": "~2.0.0",
- "inherits": "~2.0.4",
- "setprototypeof": "~1.2.0",
- "statuses": "~2.0.2",
- "toidentifier": "~1.0.1"
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
},
"engines": {
"node": ">= 0.8"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/express"
}
},
"node_modules/https-proxy-agent": {
@@ -3108,7 +2804,6 @@
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
"integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"agent-base": "6",
"debug": "4"
@@ -3118,13 +2813,12 @@
}
},
"node_modules/https-proxy-agent/node_modules/debug": {
- "version": "4.4.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
- "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "ms": "^2.1.3"
+ "ms": "2.1.2"
},
"engines": {
"node": ">=6.0"
@@ -3136,18 +2830,16 @@
}
},
"node_modules/https-proxy-agent/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true,
- "license": "MIT"
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
},
"node_modules/human-signals": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
"integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
"dev": true,
- "license": "Apache-2.0",
"engines": {
"node": ">=10.17.0"
}
@@ -3156,7 +2848,6 @@
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "license": "MIT",
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3"
},
@@ -3182,15 +2873,13 @@
"type": "consulting",
"url": "https://feross.org/support"
}
- ],
- "license": "BSD-3-Clause"
+ ]
},
"node_modules/ignore": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
- "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">= 4"
}
@@ -3199,15 +2888,13 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
"integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",
- "dev": true,
- "license": "ISC"
+ "dev": true
},
"node_modules/import-local": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz",
- "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
+ "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
"dev": true,
- "license": "MIT",
"dependencies": {
"pkg-dir": "^4.2.0",
"resolve-cwd": "^3.0.0"
@@ -3227,7 +2914,6 @@
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=0.8.19"
}
@@ -3236,9 +2922,7 @@
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
"dev": true,
- "license": "ISC",
"dependencies": {
"once": "^1.3.0",
"wrappy": "1"
@@ -3247,22 +2931,19 @@
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "license": "ISC"
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"node_modules/ini": {
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
- "dev": true,
- "license": "ISC"
+ "dev": true
},
"node_modules/into-stream": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz",
"integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"from2": "^2.3.0",
"p-is-promise": "^3.0.0"
@@ -3278,7 +2959,6 @@
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
- "license": "MIT",
"engines": {
"node": ">= 0.10"
}
@@ -3287,15 +2967,13 @@
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
"integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"binary-extensions": "^2.0.0"
},
@@ -3304,11 +2982,10 @@
}
},
"node_modules/is-core-module": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
- "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz",
+ "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==",
"dev": true,
- "license": "MIT",
"dependencies": {
"has": "^1.0.3"
},
@@ -3321,7 +2998,6 @@
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@@ -3331,7 +3007,6 @@
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -3341,7 +3016,6 @@
"resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
"integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=6"
}
@@ -3351,7 +3025,6 @@
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
- "license": "MIT",
"dependencies": {
"is-extglob": "^2.1.1"
},
@@ -3364,7 +3037,6 @@
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=0.12.0"
}
@@ -3373,7 +3045,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
- "license": "MIT",
"engines": {
"node": ">=8"
},
@@ -3385,69 +3056,81 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true,
- "license": "ISC"
+ "dev": true
},
"node_modules/istanbul-lib-coverage": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
- "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
+ "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
"dev": true,
- "license": "BSD-3-Clause",
"engines": {
"node": ">=8"
}
},
"node_modules/istanbul-lib-instrument": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz",
- "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==",
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
+ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
"dev": true,
- "license": "BSD-3-Clause",
"dependencies": {
- "@babel/core": "^7.23.9",
- "@babel/parser": "^7.23.9",
- "@istanbuljs/schema": "^0.1.3",
+ "@babel/core": "^7.12.3",
+ "@babel/parser": "^7.14.7",
+ "@istanbuljs/schema": "^0.1.2",
"istanbul-lib-coverage": "^3.2.0",
- "semver": "^7.5.4"
+ "semver": "^6.3.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=8"
}
},
"node_modules/istanbul-lib-instrument/node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true,
- "license": "ISC",
"bin": {
"semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
}
},
"node_modules/istanbul-lib-report": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
- "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+ "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
"dev": true,
- "license": "BSD-3-Clause",
"dependencies": {
"istanbul-lib-coverage": "^3.0.0",
- "make-dir": "^4.0.0",
+ "make-dir": "^3.0.0",
"supports-color": "^7.1.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
"node_modules/istanbul-lib-source-maps": {
@@ -3455,7 +3138,6 @@
"resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
"integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
"dev": true,
- "license": "BSD-3-Clause",
"dependencies": {
"debug": "^4.1.1",
"istanbul-lib-coverage": "^3.0.0",
@@ -3466,13 +3148,12 @@
}
},
"node_modules/istanbul-lib-source-maps/node_modules/debug": {
- "version": "4.4.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
- "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "ms": "^2.1.3"
+ "ms": "2.1.2"
},
"engines": {
"node": ">=6.0"
@@ -3484,18 +3165,16 @@
}
},
"node_modules/istanbul-lib-source-maps/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true,
- "license": "MIT"
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
},
"node_modules/istanbul-reports": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz",
- "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==",
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz",
+ "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==",
"dev": true,
- "license": "BSD-3-Clause",
"dependencies": {
"html-escaper": "^2.0.0",
"istanbul-lib-report": "^3.0.0"
@@ -3505,14 +3184,14 @@
}
},
"node_modules/jake": {
- "version": "10.9.4",
- "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz",
- "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==",
- "license": "Apache-2.0",
+ "version": "10.8.7",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz",
+ "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==",
"dependencies": {
- "async": "^3.2.6",
+ "async": "^3.2.3",
+ "chalk": "^4.0.2",
"filelist": "^1.0.4",
- "picocolors": "^1.1.1"
+ "minimatch": "^3.1.2"
},
"bin": {
"jake": "bin/cli.js"
@@ -3522,16 +3201,15 @@
}
},
"node_modules/jest": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz",
- "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.0.tgz",
+ "integrity": "sha512-do1J9gGrQ68E4UfMz/4OM71p9qCqQxu32N/9ZfeYFSSlx0uUOuxeyZxtJZNaUTW12ZA11ERhmBjBhy1Ho96R4g==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@jest/core": "^29.7.0",
- "@jest/types": "^29.6.3",
+ "@jest/core": "^29.6.0",
+ "@jest/types": "^29.6.0",
"import-local": "^3.0.2",
- "jest-cli": "^29.7.0"
+ "jest-cli": "^29.6.0"
},
"bin": {
"jest": "bin/jest.js"
@@ -3549,14 +3227,12 @@
}
},
"node_modules/jest-changed-files": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz",
- "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz",
+ "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==",
"dev": true,
- "license": "MIT",
"dependencies": {
"execa": "^5.0.0",
- "jest-util": "^29.7.0",
"p-limit": "^3.1.0"
},
"engines": {
@@ -3564,29 +3240,28 @@
}
},
"node_modules/jest-circus": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz",
- "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.0.tgz",
+ "integrity": "sha512-LtG45qEKhse2Ws5zNR4DnZATReLGQXzBZGZnJ0DU37p6d4wDhu41vvczCQ3Ou+llR6CRYDBshsubV7H4jZvIkw==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@jest/environment": "^29.7.0",
- "@jest/expect": "^29.7.0",
- "@jest/test-result": "^29.7.0",
- "@jest/types": "^29.6.3",
+ "@jest/environment": "^29.6.0",
+ "@jest/expect": "^29.6.0",
+ "@jest/test-result": "^29.6.0",
+ "@jest/types": "^29.6.0",
"@types/node": "*",
"chalk": "^4.0.0",
"co": "^4.6.0",
- "dedent": "^1.0.0",
+ "dedent": "^0.7.0",
"is-generator-fn": "^2.0.0",
- "jest-each": "^29.7.0",
- "jest-matcher-utils": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-runtime": "^29.7.0",
- "jest-snapshot": "^29.7.0",
- "jest-util": "^29.7.0",
+ "jest-each": "^29.6.0",
+ "jest-matcher-utils": "^29.6.0",
+ "jest-message-util": "^29.6.0",
+ "jest-runtime": "^29.6.0",
+ "jest-snapshot": "^29.6.0",
+ "jest-util": "^29.6.0",
"p-limit": "^3.1.0",
- "pretty-format": "^29.7.0",
+ "pretty-format": "^29.6.0",
"pure-rand": "^6.0.0",
"slash": "^3.0.0",
"stack-utils": "^2.0.3"
@@ -3596,22 +3271,22 @@
}
},
"node_modules/jest-cli": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz",
- "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.0.tgz",
+ "integrity": "sha512-WvZIaanK/abkw6s01924DQ2QLwM5Q4Y4iPbSDb9Zg6smyXGqqcPQ7ft9X8D7B0jICz312eSzM6UlQNxuZJBrMw==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@jest/core": "^29.7.0",
- "@jest/test-result": "^29.7.0",
- "@jest/types": "^29.6.3",
+ "@jest/core": "^29.6.0",
+ "@jest/test-result": "^29.6.0",
+ "@jest/types": "^29.6.0",
"chalk": "^4.0.0",
- "create-jest": "^29.7.0",
"exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
"import-local": "^3.0.2",
- "jest-config": "^29.7.0",
- "jest-util": "^29.7.0",
- "jest-validate": "^29.7.0",
+ "jest-config": "^29.6.0",
+ "jest-util": "^29.6.0",
+ "jest-validate": "^29.6.0",
+ "prompts": "^2.0.1",
"yargs": "^17.3.1"
},
"bin": {
@@ -3630,32 +3305,31 @@
}
},
"node_modules/jest-config": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz",
- "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.0.tgz",
+ "integrity": "sha512-fKA4jM91PDqWVkMpb1FVKxIuhg3hC6hgaen57cr1rRZkR96dCatvJZsk3ik7/GNu9ERj9wgAspOmyvkFoGsZhA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@babel/core": "^7.11.6",
- "@jest/test-sequencer": "^29.7.0",
- "@jest/types": "^29.6.3",
- "babel-jest": "^29.7.0",
+ "@jest/test-sequencer": "^29.6.0",
+ "@jest/types": "^29.6.0",
+ "babel-jest": "^29.6.0",
"chalk": "^4.0.0",
"ci-info": "^3.2.0",
"deepmerge": "^4.2.2",
"glob": "^7.1.3",
"graceful-fs": "^4.2.9",
- "jest-circus": "^29.7.0",
- "jest-environment-node": "^29.7.0",
- "jest-get-type": "^29.6.3",
- "jest-regex-util": "^29.6.3",
- "jest-resolve": "^29.7.0",
- "jest-runner": "^29.7.0",
- "jest-util": "^29.7.0",
- "jest-validate": "^29.7.0",
+ "jest-circus": "^29.6.0",
+ "jest-environment-node": "^29.6.0",
+ "jest-get-type": "^29.4.3",
+ "jest-regex-util": "^29.4.3",
+ "jest-resolve": "^29.6.0",
+ "jest-runner": "^29.6.0",
+ "jest-util": "^29.6.0",
+ "jest-validate": "^29.6.0",
"micromatch": "^4.0.4",
"parse-json": "^5.2.0",
- "pretty-format": "^29.7.0",
+ "pretty-format": "^29.6.0",
"slash": "^3.0.0",
"strip-json-comments": "^3.1.1"
},
@@ -3676,27 +3350,25 @@
}
},
"node_modules/jest-diff": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz",
- "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.0.tgz",
+ "integrity": "sha512-ZRm7cd2m9YyZ0N3iMyuo1iUiprxQ/MFpYWXzEEj7hjzL3WnDffKW8192XBDcrAI8j7hnrM1wed3bL/oEnYF/8w==",
"dev": true,
- "license": "MIT",
"dependencies": {
"chalk": "^4.0.0",
- "diff-sequences": "^29.6.3",
- "jest-get-type": "^29.6.3",
- "pretty-format": "^29.7.0"
+ "diff-sequences": "^29.4.3",
+ "jest-get-type": "^29.4.3",
+ "pretty-format": "^29.6.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-docblock": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz",
- "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==",
+ "version": "29.4.3",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz",
+ "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==",
"dev": true,
- "license": "MIT",
"dependencies": {
"detect-newline": "^3.0.0"
},
@@ -3705,66 +3377,62 @@
}
},
"node_modules/jest-each": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz",
- "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.0.tgz",
+ "integrity": "sha512-d0Jem4RBAlFUyV6JSXPSHVUpNo5RleSj+iJEy1G3+ZCrzHDjWs/1jUfrbnJKHdJdAx5BCEce/Ju379WqHhQk4w==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@jest/types": "^29.6.3",
+ "@jest/types": "^29.6.0",
"chalk": "^4.0.0",
- "jest-get-type": "^29.6.3",
- "jest-util": "^29.7.0",
- "pretty-format": "^29.7.0"
+ "jest-get-type": "^29.4.3",
+ "jest-util": "^29.6.0",
+ "pretty-format": "^29.6.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-environment-node": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz",
- "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.0.tgz",
+ "integrity": "sha512-BOf5Q2/nFCdBOnyBM5c5/6DbdQYgc+0gyUQ8l8qhUAB8O7pM+4QJXIXJsRZJaxd5SHV6y5VArTVhOfogoqcP8Q==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@jest/environment": "^29.7.0",
- "@jest/fake-timers": "^29.7.0",
- "@jest/types": "^29.6.3",
+ "@jest/environment": "^29.6.0",
+ "@jest/fake-timers": "^29.6.0",
+ "@jest/types": "^29.6.0",
"@types/node": "*",
- "jest-mock": "^29.7.0",
- "jest-util": "^29.7.0"
+ "jest-mock": "^29.6.0",
+ "jest-util": "^29.6.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-get-type": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
- "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
+ "version": "29.4.3",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz",
+ "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==",
"dev": true,
- "license": "MIT",
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-haste-map": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz",
- "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.0.tgz",
+ "integrity": "sha512-dY1DKufptj7hcJSuhpqlYPGcnN3XjlOy/g0jinpRTMsbb40ivZHiuIPzeminOZkrek8C+oDxC54ILGO3vMLojg==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@jest/types": "^29.6.3",
+ "@jest/types": "^29.6.0",
"@types/graceful-fs": "^4.1.3",
"@types/node": "*",
"anymatch": "^3.0.3",
"fb-watchman": "^2.0.0",
"graceful-fs": "^4.2.9",
- "jest-regex-util": "^29.6.3",
- "jest-util": "^29.7.0",
- "jest-worker": "^29.7.0",
+ "jest-regex-util": "^29.4.3",
+ "jest-util": "^29.6.0",
+ "jest-worker": "^29.6.0",
"micromatch": "^4.0.4",
"walker": "^1.0.8"
},
@@ -3776,49 +3444,46 @@
}
},
"node_modules/jest-leak-detector": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz",
- "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.0.tgz",
+ "integrity": "sha512-JdV6EZOPxHR1gd6ccxjNowuROkT2jtGU5G/g58RcJX1xe5mrtLj0g6/ZkyMoXF4cs+tTkHMFX6pcIrB1QPQwCw==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "jest-get-type": "^29.6.3",
- "pretty-format": "^29.7.0"
+ "jest-get-type": "^29.4.3",
+ "pretty-format": "^29.6.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-matcher-utils": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz",
- "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.0.tgz",
+ "integrity": "sha512-oSlqfGN+sbkB2Q5um/zL7z80w84FEAcLKzXBZIPyRk2F2Srg1ubhrHVKW68JCvb2+xKzAeGw35b+6gciS24PHw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"chalk": "^4.0.0",
- "jest-diff": "^29.7.0",
- "jest-get-type": "^29.6.3",
- "pretty-format": "^29.7.0"
+ "jest-diff": "^29.6.0",
+ "jest-get-type": "^29.4.3",
+ "pretty-format": "^29.6.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-message-util": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz",
- "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.0.tgz",
+ "integrity": "sha512-mkCp56cETbpoNtsaeWVy6SKzk228mMi9FPHSObaRIhbR2Ujw9PqjW/yqVHD2tN1bHbC8ol6h3UEo7dOPmIYwIA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.12.13",
- "@jest/types": "^29.6.3",
+ "@jest/types": "^29.6.0",
"@types/stack-utils": "^2.0.0",
"chalk": "^4.0.0",
"graceful-fs": "^4.2.9",
"micromatch": "^4.0.4",
- "pretty-format": "^29.7.0",
+ "pretty-format": "^29.6.0",
"slash": "^3.0.0",
"stack-utils": "^2.0.3"
},
@@ -3827,15 +3492,14 @@
}
},
"node_modules/jest-mock": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
- "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.0.tgz",
+ "integrity": "sha512-2Pb7R2w24Q0aUVn+2/vdRDL6CqGqpheDZy7zrXav8FotOpSGw/4bS2hyVoKHMEx4xzOn6EyCAGwc5czWxXeN7w==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@jest/types": "^29.6.3",
+ "@jest/types": "^29.6.0",
"@types/node": "*",
- "jest-util": "^29.7.0"
+ "jest-util": "^29.6.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -3846,7 +3510,6 @@
"resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
"integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=6"
},
@@ -3860,28 +3523,26 @@
}
},
"node_modules/jest-regex-util": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz",
- "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==",
+ "version": "29.4.3",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz",
+ "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==",
"dev": true,
- "license": "MIT",
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-resolve": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz",
- "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.0.tgz",
+ "integrity": "sha512-+hrpY4LzAONoZA/rvB6rnZLkOSA6UgJLpdCWrOZNSgGxWMumzRLu7dLUSCabAHzoHIDQ9qXfr3th1zYNJ0E8sQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"chalk": "^4.0.0",
"graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.7.0",
+ "jest-haste-map": "^29.6.0",
"jest-pnp-resolver": "^1.2.2",
- "jest-util": "^29.7.0",
- "jest-validate": "^29.7.0",
+ "jest-util": "^29.6.0",
+ "jest-validate": "^29.6.0",
"resolve": "^1.20.0",
"resolve.exports": "^2.0.0",
"slash": "^3.0.0"
@@ -3891,45 +3552,43 @@
}
},
"node_modules/jest-resolve-dependencies": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz",
- "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.0.tgz",
+ "integrity": "sha512-eOfPog9K3hJdJk/3i6O6bQhXS+3uXhMDkLJGX+xmMPp7T1d/zdcFofbDnHgNoEkhD/mSimC5IagLEP7lpLLu/A==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "jest-regex-util": "^29.6.3",
- "jest-snapshot": "^29.7.0"
+ "jest-regex-util": "^29.4.3",
+ "jest-snapshot": "^29.6.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-runner": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz",
- "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.0.tgz",
+ "integrity": "sha512-4fZuGV2lOxS2BiqEG9/AI8E6O+jo+QZjMVcgi1x5E6aDql0Gd/EFIbUQ0pSS09y8cya1vJB/qC2xsE468jqtSg==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@jest/console": "^29.7.0",
- "@jest/environment": "^29.7.0",
- "@jest/test-result": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
+ "@jest/console": "^29.6.0",
+ "@jest/environment": "^29.6.0",
+ "@jest/test-result": "^29.6.0",
+ "@jest/transform": "^29.6.0",
+ "@jest/types": "^29.6.0",
"@types/node": "*",
"chalk": "^4.0.0",
"emittery": "^0.13.1",
"graceful-fs": "^4.2.9",
- "jest-docblock": "^29.7.0",
- "jest-environment-node": "^29.7.0",
- "jest-haste-map": "^29.7.0",
- "jest-leak-detector": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-resolve": "^29.7.0",
- "jest-runtime": "^29.7.0",
- "jest-util": "^29.7.0",
- "jest-watcher": "^29.7.0",
- "jest-worker": "^29.7.0",
+ "jest-docblock": "^29.4.3",
+ "jest-environment-node": "^29.6.0",
+ "jest-haste-map": "^29.6.0",
+ "jest-leak-detector": "^29.6.0",
+ "jest-message-util": "^29.6.0",
+ "jest-resolve": "^29.6.0",
+ "jest-runtime": "^29.6.0",
+ "jest-util": "^29.6.0",
+ "jest-watcher": "^29.6.0",
+ "jest-worker": "^29.6.0",
"p-limit": "^3.1.0",
"source-map-support": "0.5.13"
},
@@ -3938,32 +3597,31 @@
}
},
"node_modules/jest-runtime": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz",
- "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.0.tgz",
+ "integrity": "sha512-5FavYo3EeXLHIvnJf+r7Cj0buePAbe4mzRB9oeVxDS0uVmouSBjWeGgyRjZkw7ArxOoZI8gO6f8SGMJ2HFlwwg==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@jest/environment": "^29.7.0",
- "@jest/fake-timers": "^29.7.0",
- "@jest/globals": "^29.7.0",
- "@jest/source-map": "^29.6.3",
- "@jest/test-result": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
+ "@jest/environment": "^29.6.0",
+ "@jest/fake-timers": "^29.6.0",
+ "@jest/globals": "^29.6.0",
+ "@jest/source-map": "^29.6.0",
+ "@jest/test-result": "^29.6.0",
+ "@jest/transform": "^29.6.0",
+ "@jest/types": "^29.6.0",
"@types/node": "*",
"chalk": "^4.0.0",
"cjs-module-lexer": "^1.0.0",
"collect-v8-coverage": "^1.0.0",
"glob": "^7.1.3",
"graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-mock": "^29.7.0",
- "jest-regex-util": "^29.6.3",
- "jest-resolve": "^29.7.0",
- "jest-snapshot": "^29.7.0",
- "jest-util": "^29.7.0",
+ "jest-haste-map": "^29.6.0",
+ "jest-message-util": "^29.6.0",
+ "jest-mock": "^29.6.0",
+ "jest-regex-util": "^29.4.3",
+ "jest-resolve": "^29.6.0",
+ "jest-snapshot": "^29.6.0",
+ "jest-util": "^29.6.0",
"slash": "^3.0.0",
"strip-bom": "^4.0.0"
},
@@ -3972,43 +3630,57 @@
}
},
"node_modules/jest-snapshot": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz",
- "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.0.tgz",
+ "integrity": "sha512-H3kUE9NwWDEDoutcOSS921IqdlkdjgnMdj1oMyxAHNflscdLc9dB8OudZHV6kj4OHJxbMxL8CdI5DlwYrs4wQg==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@babel/core": "^7.11.6",
"@babel/generator": "^7.7.2",
"@babel/plugin-syntax-jsx": "^7.7.2",
"@babel/plugin-syntax-typescript": "^7.7.2",
"@babel/types": "^7.3.3",
- "@jest/expect-utils": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
+ "@jest/expect-utils": "^29.6.0",
+ "@jest/transform": "^29.6.0",
+ "@jest/types": "^29.6.0",
+ "@types/prettier": "^2.1.5",
"babel-preset-current-node-syntax": "^1.0.0",
"chalk": "^4.0.0",
- "expect": "^29.7.0",
+ "expect": "^29.6.0",
"graceful-fs": "^4.2.9",
- "jest-diff": "^29.7.0",
- "jest-get-type": "^29.6.3",
- "jest-matcher-utils": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-util": "^29.7.0",
+ "jest-diff": "^29.6.0",
+ "jest-get-type": "^29.4.3",
+ "jest-matcher-utils": "^29.6.0",
+ "jest-message-util": "^29.6.0",
+ "jest-util": "^29.6.0",
"natural-compare": "^1.4.0",
- "pretty-format": "^29.7.0",
+ "pretty-format": "^29.6.0",
"semver": "^7.5.3"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/jest-snapshot/node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "node_modules/jest-snapshot/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dev": true,
- "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/semver": {
+ "version": "7.5.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz",
+ "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
"bin": {
"semver": "bin/semver.js"
},
@@ -4016,14 +3688,19 @@
"node": ">=10"
}
},
+ "node_modules/jest-snapshot/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
"node_modules/jest-util": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
- "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.0.tgz",
+ "integrity": "sha512-S0USx9YwcvEm4pQ5suisVm/RVxBmi0GFR7ocJhIeaCuW5AXnAnffXbaVKvIFodyZNOc9ygzVtTxmBf40HsHXaA==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@jest/types": "^29.6.3",
+ "@jest/types": "^29.6.0",
"@types/node": "*",
"chalk": "^4.0.0",
"ci-info": "^3.2.0",
@@ -4035,18 +3712,17 @@
}
},
"node_modules/jest-validate": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz",
- "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.0.tgz",
+ "integrity": "sha512-MLTrAJsb1+W7svbeZ+A7pAnyXMaQrjvPDKCy7OlfsfB6TMVc69v7WjUWfiR6r3snULFWZASiKgvNVDuATta1dg==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@jest/types": "^29.6.3",
+ "@jest/types": "^29.6.0",
"camelcase": "^6.2.0",
"chalk": "^4.0.0",
- "jest-get-type": "^29.6.3",
+ "jest-get-type": "^29.4.3",
"leven": "^3.1.0",
- "pretty-format": "^29.7.0"
+ "pretty-format": "^29.6.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -4057,7 +3733,6 @@
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
"integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=10"
},
@@ -4066,19 +3741,18 @@
}
},
"node_modules/jest-watcher": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz",
- "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.0.tgz",
+ "integrity": "sha512-LdsQqFNX60mRdRRe+zsELnYRH1yX6KL+ukbh+u6WSQeTheZZe1TlLJNKRQiZ7e0VbvMkywmMWL/KV35noOJCcw==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@jest/test-result": "^29.7.0",
- "@jest/types": "^29.6.3",
+ "@jest/test-result": "^29.6.0",
+ "@jest/types": "^29.6.0",
"@types/node": "*",
"ansi-escapes": "^4.2.1",
"chalk": "^4.0.0",
"emittery": "^0.13.1",
- "jest-util": "^29.7.0",
+ "jest-util": "^29.6.0",
"string-length": "^4.0.1"
},
"engines": {
@@ -4086,14 +3760,13 @@
}
},
"node_modules/jest-worker": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
- "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.0.tgz",
+ "integrity": "sha512-oiQHH1SnKmZIwwPnpOrXTq4kHBk3lKGY/07DpnH0sAu+x7J8rXlbLDROZsU6vy9GwB0hPiZeZpu6YlJ48QoKcA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@types/node": "*",
- "jest-util": "^29.7.0",
+ "jest-util": "^29.6.0",
"merge-stream": "^2.0.0",
"supports-color": "^8.0.0"
},
@@ -4101,12 +3774,20 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
+ "node_modules/jest-worker/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/jest-worker/node_modules/supports-color": {
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
"dev": true,
- "license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -4121,15 +3802,13 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/js-yaml": {
- "version": "3.14.2",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
- "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==",
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"dev": true,
- "license": "MIT",
"dependencies": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
@@ -4139,31 +3818,28 @@
}
},
"node_modules/jsesc": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
- "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
"dev": true,
- "license": "MIT",
"bin": {
"jsesc": "bin/jsesc"
},
"engines": {
- "node": ">=6"
+ "node": ">=4"
}
},
"node_modules/json-parse-even-better-errors": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
"dev": true,
- "license": "MIT",
"bin": {
"json5": "lib/cli.js"
},
@@ -4172,11 +3848,10 @@
}
},
"node_modules/jsonfile": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
- "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"universalify": "^2.0.0"
},
@@ -4185,38 +3860,43 @@
}
},
"node_modules/jsonwebtoken": {
- "version": "9.0.3",
- "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz",
- "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==",
- "license": "MIT",
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz",
+ "integrity": "sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg==",
"dependencies": {
- "jws": "^4.0.1",
- "lodash.includes": "^4.3.0",
- "lodash.isboolean": "^3.0.3",
- "lodash.isinteger": "^4.0.4",
- "lodash.isnumber": "^3.0.3",
- "lodash.isplainobject": "^4.0.6",
- "lodash.isstring": "^4.0.1",
- "lodash.once": "^4.0.0",
+ "jws": "^3.2.2",
+ "lodash": "^4.17.21",
"ms": "^2.1.1",
- "semver": "^7.5.4"
+ "semver": "^7.3.8"
},
"engines": {
"node": ">=12",
"npm": ">=6"
}
},
+ "node_modules/jsonwebtoken/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/jsonwebtoken/node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
"node_modules/jsonwebtoken/node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
- "license": "ISC",
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
"bin": {
"semver": "bin/semver.js"
},
@@ -4224,24 +3904,27 @@
"node": ">=10"
}
},
+ "node_modules/jsonwebtoken/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ },
"node_modules/jwa": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz",
- "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==",
- "license": "MIT",
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+ "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
"dependencies": {
- "buffer-equal-constant-time": "^1.0.1",
+ "buffer-equal-constant-time": "1.0.1",
"ecdsa-sig-formatter": "1.0.11",
"safe-buffer": "^5.0.1"
}
},
"node_modules/jws": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz",
- "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==",
- "license": "MIT",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+ "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
"dependencies": {
- "jwa": "^2.0.1",
+ "jwa": "^1.4.1",
"safe-buffer": "^5.0.1"
}
},
@@ -4250,7 +3933,6 @@
"resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
"integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=6"
}
@@ -4258,15 +3940,13 @@
"node_modules/kuler": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
- "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==",
- "license": "MIT"
+ "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A=="
},
"node_modules/leven": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
"integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=6"
}
@@ -4275,15 +3955,13 @@
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
- "license": "MIT",
"dependencies": {
"p-locate": "^4.1.0"
},
@@ -4291,108 +3969,60 @@
"node": ">=8"
}
},
- "node_modules/lodash.includes": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
- "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==",
- "license": "MIT"
- },
- "node_modules/lodash.isboolean": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
- "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==",
- "license": "MIT"
- },
- "node_modules/lodash.isinteger": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
- "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==",
- "license": "MIT"
- },
- "node_modules/lodash.isnumber": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
- "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==",
- "license": "MIT"
- },
- "node_modules/lodash.isplainobject": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
- "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
- "license": "MIT"
- },
- "node_modules/lodash.isstring": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
- "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
- "license": "MIT"
- },
- "node_modules/lodash.once": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
- "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
- "license": "MIT"
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"node_modules/logform": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz",
- "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==",
- "license": "MIT",
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz",
+ "integrity": "sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==",
"dependencies": {
- "@colors/colors": "1.6.0",
+ "@colors/colors": "1.5.0",
"@types/triple-beam": "^1.3.2",
"fecha": "^4.2.0",
"ms": "^2.1.1",
"safe-stable-stringify": "^2.3.1",
"triple-beam": "^1.3.0"
- },
- "engines": {
- "node": ">= 12.0.0"
}
},
"node_modules/logform/node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
"node_modules/lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
"dev": true,
- "license": "ISC",
"dependencies": {
"yallist": "^3.0.2"
}
},
"node_modules/make-dir": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
- "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
+ "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==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "semver": "^7.5.3"
+ "semver": "^6.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/make-dir/node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true,
- "license": "ISC",
"bin": {
"semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
}
},
"node_modules/makeerror": {
@@ -4400,7 +4030,6 @@
"resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
"integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
"dev": true,
- "license": "BSD-3-Clause",
"dependencies": {
"tmpl": "1.0.5"
}
@@ -4408,49 +4037,32 @@
"node_modules/materialize-css": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/materialize-css/-/materialize-css-1.0.0.tgz",
- "integrity": "sha512-4/oecXl8y/1i8RDZvyvwAICyqwNoKU4or5uf8uoAd74k76KzZ0Llym4zhJ5lLNUskcqjO0AuMcvNyDkpz8Z6zw==",
- "license": "MIT"
- },
- "node_modules/math-intrinsics": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
- "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
+ "integrity": "sha512-4/oecXl8y/1i8RDZvyvwAICyqwNoKU4or5uf8uoAd74k76KzZ0Llym4zhJ5lLNUskcqjO0AuMcvNyDkpz8Z6zw=="
},
"node_modules/media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
- "license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/merge-descriptors": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
- "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
},
"node_modules/merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">= 8"
}
@@ -4459,19 +4071,17 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
"integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
- "license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/micromatch": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
- "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "braces": "^3.0.3",
+ "braces": "^3.0.2",
"picomatch": "^2.3.1"
},
"engines": {
@@ -4482,7 +4092,6 @@
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
- "license": "MIT",
"bin": {
"mime": "cli.js"
},
@@ -4494,7 +4103,6 @@
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "license": "MIT",
"engines": {
"node": ">= 0.6"
}
@@ -4503,7 +4111,6 @@
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "license": "MIT",
"dependencies": {
"mime-db": "1.52.0"
},
@@ -4516,7 +4123,6 @@
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
"integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=6"
}
@@ -4526,7 +4132,6 @@
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
"integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=10"
},
@@ -4535,15 +4140,14 @@
}
},
"node_modules/minimatch": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
- "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
- "license": "ISC",
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dependencies": {
- "brace-expansion": "^2.0.1"
+ "brace-expansion": "^1.1.7"
},
"engines": {
- "node": ">=10"
+ "node": "*"
}
},
"node_modules/minimist": {
@@ -4551,7 +4155,6 @@
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"dev": true,
- "license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -4560,14 +4163,12 @@
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
"integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/moment": {
"version": "2.30.1",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
"integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
- "license": "MIT",
"engines": {
"node": "*"
}
@@ -4575,8 +4176,7 @@
"node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "license": "MIT"
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/multistream": {
"version": "4.1.0",
@@ -4597,56 +4197,36 @@
"url": "https://feross.org/support"
}
],
- "license": "MIT",
"dependencies": {
"once": "^1.4.0",
"readable-stream": "^3.6.0"
}
},
- "node_modules/multistream/node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/napi-build-utils": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz",
"integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/natural-compare": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/negotiator": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
"integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
- "license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/node-abi": {
- "version": "3.85.0",
- "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.85.0.tgz",
- "integrity": "sha512-zsFhmbkAzwhTft6nd3VxcG0cvJsT70rL+BIGHWVq5fi6MwGrHwzqKaxXE+Hl2GmnGItnDKPPkO5/LQqjVkIdFg==",
+ "version": "3.47.0",
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz",
+ "integrity": "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==",
"dev": true,
- "license": "MIT",
"dependencies": {
"semver": "^7.3.5"
},
@@ -4654,12 +4234,26 @@
"node": ">=10"
}
},
- "node_modules/node-abi/node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "node_modules/node-abi/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dev": true,
- "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/node-abi/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
"bin": {
"semver": "bin/semver.js"
},
@@ -4667,11 +4261,16 @@
"node": ">=10"
}
},
+ "node_modules/node-abi/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
"node_modules/node-cron": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/node-cron/-/node-cron-3.0.3.tgz",
"integrity": "sha512-dOal67//nohNgYWb+nWmg5dkFdIwDm8EpeGYMekPMrngV3637lqnX0lbUcCtgibHTz6SEz7DAIjKvKDFYCnO1A==",
- "license": "ISC",
"dependencies": {
"uuid": "8.3.2"
},
@@ -4684,7 +4283,6 @@
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
"integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
"dev": true,
- "license": "MIT",
"dependencies": {
"whatwg-url": "^5.0.0"
},
@@ -4704,22 +4302,19 @@
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
"integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/node-releases": {
- "version": "2.0.27",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
- "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
- "dev": true,
- "license": "MIT"
+ "version": "2.0.12",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz",
+ "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==",
+ "dev": true
},
"node_modules/nodemon": {
"version": "2.0.22",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz",
"integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"chokidar": "^3.5.2",
"debug": "^3.2.7",
@@ -4743,78 +4338,34 @@
"url": "https://opencollective.com/nodemon"
}
},
- "node_modules/nodemon/node_modules/brace-expansion": {
- "version": "1.1.12",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
- "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
"node_modules/nodemon/node_modules/debug": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"ms": "^2.1.1"
}
},
- "node_modules/nodemon/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/nodemon/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
"node_modules/nodemon/node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
- "node_modules/nodemon/node_modules/semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "node_modules/nopt": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
+ "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
"dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/nodemon/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "license": "MIT",
"dependencies": {
- "has-flag": "^3.0.0"
+ "abbrev": "1"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
},
"engines": {
- "node": ">=4"
+ "node": "*"
}
},
"node_modules/normalize-path": {
@@ -4822,7 +4373,6 @@
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@@ -4832,7 +4382,6 @@
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
"integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"path-key": "^3.0.0"
},
@@ -4844,7 +4393,6 @@
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz",
"integrity": "sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA==",
- "license": "MIT",
"engines": {
"node": "*"
}
@@ -4853,19 +4401,14 @@
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
"integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==",
- "license": "MIT",
"engines": {
"node": ">= 6"
}
},
"node_modules/object-inspect": {
- "version": "1.13.4",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
- "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
+ "version": "1.12.3",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
+ "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -4874,7 +4417,6 @@
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
"integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
- "license": "MIT",
"dependencies": {
"ee-first": "1.1.1"
},
@@ -4887,7 +4429,6 @@
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"dev": true,
- "license": "ISC",
"dependencies": {
"wrappy": "1"
}
@@ -4896,7 +4437,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz",
"integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==",
- "license": "MIT",
"dependencies": {
"fn.name": "1.x.x"
}
@@ -4906,7 +4446,6 @@
"resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
"integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
"dev": true,
- "license": "MIT",
"dependencies": {
"mimic-fn": "^2.1.0"
},
@@ -4922,7 +4461,6 @@
"resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz",
"integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -4932,7 +4470,6 @@
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
"integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"yocto-queue": "^0.1.0"
},
@@ -4948,7 +4485,6 @@
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
- "license": "MIT",
"dependencies": {
"p-limit": "^2.2.0"
},
@@ -4961,7 +4497,6 @@
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
- "license": "MIT",
"dependencies": {
"p-try": "^2.0.0"
},
@@ -4977,7 +4512,6 @@
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=6"
}
@@ -4985,15 +4519,13 @@
"node_modules/pako": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz",
- "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==",
- "license": "(MIT AND Zlib)"
+ "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug=="
},
"node_modules/parse-json": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
"integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.0.0",
"error-ex": "^1.3.1",
@@ -5011,7 +4543,6 @@
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
- "license": "MIT",
"engines": {
"node": ">= 0.8"
}
@@ -5021,7 +4552,6 @@
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -5031,7 +4561,6 @@
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@@ -5041,7 +4570,6 @@
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -5050,37 +4578,33 @@
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/path-to-regexp": {
- "version": "0.1.12",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
- "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
- "license": "MIT"
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
},
"node_modules/path-type": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/picocolors": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
- "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
- "license": "ISC"
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
},
"node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=8.6"
},
@@ -5089,20 +4613,18 @@
}
},
"node_modules/pirates": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
- "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">= 6"
}
},
"node_modules/pizzip": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/pizzip/-/pizzip-3.2.0.tgz",
- "integrity": "sha512-X4NPNICxCfIK8VYhF6wbksn81vTiziyLbvKuORVAmolvnUzl1A1xmz9DAWKxPRq9lZg84pJOOAMq3OE61bD8IQ==",
- "license": "(MIT OR GPL-3.0)",
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/pizzip/-/pizzip-3.1.6.tgz",
+ "integrity": "sha512-FCG2lSMVlrt2jB1iokujjXexanfszV/Y04t4mu1icdSEC/vb/2qDISr2kgENzdkThd1jkRNjvipWitU4gpbM/g==",
"dependencies": {
"pako": "^2.1.0"
}
@@ -5112,7 +4634,6 @@
"resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz",
"integrity": "sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@babel/generator": "7.18.2",
"@babel/parser": "7.18.4",
@@ -5146,7 +4667,6 @@
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
"integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"find-up": "^4.0.0"
},
@@ -5159,7 +4679,6 @@
"resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.2.tgz",
"integrity": "sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"chalk": "^4.1.2",
"fs-extra": "^9.1.0",
@@ -5179,19 +4698,32 @@
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
"integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
"dev": true,
- "license": "ISC",
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
"wrap-ansi": "^7.0.0"
}
},
- "node_modules/pkg-fetch/node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "node_modules/pkg-fetch/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dev": true,
- "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/pkg-fetch/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
"bin": {
"semver": "bin/semver.js"
},
@@ -5199,12 +4731,17 @@
"node": ">=10"
}
},
+ "node_modules/pkg-fetch/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
"node_modules/pkg-fetch/node_modules/yargs": {
"version": "16.2.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"cliui": "^7.0.2",
"escalade": "^3.1.1",
@@ -5223,7 +4760,6 @@
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
"integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
"dev": true,
- "license": "ISC",
"engines": {
"node": ">=10"
}
@@ -5233,7 +4769,6 @@
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz",
"integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@babel/types": "^7.18.2",
"@jridgewell/gen-mapping": "^0.3.0",
@@ -5248,7 +4783,6 @@
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz",
"integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==",
"dev": true,
- "license": "MIT",
"bin": {
"parser": "bin/babel-parser.js"
},
@@ -5261,7 +4795,6 @@
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz",
"integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^7.18.10",
"@babel/helper-validator-identifier": "^7.18.6",
@@ -5271,31 +4804,28 @@
"node": ">=6.9.0"
}
},
- "node_modules/pkg/node_modules/jsesc": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
- "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "node_modules/pkg/node_modules/is-core-module": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
+ "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
"dev": true,
- "license": "MIT",
- "bin": {
- "jsesc": "bin/jsesc"
+ "dependencies": {
+ "has": "^1.0.3"
},
- "engines": {
- "node": ">=4"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/pocketbase": {
"version": "0.15.3",
"resolved": "https://registry.npmjs.org/pocketbase/-/pocketbase-0.15.3.tgz",
- "integrity": "sha512-sjM0XO4wHUlVZs94VhRJi4FeYtbLqvxFbRDJlfjFb/4FkxypbGwxLM4HDAEr8q6jdreuxAM1/n/b5HB1GjQ1Vg==",
- "license": "MIT"
+ "integrity": "sha512-sjM0XO4wHUlVZs94VhRJi4FeYtbLqvxFbRDJlfjFb/4FkxypbGwxLM4HDAEr8q6jdreuxAM1/n/b5HB1GjQ1Vg=="
},
"node_modules/prebuild-install": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz",
"integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"detect-libc": "^2.0.0",
"expand-template": "^2.0.3",
@@ -5318,13 +4848,12 @@
}
},
"node_modules/pretty-format": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
- "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.0.tgz",
+ "integrity": "sha512-XH+D4n7Ey0iSR6PdAnBs99cWMZdGsdKrR33iUHQNr79w1szKTCIZDVdXuccAsHVwDBp0XeWPfNEoaxP9EZgRmQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@jest/schemas": "^29.6.3",
+ "@jest/schemas": "^29.6.0",
"ansi-styles": "^5.0.0",
"react-is": "^18.0.0"
},
@@ -5337,7 +4866,6 @@
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
"integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=10"
},
@@ -5349,15 +4877,13 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/progress": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
"integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=0.4.0"
}
@@ -5367,7 +4893,6 @@
"resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
"integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
"dev": true,
- "license": "MIT",
"dependencies": {
"kleur": "^3.0.3",
"sisteransi": "^1.0.5"
@@ -5380,7 +4905,6 @@
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
"integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
- "license": "MIT",
"dependencies": {
"forwarded": "0.2.0",
"ipaddr.js": "1.9.1"
@@ -5392,31 +4916,28 @@
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
- "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
- "license": "MIT"
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
"node_modules/pstree.remy": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
"integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/pump": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz",
- "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
"dev": true,
- "license": "MIT",
"dependencies": {
"end-of-stream": "^1.1.0",
"once": "^1.3.1"
}
},
"node_modules/pure-rand": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz",
- "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz",
+ "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==",
"dev": true,
"funding": [
{
@@ -5427,16 +4948,14 @@
"type": "opencollective",
"url": "https://opencollective.com/fast-check"
}
- ],
- "license": "MIT"
+ ]
},
"node_modules/qs": {
- "version": "6.14.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
- "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
- "license": "BSD-3-Clause",
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
"dependencies": {
- "side-channel": "^1.1.0"
+ "side-channel": "^1.0.4"
},
"engines": {
"node": ">=0.6"
@@ -5463,28 +4982,25 @@
"type": "consulting",
"url": "https://feross.org/support"
}
- ],
- "license": "MIT"
+ ]
},
"node_modules/range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
- "license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/raw-body": {
- "version": "2.5.3",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz",
- "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==",
- "license": "MIT",
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
"dependencies": {
- "bytes": "~3.1.2",
- "http-errors": "~2.0.1",
- "iconv-lite": "~0.4.24",
- "unpipe": "~1.0.0"
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
},
"engines": {
"node": ">= 0.8"
@@ -5495,7 +5011,6 @@
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
"integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
"dev": true,
- "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
"dependencies": {
"deep-extend": "^0.6.0",
"ini": "~1.3.0",
@@ -5511,47 +5026,34 @@
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
"integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/react-is": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
- "dev": true,
- "license": "MIT"
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
+ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
+ "dev": true
},
"node_modules/readable-stream": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
- "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
- "dev": true,
- "license": "MIT",
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
"dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
}
},
- "node_modules/readable-stream/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"picomatch": "^2.2.1"
},
@@ -5564,28 +5066,23 @@
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/resolve": {
- "version": "1.22.11",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
- "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==",
+ "version": "1.22.2",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz",
+ "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "is-core-module": "^2.16.1",
+ "is-core-module": "^2.11.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
"bin": {
"resolve": "bin/resolve"
},
- "engines": {
- "node": ">= 0.4"
- },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -5595,7 +5092,6 @@
"resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
"integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
"dev": true,
- "license": "MIT",
"dependencies": {
"resolve-from": "^5.0.0"
},
@@ -5608,43 +5104,24 @@
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/resolve.exports": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz",
- "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz",
+ "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=10"
}
},
- "node_modules/resolve/node_modules/is-core-module": {
- "version": "2.16.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
- "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "hasown": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/reusify": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
- "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
"dev": true,
- "license": "MIT",
"engines": {
"iojs": ">=1.0.0",
"node": ">=0.10.0"
@@ -5669,7 +5146,6 @@
"url": "https://feross.org/support"
}
],
- "license": "MIT",
"dependencies": {
"queue-microtask": "^1.2.2"
}
@@ -5691,14 +5167,12 @@
"type": "consulting",
"url": "https://feross.org/support"
}
- ],
- "license": "MIT"
+ ]
},
"node_modules/safe-stable-stringify": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz",
- "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==",
- "license": "MIT",
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz",
+ "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==",
"engines": {
"node": ">=10"
}
@@ -5706,38 +5180,35 @@
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "license": "MIT"
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"dev": true,
- "license": "ISC",
"bin": {
- "semver": "bin/semver.js"
+ "semver": "bin/semver"
}
},
"node_modules/send": {
- "version": "0.19.2",
- "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz",
- "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==",
- "license": "MIT",
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
+ "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
"dependencies": {
"debug": "2.6.9",
"depd": "2.0.0",
"destroy": "1.2.0",
- "encodeurl": "~2.0.0",
+ "encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
- "fresh": "~0.5.2",
- "http-errors": "~2.0.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
"mime": "1.6.0",
"ms": "2.1.3",
- "on-finished": "~2.4.1",
+ "on-finished": "2.4.1",
"range-parser": "~1.2.1",
- "statuses": "~2.0.2"
+ "statuses": "2.0.1"
},
"engines": {
"node": ">= 0.8.0"
@@ -5746,19 +5217,17 @@
"node_modules/send/node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
"node_modules/serve-static": {
- "version": "1.16.3",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz",
- "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==",
- "license": "MIT",
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
+ "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
"dependencies": {
- "encodeurl": "~2.0.0",
+ "encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
- "send": "~0.19.1"
+ "send": "0.18.0"
},
"engines": {
"node": ">= 0.8.0"
@@ -5767,15 +5236,13 @@
"node_modules/setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
- "license": "ISC"
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
},
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"shebang-regex": "^3.0.0"
},
@@ -5788,78 +5255,18 @@
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/side-channel": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
- "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
- "license": "MIT",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
"dependencies": {
- "es-errors": "^1.3.0",
- "object-inspect": "^1.13.3",
- "side-channel-list": "^1.0.0",
- "side-channel-map": "^1.0.1",
- "side-channel-weakmap": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/side-channel-list": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
- "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "object-inspect": "^1.13.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/side-channel-map": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
- "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.5",
- "object-inspect": "^1.13.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/side-channel-weakmap": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
- "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.5",
- "object-inspect": "^1.13.3",
- "side-channel-map": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -5869,8 +5276,7 @@
"version": "3.0.7",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true,
- "license": "ISC"
+ "dev": true
},
"node_modules/simple-concat": {
"version": "1.0.1",
@@ -5890,8 +5296,7 @@
"type": "consulting",
"url": "https://feross.org/support"
}
- ],
- "license": "MIT"
+ ]
},
"node_modules/simple-get": {
"version": "4.0.1",
@@ -5912,19 +5317,30 @@
"url": "https://feross.org/support"
}
],
- "license": "MIT",
"dependencies": {
"decompress-response": "^6.0.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",
+ "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+ "dependencies": {
+ "is-arrayish": "^0.3.1"
+ }
+ },
+ "node_modules/simple-swizzle/node_modules/is-arrayish": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
+ },
"node_modules/simple-update-notifier": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz",
"integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==",
"dev": true,
- "license": "MIT",
"dependencies": {
"semver": "~7.0.0"
},
@@ -5937,7 +5353,6 @@
"resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
"integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
"dev": true,
- "license": "ISC",
"bin": {
"semver": "bin/semver.js"
}
@@ -5946,15 +5361,13 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
"integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/slash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -5964,7 +5377,6 @@
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true,
- "license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
@@ -5974,7 +5386,6 @@
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
"integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
"dev": true,
- "license": "MIT",
"dependencies": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
@@ -5984,14 +5395,12 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
- "dev": true,
- "license": "BSD-3-Clause"
+ "dev": true
},
"node_modules/stack-trace": {
"version": "0.0.10",
"resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
"integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==",
- "license": "MIT",
"engines": {
"node": "*"
}
@@ -6001,7 +5410,6 @@
"resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
"integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"escape-string-regexp": "^2.0.0"
},
@@ -6010,10 +5418,9 @@
}
},
"node_modules/statuses": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
- "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
- "license": "MIT",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
"engines": {
"node": ">= 0.8"
}
@@ -6023,32 +5430,53 @@
"resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz",
"integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"readable-stream": "^2.1.4"
}
},
- "node_modules/string_decoder": {
+ "node_modules/stream-meter/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/stream-meter/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "node_modules/stream-meter/node_modules/string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "license": "MIT",
+ "dev": true,
"dependencies": {
"safe-buffer": "~5.1.0"
}
},
- "node_modules/string_decoder/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "license": "MIT"
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
},
"node_modules/string-length": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
"integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"char-regex": "^1.0.2",
"strip-ansi": "^6.0.0"
@@ -6062,7 +5490,6 @@
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
- "license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
@@ -6077,7 +5504,6 @@
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
- "license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
},
@@ -6090,7 +5516,6 @@
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
"integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -6100,7 +5525,6 @@
"resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
"integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=6"
}
@@ -6110,7 +5534,6 @@
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=8"
},
@@ -6119,12 +5542,10 @@
}
},
"node_modules/superagent": {
- "version": "8.1.2",
- "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz",
- "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==",
- "deprecated": "Please upgrade to superagent v10.2.2+, see release notes at https://github.com/forwardemail/superagent/releases/tag/v10.2.2 - maintenance is supported by Forward Email @ https://forwardemail.net",
+ "version": "8.0.9",
+ "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.9.tgz",
+ "integrity": "sha512-4C7Bh5pyHTvU33KpZgwrNKh/VQnvgtCSqPRfJAUdmrtSYePVzVg4E4OzsrbkhJj9O7SO6Bnv75K/F8XVZT8YHA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"component-emitter": "^1.3.0",
"cookiejar": "^2.1.4",
@@ -6142,13 +5563,12 @@
}
},
"node_modules/superagent/node_modules/debug": {
- "version": "4.4.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
- "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "ms": "^2.1.3"
+ "ms": "2.1.2"
},
"engines": {
"node": ">=6.0"
@@ -6159,12 +5579,23 @@
}
}
},
+ "node_modules/superagent/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/superagent/node_modules/mime": {
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
"integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
"dev": true,
- "license": "MIT",
"bin": {
"mime": "cli.js"
},
@@ -6173,18 +5604,19 @@
}
},
"node_modules/superagent/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true,
- "license": "MIT"
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
},
"node_modules/superagent/node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "version": "7.5.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz",
+ "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==",
"dev": true,
- "license": "ISC",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
"bin": {
"semver": "bin/semver.js"
},
@@ -6192,32 +5624,35 @@
"node": ">=10"
}
},
+ "node_modules/superagent/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
"node_modules/supertest": {
- "version": "6.3.4",
- "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.4.tgz",
- "integrity": "sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==",
- "deprecated": "Please upgrade to supertest v7.1.3+, see release notes at https://github.com/forwardemail/supertest/releases/tag/v7.1.3 - maintenance is supported by Forward Email @ https://forwardemail.net",
+ "version": "6.3.3",
+ "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz",
+ "integrity": "sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"methods": "^1.1.2",
- "superagent": "^8.1.2"
+ "superagent": "^8.0.5"
},
"engines": {
"node": ">=6.4.0"
}
},
"node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0"
+ "has-flag": "^3.0.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=4"
}
},
"node_modules/supports-preserve-symlinks-flag": {
@@ -6225,7 +5660,6 @@
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">= 0.4"
},
@@ -6236,15 +5670,13 @@
"node_modules/sync-channel": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/sync-channel/-/sync-channel-0.0.6.tgz",
- "integrity": "sha512-rjHHukZeQW3hGgwMuOkrITv1e87nxuAKRGgwPNtCmS3Az+YdO826hBy1IDjRsTXKGc2WDWUaDU5Zx8uodXWwgg==",
- "license": "BSD"
+ "integrity": "sha512-rjHHukZeQW3hGgwMuOkrITv1e87nxuAKRGgwPNtCmS3Az+YdO826hBy1IDjRsTXKGc2WDWUaDU5Zx8uodXWwgg=="
},
"node_modules/tar-fs": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz",
- "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==",
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
+ "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
"dev": true,
- "license": "MIT",
"dependencies": {
"chownr": "^1.1.1",
"mkdirp-classic": "^0.5.2",
@@ -6257,7 +5689,6 @@
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
"integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"bl": "^4.0.3",
"end-of-stream": "^1.4.1",
@@ -6269,27 +5700,11 @@
"node": ">=6"
}
},
- "node_modules/tar-stream/node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/test-exclude": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
"integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
"dev": true,
- "license": "ISC",
"dependencies": {
"@istanbuljs/schema": "^0.1.2",
"glob": "^7.1.4",
@@ -6299,49 +5714,22 @@
"node": ">=8"
}
},
- "node_modules/test-exclude/node_modules/brace-expansion": {
- "version": "1.1.12",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
- "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/test-exclude/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
"node_modules/text-hex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
- "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==",
- "license": "MIT"
+ "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="
},
"node_modules/tmpl": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
"integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
- "dev": true,
- "license": "BSD-3-Clause"
+ "dev": true
},
"node_modules/to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
"integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=4"
}
@@ -6351,7 +5739,6 @@
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"is-number": "^7.0.0"
},
@@ -6363,17 +5750,18 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
- "license": "MIT",
"engines": {
"node": ">=0.6"
}
},
"node_modules/touch": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz",
- "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
+ "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
"dev": true,
- "license": "ISC",
+ "dependencies": {
+ "nopt": "~1.0.10"
+ },
"bin": {
"nodetouch": "bin/nodetouch.js"
}
@@ -6382,24 +5770,18 @@
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/triple-beam": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz",
- "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==",
- "license": "MIT",
- "engines": {
- "node": ">= 14.0.0"
- }
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz",
+ "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw=="
},
"node_modules/tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
"integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
"dev": true,
- "license": "Apache-2.0",
"dependencies": {
"safe-buffer": "^5.0.1"
},
@@ -6412,7 +5794,6 @@
"resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
"integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=4"
}
@@ -6422,7 +5803,6 @@
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
"integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
"dev": true,
- "license": "(MIT OR CC0-1.0)",
"engines": {
"node": ">=10"
},
@@ -6434,7 +5814,6 @@
"version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
- "license": "MIT",
"dependencies": {
"media-typer": "0.3.0",
"mime-types": "~2.1.24"
@@ -6447,22 +5826,13 @@
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
"integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/undici-types": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
- "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">= 10.0.0"
}
@@ -6471,15 +5841,14 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
- "license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/update-browserslist-db": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
- "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
+ "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==",
"dev": true,
"funding": [
{
@@ -6495,10 +5864,9 @@
"url": "https://github.com/sponsors/ai"
}
],
- "license": "MIT",
"dependencies": {
- "escalade": "^3.2.0",
- "picocolors": "^1.1.1"
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
},
"bin": {
"update-browserslist-db": "cli.js"
@@ -6510,14 +5878,12 @@
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
- "license": "MIT"
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
},
"node_modules/utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
- "license": "MIT",
"engines": {
"node": ">= 0.4.0"
}
@@ -6526,31 +5892,34 @@
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "license": "MIT",
"bin": {
"uuid": "dist/bin/uuid"
}
},
"node_modules/v8-to-istanbul": {
- "version": "9.3.0",
- "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz",
- "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==",
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz",
+ "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==",
"dev": true,
- "license": "ISC",
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.12",
"@types/istanbul-lib-coverage": "^2.0.1",
- "convert-source-map": "^2.0.0"
+ "convert-source-map": "^1.6.0"
},
"engines": {
"node": ">=10.12.0"
}
},
+ "node_modules/v8-to-istanbul/node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "dev": true
+ },
"node_modules/vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
- "license": "MIT",
"engines": {
"node": ">= 0.8"
}
@@ -6560,7 +5929,6 @@
"resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
"integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
"dev": true,
- "license": "Apache-2.0",
"dependencies": {
"makeerror": "1.0.12"
}
@@ -6569,15 +5937,13 @@
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
- "dev": true,
- "license": "BSD-2-Clause"
+ "dev": true
},
"node_modules/whatwg-url": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"tr46": "~0.0.3",
"webidl-conversions": "^3.0.0"
@@ -6588,7 +5954,6 @@
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
- "license": "ISC",
"dependencies": {
"isexe": "^2.0.0"
},
@@ -6600,22 +5965,21 @@
}
},
"node_modules/winston": {
- "version": "3.19.0",
- "resolved": "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz",
- "integrity": "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==",
- "license": "MIT",
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.0.tgz",
+ "integrity": "sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==",
"dependencies": {
"@colors/colors": "^1.6.0",
- "@dabh/diagnostics": "^2.0.8",
+ "@dabh/diagnostics": "^2.0.2",
"async": "^3.2.3",
"is-stream": "^2.0.0",
- "logform": "^2.7.0",
+ "logform": "^2.4.0",
"one-time": "^1.0.0",
"readable-stream": "^3.4.0",
"safe-stable-stringify": "^2.3.1",
"stack-trace": "0.0.x",
"triple-beam": "^1.3.0",
- "winston-transport": "^4.9.0"
+ "winston-transport": "^4.7.0"
},
"engines": {
"node": ">= 12.0.0"
@@ -6625,7 +5989,6 @@
"version": "4.7.1",
"resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-4.7.1.tgz",
"integrity": "sha512-7LGPiYGBPNyGHLn9z33i96zx/bd71pjBn9tqQzO3I4Tayv94WPmBNwKC7CO1wPHdP9uvu+Md/1nr6VSH9h0iaA==",
- "license": "MIT",
"dependencies": {
"file-stream-rotator": "^0.6.1",
"object-hash": "^2.0.1",
@@ -6640,45 +6003,24 @@
}
},
"node_modules/winston-transport": {
- "version": "4.9.0",
- "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz",
- "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==",
- "license": "MIT",
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz",
+ "integrity": "sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==",
"dependencies": {
- "logform": "^2.7.0",
- "readable-stream": "^3.6.2",
+ "logform": "^2.3.2",
+ "readable-stream": "^3.6.0",
"triple-beam": "^1.3.0"
},
"engines": {
"node": ">= 12.0.0"
}
},
- "node_modules/winston-transport/node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
- "license": "MIT",
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
+ "node_modules/winston/node_modules/@colors/colors": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz",
+ "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==",
"engines": {
- "node": ">= 6"
- }
- },
- "node_modules/winston/node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
- "license": "MIT",
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
+ "node": ">=0.1.90"
}
},
"node_modules/wrap-ansi": {
@@ -6686,7 +6028,6 @@
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
- "license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
@@ -6703,15 +6044,13 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
- "dev": true,
- "license": "ISC"
+ "dev": true
},
"node_modules/write-file-atomic": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
"integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
"dev": true,
- "license": "ISC",
"dependencies": {
"imurmurhash": "^0.1.4",
"signal-exit": "^3.0.7"
@@ -6725,7 +6064,6 @@
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
"dev": true,
- "license": "ISC",
"engines": {
"node": ">=10"
}
@@ -6734,15 +6072,13 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "dev": true,
- "license": "ISC"
+ "dev": true
},
"node_modules/yargs": {
"version": "17.7.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
"dev": true,
- "license": "MIT",
"dependencies": {
"cliui": "^8.0.1",
"escalade": "^3.1.1",
@@ -6761,7 +6097,6 @@
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
"dev": true,
- "license": "ISC",
"engines": {
"node": ">=12"
}
@@ -6771,7 +6106,6 @@
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=10"
},
diff --git a/ecole/package.json b/ecole/package.json
index 04dd75f0..c0018619 100644
--- a/ecole/package.json
+++ b/ecole/package.json
@@ -6,10 +6,13 @@
"scripts": {
"start": "nodemon ./src/server.js",
"build": "pkg ./src/server.js -o EasyTransport",
- "test": "jest"
+ "test": "jest",
+ "db" : "cd ./src/db && start cmd /c Lancement_Pocketbase.cmd"
},
"pkg": {
- "assets": ["public/**"]
+ "assets": [
+ "public/**"
+ ]
},
"keywords": [],
"author": "cyril.ducaffy@axa.fr",
diff --git a/ecole/public/css/global.css b/ecole/public/css/global.css
index af6c9276..aa7780f8 100644
--- a/ecole/public/css/global.css
+++ b/ecole/public/css/global.css
@@ -5,7 +5,12 @@ body {
color-scheme: light;
}
-h1, h2, h3, h4, h5, h6 {
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
color: darkblue !important;
font-weight: bold;
}
@@ -116,6 +121,11 @@ hr.form {
padding: 0 5% !important;
}
+.center {
+ display: flex;
+ justify-content: center
+}
+
.circle {
cursor: pointer;
width: 35px;
@@ -232,7 +242,10 @@ hr.form {
content: none;
}
-#selectHistory, #selectHistory ul, #selectHistory li, #selectHistory span {
+#selectHistory,
+#selectHistory ul,
+#selectHistory li,
+#selectHistory span {
font-size: 13px !important;
}
@@ -288,6 +301,14 @@ hr.form {
padding-right: 10px;
}
+.moyenTransportTarif {
+ margin-bottom: 30px;
+}
+
+.moyenTransportTarif td i {
+ padding-right: 10px;
+}
+
.select-chip {
display: none;
color: darkblue
@@ -322,6 +343,13 @@ hr.form {
font-weight: bold;
}
+.step {
+ background-color: #f44336 ;
+ color: white;
+ font-weight: bold;
+ margin-top: 10px;
+}
+
.modulo-resume {
font-size: 20px;
font-weight: normal;
@@ -341,6 +369,7 @@ hr.form {
flex-wrap: wrap;
justify-content: space-evenly;
margin-bottom: 20px;
+ align-items: flex-start;
}
@@ -381,7 +410,7 @@ hr.form {
outline-offset: 3px;
}
-.garAdd .card-content{
+.garAdd .card-content {
display: flex;
align-items: flex-start;
justify-content: flex-start;
@@ -389,29 +418,28 @@ hr.form {
}
.garAdd .card-title {
-padding: 10px;
+ padding: 10px;
}
form h5 {
- margin : 0px 0px 30px 0px
+ margin: 0px 0px 30px 0px
}
a.grille-garanties {
- width : 40px ;
- height : 40px ;
+ width: 40px;
+ height: 40px;
padding: 2px 0 0 0;
border-radius: 100%;
background-color: #F44336;
}
-a.grille-garanties:hover{
+a.grille-garanties:hover {
background-color: #be3026;
}
.modalAlert .modal-content .modalRed {
list-style-type: square;
- color : red;
- font-weight: bold;
+ color: red
}
.modalAlert .modal-content h4 {
@@ -419,7 +447,7 @@ a.grille-garanties:hover{
}
.modalAlert .modal-footer a {
- color : white
+ color: white
}
#rcProjetBlockingSummary,
@@ -539,10 +567,110 @@ a.grille-garanties:hover{
padding: 0 10px;
}
-#rowExtensionsGarantie .dropdown-content.select-dropdown.multiple-select-dropdown{
+#rowExtensionsGarantie .dropdown-content.select-dropdown.multiple-select-dropdown {
z-index: 20 !important;
}
+.flux-card {
+ width: 41rem !important;
+ padding: 2rem 1.4rem;
+ border-radius: 20px;
+ box-shadow: 5px 5px 7px -3px rgba(0, 0, 0, 0.173);
+}
+
+.flux-card .flux-card-title {
+ font-size: 20px;
+ font-weight: bold;
+ margin: 0 0 20px 0;
+ color: darkblue
+}
+
+#div-fluxAchats {
+ background-color: #d5ecd4;
+ transition: 0.2s;
+}
+
+#div-fluxVentes {
+ background-color: #ddddfb;
+ transition: 0.2s;
+}
+
+#div-fluxAchats:hover {
+ background-color: #e5f0e5;
+}
+
+#div-fluxVentes:hover {
+ background-color: #f0f0ff;
+}
+
+.listNatureMar input:disabled {
+ color: black !important
+}
+
+.flux-card hr {
+ height: 0px;
+}
+
+.flux-card hr.divider {
+ margin: 3rem 0px;
+ border-color: #9b9b9b17;
+}
+
+.flux-card .select-wrapper {
+ background-color: white;
+}
+
+.listNatureMar {
+ margin-bottom: 30px;
+}
+
+#div-fluxAchats .listNatureMar>div {
+ background-color: #aad8a7;
+}
+
+#div-fluxVentes .listNatureMar>div {
+ background-color: rgb(193, 189, 236);
+}
+
+.listNatureMar>div {
+ border-radius: 5px;
+ margin: 5px 0;
+ padding: 6px 0;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+.listNatureMar .btn-floating {
+ margin-right: 20px;
+}
+
+.flux-card .input-field {
+ width: 20rem;
+}
+
+.checkedCheckbox::before {
+ background-color: rgba(0, 0, 0, 0.42) !important;
+ border-color: #949494 !important;
+
+}
+
+.propositions-flex {
+ display: flex;
+ justify-content: space-between;
+}
+
+.propositions-flex>div {
+ width: 100%;
+ margin: 0px 20px
+}
+
+#row-sinistresAsIf > div {
+ display: flex;
+ justify-content: center;
+ align-items: center
+}
+
@media only screen and (max-width: 600px) {
.flex-adaptable {
flex-direction: column;
diff --git a/ecole/public/css/historiqueParcours.css b/ecole/public/css/historiqueParcours.css
index cab3900f..a5a4a323 100644
--- a/ecole/public/css/historiqueParcours.css
+++ b/ecole/public/css/historiqueParcours.css
@@ -42,25 +42,99 @@ table.dataTable thead th>div {
left: 0 !important;
}
-#historiqueParcours_filter label {
- display: flex;
- align-items: center;
+#historiqueParcours_filter {
+ margin-bottom: 20px;
}
+.dataTables_wrapper .dataTables_filter {
+ position: relative;
+ text-align: left;
+ float: left;
+ padding: 2px;
+ overflow: visible;
+}
+
+/* Cacher complètement le label "Rechercher" de DataTables */
+.dataTables_wrapper .dataTables_filter label {
+ position: relative;
+ display: inline-block;
+ margin: 0;
+ font-size: 0 !important;
+ line-height: 0 !important;
+ overflow: visible;
+}
+
+.dataTables_wrapper .dataTables_filter label > span:first-child {
+ display: none !important;
+}
+
+/* fond blanc, bordure grise fine, capsule arrondie */
.dataTables_wrapper .dataTables_filter input[type="search"] {
- background-color: transparent;
- border: none;
- border-bottom: 1px solid #26a69a;
- border-radius: 0;
+ background-color: #fff;
+ border: 1px solid #e0e0e0;
+ border-radius: 42px;
outline: none;
- height: 3rem;
- width: 100%;
- font-size: 16px;
- margin: 0 0 8px 0;
- padding: 0;
- box-shadow: none;
- box-sizing: content-box;
- transition: box-shadow .3s, border .3s, -webkit-box-shadow .3s;
+ height: 42px;
+ width: 220px;
+ font-size: 15px;
+ margin: 0;
+ padding: 0 20px 0 52px;
+ box-sizing: border-box;
+ transition: all 0.2s ease;
+ color: #333;
+ position: relative;
+}
+
+.dataTables_wrapper .dataTables_filter input[type="search"]:focus {
+ background-color: #fff;
+ border-color: #1d9bf0;
+ box-shadow: 0 0 0 2px #1d9bf0;
+ color: #333;
+}
+
+.dataTables_wrapper .dataTables_filter input[type="search"]::placeholder {
+ color: #71767a;
+}
+
+/* Icône de loupe SVG */
+.dataTables_wrapper .dataTables_filter label::before {
+ content: "";
+ position: absolute;
+ left: 20px;
+ top: 50%;
+ transform: translateY(-50%);
+ width: 18px;
+ height: 18px;
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2371767a' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.35-4.35'/%3E%3C/svg%3E");
+ background-size: contain;
+ background-repeat: no-repeat;
+ background-position: center;
+ pointer-events: none;
+ z-index: 1;
+}
+
+/* Texte "Rechercher" à côté de l'icône */
+.dataTables_wrapper .dataTables_filter label::after {
+ content: "Rechercher";
+ position: absolute;
+ left: 52px;
+ top: 50%;
+ transform: translateY(-50%);
+ font-size: 15px;
+ color: #71767a;
+ pointer-events: none;
+ z-index: 1;
+ white-space: nowrap;
+}
+
+/* Cacher le texte "Rechercher" quand on tape, focus, ou si l'input a une valeur */
+.dataTables_wrapper .dataTables_filter:focus-within label::after,
+.dataTables_wrapper .dataTables_filter label.has-value::after {
+ opacity: 0;
+}
+
+.dataTables_wrapper .dataTables_filter input[type="search"]:focus::placeholder {
+ color: transparent;
}
#historiqueParcours_length>label {
@@ -83,7 +157,7 @@ table.dataTable thead th>div {
width: 60px;
}
-/* Style Input search by row */
+/* Style Input recherche par ligne */
#historiqueParcours>thead>tr:nth-child(2)>th>input {
font-size: 13px !important;
padding: 6px !important;
@@ -105,7 +179,7 @@ table.dataTable thead .sorting_desc:before {
content: "";
}
-/* boutons de navigationw */
+/* boutons de navigation */
.dataTables_wrapper .dataTables_paginate .paginate_button {
background-color: white !important;
border: darkblue solid 1.5px !important;
@@ -145,10 +219,31 @@ td.nc-value {
}
#divToggleSearch {
- width: 300px;
grid-column: 2;
grid-row: 3;
justify-self: center;
+ white-space: nowrap;
+}
+
+#toggleSearch {
+ white-space: nowrap;
+ width: auto;
+ min-width: fit-content;
+ padding: 0 24px;
+ color: white !important;
+ background-color: darkblue !important;
+ border: none !important;
+ border-radius: 8px;
+ box-shadow: 0 2px 4px rgba(16, 0, 75, 0.2), 0 4px 8px rgba(16, 0, 75, 0.1);
+ transition: background-color 0.3s;
+}
+
+#toggleSearch:hover {
+ background-color: #26a69a !important;
+}
+
+#toggleSearch:active {
+ background-color: gray !important;
}
#divExtractAll {
@@ -184,7 +279,7 @@ td.nc-value {
margin: 0;
}
-/* checkbox Filter Region Admin */
+/* checkbox Filter Region Admin a supprimer probablement*/
#checkRegionAdmin {
border: 1px solid #ccc;
padding: 10px;
@@ -205,4 +300,69 @@ td.nc-value {
#checkRegionAdmin label {
display: inline-block;
-}
\ No newline at end of file
+}
+
+#historiqueParcours tr.shown > td { background: #fffdf5; }
+ .parcours-details { font-size: 0.95rem; }
+
+
+/* Style pour les boutons d'export désactivés */
+#divBtnFilter button:disabled {
+ opacity: 0.5 !important;
+ cursor: not-allowed !important;
+ pointer-events: none !important;
+}
+
+#historiqueParcours td .col-with-text {
+ white-space: normal !important;
+}
+
+
+#historiqueParcours_wrapper {
+ overflow-x: visible !important;
+}
+
+table.dataTable {
+ width: 100% !important;
+ table-layout: auto !important;
+}
+
+.col-with-text {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ white-space: nowrap;
+}
+
+.col-with-text .np {
+ white-space: normal !important;
+}
+
+
+.btn-row-details {
+ cursor: pointer;
+ width: 35px;
+ height: 28px;
+ background-color: #F44336 !important;
+ border-radius: 6px;
+ border: 3px solid darkblue;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: white;
+ font-weight: bold;
+ font-size: 16px;
+ padding: 0;
+ line-height: 1;
+ transition: 0.15s ease-in-out;
+}
+
+/* petit effet hover propre pour le bouton détails*/
+.btn-row-details:hover {
+ background-color: #d7372f;
+ transform: scale(1.05);
+}
+
+
+
+
diff --git a/ecole/public/images/_ARCHIVES_/zone1.png b/ecole/public/images/_ARCHIVES_/zone1.png
new file mode 100644
index 00000000..9553a866
Binary files /dev/null and b/ecole/public/images/_ARCHIVES_/zone1.png differ
diff --git a/ecole/public/images/_ARCHIVES_/zone2.png b/ecole/public/images/_ARCHIVES_/zone2.png
new file mode 100644
index 00000000..0ac33dfb
Binary files /dev/null and b/ecole/public/images/_ARCHIVES_/zone2.png differ
diff --git a/ecole/public/images/_ARCHIVES_/zone3.png b/ecole/public/images/_ARCHIVES_/zone3.png
new file mode 100644
index 00000000..950c4a1f
Binary files /dev/null and b/ecole/public/images/_ARCHIVES_/zone3.png differ
diff --git a/ecole/public/images/_ARCHIVES_/zone4.png b/ecole/public/images/_ARCHIVES_/zone4.png
new file mode 100644
index 00000000..b9d61f01
Binary files /dev/null and b/ecole/public/images/_ARCHIVES_/zone4.png differ
diff --git a/ecole/public/images/_ARCHIVES_/zone5.png b/ecole/public/images/_ARCHIVES_/zone5.png
new file mode 100644
index 00000000..2566b294
Binary files /dev/null and b/ecole/public/images/_ARCHIVES_/zone5.png differ
diff --git a/ecole/public/images/_ARCHIVES_/zone6.png b/ecole/public/images/_ARCHIVES_/zone6.png
new file mode 100644
index 00000000..b0a5b766
Binary files /dev/null and b/ecole/public/images/_ARCHIVES_/zone6.png differ
diff --git a/ecole/public/images/_ARCHIVES_/zone7.png b/ecole/public/images/_ARCHIVES_/zone7.png
index 20f36afd..b802469f 100644
Binary files a/ecole/public/images/_ARCHIVES_/zone7.png and b/ecole/public/images/_ARCHIVES_/zone7.png differ
diff --git a/ecole/public/images/zone4.png b/ecole/public/images/zone4.png
index 57b30c5a..b9d61f01 100644
Binary files a/ecole/public/images/zone4.png and b/ecole/public/images/zone4.png differ
diff --git a/ecole/public/images/zone6.png b/ecole/public/images/zone6.png
index ed5687d4..b0a5b766 100644
Binary files a/ecole/public/images/zone6.png and b/ecole/public/images/zone6.png differ
diff --git a/ecole/public/images/zone7.png b/ecole/public/images/zone7.png
index b802469f..cf6d88db 100644
Binary files a/ecole/public/images/zone7.png and b/ecole/public/images/zone7.png differ
diff --git a/ecole/public/js/global.js b/ecole/public/js/global.js
index e7a9fa7b..29ab3633 100644
--- a/ecole/public/js/global.js
+++ b/ecole/public/js/global.js
@@ -181,4 +181,263 @@ async function loadContrat(idContrat) {
} catch (error) {
console.error("Erreur lors de la récupération des informations contrat :", error);
}
-}
\ No newline at end of file
+}
+
+// ========== Fonctions utilitaires génériques ==========
+
+/**
+ * Formatage des dates (ISO vers format français)
+ * @param {string} iso - Date au format ISO
+ * @param {boolean} withTime - Inclure l'heure (défaut: true)
+ * @returns {string} Date formatée (dd/mm/yyyy ou dd/mm/yyyy hh:mm)
+ */
+function fmtDate(iso, withTime = true) {
+ // Si la valeur est null, undefined, ou vide
+ if (!iso || (typeof iso === 'string' && iso.trim() === "")) return "NC";
+
+ // Convertir en string si ce n'est pas déjà le cas
+ const dateStr = String(iso).trim();
+
+ // Vérifier les valeurs invalides connues
+ if (dateStr === "00/00/0000" || dateStr === "00/00" || dateStr === "null" || dateStr === "undefined") {
+ return "NC";
+ }
+
+ let d;
+
+ // Si c'est déjà au format jj/mm/aaaa (format français)
+ if (dateStr.includes("/") && dateStr.split("/").length === 3) {
+ const parts = dateStr.split("/");
+ const day = parseInt(parts[0], 10);
+ const month = parseInt(parts[1], 10);
+ const year = parseInt(parts[2], 10);
+
+ // Vérifier si les valeurs sont valides
+ if (isNaN(day) || isNaN(month) || isNaN(year)) {
+ return "NC";
+ }
+
+ // Si le jour ou le mois est 00, considérer comme invalide
+ if (day === 0 || month === 0) {
+ return "NC";
+ }
+
+ // Si le mois est invalide
+ if (month < 1 || month > 12) {
+ return "NC";
+ }
+
+ // Si l'année est 0000, afficher juste jj/mm (sans l'année)
+ if (year === 0) {
+ return `${String(day).padStart(2, "0")}/${String(month).padStart(2, "0")}`;
+ }
+
+ // Si l'année est valide, créer une vraie date et valider
+ const monthIndex = month - 1; // Les mois commencent à 0
+ d = new Date(year, monthIndex, day);
+ // Vérifier si la date est valide (ex: 31/02/2000 serait invalide)
+ if (d.getDate() !== day || d.getMonth() !== monthIndex || d.getFullYear() !== year) {
+ return "NC";
+ }
+
+ // Formater la date
+ const dd = String(d.getDate()).padStart(2, "0");
+ const mm = String(d.getMonth() + 1).padStart(2, "0");
+ const yyyy = d.getFullYear();
+ if (!withTime) return `${dd}/${mm}/${yyyy}`;
+ const hh = String(d.getHours()).padStart(2, "0");
+ const mi = String(d.getMinutes()).padStart(2, "0");
+ return `${dd}/${mm}/${yyyy} ${hh}:${mi}`;
+ }
+ // Si c'est au format jj/mm (pour date d'échéance)
+ else if (dateStr.includes("/") && dateStr.split("/").length === 2) {
+ const parts = dateStr.split("/");
+ const day = parseInt(parts[0], 10);
+ const month = parseInt(parts[1], 10);
+
+ // Pour l'échéance, on retourne juste jj/mm
+ if (isNaN(day) || isNaN(month) || day === 0 || month === 0 || month > 12) {
+ return "NC";
+ }
+ return `${String(day).padStart(2, "0")}/${String(month).padStart(2, "0")}`;
+ }
+ // Sinon, essayer de parser comme date ISO
+ else {
+ d = new Date(dateStr);
+ if (isNaN(d.getTime())) return "NC";
+
+ const dd = String(d.getDate()).padStart(2, "0");
+ const mm = String(d.getMonth() + 1).padStart(2, "0");
+ const yyyy = d.getFullYear();
+ if (!withTime) return `${dd}/${mm}/${yyyy}`;
+ const hh = String(d.getHours()).padStart(2, "0");
+ const mi = String(d.getMinutes()).padStart(2, "0");
+ return `${dd}/${mm}/${yyyy} ${hh}:${mi}`;
+ }
+}
+
+/**
+ * Crée un élément key-value pour l'affichage de détails
+ * @param {string} label - Libellé
+ * @param {*} value - Valeur (booléen converti en Oui/Non)
+ * @returns {string} HTML formaté
+ */
+function kv(label, value) {
+ const v = (value === true) ? "Oui" : (value === false) ? "Non" : (value ?? "NC");
+ return `
`;
+}
+
+/**
+ * Crée une grille à 2 colonnes pour l'affichage de détails
+ * @param {string} innerLeft - Contenu colonne gauche
+ * @param {string} innerRight - Contenu colonne droite
+ * @returns {string} HTML formaté
+ */
+function gridWrap2cols(innerLeft, innerRight) {
+ return `${innerLeft}${innerRight}
`;
+}
+
+/**
+ * Fonction debounce pour limiter la fréquence d'exécution d'une fonction
+ * Utile pour les recherches en temps réel et éviter les appels API excessifs
+ * @param {Function} fn - Fonction à débouncer
+ * @param {number} delay - Délai en millisecondes (défaut: 300ms)
+ * @returns {Function} Fonction débouncée avec méthode cancel()
+ */
+function debounce(fn, delay = 300) {
+ let t;
+ function wrapped(...args) {
+ clearTimeout(t);
+ t = setTimeout(() => fn(...args), delay);
+ }
+ wrapped.cancel = () => clearTimeout(t);
+ return wrapped;
+}
+
+/**
+ * Décode un token JWT et retourne le payload
+ * @param {string} token - Token JWT à décoder
+ * @returns {Object|null} Payload décodé ou null en cas d'erreur
+ */
+function parseJwt(token) {
+ try {
+ const base64Url = token.split(".")[1];
+ const base64 = base64Url.replace(/-/g, "+").replace(/_/g, "/");
+ const jsonPayload = decodeURIComponent(
+ atob(base64)
+ .split("")
+ .map(function (c) {
+ return "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2);
+ })
+ .join("")
+ );
+ return JSON.parse(jsonPayload);
+ } catch (error) {
+ console.error("Erreur lors du décodage du token:", error);
+ return null;
+ }
+}
+
+/**
+ * Affiche un message d'erreur dans l'élément avec l'ID "error"
+ * @param {string} message - Message d'erreur à afficher
+ */
+function displayError(message) {
+ const errorElement = document.getElementById("error");
+ if (errorElement) {
+ errorElement.textContent = message;
+ errorElement.style.display = "block";
+ }
+}
+
+/**
+ * Crée un message formaté avec différents types (info, warn, error, dev)
+ * @param {string} type - Type de message : 'info', 'warn', 'error', 'dev'
+ * @param {string} title - Titre du message
+ * @param {string} description - Description du message (peut contenir du HTML)
+ * @returns {string} HTML du message formaté
+ */
+function createMessageBox(type, title, description) {
+ // Protection contre les paramètres invalides
+ if (!type || typeof type !== 'string') type = 'info';
+ if (!title || typeof title !== 'string') title = 'Message';
+ if (!description || typeof description !== 'string') description = '';
+
+ const configs = {
+ info: {
+ icon: 'fa-info-circle',
+ bgColor: '#e3f2fd',
+ borderColor: '#2196f3',
+ textColor: '#1565c0'
+ },
+ warn: {
+ icon: 'fa-exclamation-triangle',
+ bgColor: '#fff3e0',
+ borderColor: '#ff9800',
+ textColor: '#e65100'
+ },
+ error: {
+ icon: 'fa-times-circle',
+ bgColor: '#ffebee',
+ borderColor: '#f44336',
+ textColor: '#c62828'
+ },
+ dev: {
+ icon: 'fa-tools',
+ bgColor: '#fff3cd',
+ borderColor: '#ffc107',
+ textColor: '#856404'
+ }
+ };
+
+ const config = configs[type] || configs.info;
+
+ // Échappement basique pour éviter les problèmes (description peut contenir du HTML valide)
+ const safeTitle = String(title).replace(//g, '>');
+ // Description peut contenir du HTML (comme ), donc on ne l'échappe pas complètement
+ // mais on s'assure qu'elle est une string
+ const safeDescription = String(description);
+
+ return `
+
+
+
+ ${safeTitle}
+
+
+ ${safeDescription}
+
+
+ `;
+}
+
+/**
+ * Formate une valeur en euros :
+ * - espace insécable fine entre milliers,
+ * - virgule pour les décimales,
+ * - 0 à 2 décimales max,
+ * - symbole € à la fin.
+ * Si la valeur est invalide => "NC".
+ */
+function formatEuro(value, options) {
+ const opts = Object.assign({ minimumFractionDigits: 0, maximumFractionDigits: 2 }, options || {});
+ if (value === null || value === undefined || value === '' || value === 'NC') return 'NC';
+
+ // Accepte string avec virgule ou espaces
+ const normalized = (typeof value === 'string')
+ ? value.replace(/\s|\u00A0|\u202F| /g, '').replace(',', '.')
+ : value;
+
+ const num = Number(normalized);
+ if (!isFinite(num)) return 'NC';
+
+ const formatted = new Intl.NumberFormat('fr-FR', {
+ minimumFractionDigits: opts.minimumFractionDigits,
+ maximumFractionDigits: opts.maximumFractionDigits
+ }).format(num);
+
+ return formatted + ' €';
+}
diff --git a/ecole/public/js/historiqueParcours.js b/ecole/public/js/historiqueParcours.js
index 964fde60..350dfabd 100644
--- a/ecole/public/js/historiqueParcours.js
+++ b/ecole/public/js/historiqueParcours.js
@@ -1,325 +1,551 @@
+// public/js/historiqueParcours.js
document.addEventListener("DOMContentLoaded", async function () {
- // Fetch data from the server
- //// parse TOken
+ // Récupération du token
const token = localStorage.getItem("jwtToken");
if (!token) {
throw new Error("Aucun token trouvé dans le localStorage.");
}
-
+
const userData = parseJwt(token);
if (!userData) {
displayError("Erreur lors de l'extraction des données utilisateur à partir du token.");
-
return;
}
- const { userAuthGroupe, userMatricule } = userData;
- const isAdmin = userAuthGroupe === "ADMIN";
- const matriculeUser = userMatricule;
+ // Initialiser DataTables en mode server-side (obligé pour pagination)
+ const table = initServerSideDataTable();
- let regionUser;
- let tableData = [];
+ // Variable pour suivre l'état des exports
+ let isExporting = false;
- const checkAdmin = document.querySelector('#checkRegionAdmin');
-
- if (isAdmin) {
- checkAdmin.style.display = "flex";
- }
-
- try {
- const userResponse = await fetchUserDetails(matriculeUser);
- regionUser = userResponse?.user["@expand"].region?.nom || null;
- } catch (error) {
- displayError("Erreur lors de la récupération des données utilisateur.");
-
- return;
- }
-
- const checkboxWrappers = Array.from(document.querySelectorAll('[class^="checkbox-wrapper-"]'));
- const checkboxes = checkboxWrappers.map(wrapper => wrapper.querySelector('input[type="checkbox"]'));
- const regions = checkboxWrappers.map(wrapper => wrapper.querySelector('.checkboxRegion').textContent);
-
- // Initialize checkboxes
- checkboxes.forEach((checkbox, index) => {
- if (regions[index] === regionUser) {
- checkbox.checked = true;
- }
- });
-
- // Fetch initial data
- try {
- const response = await fetch(`/historiqueParcours/${regionUser}`);
- const dataResponse = await response.json();
-
- if (dataResponse.valid) {
- tableData = dataResponse.data;
- populateParcoursTable(tableData);
- } else {
- displayError("Erreur lors de la récupération des parcours");
- }
- } catch (error) {
- displayError("Failed to fetch data. Please try again later.");
- }
-
- // Add event listeners to checkboxes
- checkboxes.forEach((checkbox, index) => {
- checkbox.addEventListener('change', async (e) => {
- const region = regions[index];
-
- if (checkbox.checked) {
- try {
- const response = await fetch(`/historiqueParcours/${region}`);
- const dataResponse = await response.json();
-
- if (dataResponse.valid) {
- tableData.push(...dataResponse.data);
- populateParcoursTable(tableData);
- } else {
- displayError("Erreur lors de la récupération des parcours");
- }
- } catch (error) {
- displayError("Failed to fetch data. Please try again later.");
- }
+ // Fonction pour désactiver/activer les boutons d'export
+ function setExportButtonsState(disabled) {
+ isExporting = disabled;
+ const buttons = ["#exportCSV", "#exportCSVFilter", "#exportXlxs", "#exportXlxsFilter"];
+ buttons.forEach(selector => {
+ const $btn = $(selector);
+ $btn.prop("disabled", disabled);
+ if (disabled) {
+ $btn.css("opacity", "0.5");
+ $btn.css("cursor", "not-allowed");
} else {
- removeRegionFromTableData(region);
- populateParcoursTable(tableData);
+ $btn.css("opacity", "1");
+ $btn.css("cursor", "pointer");
}
});
+ }
+
+ // Exports CSV/XLSX
+ $("#exportCSV").on("click", function () {
+ if (isExporting) return;
+
+ const dt = $("#historiqueParcours").DataTable();
+ if (!dt) {
+ displayError("Impossible d'accéder à la table de données.");
+ return;
+ }
+
+ const settings = dt.settings()[0];
+ if (!settings || !settings.aoColumns) {
+ displayError("Structure de données invalide.");
+ return;
+ }
+
+ setExportButtonsState(true);
+
+ const payload = {
+ mode: "full", // export total
+ search: { value: "" },
+ columns: settings.aoColumns.map((c, i) => ({
+ data: i,
+ search: { value: "" }
+ })),
+ // on garde l'ordre actuel pour la récuperation
+ order: (dt.order() || []).map(([col, dir]) => ({ column: col || 0, dir: dir || "asc" }))
+ };
+
+ fetch("/historiqueParcours/export/csv", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify(payload),
+ })
+ .then(resp => {
+ if (!resp.ok) throw new Error("Export CSV (complet) impossible");
+
+ return resp.blob();
+ })
+ .then(blob => {
+ const url = URL.createObjectURL(blob);
+ const a = document.createElement("a");
+ a.href = url;
+ a.download = "historique_parcours_complet.csv";
+ document.body.appendChild(a);
+ a.click();
+ URL.revokeObjectURL(url);
+ a.remove();
+ setExportButtonsState(false);
+ })
+ .catch((err) => {
+ displayError("Export CSV (complet) impossible");
+ setExportButtonsState(false);
+ });
});
- const removeRegionFromTableData = (region) => {
- tableData = tableData.filter(item => item["@expand"]?.dernierUtilisateur?.["@expand"]?.region?.nom !== (region === regionUser ? regionUser : region));
- };
+
+ $("#exportCSVFilter").on("click", function () {
+ if (isExporting) return;
+
+ const dt = $("#historiqueParcours").DataTable();
+ if (!dt) {
+ displayError("Impossible d'accéder à la table de données.");
+ return;
+ }
+
+ const settings = dt.settings()[0];
+ if (!settings || !settings.aoColumns) {
+ displayError("Structure de données invalide.");
+ return;
+ }
+
+ setExportButtonsState(true);
+
+ const payload = {
+ mode: "filtered", // export avec les filtres/colonnes/tri actuels
+ search: { value: dt.search() || "" }, // recherche globale
+ columns: settings.aoColumns.map((c, i) => ({
+ data: i,
+ search: { value: dt.column(i).search() || "" } // filtres par colonne
+ })),
+ order: (dt.order() || []).map(([col, dir]) => ({ column: col || 0, dir: dir || "asc" }))
+ };
+
+ fetch("/historiqueParcours/export/csv", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify(payload),
+ })
+ .then(resp => {
+ if (!resp.ok) throw new Error("Export CSV (filtré) impossible");
+ return resp.blob();
+ })
+ .then(blob => {
+ const url = URL.createObjectURL(blob);
+ const a = document.createElement("a");
+ a.href = url;
+ a.download = "historique_parcours_filtre.csv";
+ document.body.appendChild(a);
+ a.click();
+ URL.revokeObjectURL(url);
+ a.remove();
+ setExportButtonsState(false);
+ })
+ .catch((err) => {
+ displayError("Export CSV (filtré) impossible");
+ setExportButtonsState(false);
+ });
+ });
+
+
+ $("#exportXlxs").on("click", function () {
+ if (isExporting) return;
+
+ const dt = $("#historiqueParcours").DataTable();
+ if (!dt) {
+ displayError("Impossible d'accéder à la table de données.");
+ return;
+ }
+
+ const settings = dt.settings()[0];
+ if (!settings || !settings.aoColumns) {
+ displayError("Structure de données invalide.");
+ return;
+ }
+
+ setExportButtonsState(true);
+
+ const payload = {
+ mode: "full",
+ search: { value: "" },
+ columns: settings.aoColumns.map((c, i) => ({ data: i, search: { value: "" } })),
+ order: (dt.order() || []).map(([col, dir]) => ({ column: col || 0, dir: dir || "asc" }))
+ };
+
+ fetch("/historiqueParcours/export/xls", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify(payload),
+ })
+ .then(resp => { if (!resp.ok) throw new Error(); return resp.blob(); })
+ .then(blob => {
+ const url = URL.createObjectURL(blob);
+ const a = document.createElement("a");
+ a.href = url; a.download = "historique_parcours_complet.xls";
+ document.body.appendChild(a); a.click();
+ URL.revokeObjectURL(url); a.remove();
+ setExportButtonsState(false);
+ })
+ .catch((err) => {
+ displayError("Export XLS (complet) impossible");
+ setExportButtonsState(false);
+ });
+ });
+
+
+ $("#exportXlxsFilter").on("click", function () {
+ if (isExporting) return;
+
+ const dt = $("#historiqueParcours").DataTable();
+ if (!dt) {
+ displayError("Impossible d'accéder à la table de données.");
+ return;
+ }
+
+ const settings = dt.settings()[0];
+ if (!settings || !settings.aoColumns) {
+ displayError("Structure de données invalide.");
+ return;
+ }
+
+ setExportButtonsState(true);
+
+ const payload = {
+ mode: "filtered", // export avec les filtres/colonnes/tri actuels
+ search: { value: dt.search() || "" }, // recherche globale
+ columns: settings.aoColumns.map((c, i) => ({
+ data: i,
+ search: { value: dt.column(i).search() || "" } // filtres par colonne
+ })),
+ order: (dt.order() || []).map(([col, dir]) => ({ column: col || 0, dir: dir || "asc" }))
+ };
+
+ fetch("/historiqueParcours/export/xls", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify(payload),
+ })
+ .then(resp => {
+ if (!resp.ok) throw new Error("Export XLS (filtré) impossible");
+ return resp.blob();
+ })
+ .then(blob => {
+ const url = URL.createObjectURL(blob);
+ const a = document.createElement("a");
+ a.href = url;
+ a.download = "historique_parcours_filtre.xls";
+ document.body.appendChild(a);
+ a.click();
+ URL.revokeObjectURL(url);
+ a.remove();
+ setExportButtonsState(false);
+ })
+ .catch((err) => {
+ displayError("Export XLS (filtré) impossible");
+ setExportButtonsState(false);
+ });
+ });
+
+
+ // Délégation pour la génération de projet
+ $("#historiqueParcours").on("click", "button#btnGenerate", function () {
+ const numParcours = $(this).data("num-parcours");
+ const produit = $(this).data("produit");
+ generateProject(numParcours, produit);
+ });
});
-const removeRegionFromTableData = (region) => {
- if (region === regionUser) {
- tableData = tableData.filter(item => item["@expand"]?.dernierUtilisateur?.["@expand"]?.region?.nom !== regionUser);
- } else {
- tableData = tableData.filter(item => item["@expand"]?.dernierUtilisateur?.["@expand"]?.region?.nom !== region);
- }
-};
+/* =========================
+ * Helpers spécifiques server-side
+ * ========================= */
-async function fetchUserDetails(matriculeUser) {
- try {
- const response = await fetch(`/user/read/matricule/${matriculeUser}`);
- const data = await response.json();
-
- return data.valid ? data : null;
- } catch (error) {
- displayError(`Erreur lors de la récupération du contrat avec le matricule ${matriculeUser} :`, error);
-
- return null;
- }
-}
+// Initialisation DataTables en server-side (recherche globale + par colonnes + tri + pagination)
+function initServerSideDataTable() {
+ let inflightController = null;
-function populateParcoursTable(parcoursData) {
- //initialise
const table = $("#historiqueParcours").DataTable({
+ processing: true,
+ serverSide: true,
searching: true,
paging: true,
orderCellsTop: true,
fixedHeader: true,
- responsive: true,
- pageLength: 5,
+ responsive: false,
+ autoWidth: false,
+ scrollX: false,
+ pageLength: 10,
retrieve: true,
- columnDefs: [
- {
- type: "date-uk",
- targets: 10
- },
- {
- type: "date-eu",
- targets: 4
- },
- ],
order: [[0, "desc"]],
+ searchDelay: 350,
language: {
search: "Rechercher",
lengthMenu: "Afficher _MENU_ entrées par page",
info: "Affichage de _START_ à _END_ sur _TOTAL_ entrées",
infoEmpty: "Affichage de 0 à 0 sur 0 entrée",
infoFiltered: "(filtré de _MAX_ entrées au total)",
- paginate: {
- first: "Début",
- previous: "Précédent",
- next: "Suivant",
- last: "Fin",
- },
+ paginate: { first: "Début", previous: "Précédent", next: "Suivant", last: "Fin" },
},
+
+ ajax: function (data, callback) {
+ const body = {
+ draw: data.draw || 1,
+ start: data.start || 0,
+ length: data.length || 10,
+ order: data.order || [],
+ columns: data.columns || [],
+ search: data.search || { value: "" },
+ };
+
+ if (inflightController) inflightController.abort(); // action en cours
+ inflightController = new AbortController();
+ const currentController = inflightController;
+
+ fetch("/historiqueParcours/datatable", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify(body),
+ signal: currentController.signal,
+ })
+ .then(res => {
+ // Vérifier si la requête a été annulée
+ if (currentController.signal.aborted || inflightController !== currentController) {
+ return null;
+ }
+ if (!res.ok) throw new Error(`HTTP ${res.status}`);
+ return res.json();
+ })
+ .then(payload => {
+ // Vérifier si la requête a été annulée
+ if (currentController.signal.aborted || inflightController !== currentController) {
+ return;
+ }
+ if (!payload || typeof payload !== 'object') {
+ throw new Error("Réponse invalide du serveur");
+ }
+ callback({
+ draw: payload.draw || 0,
+ recordsTotal: payload.recordsTotal || 0,
+ recordsFiltered: payload.recordsFiltered || payload.recordsTotal || 0,
+ data: Array.isArray(payload.data) ? payload.data : []
+ });
+ })
+ .catch(err => {
+ // Ignorer silencieusement toutes les erreurs d'abort
+ if (err && (err.name === "AbortError" || err.name === "DOMException")) {
+ return;
+ }
+ // Vérifier aussi si le signal a été aborted
+ if (currentController.signal.aborted || inflightController !== currentController) {
+ return;
+ }
+ // Seulement afficher une erreur si ce n'est PAS un abort
+ displayError("Failed to fetch data. Please try again later.");
+ callback({ draw: 0, recordsTotal: 0, recordsFiltered: 0, data: [] });
+ });
+ },
+
initComplete: function () {
- const table = this.api();
+ const api = this.api();
+
+ // Recherche globale : debounce y compris ENTER (plus de bypass immédiat)
+ const $globalInput = $('div.dataTables_filter input[type="search"]');
+ const $filterLabel = $globalInput.closest('label');
+ $globalInput.off('.DT'); // nettoie handlers datatables
+ const debouncedGlobal = debounce((v) => {
+ api.search(v);
+ api.ajax.reload();
+ }, 350);
+
+ // Fonction pour gérer l'affichage du texte "Rechercher"
+ function toggleSearchPlaceholder() {
+ if ($globalInput.val().trim() !== '') {
+ $filterLabel.addClass('has-value');
+ } else {
+ $filterLabel.removeClass('has-value');
+ }
+ }
+
+ $globalInput.on('input keyup keydown', function () {
+ debouncedGlobal(this.value);
+ toggleSearchPlaceholder();
+ });
+
+ // Vérifier l'état initial
+ toggleSearchPlaceholder();
+
+ // Recherche par colonne avec DEBOUNCE (ENTER inclus)
+ const debouncedColSearch = debounce((i, val) => {
+ api.column(i).search(val);
+ api.ajax.reload();
+ }, 350);
+
$("#historiqueParcours thead tr:eq(1) th").each(function (i) {
- $("input", this).on("keyup change", function () {
- if (table.column(i).search() !== this.value) {
- table.column(i).search(this.value).draw();
- }
+ $("input", this).on("input keyup keydown change", function () {
+ debouncedColSearch(i, this.value);
});
});
- table.on("responsive-resize", function (e, datatable, columns) {
- // Loop over each column to see if it's visible
- for (let i = 0; i < columns.length; i++) {
- if (columns[i]) {
- $(table.column(i).header()).show();
- $(table.column(i).footer()).show();
- $($("#historiqueParcours thead tr:eq(1) th")[i]).show();
+
+
+ $("#toggleSearch").on("click", function () {
+ const row = $("#historiqueParcours thead tr:eq(1)");
+ row.toggle();
+
+ if (row.is(":visible")) {
+ $(this).text("ENLEVER LA RECHERCHE PAR COLONNE");
} else {
- $(table.column(i).header()).hide();
- $(table.column(i).footer()).hide();
- $($("#historiqueParcours thead tr:eq(1) th")[i]).hide();
+ $(this).text("ACTIVER LA RECHERCHE PAR COLONNE");
}
- }
- });
- $("#divToggleSearch").on("click", function () {
- $("#historiqueParcours thead tr:eq(1)").toggle();
});
+
+ // Cacher la 2e ligne au départ
$("#historiqueParcours thead tr:eq(1)").hide();
},
+
+ // --- Ajout bouton détails en 1re colonne
+ columnDefs: [
+ {
+ targets: 0,
+ render: function (data, type, row) {
+ const np = String(data ?? "");
+ const numPacours = np.replace(/&/g,"&").replace(//g,">");
+
+
+ return `
+
+ ?
+ ${numPacours}
+
+ `;
+
+
+ }
+ },
+ { type: "date-eu", targets: 1 }, // Date de Création (colonne 1)
+ {
+ // Appliquer la classe nc-value aux cellules contenant "NC"
+ targets: "_all",
+ createdCell: function (td, cellData, rowData, row, col) {
+ // Exclure la première colonne (bouton détails) et les deux dernières (boutons)
+ if (col !== 0 && col < rowData.length - 2) {
+ const cellText = String(cellData || "").trim();
+ if (cellText === "NC") {
+ td.classList.add("nc-value");
+ }
+ }
+ }
+ },
+ { responsivePriority: 1, targets: -1 },
+ { responsivePriority: 2, targets: -2 }
+ ],
});
- //clear existing data
- table.clear();
- let row = null;
- let tableRow = null;
-
- //generate Project
- //loop on parcours
- parcoursData.forEach((parcours) => {
- const contratId = parcours["@expand"]?.contrat?.id;
- const contrat = contratId ? parcours["@expand"].contrat : null;
- const client = contrat ? contrat.client : null;
- const lastUser = parcours["@expand"]?.dernierUtilisateur;
- const region = lastUser["@expand"]?.region;
- const produit = contrat ? (contrat.produit ? contrat.produit : "NC") : "NC"
-
- row = [
- parcours.numParcours,
- new Date(parcours.created).toLocaleDateString("fr-FR", {
- day: "numeric",
- month: "numeric",
- year: "numeric"
- }),
- parcours["@expand"].dernierUtilisateur?.matricule || "NC",
- parcours["@expand"].dernierUtilisateur ? `${parcours["@expand"].dernierUtilisateur.prenom} ${parcours["@expand"].dernierUtilisateur.nom}` : "NC",
- region ? region.nom : "NC",
- contrat ? (contrat.numSaisine ? contrat.numSaisine : "NC") : "NC",
- contrat ? (contrat.numContrat ? contrat.numContrat : "NC") : "NC",
- contrat ? (contrat.produit ? contrat.produit : "NC") : "NC",
- contrat ? (contrat.type ? contrat.type : "NC") : "NC",
- contrat ? contrat["@expand"]?.intermediaire?.numPortefeuille || "NC" : "NC",
- contrat ? contrat["@expand"]?.intermediaire?.nom || "NC" : "NC",
- client ? client.numClient || "NC" : "NC",
- client ? client.nom || "NC" : "NC",
- `
- `,
- `
- `,
- ];
- tableRow = table.row.add(row).node();
-
- // add class NC to style "Non communiqué"
- $(tableRow)
- .find("td")
- .each(function (colIndex) {
- if ($(this).text() === "NC") {
- $(this).addClass("nc-value");
+ // --- Toggle des détails
+ $('#historiqueParcours tbody').on('click', '.btn-row-details', function (e) {
+ e.preventDefault();
+ e.stopPropagation();
+
+ const api = $('#historiqueParcours').DataTable();
+ const $tr = $(this).closest('tr');
+
+ // si c'est une ligne enfant (responsive), remonter à la parent
+ const row = api.row($tr.hasClass('child') ? $tr.prev() : $tr);
+
+ if (row.child.isShown()) {
+ row.child.hide();
+ // change icône
+ this.textContent = "?";
+ this.style.background = "#e74c3c";
+ return;
+ }
+
+ // récupérer le numParcours depuis la 1re cellule
+ const raw = row.data()?.[0] ?? "";
+ const tmp = document.createElement('div');
+ tmp.innerHTML = String(raw);
+ const numParcours = tmp.textContent.replace("?", "").trim();
+ if (!numParcours) return;
+
+ row.child('Chargement des détails…
').show();
+ this.textContent = "?";
+ this.style.background = "#c0392b";
+
+ fetch(`/historiqueParcours/details/${encodeURIComponent(numParcours)}`)
+ .then(r => {
+ if (!r.ok) throw new Error(`HTTP ${r.status}`);
+ return r.json();
+ })
+ .then(payload => {
+ if (!payload || typeof payload !== 'object') {
+ throw new Error("Réponse invalide");
}
+ if (!payload.valid) {
+ row.child(createMessageBox('error', 'Impossible de charger les détails',
+ 'Une erreur est survenue lors du chargement des détails du parcours.'));
+ this.textContent = "?";
+ this.style.background = "#e74c3c";
+ return;
+ }
+ row.child(formatDetailsPanel(payload));
+ })
+ .catch(() => {
+ row.child(createMessageBox('error', 'Erreur de chargement',
+ 'Une erreur réseau est survenue lors du chargement des détails.'));
+ this.textContent = "?";
+ this.style.background = "#e74c3c";
});
});
- table.draw();
-
- // for "afficher" entrées par page
- $("#historiqueParcours_length select").val("10").trigger("change");
+ return table;
}
-function downloadExcel(applyFilters) {
- const table = $("#historiqueParcours").DataTable(); // Get the DataTable instance
- const headers = $("#historiqueParcours th").filter(function () {
- return !$(this).hasClass("no-export");}).map(function () {
- return $(this).text().trim();
- }).get();
+/* =========================
+ * Fonctions annexes importantes
+ * ========================= */
- const data = [];
- const rowsData = applyFilters ? table.rows({ filter: "applied" }).data() : table.rows().data();
- rowsData.each(function (row) {
- const filteredRow = $(row).filter(function (index) {
- return !$("#historiqueParcours th").eq(index).hasClass("no-export");
- });
+async function fetchUserDetails(matriculeUser) {
+ try {
+ const response = await fetch(`/user/read/matricule/${matriculeUser}`);
+ const data = await response.json();
- data.push(filteredRow.get());
- });
-
- const ws = XLSX.utils.aoa_to_sheet([headers, ...data]);
- const wb = XLSX.utils.book_new();
- XLSX.utils.book_append_sheet(wb, ws, "Historique Parcours");
-
- const wbout = XLSX.write(wb, { bookType: "xlsx", type: "binary" });
-
- function s2ab(s) {
- const buf = new ArrayBuffer(s.length);
- const view = new Uint8Array(buf);
- for (let i = 0; i < s.length; i++) view[i] = s.charCodeAt(i) & 0xff;
-
- return buf;
+ return data.valid ? data : null;
+ } catch (error) {
+ displayError(`Erreur lors de la récupération du contrat avec le matricule ${matriculeUser} :`, error);
+ return null;
}
-
- const now = new Date();
- const pad = (num) => String(num).padStart(2, "0");
- const formattedDate = `${pad(now.getDate())}${pad(now.getMonth() + 1)}${now.getFullYear()}${pad(now.getHours())}${pad(now.getMinutes())}`;
-
- const blob = new Blob([s2ab(wbout)], { type: "application/octet-stream" });
- const link = document.createElement("a");
- link.href = URL.createObjectURL(blob);
- link.download = `historique_parcours_${formattedDate}.xlsx`;
-
- document.body.appendChild(link);
- link.click();
- document.body.removeChild(link);
-}
-
-function downloadCSV(applyFilters) {
- const table = $("#historiqueParcours").DataTable();
- const headers = $("#historiqueParcours th").filter(function () {
- return !$(this).hasClass("no-export");}).map(function () {
- return $(this).text().trim();
- }).get();
-
- let csvContent = "data:text/csv;charset=utf-8," + headers.join(";") + "\n";
- const rowsData = applyFilters ? table.rows({ filter: "applied" }).data() : table.rows().data();
-
- rowsData.each(function (row) {
- let filteredRow = row.filter((cell, index) => {
- return !$(`#historiqueParcours th`).eq(index).hasClass("no-export");
- });
- csvContent += filteredRow.join(";") + "\n";
- });
-
- const encodedUri = encodeURI(csvContent);
- const link = document.createElement("a");
- link.setAttribute("href", encodedUri);
- link.setAttribute("download", "historique_parcours.csv");
- document.body.appendChild(link);
- link.click();
}
async function generateProject(numParcours, produit) {
try {
- const response = await fetch(`/generate/${produit}/projet/${numParcours}`, {
+ if (!numParcours || !produit) {
+ displayError("Paramètres manquants pour la génération du projet.");
+ return;
+ }
+
+ const response = await fetch(`/generate/${produit}/projet/${encodeURIComponent(numParcours)}`, {
method: "POST",
- headers: { "Content-Type": "application/json"},
+ headers: { "Content-Type": "application/json" },
});
-
if (!response.ok) throw new Error("Erreur réseau ou serveur");
const disposition = response.headers.get("content-disposition");
- const filename = disposition.split(";")[1].trim().split("=")[1];
+ let filename = "projet.docx";
+ if (disposition) {
+ const parts = disposition.split(";");
+ if (parts.length > 1) {
+ const filenamePart = parts[1].trim();
+ if (filenamePart.startsWith("filename=")) {
+ filename = filenamePart.split("=")[1]?.replace(/"/g, "") || filename;
+ }
+ }
+ }
const blob = await response.blob();
+ if (!blob || blob.size === 0) {
+ throw new Error("Fichier vide reçu");
+ }
+
const url = window.URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
@@ -329,56 +555,304 @@ async function generateProject(numParcours, produit) {
window.URL.revokeObjectURL(url);
a.remove();
} catch (error) {
- console.error("Erreur lors de la génération du projet:", error);
+ displayError("Erreur lors de la génération du projet : " + (error?.message || "Erreur inconnue"));
}
}
-// Fonction pour décoder le JWT
-function parseJwt(token) {
- try {
- const base64Url = token.split(".")[1];
- const base64 = base64Url.replace(/-/g, "+").replace(/_/g, "/");
- const jsonPayload = decodeURIComponent(atob(base64).split("").map(function (c) { return "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2);}).join(""));
- return JSON.parse(jsonPayload);
- } catch (error) {
- console.error("Erreur lors du décodage du token:", error);
+// ---------- Helpers rendu ----------
+// Les fonctions kv, fmtDate, gridWrap2cols, debounce, parseJwt et displayError sont dans global.js
- return null;
+//formatDetailsPanel : rend l'HTML pour la récuperation des données par parcours
+function formatDetailsPanel(payload) {
+ const prodKey = (payload.produit || "").toUpperCase();
+ const prod = payload.produitRecord || null;
+ const contrat = payload.contrat || null;
+
+ let body = "";
+ if (prodKey === "TPPC") body = sectionTPPC(prod, contrat);
+ else if (prodKey === "RC") body = sectionRC(prod, contrat);
+ else if (prodKey === "FAC") body = sectionFAC(prod, contrat);
+ else body = createMessageBox('warn', 'Produit non renseigné', 'Le type de produit n\'a pas été spécifié pour ce parcours.');
+
+ return `
+
+
Détails ${prodKey || ""}
+ ${body}
+
+ `;
+}
+
+
+// Retourne le tarif en fonction du type de tarif
+function buildTarifBlock({ tarifRef, ht, ttc }) {
+ if (tarifRef && String(tarifRef).trim() !== '') {
+ return kv("Tarif de référence", tarifRef);
}
+ const htStr = (ht !== undefined && ht !== null) ? formatEuro(ht) : "NC";
+ const ttcStr = (ttc !== undefined && ttc !== null) ? formatEuro(ttc) : "NC";
+ return kv("Tarif commercial HT / TTC", `${htStr} / ${ttcStr}`);
}
-//generagte Project
-$("#historiqueParcours").on("click", "button#btnGenerate", function() {
- const numParcours = $(this).data("num-parcours");
- const produit = $(this).data("produit");
-
- generateProject(numParcours, produit);
-});
-
-//export CSV
-$("#exportCSV").on("click", function () {
- downloadCSV(false);
-});
-
-//export CSV with filter
-$("#exportCSVFilter").on("click", function () {
- downloadCSV(true);
-});
-
-//export to excel
-$("#exportXlxs").on("click", function () {
- downloadExcel(false);
-});
-
-// export to excel using Filter
-$("#exportXlxsFilter").on("click", function () {
- downloadExcel(true);
-});
-
-
-function displayError(message) {
- const errorElement = document.getElementById("error");
-
- errorElement.textContent = message;
- errorElement.style.display = "block";
+function safeCA(value) {
+ return (value === null || value === undefined || value === '' || value === 'NC')
+ ? "NC"
+ : formatEuro(value);
+}
+
+
+// ---------- Sections produit ----------
+
+//sectionTTPC : récupere les détails d'un parcours TPPC pour le mettre en forme (2 colonnes)
+// ---------- TPPC ----------
+function sectionTPPC(produit, contrat) {
+ if (!produit) {
+ if (contrat) {
+ return createMessageBox(
+ 'info',
+ 'Informations non disponibles',
+ 'Les informations sur ce Parcours TPPC ne sont pas encore disponibles. La fiche TPPC n\'a pas encore été créée pour ce parcours.'
+ );
+ }
+ return createMessageBox(
+ 'error',
+ 'Fiche TPPC introuvable',
+ 'Impossible de récupérer les informations de la fiche TPPC pour ce parcours.'
+ );
+ }
+
+ const tarif = produit?.["@expand"]?.tarif || null; // tppctarif
+ const projet = produit?.["@expand"]?.projet || null; // tppcprojet
+
+ // 1) CA
+ const caStr = safeCA(produit.ca);
+
+ // 2) Type de cotisation
+ let typeCotStr = "NC";
+ if (projet?.typeCot) {
+ typeCotStr = (projet.typeCot === "revisable") ? "Révisable"
+ : (projet.typeCot === "forfaitaire") ? "Forfaitaire"
+ : projet.typeCot;
+ }
+
+ // 3) Activité
+ const activiteAssuree = produit.actAssuree || "NC";
+ const nbVehicules = (produit.nbVehic !== undefined && produit.nbVehic !== null) ? String(produit.nbVehic) : "NC";
+
+ // 4) Marchandises / Garanties
+ const garanties = Array.isArray(produit.garanties)
+ ? produit.garanties.join(", ")
+ : (produit.garanties || "NC");
+
+ const extensions = [];
+ if (produit.marCiternes) extensions.push("Citernes");
+ if (produit.marDenreesSousTemp) extensions.push("Denrées sous température");
+ if (produit.marAnimaux) extensions.push("Animaux vivants");
+ if (produit.marFranchise) extensions.push("Franchise");
+ const extensionsStr = extensions.length > 0 ? extensions.join(", ") : "Aucune";
+
+ // 5) Zones (supprimer pour TPPC)
+ const zonesStr = "NC";
+
+ // 6) Dates (projet)
+ const dateEffet = projet?.dateEffet ? fmtDate(projet.dateEffet, false) : "NC";
+ const dateEcheance = projet?.dateEcheance ? fmtDate(projet.dateEcheance, false) : "NC";
+ const dateFin = projet?.dateFin ? fmtDate(projet.dateFin, false) : "NC";
+ const datesStr = `Effet: ${dateEffet} / Échéance: ${dateEcheance} / Fin: ${dateFin}`;
+
+ // 7) Tarif (ref ou com HT/TTC)
+ const blocTarif = buildTarifBlock({
+ tarifRef: tarif?.tarifRef,
+ ht: (produit.primeHT ?? produit.cotTotalHT ?? null),
+ ttc: (produit.primeTTC ?? produit.cotTotalTTC ?? null)
+ });
+
+ // Disposition en 2 colonnes
+ const gauche = [
+ kv("Chiffre d'affaires", caStr),
+ kv("Type de cotisation", typeCotStr),
+ kv("Activité assurée", activiteAssuree),
+ kv("Nombre de véhicules", nbVehicules),
+ kv("Garanties", garanties),
+ kv("Extensions de garanties", extensionsStr),
+ ].join("");
+
+ const droite = [
+ kv("Zones", zonesStr),
+ kv("Dates", datesStr),
+ blocTarif,
+ ].join("");
+
+ return gridWrap2cols(gauche, droite);
+}
+
+
+//sectionRC : récupere les détails d'un parcours RC pour le mettre en forme (2 colonnes)
+// ---------- RC ----------
+function sectionRC(produit, contrat) {
+ if (!produit && contrat) {
+ return createMessageBox(
+ 'info',
+ 'Informations non disponibles',
+ 'Les informations sur ce Parcours RC ne sont pas encore disponibles. La fiche RC n\'a pas encore été créée pour ce parcours.'
+ );
+ }
+ if (!produit) {
+ return createMessageBox(
+ 'dev',
+ 'Fonctionnalité en cours de développement',
+ 'L\'affichage des détails pour les parcours RC n\'est pas encore disponible. Cette fonctionnalité sera bientôt implémentée.'
+ );
+ }
+
+ // 1) CA
+ const caStr = safeCA(produit.ca);
+
+ // 2) Type de cotisation
+ let typeCotStr = "NC";
+ if (produit.typeCot) {
+ typeCotStr = (produit.typeCot === "revisable") ? "Révisable"
+ : (produit.typeCot === "forfaitaire") ? "Forfaitaire"
+ : produit.typeCot;
+ }
+
+ // 3) Activités
+ const activites = [];
+ if (produit.actVoiturier) activites.push("Voiturier");
+ if (produit.actLoueur) activites.push("Loueur");
+ if (produit.actMultimodal) activites.push("Multimodal");
+ if (produit.actDouane) activites.push("Douane");
+ if (produit.actLevageur) activites.push("Levageur");
+ if (produit.actTransitaire) activites.push("Transitaire");
+ const activiteAssuree = activites.length > 0 ? activites.join(", ") : "NC";
+
+ // 4) Marchandises
+ const garanties = [];
+ if (produit.marRoulant) garanties.push("Roulant");
+ if (produit.marEngins) garanties.push("Engins");
+ if (produit.marPerissable) garanties.push("Périssable");
+ if (produit.marOrdinaire) garanties.push("Ordinaire");
+ if (produit.marAnimaux) garanties.push("Animaux");
+ if (produit.marCiterne)garanties.push("Citerne");
+ if (produit.marBeton) garanties.push("Béton");
+ if (produit.marExceptionnels) garanties.push("Exceptionnels");
+ if (produit.marMobilerUsag) garanties.push("Mobilier usagé");
+ if (produit.marVrac) garanties.push("Vrac");
+ if (produit.marRoulantDem) garanties.push("Roulant déménagement");
+ const garantiesStr = garanties.length > 0 ? garanties.join(", ") : "NC";
+
+ // 5) Zones
+ const zones = [];
+ if (produit.zone1) zones.push("1");
+ if (produit.zone2) zones.push("2");
+ if (produit.zone3) zones.push("3");
+ if (produit.zone4) zones.push("4");
+ if (produit.zone5) zones.push("5");
+ if (produit.zone6) zones.push("6");
+ const zonesStr = zones.length > 0 ? zones.join(", ") : "NC";
+
+ // 6) Dates
+ const dateEffet = produit.dateEffet ? fmtDate(produit.dateEffet, false) : "NC";
+ const dateEcheance = produit.dateEcheance ? fmtDate(produit.dateEcheance, false) : "NC";
+ const dateFin = produit.dateFin ? fmtDate(produit.dateFin, false) : "NC";
+ const datesStr = `Effet: ${dateEffet} / Échéance: ${dateEcheance} / Fin: ${dateFin}`;
+
+ // 7) Tarif
+ const tarif = produit?.["@expand"]?.tarif || null;
+ const blocTarif = buildTarifBlock({
+ tarifRef: tarif?.tarifRef,
+ ht: produit.cotTotalHT ?? null,
+ ttc: produit.cotTotalTTC ?? null
+ });
+
+ const gauche = [
+ kv("Chiffre d'affaires", caStr),
+ kv("Type de cotisation", typeCotStr),
+ kv("Activités assurées", activiteAssuree),
+ kv("Marchandises", garantiesStr),
+ ].join("");
+
+ const droite = [
+ kv("Zones", zonesStr),
+ kv("Dates", datesStr),
+ blocTarif,
+ ].join("");
+
+ return gridWrap2cols(gauche, droite);
+}
+
+
+//sectionFAC : récupere les détails d'un parcours FAC pour le mettre en forme (2 colonnes)
+// ---------- FAC ----------
+function sectionFAC(produit, contrat) {
+ if (!produit && contrat) {
+ return createMessageBox(
+ 'info',
+ 'Informations non disponibles',
+ 'Les informations sur ce Parcours FAC ne sont pas encore disponibles. La fiche FAC n\'a pas encore été créée pour ce parcours.'
+ );
+ }
+ if (!produit) {
+ return createMessageBox(
+ 'dev',
+ 'Fonctionnalité en cours de développement',
+ 'L\'affichage des détails pour les parcours FAC n\'est pas encore disponible. Cette fonctionnalité sera bientôt implémentée.'
+ );
+ }
+
+ // 1) CA
+ const caStr = safeCA(produit.ca);
+
+ // 2) Type de cotisation
+ const typeCotStr = "NC";
+
+ // 3) Activité
+ const activiteAssuree = produit.actAssure || "NC";
+
+ // 4) Garanties (modes de transport déclarés)
+ const garanties = [];
+ if (produit.terrestre && produit.terrestre !== "NC" && produit.terrestre !== "") garanties.push("Terrestre");
+ if (produit.maritime && produit.maritime !== "NC" && produit.maritime !== "") garanties.push("Maritime");
+ if (produit.aerien && produit.aerien !== "NC" && produit.aerien !== "") garanties.push("Aérien");
+ if (produit.postal && produit.postal !== "NC" && produit.postal !== "") garanties.push("Postal");
+ if (produit.fluvial && produit.fluvial !== "NC" && produit.fluvial !== "") garanties.push("Fluvial");
+ const garantiesStr = garanties.length > 0 ? garanties.join(", ") : "NC";
+
+ // 5) Zones
+ const zones = [];
+ if (produit.zone1) zones.push("1");
+ if (produit.zone2) zones.push("2");
+ if (produit.zone3) zones.push("3");
+ if (produit.zone4) zones.push("4");
+ if (produit.zone5) zones.push("5");
+ if (produit.zone6) zones.push("6");
+ const zonesStr = zones.length > 0 ? zones.join(", ") : "NC";
+
+ // 6) Dates
+ const dateEffet = produit.dateEffet ? fmtDate(produit.dateEffet, false) : "NC";
+ const dateEcheance = produit.dateEcheance ? fmtDate(produit.dateEcheance, false) : "NC";
+ const dateFin = produit.dateFin ? fmtDate(produit.dateFin, false) : "NC";
+ const datesStr = `Effet: ${dateEffet} / Échéance: ${dateEcheance} / Fin: ${dateFin}`;
+
+ // 7) Tarif
+ const tarif = produit?.["@expand"]?.tarif || null;
+ const blocTarif = buildTarifBlock({
+ tarifRef: tarif?.tarifRef,
+ ht: produit.cotAnnuelleHT ?? null,
+ ttc: produit.cotAnnuelleTTC ?? null
+ });
+
+ const gauche = [
+ kv("Chiffre d'affaires", caStr),
+ kv("Type de cotisation", typeCotStr),
+ kv("Activité assurée", activiteAssuree),
+ kv("Garanties", garantiesStr),
+ ].join("");
+
+ const droite = [
+ kv("Zones", zonesStr),
+ kv("Dates", datesStr),
+ blocTarif,
+ ].join("");
+
+ return gridWrap2cols(gauche, droite);
}
diff --git a/ecole/public/js/json/json-verif-form.js b/ecole/public/js/json/json-verif-form.js
index 0dbb1687..d625cf11 100644
--- a/ecole/public/js/json/json-verif-form.js
+++ b/ecole/public/js/json/json-verif-form.js
@@ -374,5 +374,26 @@ const validationRules = {
},
commentaire: {
required: true
+ },
+
+ //TARIF FAC
+ // franchiseTousCas: {
+ // range: {min: 0, max: 5000},
+ // errorMsg: "La franchise Tous Cas est inférieure à 1 ou supérieure à 5 000 €.",
+ // }
+
+ montant: {
+ range: {min: 0, max: 1000000},
+ errorMsg: "Le montant à Garantir est inférieur à 1 ou supérieur à 1 000 000 €.",
+ },
+
+ montantAchats: {
+ range: {min: 0, max: 1000000},
+ errorMsg: "Le montant à Garantir est inférieur à 1 ou supérieur à 1 000 000 €.",
+ },
+
+ montantVentes: {
+ range: {min: 0, max: 1000000},
+ errorMsg: "Le montant à Garantir est inférieur à 1 ou supérieur à 1 000 000 €.",
}
};
\ No newline at end of file
diff --git a/ecole/public/js/projet-form-fac.js b/ecole/public/js/projet-form-fac.js
new file mode 100644
index 00000000..7119756b
--- /dev/null
+++ b/ecole/public/js/projet-form-fac.js
@@ -0,0 +1,1218 @@
+function initSubmenuForm() {
+ // Accéder aux informations stockées du parcours
+ const parcours = JSON.parse(sessionStorage.getItem('parcours'));
+}
+
+// Exposer initSubmenuForm globalement pour y accéder depuis l'extérieur
+window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollution de l'espace global
+(function () {
+ // Variables globales du module
+ let parcours, contrat, client, intermediaire, fac, projet, tarif;
+
+ // Initialisation du formulaire et des données
+ function init() {
+ // Materialize init select
+ var select = document.querySelectorAll('select');
+ M.FormSelect.init(select);
+
+ // Materialize init Modal
+ var modals = document.querySelectorAll('.modal');
+ M.Modal.init(modals);
+
+ // Accéder aux informations stockées du parcours
+ parcours = JSON.parse(sessionStorage.getItem('parcours'));
+ contrat = JSON.parse(sessionStorage.getItem('contrat'));
+ client = contrat?.["@expand"]?.client || null;
+ intermediaire = contrat?.["@expand"]?.intermediaire || null;
+ fac = contrat?.["@expand"]?.enCours || null;
+ projet = fac?.["@expand"]?.projet || null;
+ tarif = fac?.["@expand"]?.tarif || null;
+
+ console.log("Initialisation pour formulaire projet :", parcours);
+
+ // Appel des différentes fonctions d'initialisation
+ setupEventListeners();
+ afficherFAC();
+ populateFormData();
+ updateSubmitButtonState('projetForm');
+ }
+
+ // Configuration des écouteurs d'événements
+ function setupEventListeners() {
+ document.getElementById('projetFormBtn').addEventListener('click', function (e) {
+ e.preventDefault()
+ submitForm()
+ });
+
+ document.getElementById('loadHistoriqueBtn').addEventListener('click', function () {
+ handleLoadHistoriqueBtn();
+ });
+
+ document.getElementById('btnAddAdditionnel').addEventListener('click', function () {
+ const nomValue = document.getElementById('nomAdditionnel').value || 'Non défini';
+ const adresseValue = document.getElementById('adresseAditionnel').value || 'Non défini';
+ const siretValue = document.getElementById('siretAdditionnel').value || 'Non défini';
+
+ addRowAdditionnel(nomValue, adresseValue, siretValue);
+ });
+
+ document.getElementById('btnMondeEntier').addEventListener('click', function (e) {
+ if (tarif) {
+ e.preventDefault()
+ openModaleModif()
+ } else {
+ document.getElementById('zone1').checked = true;
+ document.getElementById('zone1').disabled = true;
+ document.getElementById('zone2').checked = true;
+ document.getElementById('zone2').disabled = true;
+ document.getElementById('zone3').checked = true;
+ document.getElementById('zone4').checked = true;
+ document.getElementById('zone5').checked = true;
+ document.getElementById('zone6').checked = true;
+ }
+ });
+
+ document.getElementById('btnReset').addEventListener('click', function (e) {
+ if (tarif) {
+ e.preventDefault()
+ openModaleModif()
+ } else {
+ document.getElementById('zone1').checked = false;
+ document.getElementById('zone1').disabled = false;
+ document.getElementById('zone2').checked = false;
+ document.getElementById('zone2').disabled = false;
+ document.getElementById('zone3').checked = false;
+ document.getElementById('zone4').checked = false;
+ document.getElementById('zone5').checked = false;
+ document.getElementById('zone6').checked = false;
+ }
+ });
+
+ document.getElementById('btnZone1').addEventListener('click', function () {
+ const elem = document.getElementById('modalZone1');
+ const instance = M.Modal.getInstance(elem);
+ instance.open();
+ });
+
+ document.getElementById('btnZone2').addEventListener('click', function () {
+ const elem = document.getElementById('modalZone2');
+ const instance = M.Modal.getInstance(elem);
+ instance.open();
+ });
+
+ document.getElementById('btnZone3').addEventListener('click', function () {
+ const elem = document.getElementById('modalZone3');
+ const instance = M.Modal.getInstance(elem);
+ instance.open();
+ });
+
+ document.getElementById('btnZone4').addEventListener('click', function () {
+ const elem = document.getElementById('modalZone4');
+ const instance = M.Modal.getInstance(elem);
+ instance.open();
+ });
+
+ document.getElementById('btnZone5').addEventListener('click', function () {
+ const elem = document.getElementById('modalZone5');
+ const instance = M.Modal.getInstance(elem);
+ instance.open();
+ });
+
+ document.getElementById('btnZone6').addEventListener('click', function () {
+ const elem = document.getElementById('modalZone6');
+ const instance = M.Modal.getInstance(elem);
+ instance.open();
+ });
+
+ document.getElementById('btnZone7').addEventListener('click', function () {
+ const elem = document.getElementById('modalZoneExclus');
+ const instance = M.Modal.getInstance(elem);
+ instance.open();
+ });
+
+ document.getElementsByName('zone').forEach((zone) => {
+ zone.addEventListener('click', function (e) {
+ if (tarif) {
+ e.preventDefault()
+ openModaleModif()
+ }
+ })
+ })
+
+
+ document.getElementById('zone2').addEventListener('click', function (e) {
+ if (tarif) {
+ e.preventDefault()
+ } else {
+ if (document.getElementById('zone2').checked == true) {
+ document.getElementById('zone1').checked = true;
+ document.getElementById('zone1').disabled = true;
+ } else if (document.getElementById('zone2').checked == false) {
+ document.getElementById('zone1').checked = true;
+ document.getElementById('zone1').disabled = false;
+ }
+ }
+ });
+
+ document.getElementById('zone3').addEventListener('click', function () {
+ if (tarif) {
+ e.preventDefault()
+ } else {
+ if (document.getElementById('zone3').checked == true) {
+ document.getElementById('zone2').checked = true;
+ document.getElementById('zone1').checked = true;
+ document.getElementById('zone2').disabled = true;
+ document.getElementById('zone1').disabled = true;
+ } else if (document.getElementById('zone3').checked == false) {
+ document.getElementById('zone1').checked = true;
+ document.getElementById('zone1').disabled = true;
+ document.getElementById('zone2').checked = true;
+ document.getElementById('zone2').disabled = false;
+ }
+ }
+ });
+
+ document.getElementsByName('fract').forEach((radio) => {
+ radio.addEventListener('change', function () {
+ const cotHT = parseFloat(document.getElementById("cotAnnuelleHT").value)
+ document.getElementById("cotAnnuelle").value = (cotHT + getFraisHT());
+ })
+ })
+
+
+ document.getElementById('btnNullDateDebut').addEventListener('click', function () {
+ document.getElementById('dateEffet').value = "00/00/0000";
+ validateField('dateEffet', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('btnNullDateEcheance').addEventListener('click', function () {
+ document.getElementById('dateEcheance').value = "00/00";
+ validateField('dateEcheance', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('btnNullDateFin').addEventListener('click', function () {
+ document.getElementById('dateFin').value = "00/00/0000";
+ validateField('dateFin', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('btnModalDate').addEventListener('click', function () {
+ const elem = document.getElementById('modalDate');
+ const instance = M.Modal.getInstance(elem);
+ instance.open();
+ });
+
+ document.getElementById('dateEffet').addEventListener('input', function () {
+ validateField('dateEffet', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('dateFin').addEventListener('input', function () {
+ validateField('dateFin', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('dateEcheance').addEventListener('input', function () {
+ validateField('dateEcheance', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('CA').addEventListener('keydown', function (e) {
+ if (tarif) {
+ e.preventDefault()
+ openModaleModif()
+ } else {
+ validateField('CA', true);
+ updateSubmitButtonState('projetForm');
+ calcCotAnnuelle();
+ }
+ });
+
+ document.getElementById('cotisationIrreductible').addEventListener('keydown', function (e) {
+ if (tarif) {
+ e.preventDefault()
+ openModaleModif()
+ } else {
+ validateField('cotisationIrreductible', true);
+ updateSubmitButtonState('projetForm');
+ }
+ });
+
+ document.getElementById('tauxCotRG').addEventListener('keydown', function (e) {
+ if (tarif) {
+ e.preventDefault()
+ openModaleModif()
+ } else {
+ validateField('tauxCotRG', true);
+ updateSubmitButtonState('projetForm');
+ }
+ });
+
+ document.getElementById('tauxCotRO').addEventListener('keydown', function (e) {
+ if (tarif) {
+ e.preventDefault()
+ openModaleModif()
+ } else {
+ validateField('tauxCotRO', true);
+ updateSubmitButtonState('projetForm');
+ updateRO(calcCotRO().toFixed(2))
+ calcCotAnnuelle();
+ }
+ });
+
+ document.getElementById('capitalColis').addEventListener('input', function () {
+ validateField('capitalColis', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('capitalMax').addEventListener('input', function () {
+ validateField('capitalMax', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('capitalExped').addEventListener('input', function () {
+ validateField('capitalExped', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('capitalTPPC').addEventListener('keydown', function (e) {
+ if (tarif) {
+ e.preventDefault()
+ openModaleModif()
+ } else {
+ validateField('capitalTPPC', true);
+ updateSubmitButtonState('projetForm');
+ }
+ });
+
+ document.getElementById('capitalExpo').addEventListener('keydown', function (e) {
+ if (tarif) {
+ e.preventDefault()
+ openModaleModif()
+ } else {
+ validateField('capitalExpo', true);
+ updateSubmitButtonState('projetForm');
+ }
+ });
+
+ document.getElementById('franchiseTransport').addEventListener('input', function () {
+ validateField('franchiseTransport', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('franchiseTPPC').addEventListener('keydown', function (e) {
+ if (tarif) {
+ e.preventDefault()
+ openModaleModif()
+ } else {
+ validateField('franchiseTPPC', true);
+ updateSubmitButtonState('projetForm');
+ }
+ });
+
+ document.getElementById('franchiseExpo').addEventListener('keydown', function (e) {
+ if (tarif) {
+ e.preventDefault()
+ openModaleModif()
+ } else {
+ validateField('franchiseExpo', true);
+ updateSubmitButtonState('projetForm');
+ }
+ });
+
+ document.getElementById('cotProvRG').addEventListener('keydown', function (e) {
+ if (tarif) {
+ e.preventDefault()
+ openModaleModif()
+ } else {
+ validateField('cotProvRG', true);
+ updateSubmitButtonState('projetForm');
+ calcCotAnnuelle();
+ }
+ });
+
+ document.getElementById('cotProvRO').addEventListener('keydown', function (e) {
+ if (tarif) {
+ e.preventDefault()
+ openModaleModif()
+ } else {
+ validateField('cotProvRO', true);
+ updateSubmitButtonState('projetForm');
+ document.getElementById("tauxCotRO").value = calcTauxRO().toFixed(3)
+ calcCotAnnuelle();
+ }
+ });
+
+ document.getElementById('cotRO').addEventListener('keydown', function (e) {
+ if (tarif) {
+ e.preventDefault()
+ openModaleModif()
+ } else {
+ validateField('cotRO', true);
+ updateSubmitButtonState('projetForm');
+ }
+ });
+
+ document.getElementById('cotRG').addEventListener('keydown', function (e) {
+ if (tarif) {
+ e.preventDefault()
+ openModaleModif()
+ } else {
+ validateField('cotRG', true);
+ updateSubmitButtonState('projetForm');
+ }
+ });
+
+ document.getElementById('cotComptant').addEventListener('input', function () {
+ validateField('cotComptant', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('cotAnnuelle').addEventListener('input', function () {
+ validateField('cotAnnuelle', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('cotAnnuelleHT').addEventListener('keydown', function (e) {
+ if (tarif) {
+ e.preventDefault()
+ openModaleModif()
+ } else {
+ document.getElementById('cotAnnuelle').value = parseFloat(this.value) + getFraisHT()
+ validateField('cotAnnuelleHT', true);
+ updateSubmitButtonState('projetForm');
+ }
+ });
+
+ document.getElementById('marExpo').addEventListener('input', function () {
+ validateField('marExpo', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('typeMar').addEventListener('keydown', function (e) {
+ if (tarif) {
+ e.preventDefault()
+ openModaleModif()
+ } else {
+ validateField('typeMar', true);
+ updateSubmitButtonState('projetForm');
+ }
+ });
+
+ document.getElementById('activite').addEventListener('keydown', function (e) {
+ if (tarif) {
+ e.preventDefault()
+ openModaleModif()
+ } else {
+ validateField('activite', true);
+ updateSubmitButtonState('projetForm');
+ }
+ });
+
+ document.querySelectorAll('table[id="moyenTransport"] input').forEach((element) => element.addEventListener('click', function (e) {
+ if (tarif) {
+ e.preventDefault()
+ openModaleModif()
+ } else {
+ transportChoixUnique(this)
+ }
+ }));
+
+ document.getElementById('risqueTransport').addEventListener('change', function () {
+ afficherChip(document.querySelectorAll('select[name="risqueTransport"] option:not([value="placeholder"])'))
+ });
+
+ document.getElementById('garantieOpt').addEventListener('change', function () {
+ afficherChip(document.querySelectorAll('select[name="garantieOpt"] option:not([value="placeholder"])'))
+ });
+
+ document.getElementById("TPPC").addEventListener('click', function (e) {
+ if (tarif) {
+ e.preventDefault()
+ openModaleModif()
+ } else {
+ toggleTypeTPPC(this)
+ }
+ });
+
+ document.getElementById('modif-OK').addEventListener('click', function (e) {
+ e.preventDefault()
+ redirectToTarif()
+ })
+
+ document.getElementById("marchandise-exposition").addEventListener('click', function (e) {
+ if (tarif) {
+ e.preventDefault()
+ openModaleModif()
+ } else {
+ toggleNombreExpo(this)
+ }
+ });
+
+ document.querySelectorAll('input[name="risqueGuerre"]').forEach((element) => element.addEventListener('click', function (e) {
+ if (tarif) {
+ e.preventDefault()
+ openModaleModif()
+ } else {
+ toggleRG(this.value)
+ updateRO(calcCotRO().toFixed(2))
+ calcCotAnnuelle();
+ }
+ }));
+
+ document.querySelectorAll('input[name="typeContrat"]').forEach((element) => element.addEventListener('change', function () {
+ toggleTypeContrat(this)
+ }));
+
+ document.querySelectorAll('input[name="valeurAssuree"]').forEach((element) => element.addEventListener('change', function () {
+ toggleValeurAssuree(this)
+ }));
+ }
+
+ // Handle event spécifique au limite de garantie activité
+ window.handleInputActivity = function (inputId) {
+ validateField(inputId, true);
+ updateSubmitButtonState('projetForm');
+ };
+
+ // Peupler le formulaire avec les données
+ function populateFormData() {
+ //Poupulate select historique
+
+ if (!contrat.historique || contrat.historique == [null]) {
+ document.getElementById('historiqueDiv').style.display = "none";
+ } else {
+ document.getElementById('historiqueDiv').style.display = "block";
+
+ const idSelect = document.getElementById('idSelect');
+
+ contrat.historique.forEach(function (item) {
+ if (item != null) {
+ var option = document.createElement('option');
+ option.value = item.id;
+ option.textContent = item.type + " " + item.produit + " - " + item.date + " - " + item.heure;
+
+ if (item.nom != undefined && item.prenom != undefined) {
+ option.textContent += " - " + item.nom + " " + item.prenom;
+ }
+
+ idSelect.appendChild(option);
+ }
+ });
+
+ M.FormSelect.init(idSelect);
+ }
+
+ document.getElementById('activite').defaultValue = fac.actAssuree ?? "";
+
+ if (contrat.type !== "TEMPORAIRE") {
+ document.getElementById('typeMar').defaultValue = fac.typeMar ?? "";
+ }
+
+ if (fac.zones !== undefined && fac.zones.length > 0) {
+ populateZoneGeo(fac.zones);
+ }
+
+ if (fac?.aerien) {
+ document.querySelector('input[value="' + fac.aerien + '"][name="aerien"]').checked = true;
+ }
+
+ if (fac?.terrestre) {
+ document.querySelector('input[value="' + fac.terrestre + '"][name="terrestre"]').checked = true;
+ }
+
+ if (fac?.maritime) {
+ document.querySelector('input[value="' + fac.maritime + '"][name="maritime"]').checked = true;
+ }
+
+ if (fac?.postal) {
+ document.querySelector('input[value="' + fac.postal + '"][name="postal"]').checked = true;
+ }
+
+ if (fac?.fluvial) {
+ document.querySelector('input[value="' + fac.fluvial + '"][name="fluvial"]').checked = true;
+ }
+
+ if (fac?.tppc) {
+ document.getElementById('TPPC').checked = true;
+ document.getElementById("col-typetppc").style.display = "block";
+ document.getElementById('capitalTPPC').defaultValue = fac.capitalTPPC;
+ document.getElementById('franchiseTPPC').defaultValue = fac.franchiseTPPC;
+ toggleTypeTPPC(document.getElementById('TPPC'));
+
+ if (projet && projet.typeTPPC !== "") {
+ document.querySelector('input[value="' + projet.typeTPPC + '"][name="typeTPPC"]').checked = true;
+ }
+ }
+
+ if (fac?.nbVehicExpo > 0) {
+ document.getElementById('marchandise-exposition').checked = true;
+ document.getElementById('col-numMarExpo').style.display = "block";
+ document.getElementById("marExpo").defaultValue = fac.nbVehicExpo;
+ toggleNombreExpo(document.getElementById('marchandise-exposition'));
+ document.getElementById('capitalExpo').defaultValue = fac.capitalExpo;
+ document.getElementById('franchiseExpo').defaultValue = fac.franchiseExpo;
+ }
+
+ if (fac?.rg) {
+ const risqueGuerre = fac.rg ?? "";
+ document.querySelector('input[value="' + risqueGuerre + '"][name="risqueGuerre"]').checked = true;
+ toggleRG(risqueGuerre);
+
+ if (risqueGuerre == "auto") {
+ if (fac.typeRG.length > 0) {
+ //Le Type Etendue prend le dessus sur le type waterborne
+ const typeRG = fac.typeRG.includes('etendue') ? "etendue" : "waterborne"
+ document.querySelector('input[value="' + typeRG + '"][name="typeGarantieRG"]').checked = true;
+ }
+ }
+ }
+
+ if (projet?.valeurAssuree) {document.querySelector('input[value="' + projet.valeurAssuree + '"][name="valeurAssuree"]').checked = true;}
+
+ if (projet?.valeurAssuree == 'derogation') {
+ document.getElementById('row-valeurAssureeBase').style.display = "flex";
+ projet.valeurAssureeBase.forEach((option) => {
+ document.querySelector('input[value="' + option + '"][name="valeurAssureeBase"]').checked = true;
+ });
+ }
+
+ populateAssuresAdditionnels(projet);
+
+ //infos Garanties
+
+ if (projet?.risqueTransport.length > 0) {
+ projet.risqueTransport.forEach((option) => {
+ document.querySelector('select[name="risqueTransport"] option[value="' + option + '"]').selected = true;
+ document.getElementById(option + '-chip').style.display = "inline-block";
+ });
+ }
+
+ if (projet?.garOpt.length > 0) {
+ projet.garOpt.forEach((option) => {
+ document.querySelector('select[name="garantieOpt"] option[value="' + option + '"]').selected = true;
+ document.getElementById(option + '-chip').style.display = "inline-block";
+ });
+ }
+
+ //Infos Contrat
+ // Populate temporalité
+ if (projet?.tempo) {
+ document.getElementById(projet.tempo).checked = true;
+ };
+
+ if (projet?.dateEffet) {document.getElementById("dateEffet").value = projet.dateEffet;};
+ if (projet?.dateEcheance) {document.getElementById("dateEcheance").value = projet.dateEcheance;};
+ if (projet?.dateFin) {document.getElementById("dateFin").value = projet.dateFin;};
+ if (projet?.programmeInternational) {document.getElementById("programmeInternationale").checked = true;}
+ if (projet?.participationResultat) {document.getElementById("participationResultat").checked = true;}
+ if (projet?.coassurance) {document.getElementById("coassurance").checked = true;}
+ if (projet?.lieuDepart) {document.getElementById("depart").defaultValue = projet.lieuDepart;}
+ if (projet?.lieuArrivee) {document.getElementById("arrivee").defaultValue = projet.lieuArrivee;}
+
+ //cotisations
+ if (projet?.typeContrat) {
+ document.querySelector('input[value="' + projet.typeContrat + '"][name="typeContrat"]').checked = true;
+ toggleTypeContrat(document.querySelector('input[value="' + projet.typeContrat + '"][name="typeContrat"]'));
+ }
+
+ document.getElementById('CA').defaultValue = fac?.ca ?? '';
+ document.getElementById('cotisationIrreductible').defaultValue = fac?.primeMini ?? '';
+
+ if (projet?.capitalMax) {document.getElementById('capitalMax').defaultValue = projet.capitalMax;}
+ if (projet?.capitalColis) {document.getElementById('capitalColis').defaultValue = projet.capitalColis;}
+ if (projet?.capitalExped) {document.getElementById('capitalExped').defaultValue = projet.capitalExped;}
+
+ if (projet?.franchiseTransport) {document.getElementById('franchiseTransport').defaultValue = projet.franchiseTransport;}
+
+ document.getElementById('tauxCotRG').defaultValue = fac?.tauxCotRG ?? '';
+ document.getElementById('tauxCotRO').defaultValue = fac?.tauxCotRO ?? '';
+
+ document.getElementById('cotProvRG').defaultValue = fac?.cotProvRG ?? '';
+ document.getElementById('cotProvRO').defaultValue = fac?.cotProvRO ?? '';
+ document.getElementById('cotRG').defaultValue = fac?.cotRG ?? '';
+
+ document.getElementById('cotRO').defaultValue = fac?.cotRO ?? '';
+ document.getElementById('cotAnnuelleHT').defaultValue = fac?.primeHT ?? '';
+ document.getElementById('cotAnnuelle').defaultValue = fac?.primeHT ? fac.primeHT + getFraisHT() : '';
+ document.getElementById('cotComptant').defaultValue = fac?.primeHT ?? '';
+ }
+
+ function populateAssuresAdditionnels(projet) {
+ if (!projet || !projet.assureAdditionnel || Object.keys(projet.assureAdditionnel).length === 0) {
+ console.log("Le JSON est vide, pas d'assurés additionnels à pré-remplir.");
+ } else {
+ document.getElementById('additionel').checked = true;
+ document.getElementById('checkAdditionnel').style.display = "block";
+
+ for (let i = 0; i < projet.assureAdditionnel.length; i++) {
+ const row = projet.assureAdditionnel[i];
+ addRowAdditionnel(row.nom, row.adresse, row.siret);
+ }
+ }
+ }
+
+ function populateZoneGeo(zones) {
+ if (zones.includes('zone1')) {document.getElementById("zone1").checked = true;};
+ if (zones.includes('zone2')) {
+ document.getElementById("zone2").checked = true;
+ document.getElementById("zone1").checked = true;
+ document.getElementById("zone1").disabled = true;
+ };
+ if (zones.includes('zone3')) {
+ document.getElementById("zone3").checked = true;
+ document.getElementById("zone2").checked = true;
+ document.getElementById("zone2").disabled = true;
+ document.getElementById("zone1").checked = true;
+ document.getElementById("zone1").disabled = true;
+ };
+ if (zones.includes('zone4')) {document.getElementById("zone4").checked = true;};
+ if (zones.includes('zone5')) {document.getElementById("zone5").checked = true;};
+ if (zones.includes('zone6')) {document.getElementById("zone6").checked = true;};
+ }
+
+ function handleLoadHistoriqueBtn() {
+ var selectedId = document.getElementById('idSelect').value;
+
+ if (selectedId != "") {
+ fetch(`/contrat/update/${contrat.produit}/${contrat.id}/${selectedId}`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ })
+ .then(response => response.json())
+ .then(data => {
+ if (data.valid) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=projet`;
+ } else {
+ console.log('Echec lors de la mise à jour de la relation id contrat - id client :', data);
+ }
+ });
+ }
+ }
+
+ // Ajouter une ligne au tableau
+ function addRowAdditionnel(nomValue, adresseValue, siretValue) {
+ const table = document.getElementById('empTableAdditionnel');
+
+ // Créer une nouvelle ligne avec des inputs éditables
+ const newRow = table.insertRow(table.rows.length - 1);
+ newRow.innerHTML = `
+
+
+
+
+
+ delete
+
+
+ `;
+
+ // Réinitialiser les valeurs de saisie
+ document.getElementById('nomAdditionnel').value = '';
+ document.getElementById('adresseAditionnel').value = '';
+ document.getElementById('siretAdditionnel').value = '';
+
+ // Ajouter un écouteur d'événements pour supprimer
+ newRow.querySelector('.delete-btn').addEventListener('click', function () {
+ deleteRow(this);
+ });
+ }
+
+ // Supprimer une ligne du tableau
+ function deleteRow(btn) {
+ const row = btn.parentElement.parentElement;
+ row.parentElement.removeChild(row);
+ }
+
+ // Contruit la structure Assuré additionnel à envoyer à la BDD
+ function extractAssureAdditionnel(tableId) {
+ const jsonArr = [];
+ const table = document.getElementById(tableId);
+
+ if (table && document.getElementById("additionel").checked) {
+ const rows = table.querySelectorAll('tr:not(:first-child)');
+
+ rows.forEach(row => {
+ const allInputsEmpty = Array.from(row.querySelectorAll('input')).every(input => input.value === '');
+
+ if (!allInputsEmpty) {
+ const inputs = row.querySelectorAll('input');
+ const dataObj = {};
+
+ inputs.forEach(input => {
+ const fieldName = input.getAttribute('name');
+ const fieldValue = input.value || "Non défini";
+ dataObj[fieldName] = fieldValue;
+ });
+
+ jsonArr.push(dataObj);
+ }
+ });
+
+ const jsonResult = JSON.stringify(jsonArr, null, 2);
+ return jsonResult;
+ }
+
+ return "[]"; // Retourne un tableau JSON vide si aucune saisie n'est trouvée dans le tableau
+ }
+
+ function getTempo() {
+ if (document.getElementById("mensuel").checked == true) {return "mensuel";}
+ if (document.getElementById("trimestriel").checked == true) {return "trimestriel";}
+ if (document.getElementById("semestriel").checked == true) {return "semestriel";}
+ if (document.getElementById("annuel").checked == true) {return "annuel";}
+
+ return tempo;
+ }
+
+ function getFraisHT() {
+ const tempo = getTempo()
+ if (tempo == "mensuel" || tempo == "annuel") {
+ return 36.00;
+ } else if (tempo == "trimestriel") {
+ return 144.00;
+ } else if (tempo == "semestriel") {
+ return 72.00;
+ }
+ }
+
+ function getZones() {
+ return [...document.getElementsByName('zone')].filter((zone) => zone.checked).map((zone) => zone.id)
+ }
+
+ function calcCotRO() {
+ const ca = parseFloat(document.getElementById("CA").value) || 0;
+ const tauxRO = parseFloat(document.getElementById("tauxCotRO").value) || 0;
+
+ return (tauxRO * ca / 100)
+ }
+
+ function calcTauxRO() {
+ const ca = parseFloat(document.getElementById("CA").value) || 0;
+ const cotRO = parseFloat(document.getElementById("cotProvRO").value) || 0;
+ return (cotRO / ca * 100)
+ }
+
+ function calcCotAnnuelle() {
+ const valueFractionnement = getFraisHT()
+ const cotProvRG = parseFloat(document.getElementById("cotProvRG").value) || 0;
+ const cotProvRO = calcCotRO()
+ const valueContribAttentat = 6.50;
+
+ const cotHT = cotProvRG + cotProvRO
+ const cotTTC = cotHT + valueFractionnement + valueContribAttentat
+
+ document.getElementById("cotAnnuelleHT").value = cotHT.toFixed(2);
+ document.getElementById("cotAnnuelle").value = cotTTC.toFixed(2);
+ }
+
+ function updateRO(ro) {
+ const inputCotRO = document.getElementById('cotRO')
+ const inputCotProvRO = document.getElementById('cotProvRO')
+ if (inputCotRO.checkVisibility()) {
+ inputCotRO.value = ro
+ } else if (inputCotProvRO.checkVisibility()) {
+ inputCotProvRO.value = ro
+ }
+ }
+
+ function transportChoixUnique(element) { //Empêche de cochage des evenements majeurs ET tous risques
+ if (element.checked) {
+ if (element.id == element.name + '-tousRisques') {
+ document.querySelector('input[id=' + element.name + '-eventMaj]').checked = false
+ } else {
+ document.querySelector('input[id=' + element.name + '-tousRisques]').checked = false
+ }
+ }
+ }
+
+ function afficherChip(element) { //Affiche les options selectionnées sous forme de chip
+ element.forEach(option => {
+ if (option.selected) {
+ document.getElementById(option.value + '-chip').style.display = "inline-block"
+ } else {
+ document.getElementById(option.value + '-chip').style.display = "none"
+ }
+ })
+ }
+
+ function toggleTypeTPPC(element) { //Affiche/Desaffiche les options liées au TPPC
+ document.getElementById('col-typetppc').style.display = element.checked ? "block" : "none"
+ document.getElementById('row-franchiseTPPC').style.display = element.checked ? "table-row" : "none"
+ document.getElementById('row-capitalTPPC').style.display = element.checked ? "table-row" : "none"
+ }
+
+ function toggleNombreExpo(element) { //Affiche/Desaffiche les options liées à la marchandise d'expo
+ document.getElementById("col-numMarExpo").style.display = element.checked ? "block" : "none"
+ document.getElementById("row-capitalExpo").style.display = element.checked ? "table-row" : "none"
+ document.getElementById("row-franchiseExpo").style.display = element.checked ? "table-row" : "none"
+
+ }
+
+ function toggleRG(rg) { //Affiche/Desaffiche les options liées aux risques de guerre
+ if (contrat.type == "TEMPORAIRE") {
+ if (rg == "auto") {
+ document.getElementById("row-tauxCotRG").style.display = "none"
+ document.getElementById("row-cotProvRO").style.display = "none"
+ document.getElementById("row-cotProvRG").style.display = "none"
+ document.getElementById("row-cotRO").style.display = "table-row"
+ document.getElementById("row-cotRG").style.display = "table-row"
+ } else if (rg == "") {
+ document.getElementById("row-tauxCotRG").style.display = "none"
+ document.getElementById("row-cotProvRO").style.display = "none"
+ document.getElementById("row-cotProvRG").style.display = "none"
+ document.getElementById("row-cotRO").style.display = "table-row"
+ document.getElementById("row-cotRG").style.display = "none"
+ }
+ } else {
+ if (rg == "demande") {
+ document.getElementById("row-tauxCotRG").style.display = "none"
+ document.getElementById("row-cotProvRO").style.display = "none"
+ document.getElementById("row-cotProvRG").style.display = "none"
+ document.getElementById("row-cotRO").style.display = "table-row"
+ document.getElementById("row-cotRG").style.display = "none"
+ } else if (rg == "auto") {
+ document.getElementById("row-tauxCotRG").style.display = "table-row"
+ document.getElementById("row-cotProvRO").style.display = "table-row"
+ document.getElementById("row-cotProvRG").style.display = "table-row"
+ document.getElementById("row-cotRO").style.display = "none"
+ document.getElementById("row-cotRG").style.display = "none"
+ }
+ }
+ document.getElementById("row-typeGarantieRG").style.display = rg == "auto" ? "block" : "none"
+ }
+
+ function toggleTypeContrat(element) { //Affiche/Desaffiche les options liées au type de déclaration
+ if (contrat.type !== "TEMPORAIRE") {
+ if (element.value == "avisAliments") {
+ document.getElementById("colTauxAjustement").style.display = "block"
+ document.getElementById("colDetailCot").style.display = "none"
+ document.getElementById("colCA").style.display = "none"
+ document.getElementById("colCotMini").style.display = "none"
+ } else if (element.value == "chiffreAffaires") {
+ document.getElementById("colTauxAjustement").style.display = "block"
+ document.getElementById("colDetailCot").style.display = "block"
+ document.getElementById("colCA").style.display = "block"
+ document.getElementById("colCotMini").style.display = "block"
+ }
+ }
+
+ }
+
+ function toggleValeurAssuree(element) { //Affiche/desaffiche les options liées à la valeur assurées
+ document.getElementById("row-valeurAssureeBase").style.display = element.value == "derogation" ? "flex" : "none"
+ }
+
+ function afficherFAC() {
+ if (contrat.type == "AN") {
+ document.getElementById('row-rg-no').style.display = "none"
+ document.getElementById('row-detailsVoyage').style.display = "none"
+ document.getElementById('row-cotAnnuelle').style.display = "table-row"
+ document.getElementById('colTypeContrat').style.display = "block"
+ document.getElementById('col-valeurAssuree').style.display = "block"
+ document.getElementById('col-activite').style.display = "block"
+ } else if (contrat.type == "TEMPORAIRE") {
+ document.getElementById('row-zonesGeo').style.display = "none"
+ document.getElementById('row-TPPC').style.display = "none"
+ document.getElementById('row-rg-demande').style.display = "none"
+ document.getElementById('row-rg-no').style.display = "block"
+ document.getElementById('rg-demande').checked = false
+ document.getElementById('rg-auto').checked = false
+ document.getElementById('no-rg').checked = true
+ document.getElementById('row-typeGarantieRG').style.display = "none"
+ document.getElementById('row-risqueTransport').style.display = "none"
+ document.getElementById('colTypeContrat').style.display = "none"
+ document.getElementById('row-fractionnement').style.display = "none"
+ document.getElementById('rowDateEcheance').style.display = "none"
+ document.getElementById('rowDateFin').style.display = "block"
+ document.getElementById('row-detailsVoyage').style.display = "block"
+ document.getElementById('row-programmeInternational').style.display = "none"
+ document.getElementById('row-participationResultats').style.display = "none"
+ document.getElementById('row-cotAnnuelle').style.display = "none"
+ document.getElementById('row-cotRO').style.display = "table-row"
+ document.getElementById('row-cotComptant').style.display = "table-row"
+ document.getElementById('row-capitalColis').style.display = "none"
+ document.getElementById('row-capitalExped').style.display = "none"
+ document.getElementById('colTauxAjustement').style.display = "none"
+ document.getElementById('colCA').style.display = "none"
+ document.getElementById('colCotMini').style.display = "none"
+ document.getElementById('col-activite').style.display = "none"
+ document.getElementById('activite').value = "not-null"
+ document.getElementById('col-valeurAssuree').style.display = "none"
+ } else if (contrat.type == "REMPLACEMENT") {
+ document.getElementById('row-rg-no').style.display = "none"
+ document.getElementById('row-detailsVoyage').style.display = "none"
+ document.getElementById('row-cotProvRO').style.display = "table-row"
+ document.getElementById('row-cotProvRG').style.display = "table-row"
+ document.getElementById('row-cotAnnuelle').style.display = "table-row"
+ document.getElementById('colTypeContrat').style.display = "block"
+ document.getElementById('col-valeurAssuree').style.display = "block"
+ document.getElementById('col-activite').style.display = "block"
+ }
+ }
+
+ function choixMultipleArray(name, select = false) {
+ if (select) {
+ return [...document.querySelectorAll('select[name="' + name + '"] option:checked:not([value="placeholder"])')].map((element) => element.value)
+ } else {
+ return [...document.querySelectorAll('input[name="' + name + '"]:checked')].map((element) => element.value)
+ }
+ }
+
+ function openModaleModif() {
+ const elem = document.getElementById('modalModif');
+ const instance = M.Modal.getInstance(elem);
+ instance.open();
+ }
+
+ async function redirectToTarif() {
+ if(await submitForm(false, false)){
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`;
+ }
+ }
+
+ // Gérer la soumission du formulaire
+ async function submitForm(updateProjet = true, generateProject = true) {
+ const bodyProjet = {
+ // Activités
+ "valeurAssuree": contrat.type !== "TEMPORAIRE" ? document.querySelector('input[name="valeurAssuree"]:checked').value : "",
+ "valeurAssureeBase": document.getElementById('valeurAssuree-degoration').checked ? choixMultipleArray("valeurAssureeBase") : "",
+ "assureAdditionnel": extractAssureAdditionnel('empTableAdditionnel'),
+
+ //Infos Garanties
+ "typeTPPC": document.getElementById('TPPC').checked ? document.querySelector('input[name="typeTPPC"]:checked').value : "",
+ "risqueTransport": choixMultipleArray('risqueTransport', true),
+ "garOpt": choixMultipleArray('garantieOpt', true),
+
+ // Temporalités
+ "tempo": contrat.type !== "TEMPORAIRE" ? getTempo() : '',
+ "dateEffet": document.getElementById("dateEffet").value,
+ "dateEcheance": document.getElementById("dateEcheance").value,
+ "dateFin": document.getElementById("dateFin").value,
+ "coassurance": document.getElementById("coassurance").checked,
+ "programmeInternational": document.getElementById("programmeInternationale").checked,
+ "participationResultat": document.getElementById("participationResultat").checked,
+ "lieuDepart": document.getElementById("depart").value,
+ "lieuArrivee": document.getElementById("arrivee").value,
+
+ // Cotisations
+ "typeContrat": contrat.type !== "TEMPORAIRE" ? document.querySelector('input[name="typeContrat"]:checked').value : "",
+ "capitalMax": document.getElementById('capitalMax').value,
+ "capitalColis": document.getElementById('capitalColis').value,
+ "capitalExped": document.getElementById('capitalExped').value,
+ "franchiseTransport": document.getElementById('franchiseTransport').value,
+ 'cotAnnuelleTTC': document.getElementById('cotAnnuelle').checkVisibility() ? document.getElementById('cotAnnuelle').value : "",
+
+ }
+
+ const response = await fetch(`/fac/createProjet`, {
+ method: 'POST',
+ body: JSON.stringify(bodyProjet),
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+
+ const dataProjet = await response.json();
+
+ if (dataProjet.valid) {
+ const idProjet = dataProjet.fac.id
+ const idTarif = fac?.tarif ?? ""
+ const typeRG = fac?.typeRG ?? document.getElementById('rg-auto').checked ? document.querySelector('input[name="typeGarantieRG"]:checked').value : ""
+
+ if (updateProjet) {
+ var bodyFAC = {
+ projet: idProjet,
+ tarif: idTarif,
+ nbVehicExpo: document.getElementById('marchandise-exposition').checked ? document.getElementById('marExpo').value : "",
+ actAssuree: contrat.type !== "TEMPORAIRE" ? document.getElementById("activite").value : "",
+ typeMar: document.getElementById('typeMar').value,
+ ca: document.getElementById('CA').checkVisibility() ? document.getElementById('CA').value : "",
+ cotRO: document.getElementById('cotRO').checkVisibility() ? document.getElementById('cotRO').value : "",
+ cotRG: document.getElementById('cotRG').checkVisibility() ? document.getElementById('cotRG').value : "",
+ cotProvRO: document.getElementById('cotProvRO').checkVisibility() ? document.getElementById('cotProvRO').value : "",
+ cotProvRG: document.getElementById('cotProvRG').checkVisibility() ? document.getElementById('cotProvRG').value : "",
+ tauxCotRO: document.getElementById('tauxCotRO').checkVisibility() ? document.getElementById('tauxCotRO').value : "",
+ tauxCotRG: document.getElementById('tauxCotRG').checkVisibility() ? document.getElementById('tauxCotRG').value : "",
+ capitalTPPC: document.getElementById('capitalTPPC').checkVisibility() ? document.getElementById('capitalTPPC').value : "",
+ capitalExpo: document.getElementById('capitalExpo').checkVisibility() ? document.getElementById('capitalExpo').value : "",
+ franchiseExpo: document.getElementById('franchiseExpo').checkVisibility() ? document.getElementById('franchiseExpo').value : "",
+ franchiseTPPC: document.getElementById('franchiseTPPC').checkVisibility() ? document.getElementById('franchiseTPPC').value : "",
+ typeRG: typeRG,
+ zones: getZones(),
+ terrestre: document.querySelector('input[name="terrestre"]:checked')?.value ?? "",
+ maritime: document.querySelector('input[name="maritime"]:checked')?.value ?? "",
+ aerien: document.querySelector('input[name="aerien"]:checked')?.value ?? "",
+ postal: document.querySelector('input[name="postal"]:checked')?.value ?? "",
+ fluvial: document.querySelector('input[name="fluvial"]:checked')?.value ?? "",
+ multimodal: "",// A VOIR
+
+ tppc: document.getElementById('TPPC').checked,
+ rg: document.querySelector('input[name="risqueGuerre"]:checked').value,
+ primeHT: document.getElementById('cotAnnuelleHT').checkVisibility() ? document.getElementById('cotAnnuelleHT').value : "",
+ primeMini: document.getElementById('cotisationIrreductible').value
+
+ }
+ } else {
+ var bodyFAC = {
+ projet: idProjet,
+ tarif: idTarif,
+ nbVehicExpo: fac.nbVehicExpo,
+ actAssuree: fac.actAssuree,
+ typeMar: fac.typeMar,
+ ca: fac.ca,
+ cotRO: fac.cotRO,
+ cotRG: fac.cotRG,
+ cotProvRO: fac.cotProvRO,
+ cotProvRG: fac.cotProvRG,
+ tauxCotRO: fac.tauxCotRO,
+ tauxCotRG: fac.tauxCotRG,
+ capitalTPPC: fac.capitalTPPC,
+ capitalExpo: fac.capitalExpo,
+ franchiseExpo: fac.franchiseExpo,
+ franchiseTPPC: fac.franchiseTPPC,
+ typeRG: fac.typeRG,
+ zones: fac.zones,
+ terrestre: fac.terrestre,
+ maritime: fac.maritime,
+ aerien: fac.aerien,
+ postal: fac.postal,
+ fluvial: fac.fluvial,
+ multimodal: fac.multimodal,
+ tppc: fac.tppc,
+ rg: fac.rg,
+ primeHT: fac.primeHT,
+ primeMini: fac.primeMini
+ }
+ }
+
+ const responseFAC = await fetch(`/fac/create`, {
+ method: 'POST',
+ body: JSON.stringify(bodyFAC), headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+ const dataFAC = await responseFAC.json();
+ if (dataFAC.valid) {
+ const idFAC = dataFAC.fac.id;
+
+ // Mettre à jour le champ "fac" dans le contrat avec l'ID de la nouvelle saisie
+ const responseContratEnCours = await fetch(`/contrat/update/${contrat.produit}/${contrat.id}/${idFAC}`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+
+ const dataContratEnCours = await responseContratEnCours.json();
+
+ if (dataContratEnCours.valid) {
+ // Obtenir la date actuelle au format "JJ/MM/AAAA"
+ const currentDate = new Date();
+ const day = String(currentDate.getDate()).padStart(2, '0');
+ const month = String(currentDate.getMonth() + 1).padStart(2, '0'); // Les mois sont indexés à partir de 0, donc +1
+ const year = currentDate.getFullYear();
+ const formattedDate = `${day}/${month}/${year}`;
+
+ //Obtenir l'user
+ const token = localStorage.getItem('jwtToken');
+ const decoded = jwt_decode(token);
+ const userFirstName = decoded.userFirstName;
+ const userLastName = decoded.userLastName;
+
+ // Obtenir l'heure actuelle au format "HHhMM"
+ const hours = String(currentDate.getHours()).padStart(2, '0');
+ const minutes = String(currentDate.getMinutes()).padStart(2, '0');
+ const seconds = String(currentDate.getSeconds()).padStart(2, '0');
+ const formattedTime = `${hours}:${minutes}:${seconds}`;
+ const nom = userLastName;
+ const prenom = userFirstName;
+
+ // Mettre à jour le champ "historique" dans le contrat avec les nouvelles données d'historique
+ const historiqueData = [
+ {
+ "type": contrat.type,
+ "date": formattedDate,
+ "heure": formattedTime,
+ "projet": "FAC",
+ "id": idFAC,
+ "nom": nom,
+ "prenom": prenom,
+ }
+ ];
+
+ const responseHistoriqueUpdate = await fetch(`/contrat/update/historique/${contrat.id}`, {
+ method: 'POST',
+ body: JSON.stringify({historiqueData}),
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+
+ const dataHistoriqueUpdate = await responseHistoriqueUpdate.json();
+
+ if (generateProject) {
+ if (dataHistoriqueUpdate.valid) {
+ /////////////////////////////////////////////////////////////////////////////////////////////////////
+ // TODO DEBUT Génération fichier à l'enregistrement A RETIRER QUAND MODE CONTRAT
+ const numParcours = getNumParcoursFromURL();
+ let filename;
+
+
+ // Envoi de la requête POST au serveur pour générer le projet
+ fetch(`/generate/fac/projet/${numParcours}`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ })
+ .then(response => {
+ if (!response.ok) {
+ throw new Error('Erreur réseau ou serveur');
+ }
+
+ const disposition = response.headers.get('content-disposition');
+ filename = disposition.split(';')[1].trim().split('=')[1];
+
+ return response.blob(); // On attend une réponse sous forme de blob pour un fichier
+ })
+ .then(blob => {
+ // Crée un URL pour le blob
+ const url = window.URL.createObjectURL(blob);
+ // Crée un élément a temporaire pour simuler un clic pour téléchargement
+ const a = document.createElement('a');
+ a.href = url;
+ a.download = filename; // Nomme le fichier téléchargé
+ document.body.appendChild(a); // Ajoute l'élément au document
+ a.click(); // Simule un clic sur l'élément pour déclencher le téléchargement
+ window.URL.revokeObjectURL(url); // Nettoie l'URL objet
+ a.remove(); // Supprime l'élément a du document
+
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=projet`;
+ })
+ .catch(error => console.error('Erreur lors de la génération du projet:', error));
+ /// TODO FIN Génération fichier à l'enregistrement A RETIRER QUAND MODE CONTRAT
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////
+
+ // TODO NE PAS OUBLIER LE HREF QUI EST DANS LE GEN ACTUELLEMENT
+ // window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=projet`;
+ } else {
+ console.log('Echec lors de la mise à jour de l\'historique du contrat :', dataHistoriqueUpdate.message);
+ }
+ } else {
+ return dataHistoriqueUpdate.valid
+ }
+ } else {
+ console.log('Echec lors de la mise à jour du champ "enCours" dans le contrat :', dataContratEnCours.message);
+ }
+ }
+ }
+ }
+
+ // Exposer init globalement pour y accéder depuis l'extérieur
+ window.initSubmenuForm = init;
+})();
\ No newline at end of file
diff --git a/ecole/public/js/projet-form-rc.js b/ecole/public/js/projet-form-rc.js
new file mode 100644
index 00000000..37352452
--- /dev/null
+++ b/ecole/public/js/projet-form-rc.js
@@ -0,0 +1,3438 @@
+function initSubmenuForm() {
+ // Accéder aux informations stockées du parcours
+ const parcours = JSON.parse(sessionStorage.getItem('parcours'));
+}
+
+// Exposer initSubmenuForm globalement pour y accéder depuis l'extérieur
+window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollution de l'espace global
+(function () {
+ // Variables globales du module
+ let parcours, contrat, client, intermediaire, rc, projet, tarif;
+
+ let modRCActRCC, modRCMar, modRCZone, modRCActCompl, modRCGarAdd;
+ let hasSavedGrilleData = false; // évite d'écraser une grille déjà enregistrée
+
+ // Initialisation des tag pour select
+ var tagAnimauxVivants = false;
+ var tagMultimodal = false;
+ var tagDemenageur = false;
+ var tagDemenageurParticulier = false;
+ var tagDemenageurParticulierDeclaree = false;
+ var tagDemenageurParticulierAdvalorem = false;
+ var tagGardeMeubles = false;
+ var tagVoiturier = false;
+ var tagDemenageurEntrInter = false;
+
+ // Initialisation du formulaire et des données
+ function init() {
+ // Materialize init select
+ var select = document.querySelectorAll('select');
+ M.FormSelect.init(select);
+
+ // Materialize init Modal
+ var modals = document.querySelectorAll('.modal');
+ M.Modal.init(modals);
+
+ // Accéder aux informations stockées du parcours
+ parcours = JSON.parse(sessionStorage.getItem('parcours'));
+ contrat = JSON.parse(sessionStorage.getItem('contrat'));
+ client = contrat?.["@expand"]?.client || null;
+ intermediaire = contrat?.["@expand"]?.intermediaire || null;
+
+ // Récupérer les données RC depuis la nouvelle structure (EXACTEMENT comme TPPC)
+ rc = contrat?.["@expand"]?.enCours || null; // RC principal
+ projet = rc?.["@expand"]?.projet || null; // Données projet (normalized by contratService)
+ tarif = rc?.["@expand"]?.tarif || null; // Données tarif (normalized by contratService)
+
+ // Exposer ces variables globalement pour que rc-orchestrator puisse y accéder
+ window.rc = rc;
+ window.tarif = tarif;
+ window.projet = projet;
+
+ console.log("Initialisation pour formulaire projet :", parcours);
+ console.log("📊 RC:", rc);
+ console.log("📊 Tarif:", tarif);
+ console.log("📊 Projet:", projet);
+
+ loadModulateurs();
+
+ // Appel des différentes fonctions d'initialisation
+ setupEventListeners();
+ populateFormData();
+ setupTarifImpactListeners();
+ updateSubmitButtonState('projetForm');
+ }
+
+ let tarifOriginalData = null;
+
+ async function loadModulateurs() {
+ try {
+ const response = await fetch('/rc/modulo/activiteRCC');
+ const data = await response.json();
+ if (data.valid) {
+ modRCActRCC = data.objRetourne;
+ }
+ const response2 = await fetch('/rc/modulo/marchandiseRC');
+ const data2 = await response2.json();
+ if (data2.valid) {
+ modRCMar = data2.objRetourne;
+ }
+ const response3 = await fetch('/rc/modulo/zoneRC');
+ const data3 = await response3.json();
+ if (data3.valid) {
+ modRCZone = data3.objRetourne;
+ }
+ const response4 = await fetch('/rc/modulo/activiteComplRC');
+ const data4 = await response4.json();
+ if (data4.valid) {
+ modRCActCompl = data4.objRetourne;
+ }
+ const response5 = await fetch('/rc/modulo/garAdditionelRC');
+ const data5 = await response5.json();
+ if (data5.valid) {
+ modRCGarAdd = data5.objRetourne;
+ }
+ } catch (error) {
+ console.error('Erreur lors du chargement des modulateurs:', error);
+ }
+ }
+
+ function saveOriginalTarifData() {
+ if (!tarif || !tarif.id) return;
+
+ const garantieRCCSelector = document.getElementById('garantieRCC-selector');
+ let garantiesRCC = [];
+ if (garantieRCCSelector) {
+ garantiesRCC = Array.from(garantieRCCSelector.selectedOptions).map(opt => opt.value);
+ } else if (projet) {
+ if (projet.extRCCConfie) garantiesRCC.push('contenant-confie');
+ if (projet.extRCCTPPC) garantiesRCC.push('tppc');
+ if (projet.extRCCModifCalArrim) garantiesRCC.push('modif-calage-arrimage');
+ if (projet.extRCCFerroutage) garantiesRCC.push('ferroutage');
+ if (projet.extRCCFraisRecons) garantiesRCC.push('frais-reconstitution');
+ if (projet.extRCCRegie) garantiesRCC.push('regie');
+ if (projet.extRCCSansMontageDemontage) garantiesRCC.push('sans-montage-demontage');
+ }
+
+ const parseArray = (value) => {
+ if (Array.isArray(value)) return value;
+ if (typeof value === 'string') {
+ try {
+ return JSON.parse(value);
+ } catch {
+ return [];
+ }
+ }
+ return [];
+ };
+
+ tarifOriginalData = {
+ checkVoiturier: rc?.checkVoiturier || false,
+ checkLoueur: rc?.checkLoueur || false,
+ checkCommissionnaire: rc?.checkCommissionnaire || false,
+ checkDemenageur: rc?.checkDemenageur || false,
+ checkLogistique: rc?.checkLogistique || false,
+ checkAutocariste: rc?.checkAutocariste || false,
+ checkAutres: rc?.checkAutres || false,
+ capitalVoiturier: rc?.capitalVoiturier || 0,
+ capitalCommissionnaire: rc?.capitalCommissionnaire || 0,
+ capitalDemenageur: rc?.capitalDemenageur || 0,
+ capitalLogistique: rc?.capitalLogistique || 0,
+ capitalAutocariste: rc?.capitalAutocariste || 0,
+ capitalAutres: rc?.capitalAutres || 0,
+ marchandisesVoiturier: parseArray(rc?.marchandisesVoiturier),
+ marchandisesCommissionnaire: parseArray(rc?.marchandisesCommissionnaire),
+ marchandisesDemenageur: parseArray(rc?.marchandisesDemenageur),
+ marchandisesLogistique: parseArray(rc?.marchandisesLogistique),
+ marchandisesAutocariste: parseArray(rc?.marchandisesAutocariste),
+ marchandisesAutres: parseArray(rc?.marchandisesAutres),
+ activitesVoiturier: parseArray(rc?.activitesVoiturier),
+ activitesCommissionnaire: parseArray(rc?.activitesCommissionnaire),
+ activitesDemenageur: parseArray(rc?.activitesDemenageur),
+ activitesLogistique: parseArray(rc?.activitesLogistique),
+ zone1: rc?.zone1 || false,
+ zone2: rc?.zone2 || false,
+ zone3: rc?.zone3 || false,
+ zone4: rc?.zone4 || false,
+ zone5: rc?.zone5 || false,
+ zone6: rc?.zone6 || false,
+ typeCotisation: rc?.typeCotisation || 'revisable',
+ checkRCE: rc?.checkRCE || false,
+ garantiesRCC: garantiesRCC,
+ ca: rc?.chiffreAffaires || tarif?.ca || '',
+ pj: tarif?.checkPJ || false
+ };
+ }
+
+ function checkTarifImpact(fieldType, fieldValue) {
+ if (!tarif || !tarif.id || !tarifOriginalData) return false;
+
+ switch(fieldType) {
+ case 'activity':
+ return checkActivityImpact(fieldValue);
+ case 'marchandise':
+ return checkMarchandiseImpact(fieldValue);
+ case 'zone':
+ return checkZoneImpact(fieldValue);
+ case 'activiteCompl':
+ return checkActiviteComplImpact(fieldValue);
+ case 'typeCotisation':
+ return fieldValue === 'forfaitaire' && tarifOriginalData.typeCotisation === 'forfaitaire';
+ default:
+ return false;
+ }
+ }
+
+ function checkActivityImpact(activityData) {
+ if (!modRCActRCC) return false;
+
+ const activities = ['checkVoiturier', 'checkCommissionnaire', 'checkDemenageur', 'checkLogistique', 'checkAutocariste', 'checkAutres'];
+ for (let act of activities) {
+ if (activityData[act] !== tarifOriginalData[act]) return true;
+ const capitalKey = act.replace('check', 'capital');
+ const originalCapital = parseFloat(tarifOriginalData[capitalKey]) || 0;
+ const currentCapital = parseFloat(activityData[capitalKey]) || 0;
+ if (Math.abs(originalCapital - currentCapital) > 0.01) return true;
+ }
+ return false;
+ }
+
+ function checkMarchandiseImpact(marchandiseData) {
+ if (!modRCMar) return false;
+
+ const normalizeArray = (arr) => {
+ if (!arr) return [];
+ const normalized = Array.isArray(arr) ? arr : (typeof arr === 'string' ? JSON.parse(arr) : []);
+ return normalized.map(item => String(item).trim()).sort();
+ };
+
+ const marchandiseKeys = ['marchandisesVoiturier', 'marchandisesCommissionnaire', 'marchandisesDemenageur',
+ 'marchandisesLogistique', 'marchandisesAutocariste', 'marchandisesAutres'];
+ for (let key of marchandiseKeys) {
+ const original = normalizeArray(tarifOriginalData[key]);
+ const current = normalizeArray(marchandiseData[key]);
+ if (JSON.stringify(original) !== JSON.stringify(current)) return true;
+ }
+ return false;
+ }
+
+ function checkZoneImpact(zoneData) {
+ if (!modRCZone) return false;
+
+ function getMaxZoneCoefficient(zones) {
+ let maxRCC = 1;
+ let maxRCE = 1;
+
+ const zoneLabels = [
+ "France Métropolitaine et pays limitrophes",
+ "Union Européenne",
+ "Autres pays européens sauf Russie et Ukraine (y compris UK et Norvège)",
+ "Pays du Maghreb et Amérique du Nord ( USA / Canada / Mexique )",
+ "Amérique Centrale et Sud / Caraïbes, Asie et Océanie",
+ "Afrique Hors Maghreb / Proche Orient / Moyen Orient"
+ ];
+
+ for (let i = 1; i <= 6; i++) {
+ if (zones[`zone${i}`]) {
+ const zoneKey = zoneLabels[i - 1];
+ if (modRCZone[zoneKey]) {
+ if (typeof modRCZone[zoneKey].modRCC === "number") {
+ maxRCC = Math.max(maxRCC, modRCZone[zoneKey].modRCC);
+ }
+ if (typeof modRCZone[zoneKey].modRCE === "number") {
+ maxRCE = Math.max(maxRCE, modRCZone[zoneKey].modRCE);
+ }
+ }
+ }
+ }
+
+ return { maxRCC, maxRCE };
+ }
+
+ const originalMax = getMaxZoneCoefficient(tarifOriginalData);
+ const currentMax = getMaxZoneCoefficient(zoneData);
+
+ return originalMax.maxRCC !== currentMax.maxRCC || originalMax.maxRCE !== currentMax.maxRCE;
+ }
+
+ function checkActiviteComplImpact(activiteComplData) {
+ if (!modRCActCompl) return false;
+
+ const activiteKeys = ['activitesVoiturier', 'activitesCommissionnaire', 'activitesDemenageur', 'activitesLogistique'];
+ for (let key of activiteKeys) {
+ const original = Array.isArray(tarifOriginalData[key]) ? tarifOriginalData[key] : (tarifOriginalData[key] ? JSON.parse(tarifOriginalData[key]) : []);
+ const current = Array.isArray(activiteComplData[key]) ? activiteComplData[key] : (activiteComplData[key] ? JSON.parse(activiteComplData[key]) : []);
+ if (JSON.stringify(original.sort()) !== JSON.stringify(current.sort())) return true;
+ }
+ return false;
+ }
+
+ function getCurrentActiviteComplData() {
+ const activitesCompl = {
+ activitesVoiturier: getActivitesComplFromForm('actComplVoiturier/Loueur'),
+ activitesCommissionnaire: getActivitesComplFromForm('actComplCommissionnaire de Transport'),
+ activitesDemenageur: getActivitesComplFromForm('actComplDéménageur'),
+ activitesLogistique: getActivitesComplFromForm('actComplLogistique')
+ };
+ return activitesCompl;
+ }
+
+ function getActivitesComplFromForm(containerName) {
+ const container = document.querySelector(`[name="${containerName}"]`);
+ if (!container) return [];
+ const checkboxes = container.querySelectorAll('input[type="checkbox"]:checked');
+ const activites = [];
+ checkboxes.forEach(cb => {
+ const text = cb.nextElementSibling ? cb.nextElementSibling.textContent.trim() : cb.value;
+ activites.push(text);
+ });
+ return activites;
+ }
+
+ let lastChangedField = null;
+ let lastChangedValue = null;
+ let isRestoringValue = false;
+
+ function showTarifImpactModal(callback, fieldElement, originalValue) {
+ const modal = document.getElementById('modalModif');
+ if (!modal) return;
+
+ const instance = M.Modal.getInstance(modal);
+
+ lastChangedField = fieldElement;
+ lastChangedValue = originalValue;
+
+ const okBtn = document.getElementById('modif-OK');
+ const noBtn = document.getElementById('modif-NO');
+
+ if (okBtn) {
+ okBtn.onclick = function() {
+ instance.close();
+ if (callback) callback(true);
+ };
+ }
+
+ if (noBtn) {
+ noBtn.onclick = function() {
+ instance.close();
+ isRestoringValue = true;
+
+ if (lastChangedField && lastChangedValue !== null) {
+ if (lastChangedField.tagName === 'INPUT') {
+ lastChangedField.value = lastChangedValue;
+ } else if (lastChangedField.tagName === 'SELECT') {
+ if (lastChangedField.multiple && Array.isArray(lastChangedValue)) {
+ Array.from(lastChangedField.options).forEach(opt => {
+ opt.selected = lastChangedValue.includes(opt.value);
+ });
+ } else {
+ lastChangedField.value = lastChangedValue;
+ }
+ M.FormSelect.init(lastChangedField);
+
+ if (lastChangedField.id === 'activity-selector') {
+ handleActivitySelection();
+ }
+ } else if (lastChangedField.type === 'checkbox' || lastChangedField.type === 'radio') {
+ lastChangedField.checked = lastChangedValue;
+ }
+ }
+
+ setTimeout(() => {
+ isRestoringValue = false;
+ }, 100);
+
+ if (callback) callback(false);
+ };
+ }
+
+ instance.open();
+ }
+
+ function setupTarifImpactListeners() {
+ if (!tarif || !tarif.id) return;
+
+ setTimeout(() => {
+ saveOriginalTarifData();
+ }, 500);
+
+ const activitySelector = document.getElementById('activity-selector');
+ if (activitySelector) {
+ activitySelector.addEventListener('change', function(e) {
+ if (isRestoringValue) return;
+
+ setTimeout(() => {
+ if (!tarif || !tarif.id || !tarifOriginalData || isRestoringValue) return;
+ const currentData = getCurrentActivityData();
+ if (checkTarifImpact('activity', currentData)) {
+ e.stopImmediatePropagation();
+ e.preventDefault();
+ const originalSelection = Array.from(this.options).filter(opt => {
+ const wasSelected = tarifOriginalData.checkVoiturier && (opt.value === 'voiturier' || opt.value === 'loueur') ||
+ tarifOriginalData.checkCommissionnaire && opt.value === 'commissionnaire-multimodal' ||
+ tarifOriginalData.checkDemenageur && (opt.value === 'demenageur-particulier' || opt.value === 'demenageur-entreprise' || opt.value === 'demenageur-interne') ||
+ tarifOriginalData.checkLogistique && (opt.value === 'entrepositaire-depositaire' || opt.value === 'prestataire-logistique') ||
+ tarifOriginalData.checkAutocariste && opt.value === 'autocariste' ||
+ tarifOriginalData.checkAutres && opt.value === 'autres';
+ return wasSelected;
+ }).map(opt => opt.value);
+ showTarifImpactModal((confirmed) => {
+ if (confirmed) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`;
+ }
+ }, this, originalSelection);
+ return false;
+ }
+ }, 200);
+ }, true);
+ }
+
+ const marchandiseSelector = document.getElementById('marchandise-selector');
+ if (marchandiseSelector) {
+ let lastMarchandiseSelection = Array.from(marchandiseSelector.selectedOptions).map(opt => opt.value);
+
+ marchandiseSelector.addEventListener('mousedown', function() {
+ if (!isRestoringValue) {
+ lastMarchandiseSelection = Array.from(this.selectedOptions).map(opt => opt.value);
+ }
+ }, true);
+
+ marchandiseSelector.addEventListener('change', function(e) {
+ if (isRestoringValue) {
+ handleMarchandiseSelection();
+ return;
+ }
+
+ const originalSelection = lastMarchandiseSelection;
+
+ setTimeout(() => {
+ if (!tarif || !tarif.id || !tarifOriginalData || isRestoringValue) return;
+ const currentData = getCurrentMarchandiseData();
+ if (checkTarifImpact('marchandise', currentData)) {
+ e.stopImmediatePropagation();
+ e.preventDefault();
+ showTarifImpactModal((confirmed) => {
+ if (confirmed) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`;
+ }
+ }, this, originalSelection);
+ } else {
+ lastMarchandiseSelection = Array.from(this.selectedOptions).map(opt => opt.value);
+ handleMarchandiseSelection();
+ }
+ }, 200);
+ }, true);
+ }
+
+ for (let i = 1; i <= 6; i++) {
+ const zoneCheckbox = document.getElementById(`zone${i}`);
+ if (zoneCheckbox) {
+ zoneCheckbox.addEventListener('change', function(e) {
+ if (isRestoringValue) return;
+
+ const checkboxId = this.id;
+ const originalChecked = tarifOriginalData[checkboxId] || false;
+
+ setTimeout(() => {
+ if (!tarif || !tarif.id || !tarifOriginalData || isRestoringValue) return;
+ const currentData = getCurrentZoneData();
+ if (checkTarifImpact('zone', currentData)) {
+ e.stopImmediatePropagation();
+ e.preventDefault();
+ showTarifImpactModal((confirmed) => {
+ if (confirmed) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`;
+ }
+ }, this, originalChecked);
+ }
+ }, 200);
+ }, true);
+ }
+ }
+
+ const garantieRCCSelector = document.getElementById('garantieRCC-selector');
+ if (garantieRCCSelector) {
+ garantieRCCSelector.addEventListener('change', function(e) {
+ if (isRestoringValue) return;
+
+ setTimeout(() => {
+ if (!tarif || !tarif.id || !tarifOriginalData || isRestoringValue) return;
+ const currentData = getCurrentGarantieRCCData();
+ if (checkGarantieRCCImpact(currentData)) {
+ e.stopImmediatePropagation();
+ const originalSelection = Array.from(this.selectedOptions).map(opt => opt.value);
+ showTarifImpactModal((confirmed) => {
+ if (confirmed) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`;
+ }
+ }, this, originalSelection);
+ }
+ }, 200);
+ }, true);
+ }
+
+ const activiteComplContainers = [
+ 'actComplVoiturier/Loueur',
+ 'actComplCommissionnaire de Transport',
+ 'actComplDéménageur',
+ 'actComplLogistique'
+ ];
+
+ activiteComplContainers.forEach(containerName => {
+ const container = document.querySelector(`[name="${containerName}"]`);
+ if (container) {
+ const checkboxes = container.querySelectorAll('input[type="checkbox"]');
+ checkboxes.forEach(checkbox => {
+ checkbox.addEventListener('change', function(e) {
+ if (isRestoringValue) return;
+
+ const originalChecked = !this.checked;
+
+ setTimeout(() => {
+ if (!tarif || !tarif.id || !tarifOriginalData || isRestoringValue) return;
+ const currentData = getCurrentActiviteComplData();
+ if (checkTarifImpact('activiteCompl', currentData)) {
+ e.stopImmediatePropagation();
+ showTarifImpactModal((confirmed) => {
+ if (confirmed) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`;
+ }
+ }, this, originalChecked);
+ }
+ }, 200);
+ }, true);
+ });
+ }
+ });
+
+ const radioButtonsCot = document.getElementsByName('cotisation');
+ for (let i = 0; i < radioButtonsCot.length; i++) {
+ radioButtonsCot[i].addEventListener('change', function(e) {
+ if (isRestoringValue) return;
+
+ setTimeout(() => {
+ if (!tarif || !tarif.id || !tarifOriginalData || isRestoringValue) return;
+ const originalValue = tarifOriginalData.typeCotisation;
+ if (this.value !== originalValue) {
+ e.stopImmediatePropagation();
+ showTarifImpactModal((confirmed) => {
+ if (confirmed) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`;
+ }
+ }, this, originalValue);
+ }
+ }, 200);
+ }, true);
+ }
+
+ const capitalFields = ['voiturier', 'loueur', 'commissionnaire-multimodal', 'demenageur-particulier',
+ 'demenageur-particulier-dommage', 'demenageur-particulier-advalorem',
+ 'demenageur-entreprise', 'demenageur-interne', 'entrepositaire-depositaire',
+ 'prestataire-logistique', 'autocariste', 'autres'];
+
+ capitalFields.forEach(fieldId => {
+ const field = document.getElementById(fieldId);
+ if (field) {
+ let originalValue = field.value || field.dataset.defaultValue || '';
+ field.addEventListener('input', function(e) {
+ if (isRestoringValue) return;
+
+ setTimeout(() => {
+ if (!tarif || !tarif.id || !tarifOriginalData || isRestoringValue) return;
+ const currentData = getCurrentActivityData();
+ if (checkTarifImpact('activity', currentData)) {
+ const currentValue = this.value;
+ showTarifImpactModal((confirmed) => {
+ if (confirmed) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`;
+ }
+ }, this, originalValue);
+ } else {
+ originalValue = this.value;
+ }
+ }, 200);
+ });
+ }
+ });
+
+ const observer = new MutationObserver(function(mutations) {
+ mutations.forEach(function(mutation) {
+ if (mutation.addedNodes.length) {
+ capitalFields.forEach(fieldId => {
+ const field = document.getElementById(fieldId);
+ if (field && !field.hasAttribute('data-tarif-listener')) {
+ field.setAttribute('data-tarif-listener', 'true');
+ let originalValue = field.value || field.dataset.defaultValue || '';
+ field.addEventListener('input', function(e) {
+ if (isRestoringValue) return;
+
+ setTimeout(() => {
+ if (!tarif || !tarif.id || !tarifOriginalData || isRestoringValue) return;
+ const currentData = getCurrentActivityData();
+ if (checkTarifImpact('activity', currentData)) {
+ const currentValue = this.value;
+ showTarifImpactModal((confirmed) => {
+ if (confirmed) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`;
+ }
+ }, this, originalValue);
+ } else {
+ originalValue = this.value;
+ }
+ }, 200);
+ });
+ }
+ });
+ }
+ });
+ });
+
+ observer.observe(document.body, {
+ childList: true,
+ subtree: true
+ });
+
+ const switchPJ = document.getElementById('switchPJ');
+ if (switchPJ) {
+ switchPJ.addEventListener('change', function(e) {
+ if (isRestoringValue) return;
+
+ const originalChecked = tarifOriginalData.pj || false;
+
+ setTimeout(() => {
+ if (!tarif || !tarif.id || !tarifOriginalData || isRestoringValue) return;
+ if (this.checked !== originalChecked) {
+ e.stopImmediatePropagation();
+ e.preventDefault();
+ showTarifImpactModal((confirmed) => {
+ if (confirmed) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`;
+ }
+ }, this, originalChecked);
+ }
+ }, 200);
+ }, true);
+ }
+ }
+
+ function checkGarantieRCCImpact(garantieData) {
+ if (!modRCActCompl && !modRCGarAdd) return false;
+
+ const garantiesImpactantes = ['contenant-confie', 'tppc'];
+ const originalGaranties = tarifOriginalData?.garantiesRCC || [];
+ const currentGaranties = garantieData || [];
+
+ for (let garantie of garantiesImpactantes) {
+ const wasSelected = originalGaranties.includes(garantie);
+ const isSelected = currentGaranties.includes(garantie);
+ if (wasSelected !== isSelected) return true;
+ }
+
+ return false;
+ }
+
+ function getCurrentActivityData() {
+ const activitySelector = document.getElementById('activity-selector');
+ const selectedActivities = Array.from(activitySelector.selectedOptions).map(opt => opt.value);
+
+ return {
+ checkVoiturier: selectedActivities.includes('voiturier') || selectedActivities.includes('loueur'),
+ checkCommissionnaire: selectedActivities.includes('commissionnaire-multimodal'),
+ checkDemenageur: selectedActivities.includes('demenageur-particulier') || selectedActivities.includes('demenageur-entreprise') || selectedActivities.includes('demenageur-interne'),
+ checkLogistique: selectedActivities.includes('entrepositaire-depositaire') || selectedActivities.includes('prestataire-logistique'),
+ checkAutocariste: selectedActivities.includes('autocariste'),
+ checkAutres: selectedActivities.includes('autres'),
+ capitalVoiturier: document.getElementById("voiturier") ? parseFloat(document.getElementById("voiturier").value) || 0 : (document.getElementById("select-voiturier")?.dataset.defaultValue ? parseFloat(document.getElementById("select-voiturier").dataset.defaultValue) : 0),
+ capitalCommissionnaire: document.getElementById("commissionnaire-multimodal") ? parseFloat(document.getElementById("commissionnaire-multimodal").value) || 0 : (document.getElementById("select-commissionnaire-multimodal")?.dataset.defaultValue ? parseFloat(document.getElementById("select-commissionnaire-multimodal").dataset.defaultValue) : 0),
+ capitalDemenageur: document.getElementById("demenageur-particulier") ? parseFloat(document.getElementById("demenageur-particulier").value) || 0 : (document.getElementById("select-demenageur-particulier")?.dataset.defaultValue ? parseFloat(document.getElementById("select-demenageur-particulier").dataset.defaultValue) : 0),
+ capitalLogistique: document.getElementById("entrepositaire-depositaire") ? parseFloat(document.getElementById("entrepositaire-depositaire").value) || 0 : (document.getElementById("select-entrepositaire-depositaire")?.dataset.defaultValue ? parseFloat(document.getElementById("select-entrepositaire-depositaire").dataset.defaultValue) : 0)
+ };
+ }
+
+ function getCurrentMarchandiseData() {
+ const selectedMarchandises = getSelectedMarchandises();
+ const marchandiseTexts = selectedMarchandises.map(val => {
+ const option = document.querySelector(`#marchandise-selector option[value="${val}"]`);
+ return option ? option.textContent.trim() : val;
+ });
+
+ return {
+ marchandisesVoiturier: marchandiseTexts,
+ marchandisesCommissionnaire: marchandiseTexts,
+ marchandisesDemenageur: marchandiseTexts,
+ marchandisesLogistique: marchandiseTexts,
+ marchandisesAutocariste: marchandiseTexts,
+ marchandisesAutres: marchandiseTexts
+ };
+ }
+
+ function getCurrentZoneData() {
+ const zone1 = document.getElementById("zone1");
+ const zone2 = document.getElementById("zone2");
+ return {
+ zone1: zone1 && (zone1.checked || zone1.disabled),
+ zone2: zone2 && (zone2.checked || zone2.disabled),
+ zone3: document.getElementById("zone3") && document.getElementById("zone3").checked,
+ zone4: document.getElementById("zone4") && document.getElementById("zone4").checked,
+ zone5: document.getElementById("zone5") && document.getElementById("zone5").checked,
+ zone6: document.getElementById("zone6") && document.getElementById("zone6").checked
+ };
+ }
+
+ function getCurrentGarantieRCCData() {
+ const selector = document.getElementById('garantieRCC-selector');
+ return Array.from(selector.selectedOptions).map(opt => opt.value);
+ }
+
+ function getSelectedMarchandises() {
+ const selector = document.getElementById('marchandise-selector');
+ return Array.from(selector.selectedOptions).map(opt => opt.value);
+ }
+
+ function prefillFromTarif() {
+ if (!tarif || !rc) {
+ console.log('⚠️ Pas de données tarif/rc pour pré-remplir');
+ return;
+ }
+
+ console.log('📝 Pré-remplissage depuis tarif...', { rc, tarif });
+
+ function parseArray(value) {
+ if (Array.isArray(value)) return value;
+ if (typeof value === 'string') {
+ try {
+ return JSON.parse(value);
+ } catch {
+ return [];
+ }
+ }
+ return [];
+ }
+
+ const activitySelector = document.getElementById('activity-selector');
+ const marchandiseSelector = document.getElementById('marchandise-selector');
+
+ // ===== ACTIVITÉS =====
+
+ // Voiturier
+ if (rc.checkVoiturier && !projet?.actVoiturier && activitySelector) {
+ console.log(' ✓ Sélection Voiturier, capital:', rc.capitalVoiturier);
+ const voiturierOption = activitySelector.querySelector('option[value="voiturier"]');
+ if (voiturierOption) {
+ voiturierOption.selected = true;
+ if (rc.capitalVoiturier) {
+ voiturierOption.setAttribute('data-default-value', rc.capitalVoiturier);
+ }
+ }
+ }
+
+ // Loueur (souvent coché avec Voiturier)
+ if (rc.checkVoiturier && !projet?.actLoueur && activitySelector) {
+ console.log(' ✓ Sélection Loueur (car Voiturier coché)');
+ const loueurOption = activitySelector.querySelector('option[value="loueur"]');
+ if (loueurOption) {
+ loueurOption.selected = true;
+ }
+ }
+
+ // Commissionnaire → Commissionnaire multimodal
+ if (rc.checkCommissionnaire && !projet?.actMultimodal && activitySelector) {
+ console.log(' ✓ Sélection Commissionnaire multimodal, capital:', rc.capitalCommissionnaire);
+ const multimodalOption = activitySelector.querySelector('option[value="commissionnaire-multimodal"]');
+ if (multimodalOption) {
+ multimodalOption.selected = true;
+ if (rc.capitalCommissionnaire) {
+ multimodalOption.setAttribute('data-default-value', rc.capitalCommissionnaire);
+ }
+ }
+ }
+
+ // Déménageur → Déménageur d'entreprises (pas particuliers)
+ if (rc.checkDemenageur && !projet?.actDemEntr && activitySelector) {
+ console.log(' ✓ Sélection Déménageur d\'entreprises, capital:', rc.capitalDemenageur);
+ const demenageurOption = activitySelector.querySelector('option[value="demenageur-entreprise"]');
+ if (demenageurOption) {
+ demenageurOption.selected = true;
+ if (rc.capitalDemenageur) {
+ demenageurOption.setAttribute('data-default-value', rc.capitalDemenageur);
+ }
+ }
+ }
+
+ // Logistique → Prestataire logistique
+ if (rc.checkLogistique && !projet?.actPrestaLog && activitySelector) {
+ console.log(' ✓ Sélection Prestataire logistique, capital:', rc.capitalLogistique);
+ const logistiqueOption = activitySelector.querySelector('option[value="prestataire-logistique"]');
+ if (logistiqueOption) {
+ logistiqueOption.selected = true;
+ if (rc.capitalLogistique) {
+ logistiqueOption.setAttribute('data-default-value', rc.capitalLogistique);
+ }
+ }
+ }
+
+ // Autocariste
+ if (rc.checkAutocariste && activitySelector) {
+ console.log(' ✓ Sélection Autocariste, capital:', rc.capitalAutocariste);
+ const autocaristeOption = activitySelector.querySelector('option[value="autocariste"]');
+ if (autocaristeOption) {
+ autocaristeOption.selected = true;
+ if (rc.capitalAutocariste) {
+ autocaristeOption.setAttribute('data-default-value', rc.capitalAutocariste);
+ }
+ }
+ }
+
+ // Autres
+ if (rc.checkAutres && activitySelector) {
+ console.log(' ✓ Sélection Autres activités, capital:', rc.capitalAutres);
+ const autresOption = activitySelector.querySelector('option[value="autres"]');
+ if (autresOption) {
+ autresOption.selected = true;
+ if (rc.capitalAutres) {
+ autresOption.setAttribute('data-default-value', rc.capitalAutres);
+ }
+ }
+ }
+
+ // IMPORTANT : Trigger change event pour que Materialize mette à jour l'affichage
+ if (activitySelector) {
+ console.log(' 🔄 Trigger change event sur activity-selector');
+ const changeEvent = new Event('change', { bubbles: true });
+ activitySelector.dispatchEvent(changeEvent);
+
+ // Réinitialiser Materialize FormSelect
+ setTimeout(() => {
+ if (window.M && window.M.FormSelect) {
+ window.M.FormSelect.init(activitySelector);
+ console.log(' ✅ Materialize FormSelect réinitialisé');
+ }
+ }, 100);
+ }
+
+ // ===== MARCHANDISES =====
+
+ if (marchandiseSelector) {
+ const allMarchandises = [
+ ...(parseArray(rc.marchandisesVoiturier)),
+ ...(parseArray(rc.marchandisesCommissionnaire)),
+ ...(parseArray(rc.marchandisesDemenageur)),
+ ...(parseArray(rc.marchandisesLogistique)),
+ ...(parseArray(rc.marchandisesAutocariste)),
+ ...(parseArray(rc.marchandisesAutres))
+ ];
+
+ const uniqueMarchandises = [...new Set(allMarchandises)];
+ console.log(' 📦 Marchandises:', uniqueMarchandises);
+
+ const marchandiseMapping = {
+ 'Marchandises ordinaires': 'ordinaire',
+ 'Marchandises ordinaires et assimilées, les marchandises dangereuses dans le respect de la réglementation': 'ordinaire',
+ 'Véhicules roulants': 'roulant',
+ 'Engins de chantier et engins agricoles': 'engins-chantier-agricole',
+ 'Engins de chantier': 'engins-chantier-agricole',
+ 'Véhicules roulants dans le cadre d\'une activité de déménagement': 'roulant-demenagement',
+ 'Mobiliers usagés – Objets et effets personnels en déménagement': 'mobilier-usages',
+ 'Mobiliers en déménagement': 'mobilier-usages',
+ 'Marchandises périssables sous température dirigée': 'perissable-temperature-dirigee',
+ 'Marchandises périssables': 'perissable-temperature-dirigee',
+ 'Animaux vivants': 'animaux-vivant',
+ 'Marchandises en citerne': 'citerne',
+ 'Transports de béton': 'beton',
+ 'Transport de béton': 'beton',
+ 'Transports exceptionnels': 'exceptionnels',
+ 'Marchandises en vrac transportées en benne': 'vrac',
+ 'Marchandises en benne': 'vrac'
+ };
+
+ uniqueMarchandises.forEach(marchText => {
+ const mappedValue = marchandiseMapping[marchText] || marchText.toLowerCase().replace(/\s+/g, '-');
+ const option = marchandiseSelector.querySelector(`option[value="${mappedValue}"]`);
+ if (option && !option.selected) {
+ option.selected = true;
+ } else if (!option) {
+ // Recherche floue si mapping exact échoue
+ const options = marchandiseSelector.querySelectorAll('option');
+ options.forEach(opt => {
+ if (opt.textContent.trim().includes(marchText) || marchText.includes(opt.textContent.trim().substring(0, 20))) {
+ if (!opt.selected) opt.selected = true;
+ }
+ });
+ }
+ });
+
+ // Trigger change event pour Materialize
+ const changeEvent = new Event('change', { bubbles: true });
+ marchandiseSelector.dispatchEvent(changeEvent);
+
+ setTimeout(() => {
+ if (window.M && window.M.FormSelect) {
+ window.M.FormSelect.init(marchandiseSelector);
+ }
+ }, 100);
+ }
+
+ // ===== ZONES GÉOGRAPHIQUES =====
+
+ if (rc.zone1 !== undefined && !projet?.zone1) {
+ const zone1El = document.getElementById("zone1");
+ if (zone1El) {
+ zone1El.checked = rc.zone1;
+ console.log(' ✓ Zone 1:', rc.zone1);
+ }
+ }
+ if (rc.zone2 !== undefined && !projet?.zone2) {
+ const zone2El = document.getElementById("zone2");
+ if (zone2El) {
+ zone2El.checked = rc.zone2;
+ console.log(' ✓ Zone 2:', rc.zone2);
+ }
+ }
+ if (rc.zone3 !== undefined && !projet?.zone3) {
+ const zone3El = document.getElementById("zone3");
+ if (zone3El) {
+ zone3El.checked = rc.zone3;
+ console.log(' ✓ Zone 3:', rc.zone3);
+ }
+ }
+ if (rc.zone4 !== undefined && !projet?.zone4) {
+ const zone4El = document.getElementById("zone4");
+ if (zone4El) {
+ zone4El.checked = rc.zone4;
+ console.log(' ✓ Zone 4:', rc.zone4);
+ }
+ }
+ if (rc.zone5 !== undefined && !projet?.zone5) {
+ const zone5El = document.getElementById("zone5");
+ if (zone5El) {
+ zone5El.checked = rc.zone5;
+ console.log(' ✓ Zone 5:', rc.zone5);
+ }
+ }
+ if (rc.zone6 !== undefined && !projet?.zone6) {
+ const zone6El = document.getElementById("zone6");
+ if (zone6El) {
+ zone6El.checked = rc.zone6;
+ console.log(' ✓ Zone 6:', rc.zone6);
+ }
+ }
+
+ // ===== TYPE DE COTISATION =====
+
+ if (rc.typeCotisation && !projet?.typeCot) {
+ const radioCot = document.querySelector(`input[name="typeCot"][value="${rc.typeCotisation}"]`);
+ if (radioCot) {
+ radioCot.checked = true;
+ console.log(' ✓ Type cotisation:', rc.typeCotisation);
+ }
+ }
+
+ // ===== CA =====
+
+ if (rc.chiffreAffaires && !projet?.ca) {
+ const caEl = document.getElementById("CA");
+ if (caEl) {
+ caEl.value = rc.chiffreAffaires;
+ console.log(' ✓ CA:', rc.chiffreAffaires);
+ }
+ }
+
+ // ===== RCE (INCLURE LES AUTRES RC) =====
+
+ const hasRCEFromRC = rc && rc.checkRCE;
+ const hasRCEFromTarif = tarif && tarif.checkRCE;
+ if (hasRCEFromRC || hasRCEFromTarif) {
+ console.log(' ✓ RCE activée (checkRCE)');
+ const choixRCEEl = document.getElementById("choixRCE");
+ if (choixRCEEl) {
+ choixRCEEl.checked = true;
+ const garantieRCEEl = document.getElementById('garantieRCE');
+ if (garantieRCEEl) garantieRCEEl.style.display = 'block';
+ const rce1El = document.getElementById('RCE1');
+ if (rce1El) rce1El.style.display = '';
+ const rce2El = document.getElementById('RCE2');
+ if (rce2El) rce2El.style.display = '';
+ }
+ }
+
+ // ===== PROTECTION JURIDIQUE =====
+
+ if (tarif && tarif.checkPJ && !projet?.pj) {
+ console.log(' ✓ Protection Juridique activée');
+ const switchPJEl = document.getElementById("switchPJ");
+ if (switchPJEl) {
+ switchPJEl.checked = true;
+
+ // Afficher la section PJ
+ const pj1El = document.getElementById('PJ1');
+ if (pj1El) pj1El.style.display = '';
+ const pj2El = document.getElementById('PJ2');
+ if (pj2El) pj2El.style.display = '';
+
+ // Pré-remplir les cotisations PJ si disponibles
+ if (tarif.cotPJHT && !projet?.cotPJHT) {
+ const cotPJHTEl = document.getElementById('cotPJHT');
+ if (cotPJHTEl) {
+ cotPJHTEl.value = tarif.cotPJHT;
+ console.log(' ├─ Cotisation PJ HT:', tarif.cotPJHT);
+ }
+ }
+ if (tarif.cotPJTTC && !projet?.cotPJTTC) {
+ const cotPJTTCEl = document.getElementById('cotPJTTC');
+ if (cotPJTTCEl) {
+ cotPJTTCEl.value = tarif.cotPJTTC;
+ console.log(' └─ Cotisation PJ TTC:', tarif.cotPJTTC);
+ }
+ }
+ }
+ }
+
+ // Appliquer les capitaux APRÈS trigger (les inputs sont créés dynamiquement)
+ setTimeout(() => {
+ console.log(' 💰 Application des capitaux sur les inputs créés...');
+
+ // Mapping des activités vers leurs capitaux
+ const capitalMapping = {
+ 'voiturier': rc.capitalVoiturier,
+ 'commissionnaire-multimodal': rc.capitalCommissionnaire,
+ 'demenageur-entreprise': rc.capitalDemenageur,
+ 'prestataire-logistique': rc.capitalLogistique,
+ 'autocariste': rc.capitalAutocariste,
+ 'autres': rc.capitalAutres
+ };
+
+ for (const [activity, capital] of Object.entries(capitalMapping)) {
+ if (capital) {
+ const input = document.getElementById(activity);
+ if (input && !input.value) {
+ input.value = capital;
+ console.log(` ├─ ${activity}: ${capital}`);
+ }
+ }
+ }
+
+ console.log(' ✅ Capitaux appliqués');
+ }, 300);
+
+ // Autres champs (garanties RCC, etc.)
+ const garantieRCCSelector = document.getElementById('garantieRCC-selector');
+ if (garantieRCCSelector && !projet) {
+ if (rc.extRCCModifCalArrim) {
+ const option = garantieRCCSelector.querySelector('option[value="modif-calage-arrimage"]');
+ if (option) option.selected = true;
+ }
+ if (rc.extRCCFerroutage) {
+ const option = garantieRCCSelector.querySelector('option[value="ferroutage"]');
+ if (option) option.selected = true;
+ }
+ if (rc.extRCCFraisRecons) {
+ const option = garantieRCCSelector.querySelector('option[value="frais-reconstitution"]');
+ if (option) option.selected = true;
+ }
+ if (rc.extRCCConfie) {
+ const option = garantieRCCSelector.querySelector('option[value="confie"]');
+ if (option) option.selected = true;
+ }
+ if (rc.extRCCTPPC) {
+ const option = garantieRCCSelector.querySelector('option[value="tppc"]');
+ if (option) option.selected = true;
+ }
+ if (rc.extRCCRegie) {
+ const option = garantieRCCSelector.querySelector('option[value="regie"]');
+ if (option) option.selected = true;
+ }
+ if (rc.extRCCSansMontageDemontage) {
+ const option = garantieRCCSelector.querySelector('option[value="sans-montage-demontage"]');
+ if (option) option.selected = true;
+ }
+ }
+
+ // ===== ACTIVITÉS COMPLÉMENTAIRES =====
+
+ const activitesVoiturier = parseArray(rc.activitesVoiturier);
+ if (activitesVoiturier.length > 0) {
+ const container = document.querySelector('[name="actComplVoiturier/Loueur"]');
+ if (container) {
+ activitesVoiturier.forEach(activite => {
+ const checkboxes = container.querySelectorAll('input[type="checkbox"]');
+ checkboxes.forEach(cb => {
+ const label = cb.nextElementSibling;
+ if (label && label.textContent.trim() === activite) {
+ cb.checked = true;
+ }
+ });
+ });
+ }
+ }
+
+ const activitesCommissionnaire = parseArray(rc.activitesCommissionnaire);
+ if (activitesCommissionnaire.length > 0) {
+ const container = document.querySelector('[name="actComplCommissionnaire de Transport"]');
+ if (container) {
+ activitesCommissionnaire.forEach(activite => {
+ const checkboxes = container.querySelectorAll('input[type="checkbox"]');
+ checkboxes.forEach(cb => {
+ const label = cb.nextElementSibling;
+ if (label && label.textContent.trim() === activite) {
+ cb.checked = true;
+ }
+ });
+ });
+ }
+ }
+
+ const activitesDemenageur = parseArray(rc.activitesDemenageur);
+ if (activitesDemenageur.length > 0) {
+ const container = document.querySelector('[name="actComplDéménageur"]');
+ if (container) {
+ activitesDemenageur.forEach(activite => {
+ const checkboxes = container.querySelectorAll('input[type="checkbox"]');
+ checkboxes.forEach(cb => {
+ const label = cb.nextElementSibling;
+ if (label && label.textContent.trim() === activite) {
+ cb.checked = true;
+ }
+ });
+ });
+ }
+ }
+
+ const activitesLogistique = parseArray(rc.activitesLogistique);
+ if (activitesLogistique.length > 0) {
+ const container = document.querySelector('[name="actComplLogistique"]');
+ if (container) {
+ activitesLogistique.forEach(activite => {
+ const checkboxes = container.querySelectorAll('input[type="checkbox"]');
+ checkboxes.forEach(cb => {
+ const label = cb.nextElementSibling;
+ if (label && label.textContent.trim() === activite) {
+ cb.checked = true;
+ }
+ });
+ });
+ }
+ }
+
+ if (activitySelector) {
+ activitySelector.dispatchEvent(new Event('change'));
+ }
+ if (marchandiseSelector) {
+ marchandiseSelector.dispatchEvent(new Event('change'));
+ }
+ }
+
+ // Configuration des écouteurs d'événements
+ function setupEventListeners() {
+ document.getElementById('projetFormBtn').addEventListener('click', handleSubmitForm);
+
+ document.getElementById('loadHistoriqueBtn').addEventListener('click', function () {
+ handleLoadHistoriqueBtn();
+ });
+
+ document.getElementById('activity-selector').addEventListener('change', function () {
+ handleActivitySelection();
+ });
+
+ document.getElementById('marchandise-selector').addEventListener('change', function () {
+ handleMarchandiseSelection();
+ });
+
+ document.getElementById('garantieRCC-selector').addEventListener('change', function () {
+ handleGarantieRCCSelection();
+ });
+
+ document.getElementById('garantieRCE-selector').addEventListener('change', function () {
+ handleGarantieRCESelection();
+ });
+
+ document.getElementById('choixRCE').addEventListener('change', function () {
+ if (document.getElementById("choixRCE").checked) {
+ document.getElementById('garantieRCE').style.display = 'block';
+ document.getElementById('RCE1').style.display = '';
+ document.getElementById('RCE2').style.display = '';
+ } else {
+ document.getElementById('garantieRCE').style.display = 'none';
+ document.getElementById('RCE1').style.display = 'none';
+ document.getElementById('RCE2').style.display = 'none';
+ document.getElementById('cotRCEHT').value = '';
+ document.getElementById('cotRCETTC').value = '';
+ document.getElementById('tauxRCEHT').value = '';
+ document.getElementById('tauxRCETTC').value = '';
+ }
+
+ calcCotTotal();
+ });
+
+ document.getElementById('btnAddAdditionnel').addEventListener('click', function () {
+ const nomValue = document.getElementById('nomAdditionnel').value || 'Non défini';
+ const adresseValue = document.getElementById('adresseAditionnel').value || 'Non défini';
+ const siretValue = document.getElementById('siretAdditionnel').value || 'Non défini';
+
+ addRowAdditionnel(nomValue, adresseValue, siretValue);
+ });
+
+ document.getElementById('btnAddVehicule').addEventListener('click', function () {
+ const marqueValue = document.getElementById('marqueVehicule').value || 'Non défini';
+ const genreValue = document.getElementById('genreVehicule').value || 'Non défini';
+ const typeValue = document.getElementById('typeVehicule').value || 'Non défini';
+ const immatValue = document.getElementById('immatVehicule').value || 'Non défini';
+ const capitalValue = document.getElementById('capitalVehicule').value || 'Non défini';
+
+ addRowVehicule(marqueValue, genreValue, typeValue, immatValue, capitalValue);
+ });
+
+ document.getElementById('btnAdvaloTerrestre').addEventListener('click', function () {
+ document.getElementById('divAdvaloTerrestre').style.display = "block";
+ document.getElementById('divAdvaloMultimodal').style.display = "none";
+ document.getElementById('divAdvaloAerien').style.display = "none";
+ });
+
+ document.getElementById('btnAdvaloMultimodal').addEventListener('click', function () {
+ document.getElementById('divAdvaloTerrestre').style.display = "none";
+ document.getElementById('divAdvaloMultimodal').style.display = "block";
+ document.getElementById('divAdvaloAerien').style.display = "none";
+ });
+
+ document.getElementById('btnAdvaloAerien').addEventListener('click', function () {
+ document.getElementById('divAdvaloTerrestre').style.display = "none";
+ document.getElementById('divAdvaloMultimodal').style.display = "none";
+ document.getElementById('divAdvaloAerien').style.display = "block";
+ });
+
+ document.getElementById('switchPJ').addEventListener('change', function () {
+ if (document.getElementById("switchPJ").checked) {
+ document.getElementById('PJ1').style.display = '';
+ document.getElementById('PJ2').style.display = '';
+ } else {
+ document.getElementById('PJ1').style.display = 'none';
+ document.getElementById('PJ2').style.display = 'none';
+ document.getElementById('cotPJHT').value = '';
+ document.getElementById('cotPJTTC').value = '';
+ }
+ calcCotTotal();
+ });
+
+ function restoreZonesFromOriginal() {
+ const orig = tarifOriginalData || {};
+ ['zone1','zone2','zone3','zone4','zone5','zone6'].forEach(z => {
+ const el = document.getElementById(z);
+ if (el) {
+ el.disabled = false;
+ el.checked = Boolean(orig[z]);
+ }
+ });
+ }
+
+ document.getElementById('btnMondeEntier').addEventListener('click', function () {
+ document.getElementById('zone1').checked = true;
+ document.getElementById('zone1').disabled = true;
+ document.getElementById('zone2').checked = true;
+ document.getElementById('zone2').disabled = true;
+ document.getElementById('zone3').checked = true;
+ document.getElementById('zone4').checked = true;
+ document.getElementById('zone5').checked = true;
+ document.getElementById('zone6').checked = true;
+
+ // Détection impact tarif : zones
+ if (tarif && tarif.id && tarifOriginalData) {
+ const currentData = getCurrentZoneData();
+ if (checkTarifImpact('zone', currentData)) {
+ showTarifImpactModal((confirmed) => {
+ if (confirmed) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`;
+ }
+ }, null, null);
+ // Revenir à l'état original visuel
+ restoreZonesFromOriginal();
+ }
+ }
+
+ handleGrAdvalo();
+ });
+
+ document.getElementById('btnReset').addEventListener('click', function () {
+ document.getElementById('zone1').checked = false;
+ document.getElementById('zone1').disabled = false;
+ document.getElementById('zone2').checked = false;
+ document.getElementById('zone2').disabled = false;
+ document.getElementById('zone3').checked = false;
+ document.getElementById('zone4').checked = false;
+ document.getElementById('zone5').checked = false;
+ document.getElementById('zone6').checked = false;
+
+ // Détection impact tarif : zones
+ if (tarif && tarif.id && tarifOriginalData) {
+ const currentData = getCurrentZoneData();
+ if (checkTarifImpact('zone', currentData)) {
+ showTarifImpactModal((confirmed) => {
+ if (confirmed) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`;
+ }
+ }, null, null);
+ // Revenir à l'état original visuel
+ restoreZonesFromOriginal();
+ }
+ }
+
+ handleGrAdvalo();
+ });
+
+ document.getElementById('btnZone1').addEventListener('click', function () {
+ const elem = document.getElementById('modalZone1');
+ const instance = M.Modal.getInstance(elem);
+ instance.open();
+ });
+
+ document.getElementById('btnZone2').addEventListener('click', function () {
+ const elem = document.getElementById('modalZone2');
+ const instance = M.Modal.getInstance(elem);
+ instance.open();
+ });
+
+ document.getElementById('btnZone3').addEventListener('click', function () {
+ const elem = document.getElementById('modalZone3');
+ const instance = M.Modal.getInstance(elem);
+ instance.open();
+ });
+
+ document.getElementById('btnZone4').addEventListener('click', function () {
+ const elem = document.getElementById('modalZone4');
+ const instance = M.Modal.getInstance(elem);
+ instance.open();
+ });
+
+ document.getElementById('btnZone5').addEventListener('click', function () {
+ const elem = document.getElementById('modalZone5');
+ const instance = M.Modal.getInstance(elem);
+ instance.open();
+ });
+
+ document.getElementById('btnZone6').addEventListener('click', function () {
+ const elem = document.getElementById('modalZone6');
+ const instance = M.Modal.getInstance(elem);
+ instance.open();
+ });
+
+ document.getElementById('btnZone7').addEventListener('click', function () {
+ const elem = document.getElementById('modalZoneExclus');
+ const instance = M.Modal.getInstance(elem);
+ instance.open();
+ });
+
+ document.getElementById('zone1').addEventListener('click', function () {
+ handleGrAdvalo();
+
+ if (tarif && tarif.id && tarifOriginalData) {
+ const currentData = getCurrentZoneData();
+ if (checkTarifImpact('zone', currentData)) {
+ showTarifImpactModal((confirmed) => {
+ if (confirmed) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`;
+ }
+ }, null, null);
+ restoreZonesFromOriginal();
+ }
+ }
+ });
+
+ document.getElementById('zone2').addEventListener('click', function () {
+ if (document.getElementById('zone2').checked == true) {
+ document.getElementById('zone1').checked = true;
+ document.getElementById('zone1').disabled = true;
+ } else if (document.getElementById('zone2').checked == false) {
+ document.getElementById('zone1').checked = true;
+ document.getElementById('zone1').disabled = false;
+ }
+
+ handleGrAdvalo();
+
+ if (tarif && tarif.id && tarifOriginalData) {
+ const currentData = getCurrentZoneData();
+ if (checkTarifImpact('zone', currentData)) {
+ showTarifImpactModal((confirmed) => {
+ if (confirmed) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`;
+ }
+ }, null, null);
+ restoreZonesFromOriginal();
+ }
+ }
+ });
+
+ document.getElementById('zone3').addEventListener('click', function () {
+ if (document.getElementById('zone3').checked == true) {
+ document.getElementById('zone2').checked = true;
+ document.getElementById('zone1').checked = true;
+ document.getElementById('zone2').disabled = true;
+ document.getElementById('zone1').disabled = true;
+ } else if (document.getElementById('zone3').checked == false) {
+ document.getElementById('zone1').checked = true;
+ document.getElementById('zone1').disabled = true;
+ document.getElementById('zone2').checked = true;
+ document.getElementById('zone2').disabled = false;
+ }
+
+ handleGrAdvalo();
+
+ if (tarif && tarif.id && tarifOriginalData) {
+ const currentData = getCurrentZoneData();
+ if (checkTarifImpact('zone', currentData)) {
+ showTarifImpactModal((confirmed) => {
+ if (confirmed) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`;
+ }
+ }, null, null);
+ restoreZonesFromOriginal();
+ }
+ }
+ });
+
+ document.getElementById('zone4').addEventListener('click', function () {
+ handleGrAdvalo();
+
+ if (tarif && tarif.id && tarifOriginalData) {
+ const currentData = getCurrentZoneData();
+ if (checkTarifImpact('zone', currentData)) {
+ showTarifImpactModal((confirmed) => {
+ if (confirmed) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`;
+ }
+ }, null, null);
+ restoreZonesFromOriginal();
+ }
+ }
+ });
+
+ document.getElementById('zone5').addEventListener('click', function () {
+ handleGrAdvalo();
+
+ if (tarif && tarif.id && tarifOriginalData) {
+ const currentData = getCurrentZoneData();
+ if (checkTarifImpact('zone', currentData)) {
+ showTarifImpactModal((confirmed) => {
+ if (confirmed) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`;
+ }
+ }, null, null);
+ restoreZonesFromOriginal();
+ }
+ }
+ });
+
+ document.getElementById('zone6').addEventListener('click', function () {
+ handleGrAdvalo();
+
+ if (tarif && tarif.id && tarifOriginalData) {
+ const currentData = getCurrentZoneData();
+ if (checkTarifImpact('zone', currentData)) {
+ showTarifImpactModal((confirmed) => {
+ if (confirmed) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`;
+ }
+ }, null, null);
+ restoreZonesFromOriginal();
+ }
+ }
+ });
+
+ var radioButtonsCot = document.getElementsByName('cotisation');
+ for (var i = 0; i < radioButtonsCot.length; i++) {
+ radioButtonsCot[i].addEventListener('change', function () {
+ if (this.value == "forfaitaire") {
+ document.getElementById("checkVehicules").style.display = 'block';
+ document.getElementById("colTauxAjustement").style.display = 'none';
+ document.getElementById("colCA").style.display = 'none';
+ document.getElementById("colCotMini").style.display = 'none';
+ document.getElementById("colTypeCot").classList.remove('s4');
+ document.getElementById("colTypeCot").classList.add('s6');
+ document.getElementById("colTypeCot").style.margin = "0 auto";
+ document.getElementById("colTypeCot").style.float = "none";
+ document.getElementById("colDetailCot").classList.remove('s6');
+ document.getElementById("colDetailCot").classList.add('s12');
+ } else if (this.value == "revisable") {
+ document.getElementById("checkVehicules").style.display = 'none';
+ document.getElementById("colTauxAjustement").style.display = 'block';
+ document.getElementById("colCA").style.display = 'block';
+ document.getElementById("colCotMini").style.display = 'block';
+ document.getElementById("colTypeCot").classList.remove('s6');
+ document.getElementById("colTypeCot").classList.add('s4');
+ document.getElementById("colTypeCot").style.margin = "";
+ document.getElementById("colTypeCot").style.float = "left";
+ document.getElementById("colDetailCot").classList.remove('s12');
+ document.getElementById("colDetailCot").classList.add('s6');
+ }
+ });
+ };
+
+ var radioButtonsFract = document.getElementsByName('fractionnement');
+ for (var i = 0; i < radioButtonsFract.length; i++) {
+ radioButtonsFract[i].addEventListener('change', function () {
+ if (this.value == "mensuel") {
+ document.getElementById("cotFraisHT").value = 36.00;
+ document.getElementById("cotFraisTTC").value = 36.00;
+
+ calcCotTotal();
+ } else if (this.value == "trimestriel") {
+ document.getElementById("cotFraisHT").value = 144.00;
+ document.getElementById("cotFraisTTC").value = 144.00;
+
+ calcCotTotal();
+ } else if (this.value == "semestriel") {
+ document.getElementById("cotFraisHT").value = 72.00;
+ document.getElementById("cotFraisTTC").value = 72.00;
+
+ calcCotTotal();
+ } else if (this.value == "annuel") {
+ document.getElementById("cotFraisHT").value = 36.00;
+ document.getElementById("cotFraisTTC").value = 36.00;
+
+ calcCotTotal();
+ }
+ });
+ };
+
+ document.getElementById('btnNullDateDebut').addEventListener('click', function () {
+ document.getElementById('dateEffet').value = "00/00/0000";
+ validateField('dateEffet', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('btnNullDateEcheance').addEventListener('click', function () {
+ document.getElementById('dateEcheance').value = "00/00";
+ validateField('dateEcheance', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('btnNullDateFin').addEventListener('click', function () {
+ document.getElementById('dateFin').value = "00/00/0000";
+ validateField('dateFin', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('btnModalDate').addEventListener('click', function () {
+ const elem = document.getElementById('modalDate');
+ const instance = M.Modal.getInstance(elem);
+ instance.open();
+ });
+
+ document.getElementById('btnGarContenantConfie').addEventListener('click', function () {
+ const elem = document.getElementById('modalContenantConfie');
+ const instance = M.Modal.getInstance(elem);
+ instance.open();
+ });
+
+ document.getElementById('speClauses').addEventListener('click', function () {
+ const url = `/download/CLAUSES_PLATEFORME_RC_TRANSPORT_VALIDE_AU_26_02_2025.docx`;
+
+ fetch(url)
+ .then(response => response.blob())
+ .then(blob => {
+ const link = document.createElement('a');
+ link.href = URL.createObjectURL(blob);
+ link.download = 'CLAUSES_PLATEFORME_RC_TRANSPORT_VALIDE_AU_26_02_2025';
+ link.click();
+ })
+ .catch(error => console.error('Error downloading file:', error));
+ });
+
+ document.getElementById('dateEffet').addEventListener('input', function () {
+ validateField('dateEffet', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('dateFin').addEventListener('input', function () {
+ validateField('dateFin', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('dateEcheance').addEventListener('input', function () {
+ validateField('dateEcheance', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('CA').addEventListener('input', function () {
+ if (isRestoringValue) {
+ validateField('CA', true);
+ updateSubmitButtonState('projetForm');
+ calcCotFromTauxCA('tauxRCCHT', 'cotRCCHT');
+ calcAddTaxe('cotRCCHT', 0, 'cotRCCTTC');
+ calcCotFromTauxCA('tauxRCEHT', 'cotRCEHT');
+ calcAddTaxe('cotRCEHT', 0.09, 'cotRCETTC');
+ calcCotIrreductible();
+ calcCotTotal();
+ return;
+ }
+
+ if (tarif && tarif.id && tarifOriginalData) {
+ const currentValue = this.value.trim();
+ const originalValue = tarifOriginalData.ca || '';
+
+ if (currentValue !== originalValue) {
+ const originalValueToRestore = originalValue;
+ showTarifImpactModal((confirmed) => {
+ if (confirmed) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`;
+ }
+ }, this, originalValueToRestore);
+ return;
+ }
+ }
+
+ validateField('CA', true);
+ updateSubmitButtonState('projetForm');
+ calcCotFromTauxCA('tauxRCCHT', 'cotRCCHT');
+ calcAddTaxe('cotRCCHT', 0, 'cotRCCTTC');
+ calcCotFromTauxCA('tauxRCEHT', 'cotRCEHT');
+ calcAddTaxe('cotRCEHT', 0.09, 'cotRCETTC');
+ calcCotIrreductible();
+ calcCotTotal();
+ });
+
+ document.getElementById('cotisationIrreductible').addEventListener('input', function () {
+ validateField('cotisationIrreductible', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('tauxRCCHT').addEventListener('input', function () {
+ validateField('tauxRCCHT', true);
+ updateSubmitButtonState('projetForm');
+ calcAddTaxe('tauxRCCHT', 0, 'tauxRCCTTC');
+ calcTauxTotal();
+ calcCotFromTauxCA('tauxRCCHT', 'cotRCCHT');
+ calcAddTaxe('cotRCCHT', 0, 'cotRCCTTC');
+ calcCotIrreductible();
+ calcCotTotal();
+ });
+
+ document.getElementById('tauxRCCTTC').addEventListener('input', function () {
+ validateField('tauxRCCTTC', true);
+ updateSubmitButtonState('projetForm');
+ calcSubTaxe('tauxRCCHT', 0, 'tauxRCCTTC');
+ calcTauxTotal();
+ calcCotFromTauxCA('tauxRCCHT', 'cotRCCHT');
+ calcAddTaxe('cotRCCHT', 0, 'cotRCCTTC');
+ calcCotIrreductible();
+ calcCotTotal();
+ });
+
+ document.getElementById('tauxRCEHT').addEventListener('input', function () {
+ validateField('tauxRCEHT', true);
+ updateSubmitButtonState('projetForm');
+ calcAddTaxe('tauxRCEHT', 0.09, 'tauxRCETTC');
+ calcTauxTotal();
+ calcCotFromTauxCA('tauxRCEHT', 'cotRCEHT');
+ calcAddTaxe('cotRCEHT', 0.09, 'cotRCETTC');
+ calcCotIrreductible();
+ calcCotTotal();
+ });
+
+ document.getElementById('tauxRCETTC').addEventListener('input', function () {
+ validateField('tauxRCETTC', true);
+ updateSubmitButtonState('projetForm');
+ calcSubTaxe('tauxRCEHT', 0.09, 'tauxRCETTC');
+ calcTauxTotal();
+ calcCotFromTauxCA('tauxRCEHT', 'cotRCEHT');
+ calcAddTaxe('cotRCEHT', 0.09, 'cotRCETTC');
+ calcCotIrreductible();
+ calcCotTotal();
+ });
+
+ document.getElementById('tauxTotalHT').addEventListener('input', function () {
+ validateField('tauxTotalHT', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('tauxTotalTTC').addEventListener('input', function () {
+ validateField('tauxTotalTTC', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('cotRCCHT').addEventListener('input', function () {
+ validateField('cotRCCHT', true);
+ updateSubmitButtonState('projetForm');
+ calcAddTaxe('cotRCCHT', 0, 'cotRCCTTC');
+ calcCotTotal();
+ });
+
+ document.getElementById('cotRCCTTC').addEventListener('input', function () {
+ validateField('cotRCCTTC', true);
+ updateSubmitButtonState('projetForm');
+ calcSubTaxe('cotRCCHT', 0, 'cotRCCTTC');
+ calcCotTotal();
+ });
+
+ document.getElementById('cotRCEHT').addEventListener('input', function () {
+ validateField('cotRCEHT', true);
+ updateSubmitButtonState('projetForm');
+ calcAddTaxe('cotRCEHT', 0.09, 'cotRCETTC');
+ calcCotTotal();
+ });
+
+ document.getElementById('cotRCETTC').addEventListener('input', function () {
+ validateField('cotRCETTC', true);
+ updateSubmitButtonState('projetForm');
+ calcSubTaxe('cotRCEHT', 0.09, 'cotRCETTC');
+ calcCotTotal();
+ });
+
+ document.getElementById('cotPJHT').addEventListener('input', function () {
+ validateField('cotPJHT', true);
+ updateSubmitButtonState('projetForm');
+ calcAddTaxe('cotPJHT', 0.134, 'cotPJTTC');
+ calcCotTotal();
+ });
+
+ document.getElementById('cotPJTTC').addEventListener('input', function () {
+ validateField('cotPJTTC', true);
+ updateSubmitButtonState('projetForm');
+ calcSubTaxe('cotPJHT', 0.134, 'cotPJTTC');
+ calcCotTotal();
+ });
+
+ document.getElementById('cotFraisHT').addEventListener('input', function () {
+ validateField('cotFraisHT', true);
+ updateSubmitButtonState('projetForm');
+ calcAddTaxe('cotFraisHT', 0, 'cotFraisTTC');
+ calcCotTotal();
+ });
+
+ document.getElementById('cotFraisTTC').addEventListener('input', function () {
+ validateField('cotFraisTTC', true);
+ updateSubmitButtonState('projetForm');
+ calcSubTaxe('cotFraisHT', 0, 'cotFraisTTC');
+ calcCotTotal();
+ });
+
+ document.getElementById('cotTotalHT').addEventListener('input', function () {
+ validateField('cotTotalHT', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('cotTotalTTC').addEventListener('input', function () {
+ validateField('cotTotalTTC', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('activity-selector').addEventListener('change', function () {
+ const currentSelection = Array.from(this.selectedOptions).map(option => option.value);
+
+ if (currentSelection.includes("commissionnaire-multimodal")) {
+ if (tagMultimodal == false) {
+ M.toast({html: "Monde entier pour l'activité commissionnaire de transports multimodal"})
+ document.getElementById("btnAdvaloMultimodal").style.display = 'block';
+ document.getElementById("btnAdvaloAerien").style.display = 'block';
+ document.getElementById("btnAdvaloTerrestre").style.display = 'block';
+ document.getElementById('divAdvaloTerrestre').style.display = "none";
+ document.getElementById('divAdvaloAerien').style.display = "none";
+ document.getElementById('divAdvaloMultimodal').style.display = "block";
+ }
+
+ tagMultimodal = true;
+ } else {
+ document.getElementById("btnAdvaloMultimodal").style.display = 'none';
+ document.getElementById("btnAdvaloAerien").style.display = 'none';
+ document.getElementById("btnAdvaloTerrestre").style.display = 'none';
+ document.getElementById('divAdvaloTerrestre').style.display = "block";
+ document.getElementById('divAdvaloAerien').style.display = "none";
+ document.getElementById('divAdvaloMultimodal').style.display = "none";
+
+ tagMultimodal = false;
+ }
+
+ if (currentSelection.includes("demenageur-particulier") || currentSelection.includes("demenageur-particulier-dommage") || currentSelection.includes("demenageur-particulier-advalorem") || currentSelection.includes("demenageur-entreprise") || currentSelection.includes("demenageur-interne")) {
+ if (tagDemenageur == false) {
+ document.getElementById('marchandise-selector').querySelector('option[value="roulant-demenagement"]').selected = true;
+ document.getElementById('marchandise-selector').querySelector('option[value="mobilier-usages"]').selected = true;
+ document.getElementById('marchandise-selector').querySelector('option[value="ordinaire"]').selected = false;
+ document.getElementById('marchandise-selector').dispatchEvent(new Event('change'));
+ }
+
+ tagDemenageur = true;
+ } else {
+ // Aucune activité déménageur n'est sélectionnée
+ document.getElementById('marchandise-selector').querySelector('option[value="roulant-demenagement"]').selected = false;
+ document.getElementById('marchandise-selector').querySelector('option[value="mobilier-usages"]').selected = false;
+ document.getElementById('marchandise-selector').querySelector('option[value="ordinaire"]').selected = true;
+ document.getElementById('marchandise-selector').dispatchEvent(new Event('change'));
+
+ tagDemenageur = false;
+ }
+
+ if (currentSelection.includes("garde-meubles")) {
+ if (tagGardeMeubles == false) {
+ document.getElementById('activity-selector').querySelector('option[value="demenageur-particulier"]').selected = true;
+ tagGardeMeubles = true;
+
+ document.getElementById('activity-selector').dispatchEvent(new Event('change'));
+
+ document.getElementById('selected-demenageur-error').style.display = "block";
+ }
+ } else {
+ if (!(currentSelection.includes("garde-meubles"))) {
+ document.getElementById('selected-demenageur-error').style.display = "none";
+ tagGardeMeubles = false;
+ }
+ }
+
+ if (currentSelection.includes("demenageur-particulier")) {
+ if (tagDemenageurParticulier == false) {
+ document.getElementById('activity-selector').querySelector('option[value="demenageur-particulier-dommage"]').selected = false;
+ document.getElementById('activity-selector').querySelector('option[value="demenageur-particulier-advalorem"]').selected = false;
+ tagDemenageurParticulier = true;
+ document.getElementById('activity-selector').dispatchEvent(new Event('change'));
+ }
+ } else {
+ tagDemenageurParticulier = false;
+ }
+
+ if (currentSelection.includes("demenageur-particulier-dommage")) {
+ if (tagDemenageurParticulierDeclaree == false) {
+ document.getElementById('activity-selector').querySelector('option[value="demenageur-particulier"]').selected = false;
+ document.getElementById('activity-selector').querySelector('option[value="demenageur-particulier-advalorem"]').selected = false;
+ tagDemenageurParticulierDeclaree = true;
+ document.getElementById('activity-selector').dispatchEvent(new Event('change'));
+ }
+ } else {
+ tagDemenageurParticulierDeclaree = false;
+ }
+
+ if (currentSelection.includes("demenageur-particulier-advalorem")) {
+ if (tagDemenageurParticulierAdvalorem == false) {
+ document.getElementById('activity-selector').querySelector('option[value="demenageur-particulier-dommage"]').selected = false;
+ document.getElementById('activity-selector').querySelector('option[value="demenageur-particulier"]').selected = false;
+ tagDemenageurParticulierAdvalorem = true;
+ tagDemenageurParticulierDeclaree = false;
+ tagDemenageurParticulier = false;
+ document.getElementById('activity-selector').dispatchEvent(new Event('change'));
+ }
+ } else {
+ tagDemenageurParticulierAdvalorem = false;
+ }
+
+ if (currentSelection.includes("demenageur-entreprise")) {
+ if (tagDemenageurEntrInter == false) {
+ document.getElementById('activity-selector').querySelector('option[value="demenageur-interne"]').selected = true;
+ tagDemenageurEntrInter = true;
+ document.getElementById('activity-selector').dispatchEvent(new Event('change'));
+ document.getElementById('selected-demenageur-entreprise-error').style.display = "block";
+ }
+ } else {
+ document.getElementById('selected-demenageur-entreprise-error').style.display = "none";
+ tagDemenageurEntrInter = false;
+ }
+
+ if (currentSelection.includes("entrepositaire-depositaire") || currentSelection.includes("prestataire-logistique") || currentSelection.includes("manutentionnaire-levageur")) {
+ if (tagVoiturier == false) {
+ document.getElementById('activity-selector').querySelector('option[value="voiturier"]').selected = true;
+ tagVoiturier = true;
+ document.getElementById('activity-selector').dispatchEvent(new Event('change'));
+ document.getElementById('selected-voiturier-error').style.display = "block";
+ }
+ } else {
+ // Aucune activité nécessitant voiturier n'est sélectionnée
+ tagVoiturier = false;
+ document.getElementById('selected-voiturier-error').style.display = "none";
+ }
+
+ if (currentSelection.length == 1) {
+ document.getElementById('activity-selector').querySelector('option[value="voiturier"]').selected = true;
+ document.getElementById('activity-selector').querySelector('option[value="loueur"]').selected = true;
+ document.getElementById('activity-selector').dispatchEvent(new Event('change'));
+ M.FormSelect.init(document.querySelectorAll('select'));
+ document.getElementById('mini-activity-error').style.display = "block";
+ } else {
+ document.getElementById("mini-activity-error").style.display = "none";
+ }
+
+ handleGrAdvalo();
+ });
+
+ document.getElementById('marchandise-selector').addEventListener('change', function () {
+ const currentSelection = Array.from(this.selectedOptions).map(option => option.value);
+
+ if (currentSelection.includes("beton")) {
+ document.getElementById("choixRCE").checked = false;
+ document.getElementById('garantieRCE').style.display = 'none';
+ document.getElementById('RCE1').style.display = 'none';
+ document.getElementById('RCE2').style.display = 'none';
+ document.getElementById('selected-RCE2-error').style.display = "block";
+ } else {
+ if (!(currentSelection.includes("beton"))) {
+ document.getElementById('selected-RCE2-error').style.display = "none";
+ }
+ }
+
+ if (currentSelection.length == 1) {
+ document.getElementById('marchandise-selector').querySelector('option[value="ordinaire"]').selected = true;
+ document.getElementById('marchandise-selector').dispatchEvent(new Event('change'));
+ document.getElementById("mini-marchandise-error").style.display = "block";
+ } else {
+ document.getElementById("mini-marchandise-error").style.display = "none";
+ }
+
+ if (currentSelection.includes("animaux-vivant")) {
+ if (tagAnimauxVivants == false) {
+ // Retire le display select en cas d'animaux vivants
+ M.FormSelect.init(document.querySelectorAll('select'));
+
+ const elem = document.getElementById('modalAnimauxVivants');
+ const instance = M.Modal.getInstance(elem);
+ instance.open();
+ }
+
+ tagAnimauxVivants = true;
+ } else {
+ if (!(currentSelection.includes("animaux-vivant"))) {
+ tagAnimauxVivants = false;
+ }
+ }
+
+ handleGrAdvalo();
+ });
+
+ document.getElementById('garantieRCC-selector').addEventListener('change', function () {
+ const currentSelection = Array.from(this.selectedOptions).map(option => option.value);
+
+ if (currentSelection.includes("contenant-confie")) {
+ document.getElementById('garContenantConfie').style.display = "block";
+ } else {
+ if (!(currentSelection.includes("contenant-confie"))) {
+ document.getElementById('garContenantConfie').style.display = "none";
+ }
+ }
+ });
+ }
+
+ // Handle event spécifique au limite de garantie activité
+ window.handleInputActivity = function (inputId) {
+ validateField(inputId, true);
+ updateSubmitButtonState('projetForm');
+ };
+
+ // Peupler le formulaire avec les données
+ function populateFormData() {
+ //Poupulate select historique
+ if (!contrat.historique) {
+ document.getElementById('historiqueDiv').style.display = "none";
+ } else {
+ document.getElementById('historiqueDiv').style.display = "block";
+
+ const idSelect = document.getElementById('idSelect');
+
+ contrat.historique.forEach(function (item) {
+ var option = document.createElement('option');
+ option.value = item.id;
+ option.textContent = item.type + " " + item.produit + " - " + item.date + " - " + item.heure;
+
+ if (item.nom != undefined && item.prenom != undefined) {
+ option.textContent += " - " + item.nom + " " + item.prenom;
+ }
+
+ idSelect.appendChild(option);
+ });
+
+ M.FormSelect.init(idSelect);
+ }
+
+ // Pré-remplir depuis le tarif si disponible (même si projet existe, on complète avec les données du tarif)
+ if (tarif && tarif.id) {
+ setTimeout(() => {
+ prefillFromTarif();
+
+ // S'assurer que "Inclure les autres RC" est coché après prefillFromTarif
+ setTimeout(() => {
+ const hasRCEProjet = projet && (projet.autresRC || projet.extRCEBraDebra || projet.extRCEMontageDemontage);
+ const hasRCERC = rc && rc.checkRCE;
+ const hasRCETarif = tarif && tarif.checkRCE;
+ const hasRCE = hasRCEProjet || hasRCERC || hasRCETarif;
+
+ if (hasRCE) {
+ const choixRCEEl = document.getElementById("choixRCE");
+ if (choixRCEEl) {
+ choixRCEEl.checked = true;
+ const garantieRCEEl = document.getElementById('garantieRCE');
+ if (garantieRCEEl) garantieRCEEl.style.display = 'block';
+ const rce1El = document.getElementById('RCE1');
+ if (rce1El) rce1El.style.display = '';
+ const rce2El = document.getElementById('RCE2');
+ if (rce2El) rce2El.style.display = '';
+ }
+ }
+ }, 200);
+ }, 300);
+ }
+
+ // S'assurer que "Inclure les autres RC" est coché si nécessaire (après le chargement de toutes les données projet)
+ setTimeout(() => {
+ const hasRCEProjet = projet && (projet.autresRC || projet.extRCEBraDebra || projet.extRCEMontageDemontage);
+ const hasRCERC = rc && rc.checkRCE;
+ const hasRCETarif = tarif && tarif.checkRCE;
+ const hasRCE = hasRCEProjet || hasRCERC || hasRCETarif;
+
+ if (hasRCE) {
+ const choixRCEEl = document.getElementById("choixRCE");
+ if (choixRCEEl && !choixRCEEl.checked) {
+ choixRCEEl.checked = true;
+ const garantieRCEEl = document.getElementById('garantieRCE');
+ if (garantieRCEEl) garantieRCEEl.style.display = 'block';
+ const rce1El = document.getElementById('RCE1');
+ if (rce1El) rce1El.style.display = '';
+ const rce2El = document.getElementById('RCE2');
+ if (rce2El) rce2El.style.display = '';
+ }
+ }
+ }, 600);
+
+ // Populate par défaut Voiturier / Loueur
+ if (!projet && !tarif) {
+ document.getElementById('activity-selector').querySelector('option[value="voiturier"]').selected = true;
+ document.getElementById('activity-selector').querySelector('option[value="loueur"]').selected = true;
+ document.getElementById('activity-selector').dispatchEvent(new Event('change'));
+ }
+
+ // Populate assurés additionnel
+ if (!projet || !projet.assureAdditionnel || Object.keys(projet.assureAdditionnel).length === 0) {
+ console.log("Le JSON est vide, pas d'assurés additionnels à pré-remplir.");
+ } else {
+ document.getElementById('additionel').checked = true;
+ document.getElementById('checkAdditionnel').style.display = "block";
+
+ for (let i = 0; i < projet.assureAdditionnel.length; i++) {
+ const row = projet.assureAdditionnel[i];
+ addRowAdditionnel(row.nom, row.adresse, row.siret);
+ }
+ }
+
+ // Populate activite
+ const activitySelector = document.getElementById('activity-selector');
+
+ if (projet && projet.actVoiturier) {
+ activitySelector.querySelector('option[value="voiturier"]').selected = true;
+ document.getElementById("select-voiturier").dataset.defaultValue = projet.valueActVoiturier;
+ };
+
+ if (projet && projet.actLoueur) {
+ activitySelector.querySelector('option[value="loueur"]').selected = true;
+ document.getElementById("select-loueur").dataset.defaultValue = projet.valueActLoueur;
+ };
+
+ if (projet && projet.actMultimodal) {
+ tagMultimodal = true;
+ activitySelector.querySelector('option[value="commissionnaire-multimodal"]').selected = true;
+ document.getElementById("select-commissionnaire-multimodal").dataset.defaultValue = projet.valueActMultimodal;
+ document.getElementById("btnAdvaloMultimodal").style.display = 'block';
+ document.getElementById("btnAdvaloAerien").style.display = 'block';
+ document.getElementById("btnAdvaloTerrestre").style.display = 'block';
+ document.getElementById('divAdvaloTerrestre').style.display = "none";
+ document.getElementById('divAdvaloAerien').style.display = "none";
+ document.getElementById('divAdvaloMultimodal').style.display = "block";
+ };
+
+ if (projet && projet.actDouane) {
+ activitySelector.querySelector('option[value="représentant-douane"]').selected = true;
+ document.getElementById("select-représentant-douane").dataset.defaultValue = projet.valueActDouane;
+ };
+
+ if (projet && projet.actDemPar) {
+ activitySelector.querySelector('option[value="demenageur-particulier"]').selected = true;
+ document.getElementById("select-demenageur-particulier").dataset.defaultValue = projet.valueActDemPar;
+ }
+
+ if (projet && projet.actDemParDom) {
+ activitySelector.querySelector('option[value="demenageur-particulier-dommage"]').selected = true;
+ document.getElementById("select-demenageur-particulier-dommage").dataset.defaultValue = projet.valueActDemParDom;
+ }
+
+ if (projet && projet.actDemParAdv) {
+ activitySelector.querySelector('option[value="demenageur-particulier-advalorem"]').selected = true;
+ document.getElementById("select-demenageur-particulier-advalorem").dataset.defaultValue = projet.valueActDemParAdv;
+ }
+
+ if (projet && projet.actDemEntr) {
+ activitySelector.querySelector('option[value="demenageur-entreprise"]').selected = true;
+ document.getElementById("select-demenageur-entreprise").dataset.defaultValue = projet.valueActDemEntr;
+ }
+
+ if (projet && projet.actDemInterne) {
+ activitySelector.querySelector('option[value="demenageur-interne"]').selected = true;
+ document.getElementById("select-demenageur-interne").dataset.defaultValue = projet.valueActDemInterne;
+ }
+
+ if (projet && projet.actGardeMeuble) {
+ activitySelector.querySelector('option[value="garde-meubles"]').selected = true;
+ document.getElementById("select-garde-meubles").dataset.defaultValue = projet.valueActGardeMeuble;
+ }
+
+ if (projet && projet.actEntDep) {
+ activitySelector.querySelector('option[value="entrepositaire-depositaire"]').selected = true;
+ document.getElementById("select-entrepositaire-depositaire").dataset.defaultValue = projet.valueActEntDep;
+ }
+
+ if (projet && projet.actPrestaLog) {
+ activitySelector.querySelector('option[value="prestataire-logistique"]').selected = true;
+ document.getElementById("select-prestataire-logistique").dataset.defaultValue = projet.valueActPrestaLog;
+ }
+
+ if (projet && projet.actLevageur) {
+ activitySelector.querySelector('option[value="manutentionnaire-levageur"]').selected = true;
+ document.getElementById("select-manutentionnaire-levageur").dataset.defaultValue = projet.valueActLevageur;
+ }
+
+ if (projet && projet.actTransitaire) {
+ activitySelector.querySelector('option[value="transitaire"]').selected = true;
+ document.getElementById("select-transitaire").dataset.defaultValue = projet.valueActTransitaire;
+ }
+
+ document.getElementById('activity-selector').dispatchEvent(new Event('change'));
+
+ // Populate marchandises
+ const marchandiseSelector = document.getElementById('marchandise-selector');
+
+ if (projet && projet.marOrdinaire) { marchandiseSelector.querySelector('option[value="ordinaire"]').selected = true; };
+ if (projet && projet.marRoulant) { marchandiseSelector.querySelector('option[value="roulant"]').selected = true; };
+ if (projet && projet.marEngins) { marchandiseSelector.querySelector('option[value="engins-chantier-agricole"]').selected = true; };
+ if (projet && projet.marRoulantDem) { marchandiseSelector.querySelector('option[value="roulant-demenagement"]').selected = true; };
+ if (projet && projet.marMobilerUsag) { marchandiseSelector.querySelector('option[value="mobilier-usages"]').selected = true; };
+ if (projet && projet.marPerissable) { marchandiseSelector.querySelector('option[value="perissable-temperature-dirigee"]').selected = true; };
+ if (projet && projet.marAnimaux) {
+ tagAnimauxVivants = true;
+ marchandiseSelector.querySelector('option[value="animaux-vivant"]').selected = true;
+ };
+ if (projet && projet.marCiterne) { marchandiseSelector.querySelector('option[value="citerne"]').selected = true; };
+ if (projet && projet.marBeton) { marchandiseSelector.querySelector('option[value="beton"]').selected = true; };
+ if (projet && projet.marExceptionnels) { marchandiseSelector.querySelector('option[value="exceptionnels"]').selected = true; };
+ if (projet && projet.marVrac) { marchandiseSelector.querySelector('option[value="vrac"]').selected = true; };
+
+ document.getElementById('marchandise-selector').dispatchEvent(new Event('change'));
+
+ // Populate territorialité - depuis projet OU depuis rc (tarif) en fallback
+ const zonesSource = projet || rc;
+ if (zonesSource) {
+ if (zonesSource.zone1) {
+ document.getElementById("zone1").checked = true;
+ document.getElementById("zone1").disabled = false;
+ }
+ if (zonesSource.zone2) {
+ document.getElementById("zone2").checked = true;
+ document.getElementById("zone2").disabled = false;
+ if (!zonesSource.zone1) {
+ document.getElementById("zone1").checked = true;
+ document.getElementById("zone1").disabled = true;
+ }
+ }
+ if (zonesSource.zone3) {
+ document.getElementById("zone3").checked = true;
+ document.getElementById("zone3").disabled = false;
+ if (!zonesSource.zone2) {
+ document.getElementById("zone2").checked = true;
+ document.getElementById("zone2").disabled = true;
+ }
+ if (!zonesSource.zone1) {
+ document.getElementById("zone1").checked = true;
+ document.getElementById("zone1").disabled = true;
+ }
+ }
+ if (zonesSource.zone4) {
+ document.getElementById("zone4").checked = true;
+ document.getElementById("zone4").disabled = false;
+ }
+ if (zonesSource.zone5) {
+ document.getElementById("zone5").checked = true;
+ document.getElementById("zone5").disabled = false;
+ }
+ if (zonesSource.zone6) {
+ document.getElementById("zone6").checked = true;
+ document.getElementById("zone6").disabled = false;
+ }
+ }
+
+ // Populate extensions de garantie RCC
+ const garantieRCCSelector = document.getElementById('garantieRCC-selector');
+
+ if (projet && projet.extRCCModifCalArrim) { garantieRCCSelector.querySelector('option[value="modif-calage-arrimage"]').selected = true; };
+ if (projet && projet.extRCCFerroutage) { garantieRCCSelector.querySelector('option[value="ferroutage"]').selected = true; };
+ if (projet && projet.extRCCFraisRecons) { garantieRCCSelector.querySelector('option[value="frais-reconstitution"]').selected = true; };
+ if (projet && projet.extRCCConfie) {
+ garantieRCCSelector.querySelector('option[value="contenant-confie"]').selected = true;
+
+ if (projet.typeExtConfies == "ADVALOREM") {
+ document.getElementById("AdValorem").checked = true;
+ } else {
+ document.getElementById("ValeurDeclaree").checked = true;
+ }
+ };
+ if (projet && projet.extRCCTPPC) { garantieRCCSelector.querySelector('option[value="tppc"]').selected = true; };
+ if (projet && projet.extRCCRegie) { garantieRCCSelector.querySelector('option[value="regie"]').selected = true; };
+ if (projet && projet.extRCCSansMontageDemontage) { garantieRCCSelector.querySelector('option[value="sans-montage-demontage"]').selected = true; };
+
+ document.getElementById('garantieRCC-selector').dispatchEvent(new Event('change'));
+
+ // Populate extensions de garantie RCE - DOIT être fait APRÈS le chargement des données projet
+ setTimeout(() => {
+ const hasRCEProjet = projet && (projet.autresRC || projet.extRCEBraDebra || projet.extRCEMontageDemontage);
+ const hasRCERC = rc && rc.checkRCE;
+ const hasRCETarif = tarif && tarif.checkRCE;
+ const hasRCE = hasRCEProjet || hasRCERC || hasRCETarif;
+
+ if (hasRCE) {
+ const choixRCEEl = document.getElementById("choixRCE");
+ if (choixRCEEl) {
+ choixRCEEl.checked = true;
+ const garantieRCEEl = document.getElementById('garantieRCE');
+ if (garantieRCEEl) {
+ garantieRCEEl.style.display = 'block';
+ }
+ const rce1El = document.getElementById('RCE1');
+ if (rce1El) {
+ rce1El.style.display = '';
+ }
+ const rce2El = document.getElementById('RCE2');
+ if (rce2El) {
+ rce2El.style.display = '';
+ }
+ }
+ }
+ }, 100);
+
+ const garantieRCESelector = document.getElementById('garantieRCE-selector');
+ if (garantieRCESelector) {
+ if (projet && projet.extRCEBraDebra) {
+ const option = garantieRCESelector.querySelector('option[value="branchement-debranchement"]');
+ if (option) option.selected = true;
+ }
+ if (projet && projet.extRCEMontageDemontage) {
+ const option = garantieRCESelector.querySelector('option[value="montage-demontage"]');
+ if (option) option.selected = true;
+ }
+ garantieRCESelector.dispatchEvent(new Event('change'));
+ }
+
+ // Populate temporalité
+ if (projet && projet.tempo) { document.getElementById(projet.tempo).checked = true };
+ if (projet && projet.dateEffet) { document.getElementById("dateEffet").value = projet.dateEffet };
+ if (projet && projet.dateEcheance) { document.getElementById("dateEcheance").value = projet.dateEcheance };
+
+ if (contrat.type == "TEMPORAIRE") { document.getElementById("rowDateFin").style.display = 'block'; }
+ if (projet && projet.dateFin) { document.getElementById("dateFin").value = projet.dateFin };
+
+ if (projet && projet.programmeInternationale) { document.getElementById("programmeInternationale").checked = true; }
+ if (projet && projet.participationResultat) { document.getElementById("participationResultat").checked = true; }
+
+ if (projet && projet.pj) {
+ document.getElementById("switchPJ").checked = true;
+ document.getElementById('PJ1').style.display = '';
+ document.getElementById('PJ2').style.display = '';
+ }
+
+ // Populate Cotisation - charger depuis RC principal si existe
+ const typeCotFromRC = rc?.typeCotisation || projet?.typeCot;
+ if (typeCotFromRC) {
+ const radioCot = document.getElementById(typeCotFromRC);
+ if (radioCot) radioCot.checked = true;
+ }
+
+ // Populate CA depuis RC principal
+ const caFromRC = rc?.chiffreAffaires || projet?.ca;
+ if (caFromRC) {
+ document.getElementById("CA").value = caFromRC;
+ }
+
+ if ((typeCotFromRC || projet?.typeCot) == "forfaitaire") {
+ document.getElementById("checkVehicules").style.display = 'block';
+ document.getElementById("colTauxAjustement").style.display = 'none';
+ document.getElementById("colCotMini").style.display = 'none';
+ document.getElementById("colCA").style.display = 'none';
+ document.getElementById("colTypeCot").classList.remove('s4');
+ document.getElementById("colTypeCot").classList.add('s6');
+ document.getElementById("colTypeCot").style.margin = "0 auto";
+ document.getElementById("colTypeCot").style.float = "none";
+ document.getElementById("colDetailCot").classList.remove('s6');
+ document.getElementById("colDetailCot").classList.add('s12');
+ } else if (rc.typeCot == "revisable") {
+ document.getElementById("checkVehicules").style.display = 'none';
+ document.getElementById("colTauxAjustement").style.display = 'block';
+ document.getElementById("colCA").style.display = 'block';
+ document.getElementById("colCotMini").style.display = 'block';
+ document.getElementById("colTypeCot").style.margin = "";
+ document.getElementById("colTypeCot").style.float = "left";
+ }
+
+ if (projet && projet.ca) { document.getElementById("CA").value = projet.ca };
+ if (projet && projet.cotIrreductible) { document.getElementById("cotisationIrreductible").value = projet.cotIrreductible };
+ if (projet && projet.tauxRCCHT) { document.getElementById("tauxRCCHT").value = projet.tauxRCCHT };
+ if (projet && projet.tauxRCCTTC) { document.getElementById("tauxRCCTTC").value = projet.tauxRCCTTC };
+ if (projet && projet.tauxRCEHT) { document.getElementById("tauxRCEHT").value = projet.tauxRCEHT };
+ if (projet && projet.tauxRCETTC) { document.getElementById("tauxRCETTC").value = projet.tauxRCETTC };
+ if (projet && projet.tauxTotalHT) { document.getElementById("tauxTotalHT").value = projet.tauxTotalHT };
+ if (projet && projet.tauxTotalTTC) { document.getElementById("tauxTotalTTC").value = projet.tauxTotalTTC };
+ if (projet && projet.cotRCCHT) { document.getElementById("cotRCCHT").value = projet.cotRCCHT };
+ if (projet && projet.cotRCCTTC) { document.getElementById("cotRCCTTC").value = projet.cotRCCTTC };
+ if (projet && projet.cotRCEHT) { document.getElementById("cotRCEHT").value = projet.cotRCEHT };
+ if (projet && projet.cotRCETTC) { document.getElementById("cotRCETTC").value = projet.cotRCETTC };
+ if (projet && projet.cotPJHT) { document.getElementById("cotPJHT").value = projet.cotPJHT };
+ if (projet && projet.cotPJTTC) { document.getElementById("cotPJTTC").value = projet.cotPJTTC };
+ if (projet && projet.cotTotalHT) { document.getElementById("cotTotalHT").value = projet.cotTotalHT };
+ if (projet && projet.cotTotalTTC) { document.getElementById("cotTotalTTC").value = projet.cotTotalTTC };
+ if (projet && projet.cotFraisHT) { document.getElementById("cotFraisHT").value = projet.cotFraisHT };
+ if (projet && projet.cotFraisTTC) { document.getElementById("cotFraisTTC").value = projet.cotFraisTTC };
+
+ // Populate tableau vehicule
+ if (!rc || !projet.designationVehicule || Object.keys(projet.designationVehicule).length === 0) {
+ console.log("Le JSON est vide, pas de véhicules à pré-remplir.");
+ } else {
+ for (let i = 0; i < projet.designationVehicule.length; i++) {
+ const row = projet.designationVehicule[i];
+ addRowVehicule(row.marque, row.genre, row.type, row.immat, row.capital);
+ }
+ }
+
+ // Populate Grille Advalorem
+ hasSavedGrilleData = Boolean(
+ (projet?.grilleMultimodal && (Array.isArray(projet.grilleMultimodal) ? projet.grilleMultimodal.length : true)) ||
+ (projet?.grilleTerrestre && (Array.isArray(projet.grilleTerrestre) ? projet.grilleTerrestre.length : true)) ||
+ (projet?.grilleAerien && (Array.isArray(projet.grilleAerien) ? projet.grilleAerien.length : true))
+ );
+
+ const isMultimodal = Boolean(projet?.actMultimodal || rc?.actMultimodal);
+ if (isMultimodal) {
+ if (projet?.grilleAerien) {
+ const grilleAerien = Array.isArray(projet.grilleAerien) ? projet.grilleAerien : (typeof projet.grilleAerien === 'string' ? JSON.parse(projet.grilleAerien) : []);
+ populateGrAdvalo(grilleAerien, "tabAdvaloAerien");
+ document.getElementById('divAdvaloAerien').style.display = "block";
+ document.getElementById('divAdvaloTerrestre').style.display = "none";
+ document.getElementById('divAdvaloMultimodal').style.display = "none";
+ };
+
+ if (projet?.grilleTerrestre) {
+ const grilleTerrestre = Array.isArray(projet.grilleTerrestre) ? projet.grilleTerrestre : (typeof projet.grilleTerrestre === 'string' ? JSON.parse(projet.grilleTerrestre) : []);
+ populateGrAdvalo(grilleTerrestre, "tabAdvaloTerrestre");
+ document.getElementById('divAdvaloTerrestre').style.display = "block";
+ document.getElementById('divAdvaloAerien').style.display = "none";
+ document.getElementById('divAdvaloMultimodal').style.display = "none";
+ };
+
+ if (projet?.grilleMultimodal) {
+ const grilleMultimodal = Array.isArray(projet.grilleMultimodal) ? projet.grilleMultimodal : (typeof projet.grilleMultimodal === 'string' ? JSON.parse(projet.grilleMultimodal) : []);
+ populateGrAdvalo(grilleMultimodal, "tabAdvaloMultimodal");
+ document.getElementById('divAdvaloMultimodal').style.display = "block";
+ document.getElementById('divAdvaloAerien').style.display = "none";
+ document.getElementById('divAdvaloTerrestre').style.display = "none";
+ };
+ } else {
+ if (projet?.grilleTerrestre) {
+ const grilleTerrestre = Array.isArray(projet.grilleTerrestre) ? projet.grilleTerrestre : (typeof projet.grilleTerrestre === 'string' ? JSON.parse(projet.grilleTerrestre) : []);
+ populateGrAdvalo(grilleTerrestre, "tabAdvaloTerrestre");
+ document.getElementById('divAdvaloTerrestre').style.display = "block";
+ document.getElementById('divAdvaloAerien').style.display = "none";
+ document.getElementById('divAdvaloMultimodal').style.display = "none";
+ };
+ }
+ }
+
+ function populateGrAdvalo(jsonData, tableID) {
+ var table = document.getElementById(tableID);
+ if (!table) {
+ console.warn('Table non trouvée:', tableID);
+ return;
+ }
+
+ if (!jsonData || !Array.isArray(jsonData) || jsonData.length === 0) {
+ console.warn('Données grille vides ou invalides pour', tableID, ':', jsonData);
+ return;
+ }
+
+ console.log('Remplissage de la grille', tableID, 'avec', jsonData.length, 'catégories');
+
+ for (var i = 0; i < jsonData.length; i++) {
+ var category = jsonData[i].name;
+ if (!category) continue;
+
+ for (var j = 1; j < table.rows.length; j++) {
+ var categoryName = table.rows[j].cells[0] ? table.rows[j].cells[0].innerText.trim() : '';
+
+ if (categoryName === category) {
+ var categoryRow = table.rows[j];
+
+ for (var k = 1; k <= 6; k++) {
+ var zoneKey = "zone" + k;
+ var zoneInput = categoryRow.cells[k] ? categoryRow.cells[k].querySelector("input[type='text']") : null;
+ if (zoneInput && jsonData[i][zoneKey]) {
+ zoneInput.value = jsonData[i][zoneKey];
+ console.log('Rempli:', category, zoneKey, '=', jsonData[i][zoneKey]);
+ }
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ const categories = {
+ multimodal: {
+ Cat1: [0.06, 0.06, 0.07, 0.09, 0.12, 0.14],
+ Cat2: [0.12, 0.13, 0.14, 0.24, 0.24, 0.3],
+ Cat3: [0.07, 0.08, 0.09, 0.14, 0.14, 0.18],
+ Cat4: [0.14, 0.17, 0.17, 0.29, 0.29, 0.36],
+ Cat5: [0.17, 0.19, 0.21, 0.35, 0.35, 0.43],
+ Cat6: ["Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter"],
+ Cat7: [0.30, 0.33, 0.36, 0.60, 0.60, 0.75],
+ Cat8: ["Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter"]
+ },
+ terrestre: {
+ Cat1: [0.05, 0.053, 0.06, 0.09, 0.12, 0.14],
+ Cat2: [0.10, 0.11, 0.12, 0.24, 0.24, 0.25],
+ Cat3: [0.06, 0.066, 0.07, 0.14, 0.14, 0.15],
+ Cat4: [0.12, 0.132, 0.14, 0.29, 0.29, 0.30],
+ Cat5: [0.14, 0.158, 0.17, 0.35, 0.35, 0.36],
+ Cat6: ["Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter"],
+ Cat7: [0.25, 0.275, 0.3, 0.6, 0.6, 0.63],
+ Cat8: ["Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter"]
+ },
+ aerien: {
+ Cat1: [0.04, 0.04, 0.05, 0.06, 0.08, 0.10],
+ Cat2: [0.09, 0.09, 0.10, 0.13, 0.17, 0.21],
+ Cat3: [0.05, 0.06, 0.06, 0.08, 0.10, 0.13],
+ Cat4: [0.10, 0.11, 0.12, 0.15, 0.20, 0.26],
+ Cat5: [0.12, 0.13, 0.15, 0.18, 0.24, 0.31],
+ Cat6: ["Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter"],
+ Cat7: [0.21, 0.23, 0.26, 0.32, 0.43, 0.53],
+ Cat8: ["Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter", "Nous consulter"]
+ }
+ };
+
+ function handleGrAdvalo() {
+ for (let i = 1; i <= 6; i++) {
+ const checkZone = document.getElementById("zone" + i).checked;
+
+ for (let j = 1; j <= 6; j++) {
+ // Gestion multimodal
+ updateCategoryValues("multimodal", i, j, checkZone);
+
+ // Gestion terrestre
+ updateCategoryValues("terrestre", i, j, checkZone);
+
+ // Gestion aerien
+ updateCategoryValues("aerien", i, j, checkZone);
+ }
+ }
+ }
+
+ function updateCategoryValues(mode, zone, index, checkZone) {
+ for (let k = 1; k <= 8; k++) {
+ const element = document.getElementById(`${mode}Cat${k}Zone${zone}`);
+ const marPerissable = document.getElementById("perissable-temperature-dirigee-chip") || null;
+ const marEngins = document.getElementById("engins-chantier-agricole-chip") || null;
+ const marMobilier = document.getElementById("mobilier-usages-chip") || null;
+ const marRoulantDem = document.getElementById("roulant-demenagement-chip") || null;
+ const marRoulant = document.getElementById("roulant-chip") || null;
+
+ let value = "Nous consulter"; // Par défaut
+
+ if (checkZone) {
+ if (k === 4) {
+ if (marPerissable) {
+ value = categories[mode][`Cat${k}`][zone - 1];
+ } else {
+ value = "Nous consulter";
+ }
+ } else if (k === 5) {
+ if (marEngins || marRoulant) {
+ value = categories[mode][`Cat${k}`][zone - 1];
+ } else {
+ value = "Nous consulter";
+ }
+ } else if (k === 7) {
+ if (marMobilier || marRoulantDem) {
+ value = categories[mode][`Cat${k}`][zone - 1];
+ } else {
+ value = "Nous consulter";
+ }
+ } else {
+ value = categories[mode][`Cat${k}`][zone - 1];
+ }
+ }
+ // Si une grille enregistrée existe déjà, ne pas écraser les valeurs pré-remplies
+ if (hasSavedGrilleData && element && element.value && element.value.trim() !== '') {
+ continue;
+ }
+ element.value = value;
+ }
+ }
+
+ function handleLoadHistoriqueBtn() {
+ var selectedId = document.getElementById('idSelect').value;
+
+ if (selectedId != "") {
+ fetch(`/contrat/update/${contrat.produit}/${contrat.id}/${selectedId}`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ })
+ .then(response => response.json())
+ .then(data => {
+ if (data.valid) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=projet`;
+ } else {
+ console.log('Echec lors de la mise à jour de la relation id contrat - id client :', data);
+ }
+ });
+ }
+ }
+
+ function handleActivitySelection() {
+ const select = document.getElementById('activity-selector');
+ const activityFormsContainer = document.getElementById('selected-activities');
+
+ // Clear previous entries
+ activityFormsContainer.innerHTML = ''; // Clear any existing entries
+
+ // Add a header for the "Dommage matériel (en €)" label that aligns with the input fields
+ const headerDiv = document.createElement('div');
+ headerDiv.classList.add('row');
+ headerDiv.style.display = 'flex';
+ headerDiv.style.alignItems = 'center';
+ headerDiv.style.justifyContent = 'start';
+ headerDiv.innerHTML = `
+
+
+ `;
+ activityFormsContainer.appendChild(headerDiv);
+
+ // Iterate over each selected option
+ Array.from(select.options).forEach(option => {
+ if (option.selected && option.value) {
+ const existingChip = document.getElementById(option.value + "-chip");
+ if (!existingChip) {
+ const activityName = option.textContent;
+ const activityDiv = document.createElement('div');
+ activityDiv.classList.add('activity-input', 'row');
+ activityDiv.style.marginBottom = '10px';
+ activityDiv.innerHTML = `
+
+ ${activityName} :
+
+
+
+
+
+ `;
+ activityFormsContainer.appendChild(activityDiv);
+ }
+ } else {
+ const existingChip = document.getElementById(option.value + "-chip");
+ if (existingChip) {
+ const activityDiv = existingChip.closest('.activity-input');
+ if (activityDiv) {
+ activityDiv.remove();
+ }
+ }
+ }
+ });
+ }
+
+ function handleGarantieRCCSelection() {
+ const select = document.getElementById('garantieRCC-selector');
+ const garantieRccFormsContainer = document.getElementById('selected-garantieRCC');
+
+ // Clear previous entries
+ garantieRccFormsContainer.innerHTML = ''; // Clear any existing entries
+
+ // Iterate over each selected option
+ Array.from(select.options).forEach(option => {
+ if (option.selected && option.value) {
+ const garantieRccName = option.textContent;
+ const garantieRccDiv = document.createElement('div');
+ garantieRccDiv.classList.add('garantieRcc-input', 'row');
+ garantieRccDiv.style.display = 'flex';
+ garantieRccDiv.style.alignItems = 'center';
+ garantieRccDiv.style.justifyContent = 'start';
+ garantieRccDiv.style.marginBottom = '10px';
+ garantieRccDiv.innerHTML = `
+ ${garantieRccName} `;
+ garantieRccFormsContainer.appendChild(garantieRccDiv);
+ }
+ });
+ }
+
+ function handleGarantieRCESelection() {
+ const select = document.getElementById('garantieRCE-selector');
+ const garantieRceFormsContainer = document.getElementById('selected-garantieRCE');
+
+ // Clear previous entries
+ garantieRceFormsContainer.innerHTML = ''; // Clear any existing entries
+
+ // Iterate over each selected option
+ Array.from(select.options).forEach(option => {
+ if (option.selected && option.value) {
+ if (option.selected && option.value) {
+ const garantieRceName = option.textContent;
+ const garantieRceDiv = document.createElement('div');
+ garantieRceDiv.classList.add('garantieRce-input', 'row');
+ garantieRceDiv.style.display = 'flex';
+ garantieRceDiv.style.alignItems = 'center';
+ garantieRceDiv.style.justifyContent = 'start';
+ garantieRceDiv.style.marginBottom = '10px';
+ garantieRceDiv.innerHTML = `
+ ${garantieRceName}
+ `;
+ garantieRceFormsContainer.appendChild(garantieRceDiv);
+ }
+ }
+ });
+ }
+
+ function handleMarchandiseSelection() {
+ const select = document.getElementById('marchandise-selector');
+ const marchandiseFormsContainer = document.getElementById('selected-marchandises');
+
+ // Clear previous entries
+ marchandiseFormsContainer.innerHTML = '';
+
+ // Iterate over each option
+ Array.from(select.options).forEach(option => {
+ if (option.selected && option.value) {
+ const existingChip = document.getElementById(`${option.value}-chip`);
+ if (!existingChip) {
+ const marchandiseName = option.textContent;
+ const marchandiseDiv = document.createElement('div');
+ marchandiseDiv.classList.add('marchandise-input', 'row');
+ marchandiseDiv.style.display = 'flex';
+ marchandiseDiv.style.alignItems = 'center';
+ marchandiseDiv.style.justifyContent = 'start';
+ marchandiseDiv.style.marginBottom = '10px';
+ marchandiseDiv.innerHTML = `
+ ${marchandiseName}
+ `;
+ marchandiseFormsContainer.appendChild(marchandiseDiv);
+ }
+ } else {
+ const existingChip = document.getElementById(`${option.value}-chip`);
+ if (existingChip) {
+ const chipContainer = existingChip.closest('.marchandise-input');
+ if (chipContainer) {
+ chipContainer.remove();
+ }
+ }
+ }
+ });
+ }
+
+ // Ajouter une ligne au tableau
+ function addRowAdditionnel(nomValue, adresseValue, siretValue) {
+ const table = document.getElementById('empTableAdditionnel');
+
+ // Créer une nouvelle ligne avec des inputs éditables
+ const newRow = table.insertRow(table.rows.length - 1);
+ newRow.innerHTML = `
+
+
+
+
+
+ delete
+
+
+ `;
+
+ // Réinitialiser les valeurs de saisie
+ document.getElementById('nomAdditionnel').value = '';
+ document.getElementById('adresseAditionnel').value = '';
+ document.getElementById('siretAdditionnel').value = '';
+
+ // Ajouter un écouteur d'événements pour supprimer
+ newRow.querySelector('.delete-btn').addEventListener('click', function () {
+ deleteRow(this);
+ });
+ }
+
+ // Ajouter une ligne au tableau Vehicule
+ function addRowVehicule(marqueValue, genreValue, typeValue, immatValue, capitalValue) {
+ const table = document.getElementById('empTableVehicules');
+
+ // Créer une nouvelle ligne avec des inputs éditables
+ const newRow = table.insertRow(table.rows.length - 1);
+ newRow.innerHTML = `
+
+
+
+
+
+
+
+ delete
+
+
+ `;
+
+ // Réinitialiser les valeurs de saisie
+ document.getElementById('marqueVehicule').value = '';
+ document.getElementById('genreVehicule').value = '';
+ document.getElementById('typeVehicule').value = '';
+ document.getElementById('immatVehicule').value = '';
+ document.getElementById('capitalVehicule').value = '';
+
+ // Ajouter un écouteur d'événements pour supprimer
+ newRow.querySelector('.delete-btn').addEventListener('click', function () {
+ deleteRow(this);
+ });
+ }
+
+ // Supprimer une ligne du tableau
+ function deleteRow(btn) {
+ const row = btn.parentElement.parentElement;
+ row.parentElement.removeChild(row);
+ }
+
+ // Contruit la structure Assuré additionnel à envoyer à la BDD
+ function extractAssureAdditionnel(tableId) {
+ const jsonArr = [];
+ const table = document.getElementById(tableId);
+
+ if (table && document.getElementById("additionel").checked) {
+ const rows = table.querySelectorAll('tr:not(:first-child)');
+
+ rows.forEach(row => {
+ const allInputsEmpty = Array.from(row.querySelectorAll('input')).every(input => input.value === '');
+
+ if (!allInputsEmpty) {
+ const inputs = row.querySelectorAll('input');
+ const dataObj = {};
+
+ inputs.forEach(input => {
+ const fieldName = input.getAttribute('name');
+ const fieldValue = input.value || "Non défini";
+ dataObj[fieldName] = fieldValue;
+ });
+
+ jsonArr.push(dataObj);
+ }
+ });
+
+ const jsonResult = JSON.stringify(jsonArr, null, 2);
+ return jsonResult;
+ }
+
+ return "[]"; // Retourne un tableau JSON vide si aucune saisie n'est trouvée dans le tableau
+ }
+
+ // Contruit la structure Designation à envoyer à la BDD
+ function extractDesignationVehicule(tableId) {
+ const jsonArr = [];
+ const table = document.getElementById(tableId);
+
+ if (table) {
+ const rows = table.querySelectorAll('tr:not(:first-child)');
+
+ rows.forEach(row => {
+ const allInputsEmpty = Array.from(row.querySelectorAll('input')).every(input => input.value === '');
+
+ if (!allInputsEmpty) {
+ const inputs = row.querySelectorAll('input');
+ const dataObj = {};
+
+ inputs.forEach(input => {
+ const fieldName = input.getAttribute('name');
+ const fieldValue = input.value || "Non défini";
+ dataObj[fieldName] = fieldValue;
+ });
+
+ jsonArr.push(dataObj);
+ }
+ });
+
+ const jsonResult = JSON.stringify(jsonArr, null, 2);
+ return jsonResult;
+ }
+
+ return "[]"; // Retourne un tableau JSON vide si aucune saisie n'est trouvée dans le tableau
+ }
+
+ function extractGrilleAdvalo(tableID) {
+ var jsonData = [];
+ var table = document.getElementById(tableID);
+ if (!table) {
+ return jsonData;
+ }
+
+ var parentDiv = table.closest('div');
+ var wasHidden = false;
+ var originalDisplay = '';
+ var originalVisibility = '';
+ var originalPosition = '';
+ var originalLeft = '';
+
+ if (parentDiv) {
+ originalDisplay = parentDiv.style.display || '';
+ originalVisibility = parentDiv.style.visibility || '';
+ originalPosition = parentDiv.style.position || '';
+ originalLeft = parentDiv.style.left || '';
+
+ if (parentDiv.style.display === 'none' || window.getComputedStyle(parentDiv).display === 'none') {
+ wasHidden = true;
+ parentDiv.style.display = 'block';
+ parentDiv.style.visibility = 'hidden';
+ parentDiv.style.position = 'absolute';
+ parentDiv.style.left = '-9999px';
+ }
+ }
+
+ try {
+ if (!table.rows || table.rows.length < 2) {
+ return jsonData;
+ }
+
+ var zonesCount = table.rows[0] ? table.rows[0].cells.length - 1 : 0;
+ if (zonesCount === 0) {
+ return jsonData;
+ }
+
+ for (var i = 1; i < table.rows.length; i++) {
+ var row = table.rows[i];
+ if (!row || !row.cells || row.cells.length === 0) continue;
+
+ var category = row.cells[0] ? (row.cells[0].innerText || row.cells[0].textContent || '').trim() : '';
+ if (!category) continue;
+
+ var categoryData = { "name": category };
+
+ for (var j = 1; j <= zonesCount && j < row.cells.length; j++) {
+ var zoneKey = "zone" + j;
+ var cell = row.cells[j];
+ if (!cell) {
+ categoryData[zoneKey] = "Nous consulter";
+ continue;
+ }
+
+ var input = cell.querySelector("input[type='text']");
+ if (input) {
+ var zoneValue = (input.value || '').trim();
+ categoryData[zoneKey] = zoneValue || "Nous consulter";
+ } else {
+ categoryData[zoneKey] = "Nous consulter";
+ }
+ }
+
+ if (Object.keys(categoryData).length > 1) {
+ jsonData.push(categoryData);
+ }
+ }
+ } catch (error) {
+ console.error('Erreur lors de l\'extraction de la grille Ad Valorem:', error);
+ } finally {
+ if (wasHidden && parentDiv) {
+ parentDiv.style.display = originalDisplay;
+ parentDiv.style.visibility = originalVisibility;
+ parentDiv.style.position = originalPosition;
+ parentDiv.style.left = originalLeft;
+ }
+ }
+
+ return jsonData;
+ }
+
+ function extractTempo() {
+ let tempo = "";
+
+ if (document.getElementById("mensuel").checked == true) { tempo = "mensuel"; }
+ if (document.getElementById("trimestriel").checked == true) { tempo = "trimestriel"; }
+ if (document.getElementById("semestriel").checked == true) { tempo = "semestriel"; }
+ if (document.getElementById("annuel").checked == true) { tempo = "annuel"; }
+
+ return tempo;
+ }
+
+ function extractTypeCot() {
+ let cot = "";
+
+ if (document.getElementById("forfaitaire").checked == true) { cot = "forfaitaire"; }
+ if (document.getElementById("revisable").checked == true) { cot = "revisable"; }
+
+ return cot;
+ }
+
+ function calcCotTotal() {
+ const cotRCCHT = parseFloat(document.getElementById("cotRCCHT").value) || 0
+ const cotRCCTTC = parseFloat(document.getElementById("cotRCCTTC").value) || 0
+ const cotRCEHT = parseFloat(document.getElementById("cotRCEHT").value) || 0
+ const cotRCETTC = parseFloat(document.getElementById("cotRCETTC").value) || 0
+ const cotPJHT = parseFloat(document.getElementById("cotPJHT").value) || 0
+ const cotPJTTC = parseFloat(document.getElementById("cotPJTTC").value) || 0
+ const cotFraisHT = parseFloat(document.getElementById("cotFraisHT").value) || 0
+ const cotFraisTTC = parseFloat(document.getElementById("cotFraisTTC").value) || 0
+
+ document.getElementById("cotTotalHT").value = (cotRCCHT + cotRCEHT + cotPJHT + cotFraisHT).toFixed(2);
+ document.getElementById("cotTotalTTC").value = (cotRCCTTC + cotRCETTC + cotPJTTC + cotFraisTTC).toFixed(2);
+ }
+
+ function calcTauxTotal() {
+ const tauxRCCHT = parseFloat(document.getElementById("tauxRCCHT").value) || 0
+ const tauxRCCTTC = parseFloat(document.getElementById("tauxRCCTTC").value) || 0
+ const tauxRCEHT = parseFloat(document.getElementById("tauxRCEHT").value) || 0
+ const tauxRCETTC = parseFloat(document.getElementById("tauxRCETTC").value) || 0
+
+ document.getElementById("tauxTotalHT").value = (tauxRCCHT + tauxRCEHT).toFixed(3);
+ document.getElementById("tauxTotalTTC").value = (tauxRCCTTC + tauxRCETTC).toFixed(3);
+ }
+
+ function calcCotFromTauxCA(idTaux, idCot) {
+ const valueCA = parseFloat(document.getElementById("CA").value) || 0
+ const valueTaux = parseFloat(document.getElementById(idTaux).value) || 0
+
+ document.getElementById(idCot).value = (valueCA * valueTaux / 100).toFixed(2);
+ }
+
+ function calcCotIrreductible() {
+ const cotRCCHT = parseFloat(document.getElementById("cotRCCHT").value) || 0
+ const cotRCEHT = parseFloat(document.getElementById("cotRCEHT").value) || 0
+
+ document.getElementById("cotisationIrreductible").value = ((cotRCCHT + cotRCEHT) * 0.8).toFixed(2);
+ }
+
+ function calcAddTaxe(idHT, valueTaxe, idTTC) {
+ const valueHT = parseFloat(document.getElementById(idHT).value) || 0
+
+ if (idTTC != "tauxRCCTTC" && idTTC != "tauxRCETTC") {
+ document.getElementById(idTTC).value = (valueHT * (1 + valueTaxe)).toFixed(2);
+ } else {
+ document.getElementById(idTTC).value = (valueHT * (1 + valueTaxe)).toFixed(3);
+ }
+ }
+
+ function calcSubTaxe(idHT, valueTaxe, idTTC) {
+ const valueTTC = parseFloat(document.getElementById(idTTC).value) || 0
+
+ if (idHT != "tauxRCCHT" && idHT != "tauxRCEHT") {
+ document.getElementById(idHT).value = (valueTTC / (1 + valueTaxe)).toFixed(2);
+ } else {
+ document.getElementById(idHT).value = (valueTTC / (1 + valueTaxe)).toFixed(3);
+ }
+ }
+
+ // Gérer la soumission du formulaire
+ async function handleSubmitForm(event) {
+ event.preventDefault();
+
+ // Étape 1: Créer d'abord un enregistrement dans projetRC
+ const grilleMultimodal = extractGrilleAdvalo('tabAdvaloMultimodal');
+ const grilleTerrestre = extractGrilleAdvalo('tabAdvaloTerrestre');
+ const grilleAerien = extractGrilleAdvalo('tabAdvaloAerien');
+
+ const projetRCData = {
+ // Tableaux
+ "assureAdditionnel": extractAssureAdditionnel('empTableAdditionnel'),
+ "designationVehicule": extractDesignationVehicule('empTableVehicules'),
+ "grilleMultimodal": grilleMultimodal,
+ "grilleTerrestre": grilleTerrestre,
+ "grilleAerien": grilleAerien,
+
+ // Activitées - avec gestion "Nous consulter"
+ "actVoiturier": document.getElementById("voiturier-chip") ? true : false,
+ "valueActVoiturier": document.getElementById("voiturier-chip") ? getValueOrConsulter("voiturier") : false,
+ "actLoueur": document.getElementById("loueur-chip") ? true : false,
+ "valueActLoueur": document.getElementById("loueur-chip") ? getValueOrConsulter("loueur") : false,
+ "actMultimodal": document.getElementById("commissionnaire-multimodal-chip") ? true : false,
+ "valueActMultimodal": document.getElementById("commissionnaire-multimodal-chip") ? getValueOrConsulter("commissionnaire-multimodal") : false,
+ "actDouane": document.getElementById("représentant-douane-chip") ? true : false,
+ "valueActDouane": document.getElementById("représentant-douane-chip") ? getValueOrConsulter("représentant-douane") : false,
+ "actDemPar": document.getElementById("demenageur-particulier-chip") ? true : false,
+ "valueActDemPar": document.getElementById("demenageur-particulier-chip") ? getValueOrConsulter("demenageur-particulier") : false,
+ "actDemParDom": document.getElementById("demenageur-particulier-dommage-chip") ? true : false,
+ "valueActDemParDom": document.getElementById("demenageur-particulier-dommage-chip") ? getValueOrConsulter("demenageur-particulier-dommage") : false,
+ "actDemParAdv": document.getElementById("demenageur-particulier-advalorem-chip") ? true : false,
+ "valueActDemParAdv": document.getElementById("demenageur-particulier-advalorem-chip") ? getValueOrConsulter("demenageur-particulier-advalorem") : false,
+ "actDemEntr": document.getElementById("demenageur-entreprise-chip") ? true : false,
+ "valueActDemEntr": document.getElementById("demenageur-entreprise-chip") ? getValueOrConsulter("demenageur-entreprise") : false,
+ "actDemInterne": document.getElementById("demenageur-interne-chip") ? true : false,
+ "valueActDemInterne": document.getElementById("demenageur-interne-chip") ? getValueOrConsulter("demenageur-interne") : false,
+ "actGardeMeuble": document.getElementById("garde-meubles-chip") ? true : false,
+ "valueActGardeMeuble": document.getElementById("garde-meubles-chip") ? getValueOrConsulter("garde-meubles") : false,
+ "actEntDep": document.getElementById("entrepositaire-depositaire-chip") ? true : false,
+ "valueActEntDep": document.getElementById("entrepositaire-depositaire-chip") ? getValueOrConsulter("entrepositaire-depositaire") : false,
+ "actPrestaLog": document.getElementById("prestataire-logistique-chip") ? true : false,
+ "valueActPrestaLog": document.getElementById("prestataire-logistique-chip") ? getValueOrConsulter("prestataire-logistique") : false,
+ "actLevageur": document.getElementById("manutentionnaire-levageur-chip") ? true : false,
+ "valueActLevageur": document.getElementById("manutentionnaire-levageur-chip") ? getValueOrConsulter("manutentionnaire-levageur") : false,
+ "actTransitaire": document.getElementById("transitaire-chip") ? true : false,
+ "valueActTransitaire": document.getElementById("transitaire-chip") ? getValueOrConsulter("transitaire") : false,
+
+ //Marchandises
+ "marOrdinaire": document.getElementById("ordinaire-chip") ? true : false,
+ "marRoulant": document.getElementById("roulant-chip") ? true : false,
+ "marEngins": document.getElementById("engins-chantier-agricole-chip") ? true : false,
+ "marRoulantDem": document.getElementById("roulant-demenagement-chip") ? true : false,
+ "marMobilerUsag": document.getElementById("mobilier-usages-chip") ? true : false,
+ "marPerissable": document.getElementById("perissable-temperature-dirigee-chip") ? true : false,
+ "marAnimaux": document.getElementById("animaux-vivant-chip") ? true : false,
+ "marCiterne": document.getElementById("citerne-chip") ? true : false,
+ "marBeton": document.getElementById("beton-chip") ? true : false,
+ "marExceptionnels": document.getElementById("exceptionnels-chip") ? true : false,
+ "marVrac": document.getElementById("vrac-chip") ? true : false,
+
+ // Territorialités - vérifier checked même si disabled
+ "zone1": document.getElementById("zone1") && (document.getElementById("zone1").checked || document.getElementById("zone1").disabled) ? true : false,
+ "zone2": document.getElementById("zone2") && (document.getElementById("zone2").checked || document.getElementById("zone2").disabled) ? true : false,
+ "zone3": document.getElementById("zone3") && document.getElementById("zone3").checked ? true : false,
+ "zone4": document.getElementById("zone4") && document.getElementById("zone4").checked ? true : false,
+ "zone5": document.getElementById("zone5") && document.getElementById("zone5").checked ? true : false,
+ "zone6": document.getElementById("zone6") && document.getElementById("zone6").checked ? true : false,
+
+ // Extensions de garantie RCC
+ "extRCCModifCalArrim": document.getElementById("modif-calage-arrimage-chip") ? true : false,
+ "extRCCFerroutage": document.getElementById("ferroutage-chip") ? true : false,
+ "extRCCFraisRecons": document.getElementById("frais-reconstitution-chip") ? true : false,
+ "extRCCConfie": document.getElementById("contenant-confie-chip") ? true : false,
+ "typeExtConfies": document.getElementById("contenant-confie-chip") ? (document.getElementById('ValeurDeclaree').checked ? "VALEUR DECLAREE" : "ADVALOREM") : "",
+ "extRCCTPPC": document.getElementById("tppc-chip") ? true : false,
+ "extRCCRegie": document.getElementById("regie-chip") ? true : false,
+ "extRCCSansMontageDemontage": document.getElementById("sans-montage-demontage-chip") ? true : false,
+
+ // Extensions de garantie RCE
+ "autresRC": document.getElementById("choixRCE").checked ? true : false,
+ "extRCEBraDebra": document.getElementById("branchement-debranchement-chip") ? true : false,
+ "extRCEMontageDemontage": document.getElementById("montage-demontage-chip") ? true : false,
+
+ // Activités complémentaires
+ "activitesVoiturier": JSON.stringify(getActivitesComplFromForm('actComplVoiturier/Loueur')),
+ "activitesCommissionnaire": JSON.stringify(getActivitesComplFromForm('actComplCommissionnaire de Transport')),
+ "activitesDemenageur": JSON.stringify(getActivitesComplFromForm('actComplDéménageur')),
+ "activitesLogistique": JSON.stringify(getActivitesComplFromForm('actComplLogistique')),
+
+ // Temporalités
+ "tempo": extractTempo(),
+ "dateEffet": document.getElementById("dateEffet").value,
+ "dateEcheance": document.getElementById("dateEcheance").value,
+ "dateFin": document.getElementById("dateFin").value,
+ "pj": document.getElementById("switchPJ").checked ? true : false,
+ "programmeInternationale": document.getElementById("programmeInternationale").checked ? true : false,
+ "participationResultat": document.getElementById("participationResultat").checked ? true : false,
+
+ // Cotisations - avec gestion "Nous consulter"
+ "typeCot": extractTypeCot(),
+ "ca": getValueOrConsulter("CA"),
+ "cotIrreductible": getValueOrConsulter("cotisationIrreductible"),
+ "tauxRCCHT": getValueOrConsulter("tauxRCCHT"),
+ "tauxRCCTTC": getValueOrConsulter("tauxRCCTTC"),
+ "tauxRCEHT": getValueOrConsulter("tauxRCEHT"),
+ "tauxRCETTC": getValueOrConsulter("tauxRCETTC"),
+ "tauxTotalHT": getValueOrConsulter("tauxTotalHT"),
+ "tauxTotalTTC": getValueOrConsulter("tauxTotalTTC"),
+ "cotRCCHT": getValueOrConsulter("cotRCCHT"),
+ "cotRCCTTC": getValueOrConsulter("cotRCCTTC"),
+ "cotRCEHT": getValueOrConsulter("cotRCEHT"),
+ "cotRCETTC": getValueOrConsulter("cotRCETTC"),
+ "cotPJHT": getValueOrConsulter("cotPJHT"),
+ "cotPJTTC": getValueOrConsulter("cotPJTTC"),
+ "cotTotalHT": getValueOrConsulter("cotTotalHT"),
+ "cotTotalTTC": getValueOrConsulter("cotTotalTTC"),
+ "cotFraisHT": getValueOrConsulter("cotFraisHT"),
+ "cotFraisTTC": getValueOrConsulter("cotFraisTTC")
+ };
+
+ // Créer ou mettre à jour l'enregistrement projetRC
+ let idProjetRC;
+ if (projet && projet.id) {
+ // Mettre à jour l'enregistrement projetRC existant
+ const responseProjetRC = await fetch(`/rc/projet/update/${projet.id}`, {
+ method: 'POST',
+ body: JSON.stringify(projetRCData),
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+ const dataProjetRC = await responseProjetRC.json();
+ if (dataProjetRC.valid) {
+ idProjetRC = dataProjetRC.projetRc.id;
+ } else {
+ console.log('Échec lors de la mise à jour de l\'enregistrement ProjetRC :', dataProjetRC.message);
+ return;
+ }
+ } else {
+ // Créer un nouvel enregistrement projetRC
+ const responseProjetRC = await fetch(`/rc/projet/create`, {
+ method: 'POST',
+ body: JSON.stringify(projetRCData),
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+ const dataProjetRC = await responseProjetRC.json();
+ if (dataProjetRC.valid) {
+ idProjetRC = dataProjetRC.projetRc.id;
+ } else {
+ console.log('Échec lors de la création de l\'enregistrement ProjetRC :', dataProjetRC.message);
+ return;
+ }
+ }
+
+ if (idProjetRC) {
+
+ // Étape 2: Créer ou mettre à jour l'enregistrement RC principal
+ let idRC;
+ if (rc && rc.id) {
+ // Mettre à jour l'enregistrement RC existant avec la nouvelle référence projetRC
+ const responseRC = await fetch(`/rc/update/${rc.id}`, {
+ method: 'POST',
+ body: JSON.stringify({
+ projetRC: idProjetRC
+ }),
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+ const dataRC = await responseRC.json();
+ if (dataRC.valid) {
+ idRC = dataRC.rc.id;
+ } else {
+ console.log('Échec lors de la mise à jour de l\'enregistrement RC :', dataRC.message);
+ return;
+ }
+ } else {
+ // Créer un nouvel enregistrement RC
+ const responseRC = await fetch(`/rc/create`, {
+ method: 'POST',
+ body: JSON.stringify({
+ projetRC: idProjetRC,
+ typeCotisation: extractTypeCot()
+ }),
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+ const dataRC = await responseRC.json();
+ if (dataRC.valid) {
+ idRC = dataRC.rc.id;
+ } else {
+ console.log('Échec lors de la création de l\'enregistrement RC :', dataRC.message);
+ return;
+ }
+ }
+
+ // Étape 3: Mettre à jour le champ "rc" dans le contrat avec l'ID de la saisie RC
+ const responseContratEnCours = await fetch(`/contrat/update/${contrat.produit}/${contrat.id}/${idRC}`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+ const dataContratEnCours = await responseContratEnCours.json();
+
+ if (dataContratEnCours.valid) {
+ // Obtenir la date actuelle au format "JJ/MM/AAAA"
+ const currentDate = new Date();
+ const day = String(currentDate.getDate()).padStart(2, '0');
+ const month = String(currentDate.getMonth() + 1).padStart(2, '0'); // Les mois sont indexés à partir de 0, donc +1
+ const year = currentDate.getFullYear();
+ const formattedDate = `${day}/${month}/${year}`;
+
+ //Obtenir l'user
+ const token = localStorage.getItem('jwtToken');
+ const decoded = jwt_decode(token);
+ const userFirstName = decoded.userFirstName;
+ const userLastName = decoded.userLastName;
+
+ // Obtenir l'heure actuelle au format "HHhMM"
+ const hours = String(currentDate.getHours()).padStart(2, '0');
+ const minutes = String(currentDate.getMinutes()).padStart(2, '0');
+ const seconds = String(currentDate.getSeconds()).padStart(2, '0');
+ const formattedTime = `${hours}:${minutes}:${seconds}`;
+ const nom = userLastName;
+ const prenom = userFirstName;
+
+ // Mettre à jour le champ "historique" dans le contrat avec les nouvelles données d'historique
+ const historiqueData = [
+ {
+ "type": contrat.type,
+ "date": formattedDate,
+ "heure": formattedTime,
+ "produit": "RC",
+ "id": idRC,
+ "nom": nom,
+ "prenom": prenom,
+ }
+ ];
+
+ const responseHistoriqueUpdate = await fetch(`/contrat/update/historique/${contrat.id}`, {
+ method: 'POST',
+ body: JSON.stringify({ historiqueData }),
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+ const dataHistoriqueUpdate = await responseHistoriqueUpdate.json();
+
+ if (dataHistoriqueUpdate.valid) {
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////
+ /// TODO DEBUT Génération fichier à l'enregistrement A RETIRER QUAND MODE CONTRAT
+ const numParcours = getNumParcoursFromURL();
+ let filename;
+
+ // Envoi de la requête POST au serveur pour générer le projet
+ fetch(`/generate/rc/projet/${numParcours}`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ })
+ .then(response => {
+ if (!response.ok) {
+ throw new Error('Erreur réseau ou serveur');
+ }
+
+ const disposition = response.headers.get('content-disposition');
+ filename = disposition.split(';')[1].trim().split('=')[1];
+
+ return response.blob(); // On attend une réponse sous forme de blob pour un fichier
+ })
+ .then(blob => {
+ // Crée un URL pour le blob
+ const url = window.URL.createObjectURL(blob);
+ // Crée un élément a temporaire pour simuler un clic pour téléchargement
+ const a = document.createElement('a');
+ a.href = url;
+ a.download = filename; // Nomme le fichier téléchargé
+ document.body.appendChild(a); // Ajoute l'élément au document
+ a.click(); // Simule un clic sur l'élément pour déclencher le téléchargement
+ window.URL.revokeObjectURL(url); // Nettoie l'URL objet
+ a.remove(); // Supprime l'élément a du document
+
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=projet`;
+ })
+ .catch(error => console.error('Erreur lors de la génération du projet 111:', error));
+ /// TODO FIN Génération fichier à l'enregistrement A RETIRER QUAND MODE CONTRAT
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////
+
+ // TODO NE PAS OUBLIER LE HREF QUI EST DANS LE GEN ACTUELLEMENT
+ // window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=projet`;
+ } else {
+ console.log('Échec lors de la mise à jour de l\'historique du contrat :', dataHistoriqueUpdate.message);
+ }
+ } else {
+ console.log('Échec lors de la mise à jour du champ "rc" dans le contrat :', dataContratEnCours.message);
+ }
+ } else {
+ console.log('Échec lors de la création de l\'enregistrement ProjetRC :', dataProjetRC.message);
+ }
+ }
+
+ // Fonction helper pour récupérer valeur ou "Nous consulter"
+ function getValueOrConsulter(id) {
+ const element = document.getElementById(id);
+ if (!element) return 'Nous consulter';
+ const value = element.value?.trim();
+ return value || 'Nous consulter';
+ }
+
+ // Fonction exposée pour sauvegarder le projet sans générer le document
+ async function saveProjetRC() {
+ try {
+ // Étape 1: Créer d'abord un enregistrement dans projetRC
+ const grilleMultimodal = extractGrilleAdvalo('tabAdvaloMultimodal');
+ const grilleTerrestre = extractGrilleAdvalo('tabAdvaloTerrestre');
+ const grilleAerien = extractGrilleAdvalo('tabAdvaloAerien');
+
+ const projetRCData = {
+ // Tableaux
+ "assureAdditionnel": extractAssureAdditionnel('empTableAdditionnel'),
+ "designationVehicule": extractDesignationVehicule('empTableVehicules'),
+ "grilleMultimodal": grilleMultimodal,
+ "grilleTerrestre": grilleTerrestre,
+ "grilleAerien": grilleAerien,
+
+ // Activitées
+ "actVoiturier": document.getElementById("voiturier-chip") ? true : false,
+ "valueActVoiturier": document.getElementById("voiturier-chip") ? getValueOrConsulter("voiturier") : false,
+ "actLoueur": document.getElementById("loueur-chip") ? true : false,
+ "valueActLoueur": document.getElementById("loueur-chip") ? document.getElementById("loueur").value : false,
+ "actMultimodal": document.getElementById("commissionnaire-multimodal-chip") ? true : false,
+ "valueActMultimodal": document.getElementById("commissionnaire-multimodal-chip") ? document.getElementById("commissionnaire-multimodal").value : false,
+ "actDouane": document.getElementById("représentant-douane-chip") ? true : false,
+ "valueActDouane": document.getElementById("représentant-douane-chip") ? document.getElementById("représentant-douane").value : false,
+ "actDemPar": document.getElementById("demenageur-particulier-chip") ? true : false,
+ "valueActDemPar": document.getElementById("demenageur-particulier-chip") ? document.getElementById("demenageur-particulier").value : false,
+ "actDemParDom": document.getElementById("demenageur-particulier-dommage-chip") ? true : false,
+ "valueActDemParDom": document.getElementById("demenageur-particulier-dommage-chip") ? document.getElementById("demenageur-particulier-dommage").value : false,
+ "actDemParAdv": document.getElementById("demenageur-particulier-advalorem-chip") ? true : false,
+ "valueActDemParAdv": document.getElementById("demenageur-particulier-advalorem-chip") ? document.getElementById("demenageur-particulier-advalorem").value : false,
+ "actDemEntr": document.getElementById("demenageur-entreprise-chip") ? true : false,
+ "valueActDemEntr": document.getElementById("demenageur-entreprise-chip") ? document.getElementById("demenageur-entreprise").value : false,
+ "actDemInterne": document.getElementById("demenageur-interne-chip") ? true : false,
+ "valueActDemInterne": document.getElementById("demenageur-interne-chip") ? document.getElementById("demenageur-interne").value : false,
+ "actGardeMeuble": document.getElementById("garde-meubles-chip") ? true : false,
+ "valueActGardeMeuble": document.getElementById("garde-meubles-chip") ? document.getElementById("garde-meubles").value : false,
+ "actEntDep": document.getElementById("entrepositaire-depositaire-chip") ? true : false,
+ "valueActEntDep": document.getElementById("entrepositaire-depositaire-chip") ? document.getElementById("entrepositaire-depositaire").value : false,
+ "actPrestaLog": document.getElementById("prestataire-logistique-chip") ? true : false,
+ "valueActPrestaLog": document.getElementById("prestataire-logistique-chip") ? document.getElementById("prestataire-logistique").value : false,
+ "actLevageur": document.getElementById("manutentionnaire-levageur-chip") ? true : false,
+ "valueActLevageur": document.getElementById("manutentionnaire-levageur-chip") ? document.getElementById("manutentionnaire-levageur").value : false,
+ "actTransitaire": document.getElementById("transitaire-chip") ? true : false,
+ "valueActTransitaire": document.getElementById("transitaire-chip") ? document.getElementById("transitaire").value : false,
+
+ //Marchandises
+ "marOrdinaire": document.getElementById("ordinaire-chip") ? true : false,
+ "marRoulant": document.getElementById("roulant-chip") ? true : false,
+ "marEngins": document.getElementById("engins-chantier-agricole-chip") ? true : false,
+ "marRoulantDem": document.getElementById("roulant-demenagement-chip") ? true : false,
+ "marMobilerUsag": document.getElementById("mobilier-usages-chip") ? true : false,
+ "marPerissable": document.getElementById("perissable-temperature-dirigee-chip") ? true : false,
+ "marAnimaux": document.getElementById("animaux-vivant-chip") ? true : false,
+ "marCiterne": document.getElementById("citerne-chip") ? true : false,
+ "marBeton": document.getElementById("beton-chip") ? true : false,
+ "marExceptionnels": document.getElementById("exceptionnels-chip") ? true : false,
+ "marVrac": document.getElementById("vrac-chip") ? true : false,
+
+ // Territorialités - vérifier checked même si disabled
+ "zone1": document.getElementById("zone1") && (document.getElementById("zone1").checked || document.getElementById("zone1").disabled) ? true : false,
+ "zone2": document.getElementById("zone2") && (document.getElementById("zone2").checked || document.getElementById("zone2").disabled) ? true : false,
+ "zone3": document.getElementById("zone3") && document.getElementById("zone3").checked ? true : false,
+ "zone4": document.getElementById("zone4") && document.getElementById("zone4").checked ? true : false,
+ "zone5": document.getElementById("zone5") && document.getElementById("zone5").checked ? true : false,
+ "zone6": document.getElementById("zone6") && document.getElementById("zone6").checked ? true : false,
+
+ // Extensions de garantie RCC
+ "extRCCModifCalArrim": document.getElementById("modif-calage-arrimage-chip") ? true : false,
+ "extRCCFerroutage": document.getElementById("ferroutage-chip") ? true : false,
+ "extRCCFraisRecons": document.getElementById("frais-reconstitution-chip") ? true : false,
+ "extRCCConfie": document.getElementById("contenant-confie-chip") ? true : false,
+ "typeExtConfies": document.getElementById("contenant-confie-chip") ? (document.getElementById('ValeurDeclaree').checked ? "VALEUR DECLAREE" : "ADVALOREM") : "",
+ "extRCCTPPC": document.getElementById("tppc-chip") ? true : false,
+ "extRCCRegie": document.getElementById("regie-chip") ? true : false,
+ "extRCCSansMontageDemontage": document.getElementById("sans-montage-demontage-chip") ? true : false,
+
+ // Extensions de garantie RCE
+ "autresRC": document.getElementById("choixRCE").checked ? true : false,
+ "extRCEBraDebra": document.getElementById("branchement-debranchement-chip") ? true : false,
+ "extRCEMontageDemontage": document.getElementById("montage-demontage-chip") ? true : false,
+
+ // Activités complémentaires
+ "activitesVoiturier": JSON.stringify(getActivitesComplFromForm('actComplVoiturier/Loueur')),
+ "activitesCommissionnaire": JSON.stringify(getActivitesComplFromForm('actComplCommissionnaire de Transport')),
+ "activitesDemenageur": JSON.stringify(getActivitesComplFromForm('actComplDéménageur')),
+ "activitesLogistique": JSON.stringify(getActivitesComplFromForm('actComplLogistique')),
+
+ // Temporalités
+ "tempo": extractTempo(),
+ "dateEffet": document.getElementById("dateEffet").value,
+ "dateEcheance": document.getElementById("dateEcheance").value,
+ "dateFin": document.getElementById("dateFin").value,
+ "pj": document.getElementById("switchPJ").checked ? true : false,
+ "programmeInternationale": document.getElementById("programmeInternationale").checked ? true : false,
+ "participationResultat": document.getElementById("participationResultat").checked ? true : false,
+
+ // Cotisations - avec gestion "Nous consulter"
+ "typeCot": extractTypeCot(),
+ "ca": getValueOrConsulter("CA"),
+ "cotIrreductible": getValueOrConsulter("cotisationIrreductible"),
+ "tauxRCCHT": getValueOrConsulter("tauxRCCHT"),
+ "tauxRCCTTC": getValueOrConsulter("tauxRCCTTC"),
+ "tauxRCEHT": getValueOrConsulter("tauxRCEHT"),
+ "tauxRCETTC": getValueOrConsulter("tauxRCETTC"),
+ "tauxTotalHT": getValueOrConsulter("tauxTotalHT"),
+ "tauxTotalTTC": getValueOrConsulter("tauxTotalTTC"),
+ "cotRCCHT": getValueOrConsulter("cotRCCHT"),
+ "cotRCCTTC": getValueOrConsulter("cotRCCTTC"),
+ "cotRCEHT": getValueOrConsulter("cotRCEHT"),
+ "cotRCETTC": getValueOrConsulter("cotRCETTC"),
+ "cotPJHT": getValueOrConsulter("cotPJHT"),
+ "cotPJTTC": getValueOrConsulter("cotPJTTC"),
+ "cotTotalHT": getValueOrConsulter("cotTotalHT"),
+ "cotTotalTTC": getValueOrConsulter("cotTotalTTC"),
+ "cotFraisHT": getValueOrConsulter("cotFraisHT"),
+ "cotFraisTTC": getValueOrConsulter("cotFraisTTC")
+ };
+
+ // Créer ou mettre à jour l'enregistrement projetRC
+ let idProjetRC;
+ if (projet && projet.id) {
+ // Mettre à jour l'enregistrement projetRC existant
+ const responseProjetRC = await fetch(`/rc/projet/update/${projet.id}`, {
+ method: 'POST',
+ body: JSON.stringify(projetRCData),
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+ const dataProjetRC = await responseProjetRC.json();
+ if (dataProjetRC.valid) {
+ idProjetRC = dataProjetRC.projetRc.id;
+ } else {
+ console.log('Échec lors de la mise à jour de l\'enregistrement ProjetRC :', dataProjetRC.message);
+ return { valid: false, message: 'Échec mise à jour ProjetRC' };
+ }
+ } else {
+ // Créer un nouvel enregistrement projetRC
+ const responseProjetRC = await fetch(`/rc/projet/create`, {
+ method: 'POST',
+ body: JSON.stringify(projetRCData),
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+ const dataProjetRC = await responseProjetRC.json();
+ if (dataProjetRC.valid) {
+ idProjetRC = dataProjetRC.projetRc.id;
+ } else {
+ console.log('Échec lors de la création de l\'enregistrement ProjetRC :', dataProjetRC.message);
+ return { valid: false, message: 'Échec création ProjetRC' };
+ }
+ }
+
+ if (idProjetRC) {
+
+ // Étape 2: Créer ou mettre à jour l'enregistrement RC principal
+ let idRC;
+
+ if (rc && rc.id) {
+ // Mettre à jour l'enregistrement RC existant
+ const responseRC = await fetch(`/rc/update/${rc.id}`, {
+ method: 'POST',
+ body: JSON.stringify({ projetRC: idProjetRC }),
+ headers: { 'Content-Type': 'application/json' },
+ });
+ const dataRC = await responseRC.json();
+ if (dataRC.valid) {
+ idRC = dataRC.rc.id;
+ } else {
+ return { valid: false, message: 'Échec mise à jour RC' };
+ }
+ } else {
+ // Créer un nouvel enregistrement RC
+ const responseRC = await fetch(`/rc/create`, {
+ method: 'POST',
+ body: JSON.stringify({
+ projetRC: idProjetRC,
+ typeCotisation: extractTypeCot()
+ }),
+ headers: { 'Content-Type': 'application/json' },
+ });
+ const dataRC = await responseRC.json();
+ if (dataRC.valid) {
+ idRC = dataRC.rc.id;
+ } else {
+ return { valid: false, message: 'Échec création RC' };
+ }
+ }
+
+ // Étape 3: Mettre à jour le contrat
+ const responseContrat = await fetch(`/contrat/update/${contrat.produit}/${contrat.id}/${idRC}`, {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ });
+ const dataContrat = await responseContrat.json();
+
+ return { valid: dataContrat.valid, idRC, idProjetRC };
+ } else {
+ return { valid: false, message: 'Échec création ProjetRC' };
+ }
+ } catch (error) {
+ console.error('Erreur lors de la sauvegarde:', error);
+ return { valid: false, message: error.message };
+ }
+ }
+
+ // Exposer les fonctions globalement pour y accéder depuis l'extérieur
+ window.initSubmenuForm = init;
+ window.saveProjetRC = saveProjetRC;
+})();
\ No newline at end of file
diff --git a/ecole/public/js/projet-form-tppc.js b/ecole/public/js/projet-form-tppc.js
new file mode 100644
index 00000000..cc12a285
--- /dev/null
+++ b/ecole/public/js/projet-form-tppc.js
@@ -0,0 +1,1302 @@
+function initSubmenuForm() {
+ // Accéder aux informations stockées du parcours
+ const parcours = JSON.parse(sessionStorage.getItem('parcours'));
+}
+
+// Exposer initSubmenuForm globalement pour y accéder depuis l'extérieur
+window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollution de l'espace global
+(function() {
+ // Variables globales du module
+ let parcours, contrat, client, intermediaire;
+
+ //Variables pour les modales
+ let commentaire = '';
+
+ // Initialisation des tag pour select
+ var tagAnimauxVivants = false;
+ var tagVehiculeTransporte = false;
+
+ //Variables pour extensions
+ var extPopulate
+
+ // Initialisation du formulaire et des données
+ function init() {
+ // Materialize init select
+ var select = document.querySelectorAll('select');
+ M.FormSelect.init(select);
+
+ // Materialize init Modal
+ var modals = document.querySelectorAll('.modal');
+ M.Modal.init(modals, {'dismissible': false});
+
+ // Accéder aux informations stockées du parcours
+ parcours = JSON.parse(sessionStorage.getItem('parcours'));
+ contrat = JSON.parse(sessionStorage.getItem('contrat'));
+ client = contrat?.["@expand"]?.client || null;
+ intermediaire = contrat?.["@expand"]?.intermediaire || null;
+ tppc = contrat?.["@expand"]?.enCours || null;
+ projet = tppc?.["@expand"]?.projet || null;
+ tarif = tppc?.["@expand"]?.tarif || null;
+
+ console.log("Initialisation pour formulaire projet :", parcours);
+
+ // Appel des différentes fonctions d'initialisation
+ setupEventListeners();
+ constantsJSON().then(() => {
+ fillSelects()
+ populateFormData();
+ })
+ updateSubmitButtonState('projetForm');
+ }
+
+ // Configuration des écouteurs d'événements
+ function setupEventListeners() {
+
+ document.getElementById('projetFormBtn').addEventListener('click', function(event) {
+ event.preventDefault();
+ if (client && intermediaire) {
+ submitForm()
+ } else {
+ openModaleClientInter()
+ }
+ });
+
+ document.getElementById('loadHistoriqueBtn').addEventListener('click', function() {
+ handleLoadHistoriqueBtn();
+ });
+
+ //Assure additionnel
+ document.getElementById('additionel').addEventListener('change', function() {
+ toggler(this.id, 'checkAdditionnel');
+ });
+
+ // Bouton Add Assure Additionnel
+ document.getElementById('btnAddAdditionnel').addEventListener('click', function() {
+ const nomValue = document.getElementById('nomAdditionnel').value || 'Non défini';
+ const adresseValue = document.getElementById('adresseAditionnel').value || 'Non défini';
+ const siretValue = document.getElementById('siretAdditionnel').value || 'Non défini';
+ addRowAdditionnel(nomValue, adresseValue, siretValue);
+ });
+
+ // Garantie Tout Risque
+ document.querySelectorAll('#HIAC, #garantieVol').forEach((checkbox) => {
+ checkbox.addEventListener('click', function(e) {
+ if (tppc.tarif) {
+ e.preventDefault()
+ openModaleModif()
+ } else {
+ showOrHideTousRisques()
+ }
+ });
+ })
+
+ // Bouton Add Vehicule Additionnel
+ document.getElementById('btnAddVehicule').addEventListener('click', function() {
+ const marqueValue = document.getElementById('marqueVehicule').value || 'Non défini';
+ const genreValue = document.getElementById('genreVehicule').value || 'Non défini';
+ const typeValue = document.getElementById('typeVehicule').value || 'Non défini';
+ const immatValue = document.getElementById('immatVehicule').value || 'Non défini';
+ const capitalValue = document.getElementById('capitalVeh').value || 'Non défini';
+
+ addRowVehicule(marqueValue, genreValue, typeValue, immatValue, capitalValue);
+ });
+
+ // Bouton Add Tarif Additionnel
+ document.getElementById('btnAddTarif').addEventListener('click', function() {
+ if (tppc.tarif) {
+ openModaleModif()
+ } else {
+ const typeVehTarifValue = document.getElementById('typeVehTarif').value || 'Non défini';
+ const capitalTarifValue = document.getElementById('capitalTarif').value || 'Non défini';
+ const primeVehComTarifValue = document.getElementById('primeVehComTarif').value || 'Non défini';
+ const nbVehiculesTarifValue = document.getElementById('nbVehiculesTarif').value || 'Non défini';
+ const primeHTComTarifValue = document.getElementById('primeHTComTarif').value || 'Non défini';
+
+ const primeVehObj = {
+ commercial: primeVehComTarifValue,
+ modulee: 'Non Défini',
+ reference: 'Non Défini'
+ }
+
+ const primeHTObj = {
+ commercial: primeHTComTarifValue,
+ modulee: 'Non Défini',
+ reference: 'Non Défini'
+ }
+
+ addRowTarif(typeVehTarifValue, capitalTarifValue, primeVehObj, nbVehiculesTarifValue, primeHTObj);
+ }
+ });
+
+ //Extension garantie Select
+
+ document.getElementById('extensionsGarantie').addEventListener('change', function() {
+ const extChoisies = Array.from(this.selectedOptions).map(option => option.value);
+
+ //Liste des extensions avec modulo
+ const extAvecModulo = Object.keys(objModMar).filter((extension) => objModMar[extension].modulo)
+ var openModal = false
+
+ if (tppc.tarif) {
+
+ //Verifie s'il y a un change dans les extensions initialement selectionnées
+ // et si elles sont dans la liste des extensions avec modulo
+ extAvecModulo.forEach((extension) => {
+ if ((extPopulate.includes(extension) && !extChoisies.includes(extension))
+ || (!extPopulate.includes(extension) && extChoisies.includes(extension))
+ && extAvecModulo.includes(extension)) {
+ openModal = true
+ }
+ })
+ }
+
+ if (openModal) {
+ document.getElementById("marCiternes").selected = tppc.marCiternes ? true : false
+ document.getElementById("marDenreesSousTemp").selected = tppc.marDenreesSousTemp ? true : false;
+ document.getElementById("marAnimaux").selected = tppc.marAnimaux ? true : false;
+ document.getElementById("marFranchise").selected = tppc.marFranchise ? true : false;
+ openModaleModif()
+ } else {
+ if (extChoisies.includes('marAnimaux')) {
+ if (tagAnimauxVivants == false) {
+ M.FormSelect.init(document.querySelectorAll('select'));
+
+ const elem = document.getElementById('modalAnimauxVivants');
+ const instance = M.Modal.getInstance(elem);
+ instance.open();
+ }
+
+ tagAnimauxVivants = true;
+ } else {
+ if (!(extChoisies.includes("marAnimaux"))) {
+ tagAnimauxVivants = false;
+ }
+ }
+
+ if (extChoisies.includes('vehicule-transporte')) {
+ if (tagVehiculeTransporte == false) {
+ M.FormSelect.init(document.querySelectorAll('select'));
+
+ const elem = document.getElementById('modalFranchiseVehiculeTransporte');
+ const instance = M.Modal.getInstance(elem);
+ instance.open();
+ }
+
+ tagVehiculeTransporte = true;
+ } else {
+ if (!(extChoisies.includes("vehicule-transporte"))) {
+ tagVehiculeTransporte = false;
+ }
+ }
+ }
+ addGarantieTag();
+
+ });
+
+ // Type cotisation
+ var radioButtonsCot = document.getElementsByName('cotisation');
+ radioButtonsCot.forEach((radio) => {
+ radio.addEventListener('change', function() {
+ if (tarif && tarif.typeContrat == "ensemble") {
+ const previousState = document.querySelector("[name='cotisation']:not(:checked)")
+ previousState.checked = true
+ document.getElementById(this.value).checked = false;
+ openModaleModif()
+ } else {
+ if (this.value == "revisable") {
+ document.getElementById("colCotMini").style.display = 'block';
+ document.getElementById('colTypeDeRevision').style.display = 'block';
+ document.getElementById('designationVehicule').style.display = 'none';
+
+ if (document.getElementById("cotisationCA").checked) {
+ document.getElementById('tableCotisation').style.display = 'block';
+ document.getElementById('tarificationFlotte').style.display = 'none';
+ } else if (document.getElementById("cotisationFlotte").checked) {
+ document.getElementById('tableCotisation').style.display = 'none';
+ document.getElementById('tarificationFlotte').style.display = 'block';
+ }
+
+ } else if (this.value == "forfaitaire") {
+ document.getElementById("colCotMini").style.display = 'none';
+ document.getElementById('designationVehicule').style.display = 'block';
+ document.getElementById('colTypeDeRevision').style.display = 'none';
+ document.getElementById('tableCotisation').style.display = 'none';
+ document.getElementById('tarificationFlotte').style.display = 'none';
+ }
+ }
+ });
+ });
+
+ // Type Revision
+ var radioButtonsRev = document.getElementsByName('typeRevision');
+ radioButtonsRev.forEach((radio) => {
+ radio.addEventListener('change', function() {
+ document.getElementById(this.value).checked = true
+ if (this.value == "cotisationCA") {
+ openModaleCotCa()
+ document.getElementById('tableCotisation').style.display = 'block';
+ document.getElementById('tarificationFlotte').style.display = 'none';
+ } else if (this.value == "cotisationFlotte") {
+ document.getElementById('tableCotisation').style.display = 'none';
+ document.getElementById('tarificationFlotte').style.display = 'block';
+ }
+ });
+ });
+
+ document.getElementById('cotisationIrreductible').addEventListener('input', function() {
+ validateField('cotisationIrreductible', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('cotisationAnnuelle').addEventListener('input', function() {
+ validateField('cotisationAnnuelle', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ // ADD Event listenner to Fractionnement and cot annuelle, to get the value of the Cotisation Annuelle TTC
+ const radios = document.getElementsByName("fractionnement");
+ const cotisationAnnuelleHTInput = document.getElementById("cotisationAnnuelleHT");
+
+ // Add event listeners to the radio buttons
+ radios.forEach((radio) => {
+ radio.addEventListener("change", calculCotisationAnnuelleTTC);
+ });
+
+ // Add event listener to the text input
+ cotisationAnnuelleHTInput.addEventListener("input", calculCotisationAnnuelleTTC);
+
+ document.getElementById('btnNullDateDebut').addEventListener('click', function() {
+ document.getElementById('dateEffet').value = "00/00/0000";
+ validateField('dateEffet', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('btnNullDateEcheance').addEventListener('click', function() {
+ document.getElementById('dateEcheance').value = "00/00";
+ validateField('dateEcheance', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('btnNullDateFin').addEventListener('click', function() {
+ document.getElementById('dateFin').value = "00/00/0000";
+ validateField('dateFin', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('btnModalDate').addEventListener('click', function() {
+ const elem = document.getElementById('modalDate');
+ const instance = M.Modal.getInstance(elem);
+ instance.open();
+ });
+
+ document.getElementById('dateEffet').addEventListener('input', function() {
+ validateField('dateEffet', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('dateFin').addEventListener('input', function() {
+ validateField('dateFin', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById('dateEcheance').addEventListener('input', function() {
+ validateField('dateEcheance', true);
+ updateSubmitButtonState('projetForm');
+ });
+
+ document.getElementById("nombreDeSinistres").addEventListener('input', function() {
+ if (tarif && tarif.montantSinistre && (tarif.montantSinistre > 0 && this.value <= 0)) {
+ document.getElementById('nombreDeSinistres-error').innerText = "Vous avez renseigné " + tarif.montantSinistre + "€ de montant sinistre"
+ document.getElementById('nombreDeSinistres-error').style.display = " block"
+ } else {
+ document.getElementById('nombreDeSinistres-error').style.display = " none"
+ }
+ })
+
+ document.getElementById('activite').addEventListener('keydown', function(e) {
+ if (tppc.tarif) {
+ e.preventDefault()
+ openModaleModif()
+ }
+ })
+ document.getElementById('activite').addEventListener('input', function(e) {
+ validateField('activite', true)
+ updateSubmitButtonState('projetForm');
+ })
+
+ document.getElementById('cotisationAnnuelleHT').addEventListener('keydown', function(e) {
+ if (extractTypeRev() !== "CotCA" && tppc.tarif) {
+ e.preventDefault()
+ openModaleModif()
+ }
+ validateField('cotisationAnnuelleHT', true)
+ updateSubmitButtonState('projetForm');
+ })
+
+ document.getElementById('cotisationAnnuelle').addEventListener('keydown', function(e) {
+ if (extractTypeRev() !== "CotCA" && tppc.tarif) {
+ e.preventDefault()
+ openModaleModif()
+ }
+ validateField('cotisationAnnuelle', true)
+ updateSubmitButtonState('projetForm');
+ })
+
+ document.getElementById('modif-OK').addEventListener('click', function(event) {
+ event.preventDefault()
+ redirectToTarif()
+ })
+
+ document.getElementById('modal-client').addEventListener('click', function(event) {
+ event.preventDefault()
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=client`;
+ })
+ document.getElementById('modal-inter').addEventListener('click', function(event) {
+ event.preventDefault()
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=intermediaire`;
+ })
+
+ // attach Listener to get the Total of vehicule in the table Tarification
+ document.querySelector('input[name="nbVehiculesTarif"]').addEventListener('input', calculNombreVehicule);
+
+ const tableCotisation = document.getElementById('tableCotisation');
+ const inputsCotisation = tableCotisation.querySelectorAll('input');
+
+ inputsCotisation.forEach((inputCotisation) => {
+ inputCotisation.addEventListener('input',(event) => {
+ calculCotisationCA(event);
+ validateField('capital', true);
+ validateField('chiffreAffaires', true);
+ validateField('tauxCA', true);
+ updateSubmitButtonState('projetForm');
+ });
+ });
+
+ // attach event to Table Tarif to get Cotisation Annuelle
+ const tableTarif = document.getElementById('empTableTarif');
+ const inputsTarif = tableTarif.querySelectorAll('input');
+
+ attachEventListenersToInputsTarif(inputsTarif);
+ }
+
+ function attachEventListenersToInputsTarif(inputs) {
+ inputs.forEach((input) => {
+ input.addEventListener('keydown', (event) => {
+ if (input.name == 'capitalTarif' || input.name == 'nbVehiculesTarif' || input.name == 'primeHTComTarif') {
+ if (tppc.tarif) {
+ event.preventDefault()
+ openModaleModif()
+ }
+ }
+ });
+
+ input.addEventListener('input', (event) => {
+ if (input.name == 'primeVehComTarif' || input.name == 'capitalTarif' || input.name == 'nbVehiculesTarif' || input.name == 'primeHTComTarif' && !tppc.tarif) {
+ calculPrimeHT(event);
+ calculCotisationAnnuelleHTPrimeVehicule(event);
+ }
+ });
+ });
+ }
+
+
+ async function constantsJSON() {
+ try {
+ const responsesJSON = await Promise.all([
+ fetch('/tppc/modulo/marchandise'),
+ fetch('/tppc/list/vehicule')
+ ]);
+ // Appeler .json() pour chaque réponse pour convertir en JSON
+ const jsonResponses = await Promise.all(responsesJSON.map(r => r.json())); // Récupérer toutes les réponses JSON
+
+ // Extraire la valeur objRetourne de chaque réponse
+ [
+ objModMar,
+ listTypeVehicule,
+ ] = jsonResponses.map(response => response.objRetourne); // Adapter pour extraire objRetourne
+
+ } catch (err) {
+ throw err;
+ }
+ }
+
+ function fillSelects() {
+
+ const selectExt = document.getElementById('extensionsGarantie')
+ const optionCreator = (text, value) => {
+ let option = document.createElement('option')
+ option.value = value
+ option.text = text
+ option.id = value
+ return option
+ }
+
+ for (const [key, value] of Object.entries(objModMar)) {
+ if (value['projet']) {
+ const option = optionCreator(value['projet'], key)
+ selectExt.add(option)
+ }
+ }
+
+ var select = document.querySelectorAll('select');
+ M.FormSelect.init(select);
+ }
+
+ // Garantie Tout Risque
+ function showOrHideTousRisques() {
+ const tousRisques = document.getElementById("tousRisques");
+ const garantieVol = document.getElementById("garantieVol");
+ const hiac = document.getElementById("HIAC");
+
+ if (garantieVol.checked && hiac.checked) {
+ tousRisques.style.display = "block";
+ } else {
+ tousRisques.style.display = "none";
+ }
+ }
+
+ function openModaleModif() {
+ const elem = document.getElementById('modalModif');
+ const instance = M.Modal.getInstance(elem);
+ instance.open();
+ }
+
+ function openModaleCotCa() {
+ if (tppc.tarif) {
+ const elem = document.getElementById('modalCotCA');
+ const instance = M.Modal.getInstance(elem)
+ instance.open()
+ }
+ }
+
+ function openModaleClientInter() {
+ if (!client) {
+ document.getElementById('modal-client').style.display = "inline-block"
+ document.getElementById('list-client').style.display = "block"
+ }
+
+ if (!intermediaire) {
+ document.getElementById('modal-inter').style.display = "inline-block"
+ document.getElementById('list-inter').style.display = "block"
+ }
+
+ const elem = document.getElementById('modalClientInter');
+ const instance = M.Modal.getInstance(elem);
+ instance.open();
+ }
+
+ //display add additionnel
+ function toggler(btn, div) {
+ if (document.getElementById(btn).checked) {
+ document.getElementById(div).style.display = 'block';
+ } else {
+ document.getElementById(div).style.display = 'none';
+ }
+ }
+
+ // Handle event spécifique au limite de garantie activité
+ window.handleInputActivity = function(inputId) {
+ validateField(inputId, true);
+ updateSubmitButtonState('projetForm');
+ };
+
+ function addGarantieTag() {
+ const select = document.getElementById('extensionsGarantie');
+ const garantieContainer = document.getElementById('selected-garanties');
+
+ // Clear previous entries
+ garantieContainer.innerHTML = ''; // Clear any existing entries
+
+ // Iterate over each selected option
+ Array.from(select.options).forEach(option => {
+ if (option.selected && option.value) {
+ if (option.selected && option.value) {
+ const garantieTagName = option.textContent;
+ const garantieTagDiv = document.createElement('div');
+ garantieTagDiv.classList.add('garantieTag-input', 'row');
+ garantieTagDiv.style.display = 'flex';
+ garantieTagDiv.style.alignItems = 'center';
+ garantieTagDiv.style.justifyContent = 'start';
+ garantieTagDiv.style.marginBottom = '10px';
+ garantieTagDiv.innerHTML = `${garantieTagName} `;
+ garantieContainer.appendChild(garantieTagDiv);
+ }
+ }
+ });
+ }
+
+ // Peupler le formulaire avec les données
+ function populateFormData() {
+ //Poupulate select historique
+ if (!contrat.historique) {
+ document.getElementById('historiqueDiv').style.display = "none";
+ } else {
+ document.getElementById('historiqueDiv').style.display = "block";
+
+ const idSelect = document.getElementById('idSelect');
+
+ contrat.historique.forEach(function(item) {
+ var option = document.createElement('option');
+ option.value = item.id;
+ option.textContent = item.type + " " + item.produit + " - " + item.date + " - " + item.heure;
+
+ if (item.nom != undefined && item.prenom != undefined) {
+ option.textContent += " - " + item.nom + " " + item.prenom;
+ }
+
+ idSelect.appendChild(option);
+ });
+ M.FormSelect.init(idSelect);
+ }
+
+ // Populate activité
+ if (tppc.actAssuree) {
+ document.getElementById("activite").value = tppc.actAssuree;
+ }
+ // Populate assurés additionnel
+ if (!projet || !projet.assureAdditionnel || Object.keys(projet.assureAdditionnel).length === 0) {
+ console.error("Le JSON est vide, pas d'assurés additionnels à pré-remplir.");
+ } else {
+ document.getElementById('additionel').checked = true;
+ document.getElementById('checkAdditionnel').style.display = "block";
+
+ for (let i = 0; i < projet.assureAdditionnel.length; i++) {
+ const row = projet.assureAdditionnel[i];
+ addRowAdditionnel(row.nom, row.adresse, row.siret);
+ }
+ }
+
+ if (projet && projet.antSin !== undefined) {document.getElementById("nombreDeSinistres").value = projet.antSin};
+
+ //Les garanties
+ if (tppc.garanties) {
+ if (tppc.garanties.includes('IAC')) {document.getElementById("IAC").checked = true};
+ if (tppc.garanties.includes('HIAC')) {document.getElementById("HIAC").checked = true};
+ if (tppc.garanties.includes('Vol')) {document.getElementById("garantieVol").checked = true};
+ showOrHideTousRisques();
+ }
+
+ //Extensions Garanties
+ if (tppc.marCiternes) {document.getElementById("marCiternes").selected = true};
+ if (tppc.marDenreesSousTemp) {document.getElementById("marDenreesSousTemp").selected = true};
+
+ if (tppc.marAnimaux) {
+ tagAnimauxVivants = true;
+ document.getElementById("marAnimaux").selected = true;
+ };
+
+ if (tppc.marFranchise) {
+ tagVehiculeTransporte = true;
+ document.getElementById("marFranchise").selected = true;
+ };
+
+ //Remplissage du tableau par les extensions qui sont déjà sélectionnées
+ extPopulate = [...document.querySelectorAll('#extensionsGarantie option:checked:not([value=""])')].map((option => option.value))
+ addGarantieTag();
+
+ // Populate temporalité
+ if (projet && projet.tempo) {document.getElementById(projet.tempo).checked = true};
+ if (projet && projet.dateEffet) {document.getElementById("dateEffet").value = projet.dateEffet};
+ if (projet && projet.dateEcheance) {document.getElementById("dateEcheance").value = projet.dateEcheance};
+
+ if (contrat.type === "TEMPORAIRE") {document.getElementById('rowDateFin').style.display = 'block';}
+ if (projet && projet.dateFin) {document.getElementById("dateFin").value = projet.dateFin};
+ if (projet && projet.typeCot) {document.getElementById(projet.typeCot).checked = true}
+
+ // Populate Cotisation
+ var typeRev = "cotisationFlotte", typeCot = "revisable"
+
+ if (tarif && tarif.typeContrat) {
+ if (tarif.typeContrat == "detaillee") {
+ typeRev = "cotisationFlotte"
+ typeCot = "revisable"
+ } else if (tarif.typeContrat == "ensemble") {
+ typeCot = "forfaitaire"
+ }
+ } else if (projet && projet.typeCot) {
+ typeCot = projet.typeCot
+ typeRev = (projet.typeRev == "CotCA") ? "cotisationCA" : "cotisationFlotte"
+ }
+
+ document.getElementById(typeCot).checked = true
+ document.getElementById(typeRev).checked = true
+
+ if (typeCot == "revisable") {
+ document.getElementById('colTypeDeRevision').style.display = 'block';
+ document.getElementById('designationVehicule').style.display = 'none';
+ document.getElementById("colCotMini").style.display = 'block';
+ if (typeRev == "cotisationCA") {
+ document.getElementById('tableCotisation').style.display = 'block';
+ document.getElementById('tarificationFlotte').style.display = 'none';
+ } else if (typeRev == "cotisationFlotte") {
+ document.getElementById('tableCotisation').style.display = 'none';
+ document.getElementById('tarificationFlotte').style.display = 'block';
+ if (tarif) {
+ document.getElementById('inputRow').style.display = "none"
+ }
+ }
+ } else if (typeCot == "forfaitaire") {
+ document.getElementById("colCotMini").style.display = 'none'
+ document.getElementById('tarificationFlotte').style.display = 'none';
+ document.getElementById('designationVehicule').style.display = 'block';
+ document.getElementById('colTypeDeRevision').style.display = 'none';
+ document.getElementById('tableCotisation').style.display = 'none';
+ }
+
+ if (projet && projet.cotIrreductible) {document.getElementById("cotisationIrreductible").value = projet.cotIrreductible};
+ if (tppc.nbVehic) {document.getElementById("nombreVehicules").value = tppc.nbVehic};
+ if (tppc.cotCapVeh) {document.getElementById("capital").value = tppc.cotCapVeh};
+ if (projet && projet.ca) {document.getElementById("chiffreAffaires").value = projet.ca};
+ if (projet && projet.cotTauxTax) {document.getElementById("tauxCA").value = projet.cotTauxTax};
+
+ if (tppc.tarif) {
+ const tarifRef = tppc['@expand'].tarif['tarifRef']
+ document.getElementById("tarifRef").value = tarifRef;
+ document.getElementById('cotAnnHTMessage').style.display = "block"
+ } else {
+ document.querySelectorAll('[name="tarifRefCell"]').forEach((cell) => cell.style.display = "none")
+ }
+
+ if (tppc.primeHT) {
+ document.getElementById("cotisationAnnuelleHT").value = tppc.primeHT
+ calculCotisationAnnuelleTTC()
+ }
+
+ // Populate tableau vehicule
+ if (projet && projet.designationVehicule && Object.keys(projet.designationVehicule).length !== 0) {
+ for (let i = 0; i < projet.designationVehicule.length; i++) {
+ const row = projet.designationVehicule[i];
+ addRowVehicule(row.marque, row.genre, row.type, row.immat, row.capital);
+ }
+ }
+
+ // Populate tableau Tarification
+ if (tppc && tppc.tarFlotte && Object.keys(tppc.tarFlotte).length !== 0) {
+ for (let i = 0; i < tppc.tarFlotte.length; i++) {
+ const row = tppc.tarFlotte[i];
+
+ const primeVehObj = {
+ commercial: row.primeVehComTarif,
+ modulee: row.primeVehModRefTarif,
+ reference: row.primeVehTarif
+ }
+
+ const primeHTObj = {
+ commercial: row.primeHTComTarif,
+ modulee: row.primeHTModRefTarif,
+ reference: row.primeHTTarif
+ }
+
+ addRowTarif(listTypeVehicule[row.typeVehTarif] || row.typeVehTarif, row.capitalTarif, primeVehObj, row.nbVehiculesTarif, primeHTObj, row.garTarif, row.typeMarTarif, row.modulo);
+ }
+ calculNombreVehicule()
+ }
+ }
+
+ // Ajouter une ligne au tableau
+ function addRowAdditionnel(nomValue, adresseValue, siretValue) {
+ const table = document.getElementById('empTableAdditionnel');
+
+ // Créer une nouvelle ligne avec des inputs éditables
+ const newRow = table.insertRow(table.rows.length - 1);
+ newRow.innerHTML = `
+
+
+
+
+
+ delete
+
+
+ `;
+
+ // Réinitialiser les valeurs de saisie
+ document.getElementById('nomAdditionnel').value = '';
+ document.getElementById('adresseAditionnel').value = '';
+ document.getElementById('siretAdditionnel').value = '';
+
+ // Ajouter un écouteur d'événements pour supprimer
+ newRow.querySelector('.delete-btn').addEventListener('click', function() {
+ deleteRow(this);
+ });
+ }
+
+ // Ajouter une ligne au tableau Vehicule
+ function addRowVehicule(marqueValue, genreValue, typeValue, immatValue, capitalValue) {
+ const table = document.getElementById('empTableVehicules');
+ // Créer une nouvelle ligne avec des inputs éditables
+
+ const newRow = table.insertRow(table.rows.length - 1);
+ newRow.innerHTML = `
+
+
+
+
+
+
+
+ delete
+
+
+ `;
+
+ // Réinitialiser les valeurs de saisie
+ document.getElementById('marqueVehicule').value = '';
+ document.getElementById('genreVehicule').value = '';
+ document.getElementById('typeVehicule').value = '';
+ document.getElementById('immatVehicule').value = '';
+ document.getElementById('capitalVeh').value = '';
+
+ // Ajouter un écouteur d'événements pour supprimer
+ newRow.querySelector('.delete-btn').addEventListener('click', function() {
+ deleteRow(this);
+ });
+ }
+
+ function addRowTarif(typeVehTarifValue, capitalTarifValue, primeVehObj, nbVehiculesTarifValue, primeHTObj, garTarifValue = '', typeMarTarifValue = '', moduloValue = 1) {
+ const table = document.getElementById('empTableTarif');
+
+ var primeVehComTarifValue = primeVehObj.commercial
+ const primeVehModRefTarifValue = primeVehObj.modulee
+ const primeVehTarifValue = primeVehObj.reference
+
+ var primeHTComTarifValue = primeHTObj.commercial
+ const primeHTModRefTarifValue = primeHTObj.modulee
+ const primeHTTarifValue = primeHTObj.reference
+
+ // Créer une nouvelle ligne avec des inputs éditables
+ const newRow = table.insertRow(table.rows.length - 1);
+
+ if (primeVehComTarifValue == undefined) {
+ primeVehComTarifValue = 0
+ }
+
+ if (primeHTComTarifValue == undefined) {
+ primeHTComTarifValue = 0
+ }
+
+ newRow.innerHTML = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ delete
+
+
+ `;
+
+ // Réinitialiser les valeurs de saisie
+ document.getElementById('typeVehTarif').value = '';
+ document.getElementById('capitalTarif').value = '';
+ document.getElementById('primeVehComTarif').value = '';
+ document.getElementById('nbVehiculesTarif').value = '';
+ document.getElementById('primeHTComTarif').value = '';
+ document.getElementById('garTarif').value = '';
+ document.getElementById('typeMarTarif').value = '';
+ document.getElementById('modulo').value = '';
+ // Ajouter un écouteur d'événements pour Calculer Prime HT et prime Annuelle
+ const inputsInNewRow = newRow.querySelectorAll('input');
+ attachEventListenersToInputsTarif(inputsInNewRow);
+
+ //update Nombre de Vehicule
+ newRow.querySelector('input[name="nbVehiculesTarif"]').addEventListener('input', calculNombreVehicule);
+
+ // Ajouter un écouteur d'événements pour supprimer
+ newRow.querySelector('.delete-btn').addEventListener('click', function() {
+ if (tppc.tarif) {
+ openModaleModif()
+ } else {
+ deleteRow(this);
+ calculCotisationAnnuelleHTPrimeVehicule();
+ calculNombreVehicule();
+ }
+ });
+ }
+
+ // Supprimer une ligne du tableau
+ function deleteRow(btn) {
+ const row = btn.parentElement.parentElement;
+ row.parentElement.removeChild(row);
+ }
+
+ // Calcul nombre de Vehicule
+ function calculNombreVehicule() {
+ const tarifRows = document.querySelectorAll('#empTableTarif tbody tr');
+ let totalVehicules = 0;
+
+ tarifRows.forEach((row) => {
+ const nbVehiculesInput = row.querySelector('input[name="nbVehiculesTarif"]');
+ const nbVehiculesValue = parseInt(nbVehiculesInput.value) || 0;
+ totalVehicules += nbVehiculesValue;
+ });
+
+ document.getElementById('nombreVehicules').value = totalVehicules;
+ }
+
+ function calculCotisationAnnuelleHTPrimeVehicule() {
+ const tableTarif = document.getElementById('empTableTarif');
+ let somme = 0;
+ const inputs = tableTarif.querySelectorAll('input[name="primeHTComTarif"]');
+
+ for (let i = 0; i < inputs.length; i++) {
+ const value = parseFloat(inputs[i].value) || 0;
+ somme += value;
+ }
+
+ document.getElementById('cotisationAnnuelleHT').value = somme;
+ calculCotisationAnnuelleTTC()
+ }
+
+ // Calcul de la Prime Totale en HT
+ function calculPrimeHT(event) {
+ const input = event.currentTarget;
+ const row = input.parentNode.parentNode; //Selection de la ligne en cours
+ const nbVehiculeInput = row.querySelector('input[name="nbVehiculesTarif"]');
+ const primeVehiculeInput = row.querySelector('input[name="primeVehComTarif"]');
+ const primeHTInput = row.querySelector('input[name="primeHTComTarif"]');
+
+ const nbVehicule = parseFloat(nbVehiculeInput.value) || 0;
+ const primeVehicule = parseFloat(primeVehiculeInput.value) || 0;
+
+ const somme = (nbVehicule * primeVehicule);
+ primeHTInput.value = somme;
+ calculCotisationAnnuelleTTC();
+ }
+
+ //Calcul de la cotisation Annuel
+ function calculCotisationAnnuelleTTC() {
+ cotisationAnnuelleHT = parseFloat(document.getElementById("cotisationAnnuelleHT").value) || 0
+ let fract = 0;
+
+ if (document.getElementById("annuel").checked) {fract = 1};
+ if (document.getElementById("semestriel").checked) {fract = 2};
+ if (document.getElementById("trimestriel").checked) {fract = 4};
+ if (document.getElementById("mensuel").checked) {fract = 1};
+
+ const resultat = (cotisationAnnuelleHT + 6.50 + (36 * fract)).toFixed(2);
+ document.getElementById("cotisationAnnuelle").value = resultat;
+
+ validateField('cotisationAnnuelleHT', true);
+ updateSubmitButtonState('projetForm');
+ }
+
+ function calculCotisationCA(event) {
+ const input = event.target;
+
+ if (input.id === 'chiffreAffaires') {
+ cotisationAnnuelleHT = parseFloat(input.value * document.getElementById("tauxCA").value / 100) || 0
+ document.getElementById('cotisationAnnuelleHT').value = cotisationAnnuelleHT.toFixed(2)
+ } else if (input.id === 'tauxCA') {
+ cotisationAnnuelleHT = parseFloat(input.value * document.getElementById("chiffreAffaires").value / 100) || 0
+ document.getElementById('cotisationAnnuelleHT').value = cotisationAnnuelleHT.toFixed(2)
+ }
+
+ calculCotisationAnnuelleTTC()
+ }
+
+ function handleLoadHistoriqueBtn() {
+ var selectedId = document.getElementById('idSelect').value;
+
+ if (selectedId != "") {
+ fetch(`/contrat/update/${contrat.produit}/${contrat.id}/${selectedId}`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ })
+ .then(response => response.json())
+ .then(data => {
+ if (data.valid) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=projet`;
+ } else {
+ console.log('Echec lors de la mise à jour de la relation id contrat - id client :', data);
+ }
+ });
+ }
+ }
+
+ // Contruit la structure Assuré additionnel à envoyer à la BDD
+ function extractAssureAdditionnel(tableId) {
+ const jsonArr = [];
+ const table = document.getElementById(tableId);
+
+ if (table && document.getElementById("additionel").checked) {
+ const rows = table.querySelectorAll('tr:not(:first-child)');
+
+ rows.forEach(row => {
+ const allInputsEmpty = Array.from(row.querySelectorAll('input')).every(input => input.value === '');
+
+ if (!allInputsEmpty) {
+ const inputs = row.querySelectorAll('input');
+ const dataObj = {};
+
+ inputs.forEach(input => {
+ const fieldName = input.getAttribute('name');
+ const fieldValue = input.value || "Non défini";
+ dataObj[fieldName] = fieldValue;
+ });
+
+ jsonArr.push(dataObj);
+ }
+ });
+
+ const jsonResult = JSON.stringify(jsonArr, null, 2);
+ return jsonResult;
+ }
+
+ return "[]"; // Retourne un tableau JSON vide si aucune saisie n'est trouvée dans le tableau
+ }
+
+ // Contruit la structure Designation à envoyer à la BDD
+ function extractDesignationVehicule(tableId) {
+ const jsonArr = [];
+ const table = document.getElementById(tableId);
+
+ if (table) {
+ const rows = table.querySelectorAll('tr:not(:first-child)');
+
+ rows.forEach(row => {
+ const allInputsEmpty = Array.from(row.querySelectorAll('input')).every(input => input.value === '');
+
+ if (!allInputsEmpty) {
+ const inputs = row.querySelectorAll('input');
+ const dataObj = {};
+
+ inputs.forEach(input => {
+ const fieldName = input.getAttribute('name');
+ const fieldValue = input.value || "Non défini";
+ dataObj[fieldName] = fieldValue;
+ });
+
+ jsonArr.push(dataObj);
+ }
+ });
+
+ const jsonResult = JSON.stringify(jsonArr, null, 2);
+ return jsonResult;
+ }
+
+ return "[]"; // Retourne un tableau JSON vide si aucune saisie n'est trouvée dans le tableau
+ }
+
+ // Contruit la structure Designation à envoyer à la BDD
+ function extractTarificationFlotte(tableId) {
+ const jsonArr = [];
+ const table = document.getElementById(tableId);
+
+ if (table) {
+ const rows = table.querySelectorAll('tr');
+
+ rows.forEach(row => {
+ const allInputsEmpty = Array.from(row.querySelectorAll('input')).every(input => input.value === '');
+
+ if (!allInputsEmpty) {
+ const inputs = row.querySelectorAll('input');
+ const dataObj = {};
+
+ inputs.forEach(input => {
+ const fieldName = input.getAttribute('name');
+ var fieldValue
+ fieldValue = input.value || "Non défini";
+ dataObj[fieldName] = fieldValue;
+ });
+
+ jsonArr.push(dataObj);
+ }
+ });
+
+ const jsonResult = JSON.stringify(jsonArr, null, 2);
+ return jsonResult;
+ }
+
+ return "[]"; // Retourne un tableau JSON vide si aucune saisie n'est trouvée dans le tableau
+ }
+
+ function extractTempo() {
+ let tempo = "";
+
+ if (document.getElementById("mensuel").checked == true) {tempo = "mensuel";}
+ if (document.getElementById("trimestriel").checked == true) {tempo = "trimestriel";}
+ if (document.getElementById("semestriel").checked == true) {tempo = "semestriel";}
+ if (document.getElementById("annuel").checked == true) {tempo = "annuel";}
+
+ return tempo;
+ }
+
+ function extractTypeCot() {
+ if (document.getElementById("forfaitaire").checked == true) {return "forfaitaire";}
+ if (document.getElementById("revisable").checked == true) {return "revisable";}
+ }
+
+ function extractTypeRev() {
+ if (extractTypeCot() == "revisable") {
+ if (document.getElementById("cotisationCA").checked == true) {return "CotCA";}
+ if (document.getElementById("cotisationFlotte").checked == true) {return "FlotteOuverte";}
+ } else {
+ return ""
+ }
+ }
+
+ function extractGaranties() {
+ const garanties = new Set()
+ if (document.getElementById('HIAC').checked) {
+ garanties.add('HIAC')
+ }
+ if (document.getElementById('IAC').checked) {
+ garanties.add('IAC')
+ }
+ if (document.getElementById('garantieVol').checked) {
+ garanties.add('Vol')
+ }
+ return [...garanties]
+ }
+
+ async function redirectToTarif() {
+ if (await submitForm(false, false)) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`;
+ }
+ }
+
+ // Gérer la soumission du formulaire
+ async function submitForm(updateTPPC = true, generateProject = true) {
+ const bodyProjet = {
+ //Informations sur l'assuré :
+ "assureAdditionnel": extractAssureAdditionnel('empTableAdditionnel'),
+
+ //Nombre exosition
+ // "nbExp": document.getElementById("nombre-exposition").value,
+
+ //Antécedent de sinitre
+ "antSin": document.getElementById("nombreDeSinistres").value == "" ? "" : document.getElementById("nombreDeSinistres").value,
+
+ // Informations sur le contrat :
+ // Fractionnement
+ "tempo": extractTempo(),
+ "typeCot": extractTypeCot(),
+
+ // Dates du contrat
+ "dateEffet": document.getElementById("dateEffet").value,
+ "dateEcheance": document.getElementById("dateEcheance").value,
+ "dateFin": document.getElementById("dateFin").value,
+
+ // Informations sur les cotisations :
+ "typeRev": extractTypeRev(),
+
+ // Informations sur les cotisations :
+ "designationVehicule": (extractTypeCot() == "forfaitaire") ? extractDesignationVehicule('empTableVehicules') : "",
+ "cotIrreductible": (extractTypeCot() == "revisable") ? document.getElementById("cotisationIrreductible").value : "",
+ "cotTauxTax": (extractTypeRev() == "CotCA") ? document.getElementById("tauxCA").value : '',
+ // "tarifComHT": document.getElementById("cotisationAnnuelleHT").value,
+ "tarifComTTC": updateTPPC ? document.getElementById("cotisationAnnuelle").value : '',
+ "ca": document.getElementById('chiffreAffaires').value,
+ // Vous pouvez ajouter d'autres données pour la saisie dans la collection TPPC PROJET ici
+ }
+
+ const responseProjet = await fetch(`/tppc/createProjet`, {
+ method: 'POST',
+ body: JSON.stringify(bodyProjet), headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+ const dataProjet = await responseProjet.json();
+
+ if (dataProjet.valid) {
+ const idProjet = dataProjet.tppc.id
+ var bodyTPPC = {}
+ var tarif = ""
+
+ if (tppc.tarif && extractTypeRev() !== "CotCA") {
+ tarif = tppc.tarif
+ }
+
+ if (updateTPPC) {
+ bodyTPPC = {
+ "actAssuree": document.getElementById("activite").value,
+ "projet": idProjet,
+ "tarif": tarif,
+ "nbVehic": document.getElementById("nombreVehicules").value,
+ "cotCapVeh": document.getElementById("capital").value,
+ "garanties": extractGaranties(),
+ "ca": document.getElementById("chiffreAffaires").value,
+ "tarFlotte": extractTarificationFlotte('empTableTarif'),
+ "primeHT": document.getElementById('cotisationAnnuelleHT').value,
+ "commentaire": commentaire,
+ "marOrdinaires": tppc.marOrdinaires || '',
+ "marBennes": tppc.marBennes || '',
+ "marDenreesHorsTemp": tppc.marDenreesHorsTemp || '',
+ "marRisques": tppc.marRisques || '',
+ "marEngins": tppc.marEngines || '',
+ "marFranchise": document.getElementById('marFranchise').selected,
+ "marEnExpo": tppc.marEnExpo || '',
+ "marCiternes": document.getElementById('marCiternes').selected,
+ "marAnimaux": document.getElementById('marAnimaux').selected,
+ "marDenreesSousTemp": document.getElementById('marDenreesSousTemp').selected,
+ "nbExpo": tppc.nbExpo || '',
+ "capExpo": tppc.capExpo || '',
+ "typeMarExpo": tppc.typeMarExpo || '',
+ "franchiseMarExpo": tppc.franchiseMarExpo || '',
+ }
+ } else {
+ bodyTPPC = {
+ "actAssuree": tppc.actAssuree,
+ "projet": idProjet,
+ "tarif": tppc.tarif,
+ "nbVehic": tppc.nbVehic,
+ "cotCapVeh": tppc.cotCapVeh,
+ "garanties": tppc.garanties,
+ "tarFlotte": tppc.tarFlotte,
+ "primeHT": tppc.primeHT,
+ "commentaire": tppc.commentaire,
+ "marOrdinaires": tppc.marOrdinaires,
+ "marBennes": tppc.marBennes,
+ "marDenreesHorsTemp": tppc.marDenreesHorsTemp,
+ "marRisques": tppc.marRisques,
+ "marEngins": tppc.marEngines,
+ "marFranchise": tppc.marFranchise,
+ "marEnExpo": tppc.marEnExpo,
+ "marCiternes": tppc.marCiternes,
+ "marAnimaux": tppc.marAnimaux,
+ "marDenreesSousTemp": tppc.marDenreesSousTemp,
+ "nbExpo": tppc.nbExpo,
+ "capExpo": tppc.capExpo,
+ "typeMarExpo": tppc.typeMarExpo,
+ "franchiseMarExpo": tppc.franchiseMarExpo,
+ }
+ }
+
+ const responseTPPC = await fetch(`/tppc/create`, {
+ method: 'POST',
+ body: JSON.stringify(bodyTPPC), headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+ const dataTPPC = await responseTPPC.json();
+
+ if (dataTPPC.valid) {
+ const idTPPC = dataTPPC.tppc.id;
+
+ // Mettre à jour le champ "enCours" dans le contrat avec l'ID de la nouvelle saisie tppc
+ const responseContratEnCours = await fetch(`/contrat/update/${contrat.produit}/${contrat.id}/${idTPPC}`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+ const dataContratEnCours = await responseContratEnCours.json();
+
+ if (dataContratEnCours.valid) {
+ // Obtenir la date actuelle au format "JJ/MM/AAAA"
+ const currentDate = new Date();
+ const day = String(currentDate.getDate()).padStart(2, '0');
+ const month = String(currentDate.getMonth() + 1).padStart(2, '0'); // Les mois sont indexés à partir de 0, donc +1
+ const year = currentDate.getFullYear();
+ const formattedDate = `${day}/${month}/${year}`;
+
+ //Obtenir l'user
+ const token = localStorage.getItem('jwtToken');
+ const decoded = jwt_decode(token);
+ const userFirstName = decoded.userFirstName;
+ const userLastName = decoded.userLastName;
+
+ // Obtenir l'heure actuelle au format "HHhMM"
+ const hours = String(currentDate.getHours()).padStart(2, '0');
+ const minutes = String(currentDate.getMinutes()).padStart(2, '0');
+ const seconds = String(currentDate.getSeconds()).padStart(2, '0');
+ const formattedTime = `${hours}:${minutes}:${seconds}`;
+ const nom = userLastName;
+ const prenom = userFirstName;
+
+ // Mettre à jour le champ "historique" dans le contrat avec les nouvelles données d'historique
+ const historiqueData = [
+ {
+ "type": contrat.type,
+ "date": formattedDate,
+ "heure": formattedTime,
+ "produit": "TPPC",
+ "id": idTPPC,
+ "nom": nom,
+ "prenom": prenom,
+ }
+ ];
+
+ const responseHistoriqueUpdate = await fetch(`/contrat/update/historique/${contrat.id}`, {
+ method: 'POST',
+ body: JSON.stringify({historiqueData}),
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+
+ const dataHistoriqueUpdate = await responseHistoriqueUpdate.json();
+
+ if (dataHistoriqueUpdate.valid) {
+ if (generateProject == false) {
+ return true
+ } else {
+ const numParcours = getNumParcoursFromURL();
+ let filename;
+
+ // Envoi de la requête POST au serveur pour générer le projet
+ fetch(`/generate/tppc/projet/${numParcours}`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+
+ })
+ .then(response => {
+ if (!response.ok) {
+ throw new Error('Erreur réseau ou serveur');
+ }
+
+ const disposition = response.headers.get('content-disposition');
+ filename = disposition.split(';')[1].trim().split('=')[1];
+
+ return response.blob(); // On attend une réponse sous forme de blob pour un fichier
+ })
+ .then(blob => {
+ // Crée un URL pour le blob
+ const url = window.URL.createObjectURL(blob);
+ // Crée un élément a temporaire pour simuler un clic pour téléchargement
+ const a = document.createElement('a');
+ a.href = url;
+ a.download = filename; // Nomme le fichier téléchargé
+ document.body.appendChild(a); // Ajoute l'élément au document
+ a.click(); // Simule un clic sur l'élément pour déclencher le téléchargement
+ window.URL.revokeObjectURL(url); // Nettoie l'URL objet
+ a.remove(); // Supprime l'élément a du document
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=projet`;
+ })
+ .catch(error => console.error('Erreur lors de la génération du projet:', error));
+
+ /// TODO FIN Génération fichier à l'enregistrement A RETIRER QUAND MODE CONTRAT
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////
+
+ // TODO NE PAS OUBLIER LE HREF QUI EST DANS LE GEN ACTUELLEMENT
+ // window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=projet`;
+ }
+ } else {
+ console.log('Echec lors de la mise à jour de l\'historique du contrat :', dataHistoriqueUpdate.message);
+ }
+ }
+ } else {
+ console.log('Echec lors de la mise à jour du champ "enCours" dans le contrat :', dataContratEnCours.message);
+ }
+ } else {
+ console.log('Echec lors de la création de la saisie dans la collection TPPC :', dataProjet.message);
+ }
+ }
+
+ window.initSubmenuForm = init;
+})();
+
diff --git a/ecole/public/js/rc-data-manager.js b/ecole/public/js/rc-data-manager.js
new file mode 100644
index 00000000..464bf8d4
--- /dev/null
+++ b/ecole/public/js/rc-data-manager.js
@@ -0,0 +1,647 @@
+/**
+ * ═══════════════════════════════════════════════════════════════════════════
+ * RC DATA MANAGER
+ * ═══════════════════════════════════════════════════════════════════════════
+ *
+ * Ce module gère la collecte, la sauvegarde et le pré-remplissage des données
+ * RC entre les formulaires Tarif et Projet.
+ *
+ * @requires rc-sync-utils.js
+ * @author AXA Transport Team
+ * @version 2.0.0
+ * @since 2026-02-17
+ */
+
+(function(window) {
+ 'use strict';
+
+ const { toNumber, getValue, setValue, getElementByIdFlexible } = window.RCSync;
+
+ // ═══════════════════════════════════════════════════════════════════════
+ // MAPPING DES CHAMPS TARIF ↔ PROJET
+ // ═══════════════════════════════════════════════════════════════════════
+
+ /**
+ * Mapping complet des champs entre Tarif et Projet.
+ * Permet la synchronisation bidirectionnelle.
+ *
+ * Structure: { tarifFieldId: projetFieldId }
+ */
+ const FIELD_MAPPING = {
+ // Informations générales
+ 'CA': 'CA',
+ 'chiffreAffaire': 'CA',
+ 'nbVehicules': 'nombreVehicules',
+ 'nbrVehicule': 'nombreVehicules',
+
+ // Type de cotisation
+ 'cotisation': 'typeCot',
+
+ // Activités RCC - Voiturier
+ 'checkVoiturier': 'actVoiturier',
+ 'capitalVoiturier': 'valueActVoiturier',
+
+ // Activités RCC - Commissionnaire (Multimodal)
+ 'checkCommissionnaire': 'actMultimodal',
+ 'capitalCommissionnaire': 'valueActMultimodal',
+
+ // Activités RCC - Déménageur
+ 'checkDemenageur': 'actDemEntr',
+ 'capitalDemenageur': 'valueActDemEntr',
+
+ // Activités RCC - Logistique
+ 'checkLogistique': 'actPrestaLog',
+ 'capitalLogistique': 'valueActPrestaLog',
+
+ // RCE
+ 'checkRCE': 'autresRC',
+
+ // Zones géographiques
+ 'zone1': 'zone1',
+ 'zone2': 'zone2',
+ 'zone3': 'zone3',
+ 'zone4': 'zone4',
+ 'zone5': 'zone5',
+ 'zone6': 'zone6',
+
+ // Protection Juridique
+ 'checkPJ': 'pj',
+
+ // Garanties additionnelles - Engagements complémentaires
+ 'checkDomImmat': 'extRCCConfie', // Simplifié
+ 'checkContConf': 'extRCCConfie',
+ 'checkTPPC': 'extRCCTPPC',
+
+ // Extensions RCC
+ 'checkStationLavage': 'extRCCModifCalArrim',
+
+ // Extensions RCE
+ // (géré séparément car structure différente)
+
+ // Sinistralité
+ 'sinistre': 'nbSinistres3ans'
+ };
+
+ // ═══════════════════════════════════════════════════════════════════════
+ // COLLECTE DES DONNÉES COMPLÈTES
+ // ═══════════════════════════════════════════════════════════════════════
+
+ /**
+ * Collecte toutes les données du formulaire Tarif RC.
+ * Cette fonction est exhaustive et capture TOUS les champs nécessaires.
+ *
+ * @returns {Object} Objet contenant toutes les données du tarif
+ *
+ * @example
+ * const tarifData = collectAllTarifData();
+ * console.log(tarifData.ca, tarifData.zones, tarifData.marchandises);
+ */
+ function collectAllTarifData() {
+ // Références flexibles aux éléments
+ const getEl = getElementByIdFlexible;
+
+ const data = {
+ // ═══ INFORMATIONS GÉNÉRALES ═══
+ typeCotisation: document.querySelector('input[name="cotisation"]:checked')?.value || null,
+ ca: toNumber(getValue('CA') || getValue('chiffreAffaire')),
+ nombreVehicules: Math.max(0, Math.round(toNumber(getValue('nbVehicules') || getValue('nbrVehicule')))),
+
+ // ═══ ACTIVITÉS RCC ═══
+ activites: {
+ voiturier: {
+ checked: getValue('checkVoiturier') || false,
+ capital: toNumber(getValue('capitalVoiturier')),
+ pourcentage: toNumber(getValue('pourcent_voiturier') || getValue('pourcentVoiturier/Loueur')),
+ isSet: Boolean(getValue('pourcent_voiturier')?.trim())
+ },
+ commissionnaire: {
+ checked: getValue('checkCommissionnaire') || false,
+ capital: toNumber(getValue('capitalCommissionnaire')),
+ pourcentage: toNumber(getValue('pourcent_commissionnaire')),
+ isSet: Boolean(getValue('pourcent_commissionnaire')?.trim())
+ },
+ demenageur: {
+ checked: getValue('checkDemenageur') || false,
+ capital: toNumber(getValue('capitalDemenageur')),
+ pourcentage: toNumber(getValue('pourcent_demenageur')),
+ isSet: Boolean(getValue('pourcent_demenageur')?.trim())
+ },
+ logistique: {
+ checked: getValue('checkLogistique') || false,
+ capital: toNumber(getValue('capitalLogistique')),
+ pourcentage: toNumber(getValue('pourcent_logistique')),
+ isSet: Boolean(getValue('pourcent_logistique')?.trim())
+ },
+ autocariste: {
+ checked: getValue('checkAutocariste') || false,
+ capital: toNumber(getValue('capitalAutocariste')),
+ pourcentage: toNumber(getValue('pourcent_autocariste')),
+ isSet: Boolean(getValue('pourcent_autocariste')?.trim())
+ },
+ autres: {
+ checked: getValue('checkAutres') || false,
+ capital: toNumber(getValue('capitalAutres')),
+ pourcentage: toNumber(getValue('pourcent_autres')),
+ isSet: Boolean(getValue('pourcent_autres')?.trim())
+ }
+ },
+
+ // ═══ RCE ═══
+ rce: {
+ checked: getValue('checkRCE') || false
+ },
+
+ // ═══ ACTIVITÉS COMPLÉMENTAIRES (JSON) ═══
+ activitesComplementaires: {
+ voiturier: collectActivitesComplJSON('voiturier'),
+ commissionnaire: collectActivitesComplJSON('commissionnaire'),
+ demenageur: collectActivitesComplJSON('demenageur'),
+ logistique: collectActivitesComplJSON('logistique')
+ },
+
+ // ═══ MARCHANDISES (JSON) ═══
+ marchandises: {
+ voiturier: collectMarchandisesJSON('voiturier'),
+ commissionnaire: collectMarchandisesJSON('commissionnaire'),
+ demenageur: collectMarchandisesJSON('demenageur'),
+ logistique: collectMarchandisesJSON('logistique'),
+ autocariste: collectMarchandisesJSON('autocariste'),
+ autres: collectMarchandisesJSON('autres')
+ },
+
+ // ═══ ZONES GÉOGRAPHIQUES ═══
+ zones: {
+ zone1: getValue('zone1') || false,
+ zone2: getValue('zone2') || false,
+ zone3: getValue('zone3') || false,
+ zone4: getValue('zone4') || false,
+ zone5: getValue('zone5') || false,
+ zone6: getValue('zone6') || false
+ },
+
+ // ═══ ENGAGEMENTS COMPLÉMENTAIRES ═══
+ engagementsComplementaires: {
+ domicileImmatriculation: {
+ checked: getValue('checkDomImmat') || false,
+ capital: toNumber(getValue('inputDomImmat'))
+ },
+ contenantConfie: {
+ checked: getValue('checkContConf') || false,
+ capital: toNumber(getValue('inputContConf'))
+ },
+ differenceInventaire: {
+ checked: getValue('checkDiffInv') || false,
+ capital: toNumber(getValue('inputDiffInv'))
+ }
+ },
+
+ // ═══ GARANTIES ADDITIONNELLES ═══
+ garantiesAdditionnelles: {
+ stationLavage: getValue('checkStationLavage') || false,
+ garageInterne: getValue('checkGarageInterne') || false,
+ cse: getValue('checkCSE') || false,
+ tppc: {
+ checked: getValue('checkTPPC') || false,
+ capital: toNumber(getValue('selTPPCcapital')),
+ vehicules: Math.max(0, Math.round(toNumber(getValue('selTPPCveh'))))
+ },
+ pj: getValue('checkPJ') || false
+ },
+
+ // ═══ SINISTRALITÉ ═══
+ sinistralite: {
+ nombre3ans: toNumber(getValue('sinistre')),
+ montant3ans: 0 // TODO: ajouter si champ existe
+ },
+
+ // ═══ RÉSULTATS DE CALCUL ═══
+ resultats: {
+ // Franchise 250
+ fr250: {
+ primeRCC: toNumber(getEl('rccFr250')?.textContent),
+ primeRCE: toNumber(getEl('rceFr250')?.textContent),
+ primePJ: toNumber(getEl('pjFr250')?.textContent),
+ primeTotal: toNumber(getEl('priceFr250')?.textContent),
+ tauxRCC: toNumber(getEl('tauxRccFr250')?.textContent),
+ tauxRCE: toNumber(getEl('tauxRceFr250')?.textContent),
+ tauxGlobal: toNumber(getEl('tauxGlobalFr250')?.textContent)
+ },
+ // Franchise 400
+ fr400: {
+ primeRCC: toNumber(getEl('rccFr400')?.textContent),
+ primeRCE: toNumber(getEl('rceFr400')?.textContent),
+ primePJ: toNumber(getEl('pjFr400')?.textContent),
+ primeTotal: toNumber(getEl('priceFr400')?.textContent),
+ tauxRCC: toNumber(getEl('tauxRccFr400')?.textContent),
+ tauxRCE: toNumber(getEl('tauxRceFr400')?.textContent),
+ tauxGlobal: toNumber(getEl('tauxGlobalFr400')?.textContent)
+ },
+ // Franchise 2000
+ fr2000: {
+ primeRCC: toNumber(getEl('rccFr2000')?.textContent),
+ primeRCE: toNumber(getEl('rceFr2000')?.textContent),
+ primePJ: toNumber(getEl('pjFr2000')?.textContent),
+ primeTotal: toNumber(getEl('priceFr2000')?.textContent),
+ tauxRCC: toNumber(getEl('tauxRccFr2000')?.textContent),
+ tauxRCE: toNumber(getEl('tauxRceFr2000')?.textContent),
+ tauxGlobal: toNumber(getEl('tauxGlobalFr2000')?.textContent)
+ },
+ franchiseChoisie: window.franchiseChoisie || null,
+ tarifCommercial: toNumber(getValue('tarifCom'))
+ },
+
+ // ═══ COMMENTAIRE ═══
+ commentaire: getValue('commentaire') || ''
+ };
+
+ console.log('📊 Données Tarif collectées:', data);
+ return data;
+ }
+
+ /**
+ * Fonction helper pour collecter les activités complémentaires depuis le formulaire.
+ *
+ * @param {string} typeActivite - Type d'activité ('voiturier', 'commissionnaire', etc.)
+ * @returns {string} JSON array des activités cochées
+ * @private
+ */
+ function collectActivitesComplJSON(typeActivite) {
+ let name;
+ switch(typeActivite.toLowerCase()) {
+ case 'voiturier':
+ name = 'actComplVoiturier/Loueur';
+ break;
+ case 'commissionnaire':
+ name = 'actComplCommissionnaire de Transport';
+ break;
+ case 'demenageur':
+ name = 'actComplDéménageur';
+ break;
+ case 'logistique':
+ name = 'actComplLogistique';
+ break;
+ default:
+ return JSON.stringify([]);
+ }
+
+ const checkboxes = document.querySelectorAll(`[name="${name}"] input[type="checkbox"]:checked`);
+ const activites = [];
+ checkboxes.forEach(cb => {
+ const text = cb.nextElementSibling ? cb.nextElementSibling.textContent.trim() : cb.value;
+ activites.push(text);
+ });
+ return JSON.stringify(activites);
+ }
+
+ /**
+ * Fonction helper pour collecter les marchandises depuis le formulaire.
+ *
+ * @param {string} typeActivite - Type d'activité
+ * @returns {string} JSON array des marchandises cochées
+ * @private
+ */
+ function collectMarchandisesJSON(typeActivite) {
+ let name;
+ switch(typeActivite.toLowerCase()) {
+ case 'voiturier':
+ name = 'marVoiturier/Loueur';
+ break;
+ case 'commissionnaire':
+ name = 'marCommissionnaire de Transport';
+ break;
+ case 'demenageur':
+ name = 'marDéménageur';
+ break;
+ case 'logistique':
+ name = 'marLogistique';
+ break;
+ case 'autocariste':
+ name = 'marAutocariste';
+ break;
+ case 'autres':
+ name = 'marAutres activites';
+ break;
+ default:
+ return JSON.stringify([]);
+ }
+
+ const checkboxes = document.querySelectorAll(`[name="${name}"] input[type="checkbox"]:checked`);
+ const marchandises = [];
+ checkboxes.forEach(cb => {
+ const text = cb.nextElementSibling ? cb.nextElementSibling.textContent.trim() : cb.value;
+ marchandises.push(text);
+ });
+ return JSON.stringify(marchandises);
+ }
+
+ // ═══════════════════════════════════════════════════════════════════════
+ // PRÉ-REMPLISSAGE TARIF → PROJET
+ // ═══════════════════════════════════════════════════════════════════════
+
+ /**
+ * Pré-remplit le formulaire Projet avec les données du Tarif.
+ * Cette fonction est appelée quand l'utilisateur passe du Tarif au Projet.
+ *
+ * @param {Object} tarifData - Données complètes du tarif (de collectAllTarifData)
+ *
+ * @example
+ * const tarifData = collectAllTarifData();
+ * prefillProjetFromTarif(tarifData);
+ */
+ function prefillProjetFromTarif(tarifData) {
+ if (!tarifData) {
+ console.warn('Pas de données tarif à pré-remplir');
+ return;
+ }
+
+ console.log('📝 Pré-remplissage Projet depuis Tarif...');
+
+ try {
+ // ═══ INFORMATIONS GÉNÉRALES ═══
+
+ // CA
+ if (tarifData.ca) {
+ setValue('CA', tarifData.ca);
+ console.log(' ✓ CA:', tarifData.ca);
+ }
+
+ // Type de cotisation
+ if (tarifData.typeCotisation) {
+ const radio = document.querySelector(`input[name="typeCot"][value="${tarifData.typeCotisation}"]`);
+ if (radio) {
+ radio.checked = true;
+ console.log(' ✓ Type cotisation:', tarifData.typeCotisation);
+ }
+ }
+
+ // Nombre de véhicules
+ if (tarifData.nombreVehicules) {
+ setValue('nombreVehicules', tarifData.nombreVehicules);
+ console.log(' ✓ Véhicules:', tarifData.nombreVehicules);
+ }
+
+ // ═══ ACTIVITÉS ═══
+
+ const activitySelector = document.getElementById('activity-selector');
+ if (activitySelector && tarifData.activites) {
+ const activitesToAdd = [];
+
+ if (tarifData.activites.voiturier?.checked) {
+ activitesToAdd.push('Voiturier/Loueur');
+ }
+ if (tarifData.activites.commissionnaire?.checked) {
+ activitesToAdd.push('Commissionnaire de Transport');
+ }
+ if (tarifData.activites.demenageur?.checked) {
+ activitesToAdd.push('Déménageur d\'entreprises');
+ }
+ if (tarifData.activites.logistique?.checked) {
+ activitesToAdd.push('Prestataire logistique');
+ }
+ if (tarifData.activites.autocariste?.checked) {
+ activitesToAdd.push('Autocariste');
+ }
+ if (tarifData.activites.autres?.checked) {
+ activitesToAdd.push('Autres activités');
+ }
+
+ // Sélectionner les options dans le select
+ Array.from(activitySelector.options).forEach(option => {
+ if (activitesToAdd.includes(option.value)) {
+ option.selected = true;
+ }
+ });
+
+ // Trigger change pour créer les chips Materialize
+ const event = new Event('change', { bubbles: true });
+ activitySelector.dispatchEvent(event);
+
+ console.log(' ✓ Activités:', activitesToAdd.length);
+ }
+
+ // ═══ MARCHANDISES ═══
+
+ const marchandiseSelector = document.getElementById('marchandise-selector');
+ if (marchandiseSelector && tarifData.marchandises) {
+ const marchandisesToSelect = [];
+
+ // Parser les marchandises de chaque type
+ ['voiturier', 'commissionnaire', 'demenageur', 'logistique', 'autocariste', 'autres'].forEach(type => {
+ const marchArray = tarifData.marchandises[type];
+ if (Array.isArray(marchArray)) {
+ marchArray.forEach(m => marchandisesToSelect.push(m));
+ }
+ });
+
+ // Sélectionner dans le select
+ Array.from(marchandiseSelector.options).forEach(option => {
+ if (marchandisesToSelect.includes(option.text) || marchandisesToSelect.includes(option.value)) {
+ option.selected = true;
+ }
+ });
+
+ const event = new Event('change', { bubbles: true });
+ marchandiseSelector.dispatchEvent(event);
+
+ console.log(' ✓ Marchandises:', marchandisesToSelect.length);
+ }
+
+ // ═══ ZONES GÉOGRAPHIQUES ═══
+
+ if (tarifData.zones) {
+ let zonesCount = 0;
+ Object.keys(tarifData.zones).forEach(zoneKey => {
+ const checkbox = document.getElementById(zoneKey);
+ if (checkbox && tarifData.zones[zoneKey]) {
+ checkbox.checked = true;
+ zonesCount++;
+ }
+ });
+ console.log(' ✓ Zones:', zonesCount);
+ }
+
+ // ═══ PROTECTION JURIDIQUE ═══
+
+ if (tarifData.garantiesAdditionnelles?.pj) {
+ const switchPJ = document.getElementById('switchPJ');
+ if (switchPJ) {
+ switchPJ.checked = true;
+ console.log(' ✓ PJ activée');
+
+ // Afficher la section PJ
+ const pjSection = document.getElementById('pj-section');
+ if (pjSection) pjSection.style.display = 'block';
+ }
+ }
+
+ // ═══ RCE ═══
+
+ if (tarifData.rce?.checked) {
+ const choixRCE = document.getElementById('choixRCE');
+ if (choixRCE) {
+ choixRCE.checked = true;
+ console.log(' ✓ RCE activée');
+
+ // Afficher la section RCE
+ const rceSection = document.getElementById('section-rce');
+ if (rceSection) rceSection.style.display = 'block';
+ }
+ }
+
+ // ═══ TPPC ═══
+
+ if (tarifData.garantiesAdditionnelles?.tppc?.checked) {
+ const checkTPPC = document.getElementById('checkTPPC');
+ if (checkTPPC) {
+ checkTPPC.checked = true;
+
+ if (tarifData.garantiesAdditionnelles.tppc.capital) {
+ setValue('capitalTPPC', tarifData.garantiesAdditionnelles.tppc.capital);
+ }
+ if (tarifData.garantiesAdditionnelles.tppc.vehicules) {
+ setValue('vehiculesTPPC', tarifData.garantiesAdditionnelles.tppc.vehicules);
+ }
+
+ console.log(' ✓ TPPC');
+ }
+ }
+
+ // ═══ ENGAGEMENTS COMPLÉMENTAIRES ═══
+
+ const engagements = tarifData.engagementsComplementaires;
+ if (engagements) {
+ if (engagements.domicileImmatriculation?.checked) {
+ setValue('checkDomImmat', true);
+ console.log(' ✓ Domicile immatriculation');
+ }
+ if (engagements.contenantConfie?.checked) {
+ setValue('checkContConf', true);
+ console.log(' ✓ Contenant confié');
+ }
+ }
+
+ // ═══ SINISTRALITÉ ═══
+
+ if (tarifData.sinistralite) {
+ if (tarifData.sinistralite.nombre3ans) {
+ setValue('nbSinistres3ans', tarifData.sinistralite.nombre3ans);
+ }
+ if (tarifData.sinistralite.montant3ans) {
+ setValue('montantSinistres3ans', tarifData.sinistralite.montant3ans);
+ }
+ console.log(' ✓ Sinistralité');
+ }
+
+ // ═══ RÉSULTATS TARIFAIRES ═══
+
+ if (tarifData.resultats) {
+ const res = tarifData.resultats;
+
+ // Taux
+ if (res.tauxRCCHT) setValue('tauxRCCHT', res.tauxRCCHT);
+ if (res.tauxRCCTTC) setValue('tauxRCCTTC', res.tauxRCCTTC);
+ if (res.tauxRCEHT) setValue('tauxRCEHT', res.tauxRCEHT);
+ if (res.tauxRCETTC) setValue('tauxRCETTC', res.tauxRCETTC);
+ if (res.tauxTotalHT) setValue('tauxTotalHT', res.tauxTotalHT);
+ if (res.tauxTotalTTC) setValue('tauxTotalTTC', res.tauxTotalTTC);
+
+ // Cotisations
+ if (res.cotRCCHT) setValue('cotRCCHT', res.cotRCCHT);
+ if (res.cotRCCTTC) setValue('cotRCCTTC', res.cotRCCTTC);
+ if (res.cotRCEHT) setValue('cotRCEHT', res.cotRCEHT);
+ if (res.cotRCETTC) setValue('cotRCETTC', res.cotRCETTC);
+ if (res.cotPJHT) setValue('cotPJHT', res.cotPJHT);
+ if (res.cotPJTTC) setValue('cotPJTTC', res.cotPJTTC);
+ if (res.cotTotalHT) setValue('cotTotalHT', res.cotTotalHT);
+ if (res.cotTotalTTC) setValue('cotTotalTTC', res.cotTotalTTC);
+
+ console.log(' ✓ Résultats tarifaires');
+ }
+
+ // Forcer la mise à jour des éléments Materialize
+ if (window.M && window.M.FormSelect) {
+ const selects = document.querySelectorAll('select');
+ window.M.FormSelect.init(selects);
+ }
+ if (window.M && window.M.updateTextFields) {
+ window.M.updateTextFields();
+ }
+
+ console.log('✅ Pré-remplissage Projet terminé');
+
+ } catch (error) {
+ console.error('❌ Erreur lors du pré-remplissage Projet:', error);
+ }
+ }
+
+ // ═══════════════════════════════════════════════════════════════════════
+ // PRÉ-REMPLISSAGE PROJET → TARIF
+ // ═══════════════════════════════════════════════════════════════════════
+
+ /**
+ * Pré-remplit le formulaire Tarif avec les données du Projet.
+ * Cette fonction est appelée quand l'utilisateur passe du Projet au Tarif.
+ *
+ * @param {Object} projetData - Données complètes du projet
+ *
+ * @example
+ * prefillTarifFromProjet(projetData);
+ */
+ function prefillTarifFromProjet(projetData) {
+ if (!projetData) {
+ console.warn('Pas de données projet à pré-remplir');
+ return;
+ }
+
+ console.log('📝 Pré-remplissage Tarif depuis Projet...');
+
+ try {
+ // CA
+ if (projetData.ca) {
+ setValue('CA', projetData.ca);
+ }
+
+ // Type de cotisation
+ if (projetData.typeCot) {
+ const radio = document.querySelector(`input[name="cotisation"][value="${projetData.typeCot}"]`);
+ if (radio) radio.checked = true;
+ }
+
+ // Zones géographiques
+ ['zone1', 'zone2', 'zone3', 'zone4', 'zone5', 'zone6'].forEach(zone => {
+ if (projetData[zone]) {
+ setValue(zone, true);
+ }
+ });
+
+ // PJ
+ if (projetData.pj) {
+ setValue('checkPJ', true);
+ }
+
+ // RCE
+ if (projetData.autresRC) {
+ setValue('checkRCE', true);
+ }
+
+ console.log('✅ Pré-remplissage Tarif terminé');
+
+ } catch (error) {
+ console.error('❌ Erreur lors du pré-remplissage Tarif:', error);
+ }
+ }
+
+ // ═══════════════════════════════════════════════════════════════════════
+ // EXPORT PUBLIC
+ // ═══════════════════════════════════════════════════════════════════════
+
+ window.RCDataManager = {
+ collectAllTarifData,
+ prefillProjetFromTarif,
+ prefillTarifFromProjet,
+ FIELD_MAPPING
+ };
+
+ console.log('✅ RC Data Manager loaded');
+
+})(window);
\ No newline at end of file
diff --git a/ecole/public/js/rc-orchestrator.js b/ecole/public/js/rc-orchestrator.js
new file mode 100644
index 00000000..da1b05b4
--- /dev/null
+++ b/ecole/public/js/rc-orchestrator.js
@@ -0,0 +1,388 @@
+/**
+ * ═══════════════════════════════════════════════════════════════════════════
+ * RC SYNC ORCHESTRATOR
+ * ═══════════════════════════════════════════════════════════════════════════
+ *
+ * Ce module orchestre la synchronisation entre Tarif RC et Projet RC.
+ * Il s'intègre avec les formulaires existants sans les modifier.
+ *
+ * @requires rc-sync-utils.js
+ * @requires rc-data-manager.js
+ * @author AXA Transport Team
+ * @version 2.0.0
+ * @since 2026-02-17
+ */
+
+(function(window) {
+ 'use strict';
+
+ // Attendre que les dépendances soient chargées
+ if (!window.RCSync || !window.RCDataManager) {
+ console.error('❌ Dépendances RC Sync manquantes');
+ return;
+ }
+
+ const { isChangeImpactingTarif, showReturnToTarifModal } = window.RCSync;
+ const { collectAllTarifData, prefillProjetFromTarif, prefillTarifFromProjet } = window.RCDataManager;
+
+ // ═══════════════════════════════════════════════════════════════════════
+ // CONFIGURATION
+ // ═══════════════════════════════════════════════════════════════════════
+
+ const SESSION_STORAGE_KEYS = {
+ TARIF_DATA: 'rc_tarif_validated_data',
+ PROJET_DATA: 'rc_projet_data',
+ TARIF_ORIGINAL: 'rc_tarif_original_for_comparison'
+ };
+
+ // ═══════════════════════════════════════════════════════════════════════
+ // DÉTECTION DE LA PAGE ACTIVE
+ // ═══════════════════════════════════════════════════════════════════════
+
+ /**
+ * Détecte la page active (tarif ou projet) depuis l'URL.
+ *
+ * @returns {'tarif'|'projet'|null} Page active ou null
+ */
+ function detectActivePage() {
+ const params = new URLSearchParams(window.location.search);
+ const submenu = params.get('submenu');
+
+ if (submenu === 'tarif' || submenu === 'tarifrc') {
+ return 'tarif';
+ } else if (submenu === 'projet' || submenu === 'projetrc') {
+ return 'projet';
+ }
+
+ return null;
+ }
+
+ // ═══════════════════════════════════════════════════════════════════════
+ // GESTION SESSIONSTORAGE
+ // ═══════════════════════════════════════════════════════════════════════
+
+ /**
+ * Sauvegarde les données du tarif validé dans sessionStorage.
+ *
+ * @param {Object} tarifData - Données complètes du tarif
+ */
+ function saveTarifDataToSession(tarifData) {
+ try {
+ sessionStorage.setItem(SESSION_STORAGE_KEYS.TARIF_DATA, JSON.stringify(tarifData));
+ sessionStorage.setItem(SESSION_STORAGE_KEYS.TARIF_ORIGINAL, JSON.stringify(tarifData));
+ console.log('✅ Données tarif sauvegardées en session');
+ } catch (error) {
+ console.error('❌ Erreur sauvegarde session:', error);
+ }
+ }
+
+ /**
+ * Récupère les données du tarif depuis sessionStorage.
+ *
+ * @returns {Object|null} Données du tarif ou null
+ */
+ function getTarifDataFromSession() {
+ try {
+ const data = sessionStorage.getItem(SESSION_STORAGE_KEYS.TARIF_DATA);
+ return data ? JSON.parse(data) : null;
+ } catch (error) {
+ console.error('❌ Erreur lecture session:', error);
+ return null;
+ }
+ }
+
+ /**
+ * Récupère les données originales du tarif pour comparaison.
+ *
+ * @returns {Object|null} Données originales du tarif
+ */
+ function getTarifOriginalDataFromSession() {
+ try {
+ const data = sessionStorage.getItem(SESSION_STORAGE_KEYS.TARIF_ORIGINAL);
+ return data ? JSON.parse(data) : null;
+ } catch (error) {
+ return null;
+ }
+ }
+
+ // ═══════════════════════════════════════════════════════════════════════
+ // HOOK: APRÈS VALIDATION TARIF
+ // ═══════════════════════════════════════════════════════════════════════
+
+ /**
+ * Hook appelé après la validation du tarif commercial.
+ * Collecte toutes les données et les sauvegarde en session.
+ *
+ * Cette fonction doit être appelée juste avant la redirection vers le projet.
+ */
+ function onTarifValidated() {
+ console.log('🎯 Hook: Tarif validé, collecte des données...');
+
+ try {
+ // Collecter toutes les données du tarif
+ const tarifData = collectAllTarifData();
+
+ // Sauvegarder en session pour le pré-remplissage projet
+ saveTarifDataToSession(tarifData);
+
+ console.log('✅ Données tarif prêtes pour le projet');
+ } catch (error) {
+ console.error('❌ Erreur hook tarif validé:', error);
+ }
+ }
+
+ // ═══════════════════════════════════════════════════════════════════════
+ // INITIALISATION PAGE PROJET
+ // ═══════════════════════════════════════════════════════════════════════
+
+ /**
+ * Initialise le formulaire projet au chargement.
+ * Configure UNIQUEMENT la détection des changements impactants.
+ * Le pré-remplissage est géré par prefillFromTarif() existant dans projet-form-RC.js
+ */
+ function initProjetPage() {
+ console.log('🚀 Initialisation RC Orchestrator pour page Projet...');
+
+ // Les données rc/tarif/projet sont DÉJÀ chargées depuis la base
+ // par le code existant dans projet-form-RC.js
+ // On configure juste la détection des changements
+
+ setTimeout(() => {
+ setupProjetChangeDetection();
+ }, 1000); // Attendre que prefillFromTarif() ait fini
+ }
+
+ /**
+ * Configure la détection des changements impactants dans le projet.
+ * Affiche un modal si l'utilisateur modifie un champ qui impacte le tarif.
+ * Utilise les variables globales rc/tarif depuis projet-form-RC.js
+ */
+ function setupProjetChangeDetection() {
+ // Les données originales sont dans les variables globales window.tarif et window.rc
+ // définies par projet-form-RC.js
+ const tarifOriginal = window.tarif;
+ const rcOriginal = window.rc;
+
+ if (!tarifOriginal && !rcOriginal) {
+ console.log('ℹ️ Pas de tarif/rc, pas de détection');
+ return;
+ }
+
+ console.log('👁️ Configuration détection changements...');
+ console.log('📋 Données originales:', { tarif: tarifOriginal, rc: rcOriginal });
+
+ // Liste COMPLÈTE des éléments à surveiller (tous les champs impactants)
+ const elementsToWatch = [
+ // CA et infos générales
+ 'CA', 'chiffreAffaire', 'nombreVehicules', 'nbrVehicule',
+
+ // Zones géographiques
+ 'zone1', 'zone2', 'zone3', 'zone4', 'zone5', 'zone6',
+
+ // Protection Juridique
+ 'switchPJ', 'checkPJ',
+
+ // RCE
+ 'choixRCE', 'checkRCE',
+
+ // TPPC
+ 'checkTPPC', 'capitalTPPC', 'vehiculesTPPC',
+
+ // Engagements complémentaires
+ 'checkDomImmat', 'checkContConf', 'checkDiffInv',
+
+ // Garanties additionnelles
+ 'checkStationLavage', 'checkGarageInterne', 'checkCSE',
+
+ // Sinistralité
+ 'nbSinistres3ans', 'montantSinistres3ans',
+
+ // Autres
+ 'programmeInternationale', 'participationResultat'
+ ];
+
+ // Ajouter des listeners sur tous les éléments surveillés
+ elementsToWatch.forEach(elementId => {
+ const element = document.getElementById(elementId);
+ if (!element) return;
+
+ const eventType = element.type === 'checkbox' ? 'change' : 'blur';
+
+ element.addEventListener(eventType, function(e) {
+ const fieldName = this.id;
+ const newValue = this.type === 'checkbox' ? this.checked : this.value;
+
+ console.log(`🔍 Changement détecté: ${fieldName} = ${newValue}`);
+
+ // Vérifier si c'est un champ impactant
+ if (isFieldImpactingTarif(fieldName)) {
+ console.warn(`⚠️ "${fieldName}" impacte le tarif !`);
+ showReturnToTarifModal(fieldName);
+ } else {
+ console.log(`ℹ️ "${fieldName}" n'impacte pas le tarif`);
+ }
+ });
+ });
+
+ // Surveiller les radio buttons (type de cotisation)
+ const radioTypeCot = document.querySelectorAll('input[name="typeCot"]');
+ radioTypeCot.forEach(radio => {
+ radio.addEventListener('change', function() {
+ console.log(`🔍 Changement type cotisation: ${this.value}`);
+ console.warn(`⚠️ Type de cotisation impacte le tarif !`);
+ showReturnToTarifModal('Type de cotisation');
+ });
+ });
+
+ // Surveiller le select activités
+ const activitySelector = document.getElementById('activity-selector');
+ if (activitySelector) {
+ activitySelector.addEventListener('change', function() {
+ const selectedValues = Array.from(this.selectedOptions).map(opt => opt.value);
+ console.log(`🔍 Changement activités:`, selectedValues);
+ console.warn(`⚠️ Activités impactent le tarif !`);
+ showReturnToTarifModal('Activités');
+ });
+ }
+
+ // Surveiller le select marchandises
+ const marchandiseSelector = document.getElementById('marchandise-selector');
+ if (marchandiseSelector) {
+ marchandiseSelector.addEventListener('change', function() {
+ const selectedValues = Array.from(this.selectedOptions).map(opt => opt.value);
+ console.log(`🔍 Changement marchandises:`, selectedValues);
+ console.warn(`⚠️ Marchandises impactent le tarif !`);
+ showReturnToTarifModal('Marchandises');
+ });
+ }
+
+ // Surveiller les boutons d'action sur les zones (Monde entier / Reset)
+ ['btnMondeEntier', 'btnReset'].forEach(btnId => {
+ const btn = document.getElementById(btnId);
+ if (!btn) return;
+ btn.addEventListener('click', () => {
+ console.log(`🔍 Changement zones via ${btnId}`);
+ console.warn('⚠️ Zones géographiques impactent le tarif !');
+ showReturnToTarifModal('Zones géographiques');
+ });
+ });
+
+ console.log('✅ Détection changements configurée sur tous les champs impactants');
+ }
+
+ // ═══════════════════════════════════════════════════════════════════════
+ // INITIALISATION PAGE TARIF
+ // ═══════════════════════════════════════════════════════════════════════
+
+ /**
+ * Initialise le formulaire tarif au chargement.
+ * Pré-remplit depuis le projet si l'utilisateur vient du projet.
+ */
+ function initTarifPage() {
+ console.log('🚀 Initialisation page Tarif...');
+
+ // Vérifier si on vient du projet
+ const projetData = JSON.parse(sessionStorage.getItem(SESSION_STORAGE_KEYS.PROJET_DATA) || 'null');
+
+ if (projetData && !getTarifDataFromSession()) {
+ // On a des données projet mais pas de tarif validé
+ // = L'utilisateur a commencé par le projet
+ console.log('📥 Pré-remplissage depuis projet...');
+
+ setTimeout(() => {
+ prefillTarifFromProjet(projetData);
+ }, 500);
+ }
+ }
+
+ // ═══════════════════════════════════════════════════════════════════════
+ // INTERCEPTION DES FONCTIONS EXISTANTES
+ // ═══════════════════════════════════════════════════════════════════════
+
+ /**
+ * Intercepte la fonction de validation du tarif commercial existante.
+ * Ajoute notre hook avant la redirection.
+ */
+ function interceptTarifValidation() {
+ // Attendre que la fonction window.saveTarifRC soit disponible
+ const checkInterval = setInterval(() => {
+ if (window.saveTarifRC) {
+ clearInterval(checkInterval);
+
+ // Sauvegarder la fonction originale
+ const originalSaveTarifRC = window.saveTarifRC;
+
+ // Remplacer par notre version wrappée
+ window.saveTarifRC = async function(...args) {
+ console.log('🎯 Interception saveTarifRC...');
+
+ // Appeler la fonction originale
+ const result = await originalSaveTarifRC.apply(this, args);
+
+ // Si succès, appeler notre hook
+ if (result && result.valid) {
+ onTarifValidated();
+ }
+
+ return result;
+ };
+
+ console.log('✅ saveTarifRC intercepté');
+ }
+ }, 100);
+
+ // Timeout après 5 secondes
+ setTimeout(() => clearInterval(checkInterval), 5000);
+ }
+
+ // ═══════════════════════════════════════════════════════════════════════
+ // DÉMARRAGE AUTOMATIQUE
+ // ═══════════════════════════════════════════════════════════════════════
+
+ /**
+ * Initialise l'orchestrateur au chargement de la page.
+ */
+ function init() {
+ console.log('🎼 RC Sync Orchestrator: Démarrage...');
+
+ const activePage = detectActivePage();
+ console.log(`📄 Page active détectée: ${activePage || 'aucune'}`);
+
+ if (activePage === 'tarif') {
+ interceptTarifValidation();
+
+ // Attendre que le formulaire soit initialisé
+ setTimeout(() => {
+ initTarifPage();
+ }, 1000);
+
+ } else if (activePage === 'projet') {
+ // Attendre que le formulaire soit initialisé
+ setTimeout(() => {
+ initProjetPage();
+ }, 1000);
+ }
+ }
+
+ // Démarrage au chargement du DOM
+ if (document.readyState === 'loading') {
+ document.addEventListener('DOMContentLoaded', init);
+ } else {
+ init();
+ }
+
+ // ═══════════════════════════════════════════════════════════════════════
+ // EXPORT PUBLIC
+ // ═══════════════════════════════════════════════════════════════════════
+
+ window.RCOrchestrator = {
+ onTarifValidated,
+ initProjetPage,
+ initTarifPage,
+ saveTarifDataToSession,
+ getTarifDataFromSession
+ };
+
+ console.log('✅ RC Sync Orchestrator loaded');
+
+})(window);
\ No newline at end of file
diff --git a/ecole/public/js/rc-sync-utils.js b/ecole/public/js/rc-sync-utils.js
new file mode 100644
index 00000000..7ffdfa03
--- /dev/null
+++ b/ecole/public/js/rc-sync-utils.js
@@ -0,0 +1,464 @@
+/**
+ * ═══════════════════════════════════════════════════════════════════════════
+ * RC SYNCHRONIZATION UTILITIES
+ * ═══════════════════════════════════════════════════════════════════════════
+ *
+ * Ce module contient toutes les fonctions utilitaires pour la synchronisation
+ * bidirectionnelle entre les formulaires Tarif RC et Projet RC.
+ *
+ * @author AXA Transport Team
+ * @version 2.0.0
+ * @since 2026-02-17
+ */
+
+(function(window) {
+ 'use strict';
+
+ // ═══════════════════════════════════════════════════════════════════════
+ // CONSTANTES
+ // ═══════════════════════════════════════════════════════════════════════
+
+ /**
+ * Liste exhaustive des champs qui impactent le calcul du tarif.
+ * Si l'un de ces champs est modifié dans le projet, un modal
+ * demandera à l'utilisateur de retourner au tarif.
+ *
+ * @constant {Array}
+ */
+ const TARIF_IMPACTING_FIELDS = [
+ // Chiffre d'affaires et type de contrat
+ 'ca', 'chiffreAffaires', 'CA',
+ 'typeCotisation', 'cotisation',
+ 'nombreVehicules', 'nbVehicules',
+
+ // Activités RCC
+ 'checkVoiturier', 'capitalVoiturier', 'actVoiturier',
+ 'checkCommissionnaire', 'capitalCommissionnaire', 'actMultimodal',
+ 'checkDemenageur', 'capitalDemenageur',
+ 'checkLogistique', 'capitalLogistique',
+ 'checkAutocariste', 'capitalAutocariste',
+ 'checkAutres', 'capitalAutres',
+
+ // RCE
+ 'checkRCE', 'autresRC',
+
+ // Activités complémentaires
+ 'actComplVoiturier', 'actComplCommissionnaire', 'actComplDemenageur', 'actComplLogistique',
+ 'activitesVoiturier', 'activitesCommissionnaire', 'activitesDemenageur', 'activitesLogistique',
+
+ // Marchandises
+ 'marchandisesVoiturier', 'marchandisesCommissionnaire', 'marchandisesDemenageur',
+ 'marchandisesLogistique', 'marchandisesAutocariste', 'marchandisesAutres',
+ 'marOrdinaire', 'marRoulant', 'marEngins', 'marRoulantDem', 'marMobilerUsag',
+ 'marPerissable', 'marAnimaux', 'marCiterne', 'marBeton', 'marExceptionnels', 'marVrac',
+
+ // Zones géographiques
+ 'zone1', 'zone2', 'zone3', 'zone4', 'zone5', 'zone6',
+
+ // Extensions de garantie RCC
+ 'extRCCModifCalArrim', 'extRCCFerroutage', 'extRCCFraisRecons',
+ 'extRCCConfie', 'typeExtConfies', 'extRCCTPPC', 'extRCCRegie', 'extRCCSansMontageDemontage',
+ 'checkDomImmat', 'capitalDomImmat', 'checkContConf', 'capitalContConf',
+ 'checkDiffInv', 'capitalDiffInv', 'checkTPPC', 'capitalTPPC', 'vehiculesTPPC',
+
+ // Extensions de garantie RCE
+ 'extRCEBraDebra', 'extRCEMontageDemontage',
+
+ // Garanties additionnelles
+ 'checkStationLavage', 'checkGarageInterne', 'checkCSE', 'checkPJ', 'pj',
+
+ // Sinistralité
+ 'sinistre', 'nbSinistres3ans', 'montantSinistres3ans'
+ ];
+
+ // ═══════════════════════════════════════════════════════════════════════
+ // HELPERS - MANIPULATION DE VALEURS
+ // ═══════════════════════════════════════════════════════════════════════
+
+ /**
+ * Convertit une valeur en nombre en gérant les formats français et internationaux.
+ * Gère les espaces, virgules, points, et valeurs nulles/undefined.
+ *
+ * @param {string|number|null|undefined} x - Valeur à convertir
+ * @returns {number} Nombre converti ou 0 si impossible
+ *
+ * @example
+ * toNumber("1 234,56") // 1234.56
+ * toNumber("1.234,56") // 1234.56
+ * toNumber("1,234.56") // 1234.56
+ * toNumber(null) // 0
+ */
+ function toNumber(x) {
+ if (x == null) return 0;
+
+ let value = String(x).trim();
+ if (!value) return 0;
+
+ value = value
+ .replace(/\s/g, '')
+ .replace(/[^\d.,-]/g, '');
+
+ if (!value) return 0;
+
+ const isNegative = value.startsWith('-');
+ value = value.replace(/-/g, '');
+ if (isNegative && value) {
+ value = '-' + value;
+ }
+
+ const hasComma = value.includes(',');
+ const hasDot = value.includes('.');
+
+ if (hasComma) {
+ value = value.replace(/\./g, '').replace(/,/g, '.');
+ } else if (hasDot) {
+ const dotMatches = value.match(/\./g);
+ const dotCount = dotMatches ? dotMatches.length : 0;
+ if (dotCount > 1) {
+ const parts = value.split('.');
+ const lastSegment = parts[parts.length - 1];
+ if (lastSegment.length === 3) {
+ value = parts.join('');
+ } else {
+ value = parts.slice(0, -1).join('') + '.' + lastSegment;
+ }
+ }
+ }
+
+ const parsed = Number(value);
+ return Number.isFinite(parsed) ? parsed : 0;
+ }
+
+ /**
+ * Récupère la valeur d'un élément par son ID de manière flexible.
+ * Gère les différents types d'éléments (input, select, textarea, etc.)
+ * et les cas où l'ID contient des caractères spéciaux.
+ *
+ * @param {string} id - ID de l'élément
+ * @returns {HTMLElement|null} Élément trouvé ou null
+ *
+ * @example
+ * const element = getElementByIdFlexible("my-element");
+ */
+ function getElementByIdFlexible(id) {
+ if (!id) return null;
+ const direct = document.getElementById(id);
+ if (direct) return direct;
+ try {
+ return document.querySelector(`[id="${id.replace(/"/g, '\\"')}"]`);
+ } catch (err) {
+ return null;
+ }
+ }
+
+ /**
+ * Récupère la valeur d'un champ de formulaire de manière sécurisée.
+ * Gère les inputs, selects, textareas, checkboxes, et contenus textuels.
+ *
+ * @param {string} elementId - ID de l'élément
+ * @returns {string|number|boolean|null} Valeur du champ
+ *
+ * @example
+ * getValue("ca") // "100000"
+ * getValue("checkPJ") // true
+ */
+ function getValue(elementId) {
+ const element = getElementByIdFlexible(elementId);
+ if (!element) return null;
+
+ if (element.type === 'checkbox') {
+ return element.checked;
+ } else if (element.type === 'radio') {
+ const checked = document.querySelector(`input[name="${element.name}"]:checked`);
+ return checked ? checked.value : null;
+ } else if (element.tagName === 'SELECT') {
+ return element.value;
+ } else if (element.value !== undefined) {
+ return element.value;
+ } else {
+ return element.textContent || element.innerText || null;
+ }
+ }
+
+ /**
+ * Définit la valeur d'un champ de formulaire.
+ * Gère automatiquement le type de champ et met à jour l'interface.
+ *
+ * @param {string} elementId - ID de l'élément
+ * @param {any} value - Valeur à définir
+ *
+ * @example
+ * setValue("ca", 100000);
+ * setValue("checkPJ", true);
+ */
+ function setValue(elementId, value) {
+ const element = getElementByIdFlexible(elementId);
+ if (!element) {
+ console.warn(`Élément non trouvé: ${elementId}`);
+ return;
+ }
+
+ if (element.type === 'checkbox') {
+ element.checked = Boolean(value);
+ } else if (element.type === 'radio') {
+ const radio = document.querySelector(`input[name="${element.name}"][value="${value}"]`);
+ if (radio) radio.checked = true;
+ } else if (element.tagName === 'SELECT') {
+ element.value = value;
+ // Réinitialiser Materialize select si présent
+ if (window.M && window.M.FormSelect) {
+ const instance = window.M.FormSelect.getInstance(element);
+ if (instance) instance.destroy();
+ window.M.FormSelect.init(element);
+ }
+ } else if (element.value !== undefined) {
+ element.value = value;
+ } else {
+ element.textContent = value;
+ }
+ }
+
+ // ═══════════════════════════════════════════════════════════════════════
+ // COMPARAISON DE DONNÉES
+ // ═══════════════════════════════════════════════════════════════════════
+
+ /**
+ * Compare deux tableaux pour vérifier leur égalité.
+ * Effectue une comparaison profonde élément par élément.
+ *
+ * @param {Array} arr1 - Premier tableau
+ * @param {Array} arr2 - Deuxième tableau
+ * @returns {boolean} true si les tableaux sont égaux
+ *
+ * @example
+ * arraysEqual([1,2,3], [1,2,3]) // true
+ * arraysEqual([1,2], [1,2,3]) // false
+ */
+ function arraysEqual(arr1, arr2) {
+ if (!Array.isArray(arr1) || !Array.isArray(arr2)) return false;
+ if (arr1.length !== arr2.length) return false;
+
+ const sorted1 = [...arr1].sort();
+ const sorted2 = [...arr2].sort();
+
+ return sorted1.every((val, idx) => val === sorted2[idx]);
+ }
+
+ /**
+ * Compare deux valeurs en tenant compte de leur type.
+ * Gère les tableaux, objets, null, undefined, et valeurs primitives.
+ *
+ * @param {any} value1 - Première valeur
+ * @param {any} value2 - Deuxième valeur
+ * @returns {boolean} true si les valeurs sont égales
+ *
+ * @example
+ * valuesEqual([1,2], [2,1]) // true (ordre indépendant)
+ * valuesEqual(null, undefined) // true
+ * valuesEqual(100, "100") // true (conversion automatique)
+ */
+ function valuesEqual(value1, value2) {
+ // Normaliser null et undefined
+ if (value1 == null && value2 == null) return true;
+ if (value1 == null || value2 == null) return false;
+
+ // Comparer les tableaux
+ if (Array.isArray(value1) && Array.isArray(value2)) {
+ return arraysEqual(value1, value2);
+ }
+
+ // Comparer les objets
+ if (typeof value1 === 'object' && typeof value2 === 'object') {
+ return JSON.stringify(value1) === JSON.stringify(value2);
+ }
+
+ // Comparer les nombres (avec conversion)
+ if (!isNaN(value1) && !isNaN(value2)) {
+ return toNumber(value1) === toNumber(value2);
+ }
+
+ // Comparaison standard
+ return value1 === value2;
+ }
+
+ // ═══════════════════════════════════════════════════════════════════════
+ // DÉTECTION DE CHANGEMENTS IMPACTANTS
+ // ═══════════════════════════════════════════════════════════════════════
+
+ /**
+ * Vérifie si un champ donné impacte le calcul du tarif.
+ * Se base sur la liste TARIF_IMPACTING_FIELDS.
+ *
+ * @param {string} fieldName - Nom du champ
+ * @returns {boolean} true si le champ impacte le tarif
+ *
+ * @example
+ * isFieldImpactingTarif("ca") // true
+ * isFieldImpactingTarif("dateEffet") // false
+ */
+ function isFieldImpactingTarif(fieldName) {
+ return TARIF_IMPACTING_FIELDS.some(field =>
+ fieldName.includes(field) || field.includes(fieldName)
+ );
+ }
+
+ /**
+ * Vérifie si un changement de valeur impacte le tarif.
+ * Compare la nouvelle valeur avec les données originales du tarif.
+ *
+ * @param {string} fieldName - Nom du champ modifié
+ * @param {any} newValue - Nouvelle valeur
+ * @param {Object} tarifOriginalData - Données originales du tarif
+ * @returns {boolean} true si le changement impacte le tarif
+ *
+ * @example
+ * const impacted = isChangeImpactingTarif("ca", 200000, tarifData);
+ * if (impacted) showReturnToTarifModal();
+ */
+ function isChangeImpactingTarif(fieldName, newValue, tarifOriginalData) {
+ // Vérifier si le champ est dans la liste des champs impactants
+ if (!isFieldImpactingTarif(fieldName)) {
+ return false;
+ }
+
+ // Si pas de données originales, pas d'impact possible
+ if (!tarifOriginalData) {
+ return false;
+ }
+
+ // Récupérer la valeur originale
+ const originalValue = tarifOriginalData[fieldName];
+
+ // Comparer les valeurs
+ return !valuesEqual(newValue, originalValue);
+ }
+
+ // ═══════════════════════════════════════════════════════════════════════
+ // MODAL DE RETOUR AU TARIF
+ // ═══════════════════════════════════════════════════════════════════════
+
+ /**
+ * Affiche le modal demandant à l'utilisateur de retourner au tarif.
+ * Ce modal s'affiche quand une modification dans le projet impacte
+ * le calcul du tarif.
+ *
+ * @param {string} [fieldName] - Nom du champ modifié (optionnel, pour info)
+ *
+ * @example
+ * showReturnToTarifModal("ca");
+ */
+ function showReturnToTarifModal(fieldName) {
+ const modalId = 'modalRetourTarif';
+ let modal = document.getElementById(modalId);
+
+ // Créer le modal s'il n'existe pas
+ if (!modal) {
+ modal = createReturnToTarifModal();
+ document.body.appendChild(modal);
+ }
+
+ // Mettre à jour le message si un champ est spécifié
+ if (fieldName) {
+ const messageEl = modal.querySelector('#modalRetourTarifMessage');
+ if (messageEl) {
+ messageEl.innerHTML = `
+ Vous avez modifié "${fieldName}" qui impacte le calcul du tarif.
+
+ Vous devez retourner sur le formulaire Tarif pour recalculer et valider le nouveau tarif.
+ `;
+ }
+ }
+
+ // Ouvrir le modal
+ if (window.M && window.M.Modal) {
+ const instance = window.M.Modal.getInstance(modal) || window.M.Modal.init(modal);
+ instance.open();
+ }
+ }
+
+ /**
+ * Crée l'élément DOM du modal de retour au tarif.
+ *
+ * @returns {HTMLElement} Élément modal créé
+ * @private
+ */
+ function createReturnToTarifModal() {
+ const modal = document.createElement('div');
+ modal.id = 'modalRetourTarif';
+ modal.className = 'modal';
+
+ modal.innerHTML = `
+
+
⚠️ Modification impactant le tarif
+
+ Vous avez modifié une donnée qui impacte le calcul du tarif.
+
+ Vous devez retourner sur le formulaire Tarif pour recalculer et valider le nouveau tarif.
+
+
+
+ `;
+
+ return modal;
+ }
+
+ /**
+ * Navigate vers l'onglet Tarif depuis le Projet.
+ *
+ * @example
+ * navigateToTarif();
+ */
+ function navigateToTarif() {
+ // Fermer le modal
+ const modal = document.getElementById('modalRetourTarif');
+ if (modal && window.M) {
+ const instance = window.M.Modal.getInstance(modal);
+ if (instance) instance.close();
+ }
+
+ // Naviguer vers le tarif
+ const numParcours = new URLSearchParams(window.location.search).get('numParcours');
+ if (numParcours) {
+ window.location.href = `/navParcours?numParcours=${numParcours}&submenu=tarif`;
+ }
+ }
+
+ // ═══════════════════════════════════════════════════════════════════════
+ // EXPORT PUBLIC
+ // ═══════════════════════════════════════════════════════════════════════
+
+ /**
+ * API publique du module RC Sync.
+ * Toutes les fonctions exportées ici sont accessibles via window.RCSync.
+ */
+ window.RCSync = {
+ // Helpers
+ toNumber,
+ getValue,
+ setValue,
+ getElementByIdFlexible,
+
+ // Comparaison
+ arraysEqual,
+ valuesEqual,
+
+ // Détection changements
+ isFieldImpactingTarif,
+ isChangeImpactingTarif,
+
+ // Modal
+ showReturnToTarifModal,
+ navigateToTarif,
+
+ // Constantes
+ TARIF_IMPACTING_FIELDS
+ };
+
+ console.log('✅ RC Sync Utils loaded');
+
+})(window);
\ No newline at end of file
diff --git a/ecole/public/js/tarif-form-fac.js b/ecole/public/js/tarif-form-fac.js
new file mode 100644
index 00000000..da4e8ca8
--- /dev/null
+++ b/ecole/public/js/tarif-form-fac.js
@@ -0,0 +1,1987 @@
+function initSubmenuForm() {
+ // Accéder aux informations stockées du parcours
+ const parcours = JSON.parse(sessionStorage.getItem('parcours'));
+}
+
+// Exposer initSubmenuForm globalement pour y accéder depuis l'extérieur
+window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollution de l'espace global
+(function () {
+
+ //Variables modulos et liste
+ var objModNatureMar, objModMontantCA, objModAct, objModCond, objModZoneTransp, objModTPPC, objMarEnExpo, objModRG
+ const listeNatureMarObj = {}
+ const listeActiviteObj = {}
+
+ // Variables propositions
+ let sansFranchise, franchise350, franchise750
+
+ //variables modale tarif commercial
+ const seuil = 15
+
+ //variables de calculs
+ var tauxCotRG = 1
+
+ // Accéder aux informations stockées du parcours
+ parcours = JSON.parse(sessionStorage.getItem('parcours'));
+ contrat = JSON.parse(sessionStorage.getItem('contrat'));
+ fac = contrat?.["@expand"]?.enCours || null;
+ tarif = fac?.["@expand"]?.tarif || null;
+
+ console.log("Initialisation pour formulaire projet :", parcours);
+
+ // Initialisation du formulaire et des données
+ function init() {
+ var select = document.querySelectorAll('select');
+ M.FormSelect.init(select);
+
+ var modals = document.querySelectorAll('.modal');
+ M.Modal.init(modals);
+
+ constantsJSON().then(() => {
+ fillSelects();
+ populateFormData();
+ checkInputs();
+
+ })
+ afficherFAC()
+ setupTableEventListeners()
+ }
+
+ function setupTableEventListeners() {
+
+ document.querySelectorAll('input[name="typeFlux"]').forEach((input) => {
+ input.addEventListener("change", function () {
+ toggleTypeFlux(this.value)
+ })
+ })
+
+ document.querySelectorAll('input[name="fluxDetailles"]').forEach((input) => {
+ input.addEventListener("change", function () {
+ toggleFluxDetailles()
+ })
+ })
+
+ document.getElementById('TPPC').addEventListener('change', function () {
+ document.getElementById('col-typetppc').style.display = this.checked ? "block" : "none"
+ })
+
+ document.getElementById('marEnExpo').addEventListener('change', function () {
+ document.getElementById('col-marEnExpo').style.display = this.checked ? "block" : "none"
+ })
+
+ document.getElementById('rg').addEventListener('change', function () {
+ document.getElementById('col-typeRG').style.display = this.checked ? "block" : "none"
+ })
+
+ document.getElementById('affinerTarif').addEventListener('change', function () {
+ document.getElementById('row-sinistresAsIf').style.display = this.checked ? "block" : "none"
+ })
+
+ document.getElementById('risqueGuerreAchats').addEventListener('change', function () {
+ document.getElementById('row-typeGarantieRGAchats').style.display = this.checked ? "block" : "none"
+ })
+
+ document.getElementById('risqueGuerreVentes').addEventListener('change', function () {
+ document.getElementById('row-typeGarantieRGVentes').style.display = this.checked ? "block" : "none"
+ })
+
+ document.querySelectorAll("[name='zone']").forEach((zone) => {
+ zone.addEventListener('change', function () {
+ if (this.checked) {
+ const chip = document.getElementById("chip-modulo-zone")
+ const transport = document.querySelector('[name="moyenTransportGlobal"]:checked').value
+ const zone = document.querySelector('[name="zone"]:checked').value
+ updateModuloChip(chip, calcModZoneTransp(zone, transport))
+ }
+ })
+ })
+
+ document.querySelectorAll('[name="zone"], [name="zoneVentes"], [name="zoneAchats"]').forEach((checkbox) => {
+ checkbox.addEventListener('change', function () {
+ checkZones(this.value, this.name)
+ })
+ })
+
+ document.getElementById('sinistres').addEventListener('input', function () {
+ const chip = document.getElementById('chip-primePlancher')
+ updateModuloChip(chip, calcPrimePlancher(), false)
+ })
+
+ document.querySelectorAll('.franchise-card button').forEach((button) => button.addEventListener('click', function (e) {
+ e.preventDefault()
+ openModaleTarifCom(this.name)
+ }))
+
+ document.querySelectorAll('.natureMar-autocomplete').forEach((input) => {
+ input.addEventListener('change', function () {
+ checkNatureMar(this)
+ })
+ })
+
+ document.getElementById('activite').addEventListener('change', function () {
+ checkActivite(this);
+ })
+
+ document.getElementById('sinistres').addEventListener('input', function () {
+ const chip = document.getElementById('chip-primePlancher')
+ updateModuloChip(chip, calcPrimePlancher(), false)
+ })
+
+
+ document.getElementById('sinistresAsIf').addEventListener('input', function () {
+ const chip = document.getElementById('chip-modulo-sinistresAsIf')
+ const sinistres = document.getElementById('sinistresAsIf').value
+
+ updateModuloChip(chip, calcPrimeCS(sinistres), false)
+ })
+
+ document.getElementById('police').addEventListener('change', function () {
+ document.querySelectorAll('.natureMar-autocomplete').forEach((input) => {
+ if (input.value !== "") {
+ checkNatureMar(input)
+ }
+ })
+
+ const chip = document.getElementById('chip-modulo-police')
+ updateModuloChip(chip, calcModPolice(this.value))
+ })
+
+ document.getElementById("nbVehicTPPC").addEventListener('input', function () {
+ if (this.value > 5) {
+ const elem = document.getElementById('modalTPPC');
+ const instance = M.Modal.getInstance(elem);
+ instance.open()
+ this.value = 5
+ }
+ })
+
+ document.getElementById("capitalTPPC").addEventListener('input', function () {
+ if (this.value > 99999) {
+ const elem = document.getElementById('modalTPPC');
+ const instance = M.Modal.getInstance(elem);
+ instance.open()
+ this.value = 99999
+ }
+ })
+
+ document.getElementById('montant').addEventListener('input', function () {
+ const chip = document.getElementById('chip-modulo-montant')
+ updateModuloChip(chip, calcModMontantCA(this.value, getCA()))
+ })
+
+ document.getElementById('marchandise').addEventListener('input', function () {
+ const chip = document.getElementById('chip-modulo-marchandise')
+ updateModuloChip(chip, calcModNatureMar(this.value))
+ })
+
+
+ document.getElementById('conditionnementGlobal').addEventListener('change', function () {
+ const chip = document.getElementById('chip-modulo-cond')
+ updateModuloChip(chip, calcModCond(this.value))
+ })
+
+ document.getElementById('conditionnementAchats').addEventListener('change', function () {
+ const chip = document.getElementById('chip-modulo-condAchats')
+ updateModuloChip(chip, calcModCond(this.value))
+ })
+
+ document.getElementById('conditionnementVentes').addEventListener('change', function () {
+ const chip = document.getElementById('chip-modulo-condVentes')
+ updateModuloChip(chip, calcModCond(this.value))
+ })
+
+ document.getElementById('addAsIf').addEventListener('click', function () {
+ addAsIf()
+ })
+
+ document.querySelectorAll('[name=zoneAchats],[name=moyenTransportAchats]').forEach((input) => {
+ input.addEventListener('change', function () {
+ if (this.checked) {
+ const zone = document.querySelector('[name="zoneAchats"]:checked')?.value
+ const transport = document.querySelector('[name="moyenTransportAchats"]:checked')?.value
+ const chip = document.getElementById('chip-modulo-zoneAchats')
+
+ updateModuloChip(chip, calcModZoneTransp(zone, transport))
+ }
+ })
+ })
+
+ document.querySelectorAll('[name=zoneVentes],[name=moyenTransportVentes]').forEach((input) => {
+ input.addEventListener('change', function () {
+ if (this.checked) {
+ const zone = document.querySelector('[name="zoneVentes"]:checked')?.value
+ const transport = document.querySelector('[name="moyenTransportVentes"]:checked')?.value
+ const chip = document.getElementById('chip-modulo-zoneVentes')
+
+ updateModuloChip(chip, calcModZoneTransp(zone, transport))
+ }
+ })
+ })
+
+ document.querySelectorAll('#valeurAnnuelleVentes, #valeurAnnuelleAchats, #montantVentes, #montantAchats').forEach((input) => {
+ input.addEventListener('input', function () {
+ const chipAchats = document.getElementById('chip-modulo-montantAchats')
+ const chipVentes = document.getElementById('chip-modulo-montantVentes')
+
+ const modulo = calcModMontantCA(getMontantTotal(), getValeurAnnuelleTotal())
+ updateModuloChip(chipAchats, modulo)
+ updateModuloChip(chipVentes, modulo)
+ })
+ })
+
+ document.querySelectorAll('[name="btnZone1"]').forEach((button) => {
+ button.addEventListener('click', function () {
+ const elem = document.getElementById('modalZone1');
+ const instance = M.Modal.getInstance(elem);
+ instance.open()
+ })
+ })
+
+ document.querySelectorAll('[name="btnZone2"]').forEach((button) => {
+ button.addEventListener('click', function () {
+ const elem = document.getElementById('modalZone2');
+ const instance = M.Modal.getInstance(elem);
+ instance.open()
+ })
+ })
+
+ document.querySelectorAll('[name="btnZone3"]').forEach((button) => {
+ button.addEventListener('click', function () {
+ const elem = document.getElementById('modalZone3');
+ const instance = M.Modal.getInstance(elem);
+ instance.open()
+ })
+ })
+
+ document.querySelectorAll('[name="btnZone4"]').forEach((button) => {
+ button.addEventListener('click', function () {
+ const elem = document.getElementById('modalZone4');
+ const instance = M.Modal.getInstance(elem);
+ instance.open()
+ })
+ })
+
+ document.querySelectorAll('[name="btnZone5"]').forEach((button) => {
+ button.addEventListener('click', function () {
+ const elem = document.getElementById('modalZone5');
+ const instance = M.Modal.getInstance(elem);
+ instance.open()
+ })
+ })
+
+ document.querySelectorAll('[name="btnZone6"]').forEach((button) => {
+ button.addEventListener('click', function () {
+ const elem = document.getElementById('modalZone6');
+ const instance = M.Modal.getInstance(elem);
+ instance.open()
+ })
+ })
+
+ document.querySelectorAll('[name="btnZone7"]').forEach((button) => {
+ button.addEventListener('click', function () {
+ const elem = document.getElementById('modalZoneExclus');
+ const instance = M.Modal.getInstance(elem);
+ instance.open()
+ })
+ })
+
+ document.querySelectorAll('[name="zonesInfos"]').forEach((button) => {
+ button.addEventListener('click', function () {
+ const elem = document.getElementById('modalZones');
+ const instance = M.Modal.getInstance(elem);
+ instance.open()
+ })
+ })
+
+ document.querySelectorAll('[name="marchandiseInfos"]').forEach((button) => {
+ button.addEventListener('click', function () {
+ const elem = document.getElementById('modalMarchandise');
+ const instance = M.Modal.getInstance(elem);
+ instance.open()
+ })
+ })
+
+ document.querySelectorAll('input, select').forEach((input) => {
+ const recalcul = () => {
+ stepExtensions()
+
+ if (checkInputs()) {
+ document.getElementById('propositions').style.display = "flex"
+ document.getElementById('row-champsManquants').style.display = "none"
+
+ sansFranchise = calcCard(1)
+ franchise350 = calcCard(0.9)
+ franchise750 = calcCard(0.85)
+
+ fillPropCard('sansFranchise', sansFranchise)
+ fillPropCard('franchise350', franchise350)
+ fillPropCard('franchise750', franchise750)
+ } else {
+ document.getElementById('propositions').style.display = "none"
+ document.getElementById('row-champsManquants').style.display = "block"
+ }
+ }
+ input.addEventListener('input', recalcul)
+ input.addEventListener('change', recalcul)
+ })
+
+ document.getElementById('comm-OK').addEventListener('click', function () {
+ submitForm(this.name)
+ })
+
+ document.getElementById('commentaire').addEventListener('input', function () {
+ if (document.getElementById('commentaire').value == "") {
+ document.getElementById('comm-OK').disabled = true
+ } else {
+ document.getElementById('comm-OK').disabled = false
+ }
+ })
+
+ document.getElementById('loadHistoriqueBtn').addEventListener('click', function () {
+ handleLoadHistoriqueBtn();
+ });
+
+ }
+
+ //Appel pour recevoir les constantes
+ async function constantsJSON() {
+ try {
+ const responsesJSON = await Promise.all([
+ fetch('/fac/modulo/natureMar'),
+ fetch('/fac/modulo/montantCA'),
+ // fetch('/fac/modulo/franchiseTousCas'),
+ fetch('/fac/modulo/activite'),
+ fetch('/fac/modulo/conditionnement'),
+ fetch('/fac/modulo/zoneTransport'),
+ fetch('/fac/modulo/tppc'),
+ fetch('/fac/modulo/marEnExpo'),
+ fetch('/fac/modulo/rg'),
+ ]);
+ const jsonResponses = await Promise.all(responsesJSON.map(r => r.json())); // Récupérer toutes les réponses JSON
+
+ // Extraire la valeur objRetourne de chaque réponse
+ [
+ objModNatureMar,
+ objModMontantCA,
+ // objModFranchiseTousCas,
+ objModAct,
+ objModCond,
+ objModZoneTransp,
+ objModTPPC,
+ objMarEnExpo,
+ objModRG
+ ] = jsonResponses.map(response => response.objRetourne); // Adapter pour extraire objRetourne
+ } catch (err) {
+ throw err;
+ }
+ }
+
+ function checkActivite(input, showError = true) {
+ const errorElement = document.getElementById('activite-error')
+ const moduloChipAct = document.getElementById('chip-modulo-activite')
+ if (Object.keys(objModAct).includes(input.value)) {
+ if (showError) {
+ errorElement.textContent = ""
+ errorElement.style.display = "none"
+ updateModuloChip(moduloChipAct, calcModAct(input.value))
+ }
+ return true
+ } else {
+ if (showError) {
+ errorElement.textContent = "Veuillez selectionner une activité parmi la liste"
+ errorElement.style.display = "block"
+ updateModuloChip(moduloChipAct, null)
+ }
+ return false
+ }
+ }
+
+ function checkNatureMar(input, showError = true) {
+ const errorElement = document.getElementById(input.id + '-error')
+ const moduloChipAct = document.getElementById('chip-modulo-' + input.id)
+
+ if (Object.keys(objModNatureMar).includes(input.value)) {
+ if (showError) {
+ errorElement.textContent = ""
+ errorElement.style.display = "none"
+ updateModuloChip(moduloChipAct, calcModNatureMar(input.value))
+ }
+ return true
+ } else {
+ if (showError) {
+ errorElement.textContent = "Veuillez selectionner une nature de marchandise parmi la liste"
+ errorElement.style.display = "block"
+ updateModuloChip(moduloChipAct, null)
+ }
+ return false
+ }
+ }
+
+ function getTypeFlux() {
+ return document.querySelector('[name="typeFlux"]:checked').value
+ }
+
+ function getPolice() {
+ return document.querySelector('#police').value
+ }
+
+ function getTempo() {
+ const police = getPolice()
+ if (police == "ca") {
+ return "annuel"
+ } else if (police == "national" || police == "international") {
+ return "tempo"
+ }
+
+ return null
+ }
+
+ function getTypeMar() {
+ if (getTypeFlux() == "global") {
+ return document.getElementById('marchandise').value
+ } else {
+ const actArray = []
+ const marAchats = document.getElementById('natureMarAchats').value
+ const marVentes = document.getElementById('natureMarVentes').value
+
+ if (marAchats !== "" && isAchatsSelected()) {
+ actArray.push(marAchats)
+ }
+ if (marVentes !== "" && isVentesSelected()) {
+ actArray.push(marVentes)
+ }
+
+ return actArray.join(', ')
+ }
+ }
+
+ function getCA() {
+ return document.getElementById('ca').value
+ }
+
+ function getMontantTotal() {
+ if (getTypeFlux() == "global") {
+ return document.getElementById('montant').value
+ } else if (getTypeFlux() == "detailles") {
+ var sommeMontant = 0
+ if (isAchatsSelected()) {
+ sommeMontant += parseFloat(document.getElementById("montantAchats").value)
+ }
+ if (isVentesSelected()) {
+ sommeMontant += parseFloat(document.getElementById("montantVentes").value)
+ }
+ return sommeMontant
+ }
+ }
+
+ function getValeurAnnuelleTotal() {
+ if (getTypeFlux() == "detailles") {
+ var sommeMontant = 0
+ if (isAchatsSelected()) {
+ sommeMontant += parseFloat(document.getElementById("valeurAnnuelleAchats").value)
+ }
+ if (isVentesSelected()) {
+ sommeMontant += parseFloat(document.getElementById("valeurAnnuelleVentes").value)
+ }
+ return sommeMontant
+ } else {
+ return false
+ }
+ }
+
+ function getRisqueGuerre() {
+ const rgGlobal = document.querySelector('[name="typeGarantieRG"]:checked').value
+ const rgGlobalCheckbox = document.getElementById('rg').checked
+
+ const rgVentes = document.querySelector('[name="typeGarantieRGVentes"]:checked').value
+ const rgVentesCheckbox = document.getElementById('risqueGuerreVentes').checked
+ const rgAchats = document.querySelector('[name="typeGarantieRGAchats"]:checked').value
+ const rgAchatsCheckbox = document.getElementById('risqueGuerreAchats').checked
+
+ if (getTypeFlux() == "global" && rgGlobalCheckbox) {
+ return [rgGlobal]
+ } else if (getTypeFlux() == "detailles") {
+ const rg = []
+ if (isAchatsSelected() && rgAchatsCheckbox) {
+ rg.push(rgAchats)
+ }
+
+ if (isVentesSelected() && rgVentesCheckbox) {
+ rg.push(rgVentes)
+ }
+
+ return rg
+ }
+
+ return []
+ }
+
+ function getZones() {
+ if (getTypeFlux() == "global") {
+ return [document.querySelector('[name="zone"]:checked').value]
+ } else if (getTypeFlux() == "detailles") {
+ const zones = []
+ if (isAchatsSelected()) {
+ zones.push(document.querySelector('[name="zoneAchats"]:checked').value)
+ }
+ if (isVentesSelected()) {
+ zones.push(document.querySelector('[name="zoneVentes"]:checked').value)
+ }
+ return zones
+ }
+
+ return []
+ }
+
+ function getTransportTypeRO(transport) {
+ if (getTypeFlux() == "global") {
+ if (document.getElementById(transport + '-global') && document.getElementById(transport + '-global').checked) {
+ return document.querySelector('[name="risqueOrdinaire"]:checked').value
+ }
+ } else {
+ const checkboxAchats = document.getElementById(transport + '-achats')
+ const checkboxVentes = document.getElementById(transport + '-ventes')
+
+ if ((checkboxAchats && checkboxAchats.checked) || (checkboxVentes && checkboxVentes.checked)) {
+ return document.querySelector('[name="risqueOrdinaire"]:checked').value
+ }
+ }
+ return ""
+ }
+
+ function isAchatsSelected() {
+ return (document.getElementById('achats').checked) && (getTypeFlux() == "detailles")
+ }
+
+ function isVentesSelected() {
+ return (document.getElementById('ventes').checked) && (getTypeFlux() == "detailles")
+ }
+
+ function calcModPolice(police) {
+ if (police == "ca") {
+ return 0.9
+ } else if (police == "international" || police == "national") {
+ return 1
+ } else {
+ return false
+ }
+ }
+
+ function calcPrimeMini(police) {
+ switch (police) {
+ case "national":
+ return 300;
+
+ case "international":
+ return 300;
+
+ case "ca":
+ return 800;
+ }
+ }
+
+ function calcPrimePlancher() {
+ const sinistres = document.getElementById('sinistres')
+
+ if (sinistres.value !== "") {
+ return parseFloat((sinistres.value * 100 / 65).toFixed(2))
+ } else {
+ return false
+ }
+ }
+
+ function calcModAct(activite) {
+ if (activite == "") {
+ return false
+ }
+ if (!Object.keys(objModAct).includes(activite)) {
+ return false
+ }
+ return parseFloat(objModAct[activite])
+ }
+
+ function calcModNatureMar(natureMar) {
+ if (natureMar == "") {
+ return false
+ }
+ if (!Object.keys(objModNatureMar).includes(natureMar)) {
+ return false
+ }
+
+ var coeffTempo = 1
+
+ if (getTempo() == "tempo") {
+ coeffTempo = 1.2
+ }
+
+ return Number((objModNatureMar[natureMar].taux * coeffTempo).toFixed(5))
+ }
+
+ function getModNatureMar() {
+ if (getTypeFlux() == "global") {
+ const marchandise = document.getElementById('marchandise').value
+ return calcModNatureMar(marchandise)
+ } else if (getTypeFlux() == "detailles") {
+ var modNatureMar = 1
+ if (isAchatsSelected()) {
+ const marchandise = document.getElementById('natureMarAchats').value
+ modNatureMar *= calcModNatureMar(marchandise)
+ }
+
+ if (isVentesSelected()) {
+ const marchandise = document.getElementById('natureMarVentes').value
+ modNatureMar *= calcModNatureMar(marchandise)
+ }
+ return modNatureMar
+ }
+ }
+
+ function calcModMontantCA(montant, ca) {
+ if (montant && ca) {
+ const palierCA = Object.keys(objModMontantCA)
+ .map(palier => Number(palier))
+ .sort((a, b) => a - b)
+ .find((p) => ca <= p);
+ if (!palierCA || palierCA == undefined) return false;
+
+ const palierMontant = Object.keys(objModMontantCA[palierCA])
+ .map(palier => Number(palier))
+ .sort((a, b) => a - b)
+ .find((p) => montant <= p);
+
+ if (!palierMontant || palierMontant == undefined) return false;
+
+ return objModMontantCA[palierCA][palierMontant];
+ } else {
+ return false
+ }
+ }
+
+ function calcModCond(conditionnement) {
+ if (Object.keys(objModCond).includes(conditionnement)) {
+ return objModCond[conditionnement]["modulo"]
+ } else {
+ return false
+ }
+ }
+
+ function calcModZoneTransp(zone, transport) {
+ if (zone && transport) {
+ return objModZoneTransp[zone][transport]
+ } else {
+ return false
+ }
+ }
+
+ function calcTPPC(prime) {
+ const montant = document.getElementById('capitalTPPC').value
+ var tppc = 0
+ var franchise = ""
+
+ const palierModulo = Object.keys(objModTPPC)
+ .map(palier => Number(palier))
+ .sort((a, b) => a - b)
+ .find((p) => montant <= p)
+
+ const modulo = objModTPPC[palierModulo]?.modulo || 0
+ franchise = objModTPPC[palierModulo]?.franchise
+ tppc = prime * modulo
+
+ return {
+ tppc: tppc,
+ franchise: franchise
+ }
+ }
+
+ function calcMarEnExpo(cotRO) {
+ // Calcul de la majoration en exposition
+ const nbExpo = document.getElementById('nombreExposition').value
+ const capital = document.getElementById('capitalExposition').value
+ const type = document.getElementById('typeMarEnExpo').value
+
+ var marEnExpo = 0
+ var franchise = ""
+
+ if (nbExpo && capital && type) {
+ if (capital < 20000) {
+ marEnExpo = 0
+ franchise = 500
+ } else if (nbExpo > 3 || capital > 50000) {
+ marEnExpo = nbExpo * capital * objMarEnExpo[type] / 100
+ marEnExpo = marEnExpo > cotRO * 0.1 ? cotRO * 0.1 : marEnExpo
+ // franchise = "10% mini 150 maxi 1000"
+ franchise = 150
+ } else {
+ marEnExpo = cotRO * 0.1 < 150 ? cotRO * 0.1 : 150
+ // franchise = "10% mini 150 maxi 1000"
+ franchise = 150
+ }
+ }
+
+ return {
+ marEnExpo: marEnExpo,
+ franchise: franchise,
+ }
+ }
+
+ function calcRG() {
+ const typeFlux = getTypeFlux()
+ var rg = 0
+
+ if (typeFlux == "global" && document.getElementById('rg').checked) {
+ const engagement = document.getElementById('engagementRG').value
+ const zone = document.querySelector('[name="zone"]:checked').value
+ const typeRG = document.querySelector('[name="typeGarantieRG"]:checked').value
+
+ tauxCotRG = objModRG[zone][typeRG]
+ rg = engagement * tauxCotRG
+ } else if (typeFlux == "detailles") {
+ var rgAchats = 0
+ var rgVentes = 0
+ var tauxAchats = 1
+ var tauxVentes = 1
+
+ if (isAchatsSelected() && document.getElementById('risqueGuerreAchats').checked) {
+ const engagementAchats = parseFloat(document.getElementById('engagementRGAchats').value)
+ const zone = document.querySelector('[name="zoneAchats"]:checked').value
+ const typeRG = document.querySelector('[name="typeGarantieRGAchats"]:checked').value
+ tauxAchats = objModRG[zone][typeRG]
+ rgAchats = engagementAchats * tauxAchats
+ }
+
+ if (isVentesSelected() && document.getElementById('risqueGuerreVentes').checked) {
+ const engagementVentes = parseFloat(document.getElementById('engagementRGVentes').value)
+ const zone = document.querySelector('[name="zoneVentes"]:checked').value
+ const typeRG = document.querySelector('[name="typeGarantieRGVentes"]:checked').value
+ tauxVentes = objModRG[zone][typeRG]
+ rgVentes = tauxVentes * engagementVentes
+ }
+ tauxCotRG = tauxAchats * tauxVentes
+ rg = rgAchats + rgVentes
+ }
+
+ return rg
+ }
+
+ function calcPrimeRef(modFranchise) {
+ const typeFlux = getTypeFlux()
+
+ var modPolice = calcModPolice(getPolice())
+
+ const activite = document.getElementById('activite').value
+ const modAct = calcModAct(activite)
+ var primeRef = 0
+
+ if (typeFlux == "global") {
+
+ const conditionnement = document.querySelector('#conditionnementGlobal').value
+ const marchandise = document.getElementById('marchandise').value
+ const zone = document.querySelector('[name="zone"]:checked')?.value
+ const transport = document.querySelector('[name="moyenTransportGlobal"]:checked')?.value
+ const montant = getMontantTotal()
+ const ca = getCA()
+
+ modNatureMar = calcModNatureMar(marchandise)
+ const modCond = calcModCond(conditionnement)
+ const modZoneTransp = calcModZoneTransp(zone, transport)
+ const modMontantCA = calcModMontantCA(montant, ca)
+
+ const coeff = modNatureMar * modPolice * modFranchise * modCond * modZoneTransp * modMontantCA * modAct
+
+ primeRef = ca * coeff
+
+ } else if (typeFlux == "detailles") {
+ var primeVentes = 0, primeAchats = 0
+ if (isAchatsSelected()) {
+ primeAchats = calcPrimeAchats()
+ }
+
+ if (isVentesSelected()) {
+ primeVentes = calcPrimeVentes()
+ }
+ primeRef = primeAchats + primeVentes
+ }
+ return primeRef
+ }
+
+ function calcPrimeCS(sinistre) {
+ const affinerTarif = document.getElementById("affinerTarif").checked
+ if (affinerTarif && sinistre > 0) {
+ return (sinistre * 100 / 65).toFixed(2)
+ }
+ return false
+ }
+
+ function checkInputs() {
+ const typeFlux = getTypeFlux()
+
+ //CHAMPS COMMUN
+ const inputActivite = document.getElementById('activite')
+ const activite = inputActivite.value || false
+ const ca = document.getElementById('ca').value || false
+ const police = getPolice()
+
+
+ //CHAMPS POUR FLUX GLOBAL
+ const conditionnement = document.querySelector('#conditionnementGlobal').value || false
+
+ const inputMarchandise = document.getElementById('marchandise')
+ const marchandise = inputMarchandise.value || false
+
+ const zone = document.querySelector('[name="zone"]:checked') || false
+ const transport = document.querySelector('[name="moyenTransportGlobal"]:checked') || false
+ const montant = document.getElementById('montant').value && validateField('montant') || false
+
+ //CHAMPS POUR FLUX DETAILS
+ const inputMarchandiseAchats = document.getElementById('natureMarAchats')
+ const valeurAnnuelleAchats = document.getElementById("valeurAnnuelleAchats").value || false
+ const montantAchats = document.getElementById("montantAchats").value && validateField('montantAchats') || false
+ const transportAchats = document.querySelector('[name="moyenTransportAchats"]:checked') || false
+ const conditionnementAchats = document.querySelector('#conditionnementAchats').value || false
+ const zoneAchats = document.querySelector('[name="zoneAchats"]:checked') || false
+
+ const inputMarchandiseVentes = document.getElementById('natureMarVentes') || false
+ const valeurAnnuelleVentes = document.getElementById("valeurAnnuelleVentes").value || false
+ const montantVentes = document.getElementById("montantVentes").value && validateField('montantVentes') || false
+ const transportVentes = document.querySelector('[name="moyenTransportVentes"]:checked') || false
+ const conditionnementVentes = document.querySelector('#conditionnementVentes').value || false
+ const zoneVentes = document.querySelector('[name="zoneVentes"]:checked') || false
+
+ //INPUT CHIPS
+
+ const chipAct = document.getElementById("chip-act");
+ const chipPolice = document.getElementById("chip-police");
+ const chipCA = document.getElementById("chip-ca");
+ const chipNatureMar = document.getElementById("chip-natureMar");
+ const chipTransport = document.getElementById("chip-transport");
+ const chipConditionnement = document.getElementById("chip-conditionnement");
+ const chipMontant = document.getElementById("chip-montant");
+ const chipZone = document.getElementById("chip-zone");
+ const chipValeurAnnuelle = document.getElementById("chip-valeurAnnuelle");
+
+ updateInputChip(chipAct, checkActivite(inputActivite, false))
+ updateInputChip(chipPolice, police)
+ updateInputChip(chipCA, ca)
+
+ if (typeFlux == "global") {
+ updateInputChip(chipNatureMar, checkNatureMar(inputMarchandise, false))
+ updateInputChip(chipTransport, transport)
+ updateInputChip(chipConditionnement, conditionnement)
+ updateInputChip(chipMontant, montant)
+ updateInputChip(chipZone, zone)
+ updateInputChip(chipValeurAnnuelle, true)
+
+ return ((conditionnement && marchandise && zone && transport && activite && montant && ca && police))
+
+ } else if (typeFlux == "detailles") {
+ let boolNatureMar = false;
+ let boolTransport = false;
+ let boolConditionnement = false;
+ let boolMontant = false;
+ let boolZone = false;
+ const sources = [];
+
+ if (isAchatsSelected()) {
+ sources.push({
+ natureMar: checkNatureMar(inputMarchandiseAchats, false),
+ transport: transportAchats,
+ conditionnement: conditionnementAchats,
+ montant: montantAchats,
+ zone: zoneAchats,
+ valeurAnnuelle: valeurAnnuelleAchats,
+ });
+ }
+
+ if (isVentesSelected()) {
+ sources.push({
+ natureMar: checkNatureMar(inputMarchandiseVentes, false),
+ transport: transportVentes,
+ conditionnement: conditionnementVentes,
+ montant: montantVentes,
+ zone: zoneVentes,
+ valeurAnnuelle: valeurAnnuelleVentes,
+ });
+ }
+
+ // Agrégation des booléens avec un ET logique
+ boolNatureMar = sources.every(s => s.natureMar);
+ boolTransport = sources.every(s => s.transport);
+ boolConditionnement = sources.every(s => s.conditionnement);
+ boolMontant = sources.every(s => s.montant);
+ boolZone = sources.every(s => s.zone);
+ boolValeurAnnuelle = sources.every(s => s.valeurAnnuelle)
+
+ updateInputChip(chipNatureMar, boolNatureMar);
+ updateInputChip(chipTransport, boolTransport);
+ updateInputChip(chipConditionnement, boolConditionnement);
+ updateInputChip(chipMontant, boolMontant);
+ updateInputChip(chipZone, boolZone);
+ updateInputChip(chipValeurAnnuelle, boolValeurAnnuelle)
+
+ return boolNatureMar && boolTransport && boolConditionnement && boolMontant && boolZone && boolValeurAnnuelle && activite && ca && police;
+ }
+ }
+
+ function toggleTypeFlux(type) {
+ if (type == "detailles") {
+ document.getElementById('row-fluxDetailles').style.display = "flex"
+ document.getElementById('div-infoMarchandises').style.display = "none"
+ document.getElementById('div-transport').style.display = "none"
+ document.getElementById('div-zonesGeo').style.display = "none"
+ document.getElementById('div-flux').style.display = "block"
+ document.getElementById('row-rg').style.display = "none"
+ toggleFluxDetailles()
+
+ } else if (type == "global") {
+ document.getElementById('row-fluxDetailles').style.display = "none"
+ document.getElementById('div-infoMarchandises').style.display = "block"
+ document.getElementById('div-transport').style.display = "block"
+ document.getElementById('div-zonesGeo').style.display = "block"
+ document.getElementById('div-flux').style.display = "none"
+ document.getElementById('row-rg').style.display = "block"
+ }
+ }
+
+ function toggleFluxDetailles() {
+ const ventes = document.querySelector('input#ventes[name="fluxDetailles"]')
+ const achats = document.querySelector('input#achats[name="fluxDetailles"]')
+ const intersites = document.querySelector('input#intersites[name="fluxDetailles"]')
+
+ /*Intersites ne peut pas être sélectionné seul*/
+ if (intersites.checked && (!isVentesSelected() && !isAchatsSelected())) {
+ intersites.checked = false
+ achats.checked = true
+ }
+
+ /*Il ne peut y avoir aucun flux sélectionné*/
+ if (document.querySelectorAll('[name="fluxDetailles"]:checked').length == 1) {
+ document.querySelector('[name="fluxDetailles"]:checked').disabled = true
+ document.querySelectorAll('[name="fluxDetailles"]:not(:checked)').forEach((checkbox) => {
+ checkbox.disabled = false
+ })
+ } else {
+ ventes.disabled = false
+ achats.disabled = false
+ intersites.disabled = false
+ }
+
+ /*Affichage*/
+ document.getElementById('div-fluxAchats').style.display = achats.checked ? "block" : "none"
+ document.getElementById('div-fluxVentes').style.display = ventes.checked ? "block" : "none"
+ }
+
+ function afficherFAC() {
+ toggleTypeFlux(document.querySelector('[name="typeFlux"]:checked').value)
+ }
+
+ function updateModuloChip(elementModulo, valeur, isModulo = true) {
+ if (valeur == null || valeur == false) {
+ elementModulo.style.display = "none"
+ } else {
+ elementModulo.style.display = "inline-block"
+ const titreModulo = elementModulo.innerText.split(' : ')[0]
+ if (isModulo) {
+ elementModulo.innerText = titreModulo + ' : x' + valeur
+ } else if (!isModulo) {
+ elementModulo.innerText = titreModulo + ' : ' + valeur + '€'
+ }
+ }
+ }
+
+ function updateStepChip(elementModulo, valeur) {
+ if (valeur == null || valeur == false) {
+ elementModulo.style.display = "none"
+ } else {
+ elementModulo.style.display = "inline-block"
+ elementModulo.innerText = "Prime : " + new Intl.NumberFormat("fr-FR", {style: "currency", currency: "EUR"}).format(valeur)
+ }
+ }
+
+ function updateInputChip(chip, valeur) {
+ if (valeur != "" && valeur != null && valeur != false) {
+ chip.style.display = "none"
+ } else {
+ chip.style.display = "inline-block"
+ }
+ }
+
+ // Supprimer une ligne du tableau
+ function deleteAsIf(btn) {
+ const row = btn.parentElement.parentElement;
+ row.parentElement.removeChild(row);
+ }
+
+
+ function addAsIf(franchise = "", sinistre = "") {
+ var prime, display = "none"
+ if (franchise && sinistre) {
+ prime = calcPrimeCS(sinistre)
+ display = "inline-block"
+ }
+
+ const newRow = document.createElement("div")
+ newRow.className = "row mrg asIfRow"
+ newRow.innerHTML = `
+
+
+ delete
+
+
+
+
Franchise As If
+
+
+
+
+
+
+
Charge sinistre annuelle revue selon as if
+ franchise
+
+
+
+
+
+
+
+ Prime Plancher Indicative : `+ prime + `€
+
+
+ `
+
+ newRow.querySelector('.sinistresAsIf').addEventListener('input', function () {
+ const chip = newRow.querySelector('.modulo')
+ updateModuloChip(chip, calcPrimeCS(this.value), false)
+ })
+
+ newRow.querySelector('.delete-btn').addEventListener('click', function () {
+ deleteAsIf(this)
+ })
+
+ document.getElementById('row-sinistresAsIf').appendChild(newRow)
+ }
+
+ function extractAsIf() {
+ if (document.getElementById("affinerTarif").checked == "false") {
+ return ""
+ } else {
+ const extractArray = []
+ document.querySelectorAll('.asIfRow').forEach((row) => {
+ const franchise = row.querySelector('.franchiseAsIf').value
+ const sinistres = row.querySelector('.sinistresAsIf').value
+ if (franchise !== "" && sinistres !== "") {
+ var obj = {
+ franchise: franchise,
+ sinistres: sinistres
+
+ }
+ extractArray.push(obj)
+ }
+ })
+ const jsonResult = JSON.stringify(extractArray, null, 2);
+ return jsonResult;
+ }
+ }
+
+ function fillSelects() {
+
+ const optionCreator = (text, value) => {
+ let option = document.createElement('option')
+ option.value = value
+ option.text = text
+ return option
+ }
+
+ //Creation objets avec liste d'activité en clé, et null en valeur
+ for (const natureMar of Object.keys(objModNatureMar)) {
+ listeNatureMarObj[natureMar] = null
+ }
+
+ var elems = document.querySelectorAll('.natureMar-autocomplete');
+ M.Autocomplete.init(elems, {
+ data: listeNatureMarObj,
+ limit: 10
+ })
+
+
+ //Creation objets avec liste d'activité en clé, et null en valeur
+ for (const activite of Object.keys(objModAct)) {
+ listeActiviteObj[activite] = null
+ }
+
+ var elems = document.querySelectorAll('.activite-autocomplete');
+ M.Autocomplete.init(elems, {
+ data: listeActiviteObj,
+ limit: 10
+ })
+
+ //Remplissage des selects
+ const selectCond = document.querySelectorAll('select[name="conditionnement"]')
+ const selectMarEnExpo = document.getElementById('typeMarEnExpo')
+
+ for (const [key, value] of Object.entries(objModCond)) {
+ selectCond.forEach((select) => {
+ if (select.id == "conditionnementGlobal" && value['fluxGlobal']) {
+ select.add(optionCreator(value['nom'], key))
+ }
+ else if (select.id !== "conditionnementGlobal" && value['fluxDetailles']) {
+ select.add(optionCreator(value['nom'], key))
+ }
+ })
+ }
+
+ for (const [key, value] of Object.entries(objMarEnExpo)) {
+ selectMarEnExpo.add(optionCreator(key, key))
+ }
+
+ var select = document.querySelectorAll('select');
+ M.FormSelect.init(select);
+ }
+
+ function populateFormData() {
+ // Populate select historique
+ if (!contrat.historique) {
+ document.getElementById('historiqueDiv').style.display = "none";
+ } else {
+ document.getElementById('historiqueDiv').style.display = "block";
+
+ const idSelect = document.getElementById('idSelect');
+
+ contrat.historique.forEach(function (item) {
+ if (item) {
+ var option = document.createElement('option');
+ option.value = item.id;
+ option.textContent = item.type + " " + item.produit + " - " + item.date + " - " + item.heure;
+
+ if (item.nom != undefined && item.prenom != undefined) {
+ option.textContent += " - " + item.nom + " " + item.prenom;
+ }
+
+ idSelect.appendChild(option);
+ }
+ });
+ M.FormSelect.init(idSelect);
+ }
+
+ if (tarif?.typeFlux) {
+ document.getElementById(tarif.typeFlux).checked = true
+ toggleTypeFlux(tarif.typeFlux)
+ }
+
+ if (fac?.ca) {
+ document.getElementById('ca').value = fac.ca
+ }
+
+ if (tarif?.typePolice) {
+ document.querySelector('select#police option[value=' + tarif.typePolice + ']').selected = true;
+ const chip = document.getElementById('chip-modulo-police')
+ updateModuloChip(chip, calcModPolice(tarif.typePolice))
+ M.FormSelect.init(document.querySelector('select#police'))
+ }
+
+ if (fac?.actAssuree) {
+ const inputActivite = document.getElementById('activite')
+ inputActivite.value = fac.actAssuree
+ checkActivite(inputActivite)
+ }
+
+ if (fac?.tppc) {
+ document.getElementById('TPPC').checked = true
+ document.getElementById('capitalTPPC').value = fac?.capitalTPPC ?? 0
+ document.getElementById('nbVehicTPPC').value = tarif?.nbVehicTPPC ?? 0
+ document.getElementById('col-typetppc').style.display = "block"
+ }
+
+ if (tarif?.typeMarExpo || fac?.capitalExpo > 0 || fac?.nbVehicExpo > 0) {
+ document.getElementById('col-marEnExpo').style.display = "block"
+ document.getElementById('marEnExpo').checked = true
+ document.getElementById('capitalExposition').value = fac?.capitalExpo ?? 0
+ document.getElementById('nombreExposition').value = fac?.nbVehicExpo ?? 0
+
+ if (tarif?.typeMarExpo) {
+ document.querySelector('select#typeMarEnExpo option[value="' + tarif.typeMarExpo + '"]').selected = true;
+ M.FormSelect.init(document.querySelector('select#typeMarEnExpo'))
+ }
+ }
+
+ if (tarif?.typeRO) {
+ document.querySelector('input[name=risqueOrdinaire][id=' + tarif?.typeRO + ']').checked = true;
+ } else {
+ //LORSQUE LE PROJET EXISTE SANS LE TARIF, ON DONNE LA PRIORITE SUR LE TOUS RISQUES
+ const terrestre = fac?.terrestre ?? ""
+ const maritime = fac?.maritime ?? ""
+ const aerien = fac?.aerien ?? ""
+ const postal = fac?.postal ?? ""
+ const fluvial = fac?.fluvial ?? ""
+ const multimodal = fac?.multimodal ?? ""
+
+ const transport = [terrestre, maritime, aerien, postal, fluvial, multimodal]
+
+ if (!transport.every((type) => type == "")) {
+ const typeRO = transport.filter((type) => type !== "").includes('tousRisques') ? "tousRisques" : "eventMaj"
+ document.querySelector('input[name=risqueOrdinaire][id=' + typeRO + ']').checked = true;
+ }
+ }
+
+ if (tarif?.oldFranchise && tarif?.sinistres) {
+ document.getElementById('oldFranchise').value = tarif.oldFranchise
+ document.getElementById('sinistres').value = tarif.sinistres
+ const chip = document.getElementById('chip-primePlancher')
+ updateModuloChip(chip, calcPrimePlancher(), false)
+ }
+
+ if (tarif?.asIf) {
+ document.getElementById("affinerTarif").checked = true
+ document.getElementById('row-sinistresAsIf').style.display = "block"
+
+ tarif.asIf.forEach((rowAsIf) => {
+ addAsIf(rowAsIf.franchise, rowAsIf.sinistres)
+ })
+ }
+
+ if (tarif?.typeFlux && tarif?.typeFlux == "global" || !tarif) {
+ if (fac?.typeMar) {
+ const inputNatureMar = document.getElementById('marchandise')
+ const chip = document.getElementById('chip-modulo-marchandise')
+ inputNatureMar.value = fac.typeMar
+ checkNatureMar(inputNatureMar)
+ updateModuloChip(chip, calcModNatureMar(fac.typeMar))
+ }
+
+ if (tarif?.montantGarantir) {
+ document.getElementById('montant').value = tarif.montantGarantir
+ const chip = document.getElementById('chip-modulo-montant')
+ updateModuloChip(chip, calcModMontantCA(tarif.montantGarantir, fac.ca))
+ }
+
+ if (fac?.terrestre) {
+ document.querySelector('[name="moyenTransportGlobal"][value="terrestre"] ').checked = true
+ }
+
+ if (fac?.multimodal) {
+ document.querySelector('[name="moyenTransportGlobal"][value="multimodal"] ').checked = true
+ }
+
+ if (tarif?.conditionnement) {
+ document.querySelector('select#conditionnementGlobal option[value=' + tarif.conditionnement + ']').selected = true;
+ M.FormSelect.init(document.querySelector('select#conditionnementGlobal'))
+ }
+
+ if (tarif?.zone) {
+ document.querySelector('input[name=zone][id=' + tarif.zone + ']').checked = true;
+ checkZones(tarif.zone, "zone")
+ } else if (fac?.zones) {
+ fac.zones.forEach((zone) => {
+ document.querySelector('input[name=zone][id=' + zone + ']').checked = true;
+ checkZones(zone, "zone")
+ })
+ }
+
+ if (fac?.typeRG == "auto") {
+ document.querySelector('input[name=typeGarantieRG][value=' + fac.typeRG + ']').checked = true;
+ document.getElementById('col-typeRG').style.display = "block"
+ document.getElementById('rg').checked = true
+ if (tarif?.engagementRG > 0) {
+ document.getElementById("engagementRG").value = tarif.engagementRG
+ }
+ }
+
+ } else if (tarif?.typeFlux == "detailles") {
+ document.getElementById('achats').checked = !!tarif.fluxAchats
+ document.getElementById('ventes').checked = !!tarif.fluxVentes
+ document.getElementById('intersites').checked = tarif.fluxIntersites
+
+ toggleFluxDetailles()
+
+ if (tarif?.fluxAchats) {
+ const fluxAchats = tarif.fluxAchats
+
+ const inputNatureMar = document.getElementById('natureMarAchats')
+ inputNatureMar.value = fluxAchats.typeMar
+ checkNatureMar(inputNatureMar)
+
+ document.getElementById('valeurAnnuelleAchats').value = fluxAchats.valeurAnnuelleAchats
+ document.getElementById('montantAchats').value = fluxAchats.montant
+ document.querySelector('[name="moyenTransportAchats"][value="' + fluxAchats.transport + '"] ').checked = true
+
+ document.querySelector('select#conditionnementAchats option[value=' + fluxAchats.conditionnement + ']').selected = true;
+ M.FormSelect.init(document.querySelector('select#conditionnementAchats'))
+ const chipCondAchats = document.getElementById('chip-modulo-condAchats')
+ updateModuloChip(chipCondAchats, calcModCond(fluxAchats.conditionnement))
+
+ document.querySelector('input[name=zoneAchats][value=' + fluxAchats.zone + ']').checked = true;
+ checkZones(fluxAchats.zone, "zoneAchats")
+ const chipZoneTransp = document.getElementById('chip-modulo-zoneAchats')
+ updateModuloChip(chipZoneTransp, calcModZoneTransp(fluxAchats.zone, fluxAchats.transport))
+
+ if (fluxAchats.typeRG) {
+ document.querySelector('input[name=typeGarantieRGAchats][value=' + fluxAchats.typeRG + ']').checked = true;
+ document.getElementById("engagementRGAchats").value = fluxAchats.engagementRG
+ document.getElementById('row-typeGarantieRGAchats').style.display = "block"
+ document.getElementById('risqueGuerreAchats').checked = true
+ }
+ }
+
+ if (tarif?.fluxVentes) {
+ const fluxVentes = tarif.fluxVentes
+
+ const inputNatureMar = document.getElementById('natureMarVentes')
+ inputNatureMar.value = fluxVentes.typeMar
+ checkNatureMar(inputNatureMar)
+
+ document.getElementById('valeurAnnuelleVentes').value = fluxVentes.valeurAnnuelleVentes
+ document.getElementById('montantVentes').value = fluxVentes.montant
+ document.querySelector('[name="moyenTransportVentes"][value="' + fluxVentes.transport + '"] ').checked = true
+
+ document.querySelector('select#conditionnementVentes option[value=' + fluxVentes.conditionnement + ']').selected = true;
+ M.FormSelect.init(document.querySelector('select#conditionnementVentes'))
+ const chipCondVentes = document.getElementById('chip-modulo-condVentes')
+ updateModuloChip(chipCondVentes, calcModCond(fluxVentes.conditionnement))
+
+ document.querySelector('input[name=zoneVentes][value=' + fluxVentes.zone + ']').checked = true;
+ checkZones(fluxVentes.zone, "zoneVentes")
+ const chipZoneTransp = document.getElementById('chip-modulo-zoneVentes')
+ updateModuloChip(chipZoneTransp, calcModZoneTransp(fluxVentes.zone, fluxVentes.transport))
+
+ if (fluxVentes.typeRG) {
+ document.querySelector('input[name=typeGarantieRGVentes][value=' + fluxVentes.typeRG + ']').checked = true;
+ document.getElementById("engagementRGVentes").value = fluxVentes.engagementRG
+ document.getElementById('row-typeGarantieRGVentes').style.display = "block"
+ document.getElementById('risqueGuerreVentes').checked = true
+ }
+ }
+ const chipAchats = document.getElementById('chip-modulo-montantAchats')
+ const chipVentes = document.getElementById('chip-modulo-montantVentes')
+
+ const moduloMontant = calcModMontantCA(getMontantTotal(), getValeurAnnuelleTotal())
+ updateModuloChip(chipAchats, moduloMontant)
+ updateModuloChip(chipVentes, moduloMontant)
+ }
+
+ if (checkInputs()) {
+ document.getElementById('propositions').style.display = "flex"
+ document.getElementById('row-champsManquants').style.display = "none"
+
+ sansFranchise = calcCard(1)
+ franchise350 = calcCard(0.9)
+ franchise750 = calcCard(0.85)
+
+ fillPropCard('sansFranchise', sansFranchise)
+ fillPropCard('franchise350', franchise350)
+ fillPropCard('franchise750', franchise750)
+ } else {
+ document.getElementById('propositions').style.display = "none"
+ document.getElementById('row-champsManquants').style.display = "block"
+ }
+ stepExtensions()
+
+ }
+
+ function handleLoadHistoriqueBtn() {
+ var selectedId = document.getElementById('idSelect').value;
+
+ if (selectedId != "") {
+ fetch(`/contrat/update/${contrat.produit}/${contrat.id}/${selectedId}`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ })
+ .then(response => response.json())
+ .then(data => {
+ if (data.valid) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=tarif`;
+ } else {
+ console.log('Echec lors de la mise à jour de la relation id contrat - id client :', data);
+ }
+ });
+ }
+ }
+
+ function checkZones(checkedZone, nameZone) {
+ const zone1Checked = checkedZone.includes("2") || checkedZone.includes("3");
+ const zone2Checked = checkedZone.includes("3");
+
+ if (nameZone == "zone") {
+ document.getElementById('zone1-text').classList.toggle("checkedCheckbox", zone1Checked)
+ } else if (nameZone == "zoneAchats") {
+ document.getElementById('zoneAchats1-text').classList.toggle("checkedCheckbox", zone1Checked)
+ document.getElementById('zoneAchats2-text').classList.toggle("checkedCheckbox", zone2Checked)
+ } else if (nameZone == "zoneVentes") {
+ document.getElementById('zoneVentes1-text').classList.toggle("checkedCheckbox", zone1Checked)
+ document.getElementById('zoneVentes2-text').classList.toggle("checkedCheckbox", zone2Checked)
+ }
+ }
+
+ function exportFlux(flux) {
+ if (document.querySelector('[name="typeFlux"]:checked').value == "global") {
+ return ""
+ }
+
+ if (flux == "achats" && document.querySelector('#achats[name="fluxDetailles"]').checked) {
+ return {
+ typeMar: document.getElementById('natureMarAchats').value,
+ valeurAnnuelleAchats: document.querySelector('#div-fluxAchats #valeurAnnuelleAchats').value,
+ montant: document.querySelector('#montantAchats').value,
+ transport: document.querySelector('[name=moyenTransportAchats]:checked').value,
+ conditionnement: document.querySelector('#conditionnementAchats').value,
+ zone: document.querySelector('[name="zoneAchats"]:checked').value,
+ typeRG: document.getElementById('risqueGuerreAchats').checked ? document.querySelector('[name="typeGarantieRGVentes"]:checked').value : "",
+ engagementRG: document.getElementById('risqueGuerreAchats').checked ? document.getElementById('engagementRGAchats').value : "",
+ }
+ } else if (flux == "ventes" && document.querySelector('#ventes[name="fluxDetailles"]').checked) {
+ return {
+ typeMar: document.getElementById('natureMarVentes').value,
+ valeurAnnuelleVentes: document.querySelector('#div-fluxVentes #valeurAnnuelleVentes').value,
+ montant: document.querySelector('#div-fluxVentes #montantVentes').value,
+ transport: document.querySelector('[name=moyenTransportVentes]:checked').value,
+ conditionnement: document.querySelector('#conditionnementVentes').value,
+ zone: document.querySelector('[name="zoneVentes"]:checked').value,
+ typeRG: document.getElementById('risqueGuerreVentes').checked ? document.querySelector('[name="typeGarantieRGVentes"]:checked').value : "",
+ engagementRG: document.getElementById('risqueGuerreVentes').checked ? document.getElementById('engagementRGVentes').value : "",
+ }
+ } else {
+ return ""
+ }
+ }
+
+ function calcCard(modFranchise) {
+ const activite = document.getElementById('activite')
+ const montant = getMontantTotal()
+ const ca = getCA()
+ var franchiseTPPC
+ var franchiseExpo
+
+ var primeRO = calcPrimeRef(modFranchise)
+
+ const primeMini = calcPrimeMini(getPolice())
+ primeRO = (primeMini > primeRO) ? primeMini : primeRO
+
+
+ if (document.getElementById("TPPC").checked) {
+ const objTPPC = calcTPPC(primeRO)
+ franchiseTPPC = objTPPC['franchise']
+ primeRO += objTPPC['tppc']
+ }
+
+ if (document.getElementById('marEnExpo').checked) {
+ const objExpo = calcMarEnExpo(primeRO)
+ franchiseExpo = objExpo['franchise']
+ primeRO += objExpo['marEnExpo']
+ }
+
+ primeRG = calcRG()
+ primeRef = (primeRO + primeRG) * modFranchise
+
+ const modMontantCA = calcModMontantCA(montant, ca)
+ const modAct = calcModAct(activite.value)
+
+ const tauxRO = (primeRef / ca * 100).toFixed(3)
+ const tauxRG = (primeRG / ca * 100)
+
+ primeRef = parseFloat(primeRef.toFixed(2) || 0)
+
+ return {
+ pourcentAct: modAct,
+ pourcentMar: getModNatureMar(),
+ pourcentCA: modMontantCA,
+ pourcentFranchise: modFranchise,
+ franchiseTPPC: franchiseTPPC,
+ franchiseExpo: franchiseExpo,
+ proposition: primeRef,
+ tauxRG: tauxRG,
+ tauxRO: tauxRO
+ }
+ }
+
+ function calcPrimeAchats() {
+ if (isAchatsSelected()) {
+ const activite = document.getElementById('activite').value
+
+ const valeurAnnuelleAchats = document.getElementById('valeurAnnuelleAchats').value
+ const marchandise = document.getElementById('natureMarAchats').value
+ const conditionnement = document.querySelector('#conditionnementAchats').value
+ const zone = document.querySelector('[name="zoneAchats"]:checked')?.value
+ const transport = document.querySelector('[name="moyenTransportAchats"]:checked')?.value
+
+ if (marchandise && conditionnement && zone && transport && activite && valeurAnnuelleAchats) {
+
+ const modNatureMarAchats = calcModNatureMar(marchandise)
+ const modCond = calcModCond(conditionnement)
+ const modZoneTransp = calcModZoneTransp(zone, transport)
+ const taux = modNatureMarAchats * modCond * modZoneTransp
+ const primeAchats = valeurAnnuelleAchats * taux * 0.3
+ const coeffGlobal = calcModMontantCA(getMontantTotal(), getValeurAnnuelleTotal())
+
+ const modPolice = calcModPolice(getPolice())
+ const modAct = calcModAct(activite)
+ const coeffGeneraux = modPolice * modAct
+ const prime = coeffGeneraux * coeffGlobal * primeAchats
+
+ return prime
+ }
+ } else {
+ return false
+ }
+ }
+
+ function calcPrimeVentes() {
+ if (isVentesSelected()) {
+ const activite = document.getElementById('activite').value
+
+ const valeurAnnuelleVentes = document.getElementById('valeurAnnuelleVentes').value
+ const marchandise = document.getElementById('natureMarVentes').value
+ const conditionnement = document.querySelector('#conditionnementVentes').value
+ const zone = document.querySelector('[name="zoneVentes"]:checked')?.value
+ const transport = document.querySelector('[name="moyenTransportVentes"]:checked')?.value
+
+ if (marchandise && conditionnement && zone && transport && activite && valeurAnnuelleVentes) {
+
+ const modNatureMarVentes = calcModNatureMar(marchandise)
+ const modCond = calcModCond(conditionnement)
+ const modZoneTransp = calcModZoneTransp(zone, transport)
+ const taux = modNatureMarVentes * modCond * modZoneTransp
+ const modPolice = calcModPolice(getPolice())
+ const modAct = calcModAct(activite)
+ const primeVentes = valeurAnnuelleVentes * taux * 0.3
+
+ const sommeMontants = getMontantTotal()
+ const sommeValeurCA = getValeurAnnuelleTotal()
+
+ const coeffGlobal = calcModMontantCA(sommeMontants, sommeValeurCA)
+ const coeffGeneraux = modPolice * modAct
+ const prime = coeffGeneraux * coeffGlobal * primeVentes
+
+ return prime
+ }
+ }
+ }
+
+
+ /* STEP FUNCTIONS */
+ function stepPolice() {
+ if (getTypeFlux() !== "global") {
+ return false
+ }
+ const ca = getCA()
+ const modPolice = calcModPolice(getPolice())
+ const chip = document.getElementById("chip-step-police")
+ const stepPolice = (ca && modPolice) ? ca * modPolice : false
+ updateStepChip(chip, stepPolice)
+ return stepPolice
+ }
+
+ function stepActivite() {
+ if (getTypeFlux() !== "global") {
+ return false
+ }
+ const previousStep = stepPolice()
+
+ const activite = document.getElementById('activite').value
+ const modAct = calcModAct(activite)
+ const chip = document.getElementById("chip-step-activite")
+ const stepActivite = (previousStep && modAct) ? previousStep * modAct : false
+ updateStepChip(chip, stepActivite)
+ return stepActivite
+ }
+
+ function stepMarchandises() {
+ if (getTypeFlux() !== "global") {
+ return false
+ }
+
+ const previousStep = stepActivite()
+
+ const modTypeMar = calcModNatureMar(getTypeMar())
+ const modMontantCA = calcModMontantCA(getMontantTotal(), getCA())
+
+ const chip = document.getElementById("chip-step-marchandises")
+ const stepMarch = (previousStep && modMontantCA && modTypeMar) ? previousStep * modMontantCA * modTypeMar : false
+ updateStepChip(chip, stepMarch)
+ return stepMarch
+ }
+
+ function stepCond() {
+ if (getTypeFlux() !== "global") {
+ return false
+ }
+
+ const previousStep = stepMarchandises()
+ const modCond = calcModCond(document.querySelector('#conditionnementGlobal').value)
+ const chip = document.getElementById("chip-step-cond")
+ const stepCond = (previousStep && modCond) ? previousStep * modCond : false
+ updateStepChip(chip, stepCond)
+ return stepCond
+ }
+
+ function stepZone() {
+ if (getTypeFlux() !== "global") {
+ return false
+ }
+
+ const previousStep = stepCond()
+ const transport = document.querySelector('[name="moyenTransportGlobal"]:checked')?.value || false
+ const zone = document.querySelector('[name="zone"]:checked')?.value || false
+ const modZoneTransp = calcModZoneTransp(zone, transport)
+ const chip = document.getElementById("chip-step-zone")
+ const stepZone = (previousStep && modZoneTransp) ? previousStep * modZoneTransp : false
+ updateStepChip(chip, stepZone)
+ return stepZone
+ }
+
+
+ function stepAchats() {
+ const chip = document.getElementById("chip-step-achats")
+ var stepAchats = calcPrimeAchats()
+ if (document.getElementById('risqueGuerreAchats').checked && stepAchats) {
+ const engagement = parseFloat(document.getElementById('engagementRGAchats').value)
+ const zone = document.querySelector('[name="zoneAchats"]:checked').value
+ const typeRG = document.querySelector('[name="typeGarantieRGAchats"]:checked').value
+ if (engagement && zone && typeRG) {
+ taux = objModRG[zone][typeRG]
+ rg = engagement * taux
+ stepAchats += rg
+ }
+ }
+ updateStepChip(chip, stepAchats)
+ return stepAchats
+ }
+
+ function stepVentes() {
+ const chip = document.getElementById("chip-step-ventes")
+ var stepVentes = calcPrimeVentes()
+ if (document.getElementById('risqueGuerreVentes').checked && stepVentes) {
+ const engagement = parseFloat(document.getElementById('engagementRGVentes').value)
+ const zone = document.querySelector('[name="zoneVentes"]:checked').value
+ const typeRG = document.querySelector('[name="typeGarantieRGVentes"]:checked').value
+ if (engagement && zone && typeRG) {
+ taux = objModRG[zone][typeRG]
+ rg = engagement * taux
+ stepVentes += rg
+ }
+ }
+ updateStepChip(chip, stepVentes)
+ return stepVentes
+ }
+
+
+ function stepExtensions() {
+ const chip = document.getElementById("chip-step-extensions")
+ var previousStep, stepExtensions
+
+ if (getTypeFlux() == "global") {
+ previousStep = stepZone()
+ const tppc = (document.getElementById("TPPC").checked) ? calcTPPC(previousStep)['tppc'] : 0
+ const marEnExpo = (document.getElementById("marEnExpo").checked) ? calcMarEnExpo(previousStep)['marEnExpo'] : 0
+ const rg = calcRG()
+ stepExtensions = (previousStep && (tppc || marEnExpo || rg)) ? (previousStep + tppc + marEnExpo + rg) : false
+ } else if (getTypeFlux() == "detailles") {
+
+ previousStep = 0
+ previousStep += isVentesSelected() ? stepVentes() : 0
+ previousStep += isAchatsSelected() ? stepAchats() : 0
+ const tppc = (document.getElementById("TPPC").checked) ? calcTPPC(previousStep)['tppc'] : 0
+ const marEnExpo = (document.getElementById("marEnExpo").checked) ? calcMarEnExpo(previousStep)['marEnExpo'] : 0
+ stepExtensions = (previousStep && (tppc || marEnExpo)) ? (previousStep + tppc + marEnExpo) : false
+ }
+
+ updateStepChip(chip, stepExtensions)
+ return stepExtensions
+ }
+
+ function fillPropCard(idCard, cardData) {
+ const card = document.getElementById(idCard)
+ const pourcentageAct = parseFloat(cardData.pourcentAct * 100).toFixed(1)
+ const pourcentageMar = parseFloat((cardData.pourcentMar * 1000).toFixed(6))
+ const pourcentageCA = parseFloat(cardData.pourcentCA * 100).toFixed(2)
+ const pourcentageFranchise = parseFloat(cardData.pourcentFranchise * 100).toFixed(0)
+ const proposition = parseFloat(cardData.proposition).toFixed(2)
+ const franchiseTPPC = cardData.franchiseTPPC
+ const franchiseExpo = cardData.franchiseExpo
+
+ if (tarif && tarif.selectedFranchise && tarif.selectedFranchise == idCard) {
+ card.classList.add('selected-card')
+ }
+
+ card.querySelector("[id = mod-activite-" + idCard + "]").innerText = "Modulation Activité : " + pourcentageAct + "%"
+ card.querySelector("[id = mod-marchandise-" + idCard + "]").innerText = "Modulation Marchandise : " + pourcentageMar + "‰"
+ card.querySelector("[id = mod-ca-" + idCard + "]").innerText = "Modulation CA : " + pourcentageCA + "%"
+ card.querySelector("[id = mod-franchise-" + idCard + "]").innerText = "Modulation Franchise : " + pourcentageFranchise + "%"
+
+ const tppcElement = card.querySelector("[id = mod-tppc-" + idCard + "]")
+ const expoElement = card.querySelector("[id = mod-expo-" + idCard + "]")
+
+ if (franchiseTPPC) {
+ tppcElement.style.display = "block"
+ tppcElement.innerText = "Franchise TPPC : " + franchiseTPPC + " €"
+ } else {
+ tppcElement.style.display = "none"
+ }
+
+ if (franchiseExpo) {
+ expoElement.style.display = "block"
+ expoElement.innerText = "Franchise Expo : " + franchiseExpo + " €"
+ } else {
+ expoElement.style.display = "none"
+ }
+
+ document.getElementById("proposition-" + idCard).innerText = proposition + "€"
+ }
+
+ async function submitForm(selectedCardId) {
+ const typeFlux = getTypeFlux()
+ const tppc = document.getElementById("TPPC").checked
+ const rgGlobal = document.getElementById('rg').checked
+ const marEnExpo = document.getElementById("marEnExpo").checked
+ const selectedCard = extractPropoCard(selectedCardId)
+
+ const bodyTarif = {
+ fluxAchats: exportFlux("achats"),
+ fluxVentes: exportFlux("ventes"),
+ fluxIntersites: document.getElementById('intersites').checked,
+ typePolice: getPolice(),
+ typeRO: document.querySelector('[name="risqueOrdinaire"]:checked').value,
+ conditionnement: typeFlux == "global" ? document.querySelector('#conditionnementGlobal').value : "",
+ oldFranchise: document.getElementById('oldFranchise').value,
+ sinistres: document.getElementById('sinistres').value,
+ nbVehicTPPC: tppc ? document.getElementById("nbVehicTPPC").value : "",
+ typeFlux: typeFlux,
+ montantGarantir: typeFlux == "global" ? document.getElementById('montant').value : "",
+ engagementRG: (typeFlux == "global" && rgGlobal) ? document.getElementById('engagementRG').value : "",
+ franchise350: franchise350,
+ franchise750: franchise750,
+ sansFranchise: sansFranchise,
+ selectedFranchise: selectedCardId,
+ typeMarExpo: marEnExpo ? document.querySelector('[id="typeMarEnExpo"]').value : "",
+ commentaire: document.getElementById('commentaire').value,
+ zone: typeFlux == "global" ? document.querySelector('[name="zone"]:checked').value : "",
+ transport: typeFlux == "global" ? document.querySelector('[name="moyenTransportGlobal"]:checked').value : "",
+ asIf: extractAsIf()
+ }
+
+ const responseTarif = await fetch(`/fac/createTarif`, {
+ method: 'POST',
+ body: JSON.stringify(bodyTarif),
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+
+ const dataTarif = await responseTarif.json();
+
+ if (dataTarif.valid) {
+ const idTarif = dataTarif.fac.id
+
+ var cotRO = "", cotProvRO = "", cotRG = "", cotProvRG = "", rg = ""
+
+ cotRO = document.getElementById('tarifCom').value
+
+ if (contrat.type == "TEMPORAIRE") {
+ cotRG = calcRG().toFixed(2)
+ } else {
+ cotProvRO = document.getElementById('tarifCom').value
+ cotProvRG = calcRG().toFixed(2)
+ }
+
+ tauxCotRO = parseFloat(((document.getElementById('tarifCom').value / getCA()) * 100)).toFixed(3)
+ tauxCotRG = parseFloat((tauxCotRG * 100).toFixed(6))
+
+ if (getRisqueGuerre().length > 0) {
+ rg = "auto"
+ } else if (fac && fac.rg !== "auto") {
+ rg = fac.rg
+ }
+
+ const bodyFAC = {
+ projet: fac.projet || '',
+ tarif: idTarif,
+ nbVehicExpo: marEnExpo ? document.getElementById('nombreExposition').value : "",
+ actAssuree: document.getElementById('activite').value,
+ typeMar: getTypeMar(),
+ ca: getCA(),
+ typeRG: getRisqueGuerre(),
+ cotRO: cotRO,
+ cotProvRO: cotProvRO,
+ cotRG: cotRG,
+ cotProvRG: cotProvRG,
+ tauxCotRO: tauxCotRO,
+ tauxCotRG: tauxCotRG,
+ capitalExpo: marEnExpo ? document.querySelector('[id="capitalExposition"]').value : "",
+ franchiseExpo: (marEnExpo && selectedCard.franchiseExpo) ? selectedCard.franchiseExpo : "",
+ capitalTPPC: tppc ? document.querySelector('[id="capitalTPPC"]').value : "",
+ franchiseTPPC: (tppc && selectedCard.franchiseTPPC) ? selectedCard.franchiseTPPC : "",
+ zones: getZones(),
+ terrestre: getTransportTypeRO('terrestre'),
+ maritime: getTransportTypeRO('maritime'),
+ aerien: getTransportTypeRO('aerien'),
+ postal: getTransportTypeRO('postal'),
+ fluvial: "",
+ multimodal: getTransportTypeRO('multimodal'),
+ tppc: document.getElementById('TPPC').checked,
+ rg: rg,
+ primeHT: document.getElementById('tarifCom').value,
+ primeMini: calcPrimeMini(getPolice())
+ }
+
+ const responseFAC = await fetch(`/fac/create`, {
+ method: 'POST',
+ body: JSON.stringify(bodyFAC),
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+
+ const data = await responseFAC.json();
+
+ if (data.valid) {
+ const idProjet = data.fac.id;
+
+ const responseContratEnCours = await fetch(`/contrat/update/${contrat.produit}/${contrat.id}/${idProjet}`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+
+ const dataContratEnCours = await responseContratEnCours.json();
+
+ if (dataContratEnCours.valid) {
+
+ // Obtenir la date actuelle au format "JJ/MM/AAAA"
+ const currentDate = new Date();
+ const day = String(currentDate.getDate()).padStart(2, '0');
+ const month = String(currentDate.getMonth() + 1).padStart(2, '0'); // Les mois sont indexés à partir de 0, donc +1
+ const year = currentDate.getFullYear();
+ const formattedDate = `${day}/${month}/${year}`;
+
+ //Obtenir l'user
+ const token = localStorage.getItem('jwtToken');
+ const decoded = jwt_decode(token);
+ const userFirstName = decoded.userFirstName;
+ const userLastName = decoded.userLastName;
+
+ // Obtenir l'heure actuelle au format "HHhMM"
+ const hours = String(currentDate.getHours()).padStart(2, '0');
+ const minutes = String(currentDate.getMinutes()).padStart(2, '0');
+ const seconds = String(currentDate.getSeconds()).padStart(2, '0');
+ const formattedTime = `${hours}:${minutes}:${seconds}`;
+ const nom = userLastName;
+ const prenom = userFirstName;
+
+ // Mettre à jour le champ "historique" dans le contrat avec les nouvelles données d'historique
+ const historiqueData = [
+ {
+ "type": contrat.type,
+ "date": formattedDate,
+ "heure": formattedTime,
+ "produit": "FAC",
+ "id": idProjet,
+ "nom": nom,
+ "prenom": prenom,
+ }
+ ];
+
+ const responseHistoriqueUpdate = await fetch(`/contrat/update/historique/${contrat.id}`, {
+ method: 'POST',
+ body: JSON.stringify({historiqueData}),
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+
+ const dataHistoriqueUpdate = await responseHistoriqueUpdate.json();
+
+ if (dataHistoriqueUpdate.valid) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=projet`;
+ } else {
+ console.log('Echec lors de la mise à jour de l\'historique du contrat :', dataHistoriqueUpdate.message);
+ }
+ }
+ } else {
+ console.log('Echec lors de la création de la saisie dans la collection TPPC :', data.message);
+ }
+ } else {
+ console.log('Echec lors de la création de la saisie dans la collection FACtarif :', data.message);
+ }
+ }
+
+ function extractPropoCard(cardId) {
+ switch (cardId) {
+ case 'sansFranchise':
+ return sansFranchise
+ case 'franchise350':
+ return franchise350
+ case 'franchise750':
+ return franchise750
+ }
+ return null
+ }
+
+ function openModaleTarifCom(cardId) {
+ const franchise = extractPropoCard(cardId)
+ document.getElementById('tarifRefText').innerText = "Tarif de Référence : " + parseFloat(franchise.proposition).toFixed(2) + "€"
+ document.getElementById('tarifCom').value = ""
+ document.getElementById('commentaire').value = ""
+ document.getElementById('comm-OK').disabled = false
+ document.getElementById('tarifCom-error').style.display = "none"
+ document.getElementById('col-commentaire').style.display = "none"
+ document.getElementById('qualiteDiv').style.display = "none"
+
+ document.getElementById('comm-OK').name = cardId
+
+ document.getElementById('tarifCom').addEventListener('input', function () {
+ var qualitePrime
+ var emoji
+ var showComment
+
+ diff = 100 * parseFloat(document.getElementById('tarifCom').value / franchise.proposition)
+
+ if (diff < (100 + seuil) && diff > (100 - seuil)) {
+ emoji = "mood"
+ showComment = false
+
+ if (diff > 100) {
+ qualitePrime = "Tarif correct (+" + (diff - 100).toFixed(2) + "%)"
+ } else if (diff < 100) {
+ qualitePrime = "Tarif correct (-" + (100 - diff).toFixed(2) + "%)"
+ } else if (diff == 100) {
+ qualitePrime = "Le juste prix"
+ emoji = "thumb_up_alt"
+ }
+ } else {
+ emoji = "mood_bad"
+ showComment = true
+
+ if (diff > (100 + seuil)) {
+ qualitePrime = "Tarif trop élevé (+" + (diff - 100).toFixed(2) + "%)"
+ } else if (diff < (100 - seuil)) {
+ qualitePrime = "Tarif trop bas (-" + (100 - diff).toFixed(2) + "%)"
+ }
+ }
+
+ document.getElementById('qualiteDiv').style.display = "block"
+ document.getElementById('qualitePrime').innerText = qualitePrime
+ document.getElementById('modalTarifCom-icon').innerText = emoji
+ document.getElementById('modalTarifCom-icon').style.color = (emoji == "mood_bad") ? "red" : "green"
+
+ if (showComment) {
+ document.getElementById('tarifCom-error').style.display = "flex"
+ document.getElementById('col-commentaire').style.display = "flex"
+ if (document.getElementById('commentaire').value == "") {
+ document.getElementById('comm-OK').disabled = true
+ }
+ } else {
+ document.getElementById('comm-OK').disabled = false
+ document.getElementById('tarifCom-error').style.display = "none"
+ document.getElementById('col-commentaire').style.display = "none"
+ }
+ })
+
+ const modal = document.getElementById('modalTarifCom')
+ const instance = M.Modal.getInstance(modal);
+ instance.open();
+ }
+
+ // Exposer init globalement pour y accéder depuis l'extérieur
+ window.initSubmenuForm = init;
+})();
\ No newline at end of file
diff --git a/ecole/public/js/tarif-form-rc.js b/ecole/public/js/tarif-form-rc.js
new file mode 100644
index 00000000..b801f805
--- /dev/null
+++ b/ecole/public/js/tarif-form-rc.js
@@ -0,0 +1,1351 @@
+function initSubmenuForm() {
+ // Accéder aux informations stockées du parcours
+ const parcours = JSON.parse(sessionStorage.getItem('parcours'));
+}
+
+// Exposer initSubmenuForm globalement pour y accéder depuis l'extérieur
+window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollution de l'espace global
+(function() {
+ // Variables globales du module
+ let parcours, contrat, tppc, tarif, projet;
+
+ // Variables propositions
+ let franchise150, franchise300, mini150, mini300
+
+ //Variables modulos et liste
+ let objModAct, objModMar, objModFlotte, objModCot, objModSinistre, objPrimeMini, listTypeVehicule, objMarEnExpo
+
+ //variables modale tarif commercial
+ const seuil = 15
+
+ // Initialisation du formulaire et des données
+ function init() {
+
+ // Materialize init select
+ var select = document.querySelectorAll('select');
+ M.FormSelect.init(select);
+
+ // Materialize init Modal
+ var modals = document.querySelectorAll('.modal');
+ M.Modal.init(modals);
+
+ // Accéder aux informations stockées du parcours
+ parcours = JSON.parse(sessionStorage.getItem('parcours'));
+ contrat = JSON.parse(sessionStorage.getItem('contrat'));
+ tppc = contrat?.["@expand"]?.enCours || null;
+ tarif = tppc?.["@expand"]?.tarif || null;
+ projet = tppc?.["@expand"]?.projet || null;
+
+ console.log("Initialisation pour formulaire projet :", parcours);
+
+ // Appel des différentes fonctions d'initialisation
+ setupEventListeners();
+
+ //Appel des constantes JSON pour remplir les selects puis remplir les champs
+ constantsJSON().then(() => {
+ fillSelects();
+ populateFormData();
+ })
+ }
+
+ // Configuration des écouteurs d'événements
+ function setupEventListeners() {
+
+ document.getElementById('loadHistoriqueBtn').addEventListener('click', function() {
+ handleLoadHistoriqueBtn();
+ });
+
+ document.getElementById('btnAddTypeVehicule').addEventListener('click', function() {
+ const typeVehTarif = document.getElementById('typeVehTarif').value
+ const capitalTarif = document.getElementById('capitalTarif').value
+ const garTarif = document.getElementById('garTarif').value
+ const typeMarTarif = document.getElementById('typeMarTarif').value
+ const nbVehiculesTarif = document.getElementById('nbVehiculesTarif').value
+ const primeVehTarif = document.getElementById('primeVehTarif').value
+ const primeHTTarif = document.getElementById('primeHTTarif').value
+ const modulo = document.getElementById('modulo').value
+
+ addRowTarification(typeVehTarif, capitalTarif, garTarif, typeMarTarif, nbVehiculesTarif, primeVehTarif, primeHTTarif, modulo);
+
+ // Réinitialiser les valeurs de saisie
+ emptyRowTarification()
+ });
+
+ document.querySelectorAll('input[name=typeContrat]').forEach((element) =>
+ element.addEventListener('click', function() {
+ toggleTypeContrat(this.value)
+ if (tarif && tarif.montantSinistre !== undefined) {
+ document.getElementById('sinistre').value = tarif.montantSinistre
+ } else {
+ document.getElementById('sinistre').value = ""
+ }
+ checkSinistre()
+ }))
+
+ document.getElementById('capitalVehicule').addEventListener('input', function() {
+ validateField('capitalVehicule', true)
+ updateSubmitButtonState('tarifFormTPPC')
+ if (isSelected('marAnimaux') && this.value > 200000) {
+ openModaleAniViv()
+ }
+ })
+
+ document.getElementById('flotte').addEventListener('input', function () {
+ validateField('flotte', true)
+ updateSubmitButtonState('tarifFormTPPC')
+ const moduloChipFlotte = document.getElementById('chip-modulo-flotte')
+ updateModuloChip(moduloChipFlotte, calcModFlotte(this.value))
+ })
+
+ document.getElementById('marAssuree').addEventListener('change', function() {
+ updateMarAssuree()
+ })
+
+ document.querySelectorAll('input[type="checkbox"][name="garSouhaitees"]').forEach((checkbox) => {
+ checkbox.addEventListener('click', function() {
+ checkBennesGaranties()
+ })
+ })
+
+ document.getElementById('activite').addEventListener('change', function () {
+ validateField('activite', true)
+ updateSubmitButtonState('tarifFormTPPC')
+ checkActivite(this);
+ })
+
+ document.querySelectorAll('.franchise-card button').forEach((button) => button.addEventListener('click', function (e) {
+ e.preventDefault()
+ openModaleTarifCom(this.name)
+ }))
+
+ document.getElementById('bouton-grille').addEventListener('click', function() {
+ const modal = document.getElementById('modalGrille')
+ const instance = M.Modal.getInstance(modal)
+ instance.open()
+ })
+
+ document.getElementById('marEnExpo').addEventListener('change', function() {
+ document.getElementById('marEnExpo-div').style.display = (this.checked) ? "block" : "none"
+ })
+
+ document.querySelectorAll('input').forEach((element) => {
+ element.addEventListener('input', function () {
+ affichagePropositions();
+ })
+
+ element.addEventListener('change', function () {
+ affichagePropositions();
+ })
+ })
+
+ document.querySelectorAll('select').forEach((element) => {
+ element.addEventListener('change', function () {
+ affichagePropositions();
+ })
+ })
+
+ document.getElementById('comm-OK').addEventListener('click', function () {
+ submitForm(this.name)
+ })
+
+ document.getElementById('commentaire').addEventListener('input', function () {
+ if (document.getElementById('commentaire').value == "") {
+ document.getElementById('comm-OK').disabled = true
+ } else {
+ document.getElementById('comm-OK').disabled = false
+ }
+ })
+
+
+ setupTableEventListeners()
+ }
+
+ function setupTableEventListeners() {
+ const lignes = document.querySelectorAll('table#empTableTarifVehicules tr:not(#header)')
+
+ lignes.forEach((ligne) => {
+ const selectTypeMar = ligne.querySelector('select[name="typeMarTarif"]')
+ const selectGarChoisies = ligne.querySelector('select[name="garTarif"]')
+ const chipModulo = ligne.querySelector('div[name="moduloTarif"]')
+ const inputModulo = ligne.querySelector('input[name="modulo"]')
+ const inputPrimeVehicule = ligne.querySelector('input[name="primeVehTarif"]')
+ const inputPrimeHTTarif = ligne.querySelector('input[name="primeHTTarif"]')
+ const inputCapital = ligne.querySelector('input[name="capitalTarif"]')
+ const inputNbrVehicule = ligne.querySelector('input[name="nbVehiculesTarif"]')
+ const deleteButton = ligne.querySelector('.delete-btn')
+
+ inputPrimeVehicule.addEventListener('input', function () {
+ inputPrimeHTTarif.value = inputPrimeVehicule.value * inputNbrVehicule.value
+ })
+
+ inputNbrVehicule.addEventListener('input', function () {
+ inputPrimeHTTarif.value = inputPrimeVehicule.value * inputNbrVehicule.value
+ })
+
+ selectTypeMar.addEventListener('change', function() {
+ const moduloMar = calcModMar(this.value)
+ updateModuloChip(chipModulo, moduloMar)
+ inputModulo.value = moduloMar
+ })
+
+ inputCapital.addEventListener('input', function () {
+ inputPrimeVehicule.value = calcModCot(selectGarChoisies.value, inputCapital.value) || 0
+ inputPrimeHTTarif.value = inputPrimeVehicule.value * inputNbrVehicule.value
+ })
+
+ selectGarChoisies.addEventListener('change', function() {
+ inputPrimeVehicule.value = calcModCot(selectGarChoisies.value, inputCapital.value) || 0
+ inputPrimeHTTarif.value = inputPrimeVehicule.value * inputNbrVehicule.value
+ })
+
+ if (deleteButton !== null) {
+ deleteButton.addEventListener('click', function () {
+ deleteRow(this);
+ affichagePropositions();
+ });
+ }
+
+ ligne.querySelectorAll('select').forEach((select) => {
+ select.addEventListener('change', function() {
+ checkBennesGarantiesTarif(ligne)
+ affichagePropositions();
+ })
+ })
+
+ ligne.querySelectorAll('input').forEach((input) => {
+ input.addEventListener('input', function () {
+ checkBennesGarantiesTarif(ligne)
+ affichagePropositions();
+ })
+ })
+ })
+ }
+
+ //Appel pour recevoir les constantes
+ async function constantsJSON() {
+ try {
+ const responsesJSON = await Promise.all([
+ fetch('/tppc/modulo/activite'),
+ fetch('/tppc/modulo/marchandise'),
+ fetch('/tppc/modulo/flotte'),
+ fetch('/tppc/modulo/cotisation'),
+ fetch('/tppc/modulo/sinistre'),
+ fetch('/tppc/modulo/primeMini'),
+ fetch('/tppc/list/vehicule'),
+ fetch('/tppc/modulo/marEnExpo')
+ ]);
+ const jsonResponses = await Promise.all(responsesJSON.map(r => r.json())); // Récupérer toutes les réponses JSON
+
+ // Extraire la valeur objRetourne de chaque réponse
+ [
+ objModAct,
+ objModMar,
+ objModFlotte,
+ objModCot,
+ objModSinistre,
+ objPrimeMini,
+ listTypeVehicule,
+ objMarEnExpo
+ ] = jsonResponses.map(response => response.objRetourne); // Adapter pour extraire objRetourne
+ } catch (err) {
+ throw err;
+ }
+ }
+
+ //Remplissage des select et des champs avec les propositions
+ function fillSelects() {
+
+ //Remplissage des activites
+ const listeActiviteObj = {}
+
+ //Creation objets avec liste d'activité en clé, et null en valeur
+ for (const activite of Object.keys(objModAct)) {
+ listeActiviteObj[activite] = null
+ }
+ var elems = document.querySelectorAll('.autocomplete');
+ M.Autocomplete.init(elems, {
+ data: listeActiviteObj,
+ limit: 10
+ })
+
+ /******************************************/
+
+ //Remplissage des selects
+ const selectMar = document.getElementById('marAssuree')
+ const selectMarTarif = document.getElementById('typeMarTarif')
+ const selectMarEnExp = document.getElementById('typeMarEnExp')
+
+ //Fonction pour créer les select options
+ const optionCreator = (text, value) => {
+ let option = document.createElement('option')
+ option.value = value
+ option.text = text
+ return option
+ }
+
+ for (const [key, value] of Object.entries(objModMar)) {
+ if (value['tarif']) {
+ selectMar.add(optionCreator(value['tarif'], key))
+ selectMarTarif.add(optionCreator(value['tarif'], key))
+ }
+ }
+
+ for (const [key, value] of Object.entries(objMarEnExpo)) {
+ selectMarEnExp.add(optionCreator(value['nom'], key))
+ }
+
+ var select = document.querySelectorAll('select');
+ M.FormSelect.init(select);
+ }
+
+ //Remplissage des champs et des selects avec les données sauvegardées
+ function populateFormData() {
+
+ // Populate select historique
+ if (!contrat.historique) {
+ document.getElementById('historiqueDiv').style.display = "none";
+ } else {
+ document.getElementById('historiqueDiv').style.display = "block";
+
+ const idSelect = document.getElementById('idSelect');
+
+ contrat.historique.forEach(function(item) {
+ var option = document.createElement('option');
+ option.value = item.id;
+ option.textContent = item.type + " " + item.produit + " - " + item.date + " - " + item.heure;
+
+ if (item.nom != undefined && item.prenom != undefined) {
+ option.textContent += " - " + item.nom + " " + item.prenom;
+ }
+
+ idSelect.appendChild(option);
+ });
+ M.FormSelect.init(idSelect);
+ }
+
+ if (tppc.actAssuree) {
+ document.getElementById('activite').value = tppc.actAssuree
+ checkActivite(document.getElementById('activite'))
+ }
+
+ if (tppc.cotCapVeh) {
+ document.getElementById('capitalVehicule').value = tppc.cotCapVeh
+ }
+
+ if (tppc.nbVehic) {
+ document.getElementById('flotte').value = tppc.nbVehic
+ updateModuloChip(document.getElementById('chip-modulo-flotte'), calcModFlotte(tppc.nbVehic))
+ }
+
+ if (tppc.garanties) {
+ if (tppc.garanties.includes('HIAC')) {
+ document.getElementById('garSouhaitees-HIAC').checked = true
+ }
+ if (tppc.garanties.includes('Vol')) {
+ document.getElementById('garSouhaitees-vol').checked = true
+ }
+ }
+
+ // Remplissage des marchandises assurées
+
+ const marAssuree = []
+
+ if (tppc.marOrdinaires) {
+ document.querySelector('select#marAssuree option[value="marOrdinaires"]').selected = true;
+ marAssuree.push("marOrdinaires")
+ }
+ if (tppc.marBennes) {
+ document.querySelector('select#marAssuree option[value="marBennes"]').selected = true;
+ marAssuree.push("marBennes")
+ }
+ if (tppc.marDenreesHorsTemp) {
+ document.querySelector('select#marAssuree option[value="marDenreesHorsTemp"]').selected = true;
+ marAssuree.push("marDenreesHorsTemp")
+ }
+ if (tppc.marDenreesSousTemp) {
+ document.querySelector('select#marAssuree option[value="marDenreesSousTemp"]').selected = true;
+ marAssuree.push("marDenreesSousTemp")
+ }
+ if (tppc.marAuto) {
+ document.querySelector('select#marAssuree option[value="marAuto"]').selected = true;
+ marAssuree.push("marAuto")
+ }
+ if (tppc.marRisques) {
+ document.querySelector('select#marAssuree option[value="marRisques"]').selected = true;
+ marAssuree.push("marRisques")
+ }
+ if (tppc.marCiternes) {
+ document.querySelector('select#marAssuree option[value="marCiternes"]').selected = true;
+ marAssuree.push("marCiternes")
+ }
+ if (tppc.marEngins) {
+ document.querySelector('select#marAssuree option[value="marEngins"]').selected = true;
+ marAssuree.push("marEngins")
+ }
+ if (tppc.marAnimaux) {
+ document.querySelector('select#marAssuree option[value="marAnimaux"]').selected = true;
+ marAssuree.push("marAnimaux")
+ }
+
+ if (marAssuree.length > 0) {
+ updateMarAssuree()
+ }
+ M.FormSelect.init(document.querySelector('select#marAssuree'))
+
+ // Remplissage des marchandises en exposition
+
+ if(tppc.marEnExpo) {
+ document.getElementById('marEnExpo').checked = true
+ document.getElementById('marEnExpo-div').style.display = "block"
+ document.getElementById('nombreExposition').value = tppc.nbExpo
+ document.getElementById('capitalExposition').value = tppc.capExpo
+ document.querySelector('select#typeMarEnExp option[value="'+ tppc.typeMarExpo +'"]').selected = true;
+ }
+ M.FormSelect.init(document.querySelector('select#typeMarEnExp'))
+
+ if (tarif && tarif.typeContrat) {
+ //Si Le Parcours Possede Un Type De Contrat
+
+ toggleTypeContrat(tarif.typeContrat)
+ if (tarif.typeContrat == 'detaillee') {
+ document.getElementById('cotisationDetaillee').checked = true
+ document.getElementById('cotisationEnsemble').checked = false
+ } else if (tarif.typeContrat == 'ensemble') {
+ document.getElementById('cotisationDetaillee').checked = false
+ document.getElementById('cotisationEnsemble').checked = true
+ }
+ } else if (tppc.tarFlotte && tppc.tarFlotte.length > 0) {
+ // Si Le Parcours N'a Pas De Type De Contrat (Tarif) Mais Une flotte détaillée (Projet)
+
+ toggleTypeContrat('detaillee')
+ document.getElementById('cotisationDetaillee').checked = true
+ document.getElementById('cotisationEnsemble').checked = false
+ } else {
+ //Par Defaut
+ document.getElementById('cotisationDetaillee').checked = true
+ toggleTypeContrat('detaillee')
+ }
+
+ if (tarif && tarif.montantSinistre !== undefined && tarif.montantSinistre >= 0) {
+ document.getElementById('sinistre').value = tarif.montantSinistre
+ updateModuloChip(document.getElementById('chip-modulo-sinistre'), calcModSinistre(tarif.montantSinistre))
+ }
+
+ if (tppc.tarFlotte && Object.keys(tppc.tarFlotte).length !== 0) {
+ for (let i = 0; i < tppc.tarFlotte.length; i++) {
+ const row = tppc.tarFlotte[i];
+ addRowTarification(row.typeVehTarif, row.capitalTarif, row.garTarif, row.typeMarTarif, row.nbVehiculesTarif, row.primeVehTarif, row.primeHTTarif, row.modulo)
+ }
+ }
+
+ affichagePropositions()
+ }
+
+ function updateMarAssuree() {
+ const options = document.querySelectorAll('#marAssuree option:not([value=""])');
+
+ options.forEach((option) => {
+ if (option.selected) {
+ document.getElementById(option.value + '-chip').style.display = "inline-block"
+ } else {
+ document.getElementById(option.value + '-chip').style.display = "none"
+ }
+ })
+
+ const capitalVehicule = document.getElementById('capitalVehicule').value
+ if (isSelected('marAnimaux') && capitalVehicule > 200000) {
+ openModaleAniViv()
+ }
+
+ const selectedOpt = [...document.querySelectorAll('#marAssuree option:checked:not([value=""])')].map((option => option.value))
+ const moduloChipMarAssuree = document.getElementById('chip-modulo-marAssuree')
+
+ updateModuloChip(moduloChipMarAssuree, calcModMar(selectedOpt))
+ checkBennesGaranties()
+ }
+
+ function toggleTypeContrat(typeContrat) {
+ if (typeContrat == "ensemble") {
+ document.getElementById('row-tarification-vehicules').style.display = "none"
+ document.getElementById('card-tarif-mod-mar').style.display = "none"
+ document.getElementById('card-tarif-mod-mar').style.display = "none"
+
+ document.getElementById('col-capitalVehicule').style.display = "block"
+ document.getElementById('col-flotte').style.display = "block"
+ document.getElementById('col-marAssuree').style.display = "block"
+ document.getElementById('col-garSouhaitees').style.display = "block"
+ document.getElementById('card-tarif-par-vehicule').style.display = "block"
+ document.getElementById('card-nbr-vehicule').style.display = "block"
+ document.getElementById('card-tarif-mod').style.display = "none"
+
+ } else if (typeContrat == "detaillee") {
+ document.getElementById('row-tarification-vehicules').style.display = "block"
+ document.getElementById('card-tarif-mod-mar').style.display = "block"
+ document.getElementById('card-tarif-mod-mar').style.display = "block"
+ document.getElementById('card-tarif-mod').style.display = "block"
+ document.getElementById('col-capitalVehicule').style.display = "none"
+ document.getElementById('col-flotte').style.display = "none"
+ document.getElementById('col-marAssuree').style.display = "none"
+ document.getElementById('col-garSouhaitees').style.display = "none"
+ document.getElementById('card-tarif-par-vehicule').style.display = "none"
+ document.getElementById('card-nbr-vehicule').style.display = "none"
+ }
+ fillTarifCard('tarif-total-vehicule', 0.00)
+ }
+
+ function getGaranties() {
+ return [...document.querySelectorAll('[name = "garSouhaitees"]:checked')]
+ .map((garantie) => garantie.value)
+ .join('+')
+ }
+
+ function getGarantiesFromFlotte() {
+ const garSet = new Set();
+ const selectsArray = document.querySelectorAll('#empTableTarifVehicules tr:not(#header) [name="garTarif"]')
+ selectsArray.forEach((select) => {
+ select.value.split('+').forEach(garantie => garSet.add(garantie))
+ })
+ return [...garSet]
+ }
+
+ function calcModFlotte(flotte) {
+ if (flotte == "" || !validateField('flotte')) {
+ return null
+ }
+ flotte = parseFloat(flotte);
+ // Parcourir le JSON modFlotte pour trouver la valeur correspondante
+ for (let palier in objModFlotte) {
+ if (flotte <= parseFloat(palier)) {
+ return parseFloat(objModFlotte[palier]); // Retourner la valeur correspondante
+ }
+ }
+ return 1.00; // Par défaut, retourner 1.00 si aucune correspondance n'est trouvée
+ }
+
+ function calcModMar(marchandises) {
+ if (marchandises == "" || marchandises.length == 0) {
+ return null
+ }
+
+ if (typeof marchandises == "object") {
+ var modulo = 1
+ marchandises.forEach((mar) => {
+ modulo = parseFloat(modulo * objModMar[mar]['modulo'])
+ })
+
+ return modulo.toFixed(2)
+ } else {
+ return parseFloat(objModMar[marchandises]['modulo'])
+ }
+ }
+
+ function calcModAct(activite) {
+ if (activite == "") {
+ return null
+ }
+ if (!Object.keys(objModAct).includes(activite)) {
+ return null
+ }
+ return parseFloat(objModAct[activite])
+ }
+
+ function calcModCot(garanties, capital) {
+ const paliers = Object.keys(objModCot)
+ for (let maxMontant in paliers) {
+ if (capital <= parseFloat(paliers[maxMontant])) {
+ return parseFloat(objModCot[paliers[maxMontant]][garanties])
+ }
+ }
+ return null
+ }
+
+ function calcNbrVehiculesTotal() {
+ const lignes = document.querySelectorAll('#empTableTarifVehicules tr:not(#header)')
+ var nbrVehicules = 0
+
+ lignes.forEach((ligne) => {
+ nbrVehicules += parseInt(ligne.querySelector("[name='nbVehiculesTarif']").value)
+ })
+
+ return nbrVehicules
+ }
+
+ function calcPrimeMinimum(prime) {
+ if (prime <= objPrimeMini["IAC + Vol"]) {
+ if (document.getElementById('garSouhaitees-vol').checked) { //SI IAC + HIAC + VOL ou IAC + VOL
+ return parseFloat(objPrimeMini["IAC + Vol"])
+ } else { //SI IAC + HIAC ou IAC
+ return parseFloat(objPrimeMini["IAC + HIAC"])
+ }
+ } else {
+ return prime
+ }
+ }
+
+ function calcPrimeTotaleHT() {
+ const lignes = document.querySelectorAll('#empTableTarifVehicules tr:not(#header)')
+ var cotBase = 0
+
+ lignes.forEach((ligne) => {
+ const primeHT = parseFloat(ligne.querySelector('[name="primeHTTarif"]').value) || 0
+ cotBase += primeHT
+ })
+
+ return cotBase.toFixed(2)
+ }
+
+ function calcPrimeTotaleHTModulee() {
+ const lignes = document.querySelectorAll('#empTableTarifVehicules tr:not(#header)')
+ var cotBrute = 0
+
+ lignes.forEach((ligne) => {
+ const modMarchandise = ligne.querySelector('input[name="modulo"]').value || 0
+ const primeHT = ligne.querySelector('[name="primeHTTarif"]').value || 0
+ const primeModulee = primeHT * modMarchandise
+ cotBrute += primeModulee
+ })
+
+ return cotBrute.toFixed(2)
+ }
+
+ function calcPrimeMoyenne() {
+ const nbrVehicules = document.getElementById('flotte').value
+ const capital = document.getElementById('capitalVehicule').value
+ const selectedOpt = [...document.querySelectorAll('#marAssuree option:checked:not([value=""])')].map((option => option.value))
+
+ const tarifVehicule = calcModCot(getGaranties(), capital)
+ const prime = tarifVehicule * nbrVehicules
+
+ const moduloAct = calcModAct(document.getElementById('activite').value)
+ const moduloMar = calcModMar(selectedOpt)
+ const moduloCA = 1
+ const moduloFlotte = calcModFlotte(document.getElementById('flotte').value)
+ const coeffMoyen = moduloFlotte > moduloCA ? moduloCA : moduloFlotte
+
+ return Number.parseInt(prime * coeffMoyen * moduloAct * moduloMar).toFixed(2)
+ }
+
+ function calcPrimeMoyenneTarif() {
+ const moduloFlotte = calcModFlotte(calcNbrVehiculesTotal())
+ const moduloCA = 1
+ const moduloAct = calcModAct(document.getElementById('activite').value)
+ const coeffMoyen = moduloFlotte > moduloCA ? moduloCA : moduloFlotte
+ const cotMarchandise = calcPrimeTotaleHTModulee()
+
+ return Number.parseFloat(cotMarchandise * coeffMoyen * moduloAct)
+ }
+
+ function calcModSinistre(sinistre) {
+ const pourcentages = Object.keys(objModSinistre).map(Number).sort() //Récupération, conversion en float puis classement des pourcentages
+ const cotDetaillee = document.getElementById('cotisationDetaillee').checked
+ const primeMoyenne = cotDetaillee ? calcPrimeMoyenneTarif() : calcPrimeMoyenne()
+ sinistre = parseFloat(sinistre)
+
+ if ((primeMoyenne == 0 && sinistre == 0)) {
+ return 1.00
+ } else if (sinistre < (primeMoyenne * pourcentages[0])) { //- que 40% de la prime
+ return objModSinistre[pourcentages[0]]
+ } else if ((sinistre >= (primeMoyenne * pourcentages[0])) && (sinistre < (primeMoyenne * pourcentages[1]))) { //entre 40 et 70% de la prime
+ return objModSinistre[pourcentages[1]]
+ } else if ((sinistre >= (primeMoyenne * pourcentages[1])) && (sinistre <= (primeMoyenne * pourcentages[2]))) { //entre 40 et 70% de la prime
+ return objModSinistre[pourcentages[2]]
+ } else if (sinistre > primeMoyenne || sinistre == '') { //superieur à la prime
+ return null
+ } else {
+ return 1.00
+ }
+ }
+
+ function updateModuloChip(elementModulo, valeur) {
+ if (valeur == null) {
+ elementModulo.style.display = "none"
+ } else {
+ elementModulo.style.display = "inline-block"
+ const titreModulo = elementModulo.innerText.split(' : ')[0]
+ elementModulo.innerText = titreModulo + ' : x' + valeur
+ }
+ }
+
+ function checkBennesGaranties() {
+ const caseHIAC = document.querySelector('input[name="garSouhaitees"][value="HIAC"]')
+ const caseVol = document.querySelector('input[name="garSouhaitees"][value="Vol"]')
+
+ if (document.querySelector('#marAssuree option[value="marBennes"]:checked') !== null) {
+ const textError = "Vous ne pouvez choisir la garantie tous risques avec pour marchandise assurée : Bennes"
+
+ if (caseHIAC.checked && caseVol.checked) {
+ caseHIAC.checked = false
+ caseVol.checked = false
+ document.getElementById('garSouhaitees-error').innerText = textError
+ document.getElementById('garSouhaitees-error').style.display = "block"
+ } else if (caseHIAC.checked || caseVol.checked) {
+ document.getElementById('garSouhaitees-error').innerText = textError
+ document.getElementById('garSouhaitees-error').style.display = "block"
+ if (caseHIAC.checked) {
+ caseVol.disabled = true
+ } else if (caseVol.checked) {
+ caseHIAC.disabled = true
+ }
+ } else if (!caseHIAC.checked && !caseVol.checked) {
+ caseHIAC.disabled = false
+ caseVol.disabled = false
+ document.getElementById('garSouhaitees-error').innerText = ""
+ }
+ } else {
+ document.getElementById('garSouhaitees-error').innerText = ""
+ caseHIAC.disabled = false
+ caseVol.disabled = false
+ }
+ }
+
+ function checkSinistre() {
+ const inputSinistre = document.getElementById('sinistre')
+ if (validateField('sinistre'), true) {
+ updateSubmitButtonState('tarifFormTPPC')
+
+ if (inputSinistre.value !== "") {
+ const errorElement = document.getElementById('sinistre-error')
+ const modSinistre = calcModSinistre(inputSinistre.value)
+ const moduloChipSinistre = document.getElementById('chip-modulo-sinistre')
+ updateModuloChip(moduloChipSinistre, modSinistre)
+
+ if (projet && projet.antSin !== undefined && projet.antSin !== "" && (projet.antSin == 0 && inputSinistre.value > 0)) {
+ errorElement.textContent = "Vous avez renseigné " + projet.antSin + " antécédent"
+ errorElement.style.display = "block"
+ return true
+ }
+
+ if (modSinistre == null) {
+ errorElement.textContent = "Le montant d'antécédent de sinistre est supérieur au montant de la prime"
+ errorElement.style.display = "block"
+ return false
+ } else {
+ errorElement.textContent = ""
+ errorElement.style.display = "none"
+ return true
+ }
+ } else {
+ return false
+ }
+ }
+ }
+
+ function checkBennesGarantiesTarif(row) {
+ const typeVehicule = row.querySelector("input[name = typeVehTarif]")
+ const typeMar = row.querySelector("select[name = typeMarTarif]")
+ const garSouscrites = row.querySelector("select[name = garTarif]")
+
+ const regex = /\bbenne\b|\b.*benne.*\b/i;
+
+
+ if ((typeVehicule.value.match(regex) || typeMar.value == "marBennes")) {
+ garSouscrites.querySelector('[value="IAC+HIAC+Vol"]').disabled = true
+ typeMar.querySelector('[value="marBennes"]').disabled = false
+
+ if (garSouscrites.value == "IAC+HIAC+Vol") {
+ garSouscrites.value = ""
+ document.getElementById("message-BenneTousRisques").style.display = "block"
+ }
+
+ } else if (garSouscrites.value == "IAC+HIAC+Vol") {
+ typeMar.querySelector('[value="marBennes"]').disabled = true
+
+ } else {
+ typeMar.querySelector('[value="marBennes"]').disabled = false
+ garSouscrites.querySelector('[value="IAC+HIAC+Vol"]').disabled = false
+ document.getElementById("message-BenneTousRisques").style.display = "none"
+ }
+
+ var select = row.querySelectorAll('select');
+ M.FormSelect.init(select);
+ }
+
+ function checkActivite(input) {
+ const errorElement = document.getElementById('activite-error')
+ const moduloChipAct = document.getElementById('chip-modulo-activite')
+ if (Object.keys(objModAct).includes(input.value)) {
+ errorElement.textContent = ""
+ errorElement.style.display = "none"
+ updateModuloChip(moduloChipAct, calcModAct(input.value))
+ return true
+ } else {
+ errorElement.textContent = "Veuillez selectionner une activité parmi la liste"
+ errorElement.style.display = "block"
+ updateModuloChip(moduloChipAct, null)
+ return false
+ }
+ }
+
+ function openModaleAniViv() {
+ const elem = document.getElementById('modalAnimauxVivants');
+ const instance = M.Modal.getInstance(elem);
+ instance.open();
+ }
+
+ function handleLoadHistoriqueBtn() {
+ var selectedId = document.getElementById('idSelect').value;
+
+ if (selectedId != "") {
+ fetch(`/contrat/update/${contrat.produit}/${contrat.id}/${selectedId}`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ })
+ .then(response => response.json())
+ .then(data => {
+ if (data.valid) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=projet`;
+ } else {
+ console.log('Echec lors de la mise à jour de la relation id contrat - id client :', data);
+ }
+ });
+ }
+ }
+
+ function addRowTarification(typeVehTarif, capitalTarif, garTarif, typeMarTarif, nbVehiculesTarif, primeVehTarif, primeHTTarif, modulo) {
+ const table = document.getElementById('empTableTarifVehicules');
+ const newRow = table.insertRow(table.rows.length - 1);
+ const emptyRow = `
+
+
+
+
+
+
+
+
+
+ Garanties souscrites:
+
+ IAC
+ IAC + Hors IAC
+ IAC + Vol
+ IAC + hors IAC + Vol
+
+
+
+
+ Type de marchandise:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Mod. Marchandise : x2
+
+
+
+
+
+ delete
+
+
+ `
+
+ //Création de l'élément HTML
+ newRow.innerHTML = emptyRow
+
+ //Remplissage des Selects
+ newRow.querySelector('[name = typeMarTarif]').innerHTML = document.querySelector('tr[id=inputRow] select[name = typeMarTarif]').innerHTML
+ newRow.querySelector('[name = garTarif]').innerHTML = document.querySelector('tr[id=inputRow] select[name = garTarif]').innerHTML
+
+ //Ajout des valeurs
+ newRow.querySelector('[name = capitalTarif]').value = capitalTarif
+ newRow.querySelector('[name = garTarif]').value = garTarif
+ newRow.querySelector('[name = typeMarTarif]').value = typeMarTarif
+ newRow.querySelector('[name = nbVehiculesTarif]').value = nbVehiculesTarif
+ newRow.querySelector('[name = primeVehTarif]').value = primeVehTarif
+ newRow.querySelector('[name = primeHTTarif]').value = primeHTTarif
+ newRow.querySelector('[name = typeVehTarif]').value = typeVehTarif
+
+ const moduloInput = newRow.querySelector('[name = modulo]')
+ const moduloChip = newRow.querySelector('[name = moduloTarif]')
+ moduloInput.value = modulo
+ updateModuloChip(moduloChip, modulo)
+
+ var select = document.querySelectorAll('select');
+ M.FormSelect.init(select);
+
+ checkBennesGarantiesTarif(newRow)
+ emptyRowTarification()
+ setupTableEventListeners()
+ }
+
+ // Supprimer une ligne du tableau
+ function deleteRow(btn) {
+ const row = btn.parentElement.parentElement;
+ if (row.parentElement) {
+ row.parentElement.removeChild(row);
+ }
+ }
+
+ function emptyRowTarification() {
+ document.querySelector('[id = typeVehTarif]').value = ""
+ document.querySelector('[id = capitalTarif]').value = ""
+ document.querySelector('[id = garTarif]').value = ""
+ document.querySelector('[id = typeMarTarif]').value = ""
+ document.querySelector('[id = nbVehiculesTarif]').value = 0
+ document.querySelector('[id = primeVehTarif]').value = ""
+ document.querySelector('[id = primeHTTarif]').value = ""
+ document.querySelector('[id = modulo]').value = ""
+ document.querySelector('[id = modulo-mar-tarif-0]').style.display = "none"
+
+ checkBennesGarantiesTarif(document.getElementById('inputRow'))
+
+ var select = document.querySelectorAll('select');
+ M.FormSelect.init(select);
+ }
+
+ function fillPropCard(idCard, cardData) {
+ const card = document.getElementById(idCard)
+ const pourcentageAct = parseFloat(cardData.pourcentAct).toFixed(0)
+ const pourcentageMar = parseFloat(cardData.pourcentMar).toFixed(0)
+ const pourcentageFlotteCA = parseFloat(cardData.pourcentFlotteCA).toFixed(0)
+ const pourcentageFranchise = parseFloat(cardData.pourcentFranchise).toFixed(0)
+ const primeVehicule = parseFloat(cardData.primeVehicule).toFixed(2)
+ const proposition = parseFloat(cardData.proposition).toFixed(2)
+ const franchiseMarExpo = cardData.franchiseMarExpo
+
+ if (tarif && tarif.franchiseId && tarif.franchiseId == idCard) {
+ card.classList.add('selected-card')
+ }
+
+ card.querySelector("[id = mod-activite-" + idCard + "]").innerText = "Modulation Activité : +" + pourcentageAct + "%"
+
+ if (document.getElementById('cotisationDetaillee').checked) {
+ card.querySelector("[id = mod-marchandise-" + idCard + "]").style.display = "none"
+ } else {
+ card.querySelector("[id = mod-marchandise-" + idCard + "]").style.display = "block"
+ card.querySelector("[id = mod-marchandise-" + idCard + "]").innerText = "Modulation Marchandise : " + pourcentageMar + "%"
+ }
+
+ card.querySelector("[id = mod-ca-" + idCard + "]").innerText = "Modulation Flotte : " + pourcentageFlotteCA + "%"
+ card.querySelector("[id = mod-franchise-" + idCard + "]").innerText = "Modulation Franchise : " + pourcentageFranchise + "%"
+ card.querySelector("[id = prime-vehicule-" + idCard + "]").innerText = "Prime par véhicule : " + primeVehicule + "€"
+ document.getElementById("proposition-" + idCard).innerText = proposition + "€"
+ }
+
+ function fillTarifCard(idTarif, valeur) {
+ if (valeur == NaN || valeur == "NaN") {
+ valeur = 0
+ }
+ document.getElementById(idTarif).innerText = Number.parseFloat(valeur).toFixed(2) + " €"
+ }
+
+ function calcTarifCards() {
+ if (document.getElementById('cotisationDetaillee').checked) {
+ const tarifTousVehicules = calcPrimeTotaleHT() || 0
+ const tarifModuleMar = calcPrimeTotaleHTModulee() || 0
+ const primeMoyenne = calcPrimeMoyenneTarif() || 0
+ const moduloSinistre = calcModSinistre(document.getElementById('sinistre').value) || 1
+ const tarifModule = primeMoyenne * moduloSinistre
+
+ fillTarifCard('tarif-total-vehicule', tarifTousVehicules)
+ fillTarifCard('tarif-mod-mar', tarifModuleMar)
+ fillTarifCard('tarif-mod', tarifModule)
+
+ } else {
+ const inputCapital = document.getElementById('capitalVehicule')
+ const inputNbrVehicules = document.getElementById('flotte')
+ const tarifVehicule = calcModCot(getGaranties(), inputCapital.value)
+ const tarifTousVehicules = tarifVehicule * inputNbrVehicules.value
+ const tarifModule = calcPrimeMoyenne() || 0
+
+ fillTarifCard('tarif-par-vehicule', tarifVehicule)
+ fillTarifCard('tarif-total-vehicule', tarifTousVehicules)
+ fillTarifCard('tarif-nbr-vehicule', tarifModule)
+ }
+ }
+
+ function calcCard(modFranchise) {
+ const selectedOpt = [...document.querySelectorAll('#marAssuree option:checked:not([value=""])')].map((option => option.value))
+
+ const moduloAct = calcModAct(document.getElementById('activite').value) || 1
+ const moduloMar = calcModMar(selectedOpt) || 1
+ const moduloCA = 1
+ const moduloSinistre = calcModSinistre(document.getElementById('sinistre').value) || 1
+ var marEnExpo = 0
+ var franchiseMarExpo = ""
+
+ const cotDetaillee = document.getElementById('cotisationDetaillee').checked
+
+ var primeMoyenne, moduloFlotte, primeVehicule, flotte
+
+ if (cotDetaillee) {
+ primeMoyenne = calcPrimeMoyenneTarif()
+ moduloFlotte = calcModFlotte(calcNbrVehiculesTotal()) || 1
+ flotte = calcNbrVehiculesTotal()
+ } else {
+ primeMoyenne = calcPrimeMoyenne()
+ moduloFlotte = calcModFlotte(document.getElementById('flotte').value) || 1
+ flotte = document.getElementById('flotte').value || 1
+ }
+
+ const modFlotteCa = moduloCA > moduloFlotte ? moduloFlotte : moduloCA
+ const pourcentAct = ((100 - (parseFloat(moduloAct) * 100)) * (-1)).toFixed(0) || 0
+ const pourcentMar = ((100 - (parseFloat(moduloMar) * 100)) * (-1)).toFixed(0) || 0
+ const pourcentFranchise = ((100 - (parseFloat(modFranchise) * 100)) * (-1)).toFixed(0) || 0
+ const pourcentFlotteCA = ((100 - (parseFloat(modFlotteCa) * 100)) * (-1)).toFixed(0) || 0
+ var proposition = calcPrimeMinimum((primeMoyenne * moduloSinistre) * modFranchise) || 0
+
+
+ // Calcul de la majoration en exposition
+ if (document.getElementById('marEnExpo').checked) {
+ const nbExpo = document.getElementById('nombreExposition').value
+ const capital = document.getElementById('capitalExposition').value
+ const type = document.getElementById('typeMarEnExp').value
+
+ if (nbExpo && capital && type) {
+ if (nbExpo > 3 || capital > 50000) {
+ marEnExpo = nbExpo * capital * objMarEnExpo[type]['modulo'] / 100
+ marEnExpo = marEnExpo > proposition * 0.1 ? proposition * 0.1 : marEnExpo
+ franchiseMarExpo = "mini150"
+ } else {
+ marEnExpo = proposition * 0.1 < 150 ? proposition * 0.1 : 150
+ franchiseMarExpo = "500"
+ }
+ }
+ }
+ proposition = (proposition + marEnExpo).toFixed(2)
+ primeVehicule = (proposition / flotte).toFixed(2) || 0
+
+ return {
+ pourcentAct: pourcentAct,
+ pourcentMar: pourcentMar,
+ pourcentFlotteCA: pourcentFlotteCA,
+ pourcentFranchise: pourcentFranchise,
+ primeVehicule: primeVehicule,
+ proposition: proposition,
+ franchiseMarExpo: franchiseMarExpo
+ }
+ }
+
+ function affichagePropositions() {
+ const actIsIncorrect = (calcModAct(document.getElementById('activite').value) == null)
+ const sinIsIncorrect = checkSinistre() == false
+ const marIsEmpty = isMarAssureeEmpty()
+
+ document.getElementById('row-champsManquants').style.display = (actIsIncorrect || sinIsIncorrect || marIsEmpty) ? "block" : "none"
+ document.getElementById('propositions').style.display = (actIsIncorrect || sinIsIncorrect || marIsEmpty) ? "none" : "block"
+
+ // AFFICHAGE DES CHIPS D'ERREUR
+ document.getElementById('chip-sinistre').style.display = sinIsIncorrect ? "inline-block" : "none"
+ document.getElementById('chip-act').style.display = actIsIncorrect ? "inline-block" : "none"
+ document.getElementById('chip-marAssuree').style.display = marIsEmpty ? "inline-block" : "none"
+
+ if (actIsIncorrect == false || sinIsIncorrect == false) {
+ franchise150 = (calcCard(1));
+ fillPropCard(
+ '150',
+ franchise150
+ );
+ franchise300 = (calcCard(0.75));
+ fillPropCard(
+ '300',
+ franchise300
+ );
+ mini150 = (calcCard(0.7));
+ fillPropCard(
+ 'mini150',
+ mini150
+ );
+ mini300 = (calcCard(0.65));
+ fillPropCard(
+ 'mini300',
+ mini300
+ );
+ calcTarifCards();
+ }
+ }
+
+ function extractTarifTableau(selectedCardId) {
+ const jsonArr = [];
+ const table = document.getElementById("empTableTarifVehicules");
+
+ if (table && document.getElementById("cotisationDetaillee").checked) {
+ const rows = table.querySelectorAll('tr:not(:first-child)');
+
+ rows.forEach(row => {
+ const inputs = row.querySelectorAll(' input:not(.select-dropdown.dropdown-trigger), select');
+ const allInputsEmpty = Array.from(inputs).every(input => input.value == '' || input.value == 0);
+
+ if (!allInputsEmpty) {
+ const dataObj = {};
+ inputs.forEach(input => {
+ const fieldName = input.getAttribute('name');
+ if (fieldName) {
+ const fieldValue = input.value || "Non défini";
+ dataObj[fieldName] = fieldValue;
+ }
+ });
+
+ const selectedFranchise = extractPropoCard(selectedCardId)
+
+ const moduloTotale = (1 + parseFloat(selectedFranchise.pourcentFranchise) / 100) *
+ (1 + parseFloat(selectedFranchise.pourcentAct)/100) *
+ (1 + parseFloat(selectedFranchise.pourcentFlotteCA) / 100)
+
+ dataObj['primeVehModRefTarif'] = (moduloTotale * dataObj['primeVehTarif']).toFixed(2)
+ dataObj['primeHTModRefTarif'] = (moduloTotale * dataObj['primeHTTarif']).toFixed(2)
+
+ jsonArr.push(dataObj);
+ }
+ });
+ return jsonArr;
+ }
+ return "[]"; // Retourne un tableau JSON vide si aucune saisie n'est trouvée dans le tableau
+ }
+
+ function extractPropoCard(idCard) {
+ switch (idCard) {
+ case '150':
+ return franchise150
+ case '300':
+ return franchise300
+ case 'mini150':
+ return mini150
+ case 'mini300':
+ return mini300
+ }
+ return null
+ }
+
+ function isSelected(marchandise) {
+ const cotDetaillee = document.getElementById('cotisationDetaillee').checked
+ if (cotDetaillee) {
+ const selectedOpt = [...document.querySelectorAll('#empTableTarifVehicules [name="typeMarTarif"] ')].map((option => option.value))
+ return selectedOpt.includes(marchandise)
+ } else {
+ const selectedOpt = [...document.querySelectorAll('#marAssuree option:checked:not([value=""])')].map((option => option.value))
+ return selectedOpt.includes(marchandise)
+ }
+ }
+
+ function isMarAssureeEmpty() {
+ const cotDetaillee = document.getElementById('cotisationDetaillee').checked
+ var selectedOpt
+ if (cotDetaillee) {
+ selectedOpt = document.querySelectorAll('#empTableTarifVehicules [name="typeMarTarif"] option:checked:not([value=""]) ')
+ } else {
+ selectedOpt = document.querySelectorAll('#marAssuree option:checked:not([value=""])')
+ }
+ return selectedOpt.length == 0
+ }
+
+ function openModaleTarifCom(cardId) {
+ const franchise = extractPropoCard(cardId)
+ document.getElementById('tarifRefText').innerText = "Tarif de Référence : " + franchise.proposition + "€"
+ document.getElementById('tarifCom').value = ""
+ document.getElementById('commentaire').value = ""
+ document.getElementById('comm-OK').disabled = false
+ document.getElementById('tarifCom-error').style.display = "none"
+ document.getElementById('col-commentaire').style.display = "none"
+ document.getElementById('qualiteDiv').style.display = "none"
+ document.getElementById('comm-OK').name = cardId
+
+ document.getElementById('tarifCom').addEventListener('input', function() {
+ var qualitePrime
+ var emoji
+ var showComment
+
+ diff = 100 * parseFloat(document.getElementById('tarifCom').value / franchise.proposition)
+
+ if (diff < (100 + seuil) && diff > (100 - seuil)) {
+ emoji = "mood"
+ showComment = false
+
+ if (diff > 100) {
+ qualitePrime = "Tarif correct (+" + (diff - 100).toFixed(2) + "%)"
+ } else if (diff < 100) {
+ qualitePrime = "Tarif correct (-" + (100 - diff).toFixed(2) + "%)"
+ } else if (diff == 100) {
+ qualitePrime = "Le juste prix"
+ emoji = "thumb_up_alt"
+ }
+ } else {
+ emoji = "mood_bad"
+ showComment = true
+
+ if (diff > (100 + seuil)) {
+ qualitePrime = "Tarif trop élevé (+" + (diff - 100).toFixed(2) + "%)"
+ } else if (diff < (100 - seuil)) {
+ qualitePrime = "Tarif trop bas (-" + (100 - diff).toFixed(2) + "%)"
+ }
+ }
+
+ document.getElementById('qualiteDiv').style.display = "block"
+ document.getElementById('qualitePrime').innerText = qualitePrime
+ document.getElementById('modalTarifCom-icon').innerText = emoji
+ document.getElementById('modalTarifCom-icon').style.color = (emoji == "mood_bad") ? "red" : "green"
+
+ if (showComment) {
+ document.getElementById('tarifCom-error').style.display = "flex"
+ document.getElementById('col-commentaire').style.display = "flex"
+ if (document.getElementById('commentaire').value == "") {
+ document.getElementById('comm-OK').disabled = true
+ }
+ } else {
+ document.getElementById('comm-OK').disabled = false
+ document.getElementById('tarifCom-error').style.display = "none"
+ document.getElementById('col-commentaire').style.display = "none"
+ }
+ })
+
+ const modal = document.getElementById('modalTarifCom')
+ const instance = M.Modal.getInstance(modal);
+ instance.open();
+ }
+
+ // Gérer la soumission du formulaire
+ async function submitForm(selectedCardId) {
+ const cotDetaillee = document.getElementById('cotisationDetaillee').checked
+ const bodyTarif = {
+ montantSinistre: document.getElementById('sinistre').value,
+ franchise150: franchise150,
+ franchise300: franchise300,
+ franchiseMini150: mini150,
+ franchiseMini300: mini300,
+ franchiseId: selectedCardId,
+ tarifRef: extractPropoCard(selectedCardId).proposition,
+ typeContrat: document.querySelector('[name="typeContrat"]:checked').value,
+ }
+
+ const responseTarif = await fetch(`/tppc/createTarif`, {
+ method: 'POST',
+ body: JSON.stringify(bodyTarif),
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+
+ const dataTarif = await responseTarif.json();
+
+ if (dataTarif.valid) {
+ const idTarif = dataTarif.tarif.id
+ const bodyTPPC = {
+ actAssuree: document.getElementById('activite').value,
+ cotCapVeh: cotDetaillee ? '' : document.getElementById('capitalVehicule').value,
+ tarFlotte: extractTarifTableau(selectedCardId),
+ nbVehic: cotDetaillee ? '' : document.getElementById('flotte').value,
+ garanties: cotDetaillee ? getGarantiesFromFlotte() : [...document.querySelectorAll('[name = "garSouhaitees"]:checked')].map((select) => select.value),
+ tarif: idTarif,
+ projet: tppc.projet || '',
+ primeHT: document.getElementById('tarifCom').value,
+ commentaire: document.getElementById('commentaire').value,
+ marOrdinaires: isSelected('marOrdinaires'),
+ marBennes: isSelected('marBennes'),
+ marDenreesHorsTemp: isSelected('marDenreesHorsTemp'),
+ marRisques: isSelected('marRisques'),
+ marEngins: isSelected('marEngines'),
+ marFranchise: tppc.marFranchise || '',
+ marEnExpo: document.getElementById('marEnExpo').checked,
+ marCiternes: isSelected('marCiternes'),
+ marAnimaux: isSelected('marAnimaux'),
+ marDenreesSousTemp: isSelected('marDenreesSousTemp'),
+ nbExpo: document.getElementById('nombreExposition').value || 0,
+ capExpo: document.getElementById('capitalExposition').value || 0,
+ typeMarExpo: document.getElementById('typeMarEnExp').value || '',
+ franchiseMarExpo: extractPropoCard(selectedCardId).franchiseMarExpo,
+ }
+
+ const responseTPPC = await fetch(`/tppc/create`, {
+ method: 'POST',
+ body: JSON.stringify(bodyTPPC),
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+
+ const data = await responseTPPC.json();
+
+ if (data.valid) {
+ const idProjet = data.tppc.id;
+
+ // Mettre à jour le champ "enCours" dans le contrat avec l'ID de la nouvelle saisie RC
+ const responseContratEnCours = await fetch(`/contrat/update/${contrat.produit}/${contrat.id}/${idProjet}`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+
+ const dataContratEnCours = await responseContratEnCours.json();
+
+ if (dataContratEnCours.valid) {
+
+ // Obtenir la date actuelle au format "JJ/MM/AAAA"
+ const currentDate = new Date();
+ const day = String(currentDate.getDate()).padStart(2, '0');
+ const month = String(currentDate.getMonth() + 1).padStart(2, '0'); // Les mois sont indexés à partir de 0, donc +1
+ const year = currentDate.getFullYear();
+ const formattedDate = `${day}/${month}/${year}`;
+
+ //Obtenir l'user
+ const token = localStorage.getItem('jwtToken');
+ const decoded = jwt_decode(token);
+ const userFirstName = decoded.userFirstName;
+ const userLastName = decoded.userLastName;
+
+ // Obtenir l'heure actuelle au format "HHhMM"
+ const hours = String(currentDate.getHours()).padStart(2, '0');
+ const minutes = String(currentDate.getMinutes()).padStart(2, '0');
+ const seconds = String(currentDate.getSeconds()).padStart(2, '0');
+ const formattedTime = `${hours}:${minutes}:${seconds}`;
+ const nom = userLastName;
+ const prenom = userFirstName;
+
+ // Mettre à jour le champ "historique" dans le contrat avec les nouvelles données d'historique
+ const historiqueData = [
+ {
+ "type": contrat.type,
+ "date": formattedDate,
+ "heure": formattedTime,
+ "produit": "TPPC",
+ "id": idProjet,
+ "nom": nom,
+ "prenom": prenom,
+ }
+ ];
+
+ const responseHistoriqueUpdate = await fetch(`/contrat/update/historique/${contrat.id}`, {
+ method: 'POST',
+ body: JSON.stringify({historiqueData}),
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+
+ const dataHistoriqueUpdate = await responseHistoriqueUpdate.json();
+
+ if (dataHistoriqueUpdate.valid) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=projet`;
+ } else {
+ console.log('Echec lors de la mise à jour de l\'historique du contrat :', dataHistoriqueUpdate.message);
+ }
+ }
+ } else {
+ console.log('Echec lors de la création de la saisie dans la collection TPPC :', data.message);
+ }
+ } else {
+ console.log('Echec lors de la création de la saisie dans la collection TPPCtarif :', data.message);
+ }
+
+
+ }
+
+ // Exposer init globalement pour y accéder depuis l'extérieur
+ window.initSubmenuForm = init;
+})();
\ No newline at end of file
diff --git a/ecole/public/js/tarif-form-tppc.js b/ecole/public/js/tarif-form-tppc.js
new file mode 100644
index 00000000..b801f805
--- /dev/null
+++ b/ecole/public/js/tarif-form-tppc.js
@@ -0,0 +1,1351 @@
+function initSubmenuForm() {
+ // Accéder aux informations stockées du parcours
+ const parcours = JSON.parse(sessionStorage.getItem('parcours'));
+}
+
+// Exposer initSubmenuForm globalement pour y accéder depuis l'extérieur
+window.initSubmenuForm = initSubmenuForm;// Module IIFE pour éviter la pollution de l'espace global
+(function() {
+ // Variables globales du module
+ let parcours, contrat, tppc, tarif, projet;
+
+ // Variables propositions
+ let franchise150, franchise300, mini150, mini300
+
+ //Variables modulos et liste
+ let objModAct, objModMar, objModFlotte, objModCot, objModSinistre, objPrimeMini, listTypeVehicule, objMarEnExpo
+
+ //variables modale tarif commercial
+ const seuil = 15
+
+ // Initialisation du formulaire et des données
+ function init() {
+
+ // Materialize init select
+ var select = document.querySelectorAll('select');
+ M.FormSelect.init(select);
+
+ // Materialize init Modal
+ var modals = document.querySelectorAll('.modal');
+ M.Modal.init(modals);
+
+ // Accéder aux informations stockées du parcours
+ parcours = JSON.parse(sessionStorage.getItem('parcours'));
+ contrat = JSON.parse(sessionStorage.getItem('contrat'));
+ tppc = contrat?.["@expand"]?.enCours || null;
+ tarif = tppc?.["@expand"]?.tarif || null;
+ projet = tppc?.["@expand"]?.projet || null;
+
+ console.log("Initialisation pour formulaire projet :", parcours);
+
+ // Appel des différentes fonctions d'initialisation
+ setupEventListeners();
+
+ //Appel des constantes JSON pour remplir les selects puis remplir les champs
+ constantsJSON().then(() => {
+ fillSelects();
+ populateFormData();
+ })
+ }
+
+ // Configuration des écouteurs d'événements
+ function setupEventListeners() {
+
+ document.getElementById('loadHistoriqueBtn').addEventListener('click', function() {
+ handleLoadHistoriqueBtn();
+ });
+
+ document.getElementById('btnAddTypeVehicule').addEventListener('click', function() {
+ const typeVehTarif = document.getElementById('typeVehTarif').value
+ const capitalTarif = document.getElementById('capitalTarif').value
+ const garTarif = document.getElementById('garTarif').value
+ const typeMarTarif = document.getElementById('typeMarTarif').value
+ const nbVehiculesTarif = document.getElementById('nbVehiculesTarif').value
+ const primeVehTarif = document.getElementById('primeVehTarif').value
+ const primeHTTarif = document.getElementById('primeHTTarif').value
+ const modulo = document.getElementById('modulo').value
+
+ addRowTarification(typeVehTarif, capitalTarif, garTarif, typeMarTarif, nbVehiculesTarif, primeVehTarif, primeHTTarif, modulo);
+
+ // Réinitialiser les valeurs de saisie
+ emptyRowTarification()
+ });
+
+ document.querySelectorAll('input[name=typeContrat]').forEach((element) =>
+ element.addEventListener('click', function() {
+ toggleTypeContrat(this.value)
+ if (tarif && tarif.montantSinistre !== undefined) {
+ document.getElementById('sinistre').value = tarif.montantSinistre
+ } else {
+ document.getElementById('sinistre').value = ""
+ }
+ checkSinistre()
+ }))
+
+ document.getElementById('capitalVehicule').addEventListener('input', function() {
+ validateField('capitalVehicule', true)
+ updateSubmitButtonState('tarifFormTPPC')
+ if (isSelected('marAnimaux') && this.value > 200000) {
+ openModaleAniViv()
+ }
+ })
+
+ document.getElementById('flotte').addEventListener('input', function () {
+ validateField('flotte', true)
+ updateSubmitButtonState('tarifFormTPPC')
+ const moduloChipFlotte = document.getElementById('chip-modulo-flotte')
+ updateModuloChip(moduloChipFlotte, calcModFlotte(this.value))
+ })
+
+ document.getElementById('marAssuree').addEventListener('change', function() {
+ updateMarAssuree()
+ })
+
+ document.querySelectorAll('input[type="checkbox"][name="garSouhaitees"]').forEach((checkbox) => {
+ checkbox.addEventListener('click', function() {
+ checkBennesGaranties()
+ })
+ })
+
+ document.getElementById('activite').addEventListener('change', function () {
+ validateField('activite', true)
+ updateSubmitButtonState('tarifFormTPPC')
+ checkActivite(this);
+ })
+
+ document.querySelectorAll('.franchise-card button').forEach((button) => button.addEventListener('click', function (e) {
+ e.preventDefault()
+ openModaleTarifCom(this.name)
+ }))
+
+ document.getElementById('bouton-grille').addEventListener('click', function() {
+ const modal = document.getElementById('modalGrille')
+ const instance = M.Modal.getInstance(modal)
+ instance.open()
+ })
+
+ document.getElementById('marEnExpo').addEventListener('change', function() {
+ document.getElementById('marEnExpo-div').style.display = (this.checked) ? "block" : "none"
+ })
+
+ document.querySelectorAll('input').forEach((element) => {
+ element.addEventListener('input', function () {
+ affichagePropositions();
+ })
+
+ element.addEventListener('change', function () {
+ affichagePropositions();
+ })
+ })
+
+ document.querySelectorAll('select').forEach((element) => {
+ element.addEventListener('change', function () {
+ affichagePropositions();
+ })
+ })
+
+ document.getElementById('comm-OK').addEventListener('click', function () {
+ submitForm(this.name)
+ })
+
+ document.getElementById('commentaire').addEventListener('input', function () {
+ if (document.getElementById('commentaire').value == "") {
+ document.getElementById('comm-OK').disabled = true
+ } else {
+ document.getElementById('comm-OK').disabled = false
+ }
+ })
+
+
+ setupTableEventListeners()
+ }
+
+ function setupTableEventListeners() {
+ const lignes = document.querySelectorAll('table#empTableTarifVehicules tr:not(#header)')
+
+ lignes.forEach((ligne) => {
+ const selectTypeMar = ligne.querySelector('select[name="typeMarTarif"]')
+ const selectGarChoisies = ligne.querySelector('select[name="garTarif"]')
+ const chipModulo = ligne.querySelector('div[name="moduloTarif"]')
+ const inputModulo = ligne.querySelector('input[name="modulo"]')
+ const inputPrimeVehicule = ligne.querySelector('input[name="primeVehTarif"]')
+ const inputPrimeHTTarif = ligne.querySelector('input[name="primeHTTarif"]')
+ const inputCapital = ligne.querySelector('input[name="capitalTarif"]')
+ const inputNbrVehicule = ligne.querySelector('input[name="nbVehiculesTarif"]')
+ const deleteButton = ligne.querySelector('.delete-btn')
+
+ inputPrimeVehicule.addEventListener('input', function () {
+ inputPrimeHTTarif.value = inputPrimeVehicule.value * inputNbrVehicule.value
+ })
+
+ inputNbrVehicule.addEventListener('input', function () {
+ inputPrimeHTTarif.value = inputPrimeVehicule.value * inputNbrVehicule.value
+ })
+
+ selectTypeMar.addEventListener('change', function() {
+ const moduloMar = calcModMar(this.value)
+ updateModuloChip(chipModulo, moduloMar)
+ inputModulo.value = moduloMar
+ })
+
+ inputCapital.addEventListener('input', function () {
+ inputPrimeVehicule.value = calcModCot(selectGarChoisies.value, inputCapital.value) || 0
+ inputPrimeHTTarif.value = inputPrimeVehicule.value * inputNbrVehicule.value
+ })
+
+ selectGarChoisies.addEventListener('change', function() {
+ inputPrimeVehicule.value = calcModCot(selectGarChoisies.value, inputCapital.value) || 0
+ inputPrimeHTTarif.value = inputPrimeVehicule.value * inputNbrVehicule.value
+ })
+
+ if (deleteButton !== null) {
+ deleteButton.addEventListener('click', function () {
+ deleteRow(this);
+ affichagePropositions();
+ });
+ }
+
+ ligne.querySelectorAll('select').forEach((select) => {
+ select.addEventListener('change', function() {
+ checkBennesGarantiesTarif(ligne)
+ affichagePropositions();
+ })
+ })
+
+ ligne.querySelectorAll('input').forEach((input) => {
+ input.addEventListener('input', function () {
+ checkBennesGarantiesTarif(ligne)
+ affichagePropositions();
+ })
+ })
+ })
+ }
+
+ //Appel pour recevoir les constantes
+ async function constantsJSON() {
+ try {
+ const responsesJSON = await Promise.all([
+ fetch('/tppc/modulo/activite'),
+ fetch('/tppc/modulo/marchandise'),
+ fetch('/tppc/modulo/flotte'),
+ fetch('/tppc/modulo/cotisation'),
+ fetch('/tppc/modulo/sinistre'),
+ fetch('/tppc/modulo/primeMini'),
+ fetch('/tppc/list/vehicule'),
+ fetch('/tppc/modulo/marEnExpo')
+ ]);
+ const jsonResponses = await Promise.all(responsesJSON.map(r => r.json())); // Récupérer toutes les réponses JSON
+
+ // Extraire la valeur objRetourne de chaque réponse
+ [
+ objModAct,
+ objModMar,
+ objModFlotte,
+ objModCot,
+ objModSinistre,
+ objPrimeMini,
+ listTypeVehicule,
+ objMarEnExpo
+ ] = jsonResponses.map(response => response.objRetourne); // Adapter pour extraire objRetourne
+ } catch (err) {
+ throw err;
+ }
+ }
+
+ //Remplissage des select et des champs avec les propositions
+ function fillSelects() {
+
+ //Remplissage des activites
+ const listeActiviteObj = {}
+
+ //Creation objets avec liste d'activité en clé, et null en valeur
+ for (const activite of Object.keys(objModAct)) {
+ listeActiviteObj[activite] = null
+ }
+ var elems = document.querySelectorAll('.autocomplete');
+ M.Autocomplete.init(elems, {
+ data: listeActiviteObj,
+ limit: 10
+ })
+
+ /******************************************/
+
+ //Remplissage des selects
+ const selectMar = document.getElementById('marAssuree')
+ const selectMarTarif = document.getElementById('typeMarTarif')
+ const selectMarEnExp = document.getElementById('typeMarEnExp')
+
+ //Fonction pour créer les select options
+ const optionCreator = (text, value) => {
+ let option = document.createElement('option')
+ option.value = value
+ option.text = text
+ return option
+ }
+
+ for (const [key, value] of Object.entries(objModMar)) {
+ if (value['tarif']) {
+ selectMar.add(optionCreator(value['tarif'], key))
+ selectMarTarif.add(optionCreator(value['tarif'], key))
+ }
+ }
+
+ for (const [key, value] of Object.entries(objMarEnExpo)) {
+ selectMarEnExp.add(optionCreator(value['nom'], key))
+ }
+
+ var select = document.querySelectorAll('select');
+ M.FormSelect.init(select);
+ }
+
+ //Remplissage des champs et des selects avec les données sauvegardées
+ function populateFormData() {
+
+ // Populate select historique
+ if (!contrat.historique) {
+ document.getElementById('historiqueDiv').style.display = "none";
+ } else {
+ document.getElementById('historiqueDiv').style.display = "block";
+
+ const idSelect = document.getElementById('idSelect');
+
+ contrat.historique.forEach(function(item) {
+ var option = document.createElement('option');
+ option.value = item.id;
+ option.textContent = item.type + " " + item.produit + " - " + item.date + " - " + item.heure;
+
+ if (item.nom != undefined && item.prenom != undefined) {
+ option.textContent += " - " + item.nom + " " + item.prenom;
+ }
+
+ idSelect.appendChild(option);
+ });
+ M.FormSelect.init(idSelect);
+ }
+
+ if (tppc.actAssuree) {
+ document.getElementById('activite').value = tppc.actAssuree
+ checkActivite(document.getElementById('activite'))
+ }
+
+ if (tppc.cotCapVeh) {
+ document.getElementById('capitalVehicule').value = tppc.cotCapVeh
+ }
+
+ if (tppc.nbVehic) {
+ document.getElementById('flotte').value = tppc.nbVehic
+ updateModuloChip(document.getElementById('chip-modulo-flotte'), calcModFlotte(tppc.nbVehic))
+ }
+
+ if (tppc.garanties) {
+ if (tppc.garanties.includes('HIAC')) {
+ document.getElementById('garSouhaitees-HIAC').checked = true
+ }
+ if (tppc.garanties.includes('Vol')) {
+ document.getElementById('garSouhaitees-vol').checked = true
+ }
+ }
+
+ // Remplissage des marchandises assurées
+
+ const marAssuree = []
+
+ if (tppc.marOrdinaires) {
+ document.querySelector('select#marAssuree option[value="marOrdinaires"]').selected = true;
+ marAssuree.push("marOrdinaires")
+ }
+ if (tppc.marBennes) {
+ document.querySelector('select#marAssuree option[value="marBennes"]').selected = true;
+ marAssuree.push("marBennes")
+ }
+ if (tppc.marDenreesHorsTemp) {
+ document.querySelector('select#marAssuree option[value="marDenreesHorsTemp"]').selected = true;
+ marAssuree.push("marDenreesHorsTemp")
+ }
+ if (tppc.marDenreesSousTemp) {
+ document.querySelector('select#marAssuree option[value="marDenreesSousTemp"]').selected = true;
+ marAssuree.push("marDenreesSousTemp")
+ }
+ if (tppc.marAuto) {
+ document.querySelector('select#marAssuree option[value="marAuto"]').selected = true;
+ marAssuree.push("marAuto")
+ }
+ if (tppc.marRisques) {
+ document.querySelector('select#marAssuree option[value="marRisques"]').selected = true;
+ marAssuree.push("marRisques")
+ }
+ if (tppc.marCiternes) {
+ document.querySelector('select#marAssuree option[value="marCiternes"]').selected = true;
+ marAssuree.push("marCiternes")
+ }
+ if (tppc.marEngins) {
+ document.querySelector('select#marAssuree option[value="marEngins"]').selected = true;
+ marAssuree.push("marEngins")
+ }
+ if (tppc.marAnimaux) {
+ document.querySelector('select#marAssuree option[value="marAnimaux"]').selected = true;
+ marAssuree.push("marAnimaux")
+ }
+
+ if (marAssuree.length > 0) {
+ updateMarAssuree()
+ }
+ M.FormSelect.init(document.querySelector('select#marAssuree'))
+
+ // Remplissage des marchandises en exposition
+
+ if(tppc.marEnExpo) {
+ document.getElementById('marEnExpo').checked = true
+ document.getElementById('marEnExpo-div').style.display = "block"
+ document.getElementById('nombreExposition').value = tppc.nbExpo
+ document.getElementById('capitalExposition').value = tppc.capExpo
+ document.querySelector('select#typeMarEnExp option[value="'+ tppc.typeMarExpo +'"]').selected = true;
+ }
+ M.FormSelect.init(document.querySelector('select#typeMarEnExp'))
+
+ if (tarif && tarif.typeContrat) {
+ //Si Le Parcours Possede Un Type De Contrat
+
+ toggleTypeContrat(tarif.typeContrat)
+ if (tarif.typeContrat == 'detaillee') {
+ document.getElementById('cotisationDetaillee').checked = true
+ document.getElementById('cotisationEnsemble').checked = false
+ } else if (tarif.typeContrat == 'ensemble') {
+ document.getElementById('cotisationDetaillee').checked = false
+ document.getElementById('cotisationEnsemble').checked = true
+ }
+ } else if (tppc.tarFlotte && tppc.tarFlotte.length > 0) {
+ // Si Le Parcours N'a Pas De Type De Contrat (Tarif) Mais Une flotte détaillée (Projet)
+
+ toggleTypeContrat('detaillee')
+ document.getElementById('cotisationDetaillee').checked = true
+ document.getElementById('cotisationEnsemble').checked = false
+ } else {
+ //Par Defaut
+ document.getElementById('cotisationDetaillee').checked = true
+ toggleTypeContrat('detaillee')
+ }
+
+ if (tarif && tarif.montantSinistre !== undefined && tarif.montantSinistre >= 0) {
+ document.getElementById('sinistre').value = tarif.montantSinistre
+ updateModuloChip(document.getElementById('chip-modulo-sinistre'), calcModSinistre(tarif.montantSinistre))
+ }
+
+ if (tppc.tarFlotte && Object.keys(tppc.tarFlotte).length !== 0) {
+ for (let i = 0; i < tppc.tarFlotte.length; i++) {
+ const row = tppc.tarFlotte[i];
+ addRowTarification(row.typeVehTarif, row.capitalTarif, row.garTarif, row.typeMarTarif, row.nbVehiculesTarif, row.primeVehTarif, row.primeHTTarif, row.modulo)
+ }
+ }
+
+ affichagePropositions()
+ }
+
+ function updateMarAssuree() {
+ const options = document.querySelectorAll('#marAssuree option:not([value=""])');
+
+ options.forEach((option) => {
+ if (option.selected) {
+ document.getElementById(option.value + '-chip').style.display = "inline-block"
+ } else {
+ document.getElementById(option.value + '-chip').style.display = "none"
+ }
+ })
+
+ const capitalVehicule = document.getElementById('capitalVehicule').value
+ if (isSelected('marAnimaux') && capitalVehicule > 200000) {
+ openModaleAniViv()
+ }
+
+ const selectedOpt = [...document.querySelectorAll('#marAssuree option:checked:not([value=""])')].map((option => option.value))
+ const moduloChipMarAssuree = document.getElementById('chip-modulo-marAssuree')
+
+ updateModuloChip(moduloChipMarAssuree, calcModMar(selectedOpt))
+ checkBennesGaranties()
+ }
+
+ function toggleTypeContrat(typeContrat) {
+ if (typeContrat == "ensemble") {
+ document.getElementById('row-tarification-vehicules').style.display = "none"
+ document.getElementById('card-tarif-mod-mar').style.display = "none"
+ document.getElementById('card-tarif-mod-mar').style.display = "none"
+
+ document.getElementById('col-capitalVehicule').style.display = "block"
+ document.getElementById('col-flotte').style.display = "block"
+ document.getElementById('col-marAssuree').style.display = "block"
+ document.getElementById('col-garSouhaitees').style.display = "block"
+ document.getElementById('card-tarif-par-vehicule').style.display = "block"
+ document.getElementById('card-nbr-vehicule').style.display = "block"
+ document.getElementById('card-tarif-mod').style.display = "none"
+
+ } else if (typeContrat == "detaillee") {
+ document.getElementById('row-tarification-vehicules').style.display = "block"
+ document.getElementById('card-tarif-mod-mar').style.display = "block"
+ document.getElementById('card-tarif-mod-mar').style.display = "block"
+ document.getElementById('card-tarif-mod').style.display = "block"
+ document.getElementById('col-capitalVehicule').style.display = "none"
+ document.getElementById('col-flotte').style.display = "none"
+ document.getElementById('col-marAssuree').style.display = "none"
+ document.getElementById('col-garSouhaitees').style.display = "none"
+ document.getElementById('card-tarif-par-vehicule').style.display = "none"
+ document.getElementById('card-nbr-vehicule').style.display = "none"
+ }
+ fillTarifCard('tarif-total-vehicule', 0.00)
+ }
+
+ function getGaranties() {
+ return [...document.querySelectorAll('[name = "garSouhaitees"]:checked')]
+ .map((garantie) => garantie.value)
+ .join('+')
+ }
+
+ function getGarantiesFromFlotte() {
+ const garSet = new Set();
+ const selectsArray = document.querySelectorAll('#empTableTarifVehicules tr:not(#header) [name="garTarif"]')
+ selectsArray.forEach((select) => {
+ select.value.split('+').forEach(garantie => garSet.add(garantie))
+ })
+ return [...garSet]
+ }
+
+ function calcModFlotte(flotte) {
+ if (flotte == "" || !validateField('flotte')) {
+ return null
+ }
+ flotte = parseFloat(flotte);
+ // Parcourir le JSON modFlotte pour trouver la valeur correspondante
+ for (let palier in objModFlotte) {
+ if (flotte <= parseFloat(palier)) {
+ return parseFloat(objModFlotte[palier]); // Retourner la valeur correspondante
+ }
+ }
+ return 1.00; // Par défaut, retourner 1.00 si aucune correspondance n'est trouvée
+ }
+
+ function calcModMar(marchandises) {
+ if (marchandises == "" || marchandises.length == 0) {
+ return null
+ }
+
+ if (typeof marchandises == "object") {
+ var modulo = 1
+ marchandises.forEach((mar) => {
+ modulo = parseFloat(modulo * objModMar[mar]['modulo'])
+ })
+
+ return modulo.toFixed(2)
+ } else {
+ return parseFloat(objModMar[marchandises]['modulo'])
+ }
+ }
+
+ function calcModAct(activite) {
+ if (activite == "") {
+ return null
+ }
+ if (!Object.keys(objModAct).includes(activite)) {
+ return null
+ }
+ return parseFloat(objModAct[activite])
+ }
+
+ function calcModCot(garanties, capital) {
+ const paliers = Object.keys(objModCot)
+ for (let maxMontant in paliers) {
+ if (capital <= parseFloat(paliers[maxMontant])) {
+ return parseFloat(objModCot[paliers[maxMontant]][garanties])
+ }
+ }
+ return null
+ }
+
+ function calcNbrVehiculesTotal() {
+ const lignes = document.querySelectorAll('#empTableTarifVehicules tr:not(#header)')
+ var nbrVehicules = 0
+
+ lignes.forEach((ligne) => {
+ nbrVehicules += parseInt(ligne.querySelector("[name='nbVehiculesTarif']").value)
+ })
+
+ return nbrVehicules
+ }
+
+ function calcPrimeMinimum(prime) {
+ if (prime <= objPrimeMini["IAC + Vol"]) {
+ if (document.getElementById('garSouhaitees-vol').checked) { //SI IAC + HIAC + VOL ou IAC + VOL
+ return parseFloat(objPrimeMini["IAC + Vol"])
+ } else { //SI IAC + HIAC ou IAC
+ return parseFloat(objPrimeMini["IAC + HIAC"])
+ }
+ } else {
+ return prime
+ }
+ }
+
+ function calcPrimeTotaleHT() {
+ const lignes = document.querySelectorAll('#empTableTarifVehicules tr:not(#header)')
+ var cotBase = 0
+
+ lignes.forEach((ligne) => {
+ const primeHT = parseFloat(ligne.querySelector('[name="primeHTTarif"]').value) || 0
+ cotBase += primeHT
+ })
+
+ return cotBase.toFixed(2)
+ }
+
+ function calcPrimeTotaleHTModulee() {
+ const lignes = document.querySelectorAll('#empTableTarifVehicules tr:not(#header)')
+ var cotBrute = 0
+
+ lignes.forEach((ligne) => {
+ const modMarchandise = ligne.querySelector('input[name="modulo"]').value || 0
+ const primeHT = ligne.querySelector('[name="primeHTTarif"]').value || 0
+ const primeModulee = primeHT * modMarchandise
+ cotBrute += primeModulee
+ })
+
+ return cotBrute.toFixed(2)
+ }
+
+ function calcPrimeMoyenne() {
+ const nbrVehicules = document.getElementById('flotte').value
+ const capital = document.getElementById('capitalVehicule').value
+ const selectedOpt = [...document.querySelectorAll('#marAssuree option:checked:not([value=""])')].map((option => option.value))
+
+ const tarifVehicule = calcModCot(getGaranties(), capital)
+ const prime = tarifVehicule * nbrVehicules
+
+ const moduloAct = calcModAct(document.getElementById('activite').value)
+ const moduloMar = calcModMar(selectedOpt)
+ const moduloCA = 1
+ const moduloFlotte = calcModFlotte(document.getElementById('flotte').value)
+ const coeffMoyen = moduloFlotte > moduloCA ? moduloCA : moduloFlotte
+
+ return Number.parseInt(prime * coeffMoyen * moduloAct * moduloMar).toFixed(2)
+ }
+
+ function calcPrimeMoyenneTarif() {
+ const moduloFlotte = calcModFlotte(calcNbrVehiculesTotal())
+ const moduloCA = 1
+ const moduloAct = calcModAct(document.getElementById('activite').value)
+ const coeffMoyen = moduloFlotte > moduloCA ? moduloCA : moduloFlotte
+ const cotMarchandise = calcPrimeTotaleHTModulee()
+
+ return Number.parseFloat(cotMarchandise * coeffMoyen * moduloAct)
+ }
+
+ function calcModSinistre(sinistre) {
+ const pourcentages = Object.keys(objModSinistre).map(Number).sort() //Récupération, conversion en float puis classement des pourcentages
+ const cotDetaillee = document.getElementById('cotisationDetaillee').checked
+ const primeMoyenne = cotDetaillee ? calcPrimeMoyenneTarif() : calcPrimeMoyenne()
+ sinistre = parseFloat(sinistre)
+
+ if ((primeMoyenne == 0 && sinistre == 0)) {
+ return 1.00
+ } else if (sinistre < (primeMoyenne * pourcentages[0])) { //- que 40% de la prime
+ return objModSinistre[pourcentages[0]]
+ } else if ((sinistre >= (primeMoyenne * pourcentages[0])) && (sinistre < (primeMoyenne * pourcentages[1]))) { //entre 40 et 70% de la prime
+ return objModSinistre[pourcentages[1]]
+ } else if ((sinistre >= (primeMoyenne * pourcentages[1])) && (sinistre <= (primeMoyenne * pourcentages[2]))) { //entre 40 et 70% de la prime
+ return objModSinistre[pourcentages[2]]
+ } else if (sinistre > primeMoyenne || sinistre == '') { //superieur à la prime
+ return null
+ } else {
+ return 1.00
+ }
+ }
+
+ function updateModuloChip(elementModulo, valeur) {
+ if (valeur == null) {
+ elementModulo.style.display = "none"
+ } else {
+ elementModulo.style.display = "inline-block"
+ const titreModulo = elementModulo.innerText.split(' : ')[0]
+ elementModulo.innerText = titreModulo + ' : x' + valeur
+ }
+ }
+
+ function checkBennesGaranties() {
+ const caseHIAC = document.querySelector('input[name="garSouhaitees"][value="HIAC"]')
+ const caseVol = document.querySelector('input[name="garSouhaitees"][value="Vol"]')
+
+ if (document.querySelector('#marAssuree option[value="marBennes"]:checked') !== null) {
+ const textError = "Vous ne pouvez choisir la garantie tous risques avec pour marchandise assurée : Bennes"
+
+ if (caseHIAC.checked && caseVol.checked) {
+ caseHIAC.checked = false
+ caseVol.checked = false
+ document.getElementById('garSouhaitees-error').innerText = textError
+ document.getElementById('garSouhaitees-error').style.display = "block"
+ } else if (caseHIAC.checked || caseVol.checked) {
+ document.getElementById('garSouhaitees-error').innerText = textError
+ document.getElementById('garSouhaitees-error').style.display = "block"
+ if (caseHIAC.checked) {
+ caseVol.disabled = true
+ } else if (caseVol.checked) {
+ caseHIAC.disabled = true
+ }
+ } else if (!caseHIAC.checked && !caseVol.checked) {
+ caseHIAC.disabled = false
+ caseVol.disabled = false
+ document.getElementById('garSouhaitees-error').innerText = ""
+ }
+ } else {
+ document.getElementById('garSouhaitees-error').innerText = ""
+ caseHIAC.disabled = false
+ caseVol.disabled = false
+ }
+ }
+
+ function checkSinistre() {
+ const inputSinistre = document.getElementById('sinistre')
+ if (validateField('sinistre'), true) {
+ updateSubmitButtonState('tarifFormTPPC')
+
+ if (inputSinistre.value !== "") {
+ const errorElement = document.getElementById('sinistre-error')
+ const modSinistre = calcModSinistre(inputSinistre.value)
+ const moduloChipSinistre = document.getElementById('chip-modulo-sinistre')
+ updateModuloChip(moduloChipSinistre, modSinistre)
+
+ if (projet && projet.antSin !== undefined && projet.antSin !== "" && (projet.antSin == 0 && inputSinistre.value > 0)) {
+ errorElement.textContent = "Vous avez renseigné " + projet.antSin + " antécédent"
+ errorElement.style.display = "block"
+ return true
+ }
+
+ if (modSinistre == null) {
+ errorElement.textContent = "Le montant d'antécédent de sinistre est supérieur au montant de la prime"
+ errorElement.style.display = "block"
+ return false
+ } else {
+ errorElement.textContent = ""
+ errorElement.style.display = "none"
+ return true
+ }
+ } else {
+ return false
+ }
+ }
+ }
+
+ function checkBennesGarantiesTarif(row) {
+ const typeVehicule = row.querySelector("input[name = typeVehTarif]")
+ const typeMar = row.querySelector("select[name = typeMarTarif]")
+ const garSouscrites = row.querySelector("select[name = garTarif]")
+
+ const regex = /\bbenne\b|\b.*benne.*\b/i;
+
+
+ if ((typeVehicule.value.match(regex) || typeMar.value == "marBennes")) {
+ garSouscrites.querySelector('[value="IAC+HIAC+Vol"]').disabled = true
+ typeMar.querySelector('[value="marBennes"]').disabled = false
+
+ if (garSouscrites.value == "IAC+HIAC+Vol") {
+ garSouscrites.value = ""
+ document.getElementById("message-BenneTousRisques").style.display = "block"
+ }
+
+ } else if (garSouscrites.value == "IAC+HIAC+Vol") {
+ typeMar.querySelector('[value="marBennes"]').disabled = true
+
+ } else {
+ typeMar.querySelector('[value="marBennes"]').disabled = false
+ garSouscrites.querySelector('[value="IAC+HIAC+Vol"]').disabled = false
+ document.getElementById("message-BenneTousRisques").style.display = "none"
+ }
+
+ var select = row.querySelectorAll('select');
+ M.FormSelect.init(select);
+ }
+
+ function checkActivite(input) {
+ const errorElement = document.getElementById('activite-error')
+ const moduloChipAct = document.getElementById('chip-modulo-activite')
+ if (Object.keys(objModAct).includes(input.value)) {
+ errorElement.textContent = ""
+ errorElement.style.display = "none"
+ updateModuloChip(moduloChipAct, calcModAct(input.value))
+ return true
+ } else {
+ errorElement.textContent = "Veuillez selectionner une activité parmi la liste"
+ errorElement.style.display = "block"
+ updateModuloChip(moduloChipAct, null)
+ return false
+ }
+ }
+
+ function openModaleAniViv() {
+ const elem = document.getElementById('modalAnimauxVivants');
+ const instance = M.Modal.getInstance(elem);
+ instance.open();
+ }
+
+ function handleLoadHistoriqueBtn() {
+ var selectedId = document.getElementById('idSelect').value;
+
+ if (selectedId != "") {
+ fetch(`/contrat/update/${contrat.produit}/${contrat.id}/${selectedId}`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ })
+ .then(response => response.json())
+ .then(data => {
+ if (data.valid) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=projet`;
+ } else {
+ console.log('Echec lors de la mise à jour de la relation id contrat - id client :', data);
+ }
+ });
+ }
+ }
+
+ function addRowTarification(typeVehTarif, capitalTarif, garTarif, typeMarTarif, nbVehiculesTarif, primeVehTarif, primeHTTarif, modulo) {
+ const table = document.getElementById('empTableTarifVehicules');
+ const newRow = table.insertRow(table.rows.length - 1);
+ const emptyRow = `
+
+
+
+
+
+
+
+
+
+ Garanties souscrites:
+
+ IAC
+ IAC + Hors IAC
+ IAC + Vol
+ IAC + hors IAC + Vol
+
+
+
+
+ Type de marchandise:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Mod. Marchandise : x2
+
+
+
+
+
+ delete
+
+
+ `
+
+ //Création de l'élément HTML
+ newRow.innerHTML = emptyRow
+
+ //Remplissage des Selects
+ newRow.querySelector('[name = typeMarTarif]').innerHTML = document.querySelector('tr[id=inputRow] select[name = typeMarTarif]').innerHTML
+ newRow.querySelector('[name = garTarif]').innerHTML = document.querySelector('tr[id=inputRow] select[name = garTarif]').innerHTML
+
+ //Ajout des valeurs
+ newRow.querySelector('[name = capitalTarif]').value = capitalTarif
+ newRow.querySelector('[name = garTarif]').value = garTarif
+ newRow.querySelector('[name = typeMarTarif]').value = typeMarTarif
+ newRow.querySelector('[name = nbVehiculesTarif]').value = nbVehiculesTarif
+ newRow.querySelector('[name = primeVehTarif]').value = primeVehTarif
+ newRow.querySelector('[name = primeHTTarif]').value = primeHTTarif
+ newRow.querySelector('[name = typeVehTarif]').value = typeVehTarif
+
+ const moduloInput = newRow.querySelector('[name = modulo]')
+ const moduloChip = newRow.querySelector('[name = moduloTarif]')
+ moduloInput.value = modulo
+ updateModuloChip(moduloChip, modulo)
+
+ var select = document.querySelectorAll('select');
+ M.FormSelect.init(select);
+
+ checkBennesGarantiesTarif(newRow)
+ emptyRowTarification()
+ setupTableEventListeners()
+ }
+
+ // Supprimer une ligne du tableau
+ function deleteRow(btn) {
+ const row = btn.parentElement.parentElement;
+ if (row.parentElement) {
+ row.parentElement.removeChild(row);
+ }
+ }
+
+ function emptyRowTarification() {
+ document.querySelector('[id = typeVehTarif]').value = ""
+ document.querySelector('[id = capitalTarif]').value = ""
+ document.querySelector('[id = garTarif]').value = ""
+ document.querySelector('[id = typeMarTarif]').value = ""
+ document.querySelector('[id = nbVehiculesTarif]').value = 0
+ document.querySelector('[id = primeVehTarif]').value = ""
+ document.querySelector('[id = primeHTTarif]').value = ""
+ document.querySelector('[id = modulo]').value = ""
+ document.querySelector('[id = modulo-mar-tarif-0]').style.display = "none"
+
+ checkBennesGarantiesTarif(document.getElementById('inputRow'))
+
+ var select = document.querySelectorAll('select');
+ M.FormSelect.init(select);
+ }
+
+ function fillPropCard(idCard, cardData) {
+ const card = document.getElementById(idCard)
+ const pourcentageAct = parseFloat(cardData.pourcentAct).toFixed(0)
+ const pourcentageMar = parseFloat(cardData.pourcentMar).toFixed(0)
+ const pourcentageFlotteCA = parseFloat(cardData.pourcentFlotteCA).toFixed(0)
+ const pourcentageFranchise = parseFloat(cardData.pourcentFranchise).toFixed(0)
+ const primeVehicule = parseFloat(cardData.primeVehicule).toFixed(2)
+ const proposition = parseFloat(cardData.proposition).toFixed(2)
+ const franchiseMarExpo = cardData.franchiseMarExpo
+
+ if (tarif && tarif.franchiseId && tarif.franchiseId == idCard) {
+ card.classList.add('selected-card')
+ }
+
+ card.querySelector("[id = mod-activite-" + idCard + "]").innerText = "Modulation Activité : +" + pourcentageAct + "%"
+
+ if (document.getElementById('cotisationDetaillee').checked) {
+ card.querySelector("[id = mod-marchandise-" + idCard + "]").style.display = "none"
+ } else {
+ card.querySelector("[id = mod-marchandise-" + idCard + "]").style.display = "block"
+ card.querySelector("[id = mod-marchandise-" + idCard + "]").innerText = "Modulation Marchandise : " + pourcentageMar + "%"
+ }
+
+ card.querySelector("[id = mod-ca-" + idCard + "]").innerText = "Modulation Flotte : " + pourcentageFlotteCA + "%"
+ card.querySelector("[id = mod-franchise-" + idCard + "]").innerText = "Modulation Franchise : " + pourcentageFranchise + "%"
+ card.querySelector("[id = prime-vehicule-" + idCard + "]").innerText = "Prime par véhicule : " + primeVehicule + "€"
+ document.getElementById("proposition-" + idCard).innerText = proposition + "€"
+ }
+
+ function fillTarifCard(idTarif, valeur) {
+ if (valeur == NaN || valeur == "NaN") {
+ valeur = 0
+ }
+ document.getElementById(idTarif).innerText = Number.parseFloat(valeur).toFixed(2) + " €"
+ }
+
+ function calcTarifCards() {
+ if (document.getElementById('cotisationDetaillee').checked) {
+ const tarifTousVehicules = calcPrimeTotaleHT() || 0
+ const tarifModuleMar = calcPrimeTotaleHTModulee() || 0
+ const primeMoyenne = calcPrimeMoyenneTarif() || 0
+ const moduloSinistre = calcModSinistre(document.getElementById('sinistre').value) || 1
+ const tarifModule = primeMoyenne * moduloSinistre
+
+ fillTarifCard('tarif-total-vehicule', tarifTousVehicules)
+ fillTarifCard('tarif-mod-mar', tarifModuleMar)
+ fillTarifCard('tarif-mod', tarifModule)
+
+ } else {
+ const inputCapital = document.getElementById('capitalVehicule')
+ const inputNbrVehicules = document.getElementById('flotte')
+ const tarifVehicule = calcModCot(getGaranties(), inputCapital.value)
+ const tarifTousVehicules = tarifVehicule * inputNbrVehicules.value
+ const tarifModule = calcPrimeMoyenne() || 0
+
+ fillTarifCard('tarif-par-vehicule', tarifVehicule)
+ fillTarifCard('tarif-total-vehicule', tarifTousVehicules)
+ fillTarifCard('tarif-nbr-vehicule', tarifModule)
+ }
+ }
+
+ function calcCard(modFranchise) {
+ const selectedOpt = [...document.querySelectorAll('#marAssuree option:checked:not([value=""])')].map((option => option.value))
+
+ const moduloAct = calcModAct(document.getElementById('activite').value) || 1
+ const moduloMar = calcModMar(selectedOpt) || 1
+ const moduloCA = 1
+ const moduloSinistre = calcModSinistre(document.getElementById('sinistre').value) || 1
+ var marEnExpo = 0
+ var franchiseMarExpo = ""
+
+ const cotDetaillee = document.getElementById('cotisationDetaillee').checked
+
+ var primeMoyenne, moduloFlotte, primeVehicule, flotte
+
+ if (cotDetaillee) {
+ primeMoyenne = calcPrimeMoyenneTarif()
+ moduloFlotte = calcModFlotte(calcNbrVehiculesTotal()) || 1
+ flotte = calcNbrVehiculesTotal()
+ } else {
+ primeMoyenne = calcPrimeMoyenne()
+ moduloFlotte = calcModFlotte(document.getElementById('flotte').value) || 1
+ flotte = document.getElementById('flotte').value || 1
+ }
+
+ const modFlotteCa = moduloCA > moduloFlotte ? moduloFlotte : moduloCA
+ const pourcentAct = ((100 - (parseFloat(moduloAct) * 100)) * (-1)).toFixed(0) || 0
+ const pourcentMar = ((100 - (parseFloat(moduloMar) * 100)) * (-1)).toFixed(0) || 0
+ const pourcentFranchise = ((100 - (parseFloat(modFranchise) * 100)) * (-1)).toFixed(0) || 0
+ const pourcentFlotteCA = ((100 - (parseFloat(modFlotteCa) * 100)) * (-1)).toFixed(0) || 0
+ var proposition = calcPrimeMinimum((primeMoyenne * moduloSinistre) * modFranchise) || 0
+
+
+ // Calcul de la majoration en exposition
+ if (document.getElementById('marEnExpo').checked) {
+ const nbExpo = document.getElementById('nombreExposition').value
+ const capital = document.getElementById('capitalExposition').value
+ const type = document.getElementById('typeMarEnExp').value
+
+ if (nbExpo && capital && type) {
+ if (nbExpo > 3 || capital > 50000) {
+ marEnExpo = nbExpo * capital * objMarEnExpo[type]['modulo'] / 100
+ marEnExpo = marEnExpo > proposition * 0.1 ? proposition * 0.1 : marEnExpo
+ franchiseMarExpo = "mini150"
+ } else {
+ marEnExpo = proposition * 0.1 < 150 ? proposition * 0.1 : 150
+ franchiseMarExpo = "500"
+ }
+ }
+ }
+ proposition = (proposition + marEnExpo).toFixed(2)
+ primeVehicule = (proposition / flotte).toFixed(2) || 0
+
+ return {
+ pourcentAct: pourcentAct,
+ pourcentMar: pourcentMar,
+ pourcentFlotteCA: pourcentFlotteCA,
+ pourcentFranchise: pourcentFranchise,
+ primeVehicule: primeVehicule,
+ proposition: proposition,
+ franchiseMarExpo: franchiseMarExpo
+ }
+ }
+
+ function affichagePropositions() {
+ const actIsIncorrect = (calcModAct(document.getElementById('activite').value) == null)
+ const sinIsIncorrect = checkSinistre() == false
+ const marIsEmpty = isMarAssureeEmpty()
+
+ document.getElementById('row-champsManquants').style.display = (actIsIncorrect || sinIsIncorrect || marIsEmpty) ? "block" : "none"
+ document.getElementById('propositions').style.display = (actIsIncorrect || sinIsIncorrect || marIsEmpty) ? "none" : "block"
+
+ // AFFICHAGE DES CHIPS D'ERREUR
+ document.getElementById('chip-sinistre').style.display = sinIsIncorrect ? "inline-block" : "none"
+ document.getElementById('chip-act').style.display = actIsIncorrect ? "inline-block" : "none"
+ document.getElementById('chip-marAssuree').style.display = marIsEmpty ? "inline-block" : "none"
+
+ if (actIsIncorrect == false || sinIsIncorrect == false) {
+ franchise150 = (calcCard(1));
+ fillPropCard(
+ '150',
+ franchise150
+ );
+ franchise300 = (calcCard(0.75));
+ fillPropCard(
+ '300',
+ franchise300
+ );
+ mini150 = (calcCard(0.7));
+ fillPropCard(
+ 'mini150',
+ mini150
+ );
+ mini300 = (calcCard(0.65));
+ fillPropCard(
+ 'mini300',
+ mini300
+ );
+ calcTarifCards();
+ }
+ }
+
+ function extractTarifTableau(selectedCardId) {
+ const jsonArr = [];
+ const table = document.getElementById("empTableTarifVehicules");
+
+ if (table && document.getElementById("cotisationDetaillee").checked) {
+ const rows = table.querySelectorAll('tr:not(:first-child)');
+
+ rows.forEach(row => {
+ const inputs = row.querySelectorAll(' input:not(.select-dropdown.dropdown-trigger), select');
+ const allInputsEmpty = Array.from(inputs).every(input => input.value == '' || input.value == 0);
+
+ if (!allInputsEmpty) {
+ const dataObj = {};
+ inputs.forEach(input => {
+ const fieldName = input.getAttribute('name');
+ if (fieldName) {
+ const fieldValue = input.value || "Non défini";
+ dataObj[fieldName] = fieldValue;
+ }
+ });
+
+ const selectedFranchise = extractPropoCard(selectedCardId)
+
+ const moduloTotale = (1 + parseFloat(selectedFranchise.pourcentFranchise) / 100) *
+ (1 + parseFloat(selectedFranchise.pourcentAct)/100) *
+ (1 + parseFloat(selectedFranchise.pourcentFlotteCA) / 100)
+
+ dataObj['primeVehModRefTarif'] = (moduloTotale * dataObj['primeVehTarif']).toFixed(2)
+ dataObj['primeHTModRefTarif'] = (moduloTotale * dataObj['primeHTTarif']).toFixed(2)
+
+ jsonArr.push(dataObj);
+ }
+ });
+ return jsonArr;
+ }
+ return "[]"; // Retourne un tableau JSON vide si aucune saisie n'est trouvée dans le tableau
+ }
+
+ function extractPropoCard(idCard) {
+ switch (idCard) {
+ case '150':
+ return franchise150
+ case '300':
+ return franchise300
+ case 'mini150':
+ return mini150
+ case 'mini300':
+ return mini300
+ }
+ return null
+ }
+
+ function isSelected(marchandise) {
+ const cotDetaillee = document.getElementById('cotisationDetaillee').checked
+ if (cotDetaillee) {
+ const selectedOpt = [...document.querySelectorAll('#empTableTarifVehicules [name="typeMarTarif"] ')].map((option => option.value))
+ return selectedOpt.includes(marchandise)
+ } else {
+ const selectedOpt = [...document.querySelectorAll('#marAssuree option:checked:not([value=""])')].map((option => option.value))
+ return selectedOpt.includes(marchandise)
+ }
+ }
+
+ function isMarAssureeEmpty() {
+ const cotDetaillee = document.getElementById('cotisationDetaillee').checked
+ var selectedOpt
+ if (cotDetaillee) {
+ selectedOpt = document.querySelectorAll('#empTableTarifVehicules [name="typeMarTarif"] option:checked:not([value=""]) ')
+ } else {
+ selectedOpt = document.querySelectorAll('#marAssuree option:checked:not([value=""])')
+ }
+ return selectedOpt.length == 0
+ }
+
+ function openModaleTarifCom(cardId) {
+ const franchise = extractPropoCard(cardId)
+ document.getElementById('tarifRefText').innerText = "Tarif de Référence : " + franchise.proposition + "€"
+ document.getElementById('tarifCom').value = ""
+ document.getElementById('commentaire').value = ""
+ document.getElementById('comm-OK').disabled = false
+ document.getElementById('tarifCom-error').style.display = "none"
+ document.getElementById('col-commentaire').style.display = "none"
+ document.getElementById('qualiteDiv').style.display = "none"
+ document.getElementById('comm-OK').name = cardId
+
+ document.getElementById('tarifCom').addEventListener('input', function() {
+ var qualitePrime
+ var emoji
+ var showComment
+
+ diff = 100 * parseFloat(document.getElementById('tarifCom').value / franchise.proposition)
+
+ if (diff < (100 + seuil) && diff > (100 - seuil)) {
+ emoji = "mood"
+ showComment = false
+
+ if (diff > 100) {
+ qualitePrime = "Tarif correct (+" + (diff - 100).toFixed(2) + "%)"
+ } else if (diff < 100) {
+ qualitePrime = "Tarif correct (-" + (100 - diff).toFixed(2) + "%)"
+ } else if (diff == 100) {
+ qualitePrime = "Le juste prix"
+ emoji = "thumb_up_alt"
+ }
+ } else {
+ emoji = "mood_bad"
+ showComment = true
+
+ if (diff > (100 + seuil)) {
+ qualitePrime = "Tarif trop élevé (+" + (diff - 100).toFixed(2) + "%)"
+ } else if (diff < (100 - seuil)) {
+ qualitePrime = "Tarif trop bas (-" + (100 - diff).toFixed(2) + "%)"
+ }
+ }
+
+ document.getElementById('qualiteDiv').style.display = "block"
+ document.getElementById('qualitePrime').innerText = qualitePrime
+ document.getElementById('modalTarifCom-icon').innerText = emoji
+ document.getElementById('modalTarifCom-icon').style.color = (emoji == "mood_bad") ? "red" : "green"
+
+ if (showComment) {
+ document.getElementById('tarifCom-error').style.display = "flex"
+ document.getElementById('col-commentaire').style.display = "flex"
+ if (document.getElementById('commentaire').value == "") {
+ document.getElementById('comm-OK').disabled = true
+ }
+ } else {
+ document.getElementById('comm-OK').disabled = false
+ document.getElementById('tarifCom-error').style.display = "none"
+ document.getElementById('col-commentaire').style.display = "none"
+ }
+ })
+
+ const modal = document.getElementById('modalTarifCom')
+ const instance = M.Modal.getInstance(modal);
+ instance.open();
+ }
+
+ // Gérer la soumission du formulaire
+ async function submitForm(selectedCardId) {
+ const cotDetaillee = document.getElementById('cotisationDetaillee').checked
+ const bodyTarif = {
+ montantSinistre: document.getElementById('sinistre').value,
+ franchise150: franchise150,
+ franchise300: franchise300,
+ franchiseMini150: mini150,
+ franchiseMini300: mini300,
+ franchiseId: selectedCardId,
+ tarifRef: extractPropoCard(selectedCardId).proposition,
+ typeContrat: document.querySelector('[name="typeContrat"]:checked').value,
+ }
+
+ const responseTarif = await fetch(`/tppc/createTarif`, {
+ method: 'POST',
+ body: JSON.stringify(bodyTarif),
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+
+ const dataTarif = await responseTarif.json();
+
+ if (dataTarif.valid) {
+ const idTarif = dataTarif.tarif.id
+ const bodyTPPC = {
+ actAssuree: document.getElementById('activite').value,
+ cotCapVeh: cotDetaillee ? '' : document.getElementById('capitalVehicule').value,
+ tarFlotte: extractTarifTableau(selectedCardId),
+ nbVehic: cotDetaillee ? '' : document.getElementById('flotte').value,
+ garanties: cotDetaillee ? getGarantiesFromFlotte() : [...document.querySelectorAll('[name = "garSouhaitees"]:checked')].map((select) => select.value),
+ tarif: idTarif,
+ projet: tppc.projet || '',
+ primeHT: document.getElementById('tarifCom').value,
+ commentaire: document.getElementById('commentaire').value,
+ marOrdinaires: isSelected('marOrdinaires'),
+ marBennes: isSelected('marBennes'),
+ marDenreesHorsTemp: isSelected('marDenreesHorsTemp'),
+ marRisques: isSelected('marRisques'),
+ marEngins: isSelected('marEngines'),
+ marFranchise: tppc.marFranchise || '',
+ marEnExpo: document.getElementById('marEnExpo').checked,
+ marCiternes: isSelected('marCiternes'),
+ marAnimaux: isSelected('marAnimaux'),
+ marDenreesSousTemp: isSelected('marDenreesSousTemp'),
+ nbExpo: document.getElementById('nombreExposition').value || 0,
+ capExpo: document.getElementById('capitalExposition').value || 0,
+ typeMarExpo: document.getElementById('typeMarEnExp').value || '',
+ franchiseMarExpo: extractPropoCard(selectedCardId).franchiseMarExpo,
+ }
+
+ const responseTPPC = await fetch(`/tppc/create`, {
+ method: 'POST',
+ body: JSON.stringify(bodyTPPC),
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+
+ const data = await responseTPPC.json();
+
+ if (data.valid) {
+ const idProjet = data.tppc.id;
+
+ // Mettre à jour le champ "enCours" dans le contrat avec l'ID de la nouvelle saisie RC
+ const responseContratEnCours = await fetch(`/contrat/update/${contrat.produit}/${contrat.id}/${idProjet}`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+
+ const dataContratEnCours = await responseContratEnCours.json();
+
+ if (dataContratEnCours.valid) {
+
+ // Obtenir la date actuelle au format "JJ/MM/AAAA"
+ const currentDate = new Date();
+ const day = String(currentDate.getDate()).padStart(2, '0');
+ const month = String(currentDate.getMonth() + 1).padStart(2, '0'); // Les mois sont indexés à partir de 0, donc +1
+ const year = currentDate.getFullYear();
+ const formattedDate = `${day}/${month}/${year}`;
+
+ //Obtenir l'user
+ const token = localStorage.getItem('jwtToken');
+ const decoded = jwt_decode(token);
+ const userFirstName = decoded.userFirstName;
+ const userLastName = decoded.userLastName;
+
+ // Obtenir l'heure actuelle au format "HHhMM"
+ const hours = String(currentDate.getHours()).padStart(2, '0');
+ const minutes = String(currentDate.getMinutes()).padStart(2, '0');
+ const seconds = String(currentDate.getSeconds()).padStart(2, '0');
+ const formattedTime = `${hours}:${minutes}:${seconds}`;
+ const nom = userLastName;
+ const prenom = userFirstName;
+
+ // Mettre à jour le champ "historique" dans le contrat avec les nouvelles données d'historique
+ const historiqueData = [
+ {
+ "type": contrat.type,
+ "date": formattedDate,
+ "heure": formattedTime,
+ "produit": "TPPC",
+ "id": idProjet,
+ "nom": nom,
+ "prenom": prenom,
+ }
+ ];
+
+ const responseHistoriqueUpdate = await fetch(`/contrat/update/historique/${contrat.id}`, {
+ method: 'POST',
+ body: JSON.stringify({historiqueData}),
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+
+ const dataHistoriqueUpdate = await responseHistoriqueUpdate.json();
+
+ if (dataHistoriqueUpdate.valid) {
+ window.location.href = `/navParcours?numParcours=${getNumParcoursFromURL()}&submenu=projet`;
+ } else {
+ console.log('Echec lors de la mise à jour de l\'historique du contrat :', dataHistoriqueUpdate.message);
+ }
+ }
+ } else {
+ console.log('Echec lors de la création de la saisie dans la collection TPPC :', data.message);
+ }
+ } else {
+ console.log('Echec lors de la création de la saisie dans la collection TPPCtarif :', data.message);
+ }
+
+
+ }
+
+ // Exposer init globalement pour y accéder depuis l'extérieur
+ window.initSubmenuForm = init;
+})();
\ No newline at end of file
diff --git a/ecole/src/constantes/json-modulateur-fac.js b/ecole/src/constantes/json-modulateur-fac.js
new file mode 100644
index 00000000..0fe50e6c
--- /dev/null
+++ b/ecole/src/constantes/json-modulateur-fac.js
@@ -0,0 +1,908 @@
+const objModNatureMar = {
+ "Toute autre marchandise non listée": {cat: "1", taux: 0.0004},
+ "Produits en bonbonnes": {cat: "2", taux: 0.0005},
+ "Liquides en bouteilles": {cat: "2", taux: 0.0005},
+ "Matériel Electrique: accesoires et appareillages électriques": {cat: "2", taux: 0.0005},
+ "Instruments de mesure": {cat: "2", taux: 0.0005},
+ "Objets en pierre, cristal, marbre, bois, ivoire, verre, porcelaine, céramique, terre-cuite, plâtre": {cat: "2", taux: 0.0005},
+ "Verres à vitres, Miroirs, marbre, tuiles, ardoises, carrelages, poterie, céramiques": {cat: "2", taux: 0.0005},
+ "Lampes et Luminaires": {cat: "2", taux: 0.0005},
+ "Meubles de consommation, meubles artisanaux massifs": {cat: "2", taux: 0.0005},
+ "Produits pharmaceutiques ou hospitaliers": {cat: "2", taux: 0.0005},
+ "Optiques": {cat: "2", taux: 0.0005},
+ "Matériels médicaux": {cat: "2", taux: 0.0005},
+ "Petit et gros électroménager": {cat: "2", taux: 0.0005},
+ "textiles et habillements, accessoires de mode": {cat: "2", taux: 0.0005},
+ "Matériel et équipement de sports et loisirs (vélos et trotinettes yc électriques) gyropodes": {cat: "2", taux: 0.0005},
+ "Parfumerie, cosmétique": {cat: "2", taux: 0.0005},
+ "Maroquinerie": {cat: "2", taux: 0.0005},
+ "Chaussures et articles chaussants": {cat: "2", taux: 0.0005},
+ "Téléviseurs, HiFi, vidéo, appareils photos, matériels informatiques y compris accessoires, consommables": {cat: "2", taux: 0.0005},
+ "Jeux et consoles vidéo": {cat: "2", taux: 0.0005},
+ "Pneumatiques": {cat: "2", taux: 0.0005},
+ "Horlogerie": {cat: "2", taux: 0.0005},
+ "Bijouterie fantaisie (non précieux max 300€ par unité)": {cat: "2", taux: 0.0005},
+ "Alimentation de luxe et épicerie fine": {cat: "2", taux: 0.0005},
+ "Instruments de musique, y compris pièces de rechange et accessoires": {cat: "2", taux: 0.0005},
+ "Outillage": {cat: "2", taux: 0.0005},
+ "Appareils et équipements sanitaires (robinetterie, droguerie, fonte ou faience)": {cat: "2", taux: 0.0005},
+ "Equipements Aéronautiques": {cat: "2", taux: 0.0005},
+ "Machines outils, Matériel agricole, travaux publics (matériaux de construction), câbles, chaudronnerie": {cat: "3", taux: 0.0005},
+ "Peintures et produits chimiques en fûts": {cat: "3", taux: 0.0005},
+ "Matériel Electrique": {cat: "3", taux: 0.0005},
+ "Moteurs, groupes électrogènes, transformateurs": {cat: "3", taux: 0.0005},
+ "Pièces détachées ou gros outillage industriel": {cat: "3", taux: 0.0005},
+ "Matériels ferroviaires": {cat: "3", taux: 0.0005},
+ "Produits frais ; Plantes vivantes": {cat: "4", taux: 0.0007},
+ "Produits congelés, réfrigérés, surgelés": {cat: "4", taux: 0.0007},
+ "Produits alimentaires et alimentation animale": {cat: "4", taux: 0.0007},
+ "Tous véhicules (hors matériel agricole) à moteurs: auto, deux roues, camion": {cat: "5", taux: 0.0012},
+ "Machines tractées / remorquées (Transportées sur leurs propres essieux)": {cat: "5", taux: 0.0012},
+ "Bijoux, pierres et métaux précieux": {cat: "6", taux: 0.005},
+ "Tableaux, dessins, esquisses": {cat: "6", taux: 0.005},
+ "Articles et vêtements de marque de luxe, fourrure naturelle": {cat: "6", taux: 0.005},
+ "Supports papiers, magnétiques, électroniques ou optiques de transfert de fonds ou de paiement": {cat: "6", taux: 0.005},
+ "Effets et bagages personnels dont ordinateurs et téléphones portables": {cat: "6", taux: 0.005},
+ "Toute marchandise dont la valeur marchande est sans commune mesure avec leur valeur intrinsèque: objets d'art, sculpture peinture, antiquités, objets de curiosité ou de collection, documents, échantillons, prototypes": {cat: "6", taux: 0.005},
+ "Orfévrerie, monnaies": {cat: "6", taux: 0.005},
+ "Billets de banque, actions, obligations, coupons, timbres poste, titres et valeurs de toute espèce": {cat: "6", taux: 0.005},
+ "Véhicule de collection": {cat: "6", taux: 0.005},
+ "Déménagements privés": {cat: "7", taux: 0.008},
+ "Déménagements d'entreprises": {cat: "8", taux: 0.5},
+ "Animaux vivants": {cat: "8", taux: 0.5},
+ "Métaux bruts": {cat: "8", taux: 0.5},
+ "Combustibles": {cat: "8", taux: 0.5},
+ "Matières premières": {cat: "8", taux: 0.5},
+ "Marchandises en vrac": {cat: "8", taux: 0.5}
+}
+
+const objModMontantCA = {
+ "250000": {
+ "5000": 0.84, "10000": 0.84, "25000": 0.84, "50000": 0.84,
+ "100000": 0.893, "310000": 0.945, "500000": 1.05, "750000": 1.155, "1000000": 1.208
+ },
+ "500000": {
+ "5000": 0.8, "10000": 0.8, "25000": 0.8, "50000": 0.8,
+ "100000": 0.85, "310000": 0.9, "500000": 1, "750000": 1.1, "1000000": 1.15
+ },
+ "1000000": {
+ "5000": 0.76, "10000": 0.76, "25000": 0.76, "50000": 0.76,
+ "100000": 0.808, "310000": 0.855, "500000": 0.95, "750000": 1.045, "1000000": 1.093
+ },
+ "2000000": {
+ "5000": 0.72, "10000": 0.72, "25000": 0.72, "50000": 0.72,
+ "100000": 0.765, "310000": 0.81, "500000": 0.9, "750000": 0.99, "1000000": 1.035
+ },
+ "3000000": {
+ "5000": 0.68, "10000": 0.68, "25000": 0.68, "50000": 0.68,
+ "100000": 0.723, "310000": 0.765, "500000": 0.85, "750000": 0.935, "1000000": 0.978
+ },
+ "4000000": {
+ "5000": 0.64, "10000": 0.64, "25000": 0.64, "50000": 0.64,
+ "100000": 0.68, "310000": 0.72, "500000": 0.8, "750000": 0.88, "1000000": 0.92
+ },
+ "5000000": {
+ "5000": 0.6, "10000": 0.6, "25000": 0.6, "50000": 0.6,
+ "100000": 0.638, "310000": 0.675, "500000": 0.75, "750000": 0.825, "1000000": 0.863
+ },
+ "7500000": {
+ "5000": 0.56, "10000": 0.56, "25000": 0.56, "50000": 0.56,
+ "100000": 0.595, "310000": 0.63, "500000": 0.7, "750000": 0.77, "1000000": 0.805
+ },
+ "10000000": {
+ "5000": 0.52, "10000": 0.52, "25000": 0.52, "50000": 0.52,
+ "100000": 0.553, "310000": 0.585, "500000": 0.65, "750000": 0.715, "1000000": 0.748
+ },
+ "15000000": {
+ "5000": 0.456, "10000": 0.456, "25000": 0.456, "50000": 0.456,
+ "100000": 0.485, "310000": 0.513, "500000": 0.57, "750000": 0.627, "1000000": 0.656
+ },
+ "20000000": {
+ "5000": 0.36, "10000": 0.36, "25000": 0.36, "50000": 0.36,
+ "100000": 0.383, "310000": 0.405, "500000": 0.45, "750000": 0.495, "1000000": 0.518
+ },
+ "30000000": {
+ "5000": 0.296, "10000": 0.296, "25000": 0.296, "50000": 0.296,
+ "100000": 0.315, "310000": 0.333, "500000": 0.37, "750000": 0.407, "1000000": 0.426
+ },
+ "40000000": {
+ "5000": 0.28, "10000": 0.28, "25000": 0.28, "50000": 0.28,
+ "100000": 0.298, "310000": 0.315, "500000": 0.35, "750000": 0.385, "1000000": 0.403
+ },
+ "50000000": {
+ "5000": 0.216, "10000": 0.216, "25000": 0.216, "50000": 0.216,
+ "100000": 0.23, "310000": 0.243, "500000": 0.27, "750000": 0.297, "1000000": 0.311
+ }
+};
+
+// const objModFranchiseTousCas = {
+// 149: 1,
+// 300: 0.9,
+// 750: 0.85,
+// 1500: 0.80,
+// 3000: 0.75,
+// 5000: 0.7
+// };
+
+const objModAct = {
+ "Activite de pre-presse": 1,
+ "Activites artistiques": 2.5,
+ "Activites comptables": 1,
+ "Activites d'architecture": 1,
+ "Activites de banques de donnees": 1.86,
+ "Activites de nettoyage": 1,
+ "Activites des auxiliaires medicaux": 1,
+ "Activites diverses liees au sport": 1,
+ "Activites graphiques auxiliaires": 1,
+ "Activites hospitalieres": 1,
+ "Activites juridiques": 1,
+ "Administration d'autres biens immobiliers": 1,
+ "Administration d'entreprises": 1.86,
+ "Administration d'immeubles residentiels": 1,
+ "Administration publique generale": 1,
+ "Affretement": 1,
+ "Agencement de lieux de vente": 1,
+ "Agences de presse": 1,
+ "Agences de voyage": 1,
+ "Agences immobilieres": 1,
+ "Agences, conseil en publicite": 1,
+ "Aide par le travail, ateliers proteges": 1,
+ "Analyses, essais et inspections techniques": 1,
+ "Appret et tannage des cuirs": 1,
+ "Assemblage de cartes electroniques pour compte de": 1,
+ "Assurance relevant du code de la mutualite": 1,
+ "Autre hebergement touristique": 1,
+ "Autre imprimerie (labeur)": 1,
+ "Autres activites de courrier": 1,
+ "Autres activites de realisation de logiciels": 1.86,
+ "Autres activites d'edition": 1,
+ "Autres activites manufacturieres n.c.a": 1,
+ "Autres activites recreatives": 1,
+ "Autres auxiliaires financiers": 1,
+ "Autres commerces de detail en magasin non speciali": 1,
+ "Autres commerces de gros de biens de consommation": 1,
+ "Autres commerces de gros specialises": 1,
+ "Autres enseignements": 1,
+ "Autres formes d'action sociale": 1,
+ "Autres intermediaires specialises du commerce": 1,
+ "Autres services personnels": 1,
+ "Autres transports routiers de voyageurs": 1,
+ "Autres travaux d'installation": 1,
+ "Autres travaux specialises de construction": 1.01,
+ "Auxiliaires d'assurance": 1,
+ "Bijouterie fantaisie": 1,
+ "Bijouterie, joaillerie, orfevrerie": 2.5,
+ "Biscotterie, biscuiterie, patisserie de conservati": 1.86,
+ "Blanchisserie, teinturerie de detail": 1,
+ "Boulangerie et boulangerie-patisserie": 1,
+ "Brasserie": 1,
+ "Captage, traitement et distribution d'eau": 1,
+ "Centrales d'achats alimentaires": 1,
+ "Centrales d'achats non alimentaires": 2.5,
+ "Centres de collecte et banques d'organes": 1,
+ "Champagnisation": 1,
+ "Charcuterie": 1,
+ "Chaudronnerie nucleaire": 1,
+ "Chaudronnerie -tuyauterie": 1.99,
+ "Chocolaterie, confiserie": 1,
+ "Cidrerie": 1,
+ "Commerce d'alimentation generale": 1,
+ "Commerce de detail alimentaire sur eventaires et m": 1,
+ "Commerce de detail d'appareils electromenagers et": 1.86,
+ "Commerce de detail d'articles de sport de loisirs": 1,
+ "Commerce de detail d'articles medicaux et orthoped": 1,
+ "Commerce de détail de biens d'occasion": 1,
+ "Commerce de detail de boissons": 1.01,
+ "Commerce de detail de carburants": 1,
+ "Commerce de detail de charbons et combustibles": 1,
+ "Commerce de detail de fleurs": 1.99,
+ "Commerce de detail de fruits et legumes": 1.01,
+ "Commerce de detail de la chaussure": 1.86,
+ "Commerce de detail de livres, journaux et papeteri": 1,
+ "Commerce de detail de maroquinerie et articles de": 1,
+ "Commerce de detail de meubles": 1,
+ "Commerce de detail de parfumerie et de produits de": 1.86,
+ "Commerce de detail de poissons, crustaces et mollu": 1,
+ "Commerce de detail de produits pharmaceutiques": 1,
+ "Commerce de detail de quincaillerie": 1,
+ "Commerce de detail de viandes et produits a base d": 1,
+ "Commerce de detail d'equipements automobiles": 1,
+ "Commerce de detail d'equipements du foyer": 1.86,
+ "Commerce de detail d'habillement": 1.86,
+ "Commerce de detail d'horlogerie et de bijouterie": 1,
+ "Commerce de detail divers en magasin specialise": 1,
+ "Commerce de detail d'optique, et de photographie": 1,
+ "Commerce de detail non alimentaire sur eventaires": 1,
+ "Commerce de gros alimentaire non specialise": 1.01,
+ "Commerce de gros d'animaux vivants": 1.86,
+ "Commerce de gros d'appareils electromenagers et de": 1,
+ "Commerce de gros d'autres machines et equipements": 1.86,
+ "Commerce de gros d'autres produits intermediaires": 1,
+ "Commerce de gros de bois et de produits derives": 1,
+ "Commerce de gros de boissons": 1.86,
+ "Commerce de gros de cafe, the, cacao et epices": 1,
+ "Commerce de gros de cereales et aliments pour le b": 1.86,
+ "Commerce de gros de combustibles": 1,
+ "Commerce de gros de composants et d'autres equipem": 1,
+ "Commerce de gros de cuirs et peaux": 1,
+ "Commerce de gros de dechets et debris": 1,
+ "Commerce de gros de fournitures et equipements div": 1,
+ "Commerce de gros de fournitures et equipements ind": 1.99,
+ "Commerce de gros de fournitures pour plomberie et": 1,
+ "Commerce de gros de fruits et legumes": 1.01,
+ "Commerce de gros de jouets": 1,
+ "Commerce de gros de la chaussure": 1.86,
+ "Commerce de gros de machines pour l'extraction, la": 1,
+ "Commerce de gros de machines pour l'industrie text": 1,
+ "Commerce de gros de machines-outils": 1.86,
+ "Commerce de gros de materiaux de construction et a": 1,
+ "Commerce de gros de materiel agricole": 1.99,
+ "Commerce de gros de materiel electrique": 1.01,
+ "Commerce de gros de minerais et metaux": 1,
+ "Commerce de gros de papeterie": 1,
+ "Commerce de gros de parfumerie et produits de beau": 1.86,
+ "Commerce de gros de poissons, crustaces et mollusq": 1,
+ "Commerce de gros de produits chimiques": 1.01,
+ "Commerce de gros de produits laitiers, œufs, huile": 1,
+ "Commerce de gros de produits pharmaceutiques": 1,
+ "Commerce de gros de produits pour entretien et ame": 1,
+ "Commerce de gros de produits surgeles": 1.86,
+ "Commerce de gros de quincaillerie": 1.86,
+ "Commerce de gros de sucre, chocolat et confiserie": 1,
+ "Commerce de gros de textiles": 1.99,
+ "Commerce de gros de vaisselle et verrerie de menag": 2.5,
+ "Commerce de gros de viandes de boucherie": 1,
+ "Commerce de gros d'equipements automobiles": 1.99,
+ "Commerce de gros d'habillement": 1.86,
+ "Commerce de gros d'ordinateurs, d'equipements info": 1.86,
+ "Commerce de gros non specialise": 1,
+ "Commerce de vehicules automobiles": 1,
+ "Commerce et reparation de motocycles": 1,
+ "Commerces de gros alimentaires specialises divers": 1.86,
+ "Conditionnement a facon": 1,
+ "Conseil en systemes informatiques": 1,
+ "Conseil pour les affaires et la gestion": 1,
+ "Construction de bateaux de plaisance": 1,
+ "Construction de batiments divers": 1,
+ "Construction de cellules d'aeronefs": 1,
+ "Construction de chaussees routieres et de sols spo": 1,
+ "Construction de maisons individuelles": 1,
+ "Construction de navires civiles": 1,
+ "Construction de vehicules automobiles": 1,
+ "Creches et garderies d'enfants": 1,
+ "Culture de cereales ; cultures industrielles": 2.5,
+ "Culture de legumes ; maraichage": 1,
+ "Culture et elevage associes": 1.01,
+ "Culture fruitiere": 1.86,
+ "Debits de boissons": 1,
+ "Decolletage": 1,
+ "Decoupage, emboutissage": 1,
+ "Demenagement": 2.5,
+ "Edition de chaines thematiques": 1,
+ "edition de journaux": 1,
+ "Edition de logiciels (non personnalises)": 1,
+ "edition de revues et periodiques": 1,
+ "edition d'enregistrements sonores": 1,
+ "Elevage d'autres animaux": 1,
+ "Elevage de bovins": 1,
+ "Elevage de porcins": 1,
+ "Elevage de volailles": 1,
+ "Enlevement et traitement des ordures menageres": 1,
+ "Ennoblissement textile": 1,
+ "Enquetes et securite": 1,
+ "Enseignement superieur": 1,
+ "Entreposage frigorifique": 1,
+ "Entreposage non frigorifique": 1,
+ "Entretien d'espaces verts": 1,
+ "Entretien et reparation de vehicules automobiles": 1,
+ "Entretien, reparation machines de bureau et materi": 1.86,
+ "epuration des eaux usees": 1,
+ "etudes de marche et sondage": 1,
+ "Exploitation de terrains de camping": 1,
+ "Exploitation forestiere": 1,
+ "Extraction de pierres pour la construction": 1,
+ "Fabrication d'aliments adaptes a l'enfant et diete": 1,
+ "Fabrication d'aliments pour animaux de ferme": 1,
+ "Fabrication d'appareils de pesage": 1.86,
+ "Fabrication d'appareils de reception, d'enregistre": 1.86,
+ "Fabrication d'appareils de telephonie": 1.86,
+ "Fabrication d'appareils d'eclairage": 1,
+ "Fabrication d'appareils medicochirurgicaux": 1,
+ "Fabrication d'articles ceramiques a usage domestiq": 1,
+ "Fabrication d'articles chaussants a maille": 1,
+ "Fabrication d'articles de papeterie": 1,
+ "Fabrication d'articles de robinetterie": 1.01,
+ "Fabrication d'articles de sport": 1.01,
+ "Fabrication d'articles de voyage et de maroquineri": 1,
+ "Fabrication d'articles divers en matieres plastiqu": 1,
+ "Fabrication d'articles en films metalliques": 1,
+ "Fabrication d'articles en papier a usage sanitaire": 1,
+ "Fabrication d'articles metalliques divers": 1,
+ "Fabrication d'articles metalliques menagers": 1,
+ "Fabrication d'autres articles confectionnes en tex": 1.01,
+ "Fabrication d'autres articles en caoutchouc": 1,
+ "Fabrication d'autres articles en papier ou en cart": 1.86,
+ "Fabrication d'autres machines d'usage general": 1.86,
+ "Fabrication d'autres machines-outils": 1,
+ "Fabrication d'autres produits chimiques inorganiqu": 1.86,
+ "Fabrication d'autres produits chimiques organiques": 1,
+ "Fabrication d'autres produits laitiers": 1.01,
+ "Fabrication d'autres produits pharmaceutiques": 1,
+ "Fabrication d'autres vetements et accessoires": 1,
+ "Fabrication de bicyclettes": 1,
+ "Fabrication de caravanes et vehicules de loisirs": 1,
+ "Fabrication de cartonnages": 1,
+ "Fabrication de charpentes et de menuiseries": 1.86,
+ "Fabrication de chaussures": 1,
+ "Fabrication de composants electroniques actifs": 1,
+ "Fabrication de composants passifs et de condensate": 1.86,
+ "Fabrication de compresseurs": 1,
+ "Fabrication de condiments et assaisonnements": 1.86,
+ "Fabrication de constructions metalliques": 1,
+ "Fabrication de coutellerie": 1,
+ "Fabrication de fibres artificielles ou synthetique": 1,
+ "Fabrication de fils a coudre": 1,
+ "Fabrication de fils et cables isoles": 1,
+ "Fabrication de fours et brûleurs": 1,
+ "Fabrication de glaces et sorbets": 1,
+ "Fabrication de jeux et jouets": 1,
+ "Fabrication de linge de maison et d'article d'ameu": 1,
+ "Fabrication de lunettes": 1.01,
+ "Fabrication de machines d'assemblage automatique": 1,
+ "Fabrication de machines de bureau": 1,
+ "Fabrication de machines d'imprimerie": 2.5,
+ "Fabrication de machines pour les industriels du pa": 1,
+ "Fabrication de machines pour les industries textil": 1,
+ "Fabrication de machines pour l'industrie agroalime": 1.01,
+ "Fabrication de machines pour travail du caoutchouc": 1.86,
+ "Fabrication de machines-outils a bois": 1,
+ "Fabrication de machines-outils a metaux": 1,
+ "Fabrication de machines-outils portative a moteur": 1,
+ "Fabrication de matelas": 1,
+ "Fabrication de materiel agricole": 1,
+ "Fabrication de materiel de sondage": 1,
+ "Fabrication de materiel d'imagerie medicale et de": 1,
+ "Fabrication de materiel electromagnetique industri": 1,
+ "Fabrication de materiel pour les industries chimiq": 2.5,
+ "Fabrication de materiels de distribution et de com": 1.99,
+ "Fabrication de materiels de travaux publics": 1,
+ "Fabrication de materiels electriques n.c.a": 1,
+ "Fabrication de materiels electriques pour moteurs": 1,
+ "Fabrication de medicaments": 1,
+ "Fabrication de menuiseries et fermetures metalliqu": 1.86,
+ "Fabrication de meubles de bureau et de magasin": 2.5,
+ "Fabrication de meubles meublants": 1,
+ "Fabrication de meubles n.c.a": 1.86,
+ "Fabrication de moteurs, generatrices et transforma": 2.5,
+ "Fabrication de motocycles": 1.01,
+ "Fabrication de moules et modeles": 1,
+ "Fabrication de non tisses": 1,
+ "Fabrication de panneaux de bois": 1.99,
+ "Fabrication de papier ou de carton": 1,
+ "Fabrication de papiers peints": 1.86,
+ "Fabrication de parfums et de produits pour la toil": 1,
+ "Fabrication de pates alimentaires": 1,
+ "Fabrication de peintures et de vernis": 1.01,
+ "Fabrication de petits articles metalliques": 1,
+ "Fabrication de petits articles textiles de literie": 1.01,
+ "Fabrication de pieces techniques en matieres plast": 1.86,
+ "Fabrication de plaques, feuilles, tubes et profile": 1,
+ "Fabrication de pompes": 1,
+ "Fabrication de produits agrochimiques": 1,
+ "Fabrication de produits chimiques a usage industri": 2.5,
+ "Fabrication de produits mineraux non metalliques n": 1,
+ "Fabrication de produits pharmaceutiques de base": 1.99,
+ "Fabrication de pull-overs et articles similaires": 2.5,
+ "Fabrication de radiateurs et de chaudieres pour le": 1,
+ "Fabrication de reservoirs, citernes et conteneurs": 1,
+ "Fabrication de ressorts": 1.99,
+ "Fabrication de roulements": 1,
+ "Fabrication de serrures et ferrures": 1,
+ "Fabrication de sieges": 1,
+ "Fabrication de spiritueux": 1,
+ "Fabrication de tapis et moquettes": 1,
+ "Fabrication de transmissions hydrauliques et pneum": 1.01,
+ "Fabrication de tubes en acier": 1,
+ "Fabrication de verre plat": 1,
+ "Fabrication de vetements de dessous": 2.5,
+ "Fabrication de vetements de dessus pour femmes": 1.86,
+ "Fabrication de vetements de dessus pour hommes": 1,
+ "Fabrication de vetements de travail": 1,
+ "Fabrication de vetements en cuir": 1.86,
+ "Fabrication de vetements sur mesure": 1,
+ "Fabrication d'elements en beton pour la constructi": 1,
+ "Fabrication d'elements en matieres plastiques pour": 1,
+ "Fabrication d'emballages en bois": 1.99,
+ "Fabrication d'emballages en matieres plastiques": 1.86,
+ "Fabrication d'emballages en papier": 1,
+ "Fabrication d'emballages metalliques legers": 1,
+ "Fabrication d'equipements aerauliques et frigorifi": 1,
+ "Fabrication d'equipements automobiles": 1,
+ "Fabrication d'equipements de controle des processu": 1,
+ "Fabrication d'equipements de levage et de manutent": 1,
+ "Fabrication d'equipements d'emballage et de condit": 1.01,
+ "Fabrication d'equipements d'emission et de transmi": 1,
+ "Fabrication d'etoffes a maille": 1,
+ "Fabrication d'huiles essentielles": 1,
+ "Fabrication d'instrumentation scientifique et tech": 1,
+ "Fabrication d'instruments d'aide a la navigation": 1,
+ "Fabrication d'instruments de musiques": 1,
+ "Fabrication d'instruments d'optique et de materiel": 1,
+ "Fabrication d'isolateurs en verre": 1.86,
+ "Fabrication d'isolateurs et pieces isolantes en ce": 1,
+ "Fabrication d'objets divers en bois": 1,
+ "Fabrication d'objets en liège, vannerie ou sparter": 1,
+ "Fabrication d'ordinateurs et d'autres equipements": 1,
+ "Fabrication d'organes mecaniques de transmissions": 2.5,
+ "Fabrication d'outillage a main": 1,
+ "Fabrication d'outillage mecanique": 1,
+ "Fabrication du verre creux": 1,
+ "Fabrication et faconnage d'articles techniques en": 1,
+ "Fabrication et transformation du verre plat": 2.5,
+ "Fabrication industrielle de pain et de patisserie": 1.01,
+ "Fabrication machines specialisees diverses": 1,
+ "Ficellerie, corderie, fabrication de filets": 1,
+ "Fonderie d'acier": 1,
+ "Fonderie d'autres metaux non ferreux": 1,
+ "Fonderie de fonte": 1,
+ "Fonderie de metaux legers": 1,
+ "Forages et sondages": 1,
+ "Forge, estampage, matricage": 1,
+ "Formation des adultes et formation continue": 1,
+ "Gestion de portefeuilles": 2.5,
+ "Gestion de salles de spectacle": 1,
+ "Gestion de supports de publicite": 1,
+ "Gestion d'installations sportives": 1,
+ "Gestion du patrimoine culturel": 1,
+ "Horlogerie": 1.86,
+ "Horticulture ; pepinieres": 1,
+ "Hotels avec restaurant": 1,
+ "Hotels de tourisme sans restaurant": 1,
+ "Industrie de la brosserie": 1,
+ "Industrie du carton ondule": 1,
+ "Industrie du poisson": 1,
+ "Industries alimentaires n.c.a": 1.86,
+ "Industries connexes de l'ameublement": 1,
+ "Industries textiles n.c.a": 1,
+ "Ingenierie, etudes techniques": 1,
+ "Installation d'eau et de gaz": 2.5,
+ "Enlevement et traitement des ordures menageres": 1,
+ "Ennoblissement textile": 1,
+ "Enquetes et securite": 1,
+ "Enseignement superieur": 1,
+ "Entreposage frigorifique": 1,
+ "Entreposage non frigorifique": 1,
+ "Entretien d'espaces verts": 1,
+ "Entretien et reparation de vehicules automobiles": 1,
+ "Entretien, reparation machines de bureau et materi": 1.86,
+ "epuration des eaux usees": 1,
+ "etudes de marche et sondage": 1,
+ "Exploitation de terrains de camping": 1,
+ "Exploitation forestiere": 1,
+ "Extraction de pierres pour la construction": 1,
+ "Fabrication d'aliments adaptes a l'enfant et diete": 1,
+ "Fabrication d'aliments pour animaux de ferme": 1,
+ "Fabrication d'appareils de pesage": 1.86,
+ "Fabrication d'appareils de reception, d'enregistre": 1.86,
+ "Fabrication d'appareils de telephonie": 1.86,
+ "Fabrication d'appareils d'eclairage": 1,
+ "Fabrication d'appareils medicochirurgicaux": 1,
+ "Fabrication d'articles ceramiques a usage domestiq": 1,
+ "Fabrication d'articles chaussants a maille": 1,
+ "Fabrication d'articles de papeterie": 1,
+ "Fabrication d'articles de robinetterie": 1.01,
+ "Fabrication d'articles de sport": 1.01,
+ "Fabrication d'articles de voyage et de maroquineri": 1,
+ "Fabrication d'articles divers en matieres plastiqu": 1,
+ "Fabrication d'articles en films metalliques": 1,
+ "Fabrication d'articles en papier a usage sanitaire": 1,
+ "Fabrication d'articles metalliques divers": 1,
+ "Fabrication d'articles metalliques menagers": 1,
+ "Fabrication d'autres articles confectionnes en tex": 1.01,
+ "Fabrication d'autres articles en caoutchouc": 1,
+ "Fabrication d'autres articles en papier ou en cart": 1.86,
+ "Fabrication d'autres machines d'usage general": 1.86,
+ "Fabrication d'autres machines-outils": 1,
+ "Fabrication d'autres produits chimiques inorganiqu": 1.86,
+ "Fabrication d'autres produits chimiques organiques": 1,
+ "Fabrication d'autres produits laitiers": 1.01,
+ "Fabrication d'autres produits pharmaceutiques": 1,
+ "Fabrication d'autres vetements et accessoires": 1,
+ "Fabrication de bicyclettes": 1,
+ "Fabrication de caravanes et vehicules de loisirs": 1,
+ "Fabrication de cartonnages": 1,
+ "Fabrication de charpentes et de menuiseries": 1.86,
+ "Fabrication de chaussures": 1,
+ "Fabrication de composants electroniques actifs": 1,
+ "Fabrication de composants passifs et de condensate": 1.86,
+ "Fabrication de compresseurs": 1,
+ "Fabrication de condiments et assaisonnements": 1.86,
+ "Fabrication de constructions metalliques": 1,
+ "Fabrication de coutellerie": 1,
+ "Fabrication de fibres artificielles ou synthetique": 1,
+ "Fabrication de fils a coudre": 1,
+ "Fabrication de fils et cables isoles": 1,
+ "Fabrication de fours et brûleurs": 1,
+ "Fabrication de glaces et sorbets": 1,
+ "Fabrication de jeux et jouets": 1,
+ "Fabrication de linge de maison et d'article d'ameu": 1,
+ "Fabrication de lunettes": 1.01,
+ "Fabrication de machines d'assemblage automatique": 1,
+ "Fabrication de machines de bureau": 1,
+ "Fabrication de machines d'imprimerie": 2.5,
+ "Fabrication de machines pour les industriels du pa": 1,
+ "Fabrication de machines pour les industries textil": 1,
+ "Fabrication de machines pour l'industrie agroalime": 1.01,
+ "Fabrication de machines pour travail du caoutchouc": 1.86,
+ "Fabrication de machines-outils a bois": 1,
+ "Fabrication de machines-outils a metaux": 1,
+ "Fabrication de machines-outils portative a moteur": 1,
+ "Fabrication de matelas": 1,
+ "Fabrication de materiel agricole": 1,
+ "Fabrication de materiel de sondage": 1,
+ "Fabrication de materiel d'imagerie medicale et de": 1,
+ "Fabrication de materiel electromagnetique industri": 1,
+ "Fabrication de materiel pour les industries chimiq": 2.5,
+ "Fabrication de materiels de distribution et de com": 1.99,
+ "Fabrication de materiels de travaux publics": 1,
+ "Fabrication de materiels electriques n.c.a": 1,
+ "Fabrication de materiels electriques pour moteurs": 1,
+ "Fabrication de medicaments": 1,
+ "Fabrication de menuiseries et fermetures metalliqu": 1.86,
+ "Fabrication de meubles de bureau et de magasin": 2.5,
+ "Fabrication de meubles meublants": 1,
+ "Fabrication de meubles n.c.a": 1.86,
+ "Fabrication de moteurs, generatrices et transforma": 2.5,
+ "Fabrication de motocycles": 1.01,
+ "Fabrication de moules et modeles": 1,
+ "Fabrication de non tisses": 1,
+ "Fabrication de panneaux de bois": 1.99,
+ "Fabrication de papier ou de carton": 1,
+ "Fabrication de papiers peints": 1.86,
+ "Fabrication de parfums et de produits pour la toil": 1,
+ "Fabrication de pates alimentaires": 1,
+ "Fabrication de peintures et de vernis": 1.01,
+ "Fabrication de petits articles metalliques": 1,
+ "Fabrication de petits articles textiles de literie": 1.01,
+ "Fabrication de pieces techniques en matieres plast": 1.86,
+ "Fabrication de plaques, feuilles, tubes et profile": 1,
+ "Fabrication de pompes": 1,
+ "Fabrication de produits agrochimiques": 1,
+ "Fabrication de produits chimiques a usage industri": 2.5,
+ "Fabrication de produits mineraux non metalliques n": 1,
+ "Fabrication de produits pharmaceutiques de base": 1.99,
+ "Fabrication de pull-overs et articles similaires": 2.5,
+ "Fabrication de radiateurs et de chaudieres pour le": 1,
+ "Fabrication de reservoirs, citernes et conteneurs": 1,
+ "Fabrication de ressorts": 1.99,
+ "Fabrication de roulements": 1,
+ "Fabrication de serrures et ferrures": 1,
+ "Fabrication de sieges": 1,
+ "Fabrication de spiritueux": 1,
+ "Fabrication de tapis et moquettes": 1,
+ "Fabrication de transmissions hydrauliques et pneum": 1.01,
+ "Fabrication de tubes en acier": 1,
+ "Fabrication de verre plat": 1,
+ "Fabrication de vetements de dessous": 2.5,
+ "Fabrication de vetements de dessus pour femmes": 1.86,
+ "Fabrication de vetements de dessus pour hommes": 1,
+ "Fabrication de vetements de travail": 1,
+ "Fabrication de vetements en cuir": 1.86,
+ "Fabrication de vetements sur mesure": 1,
+ "Fabrication d'elements en beton pour la constructi": 1,
+ "Fabrication d'elements en matieres plastiques pour": 1,
+ "Fabrication d'emballages en bois": 1.99,
+ "Fabrication d'emballages en matieres plastiques": 1.86,
+ "Fabrication d'emballages en papier": 1,
+ "Fabrication d'emballages metalliques legers": 1,
+ "Fabrication d'equipements aerauliques et frigorifi": 1,
+ "Fabrication d'equipements automobiles": 1,
+ "Fabrication d'equipements de controle des processu": 1,
+ "Fabrication d'equipements de levage et de manutent": 1,
+ "Fabrication d'equipements d'emballage et de condit": 1.01,
+ "Fabrication d'equipements d'emission et de transmi": 1,
+ "Fabrication d'etoffes a maille": 1,
+ "Fabrication d'huiles essentielles": 1,
+ "Fabrication d'instrumentation scientifique et tech": 1,
+ "Fabrication d'instruments d'aide a la navigation": 1,
+ "Fabrication d'instruments de musiques": 1,
+ "Fabrication d'instruments d'optique et de materiel": 1,
+ "Fabrication d'isolateurs en verre": 1.86,
+ "Fabrication d'isolateurs et pieces isolantes en ce": 1,
+ "Fabrication d'objets divers en bois": 1,
+ "Fabrication d'objets en liège, vannerie ou sparter": 1,
+ "Fabrication d'ordinateurs et d'autres equipements": 1,
+ "Fabrication d'organes mecaniques de transmissions": 2.5,
+ "Fabrication d'outillage a main": 1,
+ "Fabrication d'outillage mecanique": 1,
+ "Fabrication du verre creux": 1,
+ "Fabrication et faconnage d'articles techniques en": 1,
+ "Fabrication et transformation du verre plat": 2.5,
+ "Fabrication industrielle de pain et de patisserie": 1.01,
+ "Fabrication machines specialisees diverses": 1,
+ "Ficellerie, corderie, fabrication de filets": 1,
+ "Fonderie d'acier": 1,
+ "Fonderie d'autres metaux non ferreux": 1,
+ "Fonderie de fonte": 1,
+ "Fonderie de metaux legers": 1,
+ "Forages et sondages": 1,
+ "Forge, estampage, matricage": 1,
+ "Formation des adultes et formation continue": 1,
+ "Gestion de portefeuilles": 2.5,
+ "Gestion de salles de spectacle": 1,
+ "Gestion de supports de publicite": 1,
+ "Gestion d'installations sportives": 1,
+ "Gestion du patrimoine culturel": 1,
+ "Horlogerie": 1.86,
+ "Horticulture ; pepinieres": 1,
+ "Hotels avec restaurant": 1,
+ "Hotels de tourisme sans restaurant": 1,
+ "Industrie de la brosserie": 1,
+ "Industrie du carton ondule": 1,
+ "Industrie du poisson": 1,
+ "Industries alimentaires n.c.a": 1.86,
+ "Industries connexes de l'ameublement": 1,
+ "Industries textiles n.c.a": 1,
+ "Ingenierie, etudes techniques": 1,
+ "Installation d'eau et de gaz": 2.5,
+ "Installation d'equipements thermiques et de climat": 2.5,
+ "Intermediaires du commerce en bois et materiaux de": 1,
+ "Intermediaires du commerce en combustibles, metaux": 1,
+ "Intermediaires du commerce en machines, equipement": 1,
+ "Intermediaires du commerce en matieres premieres a": 1,
+ "Intermediaires du commerce en meubles, articles de": 1,
+ "Intermediaires du commerce en produits alimentaire": 1,
+ "Intermediaires du commerce en textiles, habillemen": 1,
+ "Intermediaires non specialises du commerce": 1.86,
+ "Laboratoires d'analyses medicales": 1,
+ "Levage, montage": 1,
+ "Location avec operateur de materiel de constructio": 1,
+ "Location d'autres biens immobiliers": 1.86,
+ "Location d'autres biens personnels et domestiques": 1,
+ "Location d'autres materiels de transport terrestre": 1.01,
+ "Location de camions avec conducteur": 1,
+ "Location de logements": 1,
+ "Location de longue duree de vehicules automobiles": 1,
+ "Location de machines de bureau et de materiel info": 1,
+ "Location de machines et equipements divers": 1,
+ "Location de machines et equipements pour la constr": 2.5,
+ "Location de materiels de transports aerien": 1,
+ "Location de terrains": 1,
+ "Maneges forains et parcs d'attractions": 1,
+ "Manutention non portuaire": 1.86,
+ "Marchand de biens immobiliers sans execution de tr": 1,
+ "Mecanique generale": 1,
+ "Menuiserie bois et matieres plastiques": 1,
+ "Menuiserie metallique ; serrurerie": 1.01,
+ "Messagerie, fret express": 1,
+ "Metallurgie des autres metaux non ferreux": 1,
+ "Metreurs, geometres": 1,
+ "Meunerie": 1,
+ "Moulinage et texturation de soie et textiles artif": 1.86,
+ "Organisation de foires et salons": 1.01,
+ "Organisation des transports internationaux": 2.5,
+ "Organisations associatives n.c.a": 1,
+ "Organisations patronales et consulaires": 1,
+ "Organismes de placement en valeurs immobilieres": 1,
+ "Patisserie": 1,
+ "Peinture": 1,
+ "Pisciculture, aquaculture": 1,
+ "Platrerie": 2.5,
+ "Pratique medicale": 1.01,
+ "Premiere transformation de l'aluminium": 1.86,
+ "Premiere transformation du plomb, du zinc ou de l'": 1,
+ "Preparation de la laine": 1,
+ "Preparation et filature du lin": 1,
+ "Preparation industrielle de produits a base de via": 1,
+ "Prestations techniques pour le cinema et la televi": 1,
+ "Production de films institutionnels et publicitair": 1,
+ "Production de films pour le cinema": 1,
+ "Production de programmes de television": 1,
+ "Production de viandes de boucherie": 1,
+ "Production de viandes de volaille": 1.86,
+ "Production d'eaux de vie naturelles": 1.86,
+ "Production d'electricite": 1,
+ "Production et distribution de chaleur": 1,
+ "Projection de films cinematographiques": 1,
+ "Promotion immobiliere de logements": 1,
+ "Raffinage de petrole": 1,
+ "Realisation de couvertures par elements": 1,
+ "Realisation de logiciel": 1,
+ "Realisation de reseaux": 1,
+ "Recherche-developpement en sciences humaines et so": 1,
+ "Recherche-developpement en sciences physiques et n": 1,
+ "Recuperation de matieres metalliques recyclables": 1,
+ "Recuperation de matieres non metalliques recyclabl": 1,
+ "Reliure": 1.99,
+ "Reparation d'articles personnels et domestiques n.": 1,
+ "Reparation de materiel electrique": 1,
+ "Reparation de materiel electronique grand public": 1,
+ "Reparation de montres, horloges et bijoux": 1,
+ "Reparation navale": 1,
+ "Restaurant de type rapide": 1,
+ "Restaurant de type traditionnel": 2.5,
+ "Revetement des sols et des murs": 1,
+ "Routage": 1,
+ "Sciage et rabotage du bois": 1,
+ "Secretariat et traduction": 1,
+ "Services annexes a la production": 1,
+ "Services annexes a l'elevage": 1,
+ "Services annexes a l'extraction d'hydrocarbures": 1,
+ "Services annexes aux spectacles": 1.86,
+ "Services aux cultures productives": 1,
+ "Services portuaires, maritimes et fluviaux": 1,
+ "Siderurgie": 1,
+ "Soins aux defunts": 1,
+ "Studios et autres activites photographiques": 1,
+ "Superettes": 1,
+ "Supermarches": 1,
+ "Supports juridiques de gestion de patrimoine": 1,
+ "Telecommunications (hors transmissions audiovisuel": 1,
+ "Terrassements divers, demolition": 1,
+ "Terrassements en grande masse": 1,
+ "Tissage de l'industrie cotonniere": 1,
+ "Tissage de l'industrie lainiere-cycle carde": 1,
+ "Tissage de soieries": 2.5,
+ "Traitement de donnees": 1,
+ "Traitement et revetement des metaux": 1,
+ "Traitements des autres dechets solides": 1,
+ "Transformation et conservation de fruits": 2.5,
+ "Transformation et conservation de legumes": 1,
+ "Transport de voyageurs par taxis": 1,
+ "Transports aeriens non reguliers": 1,
+ "Transports maritimes": 1,
+ "Transports par conduites": 1,
+ "Transports routiers de marchandises de proximite": 1,
+ "Transports routiers de marchandises interurbains": 1.01,
+ "Transports routiers reguliers de voyageurs": 1,
+ "Transports urbains de voyageurs": 2.5,
+ "Travail de la pierre": 1.01,
+ "Travaux de charpente": 1,
+ "Travaux de finition n.c.a": 1,
+ "Travaux de maconnerie general": 1,
+ "Travaux d'installation electrique": 1.99,
+ "Travaux d'isolation": 1,
+ "Tutelles des activites economiques": 1,
+ "Vente a domicile": 2.5,
+ "Vente par automate": 1,
+ "Vente par correspondance specialisee": 2.5,
+ "Vente par correspondance sur catalogue general": 1.01,
+ "Vinification": 1,
+ "Visserie et boulonnerie": 1,
+ "Viticulture": 1,
+}
+
+const objModCond = {
+ usuel: {
+ nom: "Cartons, Palettes, Conteneurs",
+ modulo: 1,
+ fluxDetailles: true,
+ fluxGlobal: true
+ },
+ nu: {
+ nom: "A nu",
+ modulo: 1.2,
+ fluxDetailles: true,
+ fluxGlobal: false
+
+ },
+ bennes: {
+ nom: "Vrac en Benne ou Citerne",
+ modulo: 1.2,
+ fluxDetailles: true,
+ fluxGlobal: false
+
+ },
+ sacs: {
+ nom: "En Sacs",
+ modulo: 1.2,
+ fluxDetailles: true,
+ fluxGlobal: false
+
+ },
+ conteneur: {
+ nom: "En Conteneur sur Ligne Régulière",
+ modulo: 1.2,
+ fluxDetailles: false,
+ fluxGlobal: true
+ }
+}
+
+const objModZoneTransp = {
+ "zone1": {
+ "terrestre": 1,
+ "maritime": 1.25,
+ "aerien": 0.5,
+ "multimodal": 1.25
+ },
+ "zone2": {
+ "terrestre": 1.1,
+ "maritime": 1.43,
+ "aerien": 0.5,
+ "multimodal": 1.43
+ },
+ "zone3": {
+ "terrestre": 1.1,
+ "maritime": 1.43,
+ "aerien": 0.5,
+ "multimodal": 1.43
+ },
+ "zone4": {
+ "terrestre": 1,
+ "maritime": 1.75,
+ "aerien": 0.5,
+ "multimodal": 1.75
+ },
+ "zone5": {
+ "terrestre": 1,
+ "maritime": 2.06,
+ "aerien": 0.5,
+ "multimodal": 2.06
+ },
+ "zone6":
+ {
+ "terrestre": 1,
+ "maritime": 2.5,
+ "aerien": 0.75,
+ "multimodal": 2.5
+ }
+}
+
+const objModTPPC = {
+ // 15000: {modulo: 0, franchise: "150"},
+ // 50000: {modulo: 0.05, franchise: "10% Mini 150€ et Maxi 300€"},
+ // 100000: {modulo: 0.1, franchise: "10% Mini 150€ et Maxi 750€"},
+ 15000: {modulo: 0, franchise: 150},
+ 50000: {modulo: 0.05, franchise: 300},
+ 100000: {modulo: 0.1, franchise: 750}
+}
+
+const objMarEnExpo =
+{
+ "Marchandises Ordinaires": 0.2,
+ "Marchandises à risques": 0.25,
+ "Marchandises périssables": 0.35,
+ "Matériels et Equipements lourds": 0.35,
+ "Marchandises exclues sauf accord aux CP": 0.35,
+ "Véhicules roulants": 0.35,
+}
+
+const objModRG = {
+ zone1: {
+ etendue: 0.0005,
+ waterborne: 0.00019
+ },
+ zone2: {
+ etendue: 0.001,
+ waterborne: 0.00032
+ },
+ zone3: {
+ etendue: 0.0016,
+ waterborne: 0.00048
+ },
+ zone4: {
+ etendue: 0.002,
+ waterborne: 0.0006
+ },
+ zone5: {
+ etendue: 0.0032,
+ waterborne: 0.001
+ },
+ zone6: {
+ etendue: 0.008,
+ waterborne: 0.0025
+ },
+}
+
+
+module.exports = {
+ objModNatureMar,
+ objModMontantCA,
+ // objModFranchiseTousCas,
+ objModAct,
+ objModCond,
+ objModZoneTransp,
+ objModTPPC,
+ objMarEnExpo,
+ objModRG
+};
diff --git a/ecole/src/constantes/json-modulateur-tppc.js b/ecole/src/constantes/json-modulateur-tppc.js
index a13b2e63..24d1aca7 100644
--- a/ecole/src/constantes/json-modulateur-tppc.js
+++ b/ecole/src/constantes/json-modulateur-tppc.js
@@ -7,66 +7,66 @@ const objModMar = {
tarif: "Bennes",
modulo: 0.8
},
- "marCiternes": {
- tarif : "Citernes",
- projet : "Transports en Citerne",
- modulo : 1
+ "marCiternes": {
+ tarif: "Citernes",
+ projet: "Transports en Citerne",
+ modulo: 1
},
"marDenreesHorsTemp": {
- tarif : "Denrées périssables hors température dirigée",
- modulo : 1
+ tarif: "Denrées périssables hors température dirigée",
+ modulo: 1
},
- "marDenreesSousTemp" : {
- tarif : "Denrées périssables sous température dirigée",
- projet : "Transports au moyen d'un véhicule à température dirigée",
- modulo : 1.1
+ "marDenreesSousTemp": {
+ tarif: "Denrées périssables sous température dirigée",
+ projet: "Transports au moyen d'un véhicule à température dirigée",
+ modulo: 1.1
},
- "marEngins" : {
- tarif : "Engins (chantier, construction…)",
- modulo : 1
+ "marEngins": {
+ tarif: "Engins (chantier, construction…)",
+ modulo: 1
},
- "marAuto" : {
- tarif : "Véhicules automobiles",
- modulo : 1.1
+ "marAuto": {
+ tarif: "Véhicules automobiles",
+ modulo: 1.1
},
- "marRisques" : {
- tarif : "Risques exclus et réservés",
- modulo : 1.5
+ "marRisques": {
+ tarif: "Risques exclus et réservés",
+ modulo: 1.5
},
- "marAnimaux" : {
- tarif : "Animaux vivants",
- projet : "Transport d'animaux vivants",
- modulo : 2
+ "marAnimaux": {
+ tarif: "Animaux vivants",
+ projet: "Transport d'animaux vivants",
+ modulo: 2
},
- "marFranchise" : {
- projet : "Franchise véhicule transporté",
+ "marFranchise": {
+ projet: "Franchise véhicule transporté",
}
}
const objMarEnExpo = {
"marOrdinaires": {
- nom : "Marchandises Ordinaires",
- modulo : 0.2
+ nom: "Marchandises Ordinaires",
+ modulo: 0.2
},
- "marRisques" : {
- nom : "Marchandises à Risques",
- modulo : 0.25
+ "marRisques": {
+ nom: "Marchandises à Risques",
+ modulo: 0.25
},
- "marPerissables" : {
- nom : "Marchandises Périssables",
- modulo : 0.35
+ "marPerissables": {
+ nom: "Marchandises Périssables",
+ modulo: 0.35
},
- "lourds" : {
- nom : "Matériels et Equipements lourds",
- modulo : 0.35
+ "lourds": {
+ nom: "Matériels et Equipements lourds",
+ modulo: 0.35
},
- "marExclues" : {
- nom : "Marchandises exclues sauf accord aux CP",
- modulo : 0.35
+ "marExclues": {
+ nom: "Marchandises exclues sauf accord aux CP",
+ modulo: 0.35
},
- "marRoulants" : {
- nom : "Véhicules roulants",
- modulo : 0.35
+ "marRoulants": {
+ nom: "Véhicules roulants",
+ modulo: 0.35
}
}
@@ -91,18 +91,18 @@ const objModSinistre = {
}
const listTypeVehicule = {
- "leger" : "Véhicule-léger",
- "benne" : "Benne",
- "fourgon" : "Fourgon",
- "utilitaire" : "Véhicule utilitaire",
- "remorque" : "Remorque",
+ "leger": "Véhicule-léger",
+ "benne": "Benne",
+ "fourgon": "Fourgon",
+ "utilitaire": "Véhicule utilitaire",
+ "remorque": "Remorque",
"porteEngins": "Porte-Engins",
"camion": "Camion",
"semiRemorque": "Semi-Remorque",
-
+
}
-const objPrimeMini ={
+const objPrimeMini = {
"IAC + Vol": 125,
"IAC + HIAC": 110
}
@@ -865,4 +865,3 @@ module.exports = {
objModFlotte,
objMarEnExpo: objMarEnExpo
};
-
\ No newline at end of file
diff --git a/ecole/src/controllers/facController.js b/ecole/src/controllers/facController.js
index 5d24501c..ca3654c2 100644
--- a/ecole/src/controllers/facController.js
+++ b/ecole/src/controllers/facController.js
@@ -1,12 +1,28 @@
const express = require('express');
const router = express.Router();
const facService = require('../services/facService');
+const constantesJSON = require("../constantes/json-modulateur-fac");
+
router.post('/create', async (req, res) => {
const data = req.body;
const fac = await facService.createFAC(data);
- res.json({ valid: Boolean(fac), fac });
+ res.json({valid: Boolean(fac), fac});
+});
+
+router.post('/createProjet', async (req, res) => {
+ const data = req.body;
+ const fac = await facService.createFacProjet(data);
+
+ res.json({valid: Boolean(fac), fac});
+});
+
+router.post('/createTarif', async (req, res) => {
+ const data = req.body;
+ const fac = await facService.createFacTarif(data);
+
+ res.json({valid: Boolean(fac), fac});
});
router.get("/read/id/:id", async (req, res) => {
@@ -14,9 +30,62 @@ router.get("/read/id/:id", async (req, res) => {
try {
const fac = await facService.getFACbyId(id);
- res.json({ valid: Boolean(fac), fac });
+ res.json({valid: Boolean(fac), fac});
} catch (error) {
- res.status(500).json({ valid: false, error: "Internal Server Error" });
+ res.status(500).json({valid: false, error: "Internal Server Error"});
+ }
+});
+
+router.get("/modulo/:objDemande", async (req, res) => {
+
+ const objDemande = req.params.objDemande;
+ var objRetourne
+
+ switch (objDemande) {
+
+ case "natureMar":
+ objRetourne = constantesJSON.objModNatureMar;
+ break;
+
+ case "montantCA":
+ objRetourne = constantesJSON.objModMontantCA;
+ break;
+
+ case "franchiseTousCas":
+ objRetourne = constantesJSON.objModFranchiseTousCas;
+ break;
+
+ case "activite":
+ objRetourne = constantesJSON.objModAct;
+ break;
+
+ case "conditionnement":
+ objRetourne = constantesJSON.objModCond;
+ break;
+
+ case "zoneTransport":
+ objRetourne = constantesJSON.objModZoneTransp;
+ break;
+
+ case "tppc":
+ objRetourne = constantesJSON.objModTPPC;
+ break;
+
+ case "marEnExpo":
+ objRetourne = constantesJSON.objMarEnExpo;
+ break;
+
+ case "rg":
+ objRetourne = constantesJSON.objModRG;
+ break;
+ }
+
+ try {
+ res.json({valid: Boolean(objRetourne), objRetourne});
+ } catch (error) {
+ logger.log("error", `Error finding constant ${objDemande}:`, error);
+
+ res.status(500).json({valid: false, error: "Internal Server Error"});
}
});
diff --git a/ecole/src/controllers/generateFacController.js b/ecole/src/controllers/generateFacController.js
index dc2bf918..6c1ef859 100644
--- a/ecole/src/controllers/generateFacController.js
+++ b/ecole/src/controllers/generateFacController.js
@@ -9,10 +9,16 @@ const moment = require("moment");
const parcoursService = require("../services/parcoursService");
const contratService = require("../services/contratService");
const globalService = require("../services/globalService");
+const userService = require("../services/userService");
+const constantesFAC = require("../constantes/json-modulateur-fac");
+
require("moment/locale/fr");
moment.locale("fr");
+
+
+
router.post("/fac/projet/:numParcours", async (req, res) => {
const content = fs.readFileSync(
path.resolve("src/templates/template-projet-fac.docx"),
@@ -20,25 +26,27 @@ router.post("/fac/projet/:numParcours", async (req, res) => {
);
const zip = new PizZip(content);
- const doc = new Docxtemplater(zip, { paragraphLoop: true, linebreaks: true });
+ const doc = new Docxtemplater(zip, {paragraphLoop: true, linebreaks: true});
const numParcours = req.params.numParcours.toUpperCase();
const parcours = await parcoursService.getParcoursByNumParcours(numParcours);
const contrat = await contratService.getContratById(parcours.contrat);
const client = contrat?.["@expand"]?.client || {};
const intermediaire = contrat?.["@expand"]?.intermediaire || {};
- const fac = contrat?.["@expand"]?.enCours || {};
+ const fac = contrat?.["@expand"]?.enCours || null;
+ const projet = fac?.["@expand"]?.projet || null;
+
const moyenTransportList = ["terrestre", "maritime", "aerien", "postal", "fluvial"]
const selectedTransportList = []
try {
moyenTransportList.forEach((transport) => {
- if (fac[transport] !== "") {
+ if (projet[transport] !== "") {
selectedTransportList.push(transport)
}
})
- } catch (error) { }
+ } catch (error) {}
var transportListVirguleEt
@@ -63,10 +71,10 @@ router.post("/fac/projet/:numParcours", async (req, res) => {
const listAssAdd = [];
try {
- fac.assureAdditionnel.forEach((objet) => {
+ projet.assureAdditionnel.forEach((objet) => {
listAssAdd.push(objet.nom + " - Adresse : " + objet.adresse + " - Siret : " + objet.siret);
});
- } catch (error) { }
+ } catch (error) {}
const risqueTransport = {
"achat": "des contrats d'achat",
@@ -77,32 +85,40 @@ router.post("/fac/projet/:numParcours", async (req, res) => {
}
Object.keys(risqueTransport).forEach((risque) => {
- if (!fac.risqueTransport.includes(risque)) {
+ if (!projet.risqueTransport.includes(risque)) {
delete risqueTransport[risque]
}
})
const listRisqueTransport = Object.keys(risqueTransport).map((key) => risqueTransport[key])
- const mondeEntier = (fac.zone1 && fac.zone2 && fac.zone3 && fac.zone4 && fac.zone5 && fac.zone6)
- const hasZone456 = (fac.zone4 || fac.zone5 || fac.zone6)
+ const mondeEntier = (fac.zones.includes('zone1') &&
+ fac.zones.includes('zone2') &&
+ fac.zones.includes('zone3') &&
+ fac.zones.includes('zone4') &&
+ fac.zones.includes('zone5') &&
+ fac.zones.includes('zone6'))
- const hasGarOptAuto = fac.garOpt.includes('auto')
- const hasGarOptEmballage = fac.garOpt.includes('emballage')
- const hasGarOptEtiquette = fac.garOpt.includes('etiquette')
- const hasGarOptTemperature = fac.garOpt.includes('temperature')
- const hasGarOptMarque = fac.garOpt.includes('marque')
- const hasTPPC = fac.typeTPPC !== ""
- const hasMarchandiseExposition = !(fac.marExpo == "" || fac.marExpo == 0)
+ const hasZone456 = (fac.zones.includes('zone4') &&
+ fac.zones.includes('zone5') &&
+ fac.zones.includes('zone6'))
+
+ const hasGarOptAuto = projet.garOpt.includes('auto')
+ const hasGarOptEmballage = projet.garOpt.includes('emballage')
+ const hasGarOptEtiquette = projet.garOpt.includes('etiquette')
+ const hasGarOptTemperature = projet.garOpt.includes('temperature')
+ const hasGarOptMarque = projet.garOpt.includes('marque')
+ const hasTPPC = fac.tppc
+ const hasMarchandiseExposition = fac.nbVehicExpo > 0
const condition4 = (hasGarOptAuto || hasGarOptEmballage || hasGarOptEtiquette || hasGarOptMarque || hasTPPC || hasMarchandiseExposition)
- const hasGarOpt = fac.garOpt.length > 0
+ const hasGarOpt = projet.garOpt.length > 0
const condition2 = hasGarOpt || hasTPPC || hasMarchandiseExposition
const anneeProchaine = moment().add(1, 'years').format('YYYY')
- const dateFin = (fac.dateFin == "00/00" || fac.dateFin == "00/00/0000") ? "A PRECISER" : fac.dateFin
- const dateEffet = (fac.dateEffet == "00/00" || fac.dateEffet == "00/00/0000") ? "A PRECISER" : fac.dateEffet
- const dateEcheance = (fac.dateEcheance == "00/00" || fac.dateEcheance == "00/00/0000") ? "A PRECISER" : fac.dateEcheance + '/' + anneeProchaine
+ const dateFin = (projet.dateFin == "00/00" || projet.dateFin == "00/00/0000") ? "A PRECISER" : projet.dateFin
+ const dateEffet = (projet.dateEffet == "00/00" || projet.dateEffet == "00/00/0000") ? "A PRECISER" : projet.dateEffet
+ const dateEcheance = (projet.dateEcheance == "00/00" || projet.dateEcheance == "00/00/0000") ? "A PRECISER" : projet.dateEcheance + '/' + anneeProchaine
const renderObject = {
nomClient: client.nom,
@@ -124,12 +140,12 @@ router.post("/fac/projet/:numParcours", async (req, res) => {
hasCP: (contrat.type == "AN" || contrat.type == "TEMPORAIRE"),
hasRemplacement: (contrat.type == "REMPLACEMENT"),
- hasRGAuto: (fac.risqueGuerre == "auto"),
- hasRGDemande: (fac.risqueGuerre == 'demande'),
- hasRG: (fac.risqueGuerre == 'demande' || fac.risqueGuerre == 'auto'),
- hasEtendue: (fac.typeGarantieRG == "etendue"),
- hasWaterborne: (fac.typeGarantieRG == "waterborne"),
- hasProgrammeInternational: fac.programmeInternational,
+ hasRGAuto: (fac.rg == "auto"),
+ hasRGDemande: (fac.rg == 'demande'),
+ hasRG: (fac.rg == 'demande' || fac.rg == 'auto'),
+ hasEtendue: (fac.typeRG == "etendue"),
+ hasWaterborne: (fac.typeRG == "waterborne"),
+ hasProgrammeInternational: projet.programmeInternational,
hasAssuresAdditionnels: listAssAdd.length > 0,
listAssAdd: listAssAdd,
@@ -142,8 +158,8 @@ router.post("/fac/projet/:numParcours", async (req, res) => {
listRisqueTransport: listRisqueTransport,
- depart: fac.lieuDepart,
- arrivee: fac.lieuArrivee,
+ depart: projet.lieuDepart,
+ arrivee: projet.lieuArrivee,
dateJour: moment().format("DD MMMM YYYY"),
dateEffet: dateEffet,
dateFin: dateFin,
@@ -151,19 +167,19 @@ router.post("/fac/projet/:numParcours", async (req, res) => {
hasMarchandiseExposition: hasMarchandiseExposition,
hasMondeEntier: mondeEntier,
- hasZone1: fac.zone1,
- hasZone2: fac.zone2,
- hasZone3: fac.zone3,
- hasZone4: fac.zone4,
- hasZone5: fac.zone5,
- hasZone6: fac.zone6,
+ hasZone1: fac.zones.includes('zone1'),
+ hasZone2: fac.zones.includes('zone2'),
+ hasZone3: fac.zones.includes('zone3'),
+ hasZone4: fac.zones.includes('zone4'),
+ hasZone5: fac.zones.includes('zone5'),
+ hasZone6: fac.zones.includes('zone6'),
hasZone456: hasZone456,
hasTPPC: hasTPPC,
- hasTPPCTousRisques: fac.typeTPPC.includes('tousRisques'),
- hasTPPCFlotteND: fac.typeTPPC.includes('flotteND'),
+ hasTPPCTousRisques: projet.typeTPPC.includes('tousRisques'),
+ hasTPPCFlotteND: projet.typeTPPC.includes('flotteND'),
- capitalMax: fac.capitalMax,
- franchiseTransport: fac.franchiseTransport,
+ capitalMax: projet.capitalMax,
+ franchiseTransport: projet.franchiseTransport,
condition4: condition4,
hasGarOpt: hasGarOpt,
condition2: condition2,
@@ -174,11 +190,11 @@ router.post("/fac/projet/:numParcours", async (req, res) => {
hasGarOptTemperature: hasGarOptTemperature,
capitalTPPC: fac.capitalTPPC,
franchiseExpo: fac.franchiseExpo,
- hasCG: fac.valeurAssuree.includes('cg'),
- hasDerogation: fac.valeurAssuree.includes('derogation'),
- hasVaBasePrix: fac.valeurAssureeBase.includes('prix'),
- hasVaBaseAchat: fac.valeurAssureeBase.includes('achat'),
- hasVaBaseVente: fac.valeurAssureeBase.includes('vente'),
+ hasCG: projet.valeurAssuree.includes('cg'),
+ hasDerogation: projet.valeurAssuree.includes('derogation'),
+ hasVaBasePrix: projet.valeurAssureeBase.includes('prix'),
+ hasVaBaseAchat: projet.valeurAssureeBase.includes('achat'),
+ hasVaBaseVente: projet.valeurAssureeBase.includes('vente'),
hasAerienTousRisques: fac.aerien.includes('tousRisques'),
hasAerienEventMaj: fac.aerien.includes('eventMaj'),
@@ -190,30 +206,30 @@ router.post("/fac/projet/:numParcours", async (req, res) => {
hasPostalEventMaj: fac.postal.includes('eventMaj'),
hasFluvialTousRisques: fac.fluvial.includes('tousRisques'),
hasFluvialEventMaj: fac.fluvial.includes('eventMaj'),
- hasFranchiseTransport: fac.franchiseTransport !== "" && fac.franchiseTransport !== 0,
+ hasFranchiseTransport: projet.franchiseTransport !== "",
cotRO: globalService.customFormatNumber(fac.cotRO),
cotRG: globalService.customFormatNumber(fac.cotRG),
cotProvRO: globalService.customFormatNumber(fac.cotProvRO),
cotProvRG: globalService.customFormatNumber(fac.cotProvRG),
- cotComptant: globalService.customFormatNumber(fac.cotComptant),
+ cotComptant: globalService.customFormatNumber(projet.cotComptant),
tauxCotRO: globalService.customFormatNumber(fac.tauxCotRO, true),
tauxCotRG: globalService.customFormatNumber(fac.tauxCotRG, true),
- cotAnnuelle: globalService.customFormatNumber(fac.cotAnnuelleHT),
- cotIrred: globalService.customFormatNumber(fac.cotIrred),
+ cotAnnuelle: globalService.customFormatNumber(fac.primeHT),
+ cotIrred: globalService.customFormatNumber(fac.primeMini),
capitalTPPC: globalService.customFormatNumber(fac.capitalTPPC),
capitalExpo: globalService.customFormatNumber(fac.capitalExpo),
franchiseTPPC: globalService.customFormatNumber(fac.franchiseTPPC),
chiffreAffaires: globalService.customFormatNumber(fac.ca),
- hasMensuel: (fac.tempo == "mensuel"),
- hasChiffreAffaires: (fac.typeContrat == "chiffreAffaires"),
- hasAvisAliments: (fac.typeContrat == "avisAliments"),
- hasPartResultat: fac.participationResultat,
+ hasMensuel: (projet.tempo == "mensuel"),
+ hasChiffreAffaires: (projet.typeContrat == "chiffreAffaires"),
+ hasAvisAliments: (projet.typeContrat == "avisAliments"),
+ hasPartResultat: projet.participationResultat,
hasAgentMutualiste: (intermediaire.type == "AGENT MUTUALISTE"),
hasAgent: (intermediaire.type == "AGENT MUTUALISTE" || intermediaire.type == "AGENT NON MUTUALISTE"),
hasCourtier: (intermediaire.type == "COURTIER"),
- tempo: fac.tempo,
+ tempo: projet.tempo,
}
try {
@@ -225,13 +241,13 @@ router.post("/fac/projet/:numParcours", async (req, res) => {
stack: error.stack,
properties: error.properties,
};
- logger.log('error', JSON.stringify({ error: e }));
+ logger.log('error', JSON.stringify({error: e}));
// Envoyez une réponse d'erreur si le rendu échoue
return res.status(500).send("Erreur lors de la génération du document");
}
- const buf = doc.getZip().generate({ type: "nodebuffer" });
+ const buf = doc.getZip().generate({type: "nodebuffer"});
const formattedDate = moment().format('DD-MM-YYYY-HH-mm-ss')
// Génération du nom de fichier
@@ -256,4 +272,250 @@ router.post("/fac/projet/:numParcours", async (req, res) => {
res.send(buf);
});
+//generate declinaison tarifaire FAC
+router.post("/fac/tarif/:numParcours", async (req, res) => {
+ // TODO Attention conditionner en fonction du type de CP
+
+ const content = fs.readFileSync(
+ path.resolve("src/templates/template-declinaison-tarifaire-fac.docx"),
+ "binary"
+ );
+
+ const zip = new PizZip(content);
+ const doc = new Docxtemplater(zip, {paragraphLoop: true, linebreaks: true});
+
+ const numParcours = req.params.numParcours.toUpperCase();
+ const parcours = await parcoursService.getParcoursByNumParcours(numParcours);
+ const contrat = await contratService.getContratById(parcours.contrat);
+ const client = contrat?.["@expand"]?.client || {};
+ const fac = contrat?.["@expand"]?.enCours || {};
+ const tarif = fac?.["@expand"]?.tarif || {};
+ const user = await userService.getUserById(parcours.dernierUtilisateur);
+
+ function getSelectedFranchise(franchiseId) {
+ switch (franchiseId) {
+ case "sansFranchise":
+ return tarif.sansFranchise
+ case "franchise350":
+ return tarif.franchise350
+ case "franchise750":
+ return tarif.franchise750
+ }
+ }
+
+ function getSelectedFranchiseTitre(franchiseId) {
+ switch (franchiseId) {
+ case "sansFranchise":
+ return "Sans Franchise"
+ case "franchise350":
+ return "Franchise 350 €"
+ case "franchise750":
+ return "Franchise 750 €"
+
+ }
+ }
+
+ function initialeMaj(str) {
+ return typeof str == "string" ? str.charAt(0).toUpperCase() + str.slice(1) : ""
+ }
+
+
+ const selectedFranchiseTitre = getSelectedFranchiseTitre(tarif.selectedFranchise)
+ const selectedFranchise = getSelectedFranchise(tarif.selectedFranchise)
+
+ const transports = []
+ if (fac.terrestre !== "") {
+ transports.push("Terrestre")
+ }
+ if (fac.maritime !== "") {
+ transports.push("Maritime")
+ }
+ if (fac.aerien !== "") {
+ transports.push("Aerien")
+ }
+ if (fac.postal !== "") {
+ transports.push("Postal")
+ }
+ if (fac.fluvial !== "") {
+ transports.push("Fluvial")
+ }
+ if (fac.multimodal !== "") {
+ transports.push('Multimodal')
+ }
+
+ const listTransports = transports.join(', ')
+
+ const hasMondeEntier = (
+ fac.zones.includes("zone1") &&
+ fac.zones.includes("zone2") &&
+ fac.zones.includes("zone3") &&
+ fac.zones.includes("zone4") &&
+ fac.zones.includes("zone5") &&
+ fac.zones.includes("zone6")
+ )
+
+ const typeRO = tarif.typeRO == "tousRisques" ? "Tous Risques" : "Evenements Majeurs"
+ var typePolice
+ switch (tarif.typePolice) {
+ case "ca":
+ typePolice = "Police au Chiffre d'Affaires";
+ break;
+
+ case "national":
+ typePolice = "Police au Voyage National";
+ break;
+
+ case "international":
+ typePolice = "Police au Voyage International";
+ break;
+ }
+
+ try {
+ doc.render({
+
+ matricule: user.matricule,
+ hasContrat: contrat.numContrat || false,
+ numContrat: contrat.numContrat,
+ hasSaisine: contrat.numSaisine || false,
+ numSaisine: contrat.numSaisine,
+ nomClient: client.nom,
+
+ actAssuree: fac.actAssuree,
+ montantSin: tarif.sinistres,
+ franchiseSelected: selectedFranchiseTitre,
+ typeMar: fac.typeMar,
+ ca: fac.ca,
+
+ montantGarantir: tarif.montantGarantir,
+ conditionnement: constantesFAC.objModCond?.[tarif.conditionnement]?.nom ?? "",
+ typeMar: fac.typeMar,
+
+ transports: listTransports,
+ hasMondeEntier: hasMondeEntier,
+ hasZone1: fac.zones.includes("zone1"),
+ hasZone2: fac.zones.includes("zone2"),
+ hasZone3: fac.zones.includes("zone3"),
+ hasZone4: fac.zones.includes("zone4"),
+ hasZone5: fac.zones.includes("zone5"),
+ hasZone6: fac.zones.includes("zone6"),
+
+ hasZone1Achats: tarif.fluxAchats?.zone == "zone1",
+ hasZone2Achats: tarif.fluxAchats?.zone == "zone2",
+ hasZone3Achats: tarif.fluxAchats?.zone == "zone3",
+ hasZone4Achats: tarif.fluxAchats?.zone == "zone4",
+ hasZone5Achats: tarif.fluxAchats?.zone == "zone5",
+ hasZone6Achats: tarif.fluxAchats?.zone == "zone6",
+ conditionnementAchats: constantesFAC.objModCond[tarif.fluxAchats?.conditionnement]?.nom ?? "",
+
+ hasZone1Ventes: tarif.fluxVentes?.zone == "zone1",
+ hasZone2Ventes: tarif.fluxVentes?.zone == "zone2",
+ hasZone3Ventes: tarif.fluxVentes?.zone == "zone3",
+ hasZone4Ventes: tarif.fluxVentes?.zone == "zone4",
+ hasZone5Ventes: tarif.fluxVentes?.zone == "zone5",
+ hasZone6Ventes: tarif.fluxVentes?.zone == "zone6",
+ conditionnementVentes: constantesFAC.objModCond[tarif.fluxVentes?.conditionnement]?.nom ?? "",
+
+ hasFluxGlobal: tarif.typeFlux == "global",
+ hasFluxDetailles: tarif.typeFlux == "detailles",
+ hasFluxVentes: (tarif.fluxVentes),
+ hasFluxAchats: (tarif.fluxAchats),
+ hasFluxIntersites: tarif.fluxIntersites,
+ fluxAchats: tarif.fluxAchats,
+ fluxVentes: tarif.fluxVentes,
+ transportVentes: initialeMaj(tarif.fluxVentes?.transport),
+ transportAchats: initialeMaj(tarif.fluxAchats?.transport),
+
+
+ typeRO: typeRO,
+ typePolice: typePolice,
+ hasTPPC: fac.tppc,
+ hasMarExpo: (fac.nbVehicExpo > 0),
+ hasRG: fac.rg == "auto",
+ hasRGAchats: (tarif.fluxAchats?.typeRG),
+ hasRGVentes: (tarif.fluxVentes?.typeRG),
+
+
+ tarif350: tarif.franchise350.proposition,
+ // pourcentAct350: parseFloat(tarif.franchise350.pourcentAct) * 100,
+ // pourcentCA350: parseFloat(tarif.franchise350.pourcentCA) * 100,
+ // pourcentMar350: parseFloat(tarif.franchise350.pourcentMar) * 100,
+ // pourcentFranchise350: parseFloat(tarif.franchise350.pourcentFranchise) * 100,
+ tauxRO350: tarif.franchise350.tauxRO,
+ tauxRG350: tarif.franchise350.tauxRG,
+ franchiseTPPC350: tarif.franchise350.franchiseTPPC ?? "",
+ franchiseExpo350: tarif.franchise350.franchiseExpo ?? "",
+
+ tarif750: tarif.franchise750.proposition,
+ // pourcentAct750: parseFloat(tarif.franchise750.pourcentAct) * 100,
+ // pourcentCA750: parseFloat(tarif.franchise750.pourcentCA) * 100,
+ // pourcentMar750: parseFloat(tarif.franchise750.pourcentMar) * 100,
+ // pourcentFranchise750: parseFloat(tarif.franchise750.pourcentFranchise) * 100,
+ tauxRO750: tarif.franchise750.tauxRO,
+ tauxRG750: tarif.franchise750.tauxRG,
+ franchiseTPPC750: tarif.franchise750.franchiseTPPC ?? "",
+ franchiseExpo750: tarif.franchise750.franchiseExpo ?? "",
+
+ tarifSansFranchise: tarif.sansFranchise.proposition,
+ // pourcentActSansFranchise: parseFloat(tarif.sansFranchise.pourcentAct) * 100,
+ // pourcentCASansFranchise: parseFloat(tarif.sansFranchise.pourcentCA) * 100,
+ // pourcentMarSansFranchise: parseFloat(tarif.sansFranchise.pourcentMar) * 100,
+ // pourcentFranchiseSansFranchise: parseFloat(tarif.sansFranchise.pourcentFranchise) * 100,
+ franchiseTPPCSansFranchise: tarif.sansFranchise.franchiseTPPC ?? "",
+ franchiseExpoSansFranchise: tarif.sansFranchise.franchiseExpo ?? "",
+ tauxROSansFranchise: tarif.sansFranchise.tauxRO,
+ tauxRGSansFranchise: tarif.sansFranchise.tauxRG,
+
+ tarifSelected: selectedFranchise.proposition,
+ tarifCommercial: fac.primeHT,
+ franchiseTPPCSelected: selectedFranchise.franchiseTPPC ?? "",
+ franchiseExpoSelected: selectedFranchise.franchiseExpo ?? "",
+ tauxROSelected: fac.tauxCotRO,
+ tauxRGSelected: fac.tauxCotRG
+ });
+ } catch (error) {
+ const e = {
+ message: error.message,
+ name: error.name,
+ stack: error.stack,
+ properties: error.properties,
+ };
+ logger.log("error", JSON.stringify({error: e}));
+
+ // Envoyez une réponse d'erreur si le rendu échoue
+ return res.status(500).send("Erreur lors de la génération du document");
+ }
+
+ const buf = doc.getZip().generate({type: "nodebuffer"});
+ const currentDate = new Date();
+
+ // Formatage de la date au format "JJ-MM-AAAA-HH-MM-SS"
+ const day = String(currentDate.getDate()).padStart(2, "0");
+ const month = String(currentDate.getMonth() + 1).padStart(2, "0");
+ const year = currentDate.getFullYear();
+ const hours = String(currentDate.getHours()).padStart(2, "0");
+ const minutes = String(currentDate.getMinutes()).padStart(2, "0");
+ const seconds = String(currentDate.getSeconds()).padStart(2, "0");
+ const formattedDate = `${day}-${month}-${year}-${hours}-${minutes}-${seconds}`;
+
+ // Génération du nom de fichier
+ const sanitizedClientNom = client.nom
+ .replace(/[^\w\s.-]/gi, "")
+ .replace(/\s+/g, "-");
+ const filename = `Tarif-${contrat.produit}-${parcours.numParcours}-${sanitizedClientNom}-${formattedDate}`;
+
+ // Définit le type de contenu et un nom de fichier par défaut pour le téléchargement
+ res.setHeader(
+ "Content-Type",
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
+ );
+
+ res.setHeader(
+ "Content-Disposition",
+ "attachment; filename=" + filename + ".docx"
+ );
+
+ // Envoie le buffer au client, déclenchant le téléchargement
+ res.send(buf);
+});
+
module.exports = router;
diff --git a/ecole/src/controllers/historiqueParcoursController.js b/ecole/src/controllers/historiqueParcoursController.js
index 490ea0fd..9152a1e0 100644
--- a/ecole/src/controllers/historiqueParcoursController.js
+++ b/ecole/src/controllers/historiqueParcoursController.js
@@ -1,25 +1,124 @@
+// controllers/historiqueParcoursController.js
const express = require("express");
const router = express.Router();
const renderPage = require("../utils/renderHelper");
const logger = require("../utils/logger");
const parcoursService = require("../services/parcoursService");
+const clientService = require("../services/clientService");
+const { fmtDateFR, xmlEsc, cellXml, rowXml } = require("../services/globalService");
+/**
+ * Construit les filtres et le tri PocketBase à partir des paramètres DataTables
+ * @param {Object} params - Paramètres de recherche et filtrage
+ * @param {string[]} params.regions - Liste des régions à filtrer
+ * @param {Object} params.search - Objet de recherche globale
+ * @param {Array} params.columns - Colonnes avec leurs filtres individuels
+ * @param {Array} params.order - Ordre de tri
+ * @returns {Object} - {filter: string, sort: string}
+ */
+function buildPocketBaseFilterAndSort({ regions = [], search = { value: "" }, columns = [], order = [] }) {
+ const parts = [];
+
+ /**
+ * Recherche globale : recherche dans tous les champs pertinents
+ */
+ const q = (search?.value || "").trim();
+ if (q) {
+ const esc = q.replace(/"/g, '\\"');
+ parts.push(`(
+ numParcours ~ "${esc}"
+ || contrat.numSaisine ~ "${esc}"
+ || contrat.numContrat ~ "${esc}"
+ || contrat.produit ~ "${esc}"
+ || contrat.type ~ "${esc}"
+ || contrat.intermediaire.nom ~ "${esc}"
+ || contrat.intermediaire.numPortefeuille ~ "${esc}"
+ || contrat.client.nom ~ "${esc}"
+ || contrat.client.numClient ~ "${esc}"
+ || dernierUtilisateur.prenom ~ "${esc}"
+ || dernierUtilisateur.nom ~ "${esc}"
+ || dernierUtilisateur.matricule ~ "${esc}"
+ || dernierUtilisateur.region.nom ~ "${esc}"
+ )`);
+ }
+
+ /**
+ * Recherche par colonne : filtre spécifique pour chaque colonne
+ */
+ const colFilter = (idx, fieldPaths) => {
+ const v = (columns[idx]?.search?.value || "").trim();
+ if (!v) return null;
+ const esc = v.replace(/"/g, '\\"');
+ return `(${fieldPaths.map(fp => `${fp} ~ "${esc}"`).join(" || ")})`;
+ };
+
+ const pushIf = (v) => { if (v) parts.push(v); };
+
+ // Filtres par colonne (index correspondant à l'ordre des colonnes DataTables)
+ pushIf(colFilter(0, ["numParcours"]));
+ pushIf(colFilter(1, ["created"]));
+ pushIf(colFilter(2, ["dernierUtilisateur.matricule"]));
+ pushIf(colFilter(3, ["dernierUtilisateur.prenom", "dernierUtilisateur.nom"]));
+ pushIf(colFilter(4, ["dernierUtilisateur.region.nom"]));
+ pushIf(colFilter(5, ["contrat.numSaisine"]));
+ pushIf(colFilter(6, ["contrat.numContrat"]));
+ pushIf(colFilter(7, ["contrat.produit"]));
+ pushIf(colFilter(8, ["contrat.type"]));
+ pushIf(colFilter(9, ["contrat.intermediaire.numPortefeuille"]));
+ pushIf(colFilter(10, ["contrat.intermediaire.nom"]));
+ pushIf(colFilter(11, ["contrat.client.numClient"]));
+ pushIf(colFilter(12, ["contrat.client.nom"]));
+
+ const filter = parts.length ? parts.join(" && ") : "";
+
+ /**
+ * Construction du tri PocketBase
+ * Mapping des index de colonnes DataTables vers les champs PocketBase
+ * Le préfixe "-" indique un tri décroissant
+ */
+ const sortMap = {
+ 0: "numParcours",
+ 1: "created",
+ 2: "dernierUtilisateur.matricule",
+ 4: "dernierUtilisateur.region.nom",
+ 6: "contrat.numContrat",
+ 7: "contrat.produit",
+ 10: "contrat.intermediaire.nom",
+ 12: "contrat.client.nom"
+ };
+
+ let sort = "-created"; // Tri par défaut : date de création décroissante
+ if (order && order.length > 0) {
+ const { column, dir } = order[0];
+ const field = sortMap[column];
+ if (field) {
+ sort = (dir === "desc" ? "-" : "") + field;
+ }
+ }
+
+ return { filter, sort };
+}
+
+/**
+ * Route GET / : Affichage de la page Historique des parcours
+ */
router.get("/", (req, res) => {
- renderPage("historiqueParcours.ejs", res);
-});
+ renderPage("historiqueParcours.ejs", res);});
-router.get("/read", async (req, res) => {
+/**
+ * /regionUser : requête sur la region de l'user actuel
+ */
+router.get("/:regionUser", async (req, res) => {
try {
- const allParcours = await parcoursService.getAllParcours();
-
- if (allParcours) {
- res.json({ valid: true, allParcours });
+ const { regionUser } = req.params;
+ const data = await parcoursService.getParcoursByRegionsPage([regionUser], 1, 10, { filter: "", sort: "-created" });
+ if (data) {
+ res.json({ valid: true, data });
} else {
res.json({ valid: false });
}
} catch (error) {
logger.log("error", error);
-
res.status(500).json({
valid: false,
error: "Erreur lors de la récupération des parcours.",
@@ -27,25 +126,522 @@ router.get("/read", async (req, res) => {
}
});
-//controller to get parcours by region
-router.get("/:regionUser", async (req, res) => {
+/**
+ * /datatable : DataTables server-side (gestion de pagination)
+ */
+router.post("/datatable", async (req, res) => {
try {
- const { regionUser } = req.params;
- const data = await parcoursService.getParcoursByRegion(regionUser);
+ const {
+ draw = 1,
+ start = 0,
+ length = 10,
+ regions = [],
+ search = { value: "" },
+ columns = [],
+ order = []
+ } = req.body || {};
- if (data) {
- res.json({ valid: true, data });
- } else {
- res.json({ valid: data });
+ const page = Math.floor(start / length) + 1; // nb de page
+ const perPage = Number(length) || 10; //nb d'éléments par page
+
+ const { filter, sort } = buildPocketBaseFilterAndSort({ search, columns, order }); // construction du filtrage côté Back
+
+ const result = await parcoursService.getParcoursByRegionsPage([], page, perPage, { filter, sort });
+
+ /**
+ * Construction des lignes de données pour DataTables
+ * Traitement séquentiel pour garantir la récupération des clients
+ */
+ const rows = [];
+ for (const parcours of result.items) {
+ try {
+ const contrat = parcours["@expand"]?.contrat || null;
+
+ /**
+ * Récupération du client avec fallback
+ * L'expand PocketBase ne fonctionne pas toujours pour contrat.client,
+ * donc on récupère directement via l'ID si nécessaire
+ */
+ let client = null;
+ if (contrat) {
+ // Tentative via expand (si disponible)
+ client = contrat["@expand"]?.client || null;
+
+ // Fallback : récupération directe via l'ID du client
+ if (!client && contrat.client) {
+ const clientId = typeof contrat.client === 'string'
+ ? contrat.client
+ : (contrat.client?.id || contrat.client);
+
+ if (clientId) {
+ try {
+ client = await clientService.getClient(clientId);
+ } catch (err) {
+ // Erreur silencieuse : client non trouvé ou erreur de récupération
+ client = null;
+ }
+ }
+ }
+
+ // Cas où contrat.client est déjà un objet (expand réussi mais pas dans @expand)
+ if (!client && contrat.client && typeof contrat.client === 'object' && contrat.client.numClient) {
+ client = contrat.client;
+ }
+ }
+ const lastUser = parcours["@expand"]?.dernierUtilisateur;
+ const region = lastUser?.["@expand"]?.region;
+ const produit = contrat ? (contrat.produit || "NC") : "NC";
+
+ /**
+ * Construction de la ligne DataTables
+ * Ordre des colonnes : Numéro Parcours, Date Création, Matricule, Utilisateur, Région,
+ * Numéro Saisine, Numéro Contrat, Produit, Type, Portefeuille, Intermédiaire,
+ * Numéro Client, Nom Client, Bouton Reprendre, Bouton Générer
+ */
+ rows.push([
+ parcours.numParcours,
+ fmtDateFR(parcours.created),
+ lastUser?.matricule || "NC",
+ lastUser ? `${lastUser.prenom} ${lastUser.nom}`.trim() || "NC" : "NC",
+ region ? region.nom : "NC",
+ contrat ? (contrat.numSaisine || "NC") : "NC",
+ contrat ? (contrat.numContrat || "NC") : "NC",
+ produit,
+ contrat ? (contrat.type || "NC") : "NC",
+ contrat ? (contrat["@expand"]?.intermediaire?.numPortefeuille || "NC") : "NC",
+ contrat ? (contrat["@expand"]?.intermediaire?.nom || "NC") : "NC",
+ client ? (client.numClient || "NC") : "NC",
+ client ? (client.nom || "NC") : "NC",
+ ` `,
+ ` `
+ ]);
+ } catch (err) {
+ logger.log("error", `Erreur traitement parcours ${parcours?.numParcours || 'inconnu'}:`, err);
+ // Ligne par défaut en cas d'erreur
+ rows.push(["NC", "NC", "NC", "NC", "NC", "NC", "NC", "NC", "NC", "NC", "NC", "NC", "NC", "", ""]);
+ }
}
- } catch (error) {
- logger.log("error", error);
- res.status(500).json({
- valid: false,
- error: "Erreur lors de la récupération des parcours.",
+ res.json({
+ draw: Number(draw),
+ recordsTotal: result.totalItems,
+ recordsFiltered: result.totalItems,
+ data: rows
});
+ } catch (error) {
+ // Ignorer silencieusement les erreurs d'abort (requête annulée côté client)
+ if (error && (error.name === "AbortError" || error.name === "DOMException" || error.message?.includes("aborted"))) {
+ return;
+ }
+ // Pour toutes les autres erreurs, on les log et on renvoie une réponse d'erreur
+ logger.log("error", "ça ne marche pas mais, aucune erreur" + error);
+ if (!res.headersSent) {
+ res.status(500).json({ draw: 0, recordsTotal: 0, recordsFiltered: 0, data: [] });
+ }
}
});
-module.exports = router;
+/**
+ * EXPORT CSV
+ * Exporte l'historique des parcours au format CSV
+ * Supporte l'export complet ou filtré selon les paramètres de la requête
+ */
+router.post("/export/csv", async (req, res) => {
+ let aborted = false;
+ req.on("aborted", () => {
+ aborted = true;
+ logger.log("warn", "Client a interrompu la connexion pendant l'export CSV");
+ });
+ res.on("finish", () => {
+ logger.log("info", "Export CSV terminé");
+ });
+
+ try {
+ const {
+ regions = [],
+ search = { value: "" },
+ columns = [],
+ order = [],
+ mode = "filtered",
+ } = req.body || {};
+
+ const effective = (mode === "full")
+ ? { regions: [], search: { value: "" }, columns: [], order }
+ : { regions, search, columns, order };
+
+ const { filter, sort } = buildPocketBaseFilterAndSort(effective);
+
+ res.setHeader("Content-Type", "text/csv; charset=utf-8");
+ res.setHeader("Content-Disposition", `attachment; filename="historique_parcours.csv"`);
+
+ // BOM UTF-8 pour Excel
+ res.write("\uFEFF");
+
+ const headers = [
+ "Numéro du Parcours","Date de Création","Matricule","Dernier Utilisateur","Region",
+ "Numéro Saisine","Numéro Contrat","Produit","Type","Numéro de Portefeuille",
+ "Nom Intermediaire","Numéro de Client","Nom Client"
+ ];
+ res.write(headers.join(";") + "\n");
+
+ /**
+ * OPTIMISATION : getFullList pour récupérer tous les parcours en une requête
+ * + batch client pour récupérer tous les clients manquants en une requête
+ */
+
+ // Construction du filtre régions (identique à getParcoursByRegionsPage)
+ let regFilter = "";
+ if (Array.isArray(effective.regions) && effective.regions.length > 0) {
+ const ors = effective.regions.map(r => `dernierUtilisateur.region.nom = "${r}"`);
+ regFilter = `(${ors.join(" || ")})`;
+ }
+ const finalFilter = [regFilter, filter].filter(Boolean).join(" && ");
+ const expandFields = "contrat, contrat.client, contrat.intermediaire, dernierUtilisateur.region";
+
+ // Récupération de tous les parcours en une seule requête
+ let allParcours;
+ try {
+ allParcours = await parcoursService.getParcoursFullList({
+ filter: finalFilter,
+ sort: sort || "-created",
+ expand: expandFields,
+ batch: 500,
+ });
+ }
+ catch (err) {
+ logger.log("error", "Erreur récupération parcours pour export CSV:", err);
+ if (!res.headersSent) {
+ return res.status(500).send("Erreur lors de la récupération des données");
+ }
+ try { res.end(); } catch {}
+ return;
+ }
+
+ // Collecte des IDs clients manquants (l'expand contrat.client ne fonctionne pas en SDK 0.7 pocket)
+ const missingClientIds = [];
+ for (const parcours of allParcours) {
+ const contrat = parcours["@expand"]?.contrat;
+ if (contrat && contrat.client && !contrat["@expand"]?.client) {
+ missingClientIds.push(contrat.client);
+ }
+ }
+
+ // Récupération batch de tous les clients manquants en une seule requête
+ const clientsMap = await clientService.getClientsBatch(missingClientIds);
+
+ // Traitement des parcours
+ for (const parcours of allParcours) {
+ if (aborted) break;
+
+ const contrat = parcours["@expand"]?.contrat || null;
+ const intermediaire = contrat ? (contrat["@expand"]?.intermediaire || null) : null;
+
+ // Client : d'abord depuis l'expand, sinon depuis le batch
+ let client = contrat ? (contrat["@expand"]?.client || null) : null;
+ if (!client && contrat && contrat.client) {
+ client = clientsMap.get(contrat.client) || null;
+ }
+
+ const lastUser = parcours["@expand"]?.dernierUtilisateur;
+ const region = lastUser?.["@expand"]?.region;
+
+ const row = [
+ parcours.numParcours,
+ fmtDateFR(parcours.created),
+ lastUser?.matricule || "NC",
+ lastUser ? `${lastUser.prenom || ""} ${lastUser.nom || ""}`.trim() || "NC" : "NC",
+ region ? (region.nom || "NC") : "NC",
+ contrat ? (contrat.numSaisine || "NC") : "NC",
+ contrat ? (contrat.numContrat || "NC") : "NC",
+ contrat ? (contrat.produit || "NC") : "NC",
+ contrat ? (contrat.type || "NC") : "NC",
+ intermediaire ? (intermediaire.numPortefeuille || "NC") : "NC",
+ intermediaire ? (intermediaire.nom || "NC") : "NC",
+ client ? (client.numClient || "NC") : "NC",
+ client ? (client.nom || "NC") : "NC",
+ ];
+
+ const safe = row.map(v => String(v).replaceAll(";", ",").replace(/\r?\n/g, " "));
+ try {
+ res.write(safe.join(";") + "\n");
+ }
+ catch (werr) {
+ logger.log("error", werr);
+ aborted = true;
+ break;
+ }
+ }
+
+ if (!aborted) {
+ res.end();
+ }
+ }
+ catch (error) {
+ logger.log("error", error);
+ if (!res.headersSent) {
+ return res.status(500).send("Erreur export CSV");
+ }
+ try { res.end(); } catch {}
+ }
+});
+
+
+// ====== UTILITAIRES XML/XLS ======
+
+/**
+ * EXPORT XLS (SpreadsheetML 2003)
+ * Format XLS utilisé car XLSX est trop complexe à générer manuellement.
+ * Le format XLS est toujours supporté par Excel sans perte de données.
+ */
+router.post("/export/xls", async (req, res) => {
+ let aborted = false;
+ req.on("aborted", () => {
+ aborted = true;
+ logger.log("warn", "Client a interrompu la connexion pendant l'export XLS");
+ });
+ res.on("finish", () => {
+ logger.log("info", "Export XLS terminé");
+ });
+
+ try {
+ const {
+ regions = [],
+ search = { value: "" },
+ columns = [],
+ order = [],
+ mode = "filtered"
+ } = req.body || {};
+
+ const effective = (mode === "full")
+ ? { regions: [], search: { value: "" }, columns, order }
+ : { regions, search, columns, order };
+
+ const { filter, sort } = buildPocketBaseFilterAndSort(effective);
+
+ const headers = [
+ "Numéro du Parcours","Date de Création","Matricule","Dernier Utilisateur","Region",
+ "Numéro Saisine","Numéro Contrat","Produit","Type","Numéro de Portefeuille",
+ "Nom Intermediaire","Numéro de Client","Nom Client"
+ ];
+
+ /**
+ * OPTIMISATION : getFullList pour récupérer tous les parcours en une requête
+ * + batch client pour récupérer tous les clients manquants en une requête
+ */
+
+ // Construction du filtre régions (identique à getParcoursByRegionsPage)
+ let regFilter = "";
+ if (Array.isArray(effective.regions) && effective.regions.length > 0) {
+ const ors = effective.regions.map(r => `dernierUtilisateur.region.nom = "${r}"`);
+ regFilter = `(${ors.join(" || ")})`;
+ }
+ const finalFilter = [regFilter, filter].filter(Boolean).join(" && ");
+ const expandFields = "contrat, contrat.client, contrat.intermediaire, dernierUtilisateur.region";
+
+ // Récupération de tous les parcours en une seule requête
+ let allParcours;
+ try {
+ allParcours = await parcoursService.getParcoursFullList({
+ filter: finalFilter,
+ sort: sort || "-created",
+ expand: expandFields,
+ batch: 500,
+ });
+ }
+ catch (err) {
+ logger.log("error", "Erreur récupération parcours pour export XLS:", err);
+ if (!res.headersSent) {
+ return res.status(500).send("Erreur lors de la récupération des données");
+ }
+ try { res.end(); } catch {}
+ return;
+ }
+
+ // Collecte des IDs clients manquants (l'expand contrat.client ne fonctionne pas en SDK 0.7.x Pocket)
+ const missingClientIds = [];
+ for (const parcours of allParcours) {
+ const contrat = parcours["@expand"]?.contrat;
+ if (contrat && contrat.client && !contrat["@expand"]?.client) {
+ missingClientIds.push(contrat.client);
+ }
+ }
+
+ // Récupération batch de tous les clients manquants en une seule requête
+ const clientsMap = await clientService.getClientsBatch(missingClientIds);
+
+ const fileName = (mode === "full")
+ ? "historique_parcours_complet.xls"
+ : "historique_parcours_filtre.xls";
+
+ res.setHeader("Content-Type", "application/vnd.ms-excel; charset=utf-8");
+ res.setHeader("Content-Disposition", `attachment; filename="${fileName}"`);
+
+ // En-tête SpreadsheetML 2003
+ res.write(
+`
+
+
+
+
+
+
+
+
+`
+ );
+
+ res.write(
+ `` +
+ headers.map(h => `${xmlEsc(h)} | `).join("") +
+ `
\n`
+ );
+
+ // Traitement des parcours
+ for (const parcours of allParcours) {
+ const contrat = parcours["@expand"]?.contrat || null;
+ const intermediaire = contrat ? (contrat["@expand"]?.intermediaire || null) : null;
+
+ // Client : d'abord depuis l'expand, sinon depuis le batch
+ let client = contrat ? (contrat["@expand"]?.client || null) : null;
+ if (!client && contrat && contrat.client) {
+ client = clientsMap.get(contrat.client) || null;
+ }
+
+ const lastUser = parcours["@expand"]?.dernierUtilisateur;
+ const region = lastUser?.["@expand"]?.region;
+
+ const row = [
+ parcours.numParcours,
+ fmtDateFR(parcours.created),
+ lastUser?.matricule || "NC",
+ lastUser ? `${lastUser.prenom || ""} ${lastUser.nom || ""}`.trim() || "NC" : "NC",
+ region ? (region.nom || "NC") : "NC",
+ contrat ? (contrat.numSaisine || "NC") : "NC",
+ contrat ? (contrat.numContrat || "NC") : "NC",
+ contrat ? (contrat.produit || "NC") : "NC",
+ contrat ? (contrat.type || "NC") : "NC",
+ intermediaire ? (intermediaire.numPortefeuille || "NC") : "NC",
+ intermediaire ? (intermediaire.nom || "NC") : "NC",
+ client ? (client.numClient || "NC") : "NC",
+ client ? (client.nom || "NC") : "NC",
+ ].map(v => String(v).replace(/\r?\n/g, " "));
+
+ res.write(rowXml(row) + "\n");
+ }
+
+ // Fermeture du fichier XML SpreadsheetML
+ res.write(
+`
+
+ `
+ );
+ res.end();
+
+ }
+ catch (error) {
+ logger.log("error", error);
+ if (!res.headersSent) return res.status(500).send("Erreur export XLS");
+ try { res.end(); } catch {}
+ }
+});
+
+/**
+ * Route GET /details/:numParcours
+ * Récupère les détails complets d'un parcours (parcours + contrat + fiche produit)
+ * Utilisé pour afficher le panneau de détails dans la datatable
+ */
+router.get("/details/:numParcours", async (req, res) => {
+ try {
+ const { numParcours } = req.params;
+ const parcours = await parcoursService.getDeepDetailsByNumParcours(numParcours);
+ if (!parcours) return res.json({ valid: false, error: "Parcours introuvable" });
+
+ /**
+ * Extraction des données pour faciliter l'accès côté frontend
+ */
+ const contrat = parcours?.["@expand"]?.contrat || null;
+ const produit = (contrat?.produit || "").toUpperCase();
+
+ /**
+ * Récupération de la fiche produit selon le type (TPPC, RC, FAC)
+ * Si l'expand n'a pas fonctionné, on essaie de récupérer directement via l'ID
+ */
+ let produitRecord = null;
+ if (produit === "TPPC") {
+ produitRecord = contrat?.["@expand"]?.tppc || null;
+ }
+ else if (produit === "RC") {
+ produitRecord = contrat?.["@expand"]?.rc || null;
+ // Si l'expand n'a pas fonctionné mais qu'on a l'ID, on récupère directement
+ if (!produitRecord && contrat?.rc) {
+ try {
+ const rcId = typeof contrat.rc === 'string' ? contrat.rc : contrat.rc?.id || contrat.rc;
+ if (rcId) {
+ const rcService = require("../services/rcService");
+ const rcData = await rcService.getRCbyId(rcId);
+ // fetchInfoByCriteria retourne directement l'item, pas un objet avec items
+ produitRecord = rcData || null;
+ }
+ }
+ catch (e) {
+ logger.log("info", `Erreur récupération RC directe pour ${numParcours}: ${e.message}`);
+ }
+ }
+ }
+ else if (produit === "FAC") {
+ produitRecord = contrat?.["@expand"]?.fac || null;
+ // Si l'expand n'a pas fonctionné mais qu'on a l'ID, on récupère directement
+ if (!produitRecord && contrat?.fac) {
+ try {
+ const facId = typeof contrat.fac === 'string' ? contrat.fac : contrat.fac?.id || contrat.fac;
+ if (facId) {
+ const facService = require("../services/facService");
+ const facData = await facService.getFACbyId(facId);
+ // fetchInfoByCriteria retourne directement l'item, pas un objet avec items
+ produitRecord = facData || null;
+ if (!produitRecord) {
+ logger.log("warn", `FAC non trouvé pour ID ${facId} (parcours ${numParcours})`);
+ }
+ } else {
+ logger.log("warn", `Pas d'ID FAC dans contrat pour parcours ${numParcours}`);
+ }
+ }
+ catch (e) {
+ logger.log("warn", `Erreur récupération FAC directe pour ${numParcours}: ${e.message}`);
+ }
+ }
+ else if (!produitRecord && !contrat?.fac) {
+ logger.log("warn", `Contrat FAC sans relation FAC pour parcours ${numParcours}`);
+ }
+ }
+
+ return res.json({
+ valid: true,
+ produit,
+ parcours,
+ contrat,
+ produitRecord,
+ });
+ }
+ catch (e) {
+ logger.log("error", e);
+ return res.status(500).json({ valid: false, error: "Erreur recherche détails" });
+ }
+});
+
+
+module.exports = router;
\ No newline at end of file
diff --git a/ecole/src/controllers/navParcoursController.js b/ecole/src/controllers/navParcoursController.js
index 62cf03e5..dad6bcc0 100644
--- a/ecole/src/controllers/navParcoursController.js
+++ b/ecole/src/controllers/navParcoursController.js
@@ -26,7 +26,7 @@ router.get('/tarifrc', async (req, res) => {
});
router.get('/tariffac', async (req, res) => {
- renderPage('dev.ejs', res, {}, true);
+ renderPage('tarifformfac.ejs', res, {}, true);
});
router.get('/tariftppc', async (req, res) => {
diff --git a/ecole/src/db/pb_data/data.db b/ecole/src/db/pb_data/data.db
index 44ff364e..b8fd6345 100644
Binary files a/ecole/src/db/pb_data/data.db and b/ecole/src/db/pb_data/data.db differ
diff --git a/ecole/src/db/pb_data/data.db-shm b/ecole/src/db/pb_data/data.db-shm
deleted file mode 100644
index b03ca011..00000000
Binary files a/ecole/src/db/pb_data/data.db-shm and /dev/null differ
diff --git a/ecole/src/db/pb_data/data.db-wal b/ecole/src/db/pb_data/data.db-wal
deleted file mode 100644
index e70acba8..00000000
Binary files a/ecole/src/db/pb_data/data.db-wal and /dev/null differ
diff --git a/ecole/src/db/pb_data/logs.db b/ecole/src/db/pb_data/logs.db
index b4d2350f..173bc6be 100644
Binary files a/ecole/src/db/pb_data/logs.db and b/ecole/src/db/pb_data/logs.db differ
diff --git a/ecole/src/db/pb_data/logs.db-shm b/ecole/src/db/pb_data/logs.db-shm
deleted file mode 100644
index 9125f7bd..00000000
Binary files a/ecole/src/db/pb_data/logs.db-shm and /dev/null differ
diff --git a/ecole/src/db/pb_data/logs.db-wal b/ecole/src/db/pb_data/logs.db-wal
deleted file mode 100644
index 0ff2a2c2..00000000
Binary files a/ecole/src/db/pb_data/logs.db-wal and /dev/null differ
diff --git a/ecole/src/services/clientService.js b/ecole/src/services/clientService.js
index d21355f3..4374676d 100644
--- a/ecole/src/services/clientService.js
+++ b/ecole/src/services/clientService.js
@@ -14,7 +14,55 @@ async function getClient(id) {
return globalService.fetchInfoByCriteria("client", criteria);
}
+/**
+ * Récupère plusieurs clients en plusieurs requêtes batch (optimisation pour exports)
+ * Découpe en chunks de 50 IDs pour éviter les filtres trop longs
+ * avec getFullList(collection, batchSize, options)
+ * @param {string[]} clientIds - Tableau d'IDs de clients
+ * @returns {Map} - Map des clients par ID
+ */
+async function getClientsBatch(clientIds) {
+ const clientMap = new Map();
+ if (!clientIds || clientIds.length === 0) return clientMap;
+
+ // Filtrer les IDs valides et uniques
+ const uniqueIds = [...new Set(clientIds.filter(id => id && typeof id === 'string'))];
+ if (uniqueIds.length === 0) return clientMap;
+
+ // Découper en chunks de 50 pour éviter les filtres trop longs
+ const CHUNK_SIZE = 50;
+ const chunks = [];
+ for (let i = 0; i < uniqueIds.length; i += CHUNK_SIZE) {
+ chunks.push(uniqueIds.slice(i, i + CHUNK_SIZE));
+ }
+
+ // Traiter chaque chunk
+ for (const chunk of chunks) {
+ try {
+ // Construire le filtre OR pour ce chunk
+ const filter = chunk.map(id => `id = "${id}"`).join(" || ");
+
+ // getFullList(collection, batchSize, options)
+ const clients = await db.records.getFullList("client", 500, {
+ filter: filter,
+ });
+
+ // Ajouter à la map
+ clients.forEach(client => {
+ if (client && client.id) {
+ clientMap.set(client.id, client);
+ }
+ });
+ } catch (err) {
+ logger.log("warn", `Erreur récupération clients chunk (${chunk.length} IDs):`, err?.message || String(err));
+ }
+ }
+
+ return clientMap;
+}
+
module.exports = {
createClient,
getClient,
+ getClientsBatch,
};
\ No newline at end of file
diff --git a/ecole/src/services/facService.js b/ecole/src/services/facService.js
index 294c49ef..642f3a46 100644
--- a/ecole/src/services/facService.js
+++ b/ecole/src/services/facService.js
@@ -2,8 +2,16 @@ const { db } = require('../db/db-connect');
const logger = require('../utils/logger');
const globalService = require("../services/globalService");
+async function createFacProjet(data) {
+ return await db.records.create('facprojet', data);
+}
+
+async function createFacTarif(data) {
+ return await db.records.create('factarif', data);
+}
+
async function createFAC(data) {
- return await db.records.create('fac', data);
+ return await db.records.create('fac',data)
}
async function getFACbyId(id) {
@@ -16,5 +24,7 @@ async function getFACbyId(id) {
module.exports = {
createFAC,
+ createFacProjet,
+ createFacTarif,
getFACbyId
};
\ No newline at end of file
diff --git a/ecole/src/services/globalService.js b/ecole/src/services/globalService.js
index cb539a50..2ef716e1 100644
--- a/ecole/src/services/globalService.js
+++ b/ecole/src/services/globalService.js
@@ -30,7 +30,15 @@ async function fetchInfoByCriteria(collection, criteria) {
return resultList.items[0];
}
} catch (error) {
- logger.log("error", error);
+ /**
+ * Gestion silencieuse des erreurs d'abort (requêtes interrompues)
+ * Ces erreurs sont normales lors de requêtes parallèles et ne doivent pas être loggées
+ */
+ if (error?.isAbort || error?.name?.includes("Abort") || error?.status === 0) {
+ return null;
+ }
+ // Autres erreurs loggées en info (pas en error) pour éviter le bruit dans les logs
+ logger.log("info", `Erreur récupération ${collection}:`, error?.message || error);
}
return null;
@@ -68,10 +76,71 @@ function cleanDoubleSpaces(inputString) {
return inputString.replace(/\s{2,}/g, " ");
}
+/**
+ * Formate une date ISO en format français (jj/mm/aaaa)
+ * @param {string|Date} iso - Date au format ISO
+ * @param {boolean} withTime - Inclure l'heure (défaut: false)
+ * @returns {string} Date formatée (dd/mm/yyyy ou dd/mm/yyyy hh:mm)
+ */
+function fmtDateFR(iso, withTime = false) {
+ if (!iso) return "NC";
+
+ const d = new Date(iso);
+ if (isNaN(d.getTime())) return "NC";
+
+ const dd = String(d.getDate()).padStart(2, "0");
+ const mm = String(d.getMonth() + 1).padStart(2, "0");
+ const yyyy = d.getFullYear();
+
+ if (!withTime) {
+ return `${dd}/${mm}/${yyyy}`;
+ }
+
+ const hh = String(d.getHours()).padStart(2, "0");
+ const mi = String(d.getMinutes()).padStart(2, "0");
+ return `${dd}/${mm}/${yyyy} ${hh}:${mi}`;
+}
+
+/**
+ * Échappe les caractères spéciaux XML
+ * @param {string} s - Chaîne à échapper
+ * @returns {string} Chaîne échappée
+ */
+function xmlEsc(s) {
+ return String(s ?? "")
+ .replace(/&/g, "&")
+ .replace(//g, ">")
+ .replace(/"/g, """)
+ .replace(/'/g, "'");
+}
+
+/**
+ * Génère une cellule XML pour Excel
+ * @param {string} v - Valeur de la cellule
+ * @returns {string} Cellule XML formatée
+ */
+function cellXml(v) {
+ return `${xmlEsc(v)} | `;
+}
+
+/**
+ * Génère une ligne XML pour Excel
+ * @param {Array} cells - Tableau de valeurs pour les cellules
+ * @returns {string} Ligne XML formatée
+ */
+function rowXml(cells) {
+ return `${cells.map(cellXml).join("")}
`;
+}
+
module.exports = {
getRecordIdFromFieldValue,
fetchInfoByCriteria,
updateRecordFromData,
cleanDoubleSpaces,
customFormatNumber,
+ fmtDateFR,
+ xmlEsc,
+ cellXml,
+ rowXml,
};
diff --git a/ecole/src/services/parcoursService.js b/ecole/src/services/parcoursService.js
index 95dfaa95..970d1336 100644
--- a/ecole/src/services/parcoursService.js
+++ b/ecole/src/services/parcoursService.js
@@ -1,109 +1,266 @@
+// services/parcoursService.js
const { db } = require("../db/db-connect");
const logger = require("../utils/logger");
const globalService = require("../services/globalService");
+/**
+ * Récupère un parcours par son numéro (avec expand utiles)
+ */
async function getParcoursByNumParcours(numParcours) {
- const criteria = {filter: `numParcours='${numParcours}'`, expand: `dernierUtilisateur.region, contrat`};
-
+ const criteria = {
+ filter: `numParcours='${numParcours}'`,
+ expand: [
+ "dernierUtilisateur.region",
+ "contrat",
+ "contrat.client",
+ "contrat.intermediaire"
+ ].join(",")
+ };
return globalService.fetchInfoByCriteria("parcours", criteria);
}
-// get All parcours saved in DB
-async function getAllParcours() {
+/**
+ * Full list (batch côté PocketBase). | Fetch l'ensemble de la BD via chunk "batch"
+ * avec getFullList(collection, batchSize, options)
+ */
+async function getParcoursFullList({ filter, sort, expand, fields, batch = 500 }) {
+ const options = {
+ sort: sort || "-created",
+ };
+
+ // Ajouter expand si défini
+ if (expand) {
+ options.expand = expand;
+ }
+
+ // Ajouter fields si défini
+ if (fields) {
+ options.fields = fields;
+ }
+
+ // Ajouter filter SEULEMENT s'il n'est pas vide (Pocketbase 0.7 rejette les filtres vides)
+ if (filter && filter.trim() !== "") {
+ options.filter = filter;
+ }
+
+ // getFullList(collection, batchSize, options)
+ return db.records.getFullList("parcours", batch, options);
+}
+/**
+ * Pagination multi-régions + filtres/tri optionnels (server-side DataTables)
+ * – Parcours une seule fois db par requête
+ * @param {string[]} regions
+ * @param {number} page
+ * @param {number} perPage
+ * @param {{filter?: string, sort?: string}} opts
+ */
+async function getParcoursByRegionsPage(regions = [], page = 1, perPage = 10, opts = {}) {
try {
- const criteria = {expand: "dernierUtilisateur, contrat, region"};
- const resultList = await db.records.getList("parcours", 1, 200, criteria);
+ let regFilter = "";
+ if (Array.isArray(regions) && regions.length > 0) {
+ const ors = regions.map(r => `dernierUtilisateur.region.nom = "${r}"`);
+ regFilter = `(${ors.join(" || ")})`;
+ }
- return resultList;
- } catch (error) {
- logger.log('error', error);
- return null;
- }
-}
-
-// get all parcours filtred on region
-async function getParcoursByRegion(regionUser) {
- try {
- // Récupérer les enregistrements de la collection "parcours"
- const filter = `dernierUtilisateur.region.nom = "${regionUser}"`;
- const parcoursRecords = await db.records.getFullList("parcours", 200, {
- sort: "-created",
- filter: filter,
- expand: "contrat, dernierUtilisateur.region, contrat.intermediaire",
- });
-
- // Récupérer les relations client pour chaque contrat
- for (const record of parcoursRecords) {
- const contrat = record["@expand"].contrat;
- if (contrat && contrat.client) {
- const clientRecord = await db.records.getOne("client", contrat.client);
- record["@expand"].contrat.client = clientRecord;
- }
- }
-
- return parcoursRecords;
- } catch (error) {
- logger.log('error', error);
- throw error;
+ const filter = [regFilter, opts.filter].filter(Boolean).join(" && ");
+
+ /**
+ * Récupération des parcours avec expands nécessaires
+ * Note: L'expand de contrat.client ne fonctionne pas toujours,
+ * d'où la nécessité d'un fallback dans le contrôleur
+ */
+ const list = await db.records.getList("parcours", page, perPage, {
+ sort: opts.sort || "-created",
+ filter: filter || "",
+ expand: [
+ "contrat",
+ "contrat.client",
+ "contrat.intermediaire",
+ "dernierUtilisateur.region"
+ ].join(","),
+ });
+
+ return {
+ page: list.page,
+ perPage: list.perPage,
+ totalItems: list.totalItems,
+ totalPages: list.totalPages,
+ items: list.items,
+ };
+ }
+ catch (error) {
+ logger.log('error', error);
+ throw error;
}
}
+/**
+ * Création d'un parcours vide
+ */
async function createNewEmptyParcours(numParcours) {
try {
- const data = { ["numParcours"]: numParcours };
- const record = await db.records.create("parcours", data);
-
- if (record) {
- return record.id;
- } else {
- return null;
- }
- } catch (error) {
- logger.log("error", error);
- return null;
+ const data = { ["numParcours"]: numParcours };
+ const record = await db.records.create("parcours", data);
+ if (record) {
+ return record.id;
+ } else {
+ return null;
+ }
+ }
+ catch (error) {
+ logger.log("error", error);
+ return null;
}
}
+/**
+ * MAJ d'un champ d'un parcours
+ */
async function updateFieldValueParcours(id, field, value) {
try {
- const data = { [field]: value };
- const record = await db.records.update("parcours", id, data);
-
- if (record) {
- return record.id;
- } else {
- return null;
- }
- } catch (error) {
- logger.log("error", error);
- return null;
+ const data = { [field]: value };
+ const record = await db.records.update("parcours", id, data);
+ if (record) {
+ return record.id;
+ } else {
+ return null;
+ }
+ }
+ catch (error) {
+ logger.log("error", error);
+ return null;
}
}
+/**
+ * Génère le prochain numéro de parcours
+ */
async function getNewParcoursNumber() {
try {
- // fetch a paginated records list en utilisant le filtre pour le parcours
- const resultList = await db.records.getFullList("parcours", 99999999, {sort: "-numParcours",});
+ const list = await db.records.getList("parcours", 1, 1, { sort: "-numParcours" });
+ const last = list?.items?.[0];
+ if (!last?.numParcours) return null;
- if (resultList.length > 0) {
- const lastNumParcours = resultList[0].numParcours;
+ const numericValue = parseInt(String(last.numParcours).substring(1), 10);
+ if (Number.isNaN(numericValue)) return null;
- // Extrait les chiffres du numéro de parcours
- const numericPart = lastNumParcours.substring(1); // Supprime le "P" initial
- const numericValue = parseInt(numericPart, 10);
+ const next = numericValue + 1;
+ return "P" + next.toString().padStart(9, "0");
+ }
+ catch (error) {
+ logger.log("error", error);
+ return null;
+ }
+}
- if (!isNaN(numericValue)) {
- const newNumericValue = numericValue + 1;
- const newNumParcours = "P" + newNumericValue.toString().padStart(9, "0");
+// --- Section détails profonds (contrat + fiche produit) --- //
- return newNumParcours;
- }
- } else {
- return null;
- }
- } catch (error) {
- logger.log("error", error);
- return null;
+/**
+ * Récupère un parcours (via numParcours) avec les expands utiles pour détails.
+ */
+async function getParcoursForDetails(numParcours) {
+ try {
+ const list = await db.records.getList("parcours", 1, 1, {
+ filter: `numParcours='${numParcours}'`,
+ expand: [
+ "contrat",
+ "contrat.client",
+ "contrat.intermediaire",
+ "dernierUtilisateur.region"
+ ].join(","),
+ });
+ return list?.items?.[0] || null;
+ }
+ catch (e) {
+ logger.log("error", e);
+ return null;
+ }
+}
+
+/**
+ * Mappe un libellé produit vers la collection PocketBase (à ajuster si changement de parcours).
+ */
+function mapProduitToCollection(produitRaw = "") {
+ const p = String(produitRaw || "").trim().toUpperCase();
+ const map = {
+ "TPPC": "tppc",
+ "RC": "rc",
+ "FAC": "fac",
+ };
+ return map[p] || null;
+}
+
+/**
+ * Récupère la fiche produit pour un contrat donné.
+ * On tente d'abord par relation "contrat = contratId" si elle existe,
+ * sinon fallback par "numContrat = x" si jamais la fiche stocke le numéro.
+ */
+async function getProduitRecordForContrat(contrat, opts = {}) {
+ try {
+ if (!contrat) return null;
+ const collection = mapProduitToCollection(contrat.produit);
+ if (!collection) return null;
+
+ // Tente via une relation directe "contrat" (champ le plus propre)
+ try {
+ const record = await db.records.getFirstListItem(collection, `contrat='${contrat.id}'`, {
+ });
+ if (record) return record;
+ }
+ catch (_) { /* ignore, on tente le fallback */ }
+
+ // Fallback
+ if (contrat.numContrat) {
+ try {
+ const record = await db.records.getFirstListItem(collection, `numContrat='${contrat.numContrat}'`, {});
+ if (record) return record;
+ }
+ catch (_) { /* ignore */ }
+ }
+
+ return null;
+ } catch (e) {
+ logger.log("error", e);
+ return null;
+ }
+}
+
+/**
+ * reformatage texte - a virer
+ */
+function escPB(s = "") {
+ return String(s).replace(/"/g, '\\"');
+}
+
+
+/**
+ * Détails complets: parcours + contrat + fiche produit
+ */
+async function getDeepDetailsByNumParcours(numParcours) {
+ try {
+ const filter = `numParcours = "${escPB(numParcours)}"`;
+
+ const list = await db.records.getList("parcours", 1, 1, {
+ filter,
+ expand: [
+ "contrat",
+ "contrat.client",
+ "contrat.intermediaire",
+ "dernierUtilisateur.region",
+ // produit lié
+ "contrat.tppc",
+ "contrat.rc",
+ "contrat.fac",
+ // sous-relations TPPC
+ "contrat.tppc.tarif",
+ "contrat.tppc.projet",
+ ].join(","),
+ });
+
+ return list?.items?.[0] || null;
+ } catch (e) {
+ logger.log("error", e);
+ return null;
}
}
@@ -112,6 +269,10 @@ module.exports = {
getParcoursByNumParcours,
createNewEmptyParcours,
updateFieldValueParcours,
- getAllParcours,
- getParcoursByRegion,
-};
+ getParcoursByRegionsPage,
+ getParcoursFullList,
+ getParcoursForDetails,
+ getProduitRecordForContrat,
+ getDeepDetailsByNumParcours,
+ mapProduitToCollection,
+};
\ No newline at end of file
diff --git a/ecole/src/services/rcService.js b/ecole/src/services/rcService.js
index 21171b96..b6bbf4a9 100644
--- a/ecole/src/services/rcService.js
+++ b/ecole/src/services/rcService.js
@@ -1,5 +1,6 @@
const { db } = require('../db/db-connect');
const logger = require('../utils/logger');
+const globalService = require("../services/globalService");
// ===== Collection RC principale =====
async function createRc(data) {
diff --git a/ecole/src/templates/template-declinaison-tarifaire-fac.docx b/ecole/src/templates/template-declinaison-tarifaire-fac.docx
new file mode 100644
index 00000000..0c2ab181
Binary files /dev/null and b/ecole/src/templates/template-declinaison-tarifaire-fac.docx differ
diff --git a/ecole/src/templates/template-projet-fac.docx b/ecole/src/templates/template-projet-fac.docx
index a760dd29..8b11d06d 100644
Binary files a/ecole/src/templates/template-projet-fac.docx and b/ecole/src/templates/template-projet-fac.docx differ
diff --git a/ecole/views/historiqueParcours.ejs b/ecole/views/historiqueParcours.ejs
index 06f42766..3db8f398 100644
--- a/ecole/views/historiqueParcours.ejs
+++ b/ecole/views/historiqueParcours.ejs
@@ -31,38 +31,6 @@
Activer la recherche par colonne
-
diff --git a/ecole/views/projetformfac.ejs b/ecole/views/projetformfac.ejs
index c0f61a50..e38039e8 100644
--- a/ecole/views/projetformfac.ejs
+++ b/ecole/views/projetformfac.ejs
@@ -163,42 +163,42 @@
@@ -1018,7 +1017,24 @@
-
+
+
+
+
+
+
Liste des pays exclus
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
Liste des pays exclus
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Demande PASS animaux vivants
-
-
-
-
Vous devez faire une demande de dépassement de pouvoirs pour pouvoir garantir les animaux vivants
-
-
-
Veuillez cliquer sur « Demande PASS » pour faire la demande sur l'outil « PASS »
-
- Demande PASS
-
-
-
-
-
@@ -1096,4 +1075,34 @@
+
+
+
+
+
+
+
Attention
+
+ Si vous modifiez cette information, la prime calculée à l'étape "Tarif" sera incorrecte,
+ Voulez-vous modifier cette information à l'étape "Tarif" ?
+
+
+
Cela s'applique aux informations suivantes :
+
+ Activité assurée
+ Type de Marchandise
+ Zones
+ Moyen de Transport
+ Risque de Guerre
+ Extensions de Garanties
+ Chiffre d'Affaires
+ Taux Risque de Guerre & Risque Ordinaires
+ Cotisations
+ Capital TPPC et Capital Exposition
+
+
+
\ No newline at end of file
diff --git a/ecole/views/projetformtppc.ejs b/ecole/views/projetformtppc.ejs
index 4adb17ff..b88cf9f7 100644
--- a/ecole/views/projetformtppc.ejs
+++ b/ecole/views/projetformtppc.ejs
@@ -399,7 +399,7 @@
-
+
add
diff --git a/ecole/views/tarifformfac.ejs b/ecole/views/tarifformfac.ejs
new file mode 100644
index 00000000..ea83514b
--- /dev/null
+++ b/ecole/views/tarifformfac.ejs
@@ -0,0 +1,1490 @@
+
+
+
+
+
+
+
+
+
+
+
Zone 1 - France Métropolitaine et pays limitrophes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Zone 2 - Union Européenne
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Zone 3 - Autres pays Européens sauf Russie et Ukraine
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Zone 4 - Pays du Maghreb et Amérique du Nord ( USA / Canada / Mexique )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Zone 5 - Amérique Centrale et Sud / Caraïbes, Asie et Océanie
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Zone 6 - Afrique hors Maghreb / Proche Orient / Moyen Orient
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Format de saisie date
+
+
+
+
Le format de donnée DATE doit respecter cette convention :
+
- Pour date d'effet et date de fin JJ/MM/AAAA
+
- Pour date d'échéance et date de fin JJ/MM
+
+
+
Pour des raisons de qualité de la donnée, aucun autre format ne sera possible, vous pouvez toutefois
+ utiliser le bouton :
+
+
+ X
+
+
+ Vos CP seront alors renseignées avec la mention "A PRECISER" à la place de ladite DATE.
+
+
+
+
+
+
+
+
+
+
Liste des pays exclus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Zone 6 - Afrique hors Maghreb / Proche Orient / Moyen Orient
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Attention
+
+
+
+ Pour plus de 5 véhicules ou un montant supérieur à 100 000€, privilégier un contrat séparé pour la TPPC.
+
+
+
+
+
+
+
+
+
+
Marchandise Principale
+
+
+
+ La marchandise principale représente plus de 50 % du chiffre d'affaires.
+
+
+ Toutefois, si une marchandise particulière représente plus de 35 % du chiffre d'affaires et est plus
+ majorante que celle qui dépasse les 50 %,
+ elle doit être considérée comme marchandise principale.
+ Dans ce cas, l'autre marchandise sera classée comme secondaire.
+
+
+ Les marchandises secondaires doivent être renseignées dans le projet.
+
+
+
+
+
+
+
+
+
+
Zones Géographiques
+
+
+
+ Vous ne pouvez selectionner qu'une zone principale.
+ Les zones secondaires seront à renseigner sur le projet.
+
+
+
+
+
+
+
+
+
+
+
+
+
Tarif de Référence : 00.00€
+
+
+ mood_bad
+
+
99.99%
+
+
+
Veuillez renseigner un tarif commercial
+
+
+
+
Tarif Commercial
+
+
+ Merci d'ajouter
+ un commentaire
+ explicatif pour justifier cette différence ou modifier le tarif
+ commercial
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ecole/views/tarifformtppc.ejs b/ecole/views/tarifformtppc.ejs
index 0f1314d9..48d1be4e 100644
--- a/ecole/views/tarifformtppc.ejs
+++ b/ecole/views/tarifformtppc.ejs
@@ -173,7 +173,7 @@
+ placeholder="Non défini" min="0" value="0" />