From f8e5468d15c670a43b27b466b5e0ea832b5ff3d1 Mon Sep 17 00:00:00 2001 From: vmaubert <github@vcmb.dev> Date: Thu, 20 Jun 2024 11:47:29 +0200 Subject: [PATCH] =?UTF-8?q?feat(etapes):=20fusionner=20les=20=C3=A9tapes?= =?UTF-8?q?=20des=20avis=20(#1243)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 5592 +++++++++++------ packages/api/package.json | 4 +- packages/api/src/api/_format/titres-etapes.ts | 135 + ...ons-permissions-etapes.test.integration.ts | 18 +- packages/api/src/api/graphql/resolvers.ts | 5 +- .../resolvers/_titre-etape-email.test.ts | 5 +- .../graphql/resolvers/_titre-etape-email.ts | 14 +- .../graphql/resolvers/titres-etapes.test.ts | 34 - .../api/graphql/resolvers/titres-etapes.ts | 518 +- .../graphql/schemas/administrations.graphql | 24 - .../api/graphql/schemas/entreprises.graphql | 25 - .../api/src/api/graphql/schemas/index.graphql | 10 - .../api/src/api/graphql/schemas/metas.graphql | 4 - .../api/graphql/schemas/titres-etapes.graphql | 110 - .../src/api/graphql/schemas/titres.graphql | 5 - .../api/graphql/schemas/utilisateurs.graphql | 1 - .../titres-demarches.test.integration.ts | 3 +- .../titres-etapes-creer.test.integration.ts | 261 - ...titres-etapes-modifier.test.integration.ts | 407 -- .../api/graphql/titres.test.integration.ts | 41 +- .../api/src/api/rest/demarches.queries.ts | 4 +- .../api/rest/demarches.test.integration.ts | 5 +- .../api/rest/entreprises.test.integration.ts | 3 +- .../api/rest/etape-creer.test.integration.ts | 306 + .../rest/etape-modifier.test.integration.ts | 491 ++ packages/api/src/api/rest/etapes.queries.ts | 22 +- .../src/api/rest/etapes.test.integration.ts | 101 +- packages/api/src/api/rest/etapes.test.ts | 137 +- packages/api/src/api/rest/etapes.ts | 675 +- packages/api/src/api/rest/express-type.ts | 2 +- packages/api/src/api/rest/fichiers.ts | 19 +- .../api/src/api/rest/perimetre.queries.ts | 2 +- packages/api/src/api/rest/perimetre.ts | 8 +- .../api/src/api/rest/permissions/avis.test.ts | 115 + packages/api/src/api/rest/permissions/avis.ts | 43 + .../src/api/rest/permissions/etapes.test.ts | 4 +- packages/api/src/api/rest/titre-demande.ts | 4 +- .../api/src/api/rest/titre-heritage.test.ts | 5 +- packages/api/src/api/rest/titres.queries.ts | 37 +- .../src/api/rest/titres.test.integration.ts | 17 +- .../titres-demarches-depot-create.test.ts | 11 +- ...titres-demarches-statut-ids-update.test.ts | 9 +- ...pes-administrations-locales-update.test.ts | 15 +- ...es-etapes-areas-update.test.integration.ts | 3 +- ...-etapes-heritage-contenu-update.queries.ts | 7 +- .../titres-etapes-heritage-contenu-update.ts | 4 +- .../titres-etapes-ordre-update.test.ts | 24 +- .../processes/titres-phases-update.test.ts | 13 +- .../__snapshots__/oct.machine.test.ts.snap | 2 +- .../business/rules-demarches/arm/oct.cas.json | 2 +- .../rules-demarches/arm/oct.machine.test.ts | 190 +- .../rules-demarches/arm/oct.machine.ts | 84 +- .../arm/ren-pro.machine.test.ts | 7 +- .../rules-demarches/arm/ren-pro.machine.ts | 70 +- .../business/rules-demarches/arm/ren.cas.json | 2 +- .../business/rules-demarches/axm/oct.cas.json | 2 +- .../rules-demarches/axm/oct.machine.test.ts | 112 +- .../rules-demarches/axm/oct.machine.ts | 221 +- .../business/rules-demarches/axm/pro.cas.json | 2 +- .../rules-demarches/axm/pro.machine.test.ts | 2 +- .../rules-demarches/axm/pro.machine.ts | 194 +- .../rules-demarches/machine-common.test.ts | 7 +- .../rules-demarches/machine-common.ts | 7 +- .../rules-demarches/machine-helper.test.ts | 99 +- .../business/rules-demarches/prm/oct.cas.json | 2 +- .../rules-demarches/prm/oct.machine.test.ts | 44 +- .../rules-demarches/prm/oct.machine.ts | 172 +- .../business/rules-demarches/pxg/oct.cas.json | 2 +- .../rules-demarches/pxg/oct.machine.test.ts | 12 +- .../rules-demarches/pxg/oct.machine.ts | 143 +- .../titre-activites-build.test.ts.snap | 48 + .../rules/titre-activites-build.test.ts | 3 +- .../business/rules/titre-activites-build.ts | 15 +- ...-demarche-annulation-date-fin-find.test.ts | 7 +- .../rules/titre-demarche-public-find.test.ts | 55 +- .../titre-demarche-statut-id-find.test.ts | 52 +- .../rules/titre-demarche-statut-id-find.ts | 19 +- .../rules/titre-etape-prop-find.test.ts | 71 +- .../business/rules/titre-phases-find.test.ts | 317 +- .../rules/titre-prop-etape-find.test.ts | 102 +- .../titre-etape-heritage-contenu-find.test.ts | 16 +- .../utils/titre-etape-heritage-props-find.ts | 7 +- .../business/utils/titre-etapes-sort.test.ts | 129 +- .../src/business/utils/titre-etapes-sort.ts | 15 +- .../titre-demarche-etat-validate.test.ts | 45 +- .../titre-demarche-etat-validate.ts | 9 +- ...tre-etape-type-and-status-validate.test.ts | 2 +- .../titre-etape-type-and-status-validate.ts | 2 +- .../titre-etape-updation-validate.test.ts | 251 +- .../titre-etape-updation-validate.ts | 115 +- .../utils/contenu-dates-check.test.ts | 13 +- .../validations/utils/contenu-dates-check.ts | 18 +- .../utils/contenu-numbers-check.test.ts | 10 +- .../utils/contenu-numbers-check.ts | 18 +- .../utils/heritage-contenu-validate.test.ts | 76 - .../utils/heritage-contenu-validate.ts | 54 - .../validations/utils/props-dates-check.ts | 30 - .../validations/utils/props-numbers-check.ts | 15 - .../src/database/models/_format/id-create.ts | 8 +- .../api/src/database/models/titres-etapes.ts | 5 + .../titres-etapes.test.integration.ts | 5 +- .../titres-demarches.test.integration.ts | 3 +- .../database/queries/titres-etapes.queries.ts | 206 +- .../queries/titres-etapes.queries.types.ts | 109 + .../queries/titres.test.integration.ts | 3 +- .../20240610091608_add_avis-documents.ts | 237 + packages/api/src/pg-database.ts | 7 +- packages/api/src/server/rest.ts | 23 +- .../api/src/tools/demarches/tests-creation.ts | 6 +- .../api/src/tools/phases/tests-creation.ts | 3 +- packages/api/src/types.ts | 83 +- .../_utils/administrations-permissions.ts | 135 +- packages/api/tests/_utils/index.ts | 4 +- .../tests/queries/titre-etape-creer.graphql | 9 - .../queries/titre-etape-modifier.graphql | 9 - packages/common/package.json | 4 +- packages/common/src/date.test.ts | 3 + packages/common/src/date.ts | 5 +- packages/common/src/demarche.test.ts | 2 +- packages/common/src/demarche.ts | 5 +- packages/common/src/etape-form.ts | 65 +- packages/common/src/etape.ts | 76 +- packages/common/src/number.ts | 4 +- packages/common/src/perimetre.ts | 2 +- .../common/src/permissions/documents.test.ts | 53 - packages/common/src/permissions/documents.ts | 27 - .../common/src/permissions/etape-form.test.ts | 498 +- packages/common/src/permissions/etape-form.ts | 236 +- .../common/src/permissions/sections.test.ts | 14 - packages/common/src/permissions/sections.ts | 17 - .../src/permissions/titres-etapes.test.ts | 313 +- .../common/src/permissions/titres-etapes.ts | 237 +- packages/common/src/rest.ts | 21 +- packages/common/src/sections.test.ts | 62 + packages/common/src/sections.ts | 55 +- packages/common/src/static/activitesTypes.ts | 73 + .../administrationsTitresTypesEtapesTypes.ts | 107 +- packages/common/src/static/avisTypes.ts | 67 + packages/common/src/static/etapesTypes.ts | 421 +- .../src/static/etapesTypesEtapesStatuts.ts | 164 +- .../documents.ts | 32 - .../index.test.ts | 7 +- .../index.ts | 226 +- .../sections.test.ts | 62 +- .../sections.ts | 89 +- packages/common/src/titres.test.ts | 9 +- packages/common/src/titres.ts | 5 +- packages/common/src/typescript-tools.ts | 1 + packages/ui/package.json | 39 +- .../document-type-typeahead.stories.tsx | 15 - ...e-typeahead.stories_snapshots_Default.html | 7 - .../_common/document-type-typeahead.tsx | 53 - .../_common/etape-statut.stories.tsx | 17 +- .../etape-statut.stories_snapshots_All.html | 30 + .../src/components/_common/etape-statut.tsx | 13 + .../_common/new-section-element.stories.tsx | 10 + .../_common/new-section.stories.tsx | 5 +- .../_common/new-sections-edit.stories.tsx | 34 +- .../src/components/_ui/typeahead-single.tsx | 20 +- .../components/_ui/typeahead-smart-single.tsx | 52 + .../src/components/_ui/typeahead.stories.tsx | 22 + ...eahead.stories_snapshots_SmartSingle.html} | 0 ...snapshots_SmartSingleWithInitialValue.html | 4 + .../components/activite-edition.stories.tsx | 15 +- .../ui/src/components/activite.stories.tsx | 2 +- ...permissions.stories_snapshots_Default.html | 310 +- .../demarche/demarche-etape.stories.tsx | 109 +- ...ape.stories_snapshots_AvisDefavorable.html | 3 +- ...es_snapshots_AxmDeposableAvecDaeEtAsl.html | 3 +- ...snapshots_DemandeArmMecaniseDeposable.html | 3 +- ...pshots_DemandeArmMecaniseNonDeposable.html | 3 +- ...pshots_DemandeArmNonMecaniseDeposable.html | 3 +- ...e.stories_snapshots_DemandeAvecForage.html | 3 +- ...ories_snapshots_DemandeAvecGrosseNote.html | 3 +- ...apshots_DemandeAvecSeulementPerimetre.html | 3 +- ...s_DemandeMultipleEntreprisesDocuments.html | 1 + ...-etape.stories_snapshots_DemandeNoMap.html | 1 + ...stories_snapshots_DemandeNonDeposable.html | 3 +- ...ories_snapshots_DemandeNonSupprimable.html | 3 +- ...emarche-etape.stories_snapshots_Depot.html | 1 + .../components/demarche/demarche-etape.tsx | 106 +- .../src/components/etape-edition.stories.tsx | 171 +- ...ition.stories_snapshots_AffichageAide.html | 4 +- ...ion.stories_snapshots_AxmEnZoneDuSdom.html | 4 +- ....stories_snapshots_DemandeArmComplete.html | 1 + ...dition.stories_snapshots_Modification.html | 4 +- ..._snapshots_ModificationDemandeHeritee.html | 1 + packages/ui/src/components/etape-edition.tsx | 5 +- .../etape/add-etape-avis-popup.stories.tsx | 68 + ...apshots_DocumentInitialDejaSauvegarde.html | 93 + ...s_snapshots_DocumentInitialTemporaire.html | 93 + ...stories_snapshots_SansDocumentInitial.html | 93 + .../components/etape/add-etape-avis-popup.tsx | 141 + .../etape/add-etape-document-popup.tsx | 5 +- .../etape/autocomplete-entreprise-single.tsx | 4 +- .../src/components/etape/date-type-edit.tsx | 12 - .../src/components/etape/etape-api-client.ts | 431 +- .../etape/etape-avis-edit.stories.tsx | 104 + ...s-edit.stories_snapshots_AvisEnGuyane.html | 97 + ...ape-avis-edit.stories_snapshots_Empty.html | 4 + ...pe-avis-edit.stories_snapshots_Rempli.html | 81 + .../src/components/etape/etape-avis-edit.tsx | 251 + .../components/etape/etape-avis.stories.tsx | 55 + .../etape-avis.stories_snapshots_Empty.html | 3 + ...e-avis.stories_snapshots_NotConnected.html | 45 + ....stories_snapshots_UserAdministration.html | 45 + ...avis.stories_snapshots_UserEntreprise.html | 45 + ...tape-avis.stories_snapshots_UserSuper.html | 45 + .../ui/src/components/etape/etape-avis.tsx | 77 + .../etape/etape-documents-edit.stories.tsx | 28 +- .../components/etape/etape-documents-edit.tsx | 9 +- .../etape/etape-edit-form.stories.tsx | 76 +- ...e-edit-form.stories_snapshots_Default.html | 1 + ...m.stories_snapshots_EtapeModification.html | 1 + .../src/components/etape/etape-edit-form.tsx | 308 +- .../etape/fondamentales-edit.stories.tsx | 4 +- .../components/etape/fondamentales-edit.tsx | 2 +- .../ui/src/components/etape/sections-edit.tsx | 15 +- packages/ui/src/components/titre.stories.tsx | 26 +- ...stories_snapshots_AbattisKoticaOctroi.html | 3 + .../titre.stories_snapshots_BasseManaMod.html | 7 + ...tre.stories_snapshots_BonEspoirOctroi.html | 4 +- ...ries_snapshots_BonEspoirProlongation2.html | 6 +- ...re.stories_snapshots_BonEspoirTravaux.html | 4 + ...e.stories_snapshots_ChantepieMutation.html | 2 + ...tre.stories_snapshots_ChantepieOctroi.html | 2 + ...snapshots_ChantepieOctroiAsEntreprise.html | 2 + ...stories_snapshots_CriqueAdolpheOctroi.html | 8 + .../titre.stories_snapshots_Full.html | 1 + .../titre.stories_snapshots_Lenoncourt.html | 2 + ...treAvecUneSeuleDemarcheEnConstruction.html | 1 + packages/ui/src/components/titre/phase.ts | 4 +- .../src/components/titre/titre-demarche.tsx | 59 +- packages/ui/tsconfig.json | 2 +- 234 files changed, 11361 insertions(+), 8105 deletions(-) delete mode 100644 packages/api/src/api/graphql/resolvers/titres-etapes.test.ts delete mode 100644 packages/api/src/api/graphql/schemas/administrations.graphql delete mode 100644 packages/api/src/api/graphql/titres-etapes-creer.test.integration.ts delete mode 100644 packages/api/src/api/graphql/titres-etapes-modifier.test.integration.ts create mode 100644 packages/api/src/api/rest/etape-creer.test.integration.ts create mode 100644 packages/api/src/api/rest/etape-modifier.test.integration.ts create mode 100644 packages/api/src/api/rest/permissions/avis.test.ts create mode 100644 packages/api/src/api/rest/permissions/avis.ts delete mode 100644 packages/api/src/business/validations/utils/heritage-contenu-validate.test.ts delete mode 100644 packages/api/src/business/validations/utils/heritage-contenu-validate.ts delete mode 100644 packages/api/src/business/validations/utils/props-dates-check.ts delete mode 100644 packages/api/src/business/validations/utils/props-numbers-check.ts create mode 100644 packages/api/src/knex/migrations/20240610091608_add_avis-documents.ts delete mode 100644 packages/api/tests/queries/titre-etape-creer.graphql delete mode 100644 packages/api/tests/queries/titre-etape-modifier.graphql delete mode 100644 packages/common/src/permissions/documents.test.ts delete mode 100644 packages/common/src/permissions/documents.ts create mode 100644 packages/common/src/sections.test.ts create mode 100644 packages/common/src/static/avisTypes.ts delete mode 100644 packages/ui/src/components/_common/document-type-typeahead.stories.tsx delete mode 100644 packages/ui/src/components/_common/document-type-typeahead.stories_snapshots_Default.html delete mode 100644 packages/ui/src/components/_common/document-type-typeahead.tsx create mode 100644 packages/ui/src/components/_ui/typeahead-smart-single.tsx rename packages/ui/src/components/{_common/document-type-typeahead.stories_snapshots_WithDocumentTypeAlreadySelected.html => _ui/typeahead.stories_snapshots_SmartSingle.html} (100%) create mode 100644 packages/ui/src/components/_ui/typeahead.stories_snapshots_SmartSingleWithInitialValue.html create mode 100644 packages/ui/src/components/etape/add-etape-avis-popup.stories.tsx create mode 100644 packages/ui/src/components/etape/add-etape-avis-popup.stories_snapshots_DocumentInitialDejaSauvegarde.html create mode 100644 packages/ui/src/components/etape/add-etape-avis-popup.stories_snapshots_DocumentInitialTemporaire.html create mode 100644 packages/ui/src/components/etape/add-etape-avis-popup.stories_snapshots_SansDocumentInitial.html create mode 100644 packages/ui/src/components/etape/add-etape-avis-popup.tsx create mode 100644 packages/ui/src/components/etape/etape-avis-edit.stories.tsx create mode 100644 packages/ui/src/components/etape/etape-avis-edit.stories_snapshots_AvisEnGuyane.html create mode 100644 packages/ui/src/components/etape/etape-avis-edit.stories_snapshots_Empty.html create mode 100644 packages/ui/src/components/etape/etape-avis-edit.stories_snapshots_Rempli.html create mode 100644 packages/ui/src/components/etape/etape-avis-edit.tsx create mode 100644 packages/ui/src/components/etape/etape-avis.stories.tsx create mode 100644 packages/ui/src/components/etape/etape-avis.stories_snapshots_Empty.html create mode 100644 packages/ui/src/components/etape/etape-avis.stories_snapshots_NotConnected.html create mode 100644 packages/ui/src/components/etape/etape-avis.stories_snapshots_UserAdministration.html create mode 100644 packages/ui/src/components/etape/etape-avis.stories_snapshots_UserEntreprise.html create mode 100644 packages/ui/src/components/etape/etape-avis.stories_snapshots_UserSuper.html create mode 100644 packages/ui/src/components/etape/etape-avis.tsx diff --git a/package-lock.json b/package-lock.json index 0824f6e6a..345888ff0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -59,12 +59,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.24.2", + "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" }, "engines": { @@ -72,30 +72,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", + "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", + "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helpers": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -120,9 +120,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz", - "integrity": "sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.7.tgz", + "integrity": "sha512-SO5E3bVxDuxyNxM5agFv480YA2HO6ohZbGxbazZdIk3KQOPOGVNw6q78I9/lbviIf95eq6tPozeYnJLbjnC8IA==", "dev": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", @@ -134,7 +134,7 @@ }, "peerDependencies": { "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0" + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/@babel/eslint-parser/node_modules/semver": { @@ -147,12 +147,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", "dev": true, "dependencies": { - "@babel/types": "^7.24.0", + "@babel/types": "^7.24.7", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -162,37 +162,38 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", + "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", + "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", + "@babel/compat-data": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -226,19 +227,19 @@ "dev": true }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz", - "integrity": "sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", + "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", "semver": "^6.3.1" }, "engines": { @@ -258,12 +259,12 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", + "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-annotate-as-pure": "^7.24.7", "regexpu-core": "^5.3.1", "semver": "^6.3.1" }, @@ -300,74 +301,79 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "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==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", + "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dev": true, "dependencies": { - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", + "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -377,35 +383,35 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", + "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", + "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-wrap-function": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -415,14 +421,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", - "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", + "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -432,103 +438,105 @@ } }, "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==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "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==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", + "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", + "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", + "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/helper-function-name": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", + "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", "dev": true, "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -594,9 +602,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -606,13 +614,13 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz", - "integrity": "sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", + "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -622,12 +630,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", - "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", + "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -637,14 +645,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", - "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", + "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -654,13 +662,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", - "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", + "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -745,12 +753,12 @@ } }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.1.tgz", - "integrity": "sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz", + "integrity": "sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -760,12 +768,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", - "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", + "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -775,12 +783,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", - "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -814,12 +822,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", - "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -931,12 +939,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", - "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", + "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -962,12 +970,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", - "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", + "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -977,14 +985,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", - "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", + "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -995,14 +1003,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", - "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", + "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20" + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1012,12 +1020,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", - "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", + "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1027,12 +1035,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz", - "integrity": "sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", + "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1042,13 +1050,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", - "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", + "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1058,13 +1066,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", - "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", + "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.4", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -1075,18 +1083,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", - "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.22.6", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz", + "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", "globals": "^11.1.0" }, "engines": { @@ -1097,13 +1105,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", - "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", + "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/template": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1113,12 +1121,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", - "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz", + "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1128,13 +1136,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", - "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", + "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1144,12 +1152,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", - "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", + "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1159,12 +1167,12 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", - "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", + "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -1175,13 +1183,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", - "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", + "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1191,12 +1199,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", - "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", + "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1207,13 +1215,13 @@ } }, "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.1.tgz", - "integrity": "sha512-iIYPIWt3dUmUKKE10s3W+jsQ3icFkw0JyRVyY1B7G4yK/nngAOHLVx8xlhA6b/Jzl/Y0nis8gjqhqKtRDQqHWQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.7.tgz", + "integrity": "sha512-cjRKJ7FobOH2eakx7Ja+KpJRj8+y+/SiB3ooYm/n2UJfxu0oEaOoxOinitkJcPqv9KxS0kxTGPUaR7L2XcXDXA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-flow": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-flow": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1223,13 +1231,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", - "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", + "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1239,14 +1247,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", - "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", + "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1256,12 +1264,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", - "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", + "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1272,12 +1280,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", - "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", + "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1287,12 +1295,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", - "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", + "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -1303,12 +1311,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", - "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", + "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1318,13 +1326,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", - "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", + "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1334,14 +1342,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", - "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", + "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1351,15 +1359,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", - "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", + "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1369,13 +1377,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", - "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", + "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1385,13 +1393,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", + "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1401,12 +1409,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", - "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", + "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1416,12 +1424,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", - "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", + "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -1432,12 +1440,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", - "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", + "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -1448,15 +1456,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", - "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", + "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.1" + "@babel/plugin-transform-parameters": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1466,13 +1474,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", - "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", + "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1482,12 +1490,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", - "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", + "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -1498,13 +1506,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", - "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", + "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1515,12 +1523,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", - "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", + "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1530,13 +1538,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", - "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", + "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1546,14 +1554,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", - "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", + "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1564,12 +1572,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", - "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", + "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1579,12 +1587,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", - "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", + "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1595,12 +1603,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", - "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", + "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1610,12 +1618,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", - "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", + "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1625,13 +1633,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", - "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", + "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1641,12 +1649,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", - "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", + "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1656,12 +1664,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", - "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", + "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1671,12 +1679,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", - "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", + "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1686,15 +1694,15 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.4.tgz", - "integrity": "sha512-79t3CQ8+oBGk/80SQ8MN3Bs3obf83zJ0YZjDmDaEZN8MqhMI760apl5z6a20kFeMXBwJX99VpKT8CKxEBp5H1g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.7.tgz", + "integrity": "sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.4", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-typescript": "^7.24.1" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-typescript": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1704,12 +1712,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", - "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", + "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1719,13 +1727,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", - "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", + "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1735,13 +1743,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", - "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", + "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1751,13 +1759,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", - "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", + "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1767,27 +1775,27 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.4.tgz", - "integrity": "sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.4", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz", + "integrity": "sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.1", - "@babel/plugin-syntax-import-attributes": "^7.24.1", + "@babel/plugin-syntax-import-assertions": "^7.24.7", + "@babel/plugin-syntax-import-attributes": "^7.24.7", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -1799,54 +1807,54 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.1", - "@babel/plugin-transform-async-generator-functions": "^7.24.3", - "@babel/plugin-transform-async-to-generator": "^7.24.1", - "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.4", - "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-class-static-block": "^7.24.4", - "@babel/plugin-transform-classes": "^7.24.1", - "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.1", - "@babel/plugin-transform-dotall-regex": "^7.24.1", - "@babel/plugin-transform-duplicate-keys": "^7.24.1", - "@babel/plugin-transform-dynamic-import": "^7.24.1", - "@babel/plugin-transform-exponentiation-operator": "^7.24.1", - "@babel/plugin-transform-export-namespace-from": "^7.24.1", - "@babel/plugin-transform-for-of": "^7.24.1", - "@babel/plugin-transform-function-name": "^7.24.1", - "@babel/plugin-transform-json-strings": "^7.24.1", - "@babel/plugin-transform-literals": "^7.24.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", - "@babel/plugin-transform-member-expression-literals": "^7.24.1", - "@babel/plugin-transform-modules-amd": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-modules-systemjs": "^7.24.1", - "@babel/plugin-transform-modules-umd": "^7.24.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.24.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", - "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.1", - "@babel/plugin-transform-object-super": "^7.24.1", - "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.1", - "@babel/plugin-transform-parameters": "^7.24.1", - "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.1", - "@babel/plugin-transform-property-literals": "^7.24.1", - "@babel/plugin-transform-regenerator": "^7.24.1", - "@babel/plugin-transform-reserved-words": "^7.24.1", - "@babel/plugin-transform-shorthand-properties": "^7.24.1", - "@babel/plugin-transform-spread": "^7.24.1", - "@babel/plugin-transform-sticky-regex": "^7.24.1", - "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.1", - "@babel/plugin-transform-unicode-escapes": "^7.24.1", - "@babel/plugin-transform-unicode-property-regex": "^7.24.1", - "@babel/plugin-transform-unicode-regex": "^7.24.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.24.7", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoped-functions": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.24.7", + "@babel/plugin-transform-class-properties": "^7.24.7", + "@babel/plugin-transform-class-static-block": "^7.24.7", + "@babel/plugin-transform-classes": "^7.24.7", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.7", + "@babel/plugin-transform-dotall-regex": "^7.24.7", + "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-dynamic-import": "^7.24.7", + "@babel/plugin-transform-exponentiation-operator": "^7.24.7", + "@babel/plugin-transform-export-namespace-from": "^7.24.7", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.24.7", + "@babel/plugin-transform-json-strings": "^7.24.7", + "@babel/plugin-transform-literals": "^7.24.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-member-expression-literals": "^7.24.7", + "@babel/plugin-transform-modules-amd": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-modules-systemjs": "^7.24.7", + "@babel/plugin-transform-modules-umd": "^7.24.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-new-target": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-object-super": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-property-literals": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-reserved-words": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-template-literals": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.7", + "@babel/plugin-transform-unicode-escapes": "^7.24.7", + "@babel/plugin-transform-unicode-property-regex": "^7.24.7", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.4", @@ -1871,14 +1879,14 @@ } }, "node_modules/@babel/preset-flow": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.24.1.tgz", - "integrity": "sha512-sWCV2G9pcqZf+JHyv/RyqEIpFypxdCSxWIxQjpdaQxenNog7cN1pr76hg8u0Fz8Qgg0H4ETkGcJnXL8d4j0PPA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.24.7.tgz", + "integrity": "sha512-NL3Lo0NorCU607zU3NwRyJbpaB6E3t0xtd3LfAQKDfkeX4/ggcDXvkmkW42QWT5owUeW/jAe4hn+2qvkV1IbfQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-transform-flow-strip-types": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-transform-flow-strip-types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1902,16 +1910,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz", - "integrity": "sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz", + "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-syntax-jsx": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-typescript": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1921,9 +1929,9 @@ } }, "node_modules/@babel/register": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.23.7.tgz", - "integrity": "sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.24.6.tgz", + "integrity": "sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", @@ -2064,9 +2072,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", - "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", + "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -2076,33 +2084,33 @@ } }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", + "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2111,13 +2119,13 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2161,9 +2169,9 @@ } }, "node_modules/@csstools/cascade-layer-name-parser": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.9.tgz", - "integrity": "sha512-RRqNjxTZDUhx7pxYOBG/AkCVmPS3zYzfE47GEhIGkFuWFTQGJBgWOUUkKNo5MfxIfjDz5/1L3F3rF1oIsYaIpw==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.11.tgz", + "integrity": "sha512-yhsonEAhaWRQvHFYhSzOUobH2Ev++fMci+ppFRagw0qVSPlcPV4FnNmlwpM/b2BM10ZeMRkVV4So6YRswD0O0w==", "dev": true, "funding": [ { @@ -2179,8 +2187,8 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4" + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1" } }, "node_modules/@csstools/color-helpers": { @@ -2203,9 +2211,9 @@ } }, "node_modules/@csstools/css-calc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-1.2.0.tgz", - "integrity": "sha512-iQqIW5vDPqQdLx07/atCuNKDprhIWjB0b8XRhUyXZWBZYUG+9mNyFwyu30rypX84WLevVo25NYW2ipxR8WyseQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-1.2.2.tgz", + "integrity": "sha512-0owrl7AruDRKAxoSIW8XzJdz7GnuW3AOj4rYLfmXsoKIX2ZZzttzGXoiC8n8V08X7wIBlEWWVB4C8fAN18+I6Q==", "dev": true, "funding": [ { @@ -2221,14 +2229,14 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4" + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1" } }, "node_modules/@csstools/css-color-parser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-2.0.0.tgz", - "integrity": "sha512-0/v6OPpcg+b8TJT2N1Rcp0oH5xEvVOU5K2qDkaR3IMHNXuJ7XfVCQLINt3Cuj8mr54DbilEoZ9uvAmHBoZ//Fw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-2.0.2.tgz", + "integrity": "sha512-Agx2YmxTcZ7TfB7KNZQ+iekaxbWSdblvtA35aTwE3KfuYyjOlCg3P4KGGdQF/cjm1pHWVSBo5duF/BRfZ8s07A==", "dev": true, "funding": [ { @@ -2242,20 +2250,20 @@ ], "dependencies": { "@csstools/color-helpers": "^4.2.0", - "@csstools/css-calc": "^1.2.0" + "@csstools/css-calc": "^1.2.2" }, "engines": { "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4" + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1" } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.1.tgz", - "integrity": "sha512-ubEkAaTfVZa+WwGhs5jbo5Xfqpeaybr/RvWzvFxRs4jfq16wH8l8Ty/QEEpINxll4xhuGfdMbipRyz5QZh9+FA==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.3.tgz", + "integrity": "sha512-xI/tL2zxzEbESvnSxwFgwvy5HS00oCXxL4MLs6HUiDcYfwowsoQaABKxUElp1ARITrINzBnsECOc1q0eg2GOrA==", "dev": true, "funding": [ { @@ -2271,13 +2279,13 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^2.2.4" + "@csstools/css-tokenizer": "^2.3.1" } }, "node_modules/@csstools/css-tokenizer": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.4.tgz", - "integrity": "sha512-PuWRAewQLbDhGeTvFuq2oClaSCKPIBmHyIobCV39JHRYN0byDcUWJl5baPeNUcqrjtdMNqFooE0FGl31I3JOqw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.3.1.tgz", + "integrity": "sha512-iMNHTyxLbBlWIfGtabT157LH9DUx9X8+Y3oymFEuMj8HNc+rpE3dPFGFgHjpKfjeFDjLjYIAIhXPGvS2lKxL9g==", "dev": true, "funding": [ { @@ -2294,9 +2302,9 @@ } }, "node_modules/@csstools/media-query-list-parser": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.9.tgz", - "integrity": "sha512-qqGuFfbn4rUmyOB0u8CVISIp5FfJ5GAR3mBrZ9/TKndHakdnm6pY0L/fbLcpPnrzwCyyTEZl1nUcXAYHEWneTA==", + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.11.tgz", + "integrity": "sha512-uox5MVhvNHqitPP+SynrB1o8oPxPMt2JLgp5ghJOWf54WGQ5OKu47efne49r1SWqs3wRP8xSWjnO9MBKxhB1dA==", "dev": true, "funding": [ { @@ -2312,14 +2320,14 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4" + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1" } }, "node_modules/@csstools/postcss-cascade-layers": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-4.0.4.tgz", - "integrity": "sha512-MKErv8lpEwVmAcAwidY1Kfd3oWrh2Q14kxHs9xn26XzjP/PrcdngWq63lJsZeMlBY7o+WlEOeE+FP6zPzeY2uw==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-4.0.6.tgz", + "integrity": "sha512-Xt00qGAQyqAODFiFEJNkTpSUz5VfYqnDLECdlA/Vv17nl/OIV5QfTRHGAXrBGG5YcJyHpJ+GF9gF/RZvOQz4oA==", "dev": true, "funding": [ { @@ -2332,7 +2340,7 @@ } ], "dependencies": { - "@csstools/selector-specificity": "^3.0.3", + "@csstools/selector-specificity": "^3.1.1", "postcss-selector-parser": "^6.0.13" }, "engines": { @@ -2343,9 +2351,9 @@ } }, "node_modules/@csstools/postcss-color-function": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-3.0.14.tgz", - "integrity": "sha512-joGAf5bT3Jg1CpybupMJ4DwNg/VNjmLWZoWMDmX0MTy/ftHA1Qr4+CslqTT4AA1n6Dx4Wa+DSMGPrDLHtRP0jg==", + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-3.0.16.tgz", + "integrity": "sha512-KtmXfckANSKsLBoTQCzggvKft1cmmmDKYjFO4yVlB23nWUgGInVBTE9T5JLmH29NNdTWSEPLWPUxoQ6XiIEn2Q==", "dev": true, "funding": [ { @@ -2358,9 +2366,9 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^2.0.0", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", + "@csstools/css-color-parser": "^2.0.2", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", "@csstools/postcss-progressive-custom-properties": "^3.2.0", "@csstools/utilities": "^1.0.0" }, @@ -2372,9 +2380,9 @@ } }, "node_modules/@csstools/postcss-color-mix-function": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-2.0.14.tgz", - "integrity": "sha512-ZLbgtdhyuOoWoRo/W8jFv68q+IMgTJHOAI+WunRbrRPqI+vJ0K2rud/lS9Se5urzM/imVKs/kz0Uobm5Yj4HUg==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-2.0.16.tgz", + "integrity": "sha512-BJnD1M5Pdypl1cJuwGuzVC52PqgzaObsDLu34jgf+QU7daVFqz432PvpqvXTmfTSNt4OckOT1QIzWexEFlDNXw==", "dev": true, "funding": [ { @@ -2387,9 +2395,9 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^2.0.0", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", + "@csstools/css-color-parser": "^2.0.2", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", "@csstools/postcss-progressive-custom-properties": "^3.2.0", "@csstools/utilities": "^1.0.0" }, @@ -2401,9 +2409,9 @@ } }, "node_modules/@csstools/postcss-exponential-functions": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-1.0.5.tgz", - "integrity": "sha512-7S7I7KgwHWQYzJJAoIjRtUf7DQs1dxipeg1A6ikZr0PYapNJX7UHz0evlpE67SQqYj1xBs70gpG7xUv3uLp4PA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-1.0.7.tgz", + "integrity": "sha512-9usBPQX74OhiF/VuaVrp44UAPzqbKNyoaxEa6tbEXiFp+OAm3yB/TLRKyPUWg5tvvHGCduGJVdJJB3w8c8NBtA==", "dev": true, "funding": [ { @@ -2416,9 +2424,9 @@ } ], "dependencies": { - "@csstools/css-calc": "^1.2.0", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4" + "@csstools/css-calc": "^1.2.2", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1" }, "engines": { "node": "^14 || ^16 || >=18" @@ -2454,9 +2462,9 @@ } }, "node_modules/@csstools/postcss-gamut-mapping": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-1.0.7.tgz", - "integrity": "sha512-vrsHsl5TN6NB5CT0rPG6JE9V2GLFftcmPtF/k4cWT4gyVMCsDyS9wEVl82sgvh/JQ32TaUo6bh8Ndl+XRJqGQw==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-1.0.9.tgz", + "integrity": "sha512-JmOeiBJj1RJriAkr+aLBaiYUpEqdNOIo3ERQ5a4uNzy18upzrQ6tz7m2Vt1GQpJ62zQj7rC5PjAhCoZCoyE31g==", "dev": true, "funding": [ { @@ -2469,9 +2477,9 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^2.0.0", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4" + "@csstools/css-color-parser": "^2.0.2", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1" }, "engines": { "node": "^14 || ^16 || >=18" @@ -2481,9 +2489,9 @@ } }, "node_modules/@csstools/postcss-gradients-interpolation-method": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-4.0.15.tgz", - "integrity": "sha512-0xQ5r4WU/6W2lDmnOTx9liC1Cq6RSnrkEzqX7d0cRA3fz5hjC276pA0nLMoAiY3vtAp0u71nTk/3TRdnCx/OUw==", + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-4.0.17.tgz", + "integrity": "sha512-qSNIqzLPKd2SadfWwHZv42lDRyYlLaM+Vx5rRIsnYCZbQxzFfe1XAwssrcCsHgba5bA6bi5oDoFCx0W+PRCpfw==", "dev": true, "funding": [ { @@ -2496,9 +2504,9 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^2.0.0", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", + "@csstools/css-color-parser": "^2.0.2", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", "@csstools/postcss-progressive-custom-properties": "^3.2.0", "@csstools/utilities": "^1.0.0" }, @@ -2510,9 +2518,9 @@ } }, "node_modules/@csstools/postcss-hwb-function": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-3.0.13.tgz", - "integrity": "sha512-f44tgkFSxJBGm8UjlkAfBP7xE2x2XFFdvNdedHl8jpx2pQcW8a50OT3yeMnM3NB9Y2Ynd7Wn8iXARiV/IHoKvw==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-3.0.15.tgz", + "integrity": "sha512-l34fRiZ7o5+pULv7OplXniBTU4TuKYNNOv0abuvUanddWGSy3+YHlMKUSgcVFo0d1DorxPAhJSTCrugl+4OmMQ==", "dev": true, "funding": [ { @@ -2525,9 +2533,9 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^2.0.0", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", + "@csstools/css-color-parser": "^2.0.2", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", "@csstools/postcss-progressive-custom-properties": "^3.2.0", "@csstools/utilities": "^1.0.0" }, @@ -2588,9 +2596,9 @@ } }, "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-4.0.6.tgz", - "integrity": "sha512-HilOhAsMpFheMYkuaREZx+CGa4hsG6kQdzwXSsuqKDFzYz2eIMP213+3dH/vUbPXaWrzqLKr8m3i0dgYPoh7vg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-4.0.8.tgz", + "integrity": "sha512-0aj591yGlq5Qac+plaWCbn5cpjs5Sh0daovYUKJUOMjIp70prGH/XPLp7QjxtbFXz3CTvb0H9a35dpEuIuUi3Q==", "dev": true, "funding": [ { @@ -2603,7 +2611,7 @@ } ], "dependencies": { - "@csstools/selector-specificity": "^3.0.3", + "@csstools/selector-specificity": "^3.1.1", "postcss-selector-parser": "^6.0.13" }, "engines": { @@ -2614,9 +2622,9 @@ } }, "node_modules/@csstools/postcss-light-dark-function": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-1.0.3.tgz", - "integrity": "sha512-izW8hvhOqJlarLcGXO5PSylW9pQS3fytmhRdx2/e1oZFi15vs7ZShOHcREHJ3FfGdYqDA10cP9uhH0A3hmm1Rw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-1.0.5.tgz", + "integrity": "sha512-kKM9dtEaVmSTb3scL2pgef62KyWv6SK19JiAnCCuiDhlRE6PADKzaPPBXmP3qj4IEgIH+cQhdEosB0eroU6Fnw==", "dev": true, "funding": [ { @@ -2629,8 +2637,8 @@ } ], "dependencies": { - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", "@csstools/postcss-progressive-custom-properties": "^3.2.0", "@csstools/utilities": "^1.0.0" }, @@ -2733,9 +2741,9 @@ } }, "node_modules/@csstools/postcss-logical-viewport-units": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-2.0.7.tgz", - "integrity": "sha512-L4G3zsp/bnU0+WXUyysihCUH14LkfMgUJsS9vKz3vCYbVobOTqQRoNXnEPpyNp8WYyolLqAWbGGJhVu8J6u2OQ==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-2.0.9.tgz", + "integrity": "sha512-iBBJuExgHwedFH9AqNOHWzZFgYnt17zhu1qWjmSihu1P5pw0lIG9q5t3uIgJJFDNmYoOGfBKan66z9u1QH8yBQ==", "dev": true, "funding": [ { @@ -2748,7 +2756,7 @@ } ], "dependencies": { - "@csstools/css-tokenizer": "^2.2.4", + "@csstools/css-tokenizer": "^2.3.1", "@csstools/utilities": "^1.0.0" }, "engines": { @@ -2759,9 +2767,9 @@ } }, "node_modules/@csstools/postcss-media-minmax": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-1.1.4.tgz", - "integrity": "sha512-xl/PIO3TUbXO1ZA4SA6HCw+Q9UGe2cgeRKx3lHCzoNig2D4bT5vfVCOrwhxjUb09oHihc9eI3I0iIfVPiXaN1A==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-1.1.6.tgz", + "integrity": "sha512-bc0frf2Lod53j6wEHVsaVElfvCf6uhc96v99M/wUfer4MmNYfO3YLx1kFuB8xXvb0AXiWx4fohCJqemHV3bfRg==", "dev": true, "funding": [ { @@ -2774,10 +2782,10 @@ } ], "dependencies": { - "@csstools/css-calc": "^1.2.0", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", - "@csstools/media-query-list-parser": "^2.1.9" + "@csstools/css-calc": "^1.2.2", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", + "@csstools/media-query-list-parser": "^2.1.11" }, "engines": { "node": "^14 || ^16 || >=18" @@ -2787,9 +2795,9 @@ } }, "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-2.0.7.tgz", - "integrity": "sha512-HBDAQw1K0NilcHGMUHv8jzf2mpOtcWTVKtuY3AeZ5TS1uyWWNVi5/yuA/tREPLU9WifNdqHQ+rfbsV/8zTIkTg==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-2.0.9.tgz", + "integrity": "sha512-PR0s3tFSxPoKoPLoKuiZuYhwQC5bQxq/gFfywX2u/kh8rMzesARPZYKxE71I3jHWi6KDHGZl9Xb5xcFPwtvLiQ==", "dev": true, "funding": [ { @@ -2802,9 +2810,9 @@ } ], "dependencies": { - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", - "@csstools/media-query-list-parser": "^2.1.9" + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", + "@csstools/media-query-list-parser": "^2.1.11" }, "engines": { "node": "^14 || ^16 || >=18" @@ -2865,9 +2873,9 @@ } }, "node_modules/@csstools/postcss-oklab-function": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-3.0.14.tgz", - "integrity": "sha512-92xdpcfc2wB3z4+GftPA0PXMuGI/tRLw9Tc0+HzpaAHHxyLK6aCJtoQIcw0Ox/PthXtqXZn/3wWT/Idfe8I7Wg==", + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-3.0.16.tgz", + "integrity": "sha512-zm8nND+EraZrmbO4mgcT8FrJrAQUfWNfMmbV5uTCpWtAcO5ycX3E3bO8T1TjczKYRxC5QMM/91n9YExYCF4Mvw==", "dev": true, "funding": [ { @@ -2880,9 +2888,9 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^2.0.0", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", + "@csstools/css-color-parser": "^2.0.2", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", "@csstools/postcss-progressive-custom-properties": "^3.2.0", "@csstools/utilities": "^1.0.0" }, @@ -2919,9 +2927,9 @@ } }, "node_modules/@csstools/postcss-relative-color-syntax": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-2.0.14.tgz", - "integrity": "sha512-NlxgLjAjVCTUVGiWk8WNj3dKvux9eC6O5aLM3BmdA8UXEwBHYI9r4IqlanxG9PlcXnzhTUX6eZsqgmxwt4FPow==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-2.0.16.tgz", + "integrity": "sha512-TSM8fVqJkT8JZDranZPnkpxjU/Q1sNR192lXMND+EcKOUjYa6uYpGSfHgjnWjCRiBSciettS+sL7y9wmnas7qQ==", "dev": true, "funding": [ { @@ -2934,9 +2942,9 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^2.0.0", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", + "@csstools/css-color-parser": "^2.0.2", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", "@csstools/postcss-progressive-custom-properties": "^3.2.0", "@csstools/utilities": "^1.0.0" }, @@ -2973,9 +2981,9 @@ } }, "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-3.0.6.tgz", - "integrity": "sha512-rnyp8tWRuBXERTHVdB5hjUlif5dQgPcyN+BX55wUnYpZ3LN9QPfK2Z3/HUZymwyou8Gg6vhd6X2W+g1pLq1jYg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-3.0.8.tgz", + "integrity": "sha512-X76+thsvsmH/SkqVbN+vjeFKe1ABGLRx8/Wl68QTb/zvJWdzgx5S/nbszZP5O3nTRc5eI8NxIOrQUiy30fR+0g==", "dev": true, "funding": [ { @@ -2988,9 +2996,9 @@ } ], "dependencies": { - "@csstools/css-calc": "^1.2.0", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4" + "@csstools/css-calc": "^1.2.2", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1" }, "engines": { "node": "^14 || ^16 || >=18" @@ -3026,9 +3034,9 @@ } }, "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-3.0.6.tgz", - "integrity": "sha512-i5Zd0bMJooZAn+ZcDmPij2WCkcOJJJ6opzK+QeDjxbMrYmoGQl0CY8FDHdeQyBF1Nly+Q0Fq3S7QfdNLKBBaCg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-3.0.8.tgz", + "integrity": "sha512-zEzyGriPqoIYFgHJqWNy8bmoxjM4+ONyTap1ZzQK/Lll/VsCYvx0IckB33W/u89uLSVeeB8xC7uTrkoQ7ogKyQ==", "dev": true, "funding": [ { @@ -3041,9 +3049,9 @@ } ], "dependencies": { - "@csstools/css-calc": "^1.2.0", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4" + "@csstools/css-calc": "^1.2.2", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1" }, "engines": { "node": "^14 || ^16 || >=18" @@ -3097,9 +3105,9 @@ } }, "node_modules/@csstools/selector-specificity": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.3.tgz", - "integrity": "sha512-KEPNw4+WW5AVEIyzC80rTbWEUatTW2lXpN8+8ILC8PiPeWPjwUzrPZDIOZ2wwqDmeqOYTdSGyL3+vE5GC3FB3Q==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.1.1.tgz", + "integrity": "sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==", "dev": true, "funding": [ { @@ -3554,9 +3562,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz", + "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -3662,12 +3670,15 @@ "dev": true }, "node_modules/@gouvfr/dsfr": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@gouvfr/dsfr/-/dsfr-1.10.2.tgz", - "integrity": "sha512-twPj+VFMTOKUfI9vbBnK8fH1iDpXuDVWeMJzgmmQ5LKjRtZdUsvSbHNlp7HWcDvhWxDGNHxSboErC7UB3oskYQ==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@gouvfr/dsfr/-/dsfr-1.12.0.tgz", + "integrity": "sha512-/HDTLC8TV0MfZDreRS35xSD4Gzi9g3HjuaJD+zuzvvBiikSy+t2f36iUaE1Y9ojdBdmjz4/jYmA35w4+B6DMjQ==", "dev": true, "engines": { "node": ">=18.16.1" + }, + "peerDependencies": { + "browser-sync": "^2.27.10" } }, "node_modules/@graphql-tools/graphql-file-loader": { @@ -3763,9 +3774,9 @@ } }, "node_modules/@graphql-tools/merge": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.3.tgz", - "integrity": "sha512-FeKv9lKLMwqDu0pQjPpF59GY3HReUkWXKsMIuMuJQOKh9BETu7zPEFUELvcw8w+lwZkl4ileJsHXC9+AnsT2Lw==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.4.tgz", + "integrity": "sha512-MivbDLUQ+4Q8G/Hp/9V72hbn810IJDEZQ57F01sHnlrrijyadibfVhaQfW/pNH+9T/l8ySZpaR/DpL5i+ruZ+g==", "dependencies": { "@graphql-tools/utils": "^10.0.13", "tslib": "^2.4.0" @@ -3778,12 +3789,12 @@ } }, "node_modules/@graphql-tools/schema": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.3.tgz", - "integrity": "sha512-p28Oh9EcOna6i0yLaCFOnkcBDQECVf3SCexT6ktb86QNj9idnkhI+tCxnwZDh58Qvjd2nURdkbevvoZkvxzCog==", + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.4.tgz", + "integrity": "sha512-HuIwqbKxPaJujox25Ra4qwz0uQzlpsaBOzO6CVfzB/MemZdd+Gib8AIvfhQArK0YIN40aDran/yi+E5Xf0mQww==", "dependencies": { "@graphql-tools/merge": "^9.0.3", - "@graphql-tools/utils": "^10.0.13", + "@graphql-tools/utils": "^10.2.1", "tslib": "^2.4.0", "value-or-promise": "^1.0.12" }, @@ -3795,9 +3806,9 @@ } }, "node_modules/@graphql-tools/utils": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.2.0.tgz", - "integrity": "sha512-HYV7dO6pNA2nGKawygaBpk8y+vXOUjjzzO43W/Kb7EPRmXUEQKjHxPYRvQbiF72u1N3XxwGK5jnnFk9WVhUwYw==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.2.2.tgz", + "integrity": "sha512-ueoplzHIgFfxhFrF4Mf/niU/tYHuO6Uekm2nCYU72qpI+7Hn9dA2/o5XOBvFXDk27Lp5VSvQY5WfmRbqwVxaYQ==", "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "cross-inspect": "1.0.0", @@ -3823,6 +3834,7 @@ "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", @@ -3872,6 +3884,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true }, "node_modules/@isaacs/cliui": { @@ -4086,17 +4099,19 @@ } }, "node_modules/@maplibre/maplibre-gl-style-spec": { - "version": "20.1.1", - "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-20.1.1.tgz", - "integrity": "sha512-z85ARNPCBI2Cs5cPOS3DSbraTN+ue8zrcYVoSWBuNrD/mA+2SKAJ+hIzI22uN7gac6jBMnCdpPKRxS/V0KSZVQ==", + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-20.3.0.tgz", + "integrity": "sha512-eSiQ3E5LUSxAOY9ABXGyfNhout2iEa6mUxKeaQ9nJ8NL1NuaQYU7zKqzx/LEYcXe1neT4uYAgM1wYZj3fTSXtA==", "dev": true, "dependencies": { "@mapbox/jsonlint-lines-primitives": "~2.0.2", "@mapbox/unitbezier": "^0.0.1", "json-stringify-pretty-compact": "^4.0.0", "minimist": "^1.2.8", + "quickselect": "^2.0.0", "rw": "^1.3.3", - "sort-object": "^3.0.3" + "sort-object": "^3.0.3", + "tinyqueue": "^2.0.3" }, "bin": { "gl-style-format": "dist/gl-style-format.mjs", @@ -4259,18 +4274,18 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.1.0.tgz", - "integrity": "sha512-pGUdSP+eEPfZiQHNkZI0U01HLipxncisdJQB4G//OAmfeO8sqTQ9KRa0KF03TUPCziNsoXUrTg4B2Q1EX++T0Q==", + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", + "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==", "dev": true }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.2.0.tgz", - "integrity": "sha512-Nd3hCJbr5GUwTgV6j2dMONIigoqNwJRm+yvA5BYb1dnGBTmVUrGYGNwYsGl2hN+xtDAYpqxDiz8vysh/NqEN+A==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.0.tgz", + "integrity": "sha512-n4znWfRinnUQF6TPyxs7EctSAA3yVSP4qlJP2YgI3g9d4Ae2n5F3XDOjbUluKRxPU3rfsgpOboI4O4VtPc6Ilg==", "dev": true, "dependencies": { - "@octokit/types": "^13.4.1" + "@octokit/types": "^13.5.0" }, "engines": { "node": ">= 18" @@ -4297,9 +4312,9 @@ } }, "node_modules/@octokit/plugin-throttling": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-9.2.1.tgz", - "integrity": "sha512-n6EK4/1Npva54sAFDdpUxAbO14FbzudJ/k7DZPjQuLYOvNTWj4DGeH//J9ZCVoLkAlvRWV5sWKLaICsmGvqg2g==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-9.3.0.tgz", + "integrity": "sha512-B5YTToSRTzNSeEyssnrT7WwGhpIdbpV9NKIs3KyTWHX6PhpYn7gqF/+lL3BvsASBM3Sg5BAUYk7KZx5p/Ec77w==", "dev": true, "dependencies": { "@octokit/types": "^13.0.0", @@ -4340,12 +4355,12 @@ } }, "node_modules/@octokit/types": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.4.1.tgz", - "integrity": "sha512-Y73oOAzRBAUzR/iRAbGULzpNkX8vaxKCqEtg6K74Ff3w9f5apFnWtE/2nade7dMWWW3bS5Kkd6DJS4HF04xreg==", + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz", + "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==", "dev": true, "dependencies": { - "@octokit/openapi-types": "^22.1.0" + "@octokit/openapi-types": "^22.2.0" } }, "node_modules/@one-ini/wasm": { @@ -4571,9 +4586,9 @@ } }, "node_modules/@redis/client": { - "version": "1.5.14", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.14.tgz", - "integrity": "sha512-YGn0GqsRBFUQxklhY7v562VMOP0DcmlrHHs3IV1mFE3cbxe31IITUkqhBcIhVSI/2JqtWAJXg5mjV4aU+zD0HA==", + "version": "1.5.16", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.16.tgz", + "integrity": "sha512-X1a3xQ5kEMvTib5fBrHKh6Y+pXbeKXqziYuxOUo1ojQNECg4M5Etd1qqyhMap+lFUOAh8S7UYevgJHOm4A+NOg==", "optional": true, "dependencies": { "cluster-key-slot": "1.1.2", @@ -4654,9 +4669,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.1.tgz", - "integrity": "sha512-P6Wg856Ou/DLpR+O0ZLneNmrv7QpqBg+hK4wE05ijbC/t349BRfMfx+UFj5Ha3fCFopIa6iSZlpdaB4agkWp2Q==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", + "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", "cpu": [ "arm" ], @@ -4667,9 +4682,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.1.tgz", - "integrity": "sha512-piwZDjuW2WiHr05djVdUkrG5JbjnGbtx8BXQchYCMfib/nhjzWoiScelZ+s5IJI7lecrwSxHCzW026MWBL+oJQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", + "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", "cpu": [ "arm64" ], @@ -4680,9 +4695,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.1.tgz", - "integrity": "sha512-LsZXXIsN5Q460cKDT4Y+bzoPDhBmO5DTr7wP80d+2EnYlxSgkwdPfE3hbE+Fk8dtya+8092N9srjBTJ0di8RIA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", + "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", "cpu": [ "arm64" ], @@ -4693,9 +4708,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.1.tgz", - "integrity": "sha512-S7TYNQpWXB9APkxu/SLmYHezWwCoZRA9QLgrDeml+SR2A1LLPD2DBUdUlvmCF7FUpRMKvbeeWky+iizQj65Etw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", + "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", "cpu": [ "x64" ], @@ -4706,9 +4721,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.1.tgz", - "integrity": "sha512-Lq2JR5a5jsA5um2ZoLiXXEaOagnVyCpCW7xvlcqHC7y46tLwTEgUSTM3a2TfmmTMmdqv+jknUioWXlmxYxE9Yw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", + "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", "cpu": [ "arm" ], @@ -4719,9 +4734,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.1.tgz", - "integrity": "sha512-9BfzwyPNV0IizQoR+5HTNBGkh1KXE8BqU0DBkqMngmyFW7BfuIZyMjQ0s6igJEiPSBvT3ZcnIFohZ19OqjhDPg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", + "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", "cpu": [ "arm" ], @@ -4732,9 +4747,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.1.tgz", - "integrity": "sha512-e2uWaoxo/rtzA52OifrTSXTvJhAXb0XeRkz4CdHBK2KtxrFmuU/uNd544Ogkpu938BzEfvmWs8NZ8Axhw33FDw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", + "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", "cpu": [ "arm64" ], @@ -4745,9 +4760,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.1.tgz", - "integrity": "sha512-ekggix/Bc/d/60H1Mi4YeYb/7dbal1kEDZ6sIFVAE8pUSx7PiWeEh+NWbL7bGu0X68BBIkgF3ibRJe1oFTksQQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", + "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", "cpu": [ "arm64" ], @@ -4758,9 +4773,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.1.tgz", - "integrity": "sha512-UGV0dUo/xCv4pkr/C8KY7XLFwBNnvladt8q+VmdKrw/3RUd3rD0TptwjisvE2TTnnlENtuY4/PZuoOYRiGp8Gw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", + "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", "cpu": [ "ppc64" ], @@ -4771,9 +4786,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.1.tgz", - "integrity": "sha512-gEYmYYHaehdvX46mwXrU49vD6Euf1Bxhq9pPb82cbUU9UT2NV+RSckQ5tKWOnNXZixKsy8/cPGtiUWqzPuAcXQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", + "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", "cpu": [ "riscv64" ], @@ -4784,9 +4799,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.1.tgz", - "integrity": "sha512-xeae5pMAxHFp6yX5vajInG2toST5lsCTrckSRUFwNgzYqnUjNBcQyqk1bXUxX5yhjWFl2Mnz3F8vQjl+2FRIcw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", + "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", "cpu": [ "s390x" ], @@ -4797,9 +4812,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.1.tgz", - "integrity": "sha512-AsdnINQoDWfKpBzCPqQWxSPdAWzSgnYbrJYtn6W0H2E9It5bZss99PiLA8CgmDRfvKygt20UpZ3xkhFlIfX9zQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", + "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", "cpu": [ "x64" ], @@ -4810,9 +4825,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.1.tgz", - "integrity": "sha512-KoB4fyKXTR+wYENkIG3fFF+5G6N4GFvzYx8Jax8BR4vmddtuqSb5oQmYu2Uu067vT/Fod7gxeQYKupm8gAcMSQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", + "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", "cpu": [ "x64" ], @@ -4823,9 +4838,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.1.tgz", - "integrity": "sha512-J0d3NVNf7wBL9t4blCNat+d0PYqAx8wOoY+/9Q5cujnafbX7BmtYk3XvzkqLmFECaWvXGLuHmKj/wrILUinmQg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", + "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", "cpu": [ "arm64" ], @@ -4836,9 +4851,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.1.tgz", - "integrity": "sha512-xjgkWUwlq7IbgJSIxvl516FJ2iuC/7ttjsAxSPpC9kkI5iQQFHKyEN5BjbhvJ/IXIZ3yIBcW5QDlWAyrA+TFag==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", + "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", "cpu": [ "ia32" ], @@ -4849,9 +4864,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.1.tgz", - "integrity": "sha512-0QbCkfk6cnnVKWqqlC0cUrrUMDMfu5ffvYMTUHf+qMN2uAb3MKP31LPcwiMXBNsvoFGs/kYdFOsuLmvppCopXA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", + "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", "cpu": [ "x64" ], @@ -4861,6 +4876,12 @@ "win32" ] }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "dev": true + }, "node_modules/@selderee/plugin-htmlparser2": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz", @@ -4904,9 +4925,9 @@ } }, "node_modules/@semantic-release/github": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-10.0.3.tgz", - "integrity": "sha512-nSJQboKrG4xBn7hHpRMrK8lt5DgqJg50ZMz9UbrsfTxuRk55XVoQEadbGZ2L9M0xZAC6hkuwkDhQJKqfPU35Fw==", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-10.0.6.tgz", + "integrity": "sha512-sS4psqZacGTFEN49UQGqwFNG6Jyx2/RX1BhhDGn/2WoPbhAHislohOY05/5r+JoL4gJMWycfH7tEm1eGVutYeg==", "dev": true, "dependencies": { "@octokit/core": "^6.0.0", @@ -4934,14 +4955,14 @@ } }, "node_modules/@semantic-release/npm": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-12.0.0.tgz", - "integrity": "sha512-72TVYQCH9NvVsO/y13eF8vE4bNnfls518+4KcFwJUKi7AtA/ZXoNgSg9gTTfw5eMZMkiH0izUrpGXgZE/cSQhA==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-12.0.1.tgz", + "integrity": "sha512-/6nntGSUGK2aTOI0rHPwY3ZjgY9FkXmEHbW9Kr+62NVOsyqpKKeP0lrCH+tphv+EsNdJNmqqwijTEnVWUMQ2Nw==", "dev": true, "dependencies": { "@semantic-release/error": "^4.0.0", "aggregate-error": "^5.0.0", - "execa": "^8.0.0", + "execa": "^9.0.0", "fs-extra": "^11.0.0", "lodash-es": "^4.17.21", "nerf-dart": "^1.0.0", @@ -4960,6 +4981,93 @@ "semantic-release": ">=20.1.0" } }, + "node_modules/@semantic-release/npm/node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/execa": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.2.0.tgz", + "integrity": "sha512-vpOyYg7UAVKLAWWtRS2gAdgkT7oJbCn0me3gmUmxZih4kd3MF/oo8kNTBTIbkO3yuuF5uB4ZCZfn8BOolITYhg==", + "dev": true, + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.3", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^7.0.0", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^5.2.0", + "pretty-ms": "^9.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@semantic-release/npm/node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/human-signals": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-7.0.0.tgz", + "integrity": "sha512-74kytxOUSvNbjrT9KisAbaTZ/eJwD/LrbM/kh5j0IhPuJzwuA19dWvniFGwBzN9rVjg+O/e+F310PjObDXS+9Q==", + "dev": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@semantic-release/npm/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@semantic-release/release-notes-generator": { "version": "13.0.0", "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-13.0.0.tgz", @@ -4997,38 +5105,38 @@ } }, "node_modules/@sentry-internal/tracing": { - "version": "7.112.2", - "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.112.2.tgz", - "integrity": "sha512-fT1Y46J4lfXZkgFkb03YMNeIEs2xS6jdKMoukMFQfRfVvL9fSWEbTgZpHPd/YTT8r2i082XzjtAoQNgklm/0Hw==", + "version": "7.117.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.117.0.tgz", + "integrity": "sha512-fAIyijNvKBZNA12IcKo+dOYDRTNrzNsdzbm3DP37vJRKVQu19ucqP4Y6InvKokffDP2HZPzFPDoGXYuXkDhUZg==", "dependencies": { - "@sentry/core": "7.112.2", - "@sentry/types": "7.112.2", - "@sentry/utils": "7.112.2" + "@sentry/core": "7.117.0", + "@sentry/types": "7.117.0", + "@sentry/utils": "7.117.0" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/core": { - "version": "7.112.2", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.112.2.tgz", - "integrity": "sha512-gHPCcJobbMkk0VR18J65WYQTt3ED4qC6X9lHKp27Ddt63E+MDGkG6lvYBU1LS8cV7CdyBGC1XXDCfor61GvLsA==", + "version": "7.117.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.117.0.tgz", + "integrity": "sha512-1XZ4/d/DEwnfM2zBMloXDwX+W7s76lGKQMgd8bwgPJZjjEztMJ7X0uopKAGwlQcjn242q+hsCBR6C+fSuI5kvg==", "dependencies": { - "@sentry/types": "7.112.2", - "@sentry/utils": "7.112.2" + "@sentry/types": "7.117.0", + "@sentry/utils": "7.117.0" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/integrations": { - "version": "7.112.2", - "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.112.2.tgz", - "integrity": "sha512-ioC2yyU6DqtLkdmWnm87oNvdn2+9oKctJeA4t+jkS6JaJ10DcezjCwiLscX4rhB9aWJV3IWF7Op0O6K3w0t2Hg==", + "version": "7.117.0", + "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.117.0.tgz", + "integrity": "sha512-U3suSZysmU9EiQqg0ga5CxveAyNbi9IVdsapMDq5EQGNcVDvheXtULs+BOc11WYP3Kw2yWB38VDqLepfc/Fg2g==", "dependencies": { - "@sentry/core": "7.112.2", - "@sentry/types": "7.112.2", - "@sentry/utils": "7.112.2", + "@sentry/core": "7.117.0", + "@sentry/types": "7.117.0", + "@sentry/utils": "7.117.0", "localforage": "^1.8.1" }, "engines": { @@ -5036,34 +5144,34 @@ } }, "node_modules/@sentry/node": { - "version": "7.112.2", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.112.2.tgz", - "integrity": "sha512-MNzkqER8jc2xOS3ArkCLH5hakzu15tcjeC7qjU7rQ1Ms4WuV+MG0docSRESux0/p23Qjzf9tZOc8C5Eq+Sxduw==", + "version": "7.117.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.117.0.tgz", + "integrity": "sha512-0MWXdT8dv1MtQGF0aeB8LQTBTJS1L1Vz24+wvdXroR3/52mPYrPWlzuc7+Ew/Dlqdlb5LKVIlkuDSRWj8UKpTQ==", "dependencies": { - "@sentry-internal/tracing": "7.112.2", - "@sentry/core": "7.112.2", - "@sentry/integrations": "7.112.2", - "@sentry/types": "7.112.2", - "@sentry/utils": "7.112.2" + "@sentry-internal/tracing": "7.117.0", + "@sentry/core": "7.117.0", + "@sentry/integrations": "7.117.0", + "@sentry/types": "7.117.0", + "@sentry/utils": "7.117.0" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/types": { - "version": "7.112.2", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.112.2.tgz", - "integrity": "sha512-kCMLt7yhY5OkWE9MeowlTNmox9pqDxcpvqguMo4BDNZM5+v9SEb1AauAdR78E1a1V8TyCzjBD7JDfXWhvpYBcQ==", + "version": "7.117.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.117.0.tgz", + "integrity": "sha512-5dtdulcUttc3F0Te7ekZmpSp/ebt/CA71ELx0uyqVGjWsSAINwskFD77sdcjqvZWek//WjiYX1+GRKlpJ1QqsA==", "engines": { "node": ">=8" } }, "node_modules/@sentry/utils": { - "version": "7.112.2", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.112.2.tgz", - "integrity": "sha512-OjLh0hx0t1EcL4ZIjf+4svlmmP+tHUDGcr5qpFWH78tjmkPW4+cqPuZCZfHSuWcDdeiaXi8TnYoVRqDcJKK/eQ==", + "version": "7.117.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.117.0.tgz", + "integrity": "sha512-KkcLY8643SGBiDyPvMQOubBkwVX5IPknMHInc7jYC8pDVncGp7C65Wi506bCNPpKCWspUd/0VDNWOOen51/qKA==", "dependencies": { - "@sentry/types": "7.112.2" + "@sentry/types": "7.117.0" }, "engines": { "node": ">=8" @@ -5099,6 +5207,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "dev": true, + "peer": true + }, "node_modules/@storybook/addon-actions": { "version": "8.0.9", "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.0.9.tgz", @@ -6304,9 +6419,9 @@ } }, "node_modules/@storybook/core-server/node_modules/@types/node": { - "version": "18.19.31", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.31.tgz", - "integrity": "sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==", + "version": "18.19.36", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.36.tgz", + "integrity": "sha512-tX1BNmYSWEvViftB26VLNxT6mEr37M7+ldUtq7rlKnv4/2fKYsJIOmqJAjT6h1DNuwQjIKgw3VJ/Dtw3yiTIQw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -6538,9 +6653,9 @@ } }, "node_modules/@storybook/csf": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.5.tgz", - "integrity": "sha512-pW7Dtk/bE2JGrAe/KuBY4Io02NBe/2CLP2DkgVgWlSwvEVdm/rbQyiwy8RaL0lQlJCv9CsGBY+n9HQG8d4bZjQ==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.8.tgz", + "integrity": "sha512-Ntab9o7LjBCbFIao5l42itFiaSh/Qu+l16l/r/9qmV9LnYZkO+JQ7tzhdlwpgJfhs+B5xeejpdAtftDRyXNajw==", "dev": true, "dependencies": { "type-fest": "^2.19.0" @@ -6956,6 +7071,7 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/@storybook/testing-library/-/testing-library-0.2.2.tgz", "integrity": "sha512-L8sXFJUHmrlyU2BsWWZGuAjv39Jl1uAqUHdxmN42JY15M4+XCMjGlArdCCjDe1wpTSW6USYISA9axjZojgtvnw==", + "deprecated": "In Storybook 8, this package functionality has been integrated to a new package called @storybook/test, which uses Vitest APIs for an improved experience. When upgrading to Storybook 8 with 'npx storybook@latest upgrade', you will get prompted and will get an automigration for the new package. Please migrate when you can.", "dev": true, "dependencies": { "@testing-library/dom": "^9.0.0", @@ -7153,9 +7269,9 @@ } }, "node_modules/@testing-library/vue": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@testing-library/vue/-/vue-8.0.3.tgz", - "integrity": "sha512-wSsbNlZ69ZFQgVlHMtc/ZC/g9BHO7MhyDrd4nHyfEubtMr3kToN/w4/BsSBknGIF8w9UmPbsgbIuq/CbdBHzCA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@testing-library/vue/-/vue-8.1.0.tgz", + "integrity": "sha512-ls4RiHO1ta4mxqqajWRh8158uFObVrrtAPoxk7cIp4HrnQUj/ScKzqz53HxYpG3X6Zb7H2v+0eTGLSoy8HQ2nA==", "dev": true, "dependencies": { "@babel/runtime": "^7.23.2", @@ -7176,9 +7292,9 @@ } }, "node_modules/@transloadit/prettier-bytes": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.3.2.tgz", - "integrity": "sha512-YMRk9+RKgbRcAsgrDgJmcJ7H+R3OfecsyMx56YeRdTeJLXkxapeZmK5NG1Ehvu570SGZo0K63ZeBUS2Z5/8ZzA==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.3.4.tgz", + "integrity": "sha512-8/SnIF9Q2k52mbjRVAYLranwkaDTLb+O9r4Z/uo8uNw//SjygKvvbF4BHSOuReufaAyum1q13602VcNud25Dfg==", "dev": true }, "node_modules/@tsconfig/node10": { @@ -7202,11 +7318,11 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" }, "node_modules/@tus/file-store": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@tus/file-store/-/file-store-1.3.2.tgz", - "integrity": "sha512-PFogHwWCg5RtrzTk3SNs5s1wAszluCKD/AeW4zDQybuZSxrs7lzQS593DumJBsFXYZ1q0IVsJJOb7WyZhbBVCQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@tus/file-store/-/file-store-1.3.3.tgz", + "integrity": "sha512-IxgWdnIz64ua4x86pGHHRpTm6JEJCNdMiqwvc8uhdAxyKrfGEdwE2dYfhN/BfqGlu2FtOZqlH3iBSSgUQJM+ng==", "dependencies": { - "@tus/utils": "^0.1.0", + "@tus/utils": "^0.2.0", "debug": "^4.3.4" }, "engines": { @@ -7217,12 +7333,13 @@ } }, "node_modules/@tus/server": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@tus/server/-/server-1.5.0.tgz", - "integrity": "sha512-TIE6zKxf+Vg6dFppI3RzcKfvtsScx12LKweYNIzSZJSyq8ylbWRIfML9+aQU/xd64CLjwS2s9EabTBZNyafd4Q==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@tus/server/-/server-1.6.0.tgz", + "integrity": "sha512-bjZMmlyrXJ0ZxQ7eFGHToAvw2QIxTUucpgdMD+fdfMmxg30dIXXmQybis5ErVf+Qx7JtkBmRyQb3zE2hLvwfGw==", "dependencies": { - "@tus/utils": "^0.1.0", - "debug": "^4.3.4" + "@tus/utils": "^0.2.0", + "debug": "^4.3.4", + "lodash.throttle": "^4.1.1" }, "engines": { "node": ">=16" @@ -7232,9 +7349,9 @@ } }, "node_modules/@tus/utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@tus/utils/-/utils-0.1.0.tgz", - "integrity": "sha512-RXSeAKPfBJk3G0yyyDAqKPJUb1JsHNvwxNWSjZmvxRlSwtPmOlSkSrXRRReAqHzSlxAlNOGzDWqYiCBkLjOu0g==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@tus/utils/-/utils-0.2.0.tgz", + "integrity": "sha512-wTZS5PL+wfa6AisJoTtpt9r/GNNWq/rXkcXchAcV5z5GNUXGzgcAl/+u0d9uPkmmOHiJfGcM3MJGGnmsD2a5Kg==", "engines": { "node": ">=16" } @@ -7278,9 +7395,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" @@ -7333,6 +7450,13 @@ "@types/node": "*" } }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true, + "peer": true + }, "node_modules/@types/cookie-parser": { "version": "1.4.7", "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.7.tgz", @@ -7389,9 +7513,9 @@ "dev": true }, "node_modules/@types/emscripten": { - "version": "1.39.10", - "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.10.tgz", - "integrity": "sha512-TB/6hBkYQJxsZHSqyeuO1Jt0AB/bW6G7rHt9g7lML7SOF6lbgcHvw/Lr+69iqN0qxgXLhWKScAon73JNnptuDw==", + "version": "1.39.13", + "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.13.tgz", + "integrity": "sha512-cFq+fO/isvhvmuP/+Sl4K4jtU6E23DoivtbO4r50e3odaxAiVdbfSYRDdJ4gCdxx+3aRjhphS5ZMwIH4hFy/Cw==", "dev": true }, "node_modules/@types/eslint": { @@ -7434,9 +7558,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz", - "integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==", + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.3.tgz", + "integrity": "sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -7514,6 +7638,12 @@ "@types/node": "*" } }, + "node_modules/@types/junit-report-builder": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/junit-report-builder/-/junit-report-builder-3.0.2.tgz", + "integrity": "sha512-R5M+SYhMbwBeQcNXYWNCZkl09vkVfAtcPIaCGdzIkkbeaTrVbGQ7HVgi4s+EmM/M1K4ZuWQH0jGcvMvNePfxYA==", + "dev": true + }, "node_modules/@types/leaflet": { "version": "1.9.12", "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.12.tgz", @@ -7533,9 +7663,9 @@ } }, "node_modules/@types/lodash": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz", - "integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==", + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-MBIOHVZqVqgfro1euRDWX7OO0fBVUUMrN6Pwm8LQsz8cWhEpihlvR70ENj3f40j58TNxZaWv2ndSkInykNBBJw==", "dev": true }, "node_modules/@types/mapbox__point-geometry": { @@ -7567,9 +7697,9 @@ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" }, "node_modules/@types/node": { - "version": "20.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "version": "20.14.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.5.tgz", + "integrity": "sha512-aoRR+fJkZT2l0aGOJhuA8frnCSoNX6W7U2mpNq63+BxBIj5BQFt8rHy627kijCmm63ijdSdwvGgpUsU6MBsZZA==", "dependencies": { "undici-types": "~5.26.4" } @@ -7587,9 +7717,9 @@ "dev": true }, "node_modules/@types/pg": { - "version": "8.11.5", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.5.tgz", - "integrity": "sha512-2xMjVviMxneZHDHX5p5S6tsRRs7TpDHeeK7kTTMe/kAC/mRRNjWHjZg0rkiY+e17jXSZV3zJYDxXV8Cy72/Vuw==", + "version": "8.11.6", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.6.tgz", + "integrity": "sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==", "dependencies": { "@types/node": "*", "pg-protocol": "*", @@ -7710,9 +7840,9 @@ } }, "node_modules/@types/superagent": { - "version": "8.1.6", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.6.tgz", - "integrity": "sha512-yzBOv+6meEHSzV2NThYYOA6RtqvPr3Hbob9ZLp3i07SH27CrYVfm8CrF7ydTmidtelsFiKx2I4gZAiAOamGgvQ==", + "version": "8.1.7", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.7.tgz", + "integrity": "sha512-NmIsd0Yj4DDhftfWvvAku482PZum4DBW7U51OvS8gvOkDDY0WT1jsVyDV3hK+vplrsYw8oDwi9QxOM7U68iwww==", "dev": true, "dependencies": { "@types/cookiejar": "^2.1.5", @@ -7746,21 +7876,19 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.1.tgz", - "integrity": "sha512-KwfdWXJBOviaBVhxO3p5TJiLpNuh2iyXyjmWN0f1nU87pwyvfS0EmjC6ukQVYVFJd/K1+0NWGPDXiyEyQorn0Q==", + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.13.1.tgz", + "integrity": "sha512-kZqi+WZQaZfPKnsflLJQCz6Ze9FFSMfXrrIOcyargekQxG37ES7DJNpJUE9Q/X5n3yTIP/WPutVNzgknQ7biLg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.7.1", - "@typescript-eslint/type-utils": "7.7.1", - "@typescript-eslint/utils": "7.7.1", - "@typescript-eslint/visitor-keys": "7.7.1", - "debug": "^4.3.4", + "@typescript-eslint/scope-manager": "7.13.1", + "@typescript-eslint/type-utils": "7.13.1", + "@typescript-eslint/utils": "7.13.1", + "@typescript-eslint/visitor-keys": "7.13.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "semver": "^7.6.0", "ts-api-utils": "^1.3.0" }, "engines": { @@ -7781,15 +7909,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.7.1.tgz", - "integrity": "sha512-vmPzBOOtz48F6JAGVS/kZYk4EkXao6iGrD838sp1w3NQQC0W8ry/q641KU4PrG7AKNAf56NOcR8GOpH8l9FPCw==", + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.13.1.tgz", + "integrity": "sha512-1ELDPlnLvDQ5ybTSrMhRTFDfOQEOXNM+eP+3HT/Yq7ruWpciQw+Avi73pdEbA4SooCawEWo3dtYbF68gN7Ed1A==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.7.1", - "@typescript-eslint/types": "7.7.1", - "@typescript-eslint/typescript-estree": "7.7.1", - "@typescript-eslint/visitor-keys": "7.7.1", + "@typescript-eslint/scope-manager": "7.13.1", + "@typescript-eslint/types": "7.13.1", + "@typescript-eslint/typescript-estree": "7.13.1", + "@typescript-eslint/visitor-keys": "7.13.1", "debug": "^4.3.4" }, "engines": { @@ -7809,13 +7937,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.7.1.tgz", - "integrity": "sha512-PytBif2SF+9SpEUKynYn5g1RHFddJUcyynGpztX3l/ik7KmZEv19WCMhUBkHXPU9es/VWGD3/zg3wg90+Dh2rA==", + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.13.1.tgz", + "integrity": "sha512-adbXNVEs6GmbzaCpymHQ0MB6E4TqoiVbC0iqG3uijR8ZYfpAXMGttouQzF4Oat3P2GxDVIrg7bMI/P65LiQZdg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.7.1", - "@typescript-eslint/visitor-keys": "7.7.1" + "@typescript-eslint/types": "7.13.1", + "@typescript-eslint/visitor-keys": "7.13.1" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -7826,13 +7954,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.7.1.tgz", - "integrity": "sha512-ZksJLW3WF7o75zaBPScdW1Gbkwhd/lyeXGf1kQCxJaOeITscoSl0MjynVvCzuV5boUz/3fOI06Lz8La55mu29Q==", + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.13.1.tgz", + "integrity": "sha512-aWDbLu1s9bmgPGXSzNCxELu+0+HQOapV/y+60gPXafR8e2g1Bifxzevaa+4L2ytCWm+CHqpELq4CSoN9ELiwCg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.7.1", - "@typescript-eslint/utils": "7.7.1", + "@typescript-eslint/typescript-estree": "7.13.1", + "@typescript-eslint/utils": "7.13.1", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -7853,9 +7981,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.1.tgz", - "integrity": "sha512-AmPmnGW1ZLTpWa+/2omPrPfR7BcbUU4oha5VIbSbS1a1Tv966bklvLNXxp3mrbc+P2j4MNOTfDffNsk4o0c6/w==", + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.13.1.tgz", + "integrity": "sha512-7K7HMcSQIAND6RBL4kDl24sG/xKM13cA85dc7JnmQXw2cBDngg7c19B++JzvJHRG3zG36n9j1i451GBzRuHchw==", "dev": true, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -7866,13 +7994,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.1.tgz", - "integrity": "sha512-CXe0JHCXru8Fa36dteXqmH2YxngKJjkQLjxzoj6LYwzZ7qZvgsLSc+eqItCrqIop8Vl2UKoAi0StVWu97FQZIQ==", + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.13.1.tgz", + "integrity": "sha512-uxNr51CMV7npU1BxZzYjoVz9iyjckBduFBP0S5sLlh1tXYzHzgZ3BR9SVsNed+LmwKrmnqN3Kdl5t7eZ5TS1Yw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.7.1", - "@typescript-eslint/visitor-keys": "7.7.1", + "@typescript-eslint/types": "7.13.1", + "@typescript-eslint/visitor-keys": "7.13.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -7923,18 +8051,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.7.1.tgz", - "integrity": "sha512-QUvBxPEaBXf41ZBbaidKICgVL8Hin0p6prQDu6bbetWo39BKbWJxRsErOzMNT1rXvTll+J7ChrbmMCXM9rsvOQ==", + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.13.1.tgz", + "integrity": "sha512-h5MzFBD5a/Gh/fvNdp9pTfqJAbuQC4sCN2WzuXme71lqFJsZtLbjxfSk4r3p02WIArOF9N94pdsLiGutpDbrXQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.15", - "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.7.1", - "@typescript-eslint/types": "7.7.1", - "@typescript-eslint/typescript-estree": "7.7.1", - "semver": "^7.6.0" + "@typescript-eslint/scope-manager": "7.13.1", + "@typescript-eslint/types": "7.13.1", + "@typescript-eslint/typescript-estree": "7.13.1" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -7948,12 +8073,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.1.tgz", - "integrity": "sha512-gBL3Eq25uADw1LQ9kVpf3hRM+DWzs0uZknHYK3hq4jcTPqVCClHGDnB6UUUV2SFeBeA4KWHWbbLqmbGcZ4FYbw==", + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.13.1.tgz", + "integrity": "sha512-k/Bfne7lrP7hcb7m9zSsgcBmo+8eicqqfNAJ7uUY+jkTFpKeH2FSkWpFRtimBxgkyvqfu9jTPRbYOvud6isdXA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.7.1", + "@typescript-eslint/types": "7.13.1", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -7983,28 +8108,28 @@ "dev": true }, "node_modules/@uppy/companion-client": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@uppy/companion-client/-/companion-client-3.8.0.tgz", - "integrity": "sha512-CnIUAlmwz3qvT0LC9EMTiXH6hv9veGsYEZfXYsVb7b+hg21pOktkQrYB71Gf+rH9XdpZPcPBRrTx9ihZZnvAdg==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@uppy/companion-client/-/companion-client-3.8.1.tgz", + "integrity": "sha512-A1k9cOgGMsJNx1lI0Lj2ZaLAH3WIL3xImi2EPXuAHgL1uBZqjuffP2P9XK4nr+KVc+PBivOxH7MoiYpJm97/xw==", "dev": true, "dependencies": { - "@uppy/utils": "^5.7.5", + "@uppy/utils": "^5.9.0", "namespace-emitter": "^2.0.1", "p-retry": "^6.1.0" }, "peerDependencies": { - "@uppy/core": "^3.10.0" + "@uppy/core": "^3.11.0" } }, "node_modules/@uppy/core": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@uppy/core/-/core-3.10.1.tgz", - "integrity": "sha512-sxA5zzVZzUabX8APMBLrvT/zZA3QZMYdyfqLCfZntLSPqmGONoQwkFDIYqnhW5RZP4ZBY4CnC6W9e2XeudB9cw==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@uppy/core/-/core-3.13.0.tgz", + "integrity": "sha512-qyht4dJ72AGWriwyy14h0wesrizgMEAU8Y6U3GKZYj6vfPOeEN0VbrbrkqlLxsczB5uyuUbhrPkPRU7srGDvtg==", "dev": true, "dependencies": { - "@transloadit/prettier-bytes": "^0.3.0", + "@transloadit/prettier-bytes": "^0.3.4", "@uppy/store-default": "^3.2.2", - "@uppy/utils": "^5.7.5", + "@uppy/utils": "^5.9.0", "lodash": "^4.17.21", "mime-match": "^1.0.2", "namespace-emitter": "^2.0.1", @@ -8037,17 +8162,17 @@ "dev": true }, "node_modules/@uppy/tus": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@uppy/tus/-/tus-3.5.4.tgz", - "integrity": "sha512-Pv3JeUeuGsZi9WP8G6fX36G+NJdOpjv0UhVTtuFRATQAtEMtexpV3B6yKM7uZWHXa3la554wyfjZhtOmahXhAg==", + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/@uppy/tus/-/tus-3.5.5.tgz", + "integrity": "sha512-Dcvqc897tSWRe9oiJo2ZCiyebn0G3j8FMYa99GYeLV9AeL37V/7akMAPG5ama4mTQLBXHcpziLqosTrf07ZMYQ==", "dev": true, "dependencies": { - "@uppy/companion-client": "^3.8.0", - "@uppy/utils": "^5.7.5", + "@uppy/companion-client": "^3.8.1", + "@uppy/utils": "^5.9.0", "tus-js-client": "^3.1.3" }, "peerDependencies": { - "@uppy/core": "^3.10.0" + "@uppy/core": "^3.11.3" } }, "node_modules/@uppy/tus/node_modules/is-stream": { @@ -8078,9 +8203,9 @@ } }, "node_modules/@uppy/utils": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@uppy/utils/-/utils-5.8.0.tgz", - "integrity": "sha512-FB1Z4dTOsNo6yEc7dx8ACkjOVOZz2X4N1kPiBEhEKLTamCzz9kInax1vAl+XXBM8SG1XNQwz17EMm1UUY0NciQ==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@uppy/utils/-/utils-5.9.0.tgz", + "integrity": "sha512-9Ubddd3orCOLYjf0KobwgJ+aTrABSxk9t4X/QdM4qJHVZuMIftkaMplrViRUO+kvIBCXEZDIP2AmS060siDNGw==", "dev": true, "dependencies": { "lodash": "^4.17.21", @@ -8106,9 +8231,9 @@ } }, "node_modules/@vitest/coverage-v8": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.5.2.tgz", - "integrity": "sha512-QJqxRnbCwNtbbegK9E93rBmhN3dbfG1bC/o52Bqr0zGCYhQzwgwvrJBG7Q8vw3zilX6Ryy6oa/mkZku2lLJx1Q==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.6.0.tgz", + "integrity": "sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.1", @@ -8129,17 +8254,17 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "1.5.2" + "vitest": "1.6.0" } }, "node_modules/@vitest/expect": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.5.2.tgz", - "integrity": "sha512-rf7MTD1WCoDlN3FfYJ9Llfp0PbdtOMZ3FIF0AVkDnKbp3oiMW1c8AmvRZBcqbAhDUAvF52e9zx4WQM1r3oraVA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", + "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==", "dev": true, "dependencies": { - "@vitest/spy": "1.5.2", - "@vitest/utils": "1.5.2", + "@vitest/spy": "1.6.0", + "@vitest/utils": "1.6.0", "chai": "^4.3.10" }, "funding": { @@ -8147,12 +8272,12 @@ } }, "node_modules/@vitest/runner": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.5.2.tgz", - "integrity": "sha512-7IJ7sJhMZrqx7HIEpv3WrMYcq8ZNz9L6alo81Y6f8hV5mIE6yVZsFoivLZmr0D777klm1ReqonE9LyChdcmw6g==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz", + "integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==", "dev": true, "dependencies": { - "@vitest/utils": "1.5.2", + "@vitest/utils": "1.6.0", "p-limit": "^5.0.0", "pathe": "^1.1.1" }, @@ -8188,9 +8313,9 @@ } }, "node_modules/@vitest/snapshot": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.5.2.tgz", - "integrity": "sha512-CTEp/lTYos8fuCc9+Z55Ga5NVPKUgExritjF5VY7heRFUfheoAqBneUlvXSUJHUZPjnPmyZA96yLRJDP1QATFQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz", + "integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==", "dev": true, "dependencies": { "magic-string": "^0.30.5", @@ -8234,9 +8359,9 @@ "dev": true }, "node_modules/@vitest/spy": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.5.2.tgz", - "integrity": "sha512-xCcPvI8JpCtgikT9nLpHPL1/81AYqZy1GCy4+MCHBE7xi8jgsYkULpW5hrx5PGLgOQjUpb6fd15lqcriJ40tfQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz", + "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==", "dev": true, "dependencies": { "tinyspy": "^2.2.0" @@ -8246,9 +8371,9 @@ } }, "node_modules/@vitest/utils": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.5.2.tgz", - "integrity": "sha512-sWOmyofuXLJ85VvXNsroZur7mOJGiQeM0JN3/0D1uU8U9bGFM69X1iqHaRXl6R8BwaLY6yPCogP257zxTzkUdA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", + "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", "dev": true, "dependencies": { "diff-sequences": "^29.6.3", @@ -8302,31 +8427,32 @@ "dev": true }, "node_modules/@volar/language-core": { - "version": "2.2.0-alpha.10", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.2.0-alpha.10.tgz", - "integrity": "sha512-njVJLtpu0zMvDaEk7K5q4BRpOgbyEUljU++un9TfJoJNhxG0z/hWwpwgTRImO42EKvwIxF3XUzeMk+qatAFy7Q==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.3.0.tgz", + "integrity": "sha512-pvhL24WUh3VDnv7Yw5N1sjhPtdx7q9g+Wl3tggmnkMcyK8GcCNElF2zHiKznryn0DiUGk+eez/p2qQhz+puuHw==", "dev": true, "dependencies": { - "@volar/source-map": "2.2.0-alpha.10" + "@volar/source-map": "2.3.0" } }, "node_modules/@volar/source-map": { - "version": "2.2.0-alpha.10", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.2.0-alpha.10.tgz", - "integrity": "sha512-nrdWApVkP5cksAnDEyy1JD9rKdwOJsEq1B+seWO4vNXmZNcxQQCx4DULLBvKt7AzRUAQiAuw5aQkb9RBaSqdVA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.3.0.tgz", + "integrity": "sha512-G/228aZjAOGhDjhlyZ++nDbKrS9uk+5DMaEstjvzglaAw7nqtDyhnQAsYzUg6BMP9BtwZ59RIw5HGePrutn00Q==", "dev": true, "dependencies": { "muggle-string": "^0.4.0" } }, "node_modules/@volar/typescript": { - "version": "2.2.0-alpha.10", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.2.0-alpha.10.tgz", - "integrity": "sha512-GCa0vTVVdA9ULUsu2Rx7jwsIuyZQPvPVT9o3NrANTbYv+523Ao1gv3glC5vzNSDPM6bUl37r94HbCj7KINQr+g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.3.0.tgz", + "integrity": "sha512-PtUwMM87WsKVeLJN33GSTUjBexlKfKgouWlOUIv7pjrOnTwhXHZNSmpc312xgXdTjQPpToK6KXSIcKu9sBQ5LQ==", "dev": true, "dependencies": { - "@volar/language-core": "2.2.0-alpha.10", - "path-browserify": "^1.0.1" + "@volar/language-core": "2.3.0", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" } }, "node_modules/@vue/babel-helper-vue-transform-on": { @@ -8453,9 +8579,9 @@ } }, "node_modules/@vue/devtools-api": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.1.tgz", - "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==", + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.3.tgz", + "integrity": "sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==", "dev": true }, "node_modules/@vue/eslint-config-prettier": { @@ -8587,12 +8713,12 @@ } }, "node_modules/@vue/language-core": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.14.tgz", - "integrity": "sha512-3q8mHSNcGTR7sfp2X6jZdcb4yt8AjBXAfKk0qkZIh7GAJxOnoZ10h5HToZglw4ToFvAnq+xu/Z2FFbglh9Icag==", + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.21.tgz", + "integrity": "sha512-vjs6KwnCK++kIXT+eI63BGpJHfHNVJcUCr3RnvJsccT3vbJnZV5IhHR2puEkoOkIbDdp0Gqi1wEnv3hEd3WsxQ==", "dev": true, "dependencies": { - "@volar/language-core": "2.2.0-alpha.10", + "@volar/language-core": "~2.3.0-alpha.15", "@vue/compiler-dom": "^3.4.0", "@vue/shared": "^3.4.0", "computeds": "^0.0.1", @@ -8659,9 +8785,9 @@ "dev": true }, "node_modules/@vue/test-utils": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.4.5.tgz", - "integrity": "sha512-oo2u7vktOyKUked36R93NB7mg2B+N7Plr8lxp2JBGwr18ch6EggFjixSCdIVVLkT6Qr0z359Xvnafc9dcKyDUg==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.4.6.tgz", + "integrity": "sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==", "dev": true, "dependencies": { "js-beautify": "^1.14.9", @@ -8918,9 +9044,9 @@ } }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", "bin": { "acorn": "bin/acorn" }, @@ -8928,10 +9054,10 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, "peer": true, "peerDependencies": { @@ -8948,9 +9074,12 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.0" } @@ -9033,14 +9162,14 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -9366,6 +9495,16 @@ "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", "dev": true }, + "node_modules/async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -9424,9 +9563,9 @@ } }, "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", "dev": true, "dependencies": { "follow-redirects": "^1.15.6", @@ -9720,35 +9859,35 @@ "dev": true }, "node_modules/bare-events": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.2.tgz", - "integrity": "sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", + "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", "dev": true, "optional": true }, "node_modules/bare-fs": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.0.tgz", - "integrity": "sha512-TNFqa1B4N99pds2a5NYHR15o0ZpdNKbAeKTE/+G6ED/UeOavv8RY3dr/Fu99HW3zU3pXpo2kDNO8Sjsm2esfOw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.1.tgz", + "integrity": "sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==", "dev": true, "optional": true, "dependencies": { "bare-events": "^2.0.0", "bare-path": "^2.0.0", - "bare-stream": "^1.0.0" + "bare-stream": "^2.0.0" } }, "node_modules/bare-os": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.3.0.tgz", - "integrity": "sha512-oPb8oMM1xZbhRQBngTgpcQ5gXw6kjOaRsSWsIeNyRxGed2w/ARyP7ScBYpWR1qfX2E5rS3gBw6OWcSQo+s+kUg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.0.tgz", + "integrity": "sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==", "dev": true, "optional": true }, "node_modules/bare-path": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.2.tgz", - "integrity": "sha512-o7KSt4prEphWUHa3QUwCxUI00R86VdjiuxmJK0iNVDHYPGo+HsDaVCnqCmPbf/MiW1ok8F4p3m8RTHlWk8K2ig==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", "dev": true, "optional": true, "dependencies": { @@ -9756,13 +9895,13 @@ } }, "node_modules/bare-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-1.0.0.tgz", - "integrity": "sha512-KhNUoDL40iP4gFaLSsoGE479t0jHijfYdIcxRn/XtezA2BaUD0NRf/JGRpsMq6dMNM+SrCrB0YSSo/5wBY4rOQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.1.3.tgz", + "integrity": "sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==", "dev": true, "optional": true, "dependencies": { - "streamx": "^2.16.1" + "streamx": "^2.18.0" } }, "node_modules/base64-js": { @@ -9785,6 +9924,16 @@ } ] }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true, + "peer": true, + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, "node_modules/basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", @@ -9796,6 +9945,13 @@ "node": ">= 0.8" } }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true, + "peer": true + }, "node_modules/bcryptjs": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", @@ -9966,11 +10122,11 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -9982,57 +10138,277 @@ "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==", "dev": true }, - "node_modules/browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", + "node_modules/browser-sync": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.29.3.tgz", + "integrity": "sha512-NiM38O6XU84+MN+gzspVmXV2fTOoe+jBqIBx3IBdhZrdeURr6ZgznJr/p+hQ+KzkKEiGH/GcC4SQFSL0jV49bg==", "dev": true, + "peer": true, "dependencies": { - "pako": "~0.2.0" + "browser-sync-client": "^2.29.3", + "browser-sync-ui": "^2.29.3", + "bs-recipes": "1.3.4", + "chalk": "4.1.2", + "chokidar": "^3.5.1", + "connect": "3.6.6", + "connect-history-api-fallback": "^1", + "dev-ip": "^1.0.1", + "easy-extender": "^2.3.4", + "eazy-logger": "^4.0.1", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "fs-extra": "3.0.1", + "http-proxy": "^1.18.1", + "immutable": "^3", + "localtunnel": "^2.0.1", + "micromatch": "^4.0.2", + "opn": "5.3.0", + "portscanner": "2.2.0", + "raw-body": "^2.3.2", + "resp-modifier": "6.0.2", + "rx": "4.1.0", + "send": "0.16.2", + "serve-index": "1.9.1", + "serve-static": "1.13.2", + "server-destroy": "1.0.1", + "socket.io": "^4.4.1", + "ua-parser-js": "^1.0.33", + "yargs": "^17.3.1" + }, + "bin": { + "browser-sync": "dist/bin.js" + }, + "engines": { + "node": ">= 8.0.0" } }, - "node_modules/browserify-zlib/node_modules/pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "node_modules/browser-sync-client": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.29.3.tgz", + "integrity": "sha512-4tK5JKCl7v/3aLbmCBMzpufiYLsB1+UI+7tUXCCp5qF0AllHy/jAqYu6k7hUF3hYtlClKpxExWaR+rH+ny07wQ==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "peer": true, "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" + "etag": "1.8.1", + "fresh": "0.5.2", + "mitt": "^1.1.3" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">=8.0.0" } }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "node_modules/browser-sync-ui": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.29.3.tgz", + "integrity": "sha512-kBYOIQjU/D/3kYtUIJtj82e797Egk1FB2broqItkr3i4eF1qiHbFCG6srksu9gWhfmuM/TNG76jMfzAdxEPakg==", + "dev": true, + "peer": true, + "dependencies": { + "async-each-series": "0.1.1", + "chalk": "4.1.2", + "connect-history-api-fallback": "^1", + "immutable": "^3", + "server-destroy": "1.0.1", + "socket.io-client": "^4.4.1", + "stream-throttle": "^0.1.3" + } + }, + "node_modules/browser-sync-ui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/browser-sync-ui/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, + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/browser-sync-ui/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, + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/browser-sync-ui/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, + "peer": true + }, + "node_modules/browser-sync/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/browser-sync/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, + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/browser-sync/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, + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/browser-sync/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, + "peer": true + }, + "node_modules/browser-sync/node_modules/fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", + "dev": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/browser-sync/node_modules/jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==", + "dev": true, + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/browser-sync/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", + "dev": true, + "dependencies": { + "pako": "~0.2.0" + } + }, + "node_modules/browserify-zlib/node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", + "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001629", + "electron-to-chromium": "^1.4.796", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.16" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==", + "dev": true, + "peer": true + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "funding": [ { @@ -10182,9 +10558,9 @@ "link": true }, "node_modules/caniuse-lite": { - "version": "1.0.30001614", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001614.tgz", - "integrity": "sha512-jmZQ1VpmlRwHgdP1/uiKzgiAuGOfLEJsYFP4+GBou/QQ4U6IOJCB4NP1c+1p9RGLpwObcT94jA5/uO+F1vBbog==", + "version": "1.0.30001636", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", + "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", "dev": true, "funding": [ { @@ -10202,14 +10578,14 @@ ] }, "node_modules/carbone": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/carbone/-/carbone-3.5.5.tgz", - "integrity": "sha512-timDDy9nCW3R7YqgV1i6aFdbaZ12TNWmdGVv8zzurZa2u6p4iqHaWjiuxfqJV4Sn/0bCKoc7iC0n7j9QOpyP/w==", + "version": "3.5.6", + "resolved": "https://registry.npmjs.org/carbone/-/carbone-3.5.6.tgz", + "integrity": "sha512-bjTEJAmVQnMJoFAIs6Z0tAUpQoglUH0i4dLV34m8rCKWKagfhAM/zJyyKkU6n9EeyuuoOfCyppsShdvYr0ZfDw==", "dev": true, "dependencies": { - "dayjs": "=1.11.7", + "dayjs": "=1.11.11", "dayjs-timezone-iana-plugin": "=0.1.0", - "debug": "=4.3.4", + "debug": "=4.3.5", "which": "=2.0.2", "yauzl": "=2.10.0", "yazl": "=2.5.1" @@ -10281,9 +10657,9 @@ } }, "node_modules/chart.js": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.2.tgz", - "integrity": "sha512-6GD7iKwFpP5kbSD4MeRRRlTnQvxfQREy36uEtm1hzHzcOqwWx0YEHuspuoNlslu+nciLIB7fjjsHkUv/FzFcOg==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.3.tgz", + "integrity": "sha512-qK1gkGSRYcJzqrrzdR6a+I0vQ4/R+SoODXyAjscQ/4mzuNzySaMCd+hyVxitSY1+L2fjPD1Gbn+ibNqRmwQeLw==", "dev": true, "dependencies": { "@kurkle/color": "^0.3.0" @@ -10338,9 +10714,9 @@ } }, "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, "peer": true, "engines": { @@ -10574,9 +10950,9 @@ } }, "node_modules/cli-table3": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.4.tgz", - "integrity": "sha512-Lm3L0p+/npIQWNIiyF/nAn7T5dnOwR3xNTHXYEBFBFVPXzCVNZ5lqEC/1eo/EVfpDsQ1I+TX4ORPQgp+UI0CRw==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", "dev": true, "dependencies": { "string-width": "^4.2.0" @@ -10861,12 +11237,12 @@ } }, "node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/common-path-prefix": { @@ -10969,6 +11345,49 @@ "proto-list": "~1.2.1" } }, + "node_modules/connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==", + "dev": true, + "peer": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "peer": true + }, "node_modules/consola": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", @@ -11147,9 +11566,9 @@ } }, "node_modules/core-js": { - "version": "3.37.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.0.tgz", - "integrity": "sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", + "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", "dev": true, "hasInstallScript": true, "funding": { @@ -11158,9 +11577,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.37.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.0.tgz", - "integrity": "sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", + "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", "dev": true, "dependencies": { "browserslist": "^4.23.0" @@ -11307,9 +11726,9 @@ } }, "node_modules/css-has-pseudo": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-6.0.3.tgz", - "integrity": "sha512-qIsDxK/z0byH/mpNsv5hzQ5NOl8m1FRmOLgZpx4bG5uYHnOlO2XafeMI4mFIgNSViHwoUWcxSJZyyijaAmbs+A==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-6.0.5.tgz", + "integrity": "sha512-ZTv6RlvJJZKp32jPYnAJVhowDCrRrHUTAxsYSuUPBEDJjzws6neMnzkRblxtgmv1RgcV5dhH2gn7E3wA9Wt6lw==", "dev": true, "funding": [ { @@ -11322,7 +11741,7 @@ } ], "dependencies": { - "@csstools/selector-specificity": "^3.0.3", + "@csstools/selector-specificity": "^3.1.1", "postcss-selector-parser": "^6.0.13", "postcss-value-parser": "^4.2.0" }, @@ -11356,9 +11775,9 @@ } }, "node_modules/cssdb": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.0.0.tgz", - "integrity": "sha512-hfpm8VXc7/dhcEWpLvKDLwImOSk1sa2DxL36OEiY/4h2MGfKjPYIMZo4hnEEl+TCJr2GwcX46jF5TafRASDe9w==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.0.2.tgz", + "integrity": "sha512-zbOCmmbcHvr2lP+XrZSgftGMGumbosC6IM3dbxwifwPEBD70pVJaH3Ho191VBEqDg644AM7PPPVj0ZXokTjZng==", "dev": true, "funding": [ { @@ -11395,6 +11814,12 @@ "node": ">=18" } }, + "node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "dev": true + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", @@ -11472,9 +11897,9 @@ } }, "node_modules/dayjs": { - "version": "1.11.7", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", - "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==", + "version": "1.11.11", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz", + "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==", "dev": true }, "node_modules/dayjs-timezone-iana-plugin": { @@ -11495,9 +11920,9 @@ "dev": true }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "dependencies": { "ms": "2.1.2" }, @@ -11516,9 +11941,9 @@ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" }, "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", "dev": true, "dependencies": { "type-detect": "^4.0.0" @@ -11924,9 +12349,9 @@ } }, "node_modules/detect-port": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", - "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", + "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", "dev": true, "dependencies": { "address": "^1.0.1", @@ -11935,6 +12360,22 @@ "bin": { "detect": "bin/detect-port.js", "detect-port": "bin/detect-port.js" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==", + "dev": true, + "peer": true, + "bin": { + "dev-ip": "lib/dev-ip.js" + }, + "engines": { + "node": ">= 0.8.0" } }, "node_modules/dezalgo": { @@ -12128,22 +12569,101 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, - "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==", + "node_modules/easy-extender": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", + "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", + "dev": true, + "peer": true, "dependencies": { - "safe-buffer": "^5.0.1" + "lodash": "^4.17.10" + }, + "engines": { + "node": ">= 4.0.0" } }, - "node_modules/editorconfig": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", - "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", + "node_modules/eazy-logger": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-4.0.1.tgz", + "integrity": "sha512-2GSFtnnC6U4IEKhEI7+PvdxrmjJ04mdsj3wHZTFiw0tUtG4HCWzTr13ZYTk8XOGnA1xQMaDljoBOYlk3D/MMSw==", "dev": true, + "peer": true, "dependencies": { - "@one-ini/wasm": "0.1.1", - "commander": "^10.0.0", + "chalk": "4.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eazy-logger/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eazy-logger/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, + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eazy-logger/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, + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eazy-logger/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, + "peer": true + }, + "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==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/editorconfig": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", + "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", + "dev": true, + "dependencies": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", "minimatch": "9.0.1", "semver": "^7.5.3" }, @@ -12199,9 +12719,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.750", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.750.tgz", - "integrity": "sha512-9ItEpeu15hW5m8jKdriL+BQrgwDTXEL9pn4SkillWFu73ZNNNQ2BKKLS+ZHv2vC9UkNhosAeyfxOf/5OSeTCPA==", + "version": "1.4.806", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.806.tgz", + "integrity": "sha512-nkoEX2QIB8kwCOtvtgwhXWy2IHVcOLQZu9Qo36uaGB835mdX/h8uLRlosL6QIhLVUnAiicXRW00PwaPZC74Nrg==", "dev": true }, "node_modules/email-validator": { @@ -12242,10 +12762,56 @@ "once": "^1.4.0" } }, + "node_modules/engine.io": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", + "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-client": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.4.tgz", + "integrity": "sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==", + "dev": true, + "peer": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1", + "xmlhttprequest-ssl": "~2.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz", + "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/enhanced-resolve": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", - "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", + "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", "dev": true, "peer": true, "dependencies": { @@ -12301,6 +12867,18 @@ "node": ">=4" } }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/errno": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", @@ -12623,9 +13201,9 @@ } }, "node_modules/eslint-compat-utils": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.0.tgz", - "integrity": "sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", "dev": true, "dependencies": { "semver": "^7.5.4" @@ -12769,21 +13347,22 @@ } }, "node_modules/eslint-plugin-es-x": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.6.0.tgz", - "integrity": "sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.7.0.tgz", + "integrity": "sha512-aP3qj8BwiEDPttxQkZdI221DLKq9sI/qHolE2YSQL1/9+xk7dTV+tB1Fz8/IaCA+lnLA1bDEnvaS2LKs0k2Uig==", "dev": true, + "funding": [ + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" + ], "dependencies": { "@eslint-community/eslint-utils": "^4.1.2", "@eslint-community/regexpp": "^4.6.0", - "eslint-compat-utils": "^0.5.0" + "eslint-compat-utils": "^0.5.1" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - }, "peerDependencies": { "eslint": ">=8" } @@ -13030,15 +13609,18 @@ } }, "node_modules/eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.2.0.tgz", + "integrity": "sha512-QmAqwizauvnKOlifxyDj2ObfULpHQawlg/zQdgEixur9vl0CvZGv/LCJV2rtj3210QCoeGBzVMfMXqGAOr/4fA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/eslint-plugin-sql": { @@ -13061,9 +13643,9 @@ } }, "node_modules/eslint-plugin-vue": { - "version": "9.25.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.25.0.tgz", - "integrity": "sha512-tDWlx14bVe6Bs+Nnh3IGrD+hb11kf2nukfm6jLsmJIhmiRQ1SUaksvwY9U5MvPB0pcrg0QK0xapQkfITs3RKOA==", + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.26.0.tgz", + "integrity": "sha512-eTvlxXgd4ijE1cdur850G6KalZqk65k1JKoOI2d1kT3hr8sPD07j1q98FRFdNnpxBELGPWxZmInxeHGF/GxtqQ==", "dev": true, "peer": true, "dependencies": { @@ -13632,9 +14214,9 @@ } }, "node_modules/express-rate-limit": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.2.0.tgz", - "integrity": "sha512-T7nul1t4TNyfZMJ7pKRKkdeVJWa2CqB8NA1P8BwYaoDI5QSBZARv5oMS43J7b7I5P+4asjVXjb7ONuwDKucahg==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.3.1.tgz", + "integrity": "sha512-BbaryvkY4wEgDqLgD18/NSy2lDO2jTuT9Y8c1Mpx0X63Yz0sYd5zN6KPe7UvpuSVvV33T6RaE1o1IVZQjHMYgw==", "engines": { "node": ">= 16" }, @@ -13666,6 +14248,34 @@ "ms": "2.0.0" } }, + "node_modules/express/node_modules/finalhandler": { + "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": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -13704,6 +14314,48 @@ } ] }, + "node_modules/express/node_modules/send": { + "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": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express/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==" + }, + "node_modules/express/node_modules/serve-static": { + "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": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", @@ -13883,9 +14535,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -13894,16 +14546,18 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==", + "dev": true, + "peer": true, "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~1.0.1", "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", "unpipe": "~1.0.0" }, "engines": { @@ -13914,6 +14568,8 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "peer": true, "dependencies": { "ms": "2.0.0" } @@ -13921,7 +14577,32 @@ "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "peer": true + }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "peer": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } }, "node_modules/find-cache-dir": { "version": "3.3.2", @@ -14089,9 +14770,9 @@ "dev": true }, "node_modules/flow-parser": { - "version": "0.235.1", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.235.1.tgz", - "integrity": "sha512-s04193L4JE+ntEcQXbD6jxRRlyj9QXcgEl2W6xSjH4l9x4b0eHoCHfbYHjqf9LdZFUiM5LhgpiqsvLj/AyOyYQ==", + "version": "0.238.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.238.0.tgz", + "integrity": "sha512-VE7XSv1epljsIN2YeBnxCmGJihpNIAnLLu/pPOdA+Gkso7qDltJwUi6vfHjgxdBbjSdAuPGnhuOHJUQG+yYwIg==", "dev": true, "engines": { "node": ">=0.4.0" @@ -14126,9 +14807,9 @@ } }, "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", "dev": true, "dependencies": { "cross-spawn": "^7.0.0", @@ -14288,9 +14969,9 @@ } }, "node_modules/function-timeout": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-1.0.1.tgz", - "integrity": "sha512-6yPMImFFuaMPNaTMTBuolA8EanHJWF5Vju0NHpObRURT105J6x1Mf2a7J4P7Sqk2xDxv24N5L0RatEhTBhNmdA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-1.0.2.tgz", + "integrity": "sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==", "dev": true, "engines": { "node": ">=18" @@ -14445,9 +15126,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz", - "integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==", + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz", + "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==", "dev": true, "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -14519,22 +15200,23 @@ "dev": true }, "node_modules/glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -14593,12 +15275,13 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -14663,9 +15346,9 @@ "dev": true }, "node_modules/graphql": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.8.1.tgz", - "integrity": "sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==", + "version": "16.8.2", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.8.2.tgz", + "integrity": "sha512-cvVIBILwuoSyD54U4cF/UXDh5yAobhNV/tPygI4lZhgOIJQE/WLWC4waBRb4I6bDVYb3OVx3lfHbaQOEoUD5sg==", "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } @@ -14905,9 +15588,9 @@ } }, "node_modules/hosted-git-info": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", - "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, "dependencies": { "lru-cache": "^10.0.1" @@ -14994,6 +15677,21 @@ "node": ">= 0.8" } }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "peer": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", @@ -15007,6 +15705,13 @@ "node": ">= 14" } }, + "node_modules/http-proxy/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "peer": true + }, "node_modules/https-proxy-agent": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", @@ -15114,10 +15819,14 @@ "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" }, "node_modules/immutable": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", - "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", - "dev": true + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } }, "node_modules/import-fresh": { "version": "3.3.0", @@ -15204,6 +15913,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, "dependencies": { "once": "^1.3.0", @@ -15601,6 +16311,16 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dev": true, + "peer": true, + "dependencies": { + "lodash.isfinite": "^3.3.2" + } + }, "node_modules/is-number-object": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", @@ -15882,9 +16602,9 @@ } }, "node_modules/issue-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.0.tgz", - "integrity": "sha512-jgAw78HO3gs9UrKqJNQvfDj9Ouy8Mhu40fbEJ8yXff4MW8+/Fcn9iFjyWUQ6SKbX8ipPk3X5A3AyfYHRu6uVLw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.1.tgz", + "integrity": "sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg==", "dev": true, "dependencies": { "lodash.capitalize": "^4.2.1", @@ -15968,9 +16688,9 @@ "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==" }, "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", + "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -15986,9 +16706,9 @@ } }, "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", "dev": true, "dependencies": { "async": "^3.2.3", @@ -16263,9 +16983,9 @@ "dev": true }, "node_modules/jsdom": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.0.0.tgz", - "integrity": "sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==", + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.0.tgz", + "integrity": "sha512-6gpM7pRXCwIOKxX47cgOyvyQDN/Eh0f1MeKySBV2xGdKtqJBLj8P25eY3EVCWo2mglDDzozR2r2MW4T+JiNUZA==", "dev": true, "dependencies": { "cssstyle": "^4.0.1", @@ -16273,21 +16993,21 @@ "decimal.js": "^10.4.3", "form-data": "^4.0.0", "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.4", "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.7", + "nwsapi": "^2.2.10", "parse5": "^7.1.2", - "rrweb-cssom": "^0.6.0", + "rrweb-cssom": "^0.7.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.3", + "tough-cookie": "^4.1.4", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^3.1.1", "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0", - "ws": "^8.16.0", + "ws": "^8.17.0", "xml-name-validator": "^5.0.0" }, "engines": { @@ -16622,13 +17342,29 @@ "node": ">=14" } }, - "node_modules/lazy-universal-dotenv": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/lazy-universal-dotenv/-/lazy-universal-dotenv-4.0.0.tgz", - "integrity": "sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==", - "dev": true, - "dependencies": { - "app-root-dir": "^1.0.2", + "node_modules/knex/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/lazy-universal-dotenv": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lazy-universal-dotenv/-/lazy-universal-dotenv-4.0.0.tgz", + "integrity": "sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==", + "dev": true, + "dependencies": { + "app-root-dir": "^1.0.2", "dotenv": "^16.0.0", "dotenv-expand": "^10.0.0" }, @@ -16775,14 +17511,24 @@ } }, "node_modules/lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", "dev": true, "engines": { "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, + "node_modules/limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", + "dev": true, + "peer": true + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -16790,21 +17536,21 @@ "dev": true }, "node_modules/lint-staged": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.2.tgz", - "integrity": "sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==", - "dev": true, - "dependencies": { - "chalk": "5.3.0", - "commander": "11.1.0", - "debug": "4.3.4", - "execa": "8.0.1", - "lilconfig": "3.0.0", - "listr2": "8.0.1", - "micromatch": "4.0.5", - "pidtree": "0.6.0", - "string-argv": "0.3.2", - "yaml": "2.3.4" + "version": "15.2.7", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.7.tgz", + "integrity": "sha512-+FdVbbCZ+yoh7E/RosSdqKJyUM2OEjTciH0TFNkawKgvFp1zbGlEC39RADg+xKBG1R4mhoH2j85myBQZ5wR+lw==", + "dev": true, + "dependencies": { + "chalk": "~5.3.0", + "commander": "~12.1.0", + "debug": "~4.3.4", + "execa": "~8.0.1", + "lilconfig": "~3.1.1", + "listr2": "~8.2.1", + "micromatch": "~4.0.7", + "pidtree": "~0.6.0", + "string-argv": "~0.3.2", + "yaml": "~2.4.2" }, "bin": { "lint-staged": "bin/lint-staged.js" @@ -16817,16 +17563,16 @@ } }, "node_modules/listr2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.0.1.tgz", - "integrity": "sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.1.tgz", + "integrity": "sha512-irTfvpib/rNiD637xeevjO2l3Z5loZmuaRi0L0YE5LfijwVY96oyVn0DFD3o/teAok7nfobMG1THvvcHh/BP6g==", "dev": true, "dependencies": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.0.0", - "rfdc": "^1.3.0", + "rfdc": "^1.3.1", "wrap-ansi": "^9.0.0" }, "engines": { @@ -16903,6 +17649,203 @@ "immediate": "~3.0.5" } }, + "node_modules/localtunnel": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz", + "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==", + "dev": true, + "peer": true, + "dependencies": { + "axios": "0.21.4", + "debug": "4.3.2", + "openurl": "1.1.1", + "yargs": "17.1.1" + }, + "bin": { + "lt": "bin/lt.js" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/localtunnel/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/localtunnel/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/localtunnel/node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dev": true, + "peer": true, + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/localtunnel/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "peer": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/localtunnel/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, + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/localtunnel/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, + "peer": true + }, + "node_modules/localtunnel/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "peer": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/localtunnel/node_modules/emoji-regex": { + "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, + "peer": true + }, + "node_modules/localtunnel/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "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, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/localtunnel/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/localtunnel/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/localtunnel/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/localtunnel/node_modules/yargs": { + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", + "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", + "dev": true, + "peer": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/localtunnel/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + } + }, "node_modules/locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", @@ -17007,6 +17950,13 @@ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" }, + "node_modules/lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", + "dev": true, + "peer": true + }, "node_modules/lodash.isinteger": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", @@ -17041,8 +17991,7 @@ "node_modules/lodash.throttle": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "dev": true + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" }, "node_modules/lodash.uniqby": { "version": "4.7.0", @@ -17273,9 +18222,9 @@ "dev": true }, "node_modules/maplibre-gl": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-4.1.3.tgz", - "integrity": "sha512-nMy5h0kzq9Z66C6AIb3p2BvLIVHz75dGGQow22x+h9/VOihr0IPQI26ylAi6lHqvEy2VqjiRmKAMlFwt0xFKfQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-4.4.1.tgz", + "integrity": "sha512-tD+wn8qWSLCGhABKBrbewmgFfyopZDz+fkYXeOM8vdBhnf126DvMPyaYGGoKvoF4QuswCsgikETd2c39wK+OQw==", "dev": true, "dependencies": { "@mapbox/geojson-rewind": "^0.5.2", @@ -17285,9 +18234,10 @@ "@mapbox/unitbezier": "^0.0.1", "@mapbox/vector-tile": "^1.3.1", "@mapbox/whoots-js": "^3.1.0", - "@maplibre/maplibre-gl-style-spec": "^20.1.1", + "@maplibre/maplibre-gl-style-spec": "^20.3.0", "@types/geojson": "^7946.0.14", "@types/geojson-vt": "3.2.5", + "@types/junit-report-builder": "^3.0.2", "@types/mapbox__point-geometry": "^0.1.4", "@types/mapbox__vector-tile": "^1.3.4", "@types/pbf": "^3.0.5", @@ -17338,15 +18288,15 @@ } }, "node_modules/marked-terminal": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-7.0.0.tgz", - "integrity": "sha512-sNEx8nn9Ktcm6pL0TnRz8tnXq/mSS0Q1FRSwJOAqw4lAB4l49UeDf85Gm1n9RPFm5qurCPjwi1StAQT2XExhZw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-7.1.0.tgz", + "integrity": "sha512-+pvwa14KZL74MVXjYdPR3nSInhGhNvPce/3mqLVZT2oUvt654sL1XImFuLZ1pkA866IYZ3ikDTOFUIC7XzpZZg==", "dev": true, "dependencies": { - "ansi-escapes": "^6.2.0", + "ansi-escapes": "^7.0.0", "chalk": "^5.3.0", "cli-highlight": "^2.1.11", - "cli-table3": "^0.6.3", + "cli-table3": "^0.6.5", "node-emoji": "^2.1.3", "supports-hyperlinks": "^3.0.0" }, @@ -17354,7 +18304,22 @@ "node": ">=16.0.0" }, "peerDependencies": { - "marked": ">=1 <13" + "marked": ">=1 <14" + } + }, + "node_modules/marked-terminal/node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "dev": true, + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/media-typer": { @@ -17419,11 +18384,11 @@ "integrity": "sha512-awNbTOqCxK1DBGjalK3xqWIstBZgN6fxsMSiXLs9/spqWkF2pAhb2rrYCFSsr1/tT7PhcDGjZndG8SWYn0byYA==" }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -17510,9 +18475,9 @@ } }, "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -17543,6 +18508,13 @@ "node": ">=8" } }, + "node_modules/mitt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", + "dev": true, + "peer": true + }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -17562,15 +18534,15 @@ "dev": true }, "node_modules/mlly": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz", - "integrity": "sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", + "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==", "dev": true, "dependencies": { "acorn": "^8.11.3", "pathe": "^1.1.2", - "pkg-types": "^1.0.3", - "ufo": "^1.3.2" + "pkg-types": "^1.1.1", + "ufo": "^1.5.3" } }, "node_modules/ms": { @@ -17814,9 +18786,9 @@ "dev": true }, "node_modules/nopt": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", - "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", "dev": true, "dependencies": { "abbrev": "^2.0.0" @@ -17829,9 +18801,9 @@ } }, "node_modules/normalize-package-data": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", - "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.1.tgz", + "integrity": "sha512-6rvCfeRW+OEZagAB4lMLSNuTNYZWLVtKccK79VSTf//yTY5VOCgcpH80O+bZK8Neps7pUnd5G+QlMg1yV/2iZQ==", "dev": true, "dependencies": { "hosted-git-info": "^7.0.0", @@ -17874,9 +18846,9 @@ } }, "node_modules/npm": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/npm/-/npm-10.6.0.tgz", - "integrity": "sha512-KC70Su2ZnO9v4i2t+M0sQcsRERk++XcYbK9fy4bLWzUCV2nELhSN7UAkoe42P4HQTg2LyQxcfntgYS89OEaOsA==", + "version": "10.8.1", + "resolved": "https://registry.npmjs.org/npm/-/npm-10.8.1.tgz", + "integrity": "sha512-Dp1C6SvSMYQI7YHq/y2l94uvI+59Eqbu1EpuKQHQ8p16txXRuRit5gH3Lnaagk2aXDIjg/Iru9pd05bnneKgdw==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -17933,7 +18905,6 @@ "pacote", "parse-conflict-json", "proc-log", - "proggy", "qrcode-terminal", "read", "semver", @@ -17958,72 +18929,71 @@ ], "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^7.2.1", - "@npmcli/config": "^8.0.2", - "@npmcli/fs": "^3.1.0", + "@npmcli/arborist": "^7.5.3", + "@npmcli/config": "^8.3.3", + "@npmcli/fs": "^3.1.1", "@npmcli/map-workspaces": "^3.0.6", - "@npmcli/package-json": "^5.1.0", - "@npmcli/promise-spawn": "^7.0.1", - "@npmcli/redact": "^1.1.0", - "@npmcli/run-script": "^8.0.0", - "@sigstore/tuf": "^2.3.2", + "@npmcli/package-json": "^5.1.1", + "@npmcli/promise-spawn": "^7.0.2", + "@npmcli/redact": "^2.0.0", + "@npmcli/run-script": "^8.1.0", + "@sigstore/tuf": "^2.3.4", "abbrev": "^2.0.0", "archy": "~1.0.0", - "cacache": "^18.0.2", + "cacache": "^18.0.3", "chalk": "^5.3.0", "ci-info": "^4.0.0", "cli-columns": "^4.0.0", "fastest-levenshtein": "^1.0.16", "fs-minipass": "^3.0.3", - "glob": "^10.3.12", + "glob": "^10.4.1", "graceful-fs": "^4.2.11", - "hosted-git-info": "^7.0.1", - "ini": "^4.1.2", - "init-package-json": "^6.0.2", - "is-cidr": "^5.0.5", - "json-parse-even-better-errors": "^3.0.1", - "libnpmaccess": "^8.0.1", - "libnpmdiff": "^6.0.3", - "libnpmexec": "^7.0.4", - "libnpmfund": "^5.0.1", - "libnpmhook": "^10.0.0", - "libnpmorg": "^6.0.1", - "libnpmpack": "^6.0.3", - "libnpmpublish": "^9.0.2", - "libnpmsearch": "^7.0.0", - "libnpmteam": "^6.0.0", - "libnpmversion": "^5.0.1", - "make-fetch-happen": "^13.0.0", + "hosted-git-info": "^7.0.2", + "ini": "^4.1.3", + "init-package-json": "^6.0.3", + "is-cidr": "^5.1.0", + "json-parse-even-better-errors": "^3.0.2", + "libnpmaccess": "^8.0.6", + "libnpmdiff": "^6.1.3", + "libnpmexec": "^8.1.2", + "libnpmfund": "^5.0.11", + "libnpmhook": "^10.0.5", + "libnpmorg": "^6.0.6", + "libnpmpack": "^7.0.3", + "libnpmpublish": "^9.0.9", + "libnpmsearch": "^7.0.6", + "libnpmteam": "^6.0.5", + "libnpmversion": "^6.0.3", + "make-fetch-happen": "^13.0.1", "minimatch": "^9.0.4", - "minipass": "^7.0.4", + "minipass": "^7.1.1", "minipass-pipeline": "^1.2.4", "ms": "^2.1.2", "node-gyp": "^10.1.0", - "nopt": "^7.2.0", - "normalize-package-data": "^6.0.0", + "nopt": "^7.2.1", + "normalize-package-data": "^6.0.1", "npm-audit-report": "^5.0.0", "npm-install-checks": "^6.3.0", "npm-package-arg": "^11.0.2", - "npm-pick-manifest": "^9.0.0", - "npm-profile": "^9.0.1", - "npm-registry-fetch": "^16.2.1", - "npm-user-validate": "^2.0.0", + "npm-pick-manifest": "^9.0.1", + "npm-profile": "^10.0.0", + "npm-registry-fetch": "^17.0.1", + "npm-user-validate": "^2.0.1", "p-map": "^4.0.0", - "pacote": "^18.0.2", + "pacote": "^18.0.6", "parse-conflict-json": "^3.0.1", "proc-log": "^4.2.0", - "proggy": "^2.0.0", "qrcode-terminal": "^0.12.0", "read": "^3.0.1", - "semver": "^7.6.0", + "semver": "^7.6.2", "spdx-expression-parse": "^4.0.0", - "ssri": "^10.0.5", + "ssri": "^10.0.6", "supports-color": "^9.4.0", "tar": "^6.2.1", "text-table": "~0.2.0", "tiny-relative-date": "^1.3.0", "treeverse": "^3.0.0", - "validate-npm-package-name": "^5.0.0", + "validate-npm-package-name": "^5.0.1", "which": "^4.0.0", "write-file-atomic": "^5.0.1" }, @@ -18152,35 +19122,36 @@ } }, "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "7.5.0", + "version": "7.5.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^3.1.0", + "@npmcli/fs": "^3.1.1", "@npmcli/installed-package-contents": "^2.1.0", "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/metavuln-calculator": "^7.1.0", + "@npmcli/metavuln-calculator": "^7.1.1", "@npmcli/name-from-folder": "^2.0.0", "@npmcli/node-gyp": "^3.0.0", "@npmcli/package-json": "^5.1.0", "@npmcli/query": "^3.1.0", - "@npmcli/redact": "^1.1.0", - "@npmcli/run-script": "^8.0.0", - "bin-links": "^4.0.1", - "cacache": "^18.0.0", + "@npmcli/redact": "^2.0.0", + "@npmcli/run-script": "^8.1.0", + "bin-links": "^4.0.4", + "cacache": "^18.0.3", "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^7.0.1", - "json-parse-even-better-errors": "^3.0.0", + "hosted-git-info": "^7.0.2", + "json-parse-even-better-errors": "^3.0.2", "json-stringify-nice": "^1.1.4", + "lru-cache": "^10.2.2", "minimatch": "^9.0.4", - "nopt": "^7.0.0", + "nopt": "^7.2.1", "npm-install-checks": "^6.2.0", "npm-package-arg": "^11.0.2", - "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^16.2.1", - "pacote": "^18.0.1", + "npm-pick-manifest": "^9.0.1", + "npm-registry-fetch": "^17.0.1", + "pacote": "^18.0.6", "parse-conflict-json": "^3.0.0", "proc-log": "^4.2.0", "proggy": "^2.0.0", @@ -18188,7 +19159,7 @@ "promise-call-limit": "^3.0.1", "read-package-json-fast": "^3.0.2", "semver": "^7.3.7", - "ssri": "^10.0.5", + "ssri": "^10.0.6", "treeverse": "^3.0.0", "walk-up-path": "^3.0.1" }, @@ -18200,7 +19171,7 @@ } }, "node_modules/npm/node_modules/@npmcli/config": { - "version": "8.3.0", + "version": "8.3.3", "dev": true, "inBundle": true, "license": "ISC", @@ -18208,7 +19179,7 @@ "@npmcli/map-workspaces": "^3.0.2", "ci-info": "^4.0.0", "ini": "^4.1.2", - "nopt": "^7.0.0", + "nopt": "^7.2.1", "proc-log": "^4.2.0", "read-package-json-fast": "^3.0.2", "semver": "^7.3.5", @@ -18219,7 +19190,7 @@ } }, "node_modules/npm/node_modules/@npmcli/fs": { - "version": "3.1.0", + "version": "3.1.1", "dev": true, "inBundle": true, "license": "ISC", @@ -18231,7 +19202,7 @@ } }, "node_modules/npm/node_modules/@npmcli/git": { - "version": "5.0.6", + "version": "5.0.7", "dev": true, "inBundle": true, "license": "ISC", @@ -18281,7 +19252,7 @@ } }, "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "7.1.0", + "version": "7.1.1", "dev": true, "inBundle": true, "license": "ISC", @@ -18315,7 +19286,7 @@ } }, "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "5.1.0", + "version": "5.1.1", "dev": true, "inBundle": true, "license": "ISC", @@ -18333,7 +19304,7 @@ } }, "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "7.0.1", + "version": "7.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -18357,7 +19328,7 @@ } }, "node_modules/npm/node_modules/@npmcli/redact": { - "version": "1.1.0", + "version": "2.0.0", "dev": true, "inBundle": true, "license": "ISC", @@ -18366,7 +19337,7 @@ } }, "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "8.0.0", + "version": "8.1.0", "dev": true, "inBundle": true, "license": "ISC", @@ -18393,12 +19364,12 @@ } }, "node_modules/npm/node_modules/@sigstore/bundle": { - "version": "2.3.1", + "version": "2.3.2", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.3.1" + "@sigstore/protobuf-specs": "^0.3.2" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -18414,7 +19385,7 @@ } }, "node_modules/npm/node_modules/@sigstore/protobuf-specs": { - "version": "0.3.1", + "version": "0.3.2", "dev": true, "inBundle": true, "license": "Apache-2.0", @@ -18423,42 +19394,44 @@ } }, "node_modules/npm/node_modules/@sigstore/sign": { - "version": "2.3.0", + "version": "2.3.2", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^2.3.0", + "@sigstore/bundle": "^2.3.2", "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.1", - "make-fetch-happen": "^13.0.0" + "@sigstore/protobuf-specs": "^0.3.2", + "make-fetch-happen": "^13.0.1", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@sigstore/tuf": { - "version": "2.3.2", + "version": "2.3.4", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.3.0", - "tuf-js": "^2.2.0" + "@sigstore/protobuf-specs": "^0.3.2", + "tuf-js": "^2.2.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@sigstore/verify": { - "version": "1.2.0", + "version": "1.2.1", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^2.3.1", + "@sigstore/bundle": "^2.3.2", "@sigstore/core": "^1.1.0", - "@sigstore/protobuf-specs": "^0.3.1" + "@sigstore/protobuf-specs": "^0.3.2" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -18474,13 +19447,13 @@ } }, "node_modules/npm/node_modules/@tufjs/models": { - "version": "2.0.0", + "version": "2.0.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.3" + "minimatch": "^9.0.4" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -18560,7 +19533,7 @@ "license": "MIT" }, "node_modules/npm/node_modules/bin-links": { - "version": "4.0.3", + "version": "4.0.4", "dev": true, "inBundle": true, "license": "ISC", @@ -18595,17 +19568,8 @@ "balanced-match": "^1.0.0" } }, - "node_modules/npm/node_modules/builtins": { - "version": "5.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "semver": "^7.0.0" - } - }, "node_modules/npm/node_modules/cacache": { - "version": "18.0.2", + "version": "18.0.3", "dev": true, "inBundle": true, "license": "ISC", @@ -18664,7 +19628,7 @@ } }, "node_modules/npm/node_modules/cidr-regex": { - "version": "4.0.5", + "version": "4.1.1", "dev": true, "inBundle": true, "license": "BSD-2-Clause", @@ -18698,7 +19662,7 @@ } }, "node_modules/npm/node_modules/cmd-shim": { - "version": "6.0.2", + "version": "6.0.3", "dev": true, "inBundle": true, "license": "ISC", @@ -18893,22 +19857,22 @@ } }, "node_modules/npm/node_modules/glob": { - "version": "10.3.12", + "version": "10.4.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -18933,7 +19897,7 @@ } }, "node_modules/npm/node_modules/hosted-git-info": { - "version": "7.0.1", + "version": "7.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -18990,7 +19954,7 @@ } }, "node_modules/npm/node_modules/ignore-walk": { - "version": "6.0.4", + "version": "6.0.5", "dev": true, "inBundle": true, "license": "ISC", @@ -19020,7 +19984,7 @@ } }, "node_modules/npm/node_modules/ini": { - "version": "4.1.2", + "version": "4.1.3", "dev": true, "inBundle": true, "license": "ISC", @@ -19029,7 +19993,7 @@ } }, "node_modules/npm/node_modules/init-package-json": { - "version": "6.0.2", + "version": "6.0.3", "dev": true, "inBundle": true, "license": "ISC", @@ -19059,12 +20023,6 @@ "node": ">= 12" } }, - "node_modules/npm/node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "BSD-3-Clause" - }, "node_modules/npm/node_modules/ip-regex": { "version": "5.0.0", "dev": true, @@ -19078,12 +20036,12 @@ } }, "node_modules/npm/node_modules/is-cidr": { - "version": "5.0.5", + "version": "5.1.0", "dev": true, "inBundle": true, "license": "BSD-2-Clause", "dependencies": { - "cidr-regex": "^4.0.4" + "cidr-regex": "^4.1.1" }, "engines": { "node": ">=14" @@ -19123,7 +20081,7 @@ "license": "ISC" }, "node_modules/npm/node_modules/jackspeak": { - "version": "2.3.6", + "version": "3.1.2", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", @@ -19147,7 +20105,7 @@ "license": "MIT" }, "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "3.0.1", + "version": "3.0.2", "dev": true, "inBundle": true, "license": "MIT", @@ -19186,31 +20144,31 @@ "license": "MIT" }, "node_modules/npm/node_modules/libnpmaccess": { - "version": "8.0.4", + "version": "8.0.6", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "npm-package-arg": "^11.0.2", - "npm-registry-fetch": "^16.2.1" + "npm-registry-fetch": "^17.0.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmdiff": { - "version": "6.1.0", + "version": "6.1.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^7.2.1", + "@npmcli/arborist": "^7.5.3", "@npmcli/installed-package-contents": "^2.1.0", "binary-extensions": "^2.3.0", "diff": "^5.1.0", "minimatch": "^9.0.4", "npm-package-arg": "^11.0.2", - "pacote": "^18.0.1", + "pacote": "^18.0.6", "tar": "^6.2.1" }, "engines": { @@ -19218,16 +20176,16 @@ } }, "node_modules/npm/node_modules/libnpmexec": { - "version": "8.0.0", + "version": "8.1.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^7.2.1", - "@npmcli/run-script": "^8.0.0", + "@npmcli/arborist": "^7.5.3", + "@npmcli/run-script": "^8.1.0", "ci-info": "^4.0.0", "npm-package-arg": "^11.0.2", - "pacote": "^18.0.1", + "pacote": "^18.0.6", "proc-log": "^4.2.0", "read": "^3.0.1", "read-package-json-fast": "^3.0.2", @@ -19239,111 +20197,111 @@ } }, "node_modules/npm/node_modules/libnpmfund": { - "version": "5.0.8", + "version": "5.0.11", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^7.2.1" + "@npmcli/arborist": "^7.5.3" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmhook": { - "version": "10.0.3", + "version": "10.0.5", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", - "npm-registry-fetch": "^16.2.1" + "npm-registry-fetch": "^17.0.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmorg": { - "version": "6.0.4", + "version": "6.0.6", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", - "npm-registry-fetch": "^16.2.1" + "npm-registry-fetch": "^17.0.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmpack": { - "version": "7.0.0", + "version": "7.0.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^7.2.1", - "@npmcli/run-script": "^8.0.0", + "@npmcli/arborist": "^7.5.3", + "@npmcli/run-script": "^8.1.0", "npm-package-arg": "^11.0.2", - "pacote": "^18.0.1" + "pacote": "^18.0.6" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmpublish": { - "version": "9.0.6", + "version": "9.0.9", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "ci-info": "^4.0.0", - "normalize-package-data": "^6.0.0", + "normalize-package-data": "^6.0.1", "npm-package-arg": "^11.0.2", - "npm-registry-fetch": "^16.2.1", + "npm-registry-fetch": "^17.0.1", "proc-log": "^4.2.0", "semver": "^7.3.7", "sigstore": "^2.2.0", - "ssri": "^10.0.5" + "ssri": "^10.0.6" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmsearch": { - "version": "7.0.3", + "version": "7.0.6", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-registry-fetch": "^16.2.1" + "npm-registry-fetch": "^17.0.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmteam": { - "version": "6.0.3", + "version": "6.0.5", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", - "npm-registry-fetch": "^16.2.1" + "npm-registry-fetch": "^17.0.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmversion": { - "version": "6.0.0", + "version": "6.0.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/git": "^5.0.6", - "@npmcli/run-script": "^8.0.0", - "json-parse-even-better-errors": "^3.0.0", + "@npmcli/git": "^5.0.7", + "@npmcli/run-script": "^8.1.0", + "json-parse-even-better-errors": "^3.0.2", "proc-log": "^4.2.0", "semver": "^7.3.7" }, @@ -19352,7 +20310,7 @@ } }, "node_modules/npm/node_modules/lru-cache": { - "version": "10.2.0", + "version": "10.2.2", "dev": true, "inBundle": true, "license": "ISC", @@ -19361,7 +20319,7 @@ } }, "node_modules/npm/node_modules/make-fetch-happen": { - "version": "13.0.0", + "version": "13.0.1", "dev": true, "inBundle": true, "license": "ISC", @@ -19375,6 +20333,7 @@ "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", + "proc-log": "^4.2.0", "promise-retry": "^2.0.1", "ssri": "^10.0.0" }, @@ -19398,7 +20357,7 @@ } }, "node_modules/npm/node_modules/minipass": { - "version": "7.0.4", + "version": "7.1.2", "dev": true, "inBundle": true, "license": "ISC", @@ -19419,7 +20378,7 @@ } }, "node_modules/npm/node_modules/minipass-fetch": { - "version": "3.0.4", + "version": "3.0.5", "dev": true, "inBundle": true, "license": "MIT", @@ -19624,7 +20583,7 @@ } }, "node_modules/npm/node_modules/nopt": { - "version": "7.2.0", + "version": "7.2.1", "dev": true, "inBundle": true, "license": "ISC", @@ -19639,7 +20598,7 @@ } }, "node_modules/npm/node_modules/normalize-package-data": { - "version": "6.0.0", + "version": "6.0.1", "dev": true, "inBundle": true, "license": "BSD-2-Clause", @@ -19663,7 +20622,7 @@ } }, "node_modules/npm/node_modules/npm-bundled": { - "version": "3.0.0", + "version": "3.0.1", "dev": true, "inBundle": true, "license": "ISC", @@ -19723,7 +20682,7 @@ } }, "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "9.0.0", + "version": "9.0.1", "dev": true, "inBundle": true, "license": "ISC", @@ -19738,25 +20697,25 @@ } }, "node_modules/npm/node_modules/npm-profile": { - "version": "9.0.1", + "version": "10.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-registry-fetch": "^16.0.0", + "npm-registry-fetch": "^17.0.1", "proc-log": "^4.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=18.0.0" } }, "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "16.2.1", + "version": "17.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/redact": "^1.1.0", + "@npmcli/redact": "^2.0.0", "make-fetch-happen": "^13.0.0", "minipass": "^7.0.2", "minipass-fetch": "^3.0.0", @@ -19770,7 +20729,7 @@ } }, "node_modules/npm/node_modules/npm-user-validate": { - "version": "2.0.0", + "version": "2.0.1", "dev": true, "inBundle": true, "license": "BSD-2-Clause", @@ -19794,7 +20753,7 @@ } }, "node_modules/npm/node_modules/pacote": { - "version": "18.0.2", + "version": "18.0.6", "dev": true, "inBundle": true, "license": "ISC", @@ -19810,7 +20769,7 @@ "npm-package-arg": "^11.0.0", "npm-packlist": "^8.0.0", "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^16.0.0", + "npm-registry-fetch": "^17.0.0", "proc-log": "^4.0.0", "promise-retry": "^2.0.1", "sigstore": "^2.2.0", @@ -19818,7 +20777,7 @@ "tar": "^6.1.11" }, "bin": { - "pacote": "lib/bin.js" + "pacote": "bin/index.js" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -19848,7 +20807,7 @@ } }, "node_modules/npm/node_modules/path-scurry": { - "version": "1.10.2", + "version": "1.11.1", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", @@ -19857,14 +20816,14 @@ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.16", + "version": "6.1.0", "dev": true, "inBundle": true, "license": "MIT", @@ -19932,7 +20891,7 @@ } }, "node_modules/npm/node_modules/promzard": { - "version": "1.0.1", + "version": "1.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -20002,13 +20961,10 @@ "optional": true }, "node_modules/npm/node_modules/semver": { - "version": "7.6.0", + "version": "7.6.2", "dev": true, "inBundle": true, "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -20016,18 +20972,6 @@ "node": ">=10" } }, - "node_modules/npm/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/npm/node_modules/shebang-command": { "version": "2.0.0", "dev": true, @@ -20062,17 +21006,17 @@ } }, "node_modules/npm/node_modules/sigstore": { - "version": "2.3.0", + "version": "2.3.1", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^2.3.1", + "@sigstore/bundle": "^2.3.2", "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.1", - "@sigstore/sign": "^2.3.0", - "@sigstore/tuf": "^2.3.1", - "@sigstore/verify": "^1.2.0" + "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/sign": "^2.3.2", + "@sigstore/tuf": "^2.3.4", + "@sigstore/verify": "^1.2.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -20153,13 +21097,19 @@ } }, "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.17", + "version": "3.0.18", "dev": true, "inBundle": true, "license": "CC0-1.0" }, + "node_modules/npm/node_modules/sprintf-js": { + "version": "1.1.3", + "dev": true, + "inBundle": true, + "license": "BSD-3-Clause" + }, "node_modules/npm/node_modules/ssri": { - "version": "10.0.5", + "version": "10.0.6", "dev": true, "inBundle": true, "license": "ISC", @@ -20308,14 +21258,14 @@ } }, "node_modules/npm/node_modules/tuf-js": { - "version": "2.2.0", + "version": "2.2.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "@tufjs/models": "2.0.0", + "@tufjs/models": "2.0.1", "debug": "^4.3.4", - "make-fetch-happen": "^13.0.0" + "make-fetch-happen": "^13.0.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -20372,13 +21322,10 @@ } }, "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "5.0.0", + "version": "5.0.1", "dev": true, "inBundle": true, "license": "ISC", - "dependencies": { - "builtins": "^5.0.0" - }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -20546,9 +21493,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.9.tgz", - "integrity": "sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg==", + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.10.tgz", + "integrity": "sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==", "dev": true }, "node_modules/nypm": { @@ -20695,14 +21642,14 @@ } }, "node_modules/objection/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -20785,6 +21732,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/openurl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", + "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==", + "dev": true, + "peer": true + }, + "node_modules/opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "dev": true, + "peer": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opn/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -21072,6 +22049,12 @@ "node": ">=4" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -21107,6 +22090,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parse-node-version": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", @@ -21205,16 +22200,16 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", - "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -21287,9 +22282,9 @@ "dev": true }, "node_modules/pg": { - "version": "8.11.5", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.5.tgz", - "integrity": "sha512-jqgNHSKL5cbDjFlHyYsCXmQDrfIX/3RsNwYqpd4N0Kt8niLuNoRNH+aazv6cOd43gPh9Y4DjQCtb+X0MH0Hvnw==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.12.0.tgz", + "integrity": "sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==", "dependencies": { "pg-connection-string": "^2.6.4", "pg-pool": "^3.6.2", @@ -21342,9 +22337,9 @@ } }, "node_modules/pg-formatter/node_modules/rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.7.tgz", + "integrity": "sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==", "dev": true, "dependencies": { "glob": "^10.3.7" @@ -21353,7 +22348,7 @@ "rimraf": "dist/esm/bin.mjs" }, "engines": { - "node": ">=14" + "node": ">=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -21477,9 +22472,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "node_modules/picomatch": { @@ -21619,13 +22614,13 @@ } }, "node_modules/pkg-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.0.tgz", - "integrity": "sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.1.tgz", + "integrity": "sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==", "dev": true, "dependencies": { "confbox": "^0.1.7", - "mlly": "^1.6.1", + "mlly": "^1.7.0", "pathe": "^1.1.2" } }, @@ -21641,6 +22636,31 @@ "node": ">=10" } }, + "node_modules/portscanner": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", + "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", + "dev": true, + "peer": true, + "dependencies": { + "async": "^2.6.0", + "is-number-like": "^1.0.3" + }, + "engines": { + "node": ">=0.4", + "npm": ">=1.0.0" + } + }, + "node_modules/portscanner/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "peer": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", @@ -21719,9 +22739,9 @@ } }, "node_modules/postcss-color-functional-notation": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-6.0.9.tgz", - "integrity": "sha512-8i/ofOArZ4fljp+3g+HI6Pok01Kb8YaSqInrJt2vMimEKrI0ZDNRLpH+wLhXBNu/Bi8zeWDvxhvCqsGSpu8E6Q==", + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-6.0.11.tgz", + "integrity": "sha512-gJ+hAtAsgBF4w7eh28Pg7EA60lx7vE5xO/B/yZawaI6FYHky+5avA9YSe73nJHnAMEVFpCMeJc6Wts5g+niksg==", "dev": true, "funding": [ { @@ -21734,9 +22754,9 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^2.0.0", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", + "@csstools/css-color-parser": "^2.0.2", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", "@csstools/postcss-progressive-custom-properties": "^3.2.0", "@csstools/utilities": "^1.0.0" }, @@ -21800,9 +22820,9 @@ } }, "node_modules/postcss-custom-media": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-10.0.4.tgz", - "integrity": "sha512-Ubs7O3wj2prghaKRa68VHBvuy3KnTQ0zbGwqDYY1mntxJD0QL2AeiAy+AMfl3HBedTCVr2IcFNktwty9YpSskA==", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-10.0.6.tgz", + "integrity": "sha512-BjihQoIO4Wjqv9fQNExSJIim8UAmkhLxuJnhJsLTRFSba1y1MhxkJK5awsM//6JJ+/Tu5QUxf624RQAvKHv6SA==", "dev": true, "funding": [ { @@ -21815,10 +22835,10 @@ } ], "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.9", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", - "@csstools/media-query-list-parser": "^2.1.9" + "@csstools/cascade-layer-name-parser": "^1.0.11", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", + "@csstools/media-query-list-parser": "^2.1.11" }, "engines": { "node": "^14 || ^16 || >=18" @@ -21828,9 +22848,9 @@ } }, "node_modules/postcss-custom-properties": { - "version": "13.3.8", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-13.3.8.tgz", - "integrity": "sha512-OP9yj4yXxYOiW2n2TRpnE7C0yePvBiZb72S22mZVNzZEObdTYFjNaX6oZO4R4E8Ie9RmC/Jxw8EKYSbLrC1EFA==", + "version": "13.3.10", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-13.3.10.tgz", + "integrity": "sha512-ejaalIpl7p0k0L5ngIZ86AZGmp3m1KdeOCbSQTK4gQcB1ncaoPTHorw206+tsZRIhIDYvh5ZButEje6740YDXw==", "dev": true, "funding": [ { @@ -21843,9 +22863,9 @@ } ], "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.9", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", + "@csstools/cascade-layer-name-parser": "^1.0.11", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", "@csstools/utilities": "^1.0.0", "postcss-value-parser": "^4.2.0" }, @@ -21857,9 +22877,9 @@ } }, "node_modules/postcss-custom-selectors": { - "version": "7.1.8", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-7.1.8.tgz", - "integrity": "sha512-fqDkGSEsO7+oQaqdRdR8nwwqH+N2uk6LE/2g4myVJJYz/Ly418lHKEleKTdV/GzjBjFcG4n0dbfuH/Pd2BE8YA==", + "version": "7.1.10", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-7.1.10.tgz", + "integrity": "sha512-bV/6+IExyT2J4kMzX6c+ZMlN1xDfjcC4ePr1ywKezcTgwgUn11qQN3jdzFBpo8Dk1K7vO/OYOwMb5AtJP4JZcg==", "dev": true, "funding": [ { @@ -21872,9 +22892,9 @@ } ], "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.9", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", + "@csstools/cascade-layer-name-parser": "^1.0.11", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", "postcss-selector-parser": "^6.0.13" }, "engines": { @@ -22044,9 +23064,9 @@ } }, "node_modules/postcss-lab-function": { - "version": "6.0.14", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-6.0.14.tgz", - "integrity": "sha512-ddQS9FRWT8sfl4wfW0ae8fpP2JdLIuhC9pYpHq1077avjrLzg73T9IEVu5QmFa72nJhYFlO9CbqjcoSdEzfY9A==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-6.0.16.tgz", + "integrity": "sha512-QWv0VxfjgIl8jBR/wuQcm/o31jn4P/LwzYuVKzNQoO5t7HPcU0d3RfWUiDrHN3frmSv+YYZppr3P81tKFTDyqg==", "dev": true, "funding": [ { @@ -22059,9 +23079,9 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^2.0.0", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", + "@csstools/css-color-parser": "^2.0.2", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", "@csstools/postcss-progressive-custom-properties": "^3.2.0", "@csstools/utilities": "^1.0.0" }, @@ -22189,9 +23209,9 @@ } }, "node_modules/postcss-nesting": { - "version": "12.1.2", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.1.2.tgz", - "integrity": "sha512-FUmTHGDNundodutB4PUBxt/EPuhgtpk8FJGRsBhOuy+6FnkR2A8RZWIsyyy6XmhvX2DZQQWIkvu+HB4IbJm+Ew==", + "version": "12.1.5", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.1.5.tgz", + "integrity": "sha512-N1NgI1PDCiAGWPTYrwqm8wpjv0bgDmkYHH72pNsqTCv9CObxjxftdYu6AKtGN+pnJa7FQjMm3v4sp8QJbFsYdQ==", "dev": true, "funding": [ { @@ -22205,8 +23225,8 @@ ], "dependencies": { "@csstools/selector-resolve-nested": "^1.1.0", - "@csstools/selector-specificity": "^3.0.3", - "postcss-selector-parser": "^6.0.13" + "@csstools/selector-specificity": "^3.1.1", + "postcss-selector-parser": "^6.1.0" }, "engines": { "node": "^14 || ^16 || >=18" @@ -22297,9 +23317,9 @@ } }, "node_modules/postcss-preset-env": { - "version": "9.5.9", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-9.5.9.tgz", - "integrity": "sha512-W+WgDH1MOWLT3Fsvknd45pzGMQ8Sp3fmt94Pxeik3Zkqfhw2XUDF8FehfV3Naxw4l/NrKPWLtltPJYVnpjMmfw==", + "version": "9.5.14", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-9.5.14.tgz", + "integrity": "sha512-gTMi+3kENN/mN+K59aR+vEOjlkujTmmXJcM9rnAqGh9Y/euQ/ypdp9rd8mO1eoIjAD8vNS15+xbkBxoi+65BqQ==", "dev": true, "funding": [ { @@ -22312,49 +23332,49 @@ } ], "dependencies": { - "@csstools/postcss-cascade-layers": "^4.0.4", - "@csstools/postcss-color-function": "^3.0.14", - "@csstools/postcss-color-mix-function": "^2.0.14", - "@csstools/postcss-exponential-functions": "^1.0.5", + "@csstools/postcss-cascade-layers": "^4.0.6", + "@csstools/postcss-color-function": "^3.0.16", + "@csstools/postcss-color-mix-function": "^2.0.16", + "@csstools/postcss-exponential-functions": "^1.0.7", "@csstools/postcss-font-format-keywords": "^3.0.2", - "@csstools/postcss-gamut-mapping": "^1.0.7", - "@csstools/postcss-gradients-interpolation-method": "^4.0.15", - "@csstools/postcss-hwb-function": "^3.0.13", + "@csstools/postcss-gamut-mapping": "^1.0.9", + "@csstools/postcss-gradients-interpolation-method": "^4.0.17", + "@csstools/postcss-hwb-function": "^3.0.15", "@csstools/postcss-ic-unit": "^3.0.6", "@csstools/postcss-initial": "^1.0.1", - "@csstools/postcss-is-pseudo-class": "^4.0.6", - "@csstools/postcss-light-dark-function": "^1.0.3", + "@csstools/postcss-is-pseudo-class": "^4.0.8", + "@csstools/postcss-light-dark-function": "^1.0.5", "@csstools/postcss-logical-float-and-clear": "^2.0.1", "@csstools/postcss-logical-overflow": "^1.0.1", "@csstools/postcss-logical-overscroll-behavior": "^1.0.1", "@csstools/postcss-logical-resize": "^2.0.1", - "@csstools/postcss-logical-viewport-units": "^2.0.7", - "@csstools/postcss-media-minmax": "^1.1.4", - "@csstools/postcss-media-queries-aspect-ratio-number-values": "^2.0.7", + "@csstools/postcss-logical-viewport-units": "^2.0.9", + "@csstools/postcss-media-minmax": "^1.1.6", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^2.0.9", "@csstools/postcss-nested-calc": "^3.0.2", "@csstools/postcss-normalize-display-values": "^3.0.2", - "@csstools/postcss-oklab-function": "^3.0.14", + "@csstools/postcss-oklab-function": "^3.0.16", "@csstools/postcss-progressive-custom-properties": "^3.2.0", - "@csstools/postcss-relative-color-syntax": "^2.0.14", + "@csstools/postcss-relative-color-syntax": "^2.0.16", "@csstools/postcss-scope-pseudo-class": "^3.0.1", - "@csstools/postcss-stepped-value-functions": "^3.0.6", + "@csstools/postcss-stepped-value-functions": "^3.0.8", "@csstools/postcss-text-decoration-shorthand": "^3.0.6", - "@csstools/postcss-trigonometric-functions": "^3.0.6", + "@csstools/postcss-trigonometric-functions": "^3.0.8", "@csstools/postcss-unset-value": "^3.0.1", "autoprefixer": "^10.4.19", "browserslist": "^4.22.3", "css-blank-pseudo": "^6.0.2", - "css-has-pseudo": "^6.0.3", + "css-has-pseudo": "^6.0.5", "css-prefers-color-scheme": "^9.0.1", "cssdb": "^8.0.0", "postcss-attribute-case-insensitive": "^6.0.3", "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^6.0.9", + "postcss-color-functional-notation": "^6.0.11", "postcss-color-hex-alpha": "^9.0.4", "postcss-color-rebeccapurple": "^9.0.3", - "postcss-custom-media": "^10.0.4", - "postcss-custom-properties": "^13.3.8", - "postcss-custom-selectors": "^7.1.8", + "postcss-custom-media": "^10.0.6", + "postcss-custom-properties": "^13.3.10", + "postcss-custom-selectors": "^7.1.10", "postcss-dir-pseudo-class": "^8.0.1", "postcss-double-position-gradients": "^5.0.6", "postcss-focus-visible": "^9.0.1", @@ -22362,9 +23382,9 @@ "postcss-font-variant": "^5.0.0", "postcss-gap-properties": "^5.0.1", "postcss-image-set-function": "^6.0.3", - "postcss-lab-function": "^6.0.14", + "postcss-lab-function": "^6.0.16", "postcss-logical": "^7.0.1", - "postcss-nesting": "^12.1.2", + "postcss-nesting": "^12.1.5", "postcss-opacity-percentage": "^2.0.0", "postcss-overflow-shorthand": "^5.0.1", "postcss-page-break": "^3.0.4", @@ -22440,9 +23460,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", - "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", + "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -22505,9 +23525,9 @@ "dev": true }, "node_modules/preact": { - "version": "10.20.2", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.20.2.tgz", - "integrity": "sha512-S1d1ernz3KQ+Y2awUxKakpfOg2CEmJmwOP+6igPx6dgr6pgDvenqYviyokWso2rhHvGtTlWWnJDa7RaPbQerTg==", + "version": "10.22.0", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.22.0.tgz", + "integrity": "sha512-RRurnSjJPj4rp5K6XoP45Ui33ncb7e4H7WiOHVpjbkvqvA3U+N8Z6Qbo0AE6leGYBV66n8EhEaFixvIu3SkxFw==", "dev": true, "funding": { "type": "opencollective", @@ -22524,9 +23544,9 @@ } }, "node_modules/prettier": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", + "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", "bin": { "prettier": "bin/prettier.cjs" }, @@ -22593,6 +23613,21 @@ "node": ">= 0.8" } }, + "node_modules/pretty-ms": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.0.0.tgz", + "integrity": "sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==", + "dev": true, + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -22707,12 +23742,12 @@ "dev": true }, "node_modules/pug": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz", - "integrity": "sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.3.tgz", + "integrity": "sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==", "dev": true, "dependencies": { - "pug-code-gen": "^3.0.2", + "pug-code-gen": "^3.0.3", "pug-filters": "^4.0.0", "pug-lexer": "^5.0.1", "pug-linker": "^4.0.0", @@ -22734,25 +23769,25 @@ } }, "node_modules/pug-code-gen": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.2.tgz", - "integrity": "sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.3.tgz", + "integrity": "sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==", "dev": true, "dependencies": { "constantinople": "^4.0.1", "doctypes": "^1.1.0", "js-stringify": "^1.0.2", "pug-attrs": "^3.0.0", - "pug-error": "^2.0.0", - "pug-runtime": "^3.0.0", + "pug-error": "^2.1.0", + "pug-runtime": "^3.0.1", "void-elements": "^3.1.0", "with": "^7.0.0" } }, "node_modules/pug-error": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz", - "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.1.0.tgz", + "integrity": "sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==", "dev": true }, "node_modules/pug-filters": { @@ -23141,9 +24176,9 @@ } }, "node_modules/recast": { - "version": "0.23.6", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.6.tgz", - "integrity": "sha512-9FHoNjX1yjuesMwuthAmPKabxYQdOgihFYmT5ebXfYGBcnqXZf3WOVz+5foEZ8Y83P4ZY6yQD5GMmtV+pgCCAQ==", + "version": "0.23.9", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz", + "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==", "dev": true, "dependencies": { "ast-types": "^0.16.1", @@ -23356,6 +24391,61 @@ "protocol-buffers-schema": "^3.3.1" } }, + "node_modules/resp-modifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", + "integrity": "sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==", + "dev": true, + "peer": true, + "dependencies": { + "debug": "^2.2.0", + "minimatch": "^3.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/resp-modifier/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/resp-modifier/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/resp-modifier/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, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/resp-modifier/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "peer": true + }, "node_modules/restore-cursor": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", @@ -23421,15 +24511,16 @@ } }, "node_modules/rfdc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", - "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -23455,6 +24546,7 @@ "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, "dependencies": { "fs.realpath": "^1.0.0", @@ -23484,9 +24576,9 @@ } }, "node_modules/rollup": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.1.tgz", - "integrity": "sha512-0gG94inrUtg25sB2V/pApwiv1lUb0bQ25FPNuzO89Baa+B+c0ccaaBKM5zkZV/12pUUdH+lWCSm9wmHqyocuVQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", + "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -23499,22 +24591,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.17.1", - "@rollup/rollup-android-arm64": "4.17.1", - "@rollup/rollup-darwin-arm64": "4.17.1", - "@rollup/rollup-darwin-x64": "4.17.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.17.1", - "@rollup/rollup-linux-arm-musleabihf": "4.17.1", - "@rollup/rollup-linux-arm64-gnu": "4.17.1", - "@rollup/rollup-linux-arm64-musl": "4.17.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.17.1", - "@rollup/rollup-linux-riscv64-gnu": "4.17.1", - "@rollup/rollup-linux-s390x-gnu": "4.17.1", - "@rollup/rollup-linux-x64-gnu": "4.17.1", - "@rollup/rollup-linux-x64-musl": "4.17.1", - "@rollup/rollup-win32-arm64-msvc": "4.17.1", - "@rollup/rollup-win32-ia32-msvc": "4.17.1", - "@rollup/rollup-win32-x64-msvc": "4.17.1", + "@rollup/rollup-android-arm-eabi": "4.18.0", + "@rollup/rollup-android-arm64": "4.18.0", + "@rollup/rollup-darwin-arm64": "4.18.0", + "@rollup/rollup-darwin-x64": "4.18.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", + "@rollup/rollup-linux-arm-musleabihf": "4.18.0", + "@rollup/rollup-linux-arm64-gnu": "4.18.0", + "@rollup/rollup-linux-arm64-musl": "4.18.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", + "@rollup/rollup-linux-riscv64-gnu": "4.18.0", + "@rollup/rollup-linux-s390x-gnu": "4.18.0", + "@rollup/rollup-linux-x64-gnu": "4.18.0", + "@rollup/rollup-linux-x64-musl": "4.18.0", + "@rollup/rollup-win32-arm64-msvc": "4.18.0", + "@rollup/rollup-win32-ia32-msvc": "4.18.0", + "@rollup/rollup-win32-x64-msvc": "4.18.0", "fsevents": "~2.3.2" } }, @@ -23554,9 +24646,9 @@ } }, "node_modules/rrweb-cssom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", - "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", "dev": true }, "node_modules/run-parallel": { @@ -23587,6 +24679,13 @@ "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", "dev": true }, + "node_modules/rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==", + "dev": true, + "peer": true + }, "node_modules/safe-array-concat": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", @@ -23639,9 +24738,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { - "version": "1.75.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.75.0.tgz", - "integrity": "sha512-ShMYi3WkrDWxExyxSZPst4/okE9ts46xZmJDSawJQrnte7M1V9fScVB+uNXOVKRBt0PggHOwoZcn8mYX4trnBw==", + "version": "1.77.6", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz", + "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -23655,12 +24754,19 @@ "node": ">=14.0.0" } }, - "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "node_modules/sass/node_modules/immutable": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", + "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==", "dev": true }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "dev": true, + "optional": true + }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -23703,15 +24809,15 @@ } }, "node_modules/schema-utils/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -23748,9 +24854,9 @@ } }, "node_modules/semantic-release": { - "version": "23.0.8", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-23.0.8.tgz", - "integrity": "sha512-yZkuWcTTfh5h/DrR4Q4QvJSARJdb6wjwn/sN0qKMYEkvwaVFek8YWfrgtL8oWaRdl0fLte0Y1wWMzLbwoaII1g==", + "version": "23.1.1", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-23.1.1.tgz", + "integrity": "sha512-qqJDBhbtHsjUEMsojWKGuL5lQFCJuPtiXKEIlFKyTzDDGTAE/oyvznaP8GeOr5PvcqBJ6LQz4JCENWPLeehSpA==", "dev": true, "dependencies": { "@semantic-release/commit-analyzer": "^12.0.0", @@ -23762,7 +24868,7 @@ "cosmiconfig": "^9.0.0", "debug": "^4.0.0", "env-ci": "^11.0.0", - "execa": "^8.0.0", + "execa": "^9.0.0", "figures": "^6.0.0", "find-versions": "^6.0.0", "get-stream": "^6.0.0", @@ -23799,6 +24905,60 @@ "axios": "^1.6.8" } }, + "node_modules/semantic-release/node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/execa": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.2.0.tgz", + "integrity": "sha512-vpOyYg7UAVKLAWWtRS2gAdgkT7oJbCn0me3gmUmxZih4kd3MF/oo8kNTBTIbkO3yuuF5uB4ZCZfn8BOolITYhg==", + "dev": true, + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.3", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^7.0.0", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^5.2.0", + "pretty-ms": "^9.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/semantic-release/node_modules/execa/node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/semantic-release/node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -23811,13 +24971,43 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" + "node_modules/semantic-release/node_modules/human-signals": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-7.0.0.tgz", + "integrity": "sha512-74kytxOUSvNbjrT9KisAbaTZ/eJwD/LrbM/kh5j0IhPuJzwuA19dWvniFGwBzN9rVjg+O/e+F310PjObDXS+9Q==", + "dev": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/semantic-release/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "dev": true, + "engines": { + "node": ">=18" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "bin": { "semver": "bin/semver.js" }, @@ -23852,35 +25042,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semver/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/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "peer": true, "dependencies": { "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", + "depd": "~1.1.2", + "destroy": "~1.0.4", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" }, "engines": { "node": ">= 0.8.0" @@ -23890,30 +25071,98 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "peer": true, "dependencies": { "ms": "2.0.0" } }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "node_modules/send/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==", + "dev": true, + "peer": true + }, + "node_modules/send/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "peer": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true, + "peer": true }, "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true, + "peer": true, "bin": { "mime": "cli.js" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "peer": true + }, + "node_modules/send/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "peer": true, + "dependencies": { + "ee-first": "1.1.1" }, "engines": { - "node": ">=4" + "node": ">= 0.8" } }, - "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==" + "node_modules/send/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true, + "peer": true + }, + "node_modules/send/node_modules/statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } }, "node_modules/serialize-javascript": { "version": "6.0.2", @@ -23925,20 +25174,115 @@ "randombytes": "^2.1.0" } }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "peer": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "peer": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true, + "peer": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "peer": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true, + "peer": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "peer": true, "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" + "parseurl": "~1.3.2", + "send": "0.16.2" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", + "dev": true, + "peer": true + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -24208,6 +25552,66 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, + "node_modules/socket.io": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", + "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", + "dev": true, + "peer": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "dev": true, + "peer": true, + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.17.1" + } + }, + "node_modules/socket.io-client": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.5.tgz", + "integrity": "sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==", + "dev": true, + "peer": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dev": true, + "peer": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/sort-asc": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/sort-asc/-/sort-asc-0.2.0.tgz", @@ -24304,9 +25708,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", - "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", + "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", "dev": true }, "node_modules/split-string": { @@ -24481,14 +25885,39 @@ "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", "dev": true }, - "node_modules/streamx": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.16.1.tgz", - "integrity": "sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==", + "node_modules/stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==", "dev": true, + "peer": true, "dependencies": { - "fast-fifo": "^1.1.0", - "queue-tick": "^1.0.1" + "commander": "^2.2.0", + "limiter": "^1.0.5" + }, + "bin": { + "throttleproxy": "bin/throttleproxy.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/stream-throttle/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "peer": true + }, + "node_modules/streamx": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", + "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", + "dev": true, + "dependencies": { + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" }, "optionalDependencies": { "bare-events": "^2.2.0" @@ -24749,6 +26178,7 @@ "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, "dependencies": { "fs.realpath": "^1.0.0", @@ -24777,6 +26207,12 @@ "node": "*" } }, + "node_modules/stylus/node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "dev": true + }, "node_modules/stylus/node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -24803,9 +26239,9 @@ } }, "node_modules/superagent": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-9.0.1.tgz", - "integrity": "sha512-CcRSdb/P2oUVaEpQ87w9Obsl+E9FruRd6b2b7LdiBtJoyMr2DQt7a89anAfiX/EL59j9b2CbRFvf2S91DhuCww==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-9.0.2.tgz", + "integrity": "sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==", "dev": true, "dependencies": { "component-emitter": "^1.3.0", @@ -24816,8 +26252,7 @@ "formidable": "^3.5.1", "methods": "^1.1.2", "mime": "2.6.0", - "qs": "^6.11.0", - "semver": "^7.3.8" + "qs": "^6.11.0" }, "engines": { "node": ">=14.18.0" @@ -25033,6 +26468,7 @@ "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, "dependencies": { "fs.realpath": "^1.0.0", @@ -25065,6 +26501,7 @@ "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -25104,9 +26541,9 @@ } }, "node_modules/terser": { - "version": "5.30.4", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.4.tgz", - "integrity": "sha512-xRdd0v64a8mFK9bnsKVdoNP9GQIKUAaJPTaqEQDL4w/J8WaW4sWXXoMZ+6SimPkfT5bElreXf8m9HnmPc3E1BQ==", + "version": "5.31.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", + "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", "dev": true, "peer": true, "dependencies": { @@ -25211,6 +26648,7 @@ "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, "dependencies": { "fs.realpath": "^1.0.0", @@ -25239,6 +26677,15 @@ "node": "*" } }, + "node_modules/text-decoder": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.0.tgz", + "integrity": "sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4" + } + }, "node_modules/text-encoding-polyfill": { "version": "0.6.7", "resolved": "https://registry.npmjs.org/text-encoding-polyfill/-/text-encoding-polyfill-0.6.7.tgz", @@ -25379,9 +26826,9 @@ } }, "node_modules/tocbot": { - "version": "4.27.13", - "resolved": "https://registry.npmjs.org/tocbot/-/tocbot-4.27.13.tgz", - "integrity": "sha512-zS8GVVg14x/KBTxbvF6s3BNLltfMNZxTPaBpj+FjuwmnSv+ZK0trNN4uV5Ptw64NLFi2E30gt33+/a1Fkt3cWQ==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/tocbot/-/tocbot-4.28.2.tgz", + "integrity": "sha512-/MaSa9xI6mIo84IxqqliSCtPlH0oy7sLcY9s26qPMyH/2CxtZ2vNAXYlIdEQ7kjAkCQnc0rbLygf//F5c663oQ==", "dev": true }, "node_modules/toidentifier": { @@ -25399,9 +26846,9 @@ "dev": true }, "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "dev": true, "dependencies": { "psl": "^1.1.33", @@ -25545,9 +26992,9 @@ } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, "node_modules/tus-js-client": { "version": "4.1.0", @@ -25601,9 +27048,9 @@ } }, "node_modules/type-fest": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.18.0.tgz", - "integrity": "sha512-+dbmiyliDY/2TTcjCS7NpI9yV2iEFlUDk5TKnsbkN7ZoRu5s7bT+zvYtNFhFXC2oLwURGT2frACAZvbbyNBI+w==", + "version": "4.20.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.20.1.tgz", + "integrity": "sha512-R6wDsVsoS9xYOpy8vgeBlqpdOyzJ12HNfQhC/aAKWM3YoCV9TtunJzh/QpkMgeDhkoynDcw5f1y+qF9yc/HHyg==", "dev": true, "engines": { "node": ">=16" @@ -25785,6 +27232,30 @@ "integrity": "sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg==", "dev": true }, + "node_modules/ua-parser-js": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.38.tgz", + "integrity": "sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "peer": true, + "engines": { + "node": "*" + } + }, "node_modules/ufo": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", @@ -25792,9 +27263,9 @@ "dev": true }, "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.18.0.tgz", + "integrity": "sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==", "dev": true, "optional": true, "bin": { @@ -25985,9 +27456,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", "dev": true, "funding": [ { @@ -26004,8 +27475,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -26014,191 +27485,597 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-join": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", + "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "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==" + }, + "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==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/value-or-promise": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.12.tgz", + "integrity": "sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==", + "engines": { + "node": ">=12" + } + }, + "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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.1.tgz", + "integrity": "sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz", + "integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/url-join": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", - "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=12" } }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=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==" - }, - "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==", + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">= 0.4.0" + "node": ">=12" } }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" + "optional": true, + "os": [ + "openbsd" ], - "bin": { - "uuid": "dist/bin/uuid" + "engines": { + "node": ">=12" } }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" } }, - "node_modules/value-or-promise": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.12.tgz", - "integrity": "sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==", + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { "node": ">=12" } }, - "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==", + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.8" + "node": ">=12" } }, - "node_modules/vite": { - "version": "5.2.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz", - "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==", + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "esbuild": "^0.20.1", - "postcss": "^8.4.38", - "rollup": "^4.13.0" - }, - "bin": { - "vite": "bin/vite.js" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } + "node": ">=12" } }, - "node_modules/vite-node": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.5.2.tgz", - "integrity": "sha512-Y8p91kz9zU+bWtF7HGt6DVw2JbhyuB2RlZix3FPYAYmUyZ3n7iTp8eSyLyY6sxtPegvxQtmlTMhfPhUfCUF93A==", + "node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^5.0.0" - }, + "hasInstallScript": true, "bin": { - "vite-node": "vite-node.mjs" + "esbuild": "bin/esbuild" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": ">=12" }, - "funding": { - "url": "https://opencollective.com/vitest" + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/vitest": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.5.2.tgz", - "integrity": "sha512-l9gwIkq16ug3xY7BxHwcBQovLZG75zZL0PlsiYQbf76Rz6QGs54416UWMtC0jXeihvHvcHrf2ROEjkQRVpoZYw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.0.tgz", + "integrity": "sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==", "dev": true, "dependencies": { - "@vitest/expect": "1.5.2", - "@vitest/runner": "1.5.2", - "@vitest/snapshot": "1.5.2", - "@vitest/spy": "1.5.2", - "@vitest/utils": "1.5.2", + "@vitest/expect": "1.6.0", + "@vitest/runner": "1.6.0", + "@vitest/snapshot": "1.6.0", + "@vitest/spy": "1.6.0", + "@vitest/utils": "1.6.0", "acorn-walk": "^8.3.2", "chai": "^4.3.10", "debug": "^4.3.4", @@ -26212,7 +28089,7 @@ "tinybench": "^2.5.1", "tinypool": "^0.8.3", "vite": "^5.0.0", - "vite-node": "1.5.2", + "vite-node": "1.6.0", "why-is-node-running": "^2.2.2" }, "bin": { @@ -26227,8 +28104,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.5.2", - "@vitest/ui": "1.5.2", + "@vitest/browser": "1.6.0", + "@vitest/ui": "1.6.0", "happy-dom": "*", "jsdom": "*" }, @@ -26262,6 +28139,12 @@ "node": ">=0.10.0" } }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "dev": true + }, "node_modules/vt-pbf": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", @@ -26295,15 +28178,15 @@ } }, "node_modules/vue-component-meta": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/vue-component-meta/-/vue-component-meta-2.0.14.tgz", - "integrity": "sha512-6ycN+5bkLLNsjno5pX+OFmFxrAXllJo95lk7jPD7g7cbtWsZY5F+pg+/YMXldHA36STrBHTfCu5QoklDV9Gynw==", + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/vue-component-meta/-/vue-component-meta-2.0.21.tgz", + "integrity": "sha512-K7B/wu1nrtYnrDkCkrqqllIe2bxbKNtQG/kc/cquMNw0PYt5xbnAItXZLhC2tHtiIlw6DPYFKpAhnFDi2NGqeA==", "dev": true, "dependencies": { - "@volar/typescript": "2.2.0-alpha.10", - "@vue/language-core": "2.0.14", + "@volar/typescript": "~2.3.0-alpha.15", + "@vue/language-core": "2.0.21", "path-browserify": "^1.0.1", - "vue-component-type-helpers": "2.0.14" + "vue-component-type-helpers": "2.0.21" }, "peerDependencies": { "typescript": "*" @@ -26315,9 +28198,9 @@ } }, "node_modules/vue-component-type-helpers": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.0.14.tgz", - "integrity": "sha512-DInfgOyXlMyliyqAAD9frK28tTfch0+tMi4qoWJcZlRxUf+NFAtraJBnAsKLep+FOyLMiajkhfyEb3xLK08i7w==", + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.0.21.tgz", + "integrity": "sha512-3NaicyZ7N4B6cft4bfb7dOnPbE9CjLcx+6wZWAg5zwszfO4qXRh+U52dN5r5ZZfc6iMaxKCEcoH9CmxxoFZHLg==", "dev": true }, "node_modules/vue-docgen-api": { @@ -26353,9 +28236,9 @@ } }, "node_modules/vue-eslint-parser": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz", - "integrity": "sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==", + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", + "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==", "dev": true, "peer": true, "dependencies": { @@ -26427,9 +28310,9 @@ } }, "node_modules/vue-router": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.3.2.tgz", - "integrity": "sha512-hKQJ1vDAZ5LVkKEnHhmm1f9pMiWIBNGF5AwU67PdH7TyXCj/a4hTccuUuYCAMgJK6rO/NVYtQIEN3yL8CECa7Q==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.3.3.tgz", + "integrity": "sha512-8Q+u+WP4N2SXY38FDcF2H1dUEbYVHVPtPCPZj/GTZx8RCbiB8AtJP9+YIxn4Vs0svMTNQcLIzka4GH7Utkx9xQ==", "dev": true, "dependencies": { "@vue/devtools-api": "^6.5.1" @@ -26504,9 +28387,9 @@ } }, "node_modules/webpack": { - "version": "5.91.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", - "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", + "version": "5.92.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.0.tgz", + "integrity": "sha512-Bsw2X39MYIgxouNATyVpCNVWBCuUwDgWtN78g6lSdPJRLaQ/PUVm/oXcaRAyY/sMFoKFQrsPeqvTizWtq7QPCA==", "dev": true, "peer": true, "dependencies": { @@ -26516,10 +28399,10 @@ "@webassemblyjs/wasm-edit": "^1.12.1", "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", + "acorn-import-attributes": "^1.9.5", "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.16.0", + "enhanced-resolve": "^5.17.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -26561,15 +28444,15 @@ } }, "node_modules/webpack-virtual-modules": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.1.tgz", - "integrity": "sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", "dev": true }, "node_modules/webpack/node_modules/es-module-lexer": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.2.tgz", - "integrity": "sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz", + "integrity": "sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==", "dev": true, "peer": true }, @@ -26921,9 +28804,9 @@ "dev": true }, "node_modules/ws": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", - "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, "engines": { "node": ">=10.0.0" @@ -26977,10 +28860,20 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/xstate": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/xstate/-/xstate-5.12.0.tgz", - "integrity": "sha512-4W/Hj553mwVnTLQ1itc3rni/cGtM5OkjyavTjaxCelc0ZZKE/ks6tYllc98KbekIoUrEPm4CJH/wTB5p5pPGEw==", + "version": "5.13.2", + "resolved": "https://registry.npmjs.org/xstate/-/xstate-5.13.2.tgz", + "integrity": "sha512-cFbFJUuK7n8NGe9rsT9G8QjK/8KQO5WaxCkpl1GxnvSDb9oXM/+cbZbEtLT/YaAjDfaGA2nzOKyw5oev2LuNRw==", "funding": { "type": "opencollective", "url": "https://opencollective.com/xstate" @@ -27006,13 +28899,17 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true }, "node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", + "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", "dev": true, + "bin": { + "yaml": "bin.mjs" + }, "engines": { "node": ">= 14" } @@ -27132,10 +29029,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yoctocolors": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.0.2.tgz", + "integrity": "sha512-Ct97huExsu7cWeEjmrXlofevF8CvzUglJ4iGUet5B8xn1oumtAZBpHU4GzYuoE6PVqcZ5hghtBrSlhwHuR1Jmw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zod": { - "version": "3.23.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.4.tgz", - "integrity": "sha512-/AtWOKbBgjzEYYQRNfoGKHObgfAZag6qUJX1VbHo2PRBgS+wfWagEY2mizjfyAPcGesrJOcx/wcl0L9WnVrHFw==", + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -27202,8 +29111,8 @@ "@types/pg-large-object": "^2.0.7", "@types/stream-json": "^1.7.7", "@types/supertest": "^6.0.2", - "@typescript-eslint/eslint-plugin": "^7.7.1", - "@typescript-eslint/parser": "^7.7.1", + "@typescript-eslint/eslint-plugin": "^7.12.0", + "@typescript-eslint/parser": "^7.12.0", "@vitest/coverage-v8": "^1.5.2", "carbone": "^3.5.5", "eslint": "^8.56.0", @@ -27226,8 +29135,8 @@ "zod": "^3.23.4" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "^7.7.1", - "@typescript-eslint/parser": "^7.7.1", + "@typescript-eslint/eslint-plugin": "^7.12.0", + "@typescript-eslint/parser": "^7.12.0", "@vitest/coverage-v8": "^1.5.2", "prettier": "^3.2.5", "typescript": "^5.4.5", @@ -27258,8 +29167,8 @@ "@types/geojson": "^7946.0.14", "@types/leaflet": "^1.9.12", "@types/leaflet.markercluster": "^1.5.4", - "@typescript-eslint/eslint-plugin": "^7.7.1", - "@typescript-eslint/parser": "^7.7.1", + "@typescript-eslint/eslint-plugin": "^7.12.0", + "@typescript-eslint/parser": "^7.12.0", "@uppy/core": "^3.10.1", "@uppy/tus": "^3.5.4", "@vitejs/plugin-vue-jsx": "^3.1.0", @@ -27300,6 +29209,7 @@ "rollup-plugin-visualizer": "^5.12.0", "storybook": "8.0.9", "storybook-vue3-router": "^5.0.0", + "ts-node": "^10.9.2", "tus-js-client": "^4.1.0", "typescript": "^5.4.5", "typescript-plugin-css-modules": "^5.1.0", diff --git a/packages/api/package.json b/packages/api/package.json index 96e33d805..414563c9c 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -96,8 +96,8 @@ "@types/pg-large-object": "^2.0.7", "@types/stream-json": "^1.7.7", "@types/supertest": "^6.0.2", - "@typescript-eslint/eslint-plugin": "^7.7.1", - "@typescript-eslint/parser": "^7.7.1", + "@typescript-eslint/eslint-plugin": "^7.12.0", + "@typescript-eslint/parser": "^7.12.0", "@vitest/coverage-v8": "^1.5.2", "carbone": "^3.5.5", "eslint": "^8.56.0", diff --git a/packages/api/src/api/_format/titres-etapes.ts b/packages/api/src/api/_format/titres-etapes.ts index dc1bed14f..c469b5dea 100644 --- a/packages/api/src/api/_format/titres-etapes.ts +++ b/packages/api/src/api/_format/titres-etapes.ts @@ -1,8 +1,143 @@ +import { FlattenEtape, defaultHeritageProps, flattenEtapeValidator, heritageContenuValidator } from 'camino-common/src/etape-form.js' +import { simpleContenuToFlattenedContenu } from 'camino-common/src/sections.js' +import { isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools.js' import { ITitreEtape } from '../../types.js' import { titreEtapeFormatFields } from './_fields.js' import { titreDemarcheFormat } from './titres-demarches.js' +import { EtapesTypes } from 'camino-common/src/static/etapesTypes.js' +const getPerimetreFromITitreEtape = ( + titreEtape: Pick< + ITitreEtape, + 'geojson4326Perimetre' | 'geojson4326Points' | 'geojsonOriginePerimetre' | 'geojsonOriginePoints' | 'geojson4326Forages' | 'geojsonOrigineForages' | 'geojsonOrigineGeoSystemeId' | 'surface' + > +): FlattenEtape['perimetre']['value'] => ({ + geojson4326Perimetre: titreEtape.geojson4326Perimetre ?? null, + geojson4326Points: titreEtape.geojson4326Points ?? null, + geojsonOriginePerimetre: titreEtape.geojsonOriginePerimetre ?? null, + geojsonOriginePoints: titreEtape.geojsonOriginePoints ?? null, + geojson4326Forages: titreEtape.geojson4326Forages ?? null, + geojsonOrigineForages: titreEtape.geojsonOrigineForages ?? null, + geojsonOrigineGeoSystemeId: titreEtape.geojsonOrigineGeoSystemeId ?? null, + surface: titreEtape.surface ?? null, +}) + +export const iTitreEtapeToFlattenEtape = (titreEtape: ITitreEtape): FlattenEtape => { + const titreTypeId = titreEtape.demarche?.titre?.typeId + const demarcheTypeId = titreEtape.demarche?.typeId + const heritageProps = EtapesTypes[titreEtape.typeId].fondamentale ? titreEtape.heritageProps : defaultHeritageProps + const heritageContenu = titreEtape.heritageContenu + const slug = titreEtape.slug + if (isNullOrUndefined(titreTypeId)) { + throw new Error('pas de démarche ou de titre chargé') + } + if (isNullOrUndefined(demarcheTypeId)) { + throw new Error('pas de démarche chargée') + } + if (isNullOrUndefined(heritageProps)) { + throw new Error("pas d'héritage chargé") + } + + if (isNullOrUndefined(slug)) { + throw new Error('pas de slug') + } + const contenu = simpleContenuToFlattenedContenu(titreTypeId, demarcheTypeId, titreEtape.typeId, titreEtape.contenu ?? {}, heritageContenuValidator.parse(heritageContenu)) + const flattenEtape: FlattenEtape = { + ...titreEtape, + slug, + notes: titreEtape.notes ?? null, + duree: { + value: (heritageProps.duree.actif ? heritageProps.duree.etape?.duree : titreEtape.duree) ?? null, + heritee: heritageProps.duree.actif, + etapeHeritee: isNotNullNorUndefined(heritageProps.duree.etape) + ? { + etapeTypeId: heritageProps.duree.etape.typeId, + date: heritageProps.duree.etape.date, + value: heritageProps.duree.etape.duree ?? null, + } + : null, + }, + perimetre: { + value: heritageProps.perimetre.actif + ? isNotNullNorUndefined(heritageProps.perimetre.etape) + ? getPerimetreFromITitreEtape(heritageProps.perimetre.etape) + : null + : getPerimetreFromITitreEtape(titreEtape), + + heritee: heritageProps.perimetre.actif, + etapeHeritee: isNotNullNorUndefined(heritageProps.perimetre.etape) + ? { + etapeTypeId: heritageProps.perimetre.etape.typeId, + date: heritageProps.perimetre.etape.date, + value: getPerimetreFromITitreEtape(heritageProps.perimetre.etape), + } + : null, + }, + dateDebut: { + value: (heritageProps.dateDebut.actif ? heritageProps.dateDebut.etape?.dateDebut : titreEtape.dateDebut) ?? null, + heritee: heritageProps.dateDebut.actif, + etapeHeritee: isNotNullNorUndefined(heritageProps.dateDebut.etape) + ? { + etapeTypeId: heritageProps.dateDebut.etape.typeId, + date: heritageProps.dateDebut.etape.date, + value: heritageProps.dateDebut.etape.dateDebut ?? null, + } + : null, + }, + dateFin: { + value: (heritageProps.dateFin.actif ? heritageProps.dateFin.etape?.dateFin : titreEtape.dateFin) ?? null, + heritee: heritageProps.dateFin.actif, + etapeHeritee: isNotNullNorUndefined(heritageProps.dateFin.etape) + ? { + etapeTypeId: heritageProps.dateFin.etape.typeId, + date: heritageProps.dateFin.etape.date, + value: heritageProps.dateFin.etape.dateFin ?? null, + } + : null, + }, + substances: { + value: (heritageProps.substances.actif ? (isNotNullNorUndefined(heritageProps.substances.etape) ? heritageProps.substances.etape.substances : []) : titreEtape.substances) ?? [], + + heritee: heritageProps.substances.actif, + etapeHeritee: isNotNullNorUndefined(heritageProps.substances.etape) + ? { + etapeTypeId: heritageProps.substances.etape.typeId, + date: heritageProps.substances.etape.date, + value: heritageProps.substances.etape.substances ?? [], + } + : null, + }, + amodiataires: { + value: (heritageProps.amodiataires.actif ? (isNotNullNorUndefined(heritageProps.amodiataires.etape) ? heritageProps.amodiataires.etape.amodiataireIds : []) : titreEtape.amodiataireIds) ?? [], + + heritee: heritageProps.amodiataires.actif, + etapeHeritee: isNotNullNorUndefined(heritageProps.amodiataires.etape) + ? { + etapeTypeId: heritageProps.amodiataires.etape.typeId, + date: heritageProps.amodiataires.etape.date, + value: heritageProps.amodiataires.etape.amodiataireIds ?? [], + } + : null, + }, + titulaires: { + value: (heritageProps.titulaires.actif ? (isNotNullNorUndefined(heritageProps.titulaires.etape) ? heritageProps.titulaires.etape.titulaireIds : []) : titreEtape.titulaireIds) ?? [], + + heritee: heritageProps.titulaires.actif, + etapeHeritee: isNotNullNorUndefined(heritageProps.titulaires.etape) + ? { + etapeTypeId: heritageProps.titulaires.etape.typeId, + date: heritageProps.titulaires.etape.date, + value: heritageProps.titulaires.etape.titulaireIds ?? [], + } + : null, + }, + contenu, + } + + // On zod parse ici pour enlever les champs supplémentaires qu'il y'a par exemple dans perimetre + return flattenEtapeValidator.parse(flattenEtape) +} export const titreEtapeFormat = (titreEtape: ITitreEtape, fields = titreEtapeFormatFields) => { if (titreEtape.demarche) { titreEtape.demarche = titreDemarcheFormat(titreEtape.demarche, fields.demarche) diff --git a/packages/api/src/api/graphql/administrations-permissions-etapes.test.integration.ts b/packages/api/src/api/graphql/administrations-permissions-etapes.test.integration.ts index de2207c05..117b3d305 100644 --- a/packages/api/src/api/graphql/administrations-permissions-etapes.test.integration.ts +++ b/packages/api/src/api/graphql/administrations-permissions-etapes.test.integration.ts @@ -1,9 +1,8 @@ import { dbManager } from '../../../tests/db-manager.js' import { creationCheck, visibleCheck } from '../../../tests/_utils/administrations-permissions.js' -import { afterAll, beforeEach, beforeAll, describe, test, vi } from 'vitest' +import { afterAll, beforeAll, describe, test, vi } from 'vitest' import { AdministrationId } from 'camino-common/src/static/administrations.js' import { EtapeTypeId } from 'camino-common/src/static/etapesTypes.js' -import Utilisateurs from '../../database/models/utilisateurs' import type { Pool } from 'pg' vi.mock('../../tools/dir-create', () => ({ __esModule: true, @@ -13,9 +12,6 @@ vi.mock('../../tools/dir-create', () => ({ console.info = vi.fn() console.error = vi.fn() -beforeEach(async () => { - await Utilisateurs.query().delete() -}) let dbPool: Pool beforeAll(async () => { const { pool } = await dbManager.populateDb() @@ -59,9 +55,15 @@ describe('Visibilité des étapes', () => { }) describe('Création des étapes', () => { - test('un utilisateur admin de l’administration min-mtes-dgaln-01 peut créer une étape $etapeTypeId sur un titre CXM', () => creationCheck(dbPool, 'min-mtes-dgaln-01', true, 'etapes', 'cxm')) + test('un utilisateur admin de l’administration min-mtes-dgaln-01 peut créer une étape $etapeTypeId sur un titre CXM', async () => { + await creationCheck(dbPool, 'min-mtes-dgaln-01', true, 'etapes', 'cxm') + }) - test('un utilisateur admin de l’administration "min-mtes-dgaln-01" peut créer une étape mfr sur un titre PRM', () => creationCheck(dbPool, 'min-mtes-dgaln-01', true, 'etapes', 'prm')) + test('un utilisateur admin de l’administration "min-mtes-dgaln-01" peut créer une étape mfr sur un titre PRM', async () => { + await creationCheck(dbPool, 'min-mtes-dgaln-01', true, 'etapes', 'prm') + }) - test('un utilisateur admin de l’administration "min-mtes-dgaln-01" peut créer une étape mfr sur un titre PXM', () => creationCheck(dbPool, 'min-mtes-dgaln-01', true, 'etapes', 'pxm')) + test('un utilisateur admin de l’administration "min-mtes-dgaln-01" peut créer une étape mfr sur un titre PXM', async () => { + await creationCheck(dbPool, 'min-mtes-dgaln-01', true, 'etapes', 'pxm') + }) }) diff --git a/packages/api/src/api/graphql/resolvers.ts b/packages/api/src/api/graphql/resolvers.ts index 8f5199280..1d08d170e 100644 --- a/packages/api/src/api/graphql/resolvers.ts +++ b/packages/api/src/api/graphql/resolvers.ts @@ -2,7 +2,7 @@ import GraphQLJSON from 'graphql-type-json' import { titres, titreCreer } from './resolvers/titres.js' -import { etape, etapeHeritage, etapeCreer, etapeModifier } from './resolvers/titres-etapes.js' +import { etapeHeritage } from './resolvers/titres-etapes.js' import { demarches, demarcheCreer, demarcheModifier, demarcheSupprimer } from './resolvers/titres-demarches.js' @@ -45,7 +45,6 @@ export default { Json: GraphQLJSON, // queries - etape, etapeHeritage, demarches, demarchesTypes, @@ -83,8 +82,6 @@ export default { demarcheCreer, demarcheModifier, demarcheSupprimer, - etapeCreer, - etapeModifier, activiteDeposer, newsletterInscrire, titreDemandeCreer, diff --git a/packages/api/src/api/graphql/resolvers/_titre-etape-email.test.ts b/packages/api/src/api/graphql/resolvers/_titre-etape-email.test.ts index fdcc0f7fd..23d3b2760 100644 --- a/packages/api/src/api/graphql/resolvers/_titre-etape-email.test.ts +++ b/packages/api/src/api/graphql/resolvers/_titre-etape-email.test.ts @@ -3,6 +3,7 @@ import { userSuper } from '../../../database/user-super.js' import { expect, test } from 'vitest' import { UserNotNull } from 'camino-common/src/roles.js' import { newUtilisateurId } from '../../../database/models/_format/id-create.js' +import { ETAPE_IS_NOT_BROUILLON } from 'camino-common/src/etape.js' test('envoie un email sur une étape non existante', () => { const actual = emailsForAdministrationsGet(undefined, '', '', '', userSuper, undefined) @@ -23,7 +24,7 @@ test("envoie un email sur un octroi d'AEX", () => { { typeId: 'mfr', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, }, 'oct', 'titreId', @@ -40,7 +41,7 @@ test("envoie un email sur un octroi d'ARM", () => { { typeId: 'mdp', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, }, 'oct', 'titreId', diff --git a/packages/api/src/api/graphql/resolvers/_titre-etape-email.ts b/packages/api/src/api/graphql/resolvers/_titre-etape-email.ts index aa4d0bb10..7fd1a6a2a 100644 --- a/packages/api/src/api/graphql/resolvers/_titre-etape-email.ts +++ b/packages/api/src/api/graphql/resolvers/_titre-etape-email.ts @@ -8,6 +8,7 @@ import { EmailAdministration } from '../../../tools/api-mailjet/types.js' import { UserNotNull } from 'camino-common/src/roles.js' import { EtapesTypes } from 'camino-common/src/static/etapesTypes.js' import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools.js' +import { ETAPE_IS_BROUILLON, ETAPE_IS_NOT_BROUILLON } from 'camino-common/src/etape.js' const emailForAdministrationContentFormat = (titreTypeId: string, etapeNom: string, titreId: string, user: UserNotNull) => { const titreUrl = titreUrlGet(titreId) @@ -43,7 +44,7 @@ export const emailsForAdministrationsGet = ( if (demarcheTypeId === 'oct' && titreTypeId === 'arm') { // lorsque la demande est déposée - if (!etape.isBrouillon && (oldEtape?.isBrouillon ?? true)) { + if (etape.isBrouillon === ETAPE_IS_NOT_BROUILLON && (oldEtape?.isBrouillon ?? ETAPE_IS_BROUILLON) === ETAPE_IS_BROUILLON) { emails.push(EmailAdministration.PTMG) emails.push(EmailAdministration.ONF) @@ -62,7 +63,7 @@ export const emailsForAdministrationsGet = ( title = 'Nouvelle demande complète' } } else if (demarcheTypeId === 'oct' && titreTypeId === 'axm') { - if (!etape.isBrouillon && (oldEtape?.isBrouillon ?? true)) { + if (etape.isBrouillon === ETAPE_IS_NOT_BROUILLON && (oldEtape?.isBrouillon ?? ETAPE_IS_BROUILLON) === ETAPE_IS_BROUILLON) { emails.push(EmailAdministration.DGTM) title = 'Nouvelle demande déposée' @@ -85,7 +86,14 @@ export const emailsForAdministrationsGet = ( return { subject, content, emails } } -export const titreEtapeAdministrationsEmailsSend = async (etape: ITitreEtape, demarcheTypeId: string, titreId: string, titreTypeId: string, user: UserNotNull, oldEtape?: ITitreEtape) => { +export const titreEtapeAdministrationsEmailsSend = async ( + etape: Pick<ITitreEtape, 'typeId' | 'statutId' | 'isBrouillon'>, + demarcheTypeId: string, + titreId: string, + titreTypeId: string, + user: UserNotNull, + oldEtape?: ITitreEtape +) => { const emailsForAdministrations = emailsForAdministrationsGet(etape, demarcheTypeId, titreId, titreTypeId, user, oldEtape) if (emailsForAdministrations) { diff --git a/packages/api/src/api/graphql/resolvers/titres-etapes.test.ts b/packages/api/src/api/graphql/resolvers/titres-etapes.test.ts deleted file mode 100644 index 12b7c7a79..000000000 --- a/packages/api/src/api/graphql/resolvers/titres-etapes.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { expect, test } from 'vitest' -import { arePointsOnPerimeter } from './titres-etapes' -import { FeatureMultiPolygon } from 'camino-common/src/perimetre' - -const bigGeoJson: FeatureMultiPolygon = { - type: 'Feature', - properties: {}, - geometry: { - type: 'MultiPolygon', - // prettier-ignore - "coordinates": [ [ [ [ -4.370364497124209, 48.53380508608616 ], [ -4.373271574712479, 48.47151134163559 ], [ -4.03753485335386, 48.579164636474836 ], [ -3.89919702975027, 48.603980178934115 ], [ -3.860482328708233, 48.62511389817695 ], [ -3.858436311611334, 48.629031691751045 ], [ -3.862157259991486, 48.633014015139416 ], [ -3.870281882041237, 48.63550010399696 ], [ -3.879786359001045, 48.639113643702565 ], [ -3.895430188480503, 48.64455770816115 ], [ -3.89902273351368, 48.64822789311303 ], [ -3.902536979616769, 48.654435032933826 ], [ -3.906528075174153, 48.66061643462235 ], [ -3.904489574558275, 48.6643307169305 ], [ -3.89647573803132, 48.66601900245078 ], [ -3.890673665115296, 48.667020244464325 ], [ -3.890721315690864, 48.67062455977177 ], [ -3.892950905315848, 48.67088770685571 ], [ -3.898005277721187, 48.6723935639094 ], [ -3.8992413951649, 48.67074624589731 ], [ -3.903300809713803, 48.67034264689684 ], [ -3.907548440632195, 48.66910635173531 ], [ -3.91185396569359, 48.669954398127075 ], [ -3.914635548862354, 48.67322568941628 ], [ -3.920575104032537, 48.67458696237509 ], [ -3.924157593611878, 48.669749821082725 ], [ -3.927138109422188, 48.66538094626539 ], [ -3.927802453245391, 48.66178827244388 ], [ -3.92880004801291, 48.660065331624466 ], [ -3.930674658925236, 48.657424523021 ], [ -3.934385020441046, 48.65730036039394 ], [ -3.940574301992641, 48.65682750256307 ], [ -3.949892212356874, 48.653210569309856 ], [ -3.9518951695476, 48.64983646195122 ], [ -3.95135848409069, 48.646306571150944 ], [ -3.952791103114349, 48.64456097348628 ], [ -3.954311041643234, 48.64535110107629 ], [ -3.957178207067545, 48.65093506946735 ], [ -3.95632686509049, 48.654756209794456 ], [ -3.954939197043658, 48.66049485799891 ], [ -3.958264581105623, 48.66351217516115 ], [ -3.954301077151103, 48.665175330569724 ], [ -3.958113788215813, 48.66678821578858 ], [ -3.958288500972019, 48.67004622329816 ], [ -3.953583216471425, 48.67102223996598 ], [ -3.952154912225681, 48.67280542236 ], [ -3.954601922703807, 48.67354649576719 ], [ -3.957150323952388, 48.6728667311387 ], [ -3.962232217223142, 48.674085603023535 ], [ -3.96509885038279, 48.67647290565392 ], [ -3.968196892552599, 48.67354977814375 ], [ -3.970552500285286, 48.67336152037275 ], [ -3.971907150463719, 48.67429537178488 ], [ -3.971687730880199, 48.67565139942766 ], [ -3.968925351937541, 48.67998621214178 ], [ -3.97276835094199, 48.68681279071675 ], [ -3.969905040239144, 48.687617856017994 ], [ -3.967785856011854, 48.69274164929216 ], [ -3.97050395358365, 48.693904041872074 ], [ -3.974129066864182, 48.69665141578885 ], [ -3.976827175680581, 48.699084231748806 ], [ -3.973964059500176, 48.70207052891004 ], [ -3.97557715354335, 48.70449012698265 ], [ -3.972337757698344, 48.70582333762662 ], [ -3.974038535718974, 48.710344199247295 ], [ -3.972061362590358, 48.71168433267898 ], [ -3.969407494937729, 48.71919463600953 ], [ -3.966114995158957, 48.719188628020184 ], [ -3.964815895310649, 48.72248973384656 ], [ -3.968123622922862, 48.72216808659624 ], [ -3.970117554054281, 48.7239825094888 ], [ -3.971030085004171, 48.72531725688056 ], [ -3.974105493634571, 48.72442714535237 ], [ -3.977130032296356, 48.72223266964199 ], [ -3.98038470744471, 48.72282149601802 ], [ -3.98267568678471, 48.72451484026706 ], [ -3.983159793997456, 48.72623219482621 ], [ -3.985655519886893, 48.726898196761965 ], [ -3.988412331317411, 48.727004809776105 ], [ -3.990251104366354, 48.72588975599552 ], [ -3.992106999472123, 48.723541171653366 ], [ -3.992308257471176, 48.72204072794657 ], [ -3.990818477440011, 48.71838055340067 ], [ -3.993241558794496, 48.715311146944074 ], [ -3.99726181945054, 48.71273584775902 ], [ -4.000886986292233, 48.71141716999743 ], [ -4.005573266114372, 48.715195490443925 ], [ -4.004640753163968, 48.716989015759715 ], [ -4.007861713401779, 48.72044675798358 ], [ -4.009590286562232, 48.72068101995395 ], [ -4.012907971574204, 48.71865165832863 ], [ -4.010881803078078, 48.716872551149415 ], [ -4.013298574720932, 48.713765123429766 ], [ -4.018283788022766, 48.71146515516518 ], [ -4.02502266800395, 48.710486602386844 ], [ -4.029102910364339, 48.7109751516783 ], [ -4.032895375568785, 48.712496949149184 ], [ -4.034013864663466, 48.71364906002572 ], [ -4.035203599079426, 48.71386049099469 ], [ -4.036426674181452, 48.711761570746404 ], [ -4.035857818689737, 48.70935978588029 ], [ -4.037836186006247, 48.70536884991981 ], [ -4.040876440962449, 48.70331706201061 ], [ -4.042661395770205, 48.70267658451317 ], [ -4.044522857875245, 48.70264835316387 ], [ -4.048746772595955, 48.70536952092104 ], [ -4.051782617787177, 48.70458102418029 ], [ -4.053387641319855, 48.70237110662314 ], [ -4.054960885021424, 48.69887510664347 ], [ -4.057098904957046, 48.688336149296134 ], [ -4.047492224129947, 48.6881905546806 ], [ -4.04264615919883, 48.688356681641565 ], [ -4.05570877851515, 48.685187990084636 ], [ -4.061384711067841, 48.687678086132514 ], [ -4.063856568443375, 48.68626486757381 ], [ -4.069006699782528, 48.687977416990556 ], [ -4.066114156101222, 48.68600063748565 ], [ -4.065917761777147, 48.68383188367652 ], [ -4.06536435070835, 48.68281963355705 ], [ -4.062811851052143, 48.68243638561189 ], [ -4.063604286352126, 48.680735563101265 ], [ -4.061249339782617, 48.68019915458731 ], [ -4.060491984152113, 48.67893668983929 ], [ -4.056630622211962, 48.67523642323898 ], [ -4.055350396131191, 48.67179995101334 ], [ -4.057224936686009, 48.670572879663034 ], [ -4.057969445321888, 48.675068847630506 ], [ -4.059622862128396, 48.675122344607715 ], [ -4.06024682153259, 48.67613145254186 ], [ -4.063213863275964, 48.67815002912692 ], [ -4.064507934140134, 48.677605925445725 ], [ -4.067195178609656, 48.67891661518815 ], [ -4.068000601946539, 48.68272446881325 ], [ -4.07116708376152, 48.68462241191764 ], [ -4.080222240659125, 48.689712089777736 ], [ -4.082890717412141, 48.693212237422216 ], [ -4.0837341887691, 48.69168549285934 ], [ -4.08645810312384, 48.69005696722575 ], [ -4.08922980276701, 48.69161527586137 ], [ -4.091651149022687, 48.69171173600047 ], [ -4.095188717132302, 48.686965610139666 ], [ -4.097383839952319, 48.69356464812578 ], [ -4.102536986221444, 48.69351221259058 ], [ -4.106197887484285, 48.692515838515405 ], [ -4.109568285925066, 48.69472448012849 ], [ -4.115803404112282, 48.69506791354793 ], [ -4.118098969264236, 48.692778728280935 ], [ -4.12511664716867, 48.693877169595176 ], [ -4.127837461875522, 48.69361476668908 ], [ -4.131236501370729, 48.6960475956426 ], [ -4.136181126707938, 48.69293107079426 ], [ -4.142132619722753, 48.69237814384752 ], [ -4.150020162763907, 48.69217377284019 ], [ -4.152170300893284, 48.691487051119246 ], [ -4.162483098525137, 48.68833023827453 ], [ -4.174170898732186, 48.657628672506775 ], [ -4.409843663429304, 48.633874515395604 ], [ -4.370364497124209, 48.53380508608616 ] - ] - ] - ], - }, -} - -test('arePointsOnPerimeter', () => { - expect(arePointsOnPerimeter(bigGeoJson, { type: 'FeatureCollection', features: [{ type: 'Feature', properties: {}, geometry: { type: 'Point', coordinates: [1, 2] } }] })).toBe(false) - expect( - arePointsOnPerimeter(bigGeoJson, { type: 'FeatureCollection', features: [{ type: 'Feature', properties: {}, geometry: { type: 'Point', coordinates: [-4.174170898732186, 48.657628672506775] } }] }) - ).toBe(true) -}) - -test('arePointsOnPerimeter every point is on the perimeter', () => { - expect( - arePointsOnPerimeter(bigGeoJson, { - type: 'FeatureCollection', - features: bigGeoJson.geometry.coordinates.flatMap(coordinates => - coordinates.flatMap(sub => sub.flatMap(coordinate => ({ type: 'Feature', properties: {}, geometry: { type: 'Point', coordinates: [coordinate[0], coordinate[1]] } }))) - ), - }) - ).toBe(true) -}) diff --git a/packages/api/src/api/graphql/resolvers/titres-etapes.ts b/packages/api/src/api/graphql/resolvers/titres-etapes.ts index 73b1a3a11..bdd6d1a82 100644 --- a/packages/api/src/api/graphql/resolvers/titres-etapes.ts +++ b/packages/api/src/api/graphql/resolvers/titres-etapes.ts @@ -1,106 +1,16 @@ -import { GraphQLResolveInfo } from 'graphql' +import { Context } from '../../../types.js' -import { Context, ITitre, ITitreEtape } from '../../../types.js' - -import { titreEtapeGet, titreEtapeUpsert } from '../../../database/queries/titres-etapes.js' import { titreDemarcheGet } from '../../../database/queries/titres-demarches.js' -import { titreEtapeUpdateTask } from '../../../business/titre-etape-update.js' import { titreEtapeHeritageBuild } from './_titre-etape.js' -import { titreEtapeUpdationValidate } from '../../../business/validations/titre-etape-updation-validate.js' -import { fieldsBuild } from './_fields-build.js' import { titreEtapeFormat } from '../../_format/titres-etapes.js' import { userSuper } from '../../../database/user-super.js' -import { titreEtapeAdministrationsEmailsSend, titreEtapeUtilisateursEmailsSend } from './_titre-etape-email.js' -import { EtapeTypeId, canBeBrouillon } from 'camino-common/src/static/etapesTypes.js' -import { isNonEmptyArray, isNotNullNorUndefined, isNullOrUndefined, onlyUnique } from 'camino-common/src/typescript-tools.js' -import { User } from 'camino-common/src/roles.js' +import { EtapeTypeId } from 'camino-common/src/static/etapesTypes.js' import { CaminoDate } from 'camino-common/src/date.js' import { titreEtapeFormatFields } from '../../_format/_fields.js' -import { canCreateEtape, canEditDates, canEditDuree, canEditEtape } from 'camino-common/src/permissions/titres-etapes.js' -import { TitresStatutIds } from 'camino-common/src/static/titresStatuts.js' -import { - EtapeId, - documentComplementaireAslEtapeDocumentModificationValidator, - documentComplementaireDaeEtapeDocumentModificationValidator, - etapeDocumentModificationValidator, - needAslAndDae, - tempEtapeDocumentValidator, -} from 'camino-common/src/etape.js' -import { checkEntreprisesExist, getEntrepriseDocuments } from '../../rest/entreprises.queries.js' -import { deleteTitreEtapeEntrepriseDocument, insertEtapeDocuments, insertTitreEtapeEntrepriseDocument, updateEtapeDocuments } from '../../../database/queries/titres-etapes.queries.js' -import { EntrepriseDocument, EntrepriseId } from 'camino-common/src/entreprise.js' -import { Pool } from 'pg' -import { convertPoints, getGeojsonInformation } from '../../rest/perimetre.queries.js' -import { SDOMZoneId } from 'camino-common/src/static/sdom.js' -import { getSecteurMaritime } from 'camino-common/src/static/facades.js' -import { FeatureCollectionPoints, FeatureMultiPolygon, equalGeojson } from 'camino-common/src/perimetre.js' -import { FieldsEtape } from '../../../database/queries/_options' -import { canHaveForages } from 'camino-common/src/permissions/titres.js' -import { GEO_SYSTEME_IDS } from 'camino-common/src/static/geoSystemes.js' -import { TitreTypeId } from 'camino-common/src/static/titresTypes.js' -import { getEtapeByDemarcheIdAndEtapeTypeId } from '../../rest/etapes.queries.js' +import { EtapeId } from 'camino-common/src/etape.js' import { DemarcheId } from 'camino-common/src/demarche.js' -import { z } from 'zod' - -export const etape = async ({ id }: { id: EtapeId }, { user }: Context, info: GraphQLResolveInfo) => { - try { - const fields: FieldsEtape = fieldsBuild(info) - - if (isNullOrUndefined(fields.demarche)) { - fields.demarche = { titre: { pointsEtape: { id: {} } } } - } - if (isNullOrUndefined(fields.demarche.titre)) { - fields.demarche.titre = { pointsEtape: { id: {} } } - } - if (isNullOrUndefined(fields.demarche.titre.pointsEtape)) { - fields.demarche.titre.pointsEtape = { id: {} } - } - - const titreEtape = await titreEtapeGet(id, { fields, fetchHeritage: true }, user) - - if (isNullOrUndefined(titreEtape)) { - throw new Error("l'étape n'existe pas") - } - if ( - isNullOrUndefined(titreEtape.titulaireIds) || - !titreEtape.demarche || - !titreEtape.demarche.titre || - titreEtape.demarche.titre.administrationsLocales === undefined || - !titreEtape.demarche.titre.titreStatutId - ) { - throw new Error('la démarche n’est pas chargée complètement') - } - - // Cette route est utilisée que par l’ancienne interface qui permet d’éditer une étape. Graphql permet de récupérer trop de champs si on ne fait pas ça. - if ( - !canEditEtape(user, titreEtape.typeId, titreEtape.isBrouillon, titreEtape.titulaireIds ?? [], titreEtape.demarche.titre.administrationsLocales ?? [], titreEtape.demarche.typeId, { - typeId: titreEtape.demarche.titre.typeId, - titreStatutId: titreEtape.demarche.titre.titreStatutId, - }) - ) - throw new Error('droits insuffisants') - - const titreDemarche = await titreDemarcheGet( - titreEtape.titreDemarcheId, - { - fields: { - id: {}, - }, - }, - user - ) - - if (!titreDemarche) throw new Error("la démarche n'existe pas") - - return titreEtapeFormat(titreEtape) - } catch (e) { - console.error(e) - - throw e - } -} export const etapeHeritage = async ({ date, titreDemarcheId, typeId, etapeId }: { date: CaminoDate; titreDemarcheId: DemarcheId; typeId: EtapeTypeId; etapeId: EtapeId | null }, { user }: Context) => { try { @@ -132,425 +42,3 @@ export const etapeHeritage = async ({ date, titreDemarcheId, typeId, etapeId }: throw e } } - -export const arePointsOnPerimeter = (perimetre: FeatureMultiPolygon, points: FeatureCollectionPoints): boolean => { - const coordinatesSet = new Set() - - perimetre.geometry.coordinates.forEach(geometry => geometry.forEach(sub => sub.forEach(coordinate => coordinatesSet.add(`${coordinate[0]}-${coordinate[1]}`)))) - - return points.features.every(point => { - return coordinatesSet.has(`${point.geometry.coordinates[0]}-${point.geometry.coordinates[1]}`) - }) -} - -const getForagesProperties = async ( - titreTypeId: TitreTypeId, - geojsonOrigineGeoSystemeId: ITitreEtape['geojsonOrigineGeoSystemeId'], - geojsonOrigineForages: ITitreEtape['geojsonOrigineForages'], - pool: Pool -): Promise<Pick<ITitreEtape, 'geojson4326Forages' | 'geojsonOrigineForages'>> => { - if (canHaveForages(titreTypeId) && isNotNullNorUndefined(geojsonOrigineForages) && isNotNullNorUndefined(geojsonOrigineGeoSystemeId)) { - return { - geojson4326Forages: await convertPoints(pool, geojsonOrigineGeoSystemeId, GEO_SYSTEME_IDS.WGS84, geojsonOrigineForages), - geojsonOrigineForages, - } - } - - return { - geojson4326Forages: null, - geojsonOrigineForages: null, - } -} - -export const etapeCreer = async ({ etape }: { etape: Omit<ITitreEtape, 'isBrouillon'> & { etapeDocuments: unknown } }, context: Context, info: GraphQLResolveInfo) => { - try { - const user = context.user - if (!user) { - throw new Error("la démarche n'existe pas") - } - - let titreDemarche = await titreDemarcheGet(etape.titreDemarcheId, { fields: {} }, user) - - if (!titreDemarche) throw new Error("la démarche n'existe pas") - - titreDemarche = await titreDemarcheGet( - etape.titreDemarcheId, - { - fields: { - titre: { - demarches: { etapes: { id: {} } }, - pointsEtape: { id: {} }, - titulairesEtape: { id: {} }, - amodiatairesEtape: { id: {} }, - }, - etapes: { id: {} }, - }, - }, - userSuper - ) - - if (!titreDemarche || !titreDemarche.titre) throw new Error("le titre n'existe pas") - - const entrepriseDocuments: EntrepriseDocument[] = await validateAndGetEntrepriseDocuments(context.pool, etape, titreDemarche.titre, user) - delete etape.entrepriseDocumentIds - - const etapeDocumentsParsed = z.array(tempEtapeDocumentValidator).safeParse(etape.etapeDocuments) - - if (!etapeDocumentsParsed.success) { - console.warn(etapeDocumentsParsed.error) - throw new Error('Les documents envoyés ne sont pas conformes') - } - - const etapeDocuments = etapeDocumentsParsed.data - delete etape.etapeDocuments - - const sdomZones: SDOMZoneId[] = [] - if (isNotNullNorUndefined(etape.geojson4326Perimetre)) { - if (isNotNullNorUndefined(etape.geojsonOriginePerimetre) && isNotNullNorUndefined(etape.geojsonOriginePoints)) { - if (!arePointsOnPerimeter(etape.geojsonOriginePerimetre, etape.geojsonOriginePoints)) { - throw new Error(`les points doivent être sur le périmètre`) - } - } - const { communes, sdom, surface, forets, secteurs } = await getGeojsonInformation(context.pool, etape.geojson4326Perimetre.geometry) - etape.surface = surface - - etape.communes = communes - etape.forets = forets - etape.secteursMaritime = secteurs.map(id => getSecteurMaritime(id)) - etape.sdomZones = sdom - - sdomZones.push(...sdom) - } else { - etape.communes = [] - etape.forets = [] - etape.secteursMaritime = [] - etape.sdomZones = [] - etape.surface = null - } - - const titreTypeId = titreDemarche?.titre?.typeId - if (!titreTypeId) { - throw new Error(`le type du titre de la ${titreDemarche.id} n'est pas chargé`) - } - - const etapeToSave: ITitreEtape = { - ...etape, - isBrouillon: canBeBrouillon(etape.typeId), - ...(await getForagesProperties(titreTypeId, etape.geojsonOrigineGeoSystemeId, etape.geojsonOrigineForages, context.pool)), - } - - const rulesErrors = titreEtapeUpdationValidate(etapeToSave, titreDemarche, titreDemarche.titre, etapeDocuments, entrepriseDocuments, sdomZones, user, null, null) - if (rulesErrors.length) { - throw new Error(rulesErrors.join(', ')) - } - if ( - !canCreateEtape(user, etape.typeId, etapeToSave.isBrouillon, titreDemarche.titre.titulaireIds ?? [], titreDemarche.titre.administrationsLocales ?? [], titreDemarche.typeId, { - typeId: titreDemarche.titre.typeId, - titreStatutId: titreDemarche.titre.titreStatutId ?? TitresStatutIds.Indetermine, - }) - ) { - throw new Error('droits insuffisants pour créer cette étape') - } - - if (!(await checkEntreprisesExist(context.pool, [...(etape.titulaireIds ?? []), ...(etape.amodiataireIds ?? [])]))) { - throw new Error("certaines entreprises n'existent pas") - } - - if (!canEditDuree(titreTypeId, titreDemarche.typeId)) { - etape.duree = null - } - - if (!canEditDates(titreTypeId, titreDemarche.typeId, etape.typeId, user) && (isNotNullNorUndefined(etape.dateDebut) || isNotNullNorUndefined(etape.dateFin))) { - etape.dateDebut = null - etape.dateFin = null - } - - let etapeUpdated: ITitreEtape | undefined = await titreEtapeUpsert(etapeToSave, user!, titreDemarche.titreId) - if (isNullOrUndefined(etapeUpdated)) { - throw new Error("Une erreur est survenue lors de la création de l'étape") - } - - await insertEtapeDocuments(context.pool, etapeUpdated.id, etapeDocuments) - for (const document of entrepriseDocuments) { - await insertTitreEtapeEntrepriseDocument(context.pool, { titre_etape_id: etapeUpdated.id, entreprise_document_id: document.id }) - } - - try { - await titreEtapeUpdateTask(context.pool, etapeUpdated.id, etapeUpdated.titreDemarcheId, user) - } catch (e) { - console.error('une erreur est survenue lors des tâches annexes', e) - } - - await titreEtapeAdministrationsEmailsSend(etapeUpdated, titreDemarche.typeId, titreDemarche.titreId, titreDemarche.titre.typeId, user) - await titreEtapeUtilisateursEmailsSend(etapeUpdated, titreDemarche.titreId) - const fields = fieldsBuild(info) - - etapeUpdated = await titreEtapeGet(etapeUpdated.id, { fields }, user) - - return titreEtapeFormat(etapeUpdated!) - } catch (e) { - console.error(e) - - throw e - } -} - -const validateAndGetEntrepriseDocuments = async ( - pool: Pool, - etape: Pick<ITitreEtape, 'heritageProps' | 'titulaireIds' | 'amodiataireIds' | 'entrepriseDocumentIds'>, - titre: Pick<ITitre, 'titulaireIds' | 'amodiataireIds'>, - user: User -): Promise<EntrepriseDocument[]> => { - const entrepriseDocuments: EntrepriseDocument[] = [] - - // si l’héritage est désactivé => on récupère les titulaires sur l’étape - // sinon on les trouve sur le titre - const titulaires = !(etape.heritageProps?.titulaires.actif ?? false) ? etape.titulaireIds : titre.titulaireIds - const amodiataires = !(etape.heritageProps?.amodiataires.actif ?? false) ? etape.amodiataireIds : titre.amodiataireIds - if (etape.entrepriseDocumentIds && isNonEmptyArray(etape.entrepriseDocumentIds)) { - let entrepriseIds: EntrepriseId[] = [] - if (titulaires) { - entrepriseIds.push(...titulaires) - } - if (amodiataires) { - entrepriseIds.push(...amodiataires) - } - entrepriseIds = entrepriseIds.filter(onlyUnique) - - if (isNonEmptyArray(entrepriseIds)) { - entrepriseDocuments.push(...(await getEntrepriseDocuments(etape.entrepriseDocumentIds, entrepriseIds, pool, user))) - } - - if (etape.entrepriseDocumentIds.length !== entrepriseDocuments.length) { - throw new Error("document d'entreprise incorrects") - } - } - - return entrepriseDocuments -} - -export const etapeModifier = async ( - { etape }: { etape: Omit<ITitreEtape, 'isBrouillon'> & { etapeDocuments: unknown; daeDocument: unknown; aslDocument: unknown } }, - context: Context, - info: GraphQLResolveInfo -) => { - try { - const user = context.user - if (!user) { - throw new Error("l'étape n'existe pas") - } - - const titreEtapeOld = await titreEtapeGet( - etape.id, - { - fields: { - demarche: { titre: { pointsEtape: { id: {} } } }, - }, - }, - user - ) - - if (isNullOrUndefined(titreEtapeOld)) throw new Error("l'étape n'existe pas") - - if (!titreEtapeOld.demarche || !titreEtapeOld.demarche.titre || titreEtapeOld.demarche.titre.administrationsLocales === undefined || !titreEtapeOld.demarche.titre.titreStatutId) { - throw new Error('la démarche n’est pas chargée complètement') - } - - if ( - !canEditEtape(user, titreEtapeOld.typeId, titreEtapeOld.isBrouillon, titreEtapeOld.titulaireIds ?? [], titreEtapeOld.demarche.titre.administrationsLocales ?? [], titreEtapeOld.demarche.typeId, { - typeId: titreEtapeOld.demarche.titre.typeId, - titreStatutId: titreEtapeOld.demarche.titre.titreStatutId, - }) - ) - throw new Error('droits insuffisants') - - if (titreEtapeOld.typeId !== etape.typeId) throw new Error("Il est interdit d'éditer le type d'étape") - - if (titreEtapeOld.titreDemarcheId !== etape.titreDemarcheId) throw new Error("la démarche n'existe pas") - - const titreDemarche = await titreDemarcheGet( - etape.titreDemarcheId, - { - fields: { - titre: { - demarches: { etapes: { id: {} } }, - titulairesEtape: { id: {} }, - amodiatairesEtape: { id: {} }, - }, - etapes: { id: {} }, - }, - }, - userSuper - ) - - if (!titreDemarche || !titreDemarche.titre) throw new Error("le titre n'existe pas") - if (isNullOrUndefined(titreDemarche.titre.titulaireIds) || isNullOrUndefined(titreDemarche.titre.amodiataireIds)) throw new Error('la démarche n’est pas chargée complètement') - - const entrepriseDocuments: EntrepriseDocument[] = await validateAndGetEntrepriseDocuments(context.pool, etape, titreDemarche.titre, user) - delete etape.entrepriseDocumentIds - - const etapeDocumentsParsed = z.array(etapeDocumentModificationValidator).safeParse(etape.etapeDocuments) - - if (!etapeDocumentsParsed.success) { - console.warn(etapeDocumentsParsed.error) - throw new Error('Les documents envoyés ne sont pas conformes') - } - - const etapeDocuments = etapeDocumentsParsed.data - delete etape.etapeDocuments - - const needToCreateAslAndDae = needAslAndDae({ etapeTypeId: etape.typeId, demarcheTypeId: titreDemarche.typeId, titreTypeId: titreDemarche.titre.typeId }, titreEtapeOld.isBrouillon, user) - let daeDocument = null - let aslDocument = null - if (needToCreateAslAndDae) { - const daeDocumentParsed = documentComplementaireDaeEtapeDocumentModificationValidator.nullable().safeParse(etape.daeDocument) - if (!daeDocumentParsed.success) { - console.warn(daeDocumentParsed.error) - throw new Error('L’arrêté préfectoral n’est pas conforme') - } - - daeDocument = daeDocumentParsed.data - - const aslDocumentParsed = documentComplementaireAslEtapeDocumentModificationValidator.nullable().safeParse(etape.aslDocument) - if (!aslDocumentParsed.success) { - console.warn(aslDocumentParsed.error) - throw new Error('La lettre du propriétaire du sol n’est pas conforme') - } - - aslDocument = aslDocumentParsed.data - } - delete etape.daeDocument - delete etape.aslDocument - - const sdomZones: SDOMZoneId[] = [] - if (isNotNullNorUndefined(etape.geojson4326Perimetre)) { - if (isNotNullNorUndefined(etape.geojsonOriginePerimetre) && isNotNullNorUndefined(etape.geojsonOriginePoints)) { - if (!arePointsOnPerimeter(etape.geojsonOriginePerimetre, etape.geojsonOriginePoints)) { - throw new Error(`les points doivent être sur le périmètre`) - } - } - - const { communes, sdom, surface, forets, secteurs } = await getGeojsonInformation(context.pool, etape.geojson4326Perimetre.geometry) - - if (!equalGeojson(etape.geojson4326Perimetre.geometry, titreEtapeOld.geojson4326Perimetre?.geometry)) { - etape.surface = surface - } else { - etape.surface = titreEtapeOld.surface - } - - etape.communes = communes - etape.forets = forets - etape.secteursMaritime = secteurs.map(id => getSecteurMaritime(id)) - etape.sdomZones = sdom - - sdomZones.push(...sdom) - } else { - etape.communes = [] - etape.forets = [] - etape.secteursMaritime = [] - etape.sdomZones = [] - etape.surface = null - } - - const titreTypeId = titreDemarche?.titre?.typeId - if (!titreTypeId) { - throw new Error(`le type du titre de la ${titreDemarche.id} n'est pas chargé`) - } - const etapeToSave: ITitreEtape = { - ...etape, - isBrouillon: titreEtapeOld.isBrouillon, - ...(await getForagesProperties(titreTypeId, etape.geojsonOrigineGeoSystemeId, etape.geojsonOrigineForages, context.pool)), - } - - const rulesErrors = titreEtapeUpdationValidate(etapeToSave, titreDemarche, titreDemarche.titre, etapeDocuments, entrepriseDocuments, sdomZones, user, daeDocument, aslDocument, titreEtapeOld) - - if (rulesErrors.length) { - throw new Error(rulesErrors.join(', ')) - } - - if (!canEditDuree(titreTypeId, titreDemarche.typeId)) { - etape.duree = titreEtapeOld.duree - } - - if (!canEditDates(titreTypeId, titreDemarche.typeId, etape.typeId, user)) { - etape.dateDebut = titreEtapeOld.dateDebut - etape.dateFin = titreEtapeOld.dateFin - } - - if (!(await checkEntreprisesExist(context.pool, [...(etape.titulaireIds ?? []), ...(etape.amodiataireIds ?? [])]))) { - throw new Error("certaines entreprises n'existent pas") - } - - let etapeUpdated: ITitreEtape | undefined = await titreEtapeUpsert(etapeToSave, user!, titreDemarche.titreId) - if (isNullOrUndefined(etapeUpdated)) { - throw new Error("Une erreur est survenue lors de la modification de l'étape") - } - await updateEtapeDocuments(context.pool, user, etapeUpdated.id, etapeUpdated.isBrouillon, etapeDocuments) - await deleteTitreEtapeEntrepriseDocument(context.pool, { titre_etape_id: etapeUpdated.id }) - for (const document of entrepriseDocuments) { - await insertTitreEtapeEntrepriseDocument(context.pool, { titre_etape_id: etapeUpdated.id, entreprise_document_id: document.id }) - } - - if (needToCreateAslAndDae) { - if (daeDocument !== null) { - const daeEtapeInDb = await getEtapeByDemarcheIdAndEtapeTypeId(context.pool, 'dae', titreDemarche.id) - - const daeEtape = await titreEtapeUpsert( - { - id: daeEtapeInDb?.etape_id ?? undefined, - typeId: 'dae', - statutId: daeDocument.etape_statut_id, - isBrouillon: false, - titreDemarcheId: titreDemarche.id, - date: daeDocument.date, - contenu: { - mea: { arrete: daeDocument.arrete_prefectoral }, - }, - }, - user!, - titreDemarche.titreId - ) - if (isNullOrUndefined(daeEtape)) { - throw new Error("impossible d'intégrer le document lié à la DAE") - } - - await updateEtapeDocuments(context.pool, user, daeEtape.id, titreEtapeOld.isBrouillon, [daeDocument]) - } - - if (aslDocument !== null) { - const aslEtapeInDb = await getEtapeByDemarcheIdAndEtapeTypeId(context.pool, 'asl', titreDemarche.id) - - const aslEtape = await titreEtapeUpsert( - { - id: aslEtapeInDb?.etape_id ?? undefined, - typeId: 'asl', - statutId: aslDocument.etape_statut_id, - isBrouillon: false, - titreDemarcheId: titreDemarche.id, - date: aslDocument.date, - }, - user!, - titreDemarche.titreId - ) - - if (isNullOrUndefined(aslEtape)) { - throw new Error("impossible d'intégrer le document lié à la ASL") - } - await updateEtapeDocuments(context.pool, user, aslEtape.id, titreEtapeOld.isBrouillon, [aslDocument]) - } - } - - await titreEtapeUpdateTask(context.pool, etapeUpdated.id, etapeUpdated.titreDemarcheId, user) - - await titreEtapeAdministrationsEmailsSend(etapeToSave, titreDemarche.typeId, titreDemarche.titreId, titreDemarche.titre.typeId, user, titreEtapeOld) - - const fields = fieldsBuild(info) - etapeUpdated = await titreEtapeGet(etapeUpdated.id, { fields }, user) - - return titreEtapeFormat(etapeUpdated!) - } catch (e) { - console.error(e) - - throw e - } -} diff --git a/packages/api/src/api/graphql/schemas/administrations.graphql b/packages/api/src/api/graphql/schemas/administrations.graphql deleted file mode 100644 index 14be61a70..000000000 --- a/packages/api/src/api/graphql/schemas/administrations.graphql +++ /dev/null @@ -1,24 +0,0 @@ -# import * from 'metas.graphql' -# import * from 'administrations.graphql' -# import * from 'utilisateurs.graphql' -# import * from 'titres.graphql' -# import * from 'metas.graphql' -# import * from 'territoires.graphql' - -input InputAdministrationTitreTypeTitreStatut { - administrationId: ID! - titreTypeId: ID! - titreStatutId: ID! - titresModificationInterdit: Boolean - demarchesModificationInterdit: Boolean - etapesModificationInterdit: Boolean -} - -input InputAdministrationTitreTypeEtapeType { - administrationId: ID! - titreTypeId: ID! - etapeTypeId: ID! - lectureInterdit: Boolean - modificationInterdit: Boolean - creationInterdit: Boolean -} diff --git a/packages/api/src/api/graphql/schemas/entreprises.graphql b/packages/api/src/api/graphql/schemas/entreprises.graphql index ff6319480..1eb0af43b 100644 --- a/packages/api/src/api/graphql/schemas/entreprises.graphql +++ b/packages/api/src/api/graphql/schemas/entreprises.graphql @@ -31,28 +31,3 @@ type EntrepriseEtablissement { dateFin: String legalSiret: String } - -input InputEntreprise { - id: ID! - nom: String - paysId: String - legalSiren: String - legalEtranger: String - legalForme: String - categorie: String - adresse: String - codePostal: String - commune: String - cedex: String - url: String - telephone: String - email: String -} - -input InputEtablissements { - id: ID! - nom: String - legalSiret: String - dateDebut: String - dateFin: String -} diff --git a/packages/api/src/api/graphql/schemas/index.graphql b/packages/api/src/api/graphql/schemas/index.graphql index 2dee39909..ca1c8e5fe 100644 --- a/packages/api/src/api/graphql/schemas/index.graphql +++ b/packages/api/src/api/graphql/schemas/index.graphql @@ -1,5 +1,4 @@ # import * from 'scalars.graphql' -# import * from 'administrations.graphql' # import * from 'entreprises.graphql' # import * from 'geojsons.graphql' # import * from 'metas-activites.graphql' @@ -75,9 +74,6 @@ type Query { travaux: Boolean ): Demarches - "Étape d’une démarche en fonction de son id" - etape(id: ID!): Etape - etapeHeritage(date: String!, titreDemarcheId: ID!, typeId: ID!, etapeId: ID): EtapeHeritage "Liste des activités" @@ -174,12 +170,6 @@ type Mutation { "Supprime une démarche et met à jour le titre minier" demarcheSupprimer(id: ID!): ID - "Crée une étape et met à jour le titre minier" - etapeCreer(etape: InputEtapeCreation!): Etape - - "Modifie une étape et met à jour le titre minier" - etapeModifier(etape: InputEtapeModification!): Etape - "Dépose une activité" activiteDeposer(id: ID!): Activite } diff --git a/packages/api/src/api/graphql/schemas/metas.graphql b/packages/api/src/api/graphql/schemas/metas.graphql index c5411166e..224ea88a7 100644 --- a/packages/api/src/api/graphql/schemas/metas.graphql +++ b/packages/api/src/api/graphql/schemas/metas.graphql @@ -233,7 +233,3 @@ enum Couleur { success warning } - -input InputId { - id: ID! -} diff --git a/packages/api/src/api/graphql/schemas/titres-etapes.graphql b/packages/api/src/api/graphql/schemas/titres-etapes.graphql index 6c7dde9d1..1efdb32b4 100644 --- a/packages/api/src/api/graphql/schemas/titres-etapes.graphql +++ b/packages/api/src/api/graphql/schemas/titres-etapes.graphql @@ -1,4 +1,3 @@ -# import * from 'administrations.graphql' # import * from 'entreprises.graphql' # import * from 'substances.graphql' # import * from 'geojsons.graphql' @@ -149,118 +148,9 @@ type HeritageProp { actif: Boolean } -input InputEtapeCreation { - typeId: ID! - statutId: ID - titreDemarcheId: ID! - date: String! - ordre: Int - duree: Int - dateDebut: String - dateFin: String - substances: [String!] - geojson4326Perimetre: Json - geojson4326Points: Json - geojsonOriginePoints: Json - geojsonOriginePerimetre: Json - geojsonOrigineForages: Json - geojsonOrigineGeoSystemeId: String - titulaireIds: [String!] - amodiataireIds: [String!] - heritageProps: InputHeritageProps - heritageContenu: Json - contenu: Json - etapeDocuments: [InputEtapeDocumentCreation] - entrepriseDocumentIds: [ID] - notes: String -} - -input DaeDocument { - id: String - temp_document_name: String - etape_document_type_id: String! - description: String - public_lecture: Boolean! - entreprises_lecture: Boolean! - etape_statut_id: String! - date: String! - arrete_prefectoral: String -} - -input AslDocument { - id: String - temp_document_name: String - etape_document_type_id: String! - description: String - public_lecture: Boolean! - entreprises_lecture: Boolean! - etape_statut_id: String! - date: String! -} - -input InputEtapeDocumentCreation { - temp_document_name: String! - etape_document_type_id: String! - description: String - public_lecture: Boolean! - entreprises_lecture: Boolean! -} - -input InputEtapeModification { - id: ID! - typeId: ID! - statutId: ID - titreDemarcheId: ID! - date: String! - ordre: Int - duree: Int - dateDebut: String - dateFin: String - substances: [String!] - titulaireIds: [String!] - amodiataireIds: [String!] - heritageProps: InputHeritageProps - heritageContenu: Json - contenu: Json - etapeDocuments: [InputEtapeDocumentModification] - entrepriseDocumentIds: [ID] - notes: String - geojson4326Perimetre: Json - geojson4326Points: Json - geojsonOriginePoints: Json - geojsonOriginePerimetre: Json - geojsonOrigineForages: Json - geojsonOrigineGeoSystemeId: String - daeDocument: DaeDocument - aslDocument: AslDocument -} - -input InputEtapeDocumentModification { - id: ID - temp_document_name: String - etape_document_type_id: String! - description: String - public_lecture: Boolean! - entreprises_lecture: Boolean! -} - input InputEtapeFiltre { typeId: ID! statutId: ID dateDebut: String dateFin: String } - -input InputHeritageProps { - dateDebut: InputHeritageProp - dateFin: InputHeritageProp - duree: InputHeritageProp - perimetre: InputHeritageProp - substances: InputHeritageProp - titulaires: InputHeritageProp - amodiataires: InputHeritageProp -} - -input InputHeritageProp { - actif: Boolean -} diff --git a/packages/api/src/api/graphql/schemas/titres.graphql b/packages/api/src/api/graphql/schemas/titres.graphql index 9eee2c472..bb0a596ba 100644 --- a/packages/api/src/api/graphql/schemas/titres.graphql +++ b/packages/api/src/api/graphql/schemas/titres.graphql @@ -1,5 +1,4 @@ # import * from 'scalars.graphql' -# import * from 'administrations.graphql' # import * from 'entreprises.graphql' # import * from 'titres-demarches.graphql' # import * from 'metas.graphql' @@ -106,10 +105,6 @@ input InputTitreCreation { references: [InputReference] } -input InputId { - id: ID -} - input InputReference { referenceTypeId: String! nom: String! diff --git a/packages/api/src/api/graphql/schemas/utilisateurs.graphql b/packages/api/src/api/graphql/schemas/utilisateurs.graphql index 838e70d1c..bffac8af9 100644 --- a/packages/api/src/api/graphql/schemas/utilisateurs.graphql +++ b/packages/api/src/api/graphql/schemas/utilisateurs.graphql @@ -1,5 +1,4 @@ # import * from 'scalars.graphql' -# import * from 'administrations.graphql' # import * from 'entreprises.graphql' # import * from 'metas.graphql' diff --git a/packages/api/src/api/graphql/titres-demarches.test.integration.ts b/packages/api/src/api/graphql/titres-demarches.test.integration.ts index deae5b1a2..c3d536931 100644 --- a/packages/api/src/api/graphql/titres-demarches.test.integration.ts +++ b/packages/api/src/api/graphql/titres-demarches.test.integration.ts @@ -10,6 +10,7 @@ import { afterAll, beforeAll, afterEach, describe, test, expect, vi } from 'vite import type { Pool } from 'pg' import { newEtapeId } from '../../database/models/_format/id-create.js' import TitresDemarches from '../../database/models/titres-demarches.js' +import { ETAPE_IS_NOT_BROUILLON } from 'camino-common/src/etape.js' console.info = vi.fn() console.error = vi.fn() @@ -233,7 +234,7 @@ describe('demarcheModifier', () => { statutId: 'acc', ordre: 1, date: toCaminoDate('2020-01-01'), - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, }, userSuper, titreId diff --git a/packages/api/src/api/graphql/titres-etapes-creer.test.integration.ts b/packages/api/src/api/graphql/titres-etapes-creer.test.integration.ts deleted file mode 100644 index acaf4e08c..000000000 --- a/packages/api/src/api/graphql/titres-etapes-creer.test.integration.ts +++ /dev/null @@ -1,261 +0,0 @@ -import { dbManager } from '../../../tests/db-manager.js' -import { graphQLCall, queryImport } from '../../../tests/_utils/index.js' -import { titreDemarcheCreate } from '../../database/queries/titres-demarches.js' -import { titreCreate } from '../../database/queries/titres.js' -import Titres from '../../database/models/titres.js' -import { ADMINISTRATION_IDS } from 'camino-common/src/static/administrations.js' -import { isAdministrationRole, Role } from 'camino-common/src/roles.js' -import { userSuper } from '../../database/user-super' - -import { afterAll, beforeEach, beforeAll, describe, test, expect, vi } from 'vitest' -import type { Pool } from 'pg' -import { ETAPE_HERITAGE_PROPS } from 'camino-common/src/heritage.js' - -vi.mock('../../tools/dir-create', () => ({ - __esModule: true, - default: vi.fn(), -})) - -console.info = vi.fn() -console.error = vi.fn() -let dbPool: Pool - -beforeAll(async () => { - const { pool } = await dbManager.populateDb() - dbPool = pool -}) - -beforeEach(async () => { - await Titres.query().delete() -}) - -afterAll(async () => { - await dbManager.closeKnex() -}) - -const demarcheCreate = async () => { - const titre = await titreCreate( - { - nom: 'mon titre', - typeId: 'arm', - titreStatutId: 'ind', - propsTitreEtapesIds: {}, - }, - {} - ) - - const titreDemarche = await titreDemarcheCreate({ - titreId: titre.id, - typeId: 'oct', - }) - - return titreDemarche.id -} - -describe('etapeCreer', () => { - const etapeCreerQuery = queryImport('titre-etape-creer') - - test.each([undefined, 'editeur' as Role])('ne peut pas créer une étape (utilisateur %s)', async (role: Role | undefined) => { - const res = await graphQLCall( - dbPool, - etapeCreerQuery, - { etape: { typeId: '', statutId: '', titreDemarcheId: '', date: '' } }, - role && isAdministrationRole(role) ? { role, administrationId: 'ope-onf-973-01' } : undefined - ) - - expect(res.body.errors[0].message).toBe("la démarche n'existe pas") - }) - - test('ne peut pas créer une étape sur une démarche inexistante (utilisateur admin)', async () => { - const res = await graphQLCall(dbPool, etapeCreerQuery, { etape: { typeId: '', statutId: '', titreDemarcheId: '', date: '' } }, { role: 'admin', administrationId: 'ope-onf-973-01' }) - - expect(res.body.errors[0].message).toBe("la démarche n'existe pas") - }) - - test('ne peut pas créer une étape de mia faite avec le ptmg', async () => { - const titreDemarcheId = await demarcheCreate() - - const res = await graphQLCall( - dbPool, - etapeCreerQuery, - { - etape: { - typeId: 'mia', - statutId: 'fai', - titreDemarcheId, - date: '2018-01-01', - etapeDocuments: [], - }, - }, - { - role: 'admin', - administrationId: ADMINISTRATION_IDS['PÔLE TECHNIQUE MINIER DE GUYANE'], - } - ) - - expect(res.body.errors[0].message).toBe('droits insuffisants pour créer cette étape') - }) - test('ne peut pas créer une étape incohérente (mia avec statut fav) (utilisateur admin)', async () => { - const titreDemarcheId = await demarcheCreate() - - const res = await graphQLCall( - dbPool, - etapeCreerQuery, - { - etape: { - typeId: 'mia', - statutId: 'fav', - titreDemarcheId, - date: '2018-01-01', - etapeDocuments: [], - }, - }, - { - role: 'admin', - administrationId: ADMINISTRATION_IDS['PÔLE TECHNIQUE MINIER DE GUYANE'], - } - ) - - expect(res.body.errors[0].message).toBe('statut de l\'étape "fav" invalide pour une type d\'étape mia pour une démarche de type octroi') - }) - - test('peut créer une étape mia avec un statut fai (utilisateur super)', async () => { - const titreDemarcheId = await demarcheCreate() - - const res = await graphQLCall( - dbPool, - etapeCreerQuery, - { - etape: { - typeId: 'mia', - statutId: 'fai', - titreDemarcheId, - date: '2018-01-01', - etapeDocuments: [], - }, - }, - userSuper - ) - - expect(res.body.errors).toBe(undefined) - }) - - test('peut créer une étape MEN sur un titre ARM en tant que PTMG (utilisateur admin)', async () => { - const titreDemarcheId = await demarcheCreate() - const res = await graphQLCall( - dbPool, - etapeCreerQuery, - { - etape: { - typeId: 'men', - statutId: 'fai', - titreDemarcheId, - date: '2018-01-01', - etapeDocuments: [], - }, - }, - { - role: 'admin', - administrationId: ADMINISTRATION_IDS['PÔLE TECHNIQUE MINIER DE GUYANE'], - } - ) - - expect(res.body.errors).toBe(undefined) - }) - - test('ne peut pas créer une étape EDE sur un titre ARM en tant que PTMG (utilisateur admin)', async () => { - const titreDemarcheId = await demarcheCreate() - - const res = await graphQLCall( - dbPool, - etapeCreerQuery, - { - etape: { - typeId: 'ede', - statutId: 'fai', - titreDemarcheId, - date: '2018-01-01', - heritageContenu: { - deal: { motifs: { actif: false }, agent: { actif: false } }, - }, - contenu: { - deal: { motifs: 'motif', agent: 'agent' }, - }, - etapeDocuments: [], - }, - }, - { - role: 'admin', - administrationId: ADMINISTRATION_IDS['PÔLE TECHNIQUE MINIER DE GUYANE'], - } - ) - - expect(res.body.errors[0].message).toBe('statut de l\'étape "fai" invalide pour une type d\'étape ede pour une démarche de type octroi') - }) - - test('ne peut pas créer une étape avec des titulaires inexistants', async () => { - const titreDemarcheId = await demarcheCreate() - - const res = await graphQLCall( - dbPool, - etapeCreerQuery, - { - etape: { - typeId: 'ede', - statutId: 'fav', - titreDemarcheId, - titulaireIds: ['inexistant'], - date: '2018-01-01', - heritageContenu: { - deal: { motifs: { actif: false }, agent: { actif: false } }, - }, - contenu: { - deal: { motifs: 'motif', agent: 'agent' }, - }, - etapeDocuments: [], - }, - }, - { - role: 'super', - } - ) - - expect(res.body.errors[0].message).toBe("certaines entreprises n'existent pas") - }) - - test('peut créer une étape mfr en brouillon avec un champ obligatoire manquant (utilisateur super)', async () => { - const titreDemarcheId = await demarcheCreate() - const res = await graphQLCall( - dbPool, - etapeCreerQuery, - { - etape: { - typeId: 'mfr', - statutId: 'fai', - titreDemarcheId, - date: '2018-01-01', - heritageProps: ETAPE_HERITAGE_PROPS.reduce( - (acc, prop) => { - acc[prop] = { actif: false } - - return acc - }, - {} as { - [key: string]: { actif: boolean } - } - ), - heritageContenu: { - arm: { - mecanise: { actif: true }, - franchissements: { actif: true }, - }, - }, - etapeDocuments: [], - }, - }, - userSuper - ) - - expect(res.body.errors).toBe(undefined) - }) -}) diff --git a/packages/api/src/api/graphql/titres-etapes-modifier.test.integration.ts b/packages/api/src/api/graphql/titres-etapes-modifier.test.integration.ts deleted file mode 100644 index 78e923e1e..000000000 --- a/packages/api/src/api/graphql/titres-etapes-modifier.test.integration.ts +++ /dev/null @@ -1,407 +0,0 @@ -import { dbManager } from '../../../tests/db-manager.js' -import { graphQLCall, queryImport, restCall } from '../../../tests/_utils/index.js' -import { titreDemarcheCreate } from '../../database/queries/titres-demarches.js' -import { titreCreate } from '../../database/queries/titres.js' -import { titreEtapeCreate } from '../../database/queries/titres-etapes.js' -import Titres from '../../database/models/titres.js' -import { userSuper } from '../../database/user-super.js' -import { ADMINISTRATION_IDS } from 'camino-common/src/static/administrations.js' -import { isAdministrationRole, Role } from 'camino-common/src/roles.js' -import { toCaminoDate } from 'camino-common/src/date.js' - -import { afterAll, beforeEach, beforeAll, describe, test, expect, vi } from 'vitest' -import type { Pool } from 'pg' -import { ETAPE_HERITAGE_PROPS } from 'camino-common/src/heritage.js' -import { EtapeTypeId, canBeBrouillon } from 'camino-common/src/static/etapesTypes.js' -import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools.js' -import { idGenerate } from '../../database/models/_format/id-create.js' -import { copyFileSync, mkdirSync } from 'fs' -import { TempEtapeDocument } from 'camino-common/src/etape.js' -import { tempDocumentNameValidator } from 'camino-common/src/document.js' -import { HTTP_STATUS } from 'camino-common/src/http.js' -import { Knex } from 'knex' -import { testDocumentCreateTemp } from '../../../tests/_utils/administrations-permissions.js' - -vi.mock('../../tools/dir-create', () => ({ - __esModule: true, - default: vi.fn(), -})) - -console.info = vi.fn() -console.error = vi.fn() -let dbPool: Pool -let knexInstance: Knex -beforeAll(async () => { - const { pool, knex } = await dbManager.populateDb() - dbPool = pool - knexInstance = knex -}) - -beforeEach(async () => { - await knexInstance.raw('delete from etapes_documents') - await Titres.query().delete() -}) - -afterAll(async () => { - await dbManager.closeKnex() -}) - -async function etapeCreate(typeId?: EtapeTypeId) { - const titre = await titreCreate( - { - nom: 'mon titre', - typeId: 'arm', - titreStatutId: 'ind', - propsTitreEtapesIds: {}, - }, - {} - ) - const titreDemarche = await titreDemarcheCreate({ - titreId: titre.id, - typeId: 'oct', - }) - - const myTypeId = isNotNullNorUndefined(typeId) ? typeId : 'mfr' - const titreEtape = await titreEtapeCreate( - { - typeId: myTypeId, - statutId: 'fai', - ordre: 1, - titreDemarcheId: titreDemarche.id, - date: toCaminoDate('2018-01-01'), - isBrouillon: canBeBrouillon(myTypeId), - }, - userSuper, - titre.id - ) - - return { titreDemarcheId: titreDemarche.id, titreEtapeId: titreEtape.id } -} - -describe('etapeModifier', () => { - const etapeModifierQuery = queryImport('titre-etape-modifier') - - test.each([undefined, 'editeur' as Role])('ne peut pas modifier une étape (utilisateur %s)', async (role: Role | undefined) => { - const res = await graphQLCall( - dbPool, - etapeModifierQuery, - { - etape: { - id: '', - typeId: '', - statutId: '', - titreDemarcheId: '', - date: '', - }, - }, - role && isAdministrationRole(role) ? { role, administrationId: 'ope-onf-973-01' } : undefined - ) - - expect(res.body.errors[0].message).toBe("l'étape n'existe pas") - }) - - test('ne peut pas modifier une étape sur une démarche inexistante (utilisateur super)', async () => { - const res = await graphQLCall( - dbPool, - etapeModifierQuery, - { - etape: { - id: '', - typeId: '', - statutId: '', - titreDemarcheId: '', - date: '', - }, - }, - userSuper - ) - - expect(res.body.errors[0].message).toBe("l'étape n'existe pas") - }) - - test('peut modifier une étape mfr en brouillon (utilisateur super)', async () => { - const { titreDemarcheId, titreEtapeId } = await etapeCreate() - const res = await graphQLCall( - dbPool, - etapeModifierQuery, - { - etape: { - id: titreEtapeId, - typeId: 'mfr', - statutId: 'fai', - titreDemarcheId, - date: '2018-01-01', - heritageProps: ETAPE_HERITAGE_PROPS.reduce( - (acc, prop) => { - acc[prop] = { actif: false } - - return acc - }, - {} as { - [key: string]: { actif: boolean } - } - ), - heritageContenu: { - arm: { - mecanise: { actif: false }, - franchissements: { actif: false }, - }, - }, - contenu: { - arm: { mecanise: true, franchissements: 3 }, - }, - etapeDocuments: [], - }, - }, - userSuper - ) - - expect(res.body.errors).toBe(undefined) - }) - - test("ne peut pas modifier une étape avec des entreprises qui n'existent pas", async () => { - const { titreDemarcheId, titreEtapeId } = await etapeCreate() - const res = await graphQLCall( - dbPool, - etapeModifierQuery, - { - etape: { - id: titreEtapeId, - typeId: 'mfr', - statutId: 'fai', - titulaireIds: ['inexistant'], - titreDemarcheId, - date: '2018-01-01', - heritageProps: ETAPE_HERITAGE_PROPS.reduce( - (acc, prop) => { - acc[prop] = { actif: false } - - return acc - }, - {} as { - [key: string]: { actif: boolean } - } - ), - heritageContenu: { - arm: { - mecanise: { actif: false }, - franchissements: { actif: false }, - }, - }, - contenu: { - arm: { mecanise: true, franchissements: 3 }, - }, - etapeDocuments: [], - }, - }, - userSuper - ) - - expect(res.body.errors[0].message).toBe("certaines entreprises n'existent pas") - }) - - test("peut supprimer un document d'une demande en brouillon (utilisateur super)", async () => { - const { titreDemarcheId, titreEtapeId } = await etapeCreate() - - const documentToInsert = testDocumentCreateTemp('aac') - - const etape = { - id: titreEtapeId, - typeId: 'mfr', - statutId: 'fai', - titreDemarcheId, - date: '2018-01-01', - heritageProps: ETAPE_HERITAGE_PROPS.reduce( - (acc, prop) => { - acc[prop] = { actif: false } - - return acc - }, - {} as { - [key: string]: { actif: boolean } - } - ), - heritageContenu: { - arm: { - mecanise: { actif: false }, - franchissements: { actif: false }, - }, - }, - contenu: { - arm: { mecanise: true, franchissements: 3 }, - }, - etapeDocuments: [documentToInsert], - } - - let res = await graphQLCall(dbPool, etapeModifierQuery, { etape }, userSuper) - - expect(res.body.errors).toBe(undefined) - - const documents = await restCall(dbPool, '/rest/etapes/:etapeId/etapeDocuments', { etapeId: titreEtapeId }, userSuper) - expect(documents.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_OK) - expect(documents.body.etapeDocuments).toHaveLength(1) - expect(documents.body.etapeDocuments[0]).toMatchInlineSnapshot( - { id: expect.any(String) }, - ` - { - "description": "desc", - "entreprises_lecture": true, - "etape_document_type_id": "aac", - "id": Any<String>, - "public_lecture": true, - } - ` - ) - res = await graphQLCall(dbPool, etapeModifierQuery, { etape: { ...etape, etapeDocuments: [] } }, userSuper) - - expect(res.body.errors).toBe(undefined) - }) - - test("ne peut pas supprimer un document obligatoire d'une étape qui n'est pas en brouillon (utilisateur super)", async () => { - const { titreDemarcheId, titreEtapeId } = await etapeCreate('dae') - const dir = `${process.cwd()}/files/tmp/` - - const fileName = `existing_temp_file_${idGenerate()}` - mkdirSync(dir, { recursive: true }) - copyFileSync(`./src/tools/small.pdf`, `${dir}/${fileName}`) - const documentToInsert: TempEtapeDocument = { - etape_document_type_id: 'aac', - entreprises_lecture: true, - public_lecture: true, - description: 'desc', - temp_document_name: tempDocumentNameValidator.parse(fileName), - } - - const etape = { - id: titreEtapeId, - typeId: 'dae', - statutId: 'exe', - titreDemarcheId, - date: '2018-01-01', - heritageProps: ETAPE_HERITAGE_PROPS.reduce( - (acc, prop) => { - acc[prop] = { actif: false } - - return acc - }, - {} as { - [key: string]: { actif: boolean } - } - ), - heritageContenu: { - mea: { - arrete: { actif: false }, - }, - }, - contenu: { - mea: { arrete: 'arrete' }, - }, - etapeDocuments: [documentToInsert], - } - - let res = await graphQLCall(dbPool, etapeModifierQuery, { etape }, userSuper) - - expect(res.body.errors).toBe(undefined) - - res = await graphQLCall(dbPool, etapeModifierQuery, { etape: { ...etape, etapeDocuments: [] } }, userSuper) - - expect(res.body.errors[0].message).toBe('Impossible de supprimer les documents') - }) - - test('peut modifier une étape mia avec un statut fai (utilisateur super)', async () => { - const { titreDemarcheId, titreEtapeId } = await etapeCreate('mia') - - const res = await graphQLCall( - dbPool, - etapeModifierQuery, - { - etape: { - id: titreEtapeId, - typeId: 'mia', - statutId: 'fai', - titreDemarcheId, - date: '2018-01-01', - etapeDocuments: [], - }, - }, - userSuper - ) - - expect(res.body.errors).toBe(undefined) - }) - - test('ne peut pas modifier une étape mia avec un statut fav (utilisateur admin)', async () => { - const { titreDemarcheId, titreEtapeId } = await etapeCreate('mia') - - const res = await graphQLCall( - dbPool, - etapeModifierQuery, - { - etape: { - id: titreEtapeId, - typeId: 'mia', - statutId: 'fav', - titreDemarcheId, - date: '2018-01-01', - }, - }, - { - role: 'admin', - administrationId: ADMINISTRATION_IDS['PÔLE TECHNIQUE MINIER DE GUYANE'], - } - ) - - expect(res.body.errors[0].message).toBe("l'étape n'existe pas") - }) - - test('peut modifier une étape MEN sur un titre ARM en tant que PTMG (utilisateur admin)', async () => { - const { titreDemarcheId, titreEtapeId } = await etapeCreate('men') - const res = await graphQLCall( - dbPool, - etapeModifierQuery, - { - etape: { - id: titreEtapeId, - typeId: 'men', - statutId: 'fai', - titreDemarcheId, - date: '2016-01-01', - etapeDocuments: [], - }, - }, - { - role: 'admin', - administrationId: ADMINISTRATION_IDS['PÔLE TECHNIQUE MINIER DE GUYANE'], - } - ) - - expect(res.body.errors).toBe(undefined) - }) - - test('ne peut pas modifier une étape EDE sur un titre ARM en tant que PTMG (utilisateur admin)', async () => { - const { titreDemarcheId, titreEtapeId } = await etapeCreate('ede') - const res = await graphQLCall( - dbPool, - etapeModifierQuery, - { - etape: { - id: titreEtapeId, - typeId: 'ede', - statutId: 'fai', - titreDemarcheId, - date: '2018-01-01', - heritageContenu: { - deal: { motifs: { actif: false }, agent: { actif: false } }, - }, - contenu: { deal: { motifs: 'motif', agent: 'agent' } }, - }, - }, - { - role: 'admin', - administrationId: ADMINISTRATION_IDS['PÔLE TECHNIQUE MINIER DE GUYANE'], - } - ) - - expect(res.body.errors[0].message).toBe("l'étape n'existe pas") - }) -}) diff --git a/packages/api/src/api/graphql/titres.test.integration.ts b/packages/api/src/api/graphql/titres.test.integration.ts index 3765f092d..c2c641e43 100644 --- a/packages/api/src/api/graphql/titres.test.integration.ts +++ b/packages/api/src/api/graphql/titres.test.integration.ts @@ -15,6 +15,7 @@ import { newEntrepriseId } from 'camino-common/src/entreprise.js' import { communeIdValidator } from 'camino-common/src/static/communes.js' import type { Knex } from 'knex' import Titres from '../../database/models/titres' +import { ETAPE_IS_NOT_BROUILLON } from 'camino-common/src/etape.js' console.info = vi.fn() console.error = vi.fn() @@ -80,22 +81,13 @@ const titreEtapesPubliques: ITitre = { publicLecture: true, etapes: [ { - id: newEtapeId('titre-id-demarche-id-aof'), - typeId: 'aof', + id: newEtapeId('titre-id-demarche-id-asc'), + typeId: 'asc', ordre: 8, titreDemarcheId: newDemarcheId('titre-id-demarche-id'), - statutId: 'acc', - date: toCaminoDate('2020-02-02'), - isBrouillon: false, - }, - { - id: newEtapeId('titre-id-demarche-id-eof'), - typeId: 'eof', - ordre: 7, - titreDemarcheId: newDemarcheId('titre-id-demarche-id'), - statutId: 'acc', + statutId: 'fai', date: toCaminoDate('2020-02-02'), - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, }, { id: newEtapeId('titre-id-demarche-id-edm'), @@ -104,7 +96,7 @@ const titreEtapesPubliques: ITitre = { titreDemarcheId: newDemarcheId('titre-id-demarche-id'), statutId: 'acc', date: toCaminoDate('2020-02-02'), - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, }, { id: newEtapeId('titre-id-demarche-id-ede'), @@ -113,7 +105,7 @@ const titreEtapesPubliques: ITitre = { titreDemarcheId: newDemarcheId('titre-id-demarche-id'), statutId: 'acc', date: toCaminoDate('2020-02-02'), - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, }, { id: newEtapeId('titre-id-demarche-id-pfd'), @@ -122,7 +114,7 @@ const titreEtapesPubliques: ITitre = { titreDemarcheId: newDemarcheId('titre-id-demarche-id'), statutId: 'acc', date: toCaminoDate('2020-02-02'), - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, }, { id: newEtapeId('titre-id-demarche-id-pfc'), @@ -131,7 +123,7 @@ const titreEtapesPubliques: ITitre = { titreDemarcheId: newDemarcheId('titre-id-demarche-id'), statutId: 'acc', date: toCaminoDate('2020-02-02'), - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, }, { id: newEtapeId('titre-id-demarche-id-vfd'), @@ -140,7 +132,7 @@ const titreEtapesPubliques: ITitre = { titreDemarcheId: newDemarcheId('titre-id-demarche-id'), statutId: 'acc', date: toCaminoDate('2020-02-02'), - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, }, { id: newEtapeId('titre-id-demarche-id-vfc'), @@ -149,7 +141,7 @@ const titreEtapesPubliques: ITitre = { titreDemarcheId: newDemarcheId('titre-id-demarche-id'), statutId: 'acc', date: toCaminoDate('2020-02-02'), - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, }, { id: newEtapeId('titre-id-demarche-id-dpu'), @@ -159,7 +151,7 @@ const titreEtapesPubliques: ITitre = { statutId: 'acc', date: toCaminoDate('2020-02-02'), administrationsLocales: ['dea-guyane-01'], - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, }, ], }, @@ -235,7 +227,7 @@ describe('titre', () => { })) ).toEqual( expect.arrayContaining([ - { id: 'titre-id-demarche-id-aof' }, + { id: 'titre-id-demarche-id-asc' }, { id: 'titre-id-demarche-id-dpu' }, { id: 'titre-id-demarche-id-ede' }, { id: 'titre-id-demarche-id-edm' }, @@ -260,15 +252,14 @@ describe('titre', () => { ) expect(res.body.errors).toBe(undefined) - expect(res.body.data.titres.elements[0].demarches[0].etapes.length).toEqual(9) + expect(res.body.data.titres.elements[0].demarches[0].etapes.length).toEqual(8) expect( res.body.data.titres.elements[0].demarches[0].etapes.map(({ id }: { id: string }) => ({ id, })) ).toEqual( expect.arrayContaining([ - { id: 'titre-id-demarche-id-aof' }, - { id: 'titre-id-demarche-id-eof' }, + { id: 'titre-id-demarche-id-asc' }, { id: 'titre-id-demarche-id-edm' }, { id: 'titre-id-demarche-id-pfc' }, { id: 'titre-id-demarche-id-pfd' }, @@ -312,7 +303,7 @@ describe('titres', () => { administrationsLocales: ['dea-guyane-01'], titulaireIds: [entrepriseId1], communes: [{ id: communeId }], - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, }, ], }, diff --git a/packages/api/src/api/rest/demarches.queries.ts b/packages/api/src/api/rest/demarches.queries.ts index 919776f10..c8003d69e 100644 --- a/packages/api/src/api/rest/demarches.queries.ts +++ b/packages/api/src/api/rest/demarches.queries.ts @@ -9,7 +9,7 @@ import { communeValidator } from 'camino-common/src/static/communes.js' import { secteurMaritimeValidator } from 'camino-common/src/static/facades.js' import { substanceLegaleIdValidator } from 'camino-common/src/static/substancesLegales.js' import { etapeTypeIdValidator } from 'camino-common/src/static/etapesTypes.js' -import { etapeIdValidator, etapeSlugValidator } from 'camino-common/src/etape.js' +import { etapeBrouillonValidator, etapeIdValidator, etapeSlugValidator } from 'camino-common/src/etape.js' import { etapeStatutIdValidator } from 'camino-common/src/static/etapesStatuts.js' import { contenuValidator } from './activites.queries.js' import { sdomZoneIdValidator } from 'camino-common/src/static/sdom.js' @@ -51,7 +51,7 @@ const getEtapesByDemarcheIdDbValidator = z.object({ geojson_origine_forages: featureCollectionForagesValidator.nullable(), titulaire_ids: z.array(entrepriseIdValidator), amodiataire_ids: z.array(entrepriseIdValidator), - is_brouillon: z.boolean(), + is_brouillon: etapeBrouillonValidator, }) export const getEtapesByDemarcheId = async (pool: Pool, demarcheId: DemarcheId) => { diff --git a/packages/api/src/api/rest/demarches.test.integration.ts b/packages/api/src/api/rest/demarches.test.integration.ts index f52a55598..3778ad997 100644 --- a/packages/api/src/api/rest/demarches.test.integration.ts +++ b/packages/api/src/api/rest/demarches.test.integration.ts @@ -15,6 +15,7 @@ import { entrepriseUpsert } from '../../database/queries/entreprises.js' import { FeatureMultiPolygon } from 'camino-common/src/perimetre.js' import { codePostalValidator } from 'camino-common/src/static/departement.js' import crypto from 'crypto' +import { km2Validator } from 'camino-common/src/number.js' console.info = vi.fn() console.error = vi.fn() @@ -99,7 +100,7 @@ describe('downloadDemarches', () => { statutId: 'fai', date: toCaminoDate('2022-01-01'), ordre: 1, - surface: 42, + surface: km2Validator.parse(42), geojson4326Perimetre: multiPolygonWith4Points, geojsonOriginePerimetre: multiPolygonWith4Points, geojsonOrigineGeoSystemeId: '4326', @@ -154,7 +155,7 @@ slug,mon titre,minéraux et métaux,autorisation d'exploitation,valide,octroi,in statutId: 'fai', date: toCaminoDate('2023-01-01'), ordre: 2, - surface: 102, + surface: km2Validator.parse(102), geojson4326Perimetre: multiPolygonWith4Points, geojsonOriginePerimetre: multiPolygonWith4Points, geojsonOrigineGeoSystemeId: '4326', diff --git a/packages/api/src/api/rest/entreprises.test.integration.ts b/packages/api/src/api/rest/entreprises.test.integration.ts index f8fec9b30..593b2ca3e 100644 --- a/packages/api/src/api/rest/entreprises.test.integration.ts +++ b/packages/api/src/api/rest/entreprises.test.integration.ts @@ -19,6 +19,7 @@ import { idGenerate } from '../../database/models/_format/id-create' import { insertTitreEtapeEntrepriseDocument } from '../../database/queries/titres-etapes.queries.js' import { titreSlugValidator } from 'camino-common/src/validators/titres.js' import type { Knex } from 'knex' +import { ETAPE_IS_NOT_BROUILLON } from 'camino-common/src/etape.js' console.info = vi.fn() console.error = vi.fn() vi.mock('../../tools/api-insee/fetch', () => ({ @@ -287,7 +288,7 @@ describe('getEntrepriseDocument', () => { titreDemarcheId: titreDemarche.id, date: toCaminoDate('2022-01-01'), ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, }, userSuper, titre.id diff --git a/packages/api/src/api/rest/etape-creer.test.integration.ts b/packages/api/src/api/rest/etape-creer.test.integration.ts new file mode 100644 index 000000000..b51e8de4c --- /dev/null +++ b/packages/api/src/api/rest/etape-creer.test.integration.ts @@ -0,0 +1,306 @@ +import { dbManager } from '../../../tests/db-manager.js' +import { restPostCall } from '../../../tests/_utils/index.js' +import { titreDemarcheCreate } from '../../database/queries/titres-demarches.js' +import { titreCreate } from '../../database/queries/titres.js' +import Titres from '../../database/models/titres.js' +import { ADMINISTRATION_IDS } from 'camino-common/src/static/administrations.js' +import { userSuper } from '../../database/user-super' + +import { afterAll, beforeEach, beforeAll, describe, test, expect, vi } from 'vitest' +import type { Pool } from 'pg' +import { demarcheIdValidator } from 'camino-common/src/demarche.js' +import { RestEtapeCreation, defaultHeritageProps } from 'camino-common/src/etape-form.js' +import { HTTP_STATUS } from 'camino-common/src/http.js' +import { toCaminoDate } from 'camino-common/src/date.js' +import { entrepriseIdValidator } from 'camino-common/src/entreprise.js' + +console.info = vi.fn() +console.error = vi.fn() +let dbPool: Pool + +beforeAll(async () => { + const { pool } = await dbManager.populateDb() + dbPool = pool +}) + +beforeEach(async () => { + await Titres.query().delete() +}) + +afterAll(async () => { + await dbManager.closeKnex() +}) + +const demarcheCreate = async () => { + const titre = await titreCreate( + { + nom: 'mon titre', + typeId: 'arm', + titreStatutId: 'ind', + propsTitreEtapesIds: {}, + }, + {} + ) + + const titreDemarche = await titreDemarcheCreate({ + titreId: titre.id, + typeId: 'oct', + }) + + return titreDemarche.id +} + +const blankEtapeProps: Pick< + RestEtapeCreation, + | 'etapeDocuments' + | 'duree' + | 'dateDebut' + | 'dateFin' + | 'substances' + | 'geojson4326Perimetre' + | 'geojsonOriginePerimetre' + | 'geojson4326Points' + | 'geojsonOriginePoints' + | 'geojsonOrigineForages' + | 'geojsonOrigineGeoSystemeId' + | 'titulaireIds' + | 'amodiataireIds' + | 'notes' + | 'etapeAvis' + | 'entrepriseDocumentIds' + | 'heritageProps' + | 'heritageContenu' + | 'contenu' +> = { + etapeDocuments: [], + duree: null, + dateDebut: null, + dateFin: null, + substances: [], + geojson4326Perimetre: null, + geojsonOriginePerimetre: null, + geojson4326Points: null, + geojsonOriginePoints: null, + geojsonOrigineForages: null, + geojsonOrigineGeoSystemeId: null, + titulaireIds: [], + amodiataireIds: [], + notes: null, + etapeAvis: [], + entrepriseDocumentIds: [], + heritageProps: defaultHeritageProps, + heritageContenu: {}, + contenu: {}, +} as const +describe('etapeCreer', () => { + test('ne peut pas créer une étape (utilisateur non authentifié)', async () => { + const result = await restPostCall(dbPool, '/rest/etapes', {}, undefined, { typeId: '', statutId: '', titreDemarcheId: '', date: '' } as unknown as RestEtapeCreation) + + expect(result.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_FORBIDDEN) + }) + test('ne peut pas créer une étape (utilisateur administration)', async () => { + const result = await restPostCall(dbPool, '/rest/etapes', {}, { role: 'editeur', administrationId: 'ope-onf-973-01' }, { + typeId: '', + statutId: '', + titreDemarcheId: '', + date: '', + } as unknown as RestEtapeCreation) + + expect(result.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_BAD_REQUEST) + expect(result.body).toStrictEqual({ errorMessage: "l'étape n'est pas correctement formatée" }) + }) + + test('ne peut pas créer une étape sur une démarche inexistante (utilisateur admin)', async () => { + const res = await restPostCall( + dbPool, + '/rest/etapes', + {}, + { role: 'admin', administrationId: 'ope-onf-973-01' }, + { + typeId: 'mfr', + statutId: 'fai', + titreDemarcheId: demarcheIdValidator.parse(''), + date: toCaminoDate('2018-01-01'), + ...blankEtapeProps, + } + ) + + expect(res.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_NOT_FOUND) + expect(res.body).toMatchInlineSnapshot(` + { + "errorMessage": "la démarche n'existe pas", + } + `) + }) + + test('ne peut pas créer une étape de mia faite avec le ptmg', async () => { + const titreDemarcheId = await demarcheCreate() + + const res = await restPostCall( + dbPool, + '/rest/etapes', + {}, + + { + role: 'admin', + administrationId: ADMINISTRATION_IDS['PÔLE TECHNIQUE MINIER DE GUYANE'], + }, + { + typeId: 'sca', + statutId: 'fai', + titreDemarcheId, + date: toCaminoDate('2018-01-01'), + ...blankEtapeProps, + } + ) + + expect(res.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_BAD_REQUEST) + expect(res.body).toMatchInlineSnapshot(` + { + "errorMessage": "droits insuffisants pour créer cette étape", + } + `) + }) + test('ne peut pas créer une étape incohérente (asc avec statut fav) (utilisateur admin)', async () => { + const titreDemarcheId = await demarcheCreate() + + const res = await restPostCall( + dbPool, + '/rest/etapes', + {}, + { + role: 'admin', + administrationId: ADMINISTRATION_IDS['PÔLE TECHNIQUE MINIER DE GUYANE'], + }, + { + typeId: 'asc', + statutId: 'fav', + titreDemarcheId, + date: toCaminoDate('2018-01-01'), + ...blankEtapeProps, + } + ) + + expect(res.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_BAD_REQUEST) + expect(res.body).toMatchInlineSnapshot(` + { + "errorMessage": "statut de l'étape "fav" invalide pour une étape asc pour une démarche de type octroi", + } + `) + }) + + test('peut créer une étape asc avec un statut fai (utilisateur super)', async () => { + const titreDemarcheId = await demarcheCreate() + + const res = await restPostCall(dbPool, '/rest/etapes', {}, userSuper, { + typeId: 'asc', + statutId: 'fai', + titreDemarcheId, + date: toCaminoDate('2018-01-01'), + ...blankEtapeProps, + }) + + expect(res.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_OK) + }) + + test('peut créer une étape MEN sur un titre ARM en tant que PTMG (utilisateur admin)', async () => { + const titreDemarcheId = await demarcheCreate() + const res = await restPostCall( + dbPool, + '/rest/etapes', + {}, + { + role: 'admin', + administrationId: ADMINISTRATION_IDS['PÔLE TECHNIQUE MINIER DE GUYANE'], + }, + { + typeId: 'men', + statutId: 'fai', + titreDemarcheId, + date: toCaminoDate('2018-01-01'), + ...blankEtapeProps, + } + ) + + expect(res.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_OK) + }) + + test('ne peut pas créer une étape EDE sur un titre ARM en tant que PTMG (utilisateur admin)', async () => { + const titreDemarcheId = await demarcheCreate() + + const res = await restPostCall( + dbPool, + '/rest/etapes', + {}, + { + role: 'admin', + administrationId: ADMINISTRATION_IDS['PÔLE TECHNIQUE MINIER DE GUYANE'], + }, + { + typeId: 'ede', + statutId: 'fai', + titreDemarcheId, + date: toCaminoDate('2018-01-01'), + ...blankEtapeProps, + heritageContenu: { + deal: { motifs: { actif: false }, agent: { actif: false } }, + }, + contenu: { + deal: { motifs: 'motif', agent: 'agent' }, + }, + } + ) + + expect(res.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_BAD_REQUEST) + expect(res.body).toMatchInlineSnapshot(` + { + "errorMessage": "statut de l'étape "fai" invalide pour une étape ede pour une démarche de type octroi", + } + `) + }) + + test('ne peut pas créer une étape avec des titulaires inexistants', async () => { + const titreDemarcheId = await demarcheCreate() + + const res = await restPostCall(dbPool, '/rest/etapes', {}, userSuper, { + typeId: 'ede', + statutId: 'fav', + titreDemarcheId, + date: toCaminoDate('2018-01-01'), + ...blankEtapeProps, + titulaireIds: [entrepriseIdValidator.parse('inexistant')], + heritageContenu: { + deal: { motifs: { actif: false }, agent: { actif: false } }, + }, + contenu: { + deal: { motifs: 'motif', agent: 'agent' }, + }, + }) + + expect(res.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_BAD_REQUEST) + expect(res.body).toMatchInlineSnapshot(` + { + "errorMessage": "certaines entreprises n'existent pas", + } + `) + }) + + test('peut créer une étape mfr en brouillon avec un champ obligatoire manquant (utilisateur super)', async () => { + const titreDemarcheId = await demarcheCreate() + const res = await restPostCall(dbPool, '/rest/etapes', {}, userSuper, { + typeId: 'mfr', + statutId: 'fai', + titreDemarcheId, + date: toCaminoDate('2018-01-01'), + ...blankEtapeProps, + heritageContenu: { + arm: { + mecanise: { actif: true }, + franchissements: { actif: true }, + }, + }, + }) + + expect(res.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_OK) + }) +}) diff --git a/packages/api/src/api/rest/etape-modifier.test.integration.ts b/packages/api/src/api/rest/etape-modifier.test.integration.ts new file mode 100644 index 000000000..23c272196 --- /dev/null +++ b/packages/api/src/api/rest/etape-modifier.test.integration.ts @@ -0,0 +1,491 @@ +import { dbManager } from '../../../tests/db-manager.js' +import { restPutCall, restCall } from '../../../tests/_utils/index.js' +import { titreDemarcheCreate } from '../../database/queries/titres-demarches.js' +import { titreCreate } from '../../database/queries/titres.js' +import { titreEtapeCreate } from '../../database/queries/titres-etapes.js' +import Titres from '../../database/models/titres.js' +import { userSuper } from '../../database/user-super.js' +import { ADMINISTRATION_IDS } from 'camino-common/src/static/administrations.js' +import { caminoDateValidator, toCaminoDate } from 'camino-common/src/date.js' + +import { afterAll, beforeEach, beforeAll, describe, test, expect, vi } from 'vitest' +import type { Pool } from 'pg' +import { ETAPE_HERITAGE_PROPS, EtapeHeritageProps } from 'camino-common/src/heritage.js' +import { EtapeTypeId, canBeBrouillon } from 'camino-common/src/static/etapesTypes.js' +import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools.js' +import { idGenerate } from '../../database/models/_format/id-create.js' +import { copyFileSync, mkdirSync } from 'fs' +import { TempEtapeDocument } from 'camino-common/src/etape.js' +import { tempDocumentNameValidator } from 'camino-common/src/document.js' +import { HTTP_STATUS } from 'camino-common/src/http.js' +import { Knex } from 'knex' +import { testDocumentCreateTemp } from '../../../tests/_utils/administrations-permissions.js' +import { RestEtapeModification } from 'camino-common/src/etape-form.js' +import { EntrepriseId } from 'camino-common/src/entreprise.js' + +vi.mock('../../tools/dir-create', () => ({ + __esModule: true, + default: vi.fn(), +})) + +console.info = vi.fn() +console.error = vi.fn() +let dbPool: Pool +let knexInstance: Knex +beforeAll(async () => { + const { pool, knex } = await dbManager.populateDb() + dbPool = pool + knexInstance = knex +}) + +beforeEach(async () => { + await knexInstance.raw('delete from etapes_documents') + await Titres.query().delete() +}) + +afterAll(async () => { + await dbManager.closeKnex() +}) + +async function etapeCreate(typeId?: EtapeTypeId) { + const titre = await titreCreate( + { + nom: 'mon titre', + typeId: 'arm', + titreStatutId: 'ind', + propsTitreEtapesIds: {}, + }, + {} + ) + const titreDemarche = await titreDemarcheCreate({ + titreId: titre.id, + typeId: 'oct', + }) + + const myTypeId = isNotNullNorUndefined(typeId) ? typeId : 'mfr' + const titreEtape = await titreEtapeCreate( + { + typeId: myTypeId, + statutId: 'fai', + ordre: 1, + titreDemarcheId: titreDemarche.id, + date: toCaminoDate('2018-01-01'), + isBrouillon: canBeBrouillon(myTypeId), + }, + userSuper, + titre.id + ) + + return { titreDemarcheId: titreDemarche.id, titreEtapeId: titreEtape.id } +} + +describe('etapeModifier', () => { + test('ne peut pas modifier une étape (utilisateur anonyme)', async () => { + const result = await restPutCall(dbPool, '/rest/etapes', {}, undefined, { id: '', typeId: '', statutId: '', titreDemarcheId: '', date: '' } as unknown as RestEtapeModification) + + expect(result.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_FORBIDDEN) + }) + + test('ne peut pas modifier une étape mal formatée (utilisateur super)', async () => { + const result = await restPutCall(dbPool, '/rest/etapes', {}, userSuper, { + id: '', + typeId: '', + statutId: '', + date: '', + } as unknown as RestEtapeModification) + + expect(result.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_BAD_REQUEST) + }) + + test('peut modifier une étape mfr en brouillon (utilisateur super)', async () => { + const { titreDemarcheId, titreEtapeId } = await etapeCreate() + const result = await restPutCall(dbPool, '/rest/etapes', {}, userSuper, { + id: titreEtapeId, + typeId: 'mfr', + statutId: 'fai', + titreDemarcheId, + date: caminoDateValidator.parse('2018-01-01'), + duree: null, + dateDebut: null, + dateFin: null, + substances: [], + geojson4326Perimetre: null, + geojsonOriginePerimetre: null, + geojson4326Points: null, + geojsonOriginePoints: null, + geojsonOrigineForages: null, + geojsonOrigineGeoSystemeId: null, + titulaireIds: [], + amodiataireIds: [], + notes: null, + etapeAvis: [], + entrepriseDocumentIds: [], + daeDocument: null, + aslDocument: null, + heritageProps: ETAPE_HERITAGE_PROPS.reduce( + (acc, prop) => { + acc[prop] = { actif: false } + + return acc + }, + {} as { + [key in EtapeHeritageProps]: { actif: boolean } + } + ), + heritageContenu: { + arm: { + mecanise: { actif: false }, + franchissements: { actif: false }, + }, + }, + contenu: { + arm: { mecanise: true, franchissements: 3 }, + }, + etapeDocuments: [], + }) + expect(result.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_OK) + }) + + test("ne peut pas modifier une étape avec des entreprises qui n'existent pas", async () => { + const { titreDemarcheId, titreEtapeId } = await etapeCreate() + const result = await restPutCall(dbPool, '/rest/etapes', {}, userSuper, { + id: titreEtapeId, + typeId: 'mfr', + statutId: 'fai', + titulaireIds: ['inexistant' as EntrepriseId], + titreDemarcheId, + date: caminoDateValidator.parse('2018-01-01'), + duree: null, + dateDebut: null, + dateFin: null, + substances: [], + geojson4326Perimetre: null, + geojsonOriginePerimetre: null, + geojson4326Points: null, + geojsonOriginePoints: null, + geojsonOrigineForages: null, + geojsonOrigineGeoSystemeId: null, + amodiataireIds: [], + notes: null, + etapeAvis: [], + entrepriseDocumentIds: [], + daeDocument: null, + aslDocument: null, + heritageProps: ETAPE_HERITAGE_PROPS.reduce( + (acc, prop) => { + acc[prop] = { actif: false } + + return acc + }, + {} as { + [key in EtapeHeritageProps]: { actif: boolean } + } + ), + heritageContenu: { + arm: { + mecanise: { actif: false }, + franchissements: { actif: false }, + }, + }, + contenu: { + arm: { mecanise: true, franchissements: 3 }, + }, + etapeDocuments: [], + }) + + expect(result.body.errorMessage).toBe("certaines entreprises n'existent pas") + }) + + test("peut supprimer un document d'une demande en brouillon (utilisateur super)", async () => { + const { titreDemarcheId, titreEtapeId } = await etapeCreate() + + const documentToInsert = testDocumentCreateTemp('aac') + + const etape: RestEtapeModification = { + id: titreEtapeId, + typeId: 'mfr', + statutId: 'fai', + titreDemarcheId, + date: caminoDateValidator.parse('2018-01-01'), + duree: null, + dateDebut: null, + dateFin: null, + substances: [], + geojson4326Perimetre: null, + geojsonOriginePerimetre: null, + geojson4326Points: null, + geojsonOriginePoints: null, + geojsonOrigineForages: null, + geojsonOrigineGeoSystemeId: null, + amodiataireIds: [], + titulaireIds: [], + notes: null, + etapeAvis: [], + entrepriseDocumentIds: [], + daeDocument: null, + aslDocument: null, + heritageProps: ETAPE_HERITAGE_PROPS.reduce( + (acc, prop) => { + acc[prop] = { actif: false } + + return acc + }, + {} as { + [key in EtapeHeritageProps]: { actif: boolean } + } + ), + heritageContenu: { + arm: { + mecanise: { actif: false }, + franchissements: { actif: false }, + }, + }, + contenu: { + arm: { mecanise: true, franchissements: 3 }, + }, + etapeDocuments: [documentToInsert], + } + + let res = await restPutCall(dbPool, '/rest/etapes', {}, userSuper, etape) + + expect(res.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_OK) + + const documents = await restCall(dbPool, '/rest/etapes/:etapeId/etapeDocuments', { etapeId: titreEtapeId }, userSuper) + expect(documents.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_OK) + expect(documents.body.etapeDocuments).toHaveLength(1) + expect(documents.body.etapeDocuments[0]).toMatchInlineSnapshot( + { id: expect.any(String) }, + ` + { + "description": "desc", + "entreprises_lecture": true, + "etape_document_type_id": "aac", + "id": Any<String>, + "public_lecture": true, + } + ` + ) + res = await restPutCall(dbPool, '/rest/etapes', {}, userSuper, { ...etape, etapeDocuments: [] }) + + expect(res.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_OK) + }) + + test("ne peut pas supprimer un document obligatoire d'une étape qui n'est pas en brouillon (utilisateur super)", async () => { + const { titreDemarcheId, titreEtapeId } = await etapeCreate('dae') + const dir = `${process.cwd()}/files/tmp/` + + const fileName = `existing_temp_file_${idGenerate()}` + mkdirSync(dir, { recursive: true }) + copyFileSync(`./src/tools/small.pdf`, `${dir}/${fileName}`) + const documentToInsert: TempEtapeDocument = { + etape_document_type_id: 'aac', + entreprises_lecture: true, + public_lecture: true, + description: 'desc', + temp_document_name: tempDocumentNameValidator.parse(fileName), + } + + const etape: RestEtapeModification = { + id: titreEtapeId, + typeId: 'dae', + statutId: 'exe', + titreDemarcheId, + date: caminoDateValidator.parse('2018-01-01'), + duree: null, + dateDebut: null, + dateFin: null, + substances: [], + geojson4326Perimetre: null, + geojsonOriginePerimetre: null, + geojson4326Points: null, + geojsonOriginePoints: null, + geojsonOrigineForages: null, + geojsonOrigineGeoSystemeId: null, + amodiataireIds: [], + titulaireIds: [], + notes: null, + etapeAvis: [], + entrepriseDocumentIds: [], + daeDocument: null, + aslDocument: null, + + heritageProps: ETAPE_HERITAGE_PROPS.reduce( + (acc, prop) => { + acc[prop] = { actif: false } + + return acc + }, + {} as { + [key in EtapeHeritageProps]: { actif: boolean } + } + ), + heritageContenu: { + mea: { + arrete: { actif: false }, + }, + }, + contenu: { + mea: { arrete: 'arrete' }, + }, + etapeDocuments: [documentToInsert], + } + + let res = await restPutCall(dbPool, '/rest/etapes', {}, userSuper, etape) + + expect(res.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_OK) + + res = await restPutCall(dbPool, '/rest/etapes', {}, userSuper, { ...etape, etapeDocuments: [] }) + + expect(res.body.errorMessage).toBe('Impossible de supprimer les documents') + }) + + test('peut modifier une étape mia avec un statut fai (utilisateur super)', async () => { + const { titreDemarcheId, titreEtapeId } = await etapeCreate('asc') + + const res = await restPutCall(dbPool, '/rest/etapes', {}, userSuper, { + id: titreEtapeId, + typeId: 'asc', + statutId: 'fai', + titreDemarcheId, + date: caminoDateValidator.parse('2018-01-01'), + etapeDocuments: [], + duree: null, + dateDebut: null, + dateFin: null, + substances: [], + geojson4326Perimetre: null, + geojsonOriginePerimetre: null, + geojson4326Points: null, + geojsonOriginePoints: null, + geojsonOrigineForages: null, + geojsonOrigineGeoSystemeId: null, + amodiataireIds: [], + titulaireIds: [], + notes: null, + etapeAvis: [], + entrepriseDocumentIds: [], + daeDocument: null, + aslDocument: null, + heritageProps: ETAPE_HERITAGE_PROPS.reduce( + (acc, prop) => { + acc[prop] = { actif: false } + + return acc + }, + {} as { + [key in EtapeHeritageProps]: { actif: boolean } + } + ), + heritageContenu: {}, + contenu: {}, + }) + + expect(res.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_OK) + }) + + test('peut modifier une étape MEN sur un titre ARM en tant que PTMG (utilisateur admin)', async () => { + const { titreDemarcheId, titreEtapeId } = await etapeCreate('men') + const res = await restPutCall( + dbPool, + '/rest/etapes', + {}, + { + role: 'admin', + administrationId: ADMINISTRATION_IDS['PÔLE TECHNIQUE MINIER DE GUYANE'], + }, + { + id: titreEtapeId, + typeId: 'men', + statutId: 'fai', + titreDemarcheId, + date: caminoDateValidator.parse('2016-01-01'), + etapeDocuments: [], + duree: null, + dateDebut: null, + dateFin: null, + substances: [], + geojson4326Perimetre: null, + geojsonOriginePerimetre: null, + geojson4326Points: null, + geojsonOriginePoints: null, + geojsonOrigineForages: null, + geojsonOrigineGeoSystemeId: null, + amodiataireIds: [], + titulaireIds: [], + notes: null, + etapeAvis: [], + entrepriseDocumentIds: [], + daeDocument: null, + aslDocument: null, + heritageProps: ETAPE_HERITAGE_PROPS.reduce( + (acc, prop) => { + acc[prop] = { actif: false } + + return acc + }, + {} as { + [key in EtapeHeritageProps]: { actif: boolean } + } + ), + heritageContenu: {}, + contenu: {}, + } + ) + + expect(res.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_OK) + }) + + test('ne peut pas modifier une étape EDE sur un titre ARM en tant que PTMG (utilisateur admin)', async () => { + const { titreDemarcheId, titreEtapeId } = await etapeCreate('ede') + const res = await restPutCall( + dbPool, + '/rest/etapes', + {}, + { + role: 'admin', + administrationId: ADMINISTRATION_IDS['PÔLE TECHNIQUE MINIER DE GUYANE'], + }, + { + id: titreEtapeId, + typeId: 'ede', + statutId: 'fai', + titreDemarcheId, + date: caminoDateValidator.parse('2018-01-01'), + duree: null, + dateDebut: null, + dateFin: null, + substances: [], + geojson4326Perimetre: null, + geojsonOriginePerimetre: null, + geojson4326Points: null, + geojsonOriginePoints: null, + geojsonOrigineForages: null, + geojsonOrigineGeoSystemeId: null, + amodiataireIds: [], + titulaireIds: [], + notes: null, + etapeAvis: [], + entrepriseDocumentIds: [], + daeDocument: null, + aslDocument: null, + etapeDocuments: [], + heritageProps: ETAPE_HERITAGE_PROPS.reduce( + (acc, prop) => { + acc[prop] = { actif: false } + + return acc + }, + {} as { + [key in EtapeHeritageProps]: { actif: boolean } + } + ), + heritageContenu: { + deal: { motifs: { actif: false }, agent: { actif: false } }, + }, + contenu: { deal: { motifs: 'motif', agent: 'agent' } }, + } + ) + + expect(res.body.errorMessage).toBe("l'étape n'existe pas") + }) +}) diff --git a/packages/api/src/api/rest/etapes.queries.ts b/packages/api/src/api/rest/etapes.queries.ts index 9804fb22b..18d72e778 100644 --- a/packages/api/src/api/rest/etapes.queries.ts +++ b/packages/api/src/api/rest/etapes.queries.ts @@ -1,5 +1,5 @@ /* eslint-disable no-restricted-syntax */ -import { EtapeDocumentId, EtapeId, EtapeIdOrSlug, etapeIdValidator, etapeSlugValidator } from 'camino-common/src/etape.js' +import { EtapeDocumentId, EtapeId, EtapeIdOrSlug, etapeBrouillonValidator, etapeIdValidator, etapeSlugValidator } from 'camino-common/src/etape.js' import { EtapeTypeId, etapeTypeIdValidator } from 'camino-common/src/static/etapesTypes.js' import { Pool } from 'pg' import { z } from 'zod' @@ -73,11 +73,7 @@ export const getLargeobjectIdByEtapeDocumentId = async (pool: Pool, user: User, if (result.length === 1) { const etapeDocument = result[0] - const etapeData = await getEtapeDataForEdition(pool, etapeDocument.etape_id) - - const titreTypeId = memoize(() => Promise.resolve(etapeData.titre_type_id)) - const administrationsLocales = memoize(() => administrationsLocalesByEtapeId(etapeDocument.etape_id, pool)) - const entreprisesTitulairesOuAmodiataires = memoize(() => entreprisesTitulairesOuAmoditairesByEtapeId(etapeDocument.etape_id, pool)) + const { etapeData, titreTypeId, administrationsLocales, entreprisesTitulairesOuAmodiataires } = await getEtapeDataForEdition(pool, etapeDocument.etape_id) if ( await canReadDocument(etapeDocument, user, titreTypeId, administrationsLocales, entreprisesTitulairesOuAmodiataires, etapeData.etape_type_id, { @@ -107,7 +103,13 @@ LIMIT 1 ` export const getEtapeDataForEdition = async (pool: Pool, etapeId: EtapeId) => { - return (await dbQueryAndValidate(getEtapeDataForEditionDb, { etapeId }, pool, getEtapeDataForEditionValidator))[0] + const etapeData = (await dbQueryAndValidate(getEtapeDataForEditionDb, { etapeId }, pool, getEtapeDataForEditionValidator))[0] + + const titreTypeId = memoize(() => Promise.resolve(etapeData.titre_type_id)) + const administrationsLocales = memoize(() => administrationsLocalesByEtapeId(etapeId, pool)) + const entreprisesTitulairesOuAmodiataires = memoize(() => entreprisesTitulairesOuAmoditairesByEtapeId(etapeId, pool)) + + return { etapeData, titreTypeId, administrationsLocales, entreprisesTitulairesOuAmodiataires } } const getEtapeDataForEditionValidator = z.object({ @@ -120,7 +122,7 @@ const getEtapeDataForEditionValidator = z.object({ demarche_entreprises_lecture: z.boolean(), titre_public_lecture: z.boolean(), etape_slug: etapeSlugValidator, - etape_is_brouillon: z.boolean(), + etape_is_brouillon: etapeBrouillonValidator, }) export type GetEtapeDataForEdition = z.infer<typeof getEtapeDataForEditionValidator> @@ -145,7 +147,7 @@ where te.id = $ etapeId ! ` -export const administrationsLocalesByEtapeId = async (etapeId: EtapeId, pool: Pool): Promise<AdministrationId[]> => { +const administrationsLocalesByEtapeId = async (etapeId: EtapeId, pool: Pool): Promise<AdministrationId[]> => { const admins = await dbQueryAndValidate(getAdministrationsLocalesByEtapeId, { etapeId }, pool, administrationsLocalesValidator) if (admins.length > 1) { throw new Error(`Trop d'administrations locales trouvées pour l'etape ${etapeId}`) @@ -170,7 +172,7 @@ where te.id = $ etapeId ! ` -export const entreprisesTitulairesOuAmoditairesByEtapeId = async (etapeId: EtapeId, pool: Pool): Promise<EntrepriseId[]> => { +const entreprisesTitulairesOuAmoditairesByEtapeId = async (etapeId: EtapeId, pool: Pool): Promise<EntrepriseId[]> => { const entreprises = await dbQueryAndValidate(getTitulairesAmodiatairesTitreEtape, { etapeId }, pool, entrepriseIdObjectValidator) return entreprises.map(({ id }) => id) diff --git a/packages/api/src/api/rest/etapes.test.integration.ts b/packages/api/src/api/rest/etapes.test.integration.ts index 2791fe0fb..c35ca8561 100644 --- a/packages/api/src/api/rest/etapes.test.integration.ts +++ b/packages/api/src/api/rest/etapes.test.integration.ts @@ -3,16 +3,21 @@ import { titreCreate } from '../../database/queries/titres.js' import { titreDemarcheCreate } from '../../database/queries/titres-demarches.js' import { userSuper } from '../../database/user-super.js' import { restCall, restDeleteCall } from '../../../tests/_utils/index.js' -import { getCurrent, toCaminoDate } from 'camino-common/src/date.js' +import { caminoDateValidator, getCurrent, toCaminoDate } from 'camino-common/src/date.js' import { afterAll, beforeAll, test, expect, describe, vi } from 'vitest' import type { Pool } from 'pg' import { HTTP_STATUS } from 'camino-common/src/http.js' import { Role, isAdministrationRole } from 'camino-common/src/roles.js' -import { titreEtapeCreate } from '../../database/queries/titres-etapes.js' +import { titreEtapeCreate, titreEtapeUpdate } from '../../database/queries/titres-etapes.js' import { entrepriseIdValidator } from 'camino-common/src/entreprise.js' import { TestUser, testBlankUser } from 'camino-common/src/tests-utils.js' import { entrepriseUpsert } from '../../database/queries/entreprises.js' import { Knex } from 'knex' +import { ETAPE_IS_BROUILLON, etapeAvisIdValidator } from 'camino-common/src/etape.js' +import { insertEtapeAvisWithLargeObjectId } from '../../database/queries/titres-etapes.queries.js' +import { largeObjectIdValidator } from '../../database/largeobjects.js' +import { AvisVisibilityIds } from 'camino-common/src/static/avisTypes.js' +import { tempDocumentNameValidator } from 'camino-common/src/document.js' console.info = vi.fn() console.error = vi.fn() @@ -48,6 +53,10 @@ test('getEtapesTypesEtapesStatusWithMainStep', async () => { const tested = await restCall(dbPool, '/rest/etapesTypes/:demarcheId/:date', { demarcheId: titreDemarche.id, date: getCurrent() }, userSuper) expect(tested.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_OK) + // TODO 2024-06-19 changer ce format ? + // Partir plutôt sur un object avec comme clé le etapeTypeId, une liste de etapeStatut associée et la clé mainStep (soit sur le statut, soit directement au top niveau) + // soit { mfr: {statuts: ['fai'], mainStep: true}} + // soit { mfr: {statuts: [{id: 'fai', mainStep: true}]}} expect(tested.body).toMatchInlineSnapshot(` [ { @@ -123,7 +132,7 @@ describe('etapeSupprimer', () => { { typeId: 'mfr', statutId: 'fai', - isBrouillon: true, + isBrouillon: ETAPE_IS_BROUILLON, ordre: 1, titreDemarcheId: titreDemarche.id, date: toCaminoDate('2018-01-01'), @@ -131,7 +140,12 @@ describe('etapeSupprimer', () => { userSuper, titre.id ) - const tested = await restDeleteCall(dbPool, '/rest/etapes/:etapeId', { etapeId: titreEtape.id }, role && isAdministrationRole(role) ? { role, administrationId: 'dea-guyane-01' } : undefined) + const tested = await restDeleteCall( + dbPool, + '/rest/etapes/:etapeIdOrSlug', + { etapeIdOrSlug: titreEtape.id }, + role && isAdministrationRole(role) ? { role, administrationId: 'dea-guyane-01' } : undefined + ) expect(tested.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_FORBIDDEN) }) @@ -155,7 +169,7 @@ describe('etapeSupprimer', () => { { typeId: 'mfr', statutId: 'fai', - isBrouillon: true, + isBrouillon: ETAPE_IS_BROUILLON, ordre: 1, titreDemarcheId: titreDemarche.id, date: toCaminoDate('2018-01-01'), @@ -163,7 +177,7 @@ describe('etapeSupprimer', () => { userSuper, titre.id ) - const tested = await restDeleteCall(dbPool, '/rest/etapes/:etapeId', { etapeId: titreEtape.id }, userSuper) + const tested = await restDeleteCall(dbPool, '/rest/etapes/:etapeIdOrSlug', { etapeIdOrSlug: titreEtape.id }, userSuper) expect(tested.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_NO_CONTENT) }) @@ -194,7 +208,7 @@ describe('etapeSupprimer', () => { { typeId: 'mfr', statutId: 'fai', - isBrouillon: true, + isBrouillon: ETAPE_IS_BROUILLON, ordre: 1, titreDemarcheId: titreDemarche.id, date: toCaminoDate('2018-01-01'), @@ -215,8 +229,79 @@ describe('etapeSupprimer', () => { const getEtape = await restCall(dbPool, '/rest/titres/:titreId', { titreId: titre.id }, user) expect(getEtape.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_OK) - const tested = await restDeleteCall(dbPool, '/rest/etapes/:etapeId', { etapeId: titreEtape.id }, user) + const tested = await restDeleteCall(dbPool, '/rest/etapes/:etapeIdOrSlug', { etapeIdOrSlug: titreEtape.id }, user) expect(tested.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_FORBIDDEN) }) }) + +describe('getEtapeAvis', () => { + test('test la récupération des avis', async () => { + const titre = await titreCreate( + { + nom: 'nomTitre', + typeId: 'arm', + titreStatutId: 'val', + propsTitreEtapesIds: {}, + }, + {} + ) + + const titreDemarche = await titreDemarcheCreate({ + titreId: titre.id, + typeId: 'oct', + }) + + const titreEtape = await titreEtapeCreate( + { + typeId: 'mfr', + statutId: 'fai', + isBrouillon: ETAPE_IS_BROUILLON, + ordre: 1, + titreDemarcheId: titreDemarche.id, + date: toCaminoDate('2018-01-01'), + }, + userSuper, + titre.id + ) + + let getAvis = await restCall(dbPool, '/rest/etapes/:etapeId/etapeAvis', { etapeId: titreEtape.id }, userSuper) + expect(getAvis.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_OK) + expect(getAvis.body).toStrictEqual([]) + + await titreEtapeUpdate(titreEtape.id, { typeId: 'asc' }, userSuper, titre.id) + getAvis = await restCall(dbPool, '/rest/etapes/:etapeId/etapeAvis', { etapeId: titreEtape.id }, userSuper) + expect(getAvis.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_OK) + expect(getAvis.body).toStrictEqual([]) + + await insertEtapeAvisWithLargeObjectId( + dbPool, + titreEtape.id, + { + avis_type_id: 'autreAvis', + date: caminoDateValidator.parse('2023-02-01'), + avis_statut_id: 'Favorable', + description: 'Super', + avis_visibility_id: AvisVisibilityIds.Administrations, + temp_document_name: tempDocumentNameValidator.parse('fakeTempDocumentName'), + }, + etapeAvisIdValidator.parse('avisId'), + largeObjectIdValidator.parse(42) + ) + getAvis = await restCall(dbPool, '/rest/etapes/:etapeId/etapeAvis', { etapeId: titreEtape.id }, userSuper) + expect(getAvis.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_OK) + expect(getAvis.body).toMatchInlineSnapshot(` + [ + { + "avis_statut_id": "Favorable", + "avis_type_id": "autreAvis", + "avis_visibility_id": "Administrations", + "date": "2023-02-01", + "description": "Super", + "has_file": true, + "id": "avisId", + }, + ] + `) + }) +}) diff --git a/packages/api/src/api/rest/etapes.test.ts b/packages/api/src/api/rest/etapes.test.ts index 7c27d9c38..1b4313ead 100644 --- a/packages/api/src/api/rest/etapes.test.ts +++ b/packages/api/src/api/rest/etapes.test.ts @@ -1,18 +1,51 @@ -import { etapesTypesPossibleACetteDateOuALaPlaceDeLEtape } from './etapes.js' +import { arePointsOnPerimeter, etapesTypesPossibleACetteDateOuALaPlaceDeLEtape } from './etapes.js' import { ArmOctMachine } from '../../business/rules-demarches/arm/oct.machine.js' import { toCaminoDate } from 'camino-common/src/date.js' import { describe, expect, test, vi } from 'vitest' import { onlyUnique } from 'camino-common/src/typescript-tools.js' import { newEtapeId } from '../../database/models/_format/id-create.js' import { TitreEtapeForMachine } from '../../business/rules-demarches/machine-common.js' +import { ETAPE_IS_NOT_BROUILLON } from 'camino-common/src/etape.js' +import { FeatureMultiPolygon } from 'camino-common/src/perimetre' + +const bigGeoJson: FeatureMultiPolygon = { + type: 'Feature', + properties: {}, + geometry: { + type: 'MultiPolygon', + // prettier-ignore + "coordinates": [ [ [ [ -4.370364497124209, 48.53380508608616 ], [ -4.373271574712479, 48.47151134163559 ], [ -4.03753485335386, 48.579164636474836 ], [ -3.89919702975027, 48.603980178934115 ], [ -3.860482328708233, 48.62511389817695 ], [ -3.858436311611334, 48.629031691751045 ], [ -3.862157259991486, 48.633014015139416 ], [ -3.870281882041237, 48.63550010399696 ], [ -3.879786359001045, 48.639113643702565 ], [ -3.895430188480503, 48.64455770816115 ], [ -3.89902273351368, 48.64822789311303 ], [ -3.902536979616769, 48.654435032933826 ], [ -3.906528075174153, 48.66061643462235 ], [ -3.904489574558275, 48.6643307169305 ], [ -3.89647573803132, 48.66601900245078 ], [ -3.890673665115296, 48.667020244464325 ], [ -3.890721315690864, 48.67062455977177 ], [ -3.892950905315848, 48.67088770685571 ], [ -3.898005277721187, 48.6723935639094 ], [ -3.8992413951649, 48.67074624589731 ], [ -3.903300809713803, 48.67034264689684 ], [ -3.907548440632195, 48.66910635173531 ], [ -3.91185396569359, 48.669954398127075 ], [ -3.914635548862354, 48.67322568941628 ], [ -3.920575104032537, 48.67458696237509 ], [ -3.924157593611878, 48.669749821082725 ], [ -3.927138109422188, 48.66538094626539 ], [ -3.927802453245391, 48.66178827244388 ], [ -3.92880004801291, 48.660065331624466 ], [ -3.930674658925236, 48.657424523021 ], [ -3.934385020441046, 48.65730036039394 ], [ -3.940574301992641, 48.65682750256307 ], [ -3.949892212356874, 48.653210569309856 ], [ -3.9518951695476, 48.64983646195122 ], [ -3.95135848409069, 48.646306571150944 ], [ -3.952791103114349, 48.64456097348628 ], [ -3.954311041643234, 48.64535110107629 ], [ -3.957178207067545, 48.65093506946735 ], [ -3.95632686509049, 48.654756209794456 ], [ -3.954939197043658, 48.66049485799891 ], [ -3.958264581105623, 48.66351217516115 ], [ -3.954301077151103, 48.665175330569724 ], [ -3.958113788215813, 48.66678821578858 ], [ -3.958288500972019, 48.67004622329816 ], [ -3.953583216471425, 48.67102223996598 ], [ -3.952154912225681, 48.67280542236 ], [ -3.954601922703807, 48.67354649576719 ], [ -3.957150323952388, 48.6728667311387 ], [ -3.962232217223142, 48.674085603023535 ], [ -3.96509885038279, 48.67647290565392 ], [ -3.968196892552599, 48.67354977814375 ], [ -3.970552500285286, 48.67336152037275 ], [ -3.971907150463719, 48.67429537178488 ], [ -3.971687730880199, 48.67565139942766 ], [ -3.968925351937541, 48.67998621214178 ], [ -3.97276835094199, 48.68681279071675 ], [ -3.969905040239144, 48.687617856017994 ], [ -3.967785856011854, 48.69274164929216 ], [ -3.97050395358365, 48.693904041872074 ], [ -3.974129066864182, 48.69665141578885 ], [ -3.976827175680581, 48.699084231748806 ], [ -3.973964059500176, 48.70207052891004 ], [ -3.97557715354335, 48.70449012698265 ], [ -3.972337757698344, 48.70582333762662 ], [ -3.974038535718974, 48.710344199247295 ], [ -3.972061362590358, 48.71168433267898 ], [ -3.969407494937729, 48.71919463600953 ], [ -3.966114995158957, 48.719188628020184 ], [ -3.964815895310649, 48.72248973384656 ], [ -3.968123622922862, 48.72216808659624 ], [ -3.970117554054281, 48.7239825094888 ], [ -3.971030085004171, 48.72531725688056 ], [ -3.974105493634571, 48.72442714535237 ], [ -3.977130032296356, 48.72223266964199 ], [ -3.98038470744471, 48.72282149601802 ], [ -3.98267568678471, 48.72451484026706 ], [ -3.983159793997456, 48.72623219482621 ], [ -3.985655519886893, 48.726898196761965 ], [ -3.988412331317411, 48.727004809776105 ], [ -3.990251104366354, 48.72588975599552 ], [ -3.992106999472123, 48.723541171653366 ], [ -3.992308257471176, 48.72204072794657 ], [ -3.990818477440011, 48.71838055340067 ], [ -3.993241558794496, 48.715311146944074 ], [ -3.99726181945054, 48.71273584775902 ], [ -4.000886986292233, 48.71141716999743 ], [ -4.005573266114372, 48.715195490443925 ], [ -4.004640753163968, 48.716989015759715 ], [ -4.007861713401779, 48.72044675798358 ], [ -4.009590286562232, 48.72068101995395 ], [ -4.012907971574204, 48.71865165832863 ], [ -4.010881803078078, 48.716872551149415 ], [ -4.013298574720932, 48.713765123429766 ], [ -4.018283788022766, 48.71146515516518 ], [ -4.02502266800395, 48.710486602386844 ], [ -4.029102910364339, 48.7109751516783 ], [ -4.032895375568785, 48.712496949149184 ], [ -4.034013864663466, 48.71364906002572 ], [ -4.035203599079426, 48.71386049099469 ], [ -4.036426674181452, 48.711761570746404 ], [ -4.035857818689737, 48.70935978588029 ], [ -4.037836186006247, 48.70536884991981 ], [ -4.040876440962449, 48.70331706201061 ], [ -4.042661395770205, 48.70267658451317 ], [ -4.044522857875245, 48.70264835316387 ], [ -4.048746772595955, 48.70536952092104 ], [ -4.051782617787177, 48.70458102418029 ], [ -4.053387641319855, 48.70237110662314 ], [ -4.054960885021424, 48.69887510664347 ], [ -4.057098904957046, 48.688336149296134 ], [ -4.047492224129947, 48.6881905546806 ], [ -4.04264615919883, 48.688356681641565 ], [ -4.05570877851515, 48.685187990084636 ], [ -4.061384711067841, 48.687678086132514 ], [ -4.063856568443375, 48.68626486757381 ], [ -4.069006699782528, 48.687977416990556 ], [ -4.066114156101222, 48.68600063748565 ], [ -4.065917761777147, 48.68383188367652 ], [ -4.06536435070835, 48.68281963355705 ], [ -4.062811851052143, 48.68243638561189 ], [ -4.063604286352126, 48.680735563101265 ], [ -4.061249339782617, 48.68019915458731 ], [ -4.060491984152113, 48.67893668983929 ], [ -4.056630622211962, 48.67523642323898 ], [ -4.055350396131191, 48.67179995101334 ], [ -4.057224936686009, 48.670572879663034 ], [ -4.057969445321888, 48.675068847630506 ], [ -4.059622862128396, 48.675122344607715 ], [ -4.06024682153259, 48.67613145254186 ], [ -4.063213863275964, 48.67815002912692 ], [ -4.064507934140134, 48.677605925445725 ], [ -4.067195178609656, 48.67891661518815 ], [ -4.068000601946539, 48.68272446881325 ], [ -4.07116708376152, 48.68462241191764 ], [ -4.080222240659125, 48.689712089777736 ], [ -4.082890717412141, 48.693212237422216 ], [ -4.0837341887691, 48.69168549285934 ], [ -4.08645810312384, 48.69005696722575 ], [ -4.08922980276701, 48.69161527586137 ], [ -4.091651149022687, 48.69171173600047 ], [ -4.095188717132302, 48.686965610139666 ], [ -4.097383839952319, 48.69356464812578 ], [ -4.102536986221444, 48.69351221259058 ], [ -4.106197887484285, 48.692515838515405 ], [ -4.109568285925066, 48.69472448012849 ], [ -4.115803404112282, 48.69506791354793 ], [ -4.118098969264236, 48.692778728280935 ], [ -4.12511664716867, 48.693877169595176 ], [ -4.127837461875522, 48.69361476668908 ], [ -4.131236501370729, 48.6960475956426 ], [ -4.136181126707938, 48.69293107079426 ], [ -4.142132619722753, 48.69237814384752 ], [ -4.150020162763907, 48.69217377284019 ], [ -4.152170300893284, 48.691487051119246 ], [ -4.162483098525137, 48.68833023827453 ], [ -4.174170898732186, 48.657628672506775 ], [ -4.409843663429304, 48.633874515395604 ], [ -4.370364497124209, 48.53380508608616 ] + ] + ] + ], + }, +} + +test('arePointsOnPerimeter', () => { + expect(arePointsOnPerimeter(bigGeoJson, { type: 'FeatureCollection', features: [{ type: 'Feature', properties: {}, geometry: { type: 'Point', coordinates: [1, 2] } }] })).toBe(false) + expect( + arePointsOnPerimeter(bigGeoJson, { type: 'FeatureCollection', features: [{ type: 'Feature', properties: {}, geometry: { type: 'Point', coordinates: [-4.174170898732186, 48.657628672506775] } }] }) + ).toBe(true) +}) + +test('arePointsOnPerimeter every point is on the perimeter', () => { + expect( + arePointsOnPerimeter(bigGeoJson, { + type: 'FeatureCollection', + features: bigGeoJson.geometry.coordinates.flatMap(coordinates => + coordinates.flatMap(sub => sub.flatMap(coordinate => ({ type: 'Feature', properties: {}, geometry: { type: 'Point', coordinates: [coordinate[0], coordinate[1]] } }))) + ), + }) + ).toBe(true) +}) describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { const etapes: TitreEtapeForMachine[] = [ { id: newEtapeId('etapeId16'), typeId: 'sco', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 16, date: toCaminoDate('2020-08-17'), contenu: { arm: { mecanise: true } }, @@ -23,7 +56,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { id: newEtapeId('etapeId1'), typeId: 'mfr', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 1, date: toCaminoDate('2019-09-19'), contenu: { arm: { mecanise: true, franchissements: 19 } }, @@ -34,7 +67,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { id: newEtapeId('etapeId5'), typeId: 'mcp', statutId: 'com', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 5, date: toCaminoDate('2019-11-27'), contenu: null, @@ -43,21 +76,10 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { }, { id: newEtapeId('etapeId10'), - typeId: 'aof', - statutId: 'fav', - isBrouillon: false, - ordre: 10, - date: toCaminoDate('2019-12-04'), - contenu: null, - communes: [], - surface: null, - }, - { - id: newEtapeId('etapeId9'), - typeId: 'eof', + typeId: 'asc', statutId: 'fai', - isBrouillon: false, - ordre: 9, + isBrouillon: ETAPE_IS_NOT_BROUILLON, + ordre: 10, date: toCaminoDate('2019-12-04'), contenu: null, communes: [], @@ -67,7 +89,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { id: newEtapeId('etapeId14'), typeId: 'pfc', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 14, date: toCaminoDate('2020-05-22'), contenu: null, @@ -78,7 +100,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { id: newEtapeId('etapeId8'), typeId: 'mcr', statutId: 'fav', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 8, date: toCaminoDate('2019-12-04'), contenu: null, @@ -89,7 +111,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { id: newEtapeId('etapeId4'), typeId: 'pfd', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 4, date: toCaminoDate('2019-11-20'), contenu: null, @@ -100,7 +122,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { id: newEtapeId('etapeId15'), typeId: 'vfc', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 15, date: toCaminoDate('2020-05-22'), contenu: null, @@ -111,7 +133,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { id: newEtapeId('etapeId13'), typeId: 'mnb', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 13, date: toCaminoDate('2020-05-18'), contenu: null, @@ -122,7 +144,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { id: newEtapeId('etapeId12'), typeId: 'aca', statutId: 'fav', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 12, date: toCaminoDate('2020-05-13'), contenu: null, @@ -133,7 +155,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { id: newEtapeId('etapeId6'), typeId: 'rde', statutId: 'fav', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 6, date: toCaminoDate('2019-12-04'), communes: [], @@ -144,7 +166,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { id: newEtapeId('etapeId2'), typeId: 'mdp', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 2, date: toCaminoDate('2019-09-20'), contenu: null, @@ -155,7 +177,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { id: newEtapeId('etapeId7'), typeId: 'vfd', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 7, date: toCaminoDate('2019-12-04'), contenu: null, @@ -166,7 +188,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { id: newEtapeId('etapeId11'), typeId: 'sca', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 11, date: toCaminoDate('2020-05-04'), contenu: null, @@ -177,7 +199,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { id: newEtapeId('etapeId3'), typeId: 'dae', statutId: 'exe', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 3, date: toCaminoDate('2019-10-11'), contenu: null, @@ -188,7 +210,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { id: newEtapeId('etapeId17'), typeId: 'aco', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 17, date: toCaminoDate('2022-05-05'), contenu: null, @@ -227,7 +249,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { const tested = etapesTypesPossibleACetteDateOuALaPlaceDeLEtape(machine, etapes, null, toCaminoDate('2019-12-04')) .map(({ etapeTypeId }) => etapeTypeId) .filter(onlyUnique) - expect(tested).toStrictEqual(['mod']) + expect(tested).toStrictEqual(['mod', 'ede', 'edm']) }) test('peut faire une dae, une rde et pfd AVANT la mfr', () => { @@ -237,7 +259,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { ordre: 1, typeId: 'mfr', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2022-05-16'), contenu: { arm: { mecanise: true, franchissements: 2 } }, communes: [], @@ -248,7 +270,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { ordre: 2, typeId: 'mdp', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2022-05-17'), contenu: null, communes: [], @@ -269,7 +291,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { ordre: 1, typeId: 'mfr', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2022-05-16'), contenu: { arm: { mecanise: false } }, communes: [], @@ -280,7 +302,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { ordre: 2, typeId: 'mdp', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2022-05-17'), contenu: null, communes: [], @@ -302,7 +324,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { date: toCaminoDate('2021-11-02'), typeId: 'mfr', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, contenu: { arm: { mecanise: true, @@ -318,7 +340,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { date: toCaminoDate('2021-11-17'), typeId: 'rcm', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, contenu: { arm: { mecanise: true, @@ -334,7 +356,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { date: toCaminoDate('2021-11-05'), typeId: 'mcp', statutId: 'inc', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 5, contenu: null, communes: [], @@ -345,29 +367,18 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { date: toCaminoDate('2021-11-17'), typeId: 'mcp', statutId: 'com', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 8, contenu: null, communes: [], surface: null, }, - { - id: newEtapeId('ideof'), - date: toCaminoDate('2021-11-22'), - typeId: 'eof', - statutId: 'fai', - isBrouillon: false, - ordre: 11, - contenu: null, - communes: [], - surface: null, - }, { id: newEtapeId('iddae'), date: toCaminoDate('2021-10-15'), typeId: 'dae', statutId: 'exe', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 1, contenu: null, @@ -379,7 +390,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { date: toCaminoDate('2021-11-22'), typeId: 'mcr', statutId: 'fav', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, contenu: null, ordre: 10, communes: [], @@ -390,7 +401,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { date: toCaminoDate('2021-12-09'), typeId: 'mcb', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 13, contenu: null, @@ -402,7 +413,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { date: toCaminoDate('2021-11-30'), typeId: 'edm', statutId: 'fav', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 12, contenu: null, communes: [], @@ -413,7 +424,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { date: toCaminoDate('2021-11-19'), typeId: 'vfd', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 9, contenu: null, communes: [], @@ -424,7 +435,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { date: toCaminoDate('2021-10-26'), typeId: 'pfd', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 2, contenu: null, communes: [], @@ -435,7 +446,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { date: toCaminoDate('2021-11-02'), typeId: 'mdp', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 4, contenu: null, communes: [], @@ -446,7 +457,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { date: toCaminoDate('2021-11-05'), typeId: 'mcm', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 6, contenu: null, communes: [], @@ -457,7 +468,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { const tested = etapesTypesPossibleACetteDateOuALaPlaceDeLEtape(machine, etapes, null, toCaminoDate('2022-07-01')) .map(({ etapeTypeId }) => etapeTypeId) .filter(onlyUnique) - expect(tested).toStrictEqual(['mod', 'des', 'css', 'aof', 'ede', 'mia', 'rcb', 'rde', 'mcb']) + expect(tested).toStrictEqual(['mod', 'des', 'css', 'ede', 'asc', 'rcb', 'rde', 'mcb']) vi.resetAllMocks() }) test('peut faire une completude (mcp) le même jour que le dépôt (mdp) de la demande', () => { @@ -466,7 +477,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { id: newEtapeId('id3'), typeId: 'mfr', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2022-06-23'), contenu: { arm: { @@ -482,7 +493,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { id: newEtapeId('id1'), typeId: 'dae', statutId: 'exe', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2021-06-22'), ordre: 1, contenu: null, @@ -494,7 +505,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { typeId: 'mdp', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2022-07-01'), ordre: 4, contenu: null, @@ -506,7 +517,7 @@ describe('etapesTypesPossibleACetteDateOuALaPlaceDeLEtape', function () { typeId: 'pfd', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2021-07-05'), ordre: 2, contenu: null, diff --git a/packages/api/src/api/rest/etapes.ts b/packages/api/src/api/rest/etapes.ts index cb729c253..2327261c9 100644 --- a/packages/api/src/api/rest/etapes.ts +++ b/packages/api/src/api/rest/etapes.ts @@ -1,40 +1,82 @@ import { z } from 'zod' import { CaminoRequest, CustomResponse } from './express-type.js' -import { EtapeTypeEtapeStatutWithMainStep, etapeIdValidator, EtapeId, GetEtapeDocumentsByEtapeId, needAslAndDae, documentTypeIdComplementaireObligatoireDAE } from 'camino-common/src/etape.js' +import { + EtapeTypeEtapeStatutWithMainStep, + etapeIdValidator, + EtapeId, + GetEtapeDocumentsByEtapeId, + needAslAndDae, + documentTypeIdComplementaireObligatoireDAE, + ETAPE_IS_NOT_BROUILLON, + etapeIdOrSlugValidator, + GetEtapeAvisByEtapeId, + getEtapeAvisByEtapeIdValidator, + tempEtapeAvisValidator, + tempEtapeDocumentValidator, + EtapeBrouillon, + etapeSlugValidator, + etapeDocumentModificationValidator, + documentComplementaireDaeEtapeDocumentModificationValidator, + documentComplementaireAslEtapeDocumentModificationValidator, + EtapeSlug, +} from 'camino-common/src/etape.js' import { DemarcheId, demarcheIdValidator } from 'camino-common/src/demarche.js' import { HTTP_STATUS } from 'camino-common/src/http.js' import { CaminoDate, caminoDateValidator, getCurrent } from 'camino-common/src/date.js' import { titreDemarcheGet } from '../../database/queries/titres-demarches.js' import { userSuper } from '../../database/user-super.js' -import { titreEtapeGet, titreEtapeUpdate } from '../../database/queries/titres-etapes.js' +import { titreEtapeGet, titreEtapeUpdate, titreEtapeUpsert } from '../../database/queries/titres-etapes.js' import { demarcheDefinitionFind } from '../../business/rules-demarches/definitions.js' import { etapeTypeDateFinCheck } from '../_format/etapes-types.js' import { User, isBureauDEtudes, isEntreprise } from 'camino-common/src/roles.js' -import { canCreateEtape, isEtapeDeposable, canDeleteEtape } from 'camino-common/src/permissions/titres-etapes.js' +import { canCreateEtape, canDeposeEtape, canDeleteEtape, canEditEtape, canEditDates, canEditDuree } from 'camino-common/src/permissions/titres-etapes.js' import { TitresStatutIds } from 'camino-common/src/static/titresStatuts.js' import { CaminoMachines } from '../../business/rules-demarches/machines.js' import { titreEtapesSortAscByOrdre } from '../../business/utils/titre-etapes-sort.js' import { Etape, TitreEtapeForMachine, titreEtapeForMachineValidator, toMachineEtapes } from '../../business/rules-demarches/machine-common.js' import { canBeBrouillon, EtapesTypes, EtapeTypeId } from 'camino-common/src/static/etapesTypes.js' -import { SimplePromiseFn, isNotNullNorUndefined, isNullOrUndefined, memoize, onlyUnique } from 'camino-common/src/typescript-tools.js' +import { DeepReadonly, SimplePromiseFn, isNonEmptyArray, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined, memoize, onlyUnique } from 'camino-common/src/typescript-tools.js' import { getEtapesTDE, isTDEExist } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/index.js' import { EtapeStatutId } from 'camino-common/src/static/etapesStatuts.js' import { getEtapesStatuts } from 'camino-common/src/static/etapesTypesEtapesStatuts.js' import { DemarchesTypes } from 'camino-common/src/static/demarchesTypes.js' import { Pool } from 'pg' -import { EntrepriseId, EtapeEntrepriseDocument } from 'camino-common/src/entreprise.js' -import { getDocumentsByEtapeId, getEntrepriseDocumentIdsByEtapeId } from '../../database/queries/titres-etapes.queries.js' -import { GetEtapeDataForEdition, administrationsLocalesByEtapeId, entreprisesTitulairesOuAmoditairesByEtapeId, getEtapeByDemarcheIdAndEtapeTypeId, getEtapeDataForEdition } from './etapes.queries.js' +import { EntrepriseDocument, EntrepriseDocumentId, EntrepriseId, EtapeEntrepriseDocument } from 'camino-common/src/entreprise.js' +import { + deleteTitreEtapeEntrepriseDocument, + getDocumentsByEtapeId, + getEntrepriseDocumentIdsByEtapeId, + getEtapeAvisLargeObjectIdsByEtapeId, + insertEtapeAvis, + insertEtapeDocuments, + insertTitreEtapeEntrepriseDocument, + updateEtapeAvis, + updateEtapeDocuments, +} from '../../database/queries/titres-etapes.queries.js' +import { GetEtapeDataForEdition, getEtapeByDemarcheIdAndEtapeTypeId, getEtapeDataForEdition } from './etapes.queries.js' import { SDOMZoneId } from 'camino-common/src/static/sdom.js' import { objectClone } from '../../tools/index.js' -import { titreEtapeAdministrationsEmailsSend } from '../graphql/resolvers/_titre-etape-email.js' -import { getGeojsonInformation } from './perimetre.queries.js' +import { titreEtapeAdministrationsEmailsSend, titreEtapeUtilisateursEmailsSend } from '../graphql/resolvers/_titre-etape-email.js' +import { GetGeojsonInformation, convertPoints, getGeojsonInformation } from './perimetre.queries.js' import { titreEtapeUpdateTask } from '../../business/titre-etape-update.js' import { valeurFind } from 'camino-common/src/sections.js' import { getElementWithValue, getSections, getSectionsWithValue } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.js' import { TitreTypeId } from 'camino-common/src/static/titresTypes.js' import { AdministrationId } from 'camino-common/src/static/administrations.js' import { titreDemarcheUpdatedEtatValidate } from '../../business/validations/titre-demarche-etat-validate.js' +import { FlattenEtape, GraphqlEtape, RestEtapeCreation, RestEtapeModification, restEtapeCreationValidator, restEtapeModificationValidator } from 'camino-common/src/etape-form.js' +import { iTitreEtapeToFlattenEtape } from '../_format/titres-etapes.js' +import { CommuneId } from 'camino-common/src/static/communes.js' +import { titreEtapeUpdationValidate } from '../../business/validations/titre-etape-updation-validate.js' +import { IHeritageContenu, IHeritageProps, ITitreDemarche, ITitreEtape } from '../../types.js' +import { checkEntreprisesExist, getEntrepriseDocuments } from './entreprises.queries.js' +import { ETAPE_HERITAGE_PROPS } from 'camino-common/src/heritage.js' +import { titreEtapeHeritageBuild } from '../graphql/resolvers/_titre-etape.js' +import { KM2 } from 'camino-common/src/number.js' +import { FeatureMultiPolygon, FeatureCollectionPoints } from 'camino-common/src/perimetre.js' +import { canHaveForages } from 'camino-common/src/permissions/titres.js' +import { SecteursMaritimes, getSecteurMaritime } from 'camino-common/src/static/facades.js' +import { GEO_SYSTEME_IDS } from 'camino-common/src/static/geoSystemes.js' export const getEtapeEntrepriseDocuments = (pool: Pool) => @@ -140,11 +182,7 @@ export const getEtapeDocuments = res.sendStatus(HTTP_STATUS.HTTP_STATUS_BAD_REQUEST) } else { try { - const etapeData = await getEtapeDataForEdition(pool, etapeIdParsed.data) - - const titreTypeId = memoize(() => Promise.resolve(etapeData.titre_type_id)) - const administrationsLocales = memoize(() => administrationsLocalesByEtapeId(etapeIdParsed.data, pool)) - const entreprisesTitulairesOuAmodiataires = memoize(() => entreprisesTitulairesOuAmoditairesByEtapeId(etapeIdParsed.data, pool)) + const { etapeData, titreTypeId, administrationsLocales, entreprisesTitulairesOuAmodiataires } = await getEtapeDataForEdition(pool, etapeIdParsed.data) const result = await getDocumentsByEtapeId(etapeIdParsed.data, pool, user, titreTypeId, administrationsLocales, entreprisesTitulairesOuAmodiataires, etapeData.etape_type_id, { demarche_type_id: etapeData.demarche_type_id, @@ -168,10 +206,38 @@ export const getEtapeDocuments = } } +export const getEtapeAvis = + (pool: Pool) => + async (req: CaminoRequest, res: CustomResponse<GetEtapeAvisByEtapeId>): Promise<void> => { + const etapeIdParsed = etapeIdValidator.safeParse(req.params.etapeId) + const user = req.auth + + if (!etapeIdParsed.success) { + res.sendStatus(HTTP_STATUS.HTTP_STATUS_BAD_REQUEST) + } else { + try { + const { etapeData, titreTypeId, administrationsLocales, entreprisesTitulairesOuAmodiataires } = await getEtapeDataForEdition(pool, etapeIdParsed.data) + + const result = await getEtapeAvisLargeObjectIdsByEtapeId(etapeIdParsed.data, pool, user, titreTypeId, administrationsLocales, entreprisesTitulairesOuAmodiataires, etapeData.etape_type_id, { + demarche_type_id: etapeData.demarche_type_id, + entreprises_lecture: etapeData.demarche_entreprises_lecture, + public_lecture: etapeData.demarche_public_lecture, + titre_public_lecture: etapeData.titre_public_lecture, + }) + + const avis: GetEtapeAvisByEtapeId = result.map(a => ({ ...a, has_file: isNotNullNorUndefined(a.largeobject_id) })) + res.json(getEtapeAvisByEtapeIdValidator.parse(avis)) + } catch (e) { + res.sendStatus(HTTP_STATUS.HTTP_STATUS_INTERNAL_SERVER_ERROR) + console.error(e) + } + } + } + export const deleteEtape = (pool: Pool) => async (req: CaminoRequest, res: CustomResponse<void>) => { const user = req.auth - const etapeId = etapeIdValidator.safeParse(req.params.etapeId) + const etapeId = etapeIdOrSlugValidator.safeParse(req.params.etapeIdOrSlug) if (!etapeId.success) { res.sendStatus(HTTP_STATUS.HTTP_STATUS_BAD_REQUEST) } else if (isNullOrUndefined(user)) { @@ -225,7 +291,7 @@ export const deleteEtape = (pool: Pool) => async (req: CaminoRequest, res: Custo if (rulesErrors.length) { throw new Error(rulesErrors.join(', ')) } - await titreEtapeUpdate(etapeId.data, { archive: true }, user, titreDemarche.titreId) + await titreEtapeUpdate(titreEtape.id, { archive: true }, user, titreDemarche.titreId) await titreEtapeUpdateTask(pool, null, titreEtape.titreDemarcheId, user) @@ -238,6 +304,540 @@ export const deleteEtape = (pool: Pool) => async (req: CaminoRequest, res: Custo } } } +export const getEtape = (_pool: Pool) => async (req: CaminoRequest, res: CustomResponse<DeepReadonly<FlattenEtape>>) => { + const user = req.auth + + const etapeId = etapeIdOrSlugValidator.safeParse(req.params.etapeIdOrSlug) + if (!etapeId.success) { + res.sendStatus(HTTP_STATUS.HTTP_STATUS_BAD_REQUEST) + } else if (isNullOrUndefined(user)) { + res.sendStatus(HTTP_STATUS.HTTP_STATUS_FORBIDDEN) + } else { + try { + const titreEtape = await titreEtapeGet(etapeId.data, { fields: { demarche: { titre: { pointsEtape: { id: {} } } } }, fetchHeritage: true }, user) + + if (isNullOrUndefined(titreEtape)) { + res.sendStatus(HTTP_STATUS.HTTP_STATUS_NOT_FOUND) + } else if (isNullOrUndefined(titreEtape.titulaireIds) || isNullOrUndefined(titreEtape.demarche?.titre) || titreEtape.demarche.titre.administrationsLocales === undefined) { + console.error('la démarche n’est pas chargée complètement') + res.sendStatus(HTTP_STATUS.HTTP_STATUS_INTERNAL_SERVER_ERROR) + } else if ( + !canEditEtape(user, titreEtape.typeId, titreEtape.isBrouillon, titreEtape.titulaireIds ?? [], titreEtape.demarche.titre.administrationsLocales ?? [], titreEtape.demarche.typeId, { + typeId: titreEtape.demarche.titre.typeId, + titreStatutId: titreEtape.demarche.titre.titreStatutId, + }) + ) { + res.sendStatus(HTTP_STATUS.HTTP_STATUS_FORBIDDEN) + } else { + res.json(iTitreEtapeToFlattenEtape(titreEtape)) + } + } catch (e) { + console.error(e) + + res.sendStatus(HTTP_STATUS.HTTP_STATUS_INTERNAL_SERVER_ERROR) + } + } +} +const validateAndGetEntrepriseDocuments = async (pool: Pool, etape: FlattenEtape, entrepriseDocumentIds: EntrepriseDocumentId[], user: User): Promise<EntrepriseDocument[]> => { + const entrepriseDocuments: EntrepriseDocument[] = [] + + const titulaires = etape.titulaires.value + const amodiataires = etape.amodiataires.value + if (isNotNullNorUndefinedNorEmpty(entrepriseDocumentIds)) { + let entrepriseIds: EntrepriseId[] = [] + if (isNotNullNorUndefinedNorEmpty(titulaires)) { + entrepriseIds.push(...titulaires) + } + if (isNotNullNorUndefinedNorEmpty(amodiataires)) { + entrepriseIds.push(...amodiataires) + } + entrepriseIds = entrepriseIds.filter(onlyUnique) + + if (isNonEmptyArray(entrepriseIds)) { + entrepriseDocuments.push(...(await getEntrepriseDocuments(entrepriseDocumentIds, entrepriseIds, pool, user))) + } + + if (entrepriseDocumentIds.length !== entrepriseDocuments.length) { + throw new Error("document d'entreprise incorrects") + } + } + + return entrepriseDocuments +} + +export const arePointsOnPerimeter = (perimetre: FeatureMultiPolygon, points: FeatureCollectionPoints): boolean => { + const coordinatesSet = new Set() + + perimetre.geometry.coordinates.forEach(geometry => geometry.forEach(sub => sub.forEach(coordinate => coordinatesSet.add(`${coordinate[0]}-${coordinate[1]}`)))) + + return points.features.every(point => { + return coordinatesSet.has(`${point.geometry.coordinates[0]}-${point.geometry.coordinates[1]}`) + }) +} +const getForagesProperties = async ( + titreTypeId: TitreTypeId, + geojsonOrigineGeoSystemeId: GraphqlEtape['geojsonOrigineGeoSystemeId'], + geojsonOrigineForages: GraphqlEtape['geojsonOrigineForages'], + pool: Pool +): Promise<Pick<GraphqlEtape, 'geojson4326Forages' | 'geojsonOrigineForages'>> => { + if (canHaveForages(titreTypeId) && isNotNullNorUndefined(geojsonOrigineForages) && isNotNullNorUndefined(geojsonOrigineGeoSystemeId)) { + return { + geojson4326Forages: await convertPoints(pool, geojsonOrigineGeoSystemeId, GEO_SYSTEME_IDS.WGS84, geojsonOrigineForages), + geojsonOrigineForages, + } + } + + return { + geojson4326Forages: null, + geojsonOrigineForages: null, + } +} +type PerimetreInfos = { + secteursMaritime: SecteursMaritimes[] + sdomZones: SDOMZoneId[] + surface: KM2 | null +} & Pick<GraphqlEtape, 'geojson4326Forages' | 'geojsonOrigineForages'> & + Pick<GetGeojsonInformation, 'communes' | 'forets'> +const getPerimetreInfosInternal = async ( + pool: Pool, + geojson4326Perimetre: GraphqlEtape['geojson4326Perimetre'], + geojsonOriginePerimetre: GraphqlEtape['geojsonOriginePerimetre'], + geojsonOriginePoints: GraphqlEtape['geojsonOriginePoints'], + titreTypeId: TitreTypeId, + geojsonOrigineGeoSystemeId: GraphqlEtape['geojsonOrigineGeoSystemeId'], + geojsonOrigineForages: GraphqlEtape['geojsonOrigineForages'] +): Promise<PerimetreInfos> => { + if (isNotNullNorUndefined(geojson4326Perimetre)) { + if (isNotNullNorUndefined(geojsonOriginePerimetre) && isNotNullNorUndefined(geojsonOriginePoints)) { + if (!arePointsOnPerimeter(geojsonOriginePerimetre, geojsonOriginePoints)) { + throw new Error(`les points doivent être sur le périmètre`) + } + } + const { communes, sdom, surface, forets, secteurs } = await getGeojsonInformation(pool, geojson4326Perimetre.geometry) + const { geojson4326Forages } = await getForagesProperties(titreTypeId, geojsonOrigineGeoSystemeId, geojsonOrigineForages, pool) + + return { + surface, + communes, + forets, + secteursMaritime: secteurs.map(s => getSecteurMaritime(s)), + sdomZones: sdom, + geojson4326Forages, + geojsonOrigineForages, + } + } else { + return { + communes: [], + forets: [], + secteursMaritime: [], + sdomZones: [], + surface: null, + geojson4326Forages: null, + geojsonOrigineForages: null, + } + } +} +const getFlattenEtape = async ( + etape: RestEtapeCreation | RestEtapeModification, + demarche: ITitreDemarche, + titreTypeId: TitreTypeId, + isBrouillon: EtapeBrouillon, + etapeSlug: EtapeSlug | undefined, + pool: Pool +): Promise<{ flattenEtape: FlattenEtape; perimetreInfos: PerimetreInfos }> => { + const perimetreInfos = await getPerimetreInfosInternal( + pool, + etape.geojson4326Perimetre, + etape.geojsonOriginePerimetre, + etape.geojsonOriginePoints, + titreTypeId, + etape.geojsonOrigineGeoSystemeId, + etape.geojsonOrigineForages + ) + const titreEtapeHeritage = titreEtapeHeritageBuild(etape.date, etape.typeId, demarche, titreTypeId, demarche.typeId, null) + + const heritageProps = ETAPE_HERITAGE_PROPS.reduce<IHeritageProps>((acc, propId) => { + acc[propId] = { + actif: etape.heritageProps[propId].actif, + etape: titreEtapeHeritage.heritageProps?.[propId].etape, + } + + return acc + }, {} as IHeritageProps) + + const sections = getSections(titreTypeId, demarche.typeId, etape.typeId) + const heritageContenu = sections.reduce<IHeritageContenu>((accSections, section) => { + accSections[section.id] = section.elements.reduce<IHeritageContenu[string]>((accElements, element) => { + accElements[element.id] = { + actif: etape.heritageContenu[section.id]?.[element.id]?.actif ?? false, + etape: titreEtapeHeritage.heritageContenu?.[section.id]?.[element.id]?.etape ?? undefined, + } + + return accElements + }, {}) + + return accSections + }, {}) + + return { + flattenEtape: iTitreEtapeToFlattenEtape({ + ...etape, + demarche, + ...perimetreInfos, + isBrouillon, + heritageProps, + heritageContenu, + // On ne voit pas comment mieux faire + id: 'id' in etape ? etape.id : etapeIdValidator.parse('newId'), + slug: etapeSlug, + }), + perimetreInfos, + } +} +export const createEtape = (pool: Pool) => async (req: CaminoRequest, res: CustomResponse<EtapeId>) => { + try { + const { success, data: etape, error } = restEtapeCreationValidator.safeParse(req.body) + + if (!success) { + console.error('[etapeCreer] étape non correctement formatée', error) + res.status(HTTP_STATUS.HTTP_STATUS_BAD_REQUEST).json({ errorMessage: "l'étape n'est pas correctement formatée" }) + } else { + const user = req.auth + if (!user) { + res.status(HTTP_STATUS.HTTP_STATUS_NOT_FOUND).json({ errorMessage: "la démarche n'existe pas" }) + } else { + let titreDemarche = await titreDemarcheGet(etape.titreDemarcheId, { fields: {} }, user) + + if (!titreDemarche) { + res.status(HTTP_STATUS.HTTP_STATUS_NOT_FOUND).json({ errorMessage: "la démarche n'existe pas" }) + } else { + titreDemarche = await titreDemarcheGet( + etape.titreDemarcheId, + { + fields: { + titre: { + demarches: { etapes: { id: {} } }, + pointsEtape: { id: {} }, + titulairesEtape: { id: {} }, + amodiatairesEtape: { id: {} }, + }, + etapes: { id: {} }, + }, + }, + userSuper + ) + + if (!titreDemarche || !titreDemarche.titre) { + res.status(HTTP_STATUS.HTTP_STATUS_NOT_FOUND).json({ errorMessage: "le titre n'existe pas" }) + } else { + const titreTypeId = titreDemarche?.titre?.typeId + if (!titreTypeId) { + res.status(HTTP_STATUS.HTTP_STATUS_INTERNAL_SERVER_ERROR).json({ errorMessage: `le type du titre de la ${titreDemarche.id} n'est pas chargé` }) + } else { + const isBrouillon = canBeBrouillon(etape.typeId) + const { flattenEtape, perimetreInfos } = await getFlattenEtape(etape, titreDemarche, titreTypeId, isBrouillon, etapeSlugValidator.parse('unknown'), pool) + const entrepriseDocuments: EntrepriseDocument[] = await validateAndGetEntrepriseDocuments(pool, flattenEtape, etape.entrepriseDocumentIds, user) + + const etapeDocumentsParsed = z.array(tempEtapeDocumentValidator).safeParse(etape.etapeDocuments) + + if (!etapeDocumentsParsed.success) { + console.warn(etapeDocumentsParsed.error) + + res.status(HTTP_STATUS.HTTP_STATUS_BAD_REQUEST).json({ errorMessage: 'Les documents envoyés ne sont pas conformes' }) + } else { + const etapeDocuments = etapeDocumentsParsed.data + + const etapeAvisParsed = z.array(tempEtapeAvisValidator).safeParse(etape.etapeAvis) + if (!etapeAvisParsed.success) { + console.warn(etapeAvisParsed.error) + res.status(HTTP_STATUS.HTTP_STATUS_BAD_REQUEST).json({ errorMessage: 'Les avis envoyés ne sont pas conformes' }) + } else { + const etapeAvis = etapeAvisParsed.data + const rulesErrors = titreEtapeUpdationValidate( + flattenEtape, + titreDemarche, + titreDemarche.titre, + etapeDocuments, + etapeAvis, + entrepriseDocuments, + perimetreInfos.sdomZones, + perimetreInfos.communes.map(({ id }) => id), + user, + null, + null + ) + if (rulesErrors.length) { + res.status(HTTP_STATUS.HTTP_STATUS_BAD_REQUEST).json({ errorMessage: rulesErrors.join(', ') }) + } else if ( + !canCreateEtape(user, etape.typeId, isBrouillon, titreDemarche.titre.titulaireIds ?? [], titreDemarche.titre.administrationsLocales ?? [], titreDemarche.typeId, { + typeId: titreDemarche.titre.typeId, + titreStatutId: titreDemarche.titre.titreStatutId ?? TitresStatutIds.Indetermine, + }) + ) { + res.status(HTTP_STATUS.HTTP_STATUS_BAD_REQUEST).json({ errorMessage: 'droits insuffisants pour créer cette étape' }) + } else if (!(await checkEntreprisesExist(pool, [...(etape.titulaireIds ?? []), ...(etape.amodiataireIds ?? [])]))) { + res.status(HTTP_STATUS.HTTP_STATUS_BAD_REQUEST).json({ errorMessage: "certaines entreprises n'existent pas" }) + } else { + if (!canEditDuree(titreTypeId, titreDemarche.typeId)) { + etape.duree = null + } + + if (!canEditDates(titreTypeId, titreDemarche.typeId, etape.typeId, user) && (isNotNullNorUndefined(etape.dateDebut) || isNotNullNorUndefined(etape.dateFin))) { + etape.dateDebut = null + etape.dateFin = null + } + + const etapeUpdated: ITitreEtape | undefined = await titreEtapeUpsert({ ...etape, ...perimetreInfos, isBrouillon }, user!, titreDemarche.titreId) + if (isNullOrUndefined(etapeUpdated)) { + res.status(HTTP_STATUS.HTTP_STATUS_INTERNAL_SERVER_ERROR).json({ errorMessage: "Une erreur est survenue lors de la création de l'étape" }) + } else { + await insertEtapeDocuments(pool, etapeUpdated.id, etapeDocuments) + for (const document of entrepriseDocuments) { + await insertTitreEtapeEntrepriseDocument(pool, { titre_etape_id: etapeUpdated.id, entreprise_document_id: document.id }) + } + + await insertEtapeAvis(pool, etapeUpdated.id, etapeAvis) + + try { + await titreEtapeUpdateTask(pool, etapeUpdated.id, etapeUpdated.titreDemarcheId, user) + } catch (e) { + console.error('une erreur est survenue lors des tâches annexes', e) + } + + await titreEtapeAdministrationsEmailsSend(etapeUpdated, titreDemarche.typeId, titreDemarche.titreId, titreDemarche.titre.typeId, user) + await titreEtapeUtilisateursEmailsSend(etapeUpdated, titreDemarche.titreId) + + res.json(etapeUpdated.id) + } + } + } + } + } + } + } + } + } + } catch (e) { + console.error(e) + + res.status(HTTP_STATUS.HTTP_STATUS_INTERNAL_SERVER_ERROR).json({ errorMessage: "Une erreur est survenue lors de la création de l'étape", extra: e }) + } +} + +export const updateEtape = (pool: Pool) => async (req: CaminoRequest, res: CustomResponse<EtapeId>) => { + try { + const { success, data: etape, error } = restEtapeModificationValidator.safeParse(req.body) + + if (!success) { + console.error('[etapeModifier] étape non correctement formatée', error) + res.status(HTTP_STATUS.HTTP_STATUS_BAD_REQUEST).json({ errorMessage: "l'étape n'est pas correctement formatée" }) + } else { + const user = req.auth + if (!user) { + res.status(HTTP_STATUS.HTTP_STATUS_NOT_FOUND).json({ errorMessage: "la démarche n'existe pas" }) + } else { + const titreEtapeOld = await titreEtapeGet( + etape.id, + { + fields: { + demarche: { titre: { pointsEtape: { id: {} } } }, + }, + }, + user + ) + + if (isNullOrUndefined(titreEtapeOld)) throw new Error("l'étape n'existe pas") + if (!titreEtapeOld.demarche || !titreEtapeOld.demarche.titre || titreEtapeOld.demarche.titre.administrationsLocales === undefined || !titreEtapeOld.demarche.titre.titreStatutId) { + throw new Error('la démarche n’est pas chargée complètement') + } + + if ( + !canEditEtape( + user, + titreEtapeOld.typeId, + titreEtapeOld.isBrouillon, + titreEtapeOld.titulaireIds ?? [], + titreEtapeOld.demarche.titre.administrationsLocales ?? [], + titreEtapeOld.demarche.typeId, + { + typeId: titreEtapeOld.demarche.titre.typeId, + titreStatutId: titreEtapeOld.demarche.titre.titreStatutId, + } + ) + ) + throw new Error('droits insuffisants') + + if (titreEtapeOld.typeId !== etape.typeId) throw new Error("Il est interdit d'éditer le type d'étape") + + if (titreEtapeOld.titreDemarcheId !== etape.titreDemarcheId) throw new Error("la démarche n'existe pas") + const titreDemarche = await titreDemarcheGet( + etape.titreDemarcheId, + { + fields: { + titre: { + demarches: { etapes: { id: {} } }, + titulairesEtape: { id: {} }, + amodiatairesEtape: { id: {} }, + }, + etapes: { id: {} }, + }, + }, + userSuper + ) + + if (!titreDemarche || !titreDemarche.titre) throw new Error("le titre n'existe pas") + if (isNullOrUndefined(titreDemarche.titre.titulaireIds) || isNullOrUndefined(titreDemarche.titre.amodiataireIds)) throw new Error('la démarche n’est pas chargée complètement') + const titreTypeId = titreDemarche?.titre?.typeId + if (!titreTypeId) { + throw new Error(`le type du titre de la ${titreDemarche.id} n'est pas chargé`) + } + const isBrouillon = titreEtapeOld.isBrouillon + const { flattenEtape, perimetreInfos } = await getFlattenEtape(etape, titreDemarche, titreTypeId, isBrouillon, titreEtapeOld.slug, pool) + const entrepriseDocuments: EntrepriseDocument[] = await validateAndGetEntrepriseDocuments(pool, flattenEtape, etape.entrepriseDocumentIds, user) + + const etapeDocumentsParsed = z.array(etapeDocumentModificationValidator).safeParse(etape.etapeDocuments) + + if (!etapeDocumentsParsed.success) { + console.warn(etapeDocumentsParsed.error) + throw new Error('Les documents envoyés ne sont pas conformes') + } + + const etapeDocuments = etapeDocumentsParsed.data + + const needToCreateAslAndDae = needAslAndDae({ etapeTypeId: etape.typeId, demarcheTypeId: titreDemarche.typeId, titreTypeId: titreDemarche.titre.typeId }, titreEtapeOld.isBrouillon, user) + let daeDocument = null + let aslDocument = null + if (needToCreateAslAndDae) { + const daeDocumentParsed = documentComplementaireDaeEtapeDocumentModificationValidator.nullable().safeParse(etape.daeDocument) + if (!daeDocumentParsed.success) { + console.warn(daeDocumentParsed.error) + throw new Error('L’arrêté préfectoral n’est pas conforme') + } + + daeDocument = daeDocumentParsed.data + + const aslDocumentParsed = documentComplementaireAslEtapeDocumentModificationValidator.nullable().safeParse(etape.aslDocument) + if (!aslDocumentParsed.success) { + console.warn(aslDocumentParsed.error) + throw new Error('La lettre du propriétaire du sol n’est pas conforme') + } + + aslDocument = aslDocumentParsed.data + } + + const rulesErrors = titreEtapeUpdationValidate( + flattenEtape, + titreDemarche, + titreDemarche.titre, + etapeDocuments, + etape.etapeAvis, + entrepriseDocuments, + perimetreInfos.sdomZones, + perimetreInfos.communes.map(({ id }) => id), + user, + daeDocument, + aslDocument, + titreEtapeOld + ) + + if (rulesErrors.length) { + throw new Error(rulesErrors.join(', ')) + } + + if (!canEditDuree(titreTypeId, titreDemarche.typeId)) { + etape.duree = titreEtapeOld.duree ?? null + } + + if (!canEditDates(titreTypeId, titreDemarche.typeId, etape.typeId, user)) { + etape.dateDebut = titreEtapeOld.dateDebut ?? null + etape.dateFin = titreEtapeOld.dateFin ?? null + } + + if (!(await checkEntreprisesExist(pool, [...(etape.titulaireIds ?? []), ...(etape.amodiataireIds ?? [])]))) { + throw new Error("certaines entreprises n'existent pas") + } + + const etapeUpdated: ITitreEtape | undefined = await titreEtapeUpsert({ ...etape, ...perimetreInfos, isBrouillon: titreEtapeOld.isBrouillon }, user!, titreDemarche.titreId) + if (isNullOrUndefined(etapeUpdated)) { + throw new Error("Une erreur est survenue lors de la modification de l'étape") + } + await updateEtapeDocuments(pool, user, etapeUpdated.id, etapeUpdated.isBrouillon, etapeDocuments) + await deleteTitreEtapeEntrepriseDocument(pool, { titre_etape_id: etapeUpdated.id }) + for (const document of entrepriseDocuments) { + await insertTitreEtapeEntrepriseDocument(pool, { titre_etape_id: etapeUpdated.id, entreprise_document_id: document.id }) + } + + if (needToCreateAslAndDae) { + if (daeDocument !== null) { + const daeEtapeInDb = await getEtapeByDemarcheIdAndEtapeTypeId(pool, 'dae', titreDemarche.id) + + const daeEtape = await titreEtapeUpsert( + { + id: daeEtapeInDb?.etape_id ?? undefined, + typeId: 'dae', + statutId: daeDocument.etape_statut_id, + isBrouillon: ETAPE_IS_NOT_BROUILLON, + titreDemarcheId: titreDemarche.id, + date: daeDocument.date, + contenu: { + mea: { arrete: daeDocument.arrete_prefectoral }, + }, + }, + user!, + titreDemarche.titreId + ) + if (isNullOrUndefined(daeEtape)) { + throw new Error("impossible d'intégrer le document lié à la DAE") + } + + await updateEtapeDocuments(pool, user, daeEtape.id, titreEtapeOld.isBrouillon, [daeDocument]) + } + + if (aslDocument !== null) { + const aslEtapeInDb = await getEtapeByDemarcheIdAndEtapeTypeId(pool, 'asl', titreDemarche.id) + + const aslEtape = await titreEtapeUpsert( + { + id: aslEtapeInDb?.etape_id ?? undefined, + typeId: 'asl', + statutId: aslDocument.etape_statut_id, + isBrouillon: ETAPE_IS_NOT_BROUILLON, + titreDemarcheId: titreDemarche.id, + date: aslDocument.date, + }, + user!, + titreDemarche.titreId + ) + + if (isNullOrUndefined(aslEtape)) { + throw new Error("impossible d'intégrer le document lié à la ASL") + } + await updateEtapeDocuments(pool, user, aslEtape.id, titreEtapeOld.isBrouillon, [aslDocument]) + } + } + + await updateEtapeAvis( + pool, + etapeUpdated.id, + isBrouillon, + etape.etapeAvis, + etape.typeId, + titreTypeId, + perimetreInfos.communes.map(({ id }) => id) + ) + + await titreEtapeUpdateTask(pool, etapeUpdated.id, etapeUpdated.titreDemarcheId, user) + + await titreEtapeAdministrationsEmailsSend(flattenEtape, titreDemarche.typeId, titreDemarche.titreId, titreDemarche.titre.typeId, user, titreEtapeOld) + res.json(titreEtapeOld.id) + } + } + } catch (e: any) { + console.error(e) + + res.status(HTTP_STATUS.HTTP_STATUS_INTERNAL_SERVER_ERROR).json({ errorMessage: e.message, extra: e }) + } +} export const deposeEtape = (pool: Pool) => async (req: CaminoRequest, res: CustomResponse<void>) => { const user = req.auth @@ -279,9 +879,11 @@ export const deposeEtape = (pool: Pool) => async (req: CaminoRequest, res: Custo if (isNullOrUndefined(titreEtape.slug)) throw new Error("le slug de l'étape est obligatoire") const sdomZones: SDOMZoneId[] = [] + const communes: CommuneId[] = [] if (isNotNullNorUndefined(titreEtape.geojson4326Perimetre)) { - const { sdom } = await getGeojsonInformation(pool, titreEtape.geojson4326Perimetre.geometry) + const { sdom, communes: communeFromGeoJson } = await getGeojsonInformation(pool, titreEtape.geojson4326Perimetre.geometry) + communes.push(...communeFromGeoJson.map(({ id }) => id)) sdomZones.push(...sdom) } const titreTypeId = memoize(() => Promise.resolve(titre.typeId)) @@ -324,21 +926,32 @@ export const deposeEtape = (pool: Pool) => async (req: CaminoRequest, res: Custo etape_is_brouillon: titreEtape.isBrouillon, }) + // On utilise le userSuper pour charger tous les avis, car celui qui dépose ne peut peut-être pas voir tous les avis + const etapeAvis = await getEtapeAvisLargeObjectIdsByEtapeId(id, pool, userSuper, titreTypeId, administrationsLocales, entreprisesTitulairesOuAmodiataires, titreEtape.typeId, { + demarche_type_id: titreDemarche.typeId, + entreprises_lecture: titreDemarche.entreprisesLecture ?? false, + public_lecture: titreDemarche.publicLecture ?? false, + titre_public_lecture: titre.publicLecture ?? false, + }) + // TODO 2023-06-14 TS 5.1 n’arrive pas réduire le type de titre - const deposable = isEtapeDeposable( + const flattenEtape = iTitreEtapeToFlattenEtape(titreEtape) + const deposable = canDeposeEtape( user, { ...titre, titulaires: titre.titulaireIds ?? [], administrationsLocales: titre.administrationsLocales ?? [] }, titreDemarche.typeId, - { ...titreEtape, contenu: titreEtape.contenu ?? {} }, + flattenEtape, etapeDocuments, entrepriseDocuments, sdomZones, + communes, daeDocument, - aslDocument + aslDocument, + etapeAvis ) if (!deposable) throw new Error('droits insuffisants') - if (!canBeBrouillon(titreEtape.typeId)) { + if (canBeBrouillon(titreEtape.typeId) === ETAPE_IS_NOT_BROUILLON) { throw new Error('cette étape ne peut-être déposée') } @@ -348,7 +961,7 @@ export const deposeEtape = (pool: Pool) => async (req: CaminoRequest, res: Custo titreEtape.id, { date, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, }, user, titreDemarche.titreId @@ -448,12 +1061,18 @@ const demarcheEtapesTypesGet = async (titreDemarcheId: DemarcheId, date: CaminoD etapesTypes.push(...etapesTypesTDE.flatMap(etapeTypeId => getEtapesStatuts(etapeTypeId).map(etapeStatut => ({ etapeTypeId, etapeStatutId: etapeStatut.id, mainStep: false })))) } - return etapesTypes.filter(({ etapeTypeId }) => - canCreateEtape(user, etapeTypeId, true, titre.titulaireIds ?? [], titre.administrationsLocales ?? [], titreDemarche.typeId, { - typeId: titre.typeId, - titreStatutId: titre.titreStatutId ?? TitresStatutIds.Indetermine, - }) - ) + // FIXME integration tests + // On ne peut pas avoir 2 fois le même type d'étape en brouillon + const etapeTypeIdInBrouillon = titreDemarche.etapes?.filter(({ isBrouillon, id }) => id !== titreEtapeId && isBrouillon).map(({ typeId }) => typeId) ?? [] + + return etapesTypes + .filter(({ etapeTypeId }) => + canCreateEtape(user, etapeTypeId, true, titre.titulaireIds ?? [], titre.administrationsLocales ?? [], titreDemarche.typeId, { + typeId: titre.typeId, + titreStatutId: titre.titreStatutId ?? TitresStatutIds.Indetermine, + }) + ) + .filter(({ etapeTypeId }) => !etapeTypeIdInBrouillon.includes(etapeTypeId)) } // VISIBLE_FOR_TESTING diff --git a/packages/api/src/api/rest/express-type.ts b/packages/api/src/api/rest/express-type.ts index ea30f25d1..085b21bc6 100644 --- a/packages/api/src/api/rest/express-type.ts +++ b/packages/api/src/api/rest/express-type.ts @@ -5,7 +5,7 @@ import { User } from 'camino-common/src/roles' type MyResponse<T, U = Response> = (body?: T) => U export interface CustomResponse<T> extends Response { - json: MyResponse<T, this> + json: MyResponse<T | { errorMessage: string; extra?: unknown }, this> } export type CaminoRequest = Request<User> diff --git a/packages/api/src/api/rest/fichiers.ts b/packages/api/src/api/rest/fichiers.ts index 2c82ed31a..72cc63066 100644 --- a/packages/api/src/api/rest/fichiers.ts +++ b/packages/api/src/api/rest/fichiers.ts @@ -3,16 +3,15 @@ import { createWriteStream } from 'node:fs' import { User } from 'camino-common/src/roles' import { DOWNLOAD_FORMATS, contentTypes } from 'camino-common/src/rest.js' import { Pool } from 'pg' -import { EtapeId, etapeDocumentIdValidator } from 'camino-common/src/etape.js' -import { getEntrepriseDocumentLargeObjectIdsByEtapeId, getEtapeDocumentLargeObjectIdsByEtapeId } from '../../database/queries/titres-etapes.queries.js' +import { EtapeId, etapeAvisIdValidator, etapeDocumentIdValidator } from 'camino-common/src/etape.js' +import { getEntrepriseDocumentLargeObjectIdsByEtapeId, getEtapeDocumentLargeObjectIdsByEtapeId, getLargeobjectIdByEtapeAvisId } from '../../database/queries/titres-etapes.queries.js' import { LargeObjectManager } from 'pg-large-object' import express from 'express' import { join } from 'node:path' import { DocumentsTypes } from 'camino-common/src/static/documentsTypes.js' import { slugify } from 'camino-common/src/strings.js' -import { administrationsLocalesByEtapeId, entreprisesTitulairesOuAmoditairesByEtapeId, getEtapeDataForEdition, getLargeobjectIdByEtapeDocumentId } from './etapes.queries.js' -import { memoize } from 'camino-common/src/typescript-tools.js' +import { getEtapeDataForEdition, getLargeobjectIdByEtapeDocumentId } from './etapes.queries.js' import { EtapesTypes } from 'camino-common/src/static/etapesTypes.js' export type NewDownload = (params: Record<string, unknown>, user: User, pool: Pool) => Promise<{ loid: number | null; fileName: string }> @@ -25,11 +24,7 @@ export const etapeTelecharger = throw new Error("id d'étape absent") } - const etapeData = await getEtapeDataForEdition(pool, etapeId) - - const titreTypeId = memoize(() => Promise.resolve(etapeData.titre_type_id)) - const administrationsLocales = memoize(() => administrationsLocalesByEtapeId(etapeId, pool)) - const entreprisesTitulairesOuAmodiataires = memoize(() => entreprisesTitulairesOuAmoditairesByEtapeId(etapeId, pool)) + const { etapeData, titreTypeId, administrationsLocales, entreprisesTitulairesOuAmodiataires } = await getEtapeDataForEdition(pool, etapeId) const documents = await getEtapeDocumentLargeObjectIdsByEtapeId(etapeId, pool, user, titreTypeId, administrationsLocales, entreprisesTitulairesOuAmodiataires, etapeData.etape_type_id, { demarche_type_id: etapeData.demarche_type_id, @@ -136,3 +131,9 @@ export const etapeDocumentDownload: NewDownload = async (params, user, pool) => return { loid: activiteDocumentLargeObjectId, fileName: etapeDocumentId } } +export const avisDocumentDownload: NewDownload = async (params, user, pool) => { + const etapeAvisId = etapeAvisIdValidator.parse(params.etapeAvisId) + const avisDocumentLargeObjectId = await getLargeobjectIdByEtapeAvisId(pool, user, etapeAvisId) + + return { loid: avisDocumentLargeObjectId, fileName: etapeAvisId } +} diff --git a/packages/api/src/api/rest/perimetre.queries.ts b/packages/api/src/api/rest/perimetre.queries.ts index 547b51f04..bcaca71f0 100644 --- a/packages/api/src/api/rest/perimetre.queries.ts +++ b/packages/api/src/api/rest/perimetre.queries.ts @@ -151,7 +151,7 @@ const getGeojsonInformationValidator = z.object({ // Surface maximale acceptée pour un titre const SURFACE_M2_MAX = 100_000 * 1_000_000 -type GetGeojsonInformation = z.infer<typeof getGeojsonInformationValidator> +export type GetGeojsonInformation = z.infer<typeof getGeojsonInformationValidator> const getGeojsonInformationDbValidator = z.object({ surface: z.number().max(SURFACE_M2_MAX), sdom: z.array(sdomZoneIdValidator).nullable().transform(nullToEmptyArray), diff --git a/packages/api/src/api/rest/perimetre.ts b/packages/api/src/api/rest/perimetre.ts index 683ed5f85..b8412842c 100644 --- a/packages/api/src/api/rest/perimetre.ts +++ b/packages/api/src/api/rest/perimetre.ts @@ -41,6 +41,7 @@ import { canReadEtape } from './permissions/etapes.js' import { EtapeTypeId } from 'camino-common/src/static/etapesTypes.js' import xlsx from 'xlsx' import { ZodTypeAny, z } from 'zod' +import { CommuneId } from 'camino-common/src/static/communes' export const convertGeojsonPointsToGeoSystemeId = (pool: Pool) => async (req: CaminoRequest, res: CustomResponse<FeatureCollectionPoints>) => { const geoSystemeIdParsed = geoSystemeIdValidator.safeParse(req.params.geoSystemeId) @@ -71,11 +72,11 @@ export const getPerimetreInfos = (pool: Pool) => async (req: CaminoRequest, res: res.sendStatus(HTTP_STATUS.HTTP_STATUS_BAD_REQUEST) } else { try { - let etape: null | { demarche_id: DemarcheId; geojson4326_perimetre: MultiPolygon | null; sdom_zones: SDOMZoneId[]; etape_type_id: EtapeTypeId } = null + let etape: null | { demarche_id: DemarcheId; geojson4326_perimetre: MultiPolygon | null; sdom_zones: SDOMZoneId[]; etape_type_id: EtapeTypeId; communes: CommuneId[] } = null if (etapeIdOrSlugParsed.success) { const myEtape = await getEtapeById(pool, etapeIdOrSlugParsed.data) - etape = { demarche_id: myEtape.demarche_id, geojson4326_perimetre: myEtape.geojson4326_perimetre, sdom_zones: myEtape.sdom_zones ?? [], etape_type_id: myEtape.etape_type_id } + etape = { demarche_id: myEtape.demarche_id, geojson4326_perimetre: myEtape.geojson4326_perimetre, sdom_zones: myEtape.sdom_zones ?? [], etape_type_id: myEtape.etape_type_id, communes: [] } } else if (demarcheIdOrSlugParsed.success) { const demarche = await getDemarcheByIdOrSlug(pool, demarcheIdOrSlugParsed.data) const etapes = await getEtapesByDemarcheId(pool, demarche.demarche_id) @@ -87,6 +88,7 @@ export const getPerimetreInfos = (pool: Pool) => async (req: CaminoRequest, res: geojson4326_perimetre: mostRecentEtapeFondamentale.geojson4326_perimetre, sdom_zones: mostRecentEtapeFondamentale.sdom_zones ?? [], etape_type_id: mostRecentEtapeFondamentale.etape_type_id, + communes: mostRecentEtapeFondamentale.communes.map(({ id }) => id), } } } else { @@ -98,6 +100,7 @@ export const getPerimetreInfos = (pool: Pool) => async (req: CaminoRequest, res: res.json({ superposition_alertes: [], sdomZoneIds: [], + communes: [], }) } else { const demarche = await getDemarcheByIdOrSlug(pool, etape.demarche_id) @@ -118,6 +121,7 @@ export const getPerimetreInfos = (pool: Pool) => async (req: CaminoRequest, res: res.json({ superposition_alertes: await getAlertesSuperposition(etape.geojson4326_perimetre, titre.titre_type_id, titre.titre_slug, user, pool), sdomZoneIds: etape.sdom_zones, + communes: etape.communes, }) } else { res.sendStatus(HTTP_STATUS.HTTP_STATUS_FORBIDDEN) diff --git a/packages/api/src/api/rest/permissions/avis.test.ts b/packages/api/src/api/rest/permissions/avis.test.ts new file mode 100644 index 000000000..caf765b72 --- /dev/null +++ b/packages/api/src/api/rest/permissions/avis.test.ts @@ -0,0 +1,115 @@ +import { describe, expect, test } from 'vitest' +import { testBlankUser } from 'camino-common/src/tests-utils' +import { canReadAvis } from './avis' +import { ADMINISTRATION_ROLES, EntrepriseUserNotNull, User } from 'camino-common/src/roles' +import { newEntrepriseId } from 'camino-common/src/entreprise' +import { AvisVisibilityIds } from 'camino-common/src/static/avisTypes' + +const shouldNotBeCalled = () => Promise.reject(new Error('should not be called')) + +describe('canReadAvis', () => { + test('en tant que super je peux lire tous les documnents', async () => { + expect( + await canReadAvis({ avis_visibility_id: AvisVisibilityIds.Administrations }, { ...testBlankUser, role: 'super' }, shouldNotBeCalled, shouldNotBeCalled, shouldNotBeCalled, 'mfr', { + public_lecture: false, + entreprises_lecture: false, + titre_public_lecture: false, + demarche_type_id: 'oct', + }) + ).toBe(true) + }) + + test('en tant qu’administration je peux lire tous les documents', async () => { + for (const role of ADMINISTRATION_ROLES) { + expect( + await canReadAvis( + { avis_visibility_id: AvisVisibilityIds.Administrations }, + { ...testBlankUser, role, administrationId: 'dea-guyane-01' }, + () => Promise.resolve('arm'), + () => Promise.resolve(['dea-guyane-01']), + shouldNotBeCalled, + 'mfr', + { public_lecture: false, entreprises_lecture: false, titre_public_lecture: false, demarche_type_id: 'oct' } + ) + ).toBe(true) + } + }) + + test('en tant qu’entreprise ou non connecté, je peux lire les documents public', async () => { + const users: User[] = [ + { ...testBlankUser, role: 'defaut' }, + { ...testBlankUser, role: 'entreprise', entreprises: [{ id: newEntrepriseId('entreprise1'), nom: 'nom' }] }, + { ...testBlankUser, role: 'bureau d’études', entreprises: [{ id: newEntrepriseId('entreprise2'), nom: 'nom' }] }, + ] + for (const user of users) { + expect( + await canReadAvis({ avis_visibility_id: AvisVisibilityIds.Public }, user, shouldNotBeCalled, shouldNotBeCalled, shouldNotBeCalled, 'mfr', { + public_lecture: true, + entreprises_lecture: false, + titre_public_lecture: true, + demarche_type_id: 'oct', + }) + ).toBe(true) + } + }) + + test('en tant qu’entreprise je peux lire les documents en fonction de entreprise_lecture', async () => { + const users: EntrepriseUserNotNull[] = [ + { ...testBlankUser, role: 'entreprise', entreprises: [{ id: newEntrepriseId('entreprise1'), nom: 'nom' }] }, + { ...testBlankUser, role: 'bureau d’études', entreprises: [{ id: newEntrepriseId('entreprise2'), nom: 'nom' }] }, + ] + for (const user of users) { + expect( + await canReadAvis({ avis_visibility_id: AvisVisibilityIds.Administrations }, user, shouldNotBeCalled, shouldNotBeCalled, shouldNotBeCalled, 'mfr', { + public_lecture: true, + entreprises_lecture: false, + titre_public_lecture: true, + demarche_type_id: 'oct', + }) + ).toBe(false) + expect( + await canReadAvis( + { avis_visibility_id: AvisVisibilityIds.TitulairesEtAdministrations }, + user, + shouldNotBeCalled, + shouldNotBeCalled, + () => Promise.resolve(user.entreprises.map(({ id }) => id)), + 'mfr', + { + public_lecture: true, + entreprises_lecture: false, + titre_public_lecture: true, + demarche_type_id: 'oct', + } + ) + ).toBe(true) + expect( + await canReadAvis({ avis_visibility_id: AvisVisibilityIds.TitulairesEtAdministrations }, user, shouldNotBeCalled, shouldNotBeCalled, () => Promise.resolve([]), 'mfr', { + public_lecture: true, + entreprises_lecture: false, + titre_public_lecture: true, + demarche_type_id: 'oct', + }) + ).toBe(false) + } + }) + + test('en tant non connecté, je peux lire seulement les documents public', async () => { + expect( + await canReadAvis({ avis_visibility_id: AvisVisibilityIds.Public }, { ...testBlankUser, role: 'defaut' }, shouldNotBeCalled, shouldNotBeCalled, shouldNotBeCalled, 'mfr', { + public_lecture: true, + entreprises_lecture: false, + titre_public_lecture: true, + demarche_type_id: 'oct', + }) + ).toBe(true) + expect( + await canReadAvis({ avis_visibility_id: AvisVisibilityIds.Administrations }, { ...testBlankUser, role: 'defaut' }, shouldNotBeCalled, shouldNotBeCalled, shouldNotBeCalled, 'mfr', { + public_lecture: true, + entreprises_lecture: false, + titre_public_lecture: true, + demarche_type_id: 'oct', + }) + ).toBe(false) + }) +}) diff --git a/packages/api/src/api/rest/permissions/avis.ts b/packages/api/src/api/rest/permissions/avis.ts new file mode 100644 index 000000000..11bd20f5b --- /dev/null +++ b/packages/api/src/api/rest/permissions/avis.ts @@ -0,0 +1,43 @@ +import { EntrepriseId } from 'camino-common/src/entreprise.js' +import { isSuper, isAdministration, isEntrepriseOrBureauDEtude, User } from 'camino-common/src/roles.js' +import { AdministrationId } from 'camino-common/src/static/administrations.js' +import { EtapeTypeId } from 'camino-common/src/static/etapesTypes.js' +import { TitreTypeId } from 'camino-common/src/static/titresTypes.js' +import { SimplePromiseFn } from 'camino-common/src/typescript-tools.js' +import { CanReadDemarche } from './demarches.js' +import { canReadEtape } from './etapes.js' +import { AvisVisibilityId, AvisVisibilityIds } from 'camino-common/src/static/avisTypes.js' + +export const canReadAvis = async ( + avis: { avis_visibility_id: AvisVisibilityId }, + user: User, + titreTypeId: SimplePromiseFn<TitreTypeId>, + titresAdministrationsLocales: SimplePromiseFn<AdministrationId[]>, + entreprisesTitulairesOuAmodiataires: SimplePromiseFn<EntrepriseId[]>, + etapeTypeId: EtapeTypeId, + demarche: CanReadDemarche +): Promise<boolean> => { + if (isSuper(user)) { + return true + } + + if (!(await canReadEtape(user, titreTypeId, titresAdministrationsLocales, entreprisesTitulairesOuAmodiataires, etapeTypeId, demarche))) { + return false + } + + if (isAdministration(user)) { + return true + } + + if (avis.avis_visibility_id === AvisVisibilityIds.Public) { + return true + } + + if (isEntrepriseOrBureauDEtude(user) && avis.avis_visibility_id === AvisVisibilityIds.TitulairesEtAdministrations) { + const titulaires = await entreprisesTitulairesOuAmodiataires() + + return titulaires.some(entrepriseId => user.entreprises?.some(({ id }) => id === entrepriseId) ?? false) + } + + return false +} diff --git a/packages/api/src/api/rest/permissions/etapes.test.ts b/packages/api/src/api/rest/permissions/etapes.test.ts index 328e31f28..72f7cf3d4 100644 --- a/packages/api/src/api/rest/permissions/etapes.test.ts +++ b/packages/api/src/api/rest/permissions/etapes.test.ts @@ -29,7 +29,7 @@ describe('canReadEtape', () => { () => Promise.resolve(titreTypeId), () => Promise.resolve([]), shouldNotBeCalled, - 'aof', + 'ede', demarche ) ).toBe(false) @@ -40,7 +40,7 @@ describe('canReadEtape', () => { () => Promise.resolve(titreTypeId), () => Promise.resolve([]), shouldNotBeCalled, - 'aof', + 'ede', demarche ) ).toBe(true) diff --git a/packages/api/src/api/rest/titre-demande.ts b/packages/api/src/api/rest/titre-demande.ts index a7d6c8668..5f377df6e 100644 --- a/packages/api/src/api/rest/titre-demande.ts +++ b/packages/api/src/api/rest/titre-demande.ts @@ -14,7 +14,7 @@ import { checkTitreLinks } from '../../business/validations/titre-links-validate import { utilisateurTitreCreate } from '../../database/queries/utilisateurs.js' import { toCaminoDate } from 'camino-common/src/date.js' import { isNotNullNorUndefinedNorEmpty, isNullOrUndefined } from 'camino-common/src/typescript-tools.js' -import { EtapeId } from 'camino-common/src/etape.js' +import { ETAPE_IS_BROUILLON, EtapeId } from 'camino-common/src/etape.js' import { titreDemandeValidator } from 'camino-common/src/titres.js' import { HTTP_STATUS } from 'camino-common/src/http.js' import { Pool } from 'pg' @@ -89,7 +89,7 @@ export const titreDemandeCreer = (pool: Pool) => async (req: CaminoRequest, res: titreDemarcheId, typeId: 'mfr', statutId: 'fai', - isBrouillon: true, + isBrouillon: ETAPE_IS_BROUILLON, date, duree: titreDemande.typeId === 'arm' ? 4 : undefined, titulaireIds: [titreDemande.entrepriseId], diff --git a/packages/api/src/api/rest/titre-heritage.test.ts b/packages/api/src/api/rest/titre-heritage.test.ts index a3d8369c4..36957d8c3 100644 --- a/packages/api/src/api/rest/titre-heritage.test.ts +++ b/packages/api/src/api/rest/titre-heritage.test.ts @@ -3,11 +3,12 @@ import { TitrePropTitreEtapeFindDemarcheEtape } from 'camino-common/src/titres' import { getMostRecentEtapeFondamentaleValide } from './titre-heritage' import { entrepriseIdValidator } from 'camino-common/src/entreprise' import { toCaminoDate } from 'camino-common/src/date' +import { ETAPE_IS_NOT_BROUILLON } from 'camino-common/src/etape' describe('getMostRecentValueProp', () => { test('retourne le dernier titulaire même si les étapes ne sont pas dans le bon ordre', () => { const dpu: TitrePropTitreEtapeFindDemarcheEtape = { etape_type_id: 'dpu', - is_brouillon: false, + is_brouillon: ETAPE_IS_NOT_BROUILLON, fondamentale: { date_debut: null, date_fin: toCaminoDate('2032-08-18'), @@ -23,7 +24,7 @@ describe('getMostRecentValueProp', () => { const dex: TitrePropTitreEtapeFindDemarcheEtape = { etape_type_id: 'dex', - is_brouillon: false, + is_brouillon: ETAPE_IS_NOT_BROUILLON, fondamentale: { date_debut: null, date_fin: null, diff --git a/packages/api/src/api/rest/titres.queries.ts b/packages/api/src/api/rest/titres.queries.ts index d3051dbd3..6b28852ff 100644 --- a/packages/api/src/api/rest/titres.queries.ts +++ b/packages/api/src/api/rest/titres.queries.ts @@ -27,13 +27,13 @@ import { canReadDemarche } from './permissions/demarches.js' import { SectionWithValue } from 'camino-common/src/sections.js' import { getDocuments } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/documents.js' import { getSections, getSectionsWithValue } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.js' -import { OmitDistributive, isNonEmptyArray, isNotNullNorUndefined, memoize } from 'camino-common/src/typescript-tools.js' -import { getEntrepriseDocumentIdsByEtapeId, getDocumentsByEtapeId } from '../../database/queries/titres-etapes.queries.js' +import { OmitDistributive, isNonEmptyArray, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, memoize } from 'camino-common/src/typescript-tools.js' +import { getEntrepriseDocumentIdsByEtapeId, getDocumentsByEtapeId, getEtapeAvisLargeObjectIdsByEtapeId } from '../../database/queries/titres-etapes.queries.js' import { getAdministrationsLocales } from 'camino-common/src/administrations.js' import { getEntrepriseDocuments } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/entrepriseDocuments.js' import { isEtapeTypeIdFondamentale } from 'camino-common/src/static/etapesTypes.js' import { getCommunes } from '../../database/queries/communes.queries.js' -import { EtapeDocument } from 'camino-common/src/etape.js' +import { EtapeAvis, EtapeDocument } from 'camino-common/src/etape.js' import { getDateLastJournal } from './journal.queries.js' import { canHaveActivites, canReadTitre } from 'camino-common/src/permissions/titres.js' import { canReadTitreActivites } from 'camino-common/src/permissions/activites.js' @@ -41,8 +41,9 @@ import { TitreIdOrSlug, titreIdValidator, titreSlugValidator, TitreId } from 'ca import { EntrepriseId, entrepriseIdValidator } from 'camino-common/src/entreprise.js' import { AdministrationId } from 'camino-common/src/static/administrations.js' import { secteurMaritimeValidator } from 'camino-common/src/static/facades.js' +import { getAvisTypes } from 'camino-common/src/permissions/etape-form.js' -type SuperEtapeDemarcheTitreGet = OmitDistributive<DemarcheEtape, 'etape_documents'> +type SuperEtapeDemarcheTitreGet = OmitDistributive<DemarcheEtape, 'etape_documents' | 'avis_documents'> type SuperDemarcheTitreGet = Omit<TitreGet['demarches'][0], 'etapes'> & { etapes: SuperEtapeDemarcheTitreGet[]; public_lecture: boolean; entreprises_lecture: boolean; titre_public_lecture: boolean } export const getTitre = async (pool: Pool, user: User, idOrSlug: TitreIdOrSlug): Promise<TitreGet | null> => { @@ -78,7 +79,7 @@ export const getTitre = async (pool: Pool, user: User, idOrSlug: TitreIdOrSlug): entrepriseDocuments.push(...(await getEntrepriseDocumentIdsByEtapeId({ titre_etape_id: etape.id }, pool, user))) } - const etapeCommon: Omit<DemarcheEtapeCommon, 'etape_documents'> = { + const etapeCommon: Omit<DemarcheEtapeCommon, 'etape_documents' | 'avis_documents'> = { date: etape.date, ordre: etape.ordre, notes: etape.notes, @@ -141,7 +142,7 @@ export const getTitre = async (pool: Pool, user: User, idOrSlug: TitreIdOrSlug): } } - const etapeFondamentale: Omit<DemarcheEtapeFondamentale, 'etape_documents'> = { + const etapeFondamentale: Omit<DemarcheEtapeFondamentale, 'etape_documents' | 'avis_documents'> = { etape_type_id: etape.etape_type_id, fondamentale: { amodiataireIds, @@ -157,7 +158,7 @@ export const getTitre = async (pool: Pool, user: User, idOrSlug: TitreIdOrSlug): formatedEtapes.push(etapeFondamentale) } else { - const etapeNonFondamentale: Omit<DemarcheEtapeNonFondamentale, 'etape_documents'> = { etape_type_id: etape.etape_type_id, ...etapeCommon } + const etapeNonFondamentale: Omit<DemarcheEtapeNonFondamentale, 'etape_documents' | 'avis_documents'> = { etape_type_id: etape.etape_type_id, ...etapeCommon } formatedEtapes.push(etapeNonFondamentale) } @@ -210,12 +211,30 @@ export const getTitre = async (pool: Pool, user: User, idOrSlug: TitreIdOrSlug): if (canRead) { const etape_documents: EtapeDocument[] = [] const documentsTypes = getDocuments(titre.titre_type_id, superDemarche.demarche_type_id, superEtape.etape_type_id) - if (documentsTypes.length > 0) { + if (isNotNullNorUndefinedNorEmpty(documentsTypes)) { etape_documents.push( ...(await getDocumentsByEtapeId(superEtape.id, pool, user, titreTypeId, administrationsLocales, entreprisesTitulairesOuAmodiataires, superEtape.etape_type_id, superDemarche)) ) } - etapes.push({ ...superEtape, etape_documents }) + + const avis_documents: EtapeAvis[] = [] + const avisTypes = getAvisTypes(superEtape.etape_type_id, titre.titre_type_id, perimetre?.communes.map(({ id }) => id) ?? []) + if (isNotNullNorUndefinedNorEmpty(avisTypes)) { + const avisWithLargeObjectId = await getEtapeAvisLargeObjectIdsByEtapeId( + superEtape.id, + pool, + user, + titreTypeId, + administrationsLocales, + entreprisesTitulairesOuAmodiataires, + superEtape.etape_type_id, + superDemarche + ) + + avis_documents.push(...avisWithLargeObjectId.map(a => ({ ...a, has_file: isNotNullNorUndefined(a.largeobject_id) }))) + } + + etapes.push({ ...superEtape, etape_documents, avis_documents }) } } diff --git a/packages/api/src/api/rest/titres.test.integration.ts b/packages/api/src/api/rest/titres.test.integration.ts index d591f28a9..322865200 100644 --- a/packages/api/src/api/rest/titres.test.integration.ts +++ b/packages/api/src/api/rest/titres.test.integration.ts @@ -20,6 +20,7 @@ import { titreSlugValidator } from 'camino-common/src/validators/titres.js' import TitresDemarches from '../../database/models/titres-demarches.js' import TitresEtapes from '../../database/models/titres-etapes.js' import Titres from '../../database/models/titres.js' +import { ETAPE_IS_NOT_BROUILLON } from 'camino-common/src/etape.js' console.info = vi.fn() console.error = vi.fn() @@ -49,7 +50,7 @@ beforeAll(async () => { { typeId: 'mfr', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2022-01-01'), ordre: 0, administrationsLocales: [ADMINISTRATION_IDS['DGTM - GUYANE']], @@ -58,21 +59,21 @@ beforeAll(async () => { { typeId: 'mdp', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2022-02-01'), ordre: 1, }, { typeId: 'pfd', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2022-02-10'), ordre: 2, }, { typeId: 'mcp', statutId: 'com', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2022-03-10'), ordre: 3, }, @@ -85,7 +86,7 @@ beforeAll(async () => { { typeId: 'mfr', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2022-01-01'), ordre: 0, administrationsLocales: [ADMINISTRATION_IDS['DGTM - GUYANE']], @@ -93,14 +94,14 @@ beforeAll(async () => { { typeId: 'mdp', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2022-02-01'), ordre: 1, }, { typeId: 'pfd', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2022-02-10'), ordre: 2, }, @@ -493,6 +494,7 @@ describe('getTitre', () => { "description": null, "etapes": [ { + "avis_documents": [], "date": "2022-01-01", "entreprises_documents": [], "etape_documents": [], @@ -518,6 +520,7 @@ describe('getTitre', () => { "description": "", "id": "mecanise", "nom": "Prospection mécanisée", + "optionnel": false, "type": "radio", "value": null, }, diff --git a/packages/api/src/business/processes/titres-demarches-depot-create.test.ts b/packages/api/src/business/processes/titres-demarches-depot-create.test.ts index 9ac9a44fb..2359912a0 100644 --- a/packages/api/src/business/processes/titres-demarches-depot-create.test.ts +++ b/packages/api/src/business/processes/titres-demarches-depot-create.test.ts @@ -1,3 +1,4 @@ +import { ETAPE_IS_NOT_BROUILLON, ETAPE_IS_BROUILLON } from 'camino-common/src/etape.js' import type { ITitre, ITitreEtape, ITitreDemarche } from '../../types.js' import { titreDemarcheDepotCheck } from './titres-demarches-depot-create.js' @@ -5,14 +6,14 @@ import { describe, expect, test } from 'vitest' describe('créer le dépot de la démarche', () => { test.each<[string, ITitreEtape[], boolean]>([ - ['crée un dépot d’une ARM avec une demande faite', [{ date: '2021-01-01', typeId: 'mfr', statutId: 'fai', isBrouillon: false }] as ITitreEtape[], true], - ['ne crée pas un dépot d’une ARM si sa demande est en construction', [{ date: '2021-01-01', typeId: 'mfr', statutId: 'fai', isBrouillon: true }] as ITitreEtape[], false], - ['ne crée pas un dépot d’une ARM si sa demande est historique', [{ date: '2018-01-01', typeId: 'mfr', statutId: 'fai', isBrouillon: false }] as ITitreEtape[], false], + ['crée un dépot d’une ARM avec une demande faite', [{ date: '2021-01-01', typeId: 'mfr', statutId: 'fai', isBrouillon: ETAPE_IS_NOT_BROUILLON }] as ITitreEtape[], true], + ['ne crée pas un dépot d’une ARM si sa demande est en construction', [{ date: '2021-01-01', typeId: 'mfr', statutId: 'fai', isBrouillon: ETAPE_IS_BROUILLON }] as ITitreEtape[], false], + ['ne crée pas un dépot d’une ARM si sa demande est historique', [{ date: '2018-01-01', typeId: 'mfr', statutId: 'fai', isBrouillon: ETAPE_IS_NOT_BROUILLON }] as ITitreEtape[], false], [ 'ne crée pas un dépot d’une ARM si déjà déposée', [ - { date: '2021-01-01', typeId: 'mfr', statutId: 'fai', isBrouillon: false }, - { date: '2021-01-02', typeId: 'mdp', statutId: 'fai', isBrouillon: false }, + { date: '2021-01-01', typeId: 'mfr', statutId: 'fai', isBrouillon: ETAPE_IS_NOT_BROUILLON }, + { date: '2021-01-02', typeId: 'mdp', statutId: 'fai', isBrouillon: ETAPE_IS_NOT_BROUILLON }, ] as ITitreEtape[], false, ], diff --git a/packages/api/src/business/processes/titres-demarches-statut-ids-update.test.ts b/packages/api/src/business/processes/titres-demarches-statut-ids-update.test.ts index 9de575130..d021c08e7 100644 --- a/packages/api/src/business/processes/titres-demarches-statut-ids-update.test.ts +++ b/packages/api/src/business/processes/titres-demarches-statut-ids-update.test.ts @@ -4,6 +4,7 @@ import { getDemarches } from './titres-etapes-heritage-contenu-update.queries.js import { newDemarcheId, newEtapeId, newTitreId } from '../../database/models/_format/id-create.js' import { toCaminoDate } from 'camino-common/src/date.js' import { Pool } from 'pg' +import { ETAPE_IS_NOT_BROUILLON } from 'camino-common/src/etape.js' vi.mock('./titres-etapes-heritage-contenu-update.queries', () => ({ getDemarches: vi.fn().mockResolvedValue(true), @@ -31,7 +32,7 @@ describe("statut des démarches d'un titre", () => { id: newEtapeId('h-cx-courdemanges-1988-oct01-dpu01'), typeId: 'dpu', statutId: 'acc', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 2, date: toCaminoDate('1988-03-11'), communes: [], @@ -43,7 +44,7 @@ describe("statut des démarches d'un titre", () => { id: newEtapeId('h-cx-courdemanges-1988-oct01-dex01'), typeId: 'dex', statutId: 'acc', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 1, date: toCaminoDate('1988-03-06'), communes: [], @@ -72,7 +73,7 @@ describe("statut des démarches d'un titre", () => { id: newEtapeId('h-cx-courdemanges-1988-oct01-dpu01'), typeId: 'dpu', statutId: 'acc', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 2, date: toCaminoDate('1988-03-11'), communes: [], @@ -84,7 +85,7 @@ describe("statut des démarches d'un titre", () => { id: newEtapeId('h-cx-courdemanges-1988-oct01-dex01'), typeId: 'dex', statutId: 'acc', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 1, date: toCaminoDate('1988-03-06'), communes: [], diff --git a/packages/api/src/business/processes/titres-etapes-administrations-locales-update.test.ts b/packages/api/src/business/processes/titres-etapes-administrations-locales-update.test.ts index ad2f8e3fe..079e4464a 100644 --- a/packages/api/src/business/processes/titres-etapes-administrations-locales-update.test.ts +++ b/packages/api/src/business/processes/titres-etapes-administrations-locales-update.test.ts @@ -7,6 +7,7 @@ import { ADMINISTRATION_IDS } from 'camino-common/src/static/administrations.js' import { toCaminoDate } from 'camino-common/src/date.js' import { vi, describe, expect, test } from 'vitest' import { toCommuneId } from 'camino-common/src/static/communes.js' +import { ETAPE_IS_NOT_BROUILLON } from 'camino-common/src/etape.js' vi.mock('../../database/queries/titres-etapes', () => ({ titresEtapesGet: vi.fn(), })) @@ -35,7 +36,7 @@ describe("administrations d'une étape", () => { statutId: 'fai', date: toCaminoDate('2022-01-01'), typeId: 'dpu', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, communes: [ { id: toCommuneId('97300'), @@ -48,8 +49,8 @@ describe("administrations d'une étape", () => { titreDemarcheId: newDemarcheId(), statutId: 'fai', date: toCaminoDate('2022-01-01'), - typeId: 'aac', - isBrouillon: false, + typeId: 'asc', + isBrouillon: ETAPE_IS_NOT_BROUILLON, communes: [ { id: toCommuneId('87000'), @@ -72,7 +73,7 @@ describe("administrations d'une étape", () => { titreDemarcheId: newDemarcheId('h-cx-courdemanges-1988-oct01'), typeId: 'dpu', statutId: 'acc', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 2, date: toCaminoDate('1988-03-11'), communes: [ @@ -96,7 +97,7 @@ describe("administrations d'une étape", () => { titreDemarcheId: newDemarcheId('h-cx-courdemanges-1988-oct01'), typeId: 'dpu', statutId: 'acc', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 2, date: toCaminoDate('1988-03-11'), communes: [], @@ -114,7 +115,7 @@ describe("administrations d'une étape", () => { id: newEtapeId('h-cx-courdemanges-1988-oct01-dpu01'), titreDemarcheId: newDemarcheId(), statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2022-01-01'), typeId: 'dpu', communes: [], @@ -131,7 +132,7 @@ describe("administrations d'une étape", () => { test("supprime une administration si l'étape ne la contient plus dans ses communes", async () => { const titreEtape: ITitreEtape = { statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2022-01-01'), id: newEtapeId('h-cx-courdemanges-1988-oct01-dpu01'), titreDemarcheId: newDemarcheId('h-cx-courdemanges-1988-oct01'), diff --git a/packages/api/src/business/processes/titres-etapes-areas-update.test.integration.ts b/packages/api/src/business/processes/titres-etapes-areas-update.test.integration.ts index f5f575c44..02d263ef1 100644 --- a/packages/api/src/business/processes/titres-etapes-areas-update.test.integration.ts +++ b/packages/api/src/business/processes/titres-etapes-areas-update.test.integration.ts @@ -16,6 +16,7 @@ import { insertCommune } from '../../database/queries/communes.queries.js' import { Pool } from 'pg' import { titreSlugValidator } from 'camino-common/src/validators/titres.js' import { FeatureMultiPolygon } from 'camino-common/src/perimetre.js' +import { ETAPE_IS_BROUILLON } from 'camino-common/src/etape.js' console.info = vi.fn() console.error = vi.fn() @@ -97,7 +98,7 @@ describe('titresEtapesAreasUpdate', () => { date: toCaminoDate('2022-03-09'), typeId: 'mfr', statutId: 'fai', - isBrouillon: true, + isBrouillon: ETAPE_IS_BROUILLON, titreDemarcheId, archive: false, sdomZones: [SDOMZoneIds.Zone2], diff --git a/packages/api/src/business/processes/titres-etapes-heritage-contenu-update.queries.ts b/packages/api/src/business/processes/titres-etapes-heritage-contenu-update.queries.ts index 90fdbddef..556b516a7 100644 --- a/packages/api/src/business/processes/titres-etapes-heritage-contenu-update.queries.ts +++ b/packages/api/src/business/processes/titres-etapes-heritage-contenu-update.queries.ts @@ -10,12 +10,13 @@ import { etapeStatutIdValidator } from 'camino-common/src/static/etapesStatuts.j import { TitreTypeId, titreTypeIdValidator } from 'camino-common/src/static/titresTypes.js' import { etapeTypeIdValidator } from 'camino-common/src/static/etapesTypes.js' import { TitreId, titreIdValidator } from 'camino-common/src/validators/titres.js' -import { etapeIdValidator } from 'camino-common/src/etape.js' +import { etapeBrouillonValidator, etapeIdValidator } from 'camino-common/src/etape.js' import { z } from 'zod' import { Pool } from 'pg' import { communeValidator } from 'camino-common/src/static/communes.js' import { TitreEtapeForMachine } from '../rules-demarches/machine-common.js' import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools.js' +import { km2Validator } from 'camino-common/src/number.js' const getEtapesByDemarcheValidator = z.object({ contenu: z.any().nullable(), @@ -30,9 +31,9 @@ const getEtapesByDemarcheValidator = z.object({ titre_id: titreIdValidator, titre_type_id: titreTypeIdValidator, communes: z.array(communeValidator.pick({ id: true })).nullable(), - surface: z.number().nullable(), + surface: km2Validator.nullable(), type_id: etapeTypeIdValidator.nullable(), - is_brouillon: z.boolean().nullable(), + is_brouillon: etapeBrouillonValidator.nullable(), }) export const getDemarches = async ( diff --git a/packages/api/src/business/processes/titres-etapes-heritage-contenu-update.ts b/packages/api/src/business/processes/titres-etapes-heritage-contenu-update.ts index bdac7e256..cc596e0a2 100644 --- a/packages/api/src/business/processes/titres-etapes-heritage-contenu-update.ts +++ b/packages/api/src/business/processes/titres-etapes-heritage-contenu-update.ts @@ -4,7 +4,7 @@ import { titreEtapeHeritageContenuFind } from '../utils/titre-etape-heritage-con import { titreEtapesSortAscByOrdre, titreEtapesSortDescByOrdre } from '../utils/titre-etapes-sort.js' import { UserNotNull } from 'camino-common/src/roles.js' import { getSections, Section } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.js' -import { DeepReadonly } from 'camino-common/src/typescript-tools.js' +import { DeepReadonly, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools.js' import { DemarcheId } from 'camino-common/src/demarche.js' import { Pool } from 'pg' import { getDemarches } from './titres-etapes-heritage-contenu-update.queries.js' @@ -32,7 +32,7 @@ export const titresEtapesHeritageContenuUpdate = async (pool: Pool, user: UserNo }, {}) const titreEtapes = titreEtapesSortAscByOrdre(titreDemarche.etapes?.filter(e => etapeSectionsDictionary[e.id]) ?? []) - if (titreEtapes) { + if (isNotNullNorUndefinedNorEmpty(titreEtapes)) { for (let index = 0; index < titreEtapes.length; index++) { const titreEtape = titreEtapes[index] const titreEtapesFiltered = titreEtapesSortDescByOrdre(titreEtapes.slice(0, index)) diff --git a/packages/api/src/business/processes/titres-etapes-ordre-update.test.ts b/packages/api/src/business/processes/titres-etapes-ordre-update.test.ts index 276db6080..07f22b9ff 100644 --- a/packages/api/src/business/processes/titres-etapes-ordre-update.test.ts +++ b/packages/api/src/business/processes/titres-etapes-ordre-update.test.ts @@ -10,6 +10,8 @@ import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes.js' import { TitreTypeId } from 'camino-common/src/static/titresTypes.js' import { TitreId, titreIdValidator } from 'camino-common/src/validators/titres.js' import { TitreEtapeForMachine } from '../rules-demarches/machine-common.js' +import { ETAPE_IS_NOT_BROUILLON } from 'camino-common/src/etape.js' +import { ZERO_KM2 } from 'camino-common/src/number.js' vi.mock('../../database/queries/titres-etapes', () => ({ titreEtapeUpdate: vi.fn().mockResolvedValue(true), })) @@ -30,8 +32,26 @@ const titresDemarchesEtapes: { titreTypeId: 'apc', titreId: titreIdValidator.parse('titreId'), etapes: [ - { id: newEtapeId(), ordre: 1, date: caminoDateValidator.parse('1988-03-06'), typeId: 'aac', statutId: 'acc', isBrouillon: false, surface: 0, communes: null }, - { id: newEtapeId(), ordre: 1, date: caminoDateValidator.parse('1988-03-08'), typeId: 'aac', statutId: 'acc', isBrouillon: false, surface: 0, communes: null }, + { + id: newEtapeId(), + ordre: 1, + date: caminoDateValidator.parse('1988-03-06'), + typeId: 'asc', + statutId: 'fai', + isBrouillon: ETAPE_IS_NOT_BROUILLON, + surface: ZERO_KM2, + communes: null, + }, + { + id: newEtapeId(), + ordre: 1, + date: caminoDateValidator.parse('1988-03-08'), + typeId: 'asc', + statutId: 'fai', + isBrouillon: ETAPE_IS_NOT_BROUILLON, + surface: ZERO_KM2, + communes: null, + }, ], }, } diff --git a/packages/api/src/business/processes/titres-phases-update.test.ts b/packages/api/src/business/processes/titres-phases-update.test.ts index 3d4678445..c4d81924b 100644 --- a/packages/api/src/business/processes/titres-phases-update.test.ts +++ b/packages/api/src/business/processes/titres-phases-update.test.ts @@ -6,6 +6,7 @@ import { ITitre } from '../../types.js' import { newDemarcheId, newEtapeId, newTitreId } from '../../database/models/_format/id-create.js' import { Pool } from 'pg' import { updateDatesDemarche } from './titres-phases-update.queries.js' +import { ETAPE_IS_NOT_BROUILLON } from 'camino-common/src/etape.js' vi.mock('../../database/queries/titres', () => ({ titresGet: vi.fn(), @@ -51,7 +52,7 @@ describe("phases d'un titre", () => { titreDemarcheId: newDemarcheId('h-cx-courdemanges-1988-oct01'), typeId: 'dpu', statutId: 'acc', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 2, date: toCaminoDate('2200-01-01'), dateFin: toCaminoDate('2500-01-01'), @@ -61,7 +62,7 @@ describe("phases d'un titre", () => { titreDemarcheId: newDemarcheId('h-cx-courdemanges-1988-oct01'), typeId: 'dex', statutId: 'acc', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 1, date: toCaminoDate('2200-01-01'), dateFin: toCaminoDate('2500-01-01'), @@ -101,7 +102,7 @@ describe("phases d'un titre", () => { titreDemarcheId: newDemarcheId('h-cx-courdemanges-1988-oct01'), typeId: 'dpu', statutId: 'acc', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 2, date: toCaminoDate('2200-01-01'), dateFin: toCaminoDate('2500-01-01'), @@ -111,7 +112,7 @@ describe("phases d'un titre", () => { titreDemarcheId: newDemarcheId('h-cx-courdemanges-1988-oct01'), typeId: 'dex', statutId: 'acc', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 1, date: toCaminoDate('2200-01-01'), dateFin: toCaminoDate('2500-01-01'), @@ -179,7 +180,7 @@ describe("phases d'un titre", () => { titreDemarcheId: newDemarcheId('h-cx-courdemanges-1988-oct01'), typeId: 'dpu', statutId: 'acc', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 2, date: toCaminoDate('2200-01-01'), dateFin: toCaminoDate('2500-01-01'), @@ -189,7 +190,7 @@ describe("phases d'un titre", () => { titreDemarcheId: newDemarcheId('h-cx-courdemanges-1988-oct01'), typeId: 'dex', statutId: 'acc', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 1, date: toCaminoDate('2200-01-01'), dateFin: toCaminoDate('2500-01-01'), diff --git a/packages/api/src/business/rules-demarches/arm/__snapshots__/oct.machine.test.ts.snap b/packages/api/src/business/rules-demarches/arm/__snapshots__/oct.machine.test.ts.snap index 649f4b115..d2a5a3a8d 100644 --- a/packages/api/src/business/rules-demarches/arm/__snapshots__/oct.machine.test.ts.snap +++ b/packages/api/src/business/rules-demarches/arm/__snapshots__/oct.machine.test.ts.snap @@ -6,7 +6,7 @@ exports[`vérifie l’arbre d’octroi d’ARM > ne peut pas créer deux "des" 1 exports[`vérifie l’arbre d’octroi d’ARM > ne peut pas créer une "css" après une "des" 1`] = `[Error: Error: cannot execute step: '{"etapeTypeId":"css","etapeStatutId":"fai","date":"2020-01-05"}' after '["mfr_fai","mdp_fai","des_fai"]'. The event {"type":"CLASSER_SANS_SUITE"} should be one of 'VALIDER_FRAIS_DE_DOSSIER']`; -exports[`vérifie l’arbre d’octroi d’ARM > ne peut pas créer une "mno" après la "aca" si le titre n’est pas mécanisé 1`] = `[Error: Error: cannot execute step: '{"etapeTypeId":"mnb","etapeStatutId":"fai","date":"2020-01-04"}' after '["mfr_fai","mdp_fai","pfd_fai","mcp_com","vfd_fai","mcr_fav","eof_fai","aof_fav","sca_fai","aca_fav"]'. The event {"type":"NOTIFIER_DEMANDEUR_AVIS_FAVORABLE_CARM"} should be one of 'CLASSER_SANS_SUITE,DESISTER_PAR_LE_DEMANDEUR,SIGNER_AUTORISATION_DE_RECHERCHE_MINIERE']`; +exports[`vérifie l’arbre d’octroi d’ARM > ne peut pas créer une "mno" après la "aca" si le titre n’est pas mécanisé 1`] = `[Error: Error: cannot execute step: '{"etapeTypeId":"mnb","etapeStatutId":"fai","date":"2020-01-04"}' after '["mfr_fai","mdp_fai","pfd_fai","mcp_com","vfd_fai","mcr_fav","asc_fai","sca_fai","aca_fav"]'. The event {"type":"NOTIFIER_DEMANDEUR_AVIS_FAVORABLE_CARM"} should be one of 'CLASSER_SANS_SUITE,DESISTER_PAR_LE_DEMANDEUR,SIGNER_AUTORISATION_DE_RECHERCHE_MINIERE']`; exports[`vérifie l’arbre d’octroi d’ARM > ne peut pas créer une étape "{ etapeTypeId: 'mcb', etapeStatutId: 'fai', date: '2020-01-01' }" si il n’existe pas d’autres étapes 1`] = `[Error: Error: cannot execute step: '{"etapeTypeId":"mcb","etapeStatutId":"fai","date":"2020-01-01"}' after '[]'. The event {"type":"DEMANDER_COMPLEMENTS_RDE"} should be one of 'ACCEPTER_RDE,DEMANDER_MODIFICATION_DE_LA_DEMANDE,EXEMPTER_DAE,FAIRE_DEMANDE,PAYER_FRAIS_DE_DOSSIER,REFUSER_RDE']`; diff --git a/packages/api/src/business/rules-demarches/arm/oct.cas.json b/packages/api/src/business/rules-demarches/arm/oct.cas.json index 9d2ed22d3..413f40a3e 100644 --- a/packages/api/src/business/rules-demarches/arm/oct.cas.json +++ b/packages/api/src/business/rules-demarches/arm/oct.cas.json @@ -1 +1 @@ -[{"id":0,"demarcheStatutId":"ins","demarchePublique":true,"etapes":[{"date":"2022-11-13","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-11-22","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-11-29","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":8}}},{"date":"2022-11-29","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-12-01","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-12-19","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-12-19","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-12-19","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2023-02-03","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":8}}},{"date":"2023-03-10","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2023-03-19","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2023-03-19","etapeTypeId":"aca","etapeStatutId":"fav"}]},{"id":1,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2022-09-15","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-09-27","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2022-09-27","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-09-27","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-09-28","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-09-28","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-09-28","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-10-19","etapeTypeId":"aof","etapeStatutId":"fre"},{"date":"2022-11-16","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-11-16","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2023-01-24","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":2,"demarcheStatutId":"ins","demarchePublique":true,"etapes":[{"date":"2022-09-01","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-09-23","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-10-14","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":12}}},{"date":"2022-10-14","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-11-04","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-11-10","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-11-10","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-11-10","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-12-04","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":12}}},{"date":"2022-12-10","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2022-12-17","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-12-17","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-12-29","etapeTypeId":"mnb","etapeStatutId":"fai"}]},{"id":3,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-11-02","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-11-03","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2021-11-03","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-11-13","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-11-13","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-11-19","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-11-19","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-11-20","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-11-24","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":5}}},{"date":"2022-01-28","etapeTypeId":"aof","etapeStatutId":"fre"},{"date":"2022-02-05","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-02-05","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-03-02","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2022-03-02","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2022-03-02","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2022-03-05","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2022-07-06","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":4,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-01-15","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-02-17","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-02-18","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":3}}},{"date":"2022-02-18","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-03-04","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-03-04","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-03-04","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-03-10","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":3}}},{"date":"2022-03-11","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-04-30","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2022-05-07","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-06-04","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-07-04","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2022-08-05","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2022-08-05","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2022-09-22","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":5,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2022-03-31","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2022-03-31","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-06-15","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":6,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-07-12","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-08-12","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-08-13","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2020-08-16","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-08-20","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-09-02","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-09-02","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-09-04","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-10-02","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2020-11-14","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-11-20","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-11-20","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-12-03","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-01-20","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-01-20","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-02-07","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":7,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-03-03","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-03-05","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-03-23","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":13}}},{"date":"2020-04-13","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-04-21","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-04-27","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-04-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-04-27","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-06-01","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":13}}},{"date":"2020-08-27","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-08-28","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-09-02","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-09-09","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-09-15","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-09-15","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-09-18","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":8,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-06-02","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-06-19","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":9}}},{"date":"2020-06-20","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-06-27","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-27","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-07-10","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":9}}},{"date":"2020-07-11","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-07-11","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-07-21","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-07-21","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-08-15","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-08-20","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-08-27","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-10-17","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-10-17","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-11-26","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":9,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-10-08","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-10-08","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-10-10","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-10-23","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-11-14","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-11-14","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-12-11","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-12-25","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2020-12-26","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-01-16","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-01-24","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-01-25","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":10,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-07-10","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":6}}},{"date":"2021-07-10","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-07-11","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-07-11","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-07-11","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-07-18","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-07-18","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-07-20","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-11-22","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2021-12-10","etapeTypeId":"rcb","etapeStatutId":"fai","contenu":{"arm":{"franchissements":6}}},{"date":"2021-12-17","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":7}}},{"date":"2022-01-17","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2022-01-25","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-01-25","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":11,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-03-21","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-05-16","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":3}}},{"date":"2020-05-20","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-05-20","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-05-27","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-06-09","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-06-09","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-06-18","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-06-18","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-07-10","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":3}}},{"date":"2020-08-01","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-08-16","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-09-17","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-09-25","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-09-25","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-09-30","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":12,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-06-19","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-06-28","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":11}}},{"date":"2020-06-28","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-07-09","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-07-09","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-07-23","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":11}}},{"date":"2020-07-25","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-07-28","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-07-30","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-07-30","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-08-24","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-08-29","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-09-05","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-09-20","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-09-20","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-09-25","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":13,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-06-14","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-01-24","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-02-24","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":8}}},{"date":"2021-02-27","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-03-08","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-03-14","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-03-14","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-03-14","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-04-13","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-04-18","etapeTypeId":"aof","etapeStatutId":"fre"},{"date":"2021-04-24","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":8}}},{"date":"2021-04-26","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-04-26","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-05-15","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-06-08","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-06-08","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-06-09","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":14,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-07-23","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2020-08-08","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-08-29","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-09-03","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-09-03","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-10-14","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2020-10-17","etapeTypeId":"rcb","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":4}}},{"date":"2020-10-24","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-10-24","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-10-24","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":4}}},{"date":"2020-10-24","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-10-24","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-12-18","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-12-18","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-12-31","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-01-19","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-01-19","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-02-07","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":15,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-01-02","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":7}}},{"date":"2020-01-26","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-01-26","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-01-27","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-01-31","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-02-13","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-02-13","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-02-21","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-02-21","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-04-27","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":7}}},{"date":"2020-05-18","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-05-20","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-06-11","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-08-06","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-08-06","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-08-28","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":16,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-07-20","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-08-13","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":8}}},{"date":"2020-08-13","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-10-12","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-10-17","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-10-18","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-10-18","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-10-18","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-10-18","etapeTypeId":"aof","etapeStatutId":"fre"},{"date":"2020-10-26","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":8}}},{"date":"2020-12-20","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-12-20","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-01-02","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-03-05","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-03-05","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-04-03","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":17,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-04-02","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-05-03","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":7}}},{"date":"2020-05-07","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-05-14","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-05-17","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-05-27","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-05-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-06-05","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-06-05","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-06-11","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":7}}},{"date":"2020-07-19","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-07-24","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-09-04","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-09-12","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-09-12","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-09-17","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":18,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-06-04","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-06-17","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-06-25","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2020-06-25","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-29","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-07-24","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-07-24","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-07-31","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-09-30","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2021-02-01","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":14}}},{"date":"2021-04-07","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-04-07","etapeTypeId":"aca","etapeStatutId":"ajo"},{"date":"2021-04-13","etapeTypeId":"mna","etapeStatutId":"fai"},{"date":"2021-12-02","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-12-02","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":19,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2019-10-31","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2019-11-05","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-03-08","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-03-12","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-03-18","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-03-19","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-03-31","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-04-05","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2020-05-31","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-06-02","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2020-06-24","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":20,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2019-11-19","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2019-12-03","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2019-12-06","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2019-12-14","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2019-12-18","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2019-12-18","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2019-12-19","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-03-26","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2020-03-31","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2020-04-01","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-04-02","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2020-04-11","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":21,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-04-30","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-04-30","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-04-30","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-05-15","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-05-16","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-05-16","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-05-25","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-08-31","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-09-01","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-09-06","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-09-13","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":22,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2019-09-18","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2019-10-02","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-02-24","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-02-24","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-03-26","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-03-26","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-03-26","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-03-26","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-04-07","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-05-06","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-05-29","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-05-29","etapeTypeId":"mns","etapeStatutId":"fai"}]},{"id":23,"demarcheStatutId":"cls","demarchePublique":true,"etapes":[{"date":"2020-09-10","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-09-10","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-09-11","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-09-24","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-09-28","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-09-28","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-09-28","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-10-14","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2020-12-16","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-12-16","etapeTypeId":"aca","etapeStatutId":"ajo"},{"date":"2020-12-29","etapeTypeId":"mna","etapeStatutId":"fai"},{"date":"2021-03-03","etapeTypeId":"css","etapeStatutId":"fai"}]},{"id":24,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-09-10","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-09-11","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false,"franchissements":0}}},{"date":"2020-09-11","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-10-02","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-10-05","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-10-26","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-10-26","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-12-07","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2020-12-13","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-12-13","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2020-12-26","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":25,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-09-06","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false,"franchissements":0}}},{"date":"2020-09-06","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-09-07","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-10-11","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-10-14","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-10-14","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-10-14","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-12-02","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2020-12-08","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-12-08","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2020-12-21","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":26,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-05-19","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-05-29","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-05-29","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-05-29","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-06-03","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-06-03","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-06-04","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-07-11","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-09-22","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-09-23","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-09-23","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-10-14","etapeTypeId":"sco","etapeStatutId":"fai"}]},{"id":27,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-11-03","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false,"franchissements":0}}},{"date":"2020-11-03","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-11-03","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-11-04","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-11-13","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-11-13","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-12-02","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-02-18","etapeTypeId":"edm","etapeStatutId":"def"},{"date":"2021-02-18","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2021-04-01","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-04-03","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":28,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-06-19","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-06-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-06-19","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-06-19","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-06-27","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-06-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-07-05","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-07-19","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-09-30","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-10-01","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-10-01","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-10-22","etapeTypeId":"sco","etapeStatutId":"fai"}]},{"id":29,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2019-09-18","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":19}}},{"date":"2019-10-06","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2019-11-15","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2019-11-16","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2019-11-22","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2019-11-29","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2019-11-29","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2019-11-29","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":19}}},{"date":"2019-11-29","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2019-11-29","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-04-29","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-05-08","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-05-13","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-05-17","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-05-17","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-08-12","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":30,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-01-06","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false,"franchissements":0}}},{"date":"2021-01-07","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-01-07","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-01-26","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-02-05","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-02-05","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-02-05","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-02-23","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-04-28","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2021-05-01","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-05-06","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2021-05-21","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":31,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2019-12-26","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2019-12-30","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":18}}},{"date":"2020-01-07","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-01-14","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-01-23","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2020-02-04","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-02-05","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-02-12","etapeTypeId":"rcb","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":18}}},{"date":"2020-02-27","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":18}}},{"date":"2020-03-19","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-03-19","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-04-02","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-05-12","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-05-12","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-05-17","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-06-16","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-06-16","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-08-19","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":32,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-06-12","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-06-13","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":10}}},{"date":"2021-06-13","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-06-19","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-06-19","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-06-25","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-06-25","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-06-25","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-07-05","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-09-16","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":17}}},{"date":"2021-10-18","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-10-25","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-10-25","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-11-01","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-12-02","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-12-02","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-12-02","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2022-04-16","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2022-04-16","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":33,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2020-05-14","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":10}}},{"date":"2020-05-14","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-06-19","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":10}}},{"date":"2020-06-20","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-07-17","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-07-17","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-08-14","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":34,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-06-14","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-06-21","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":12}}},{"date":"2021-06-21","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-06-21","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-06-22","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-06-27","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-06-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-06-27","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-07-07","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-09-21","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":17}}},{"date":"2021-10-20","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-10-27","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-10-27","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-11-03","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-11-21","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-11-21","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-12-04","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2022-04-18","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2022-04-18","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":35,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2019-11-04","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2019-11-05","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2019-11-05","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2019-11-18","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2019-11-28","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2019-11-28","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2019-11-30","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2019-11-30","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-05-13","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-05-27","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-06-10","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":36,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-01-06","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false,"franchissements":0}}},{"date":"2021-01-07","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-01-11","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-01-29","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-02-12","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-02-12","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-03-01","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-03-17","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-04-09","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-04-14","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-04-14","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-05-10","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-05-10","etapeTypeId":"mns","etapeStatutId":"fai"}]},{"id":37,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-08-15","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-12-28","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-01-08","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":0}}},{"date":"2021-01-09","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-01-24","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-01-26","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-01-29","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-02-07","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-02-26","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-03-06","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-04-06","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-04-11","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-04-16","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-05-08","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-05-08","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-05-08","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":38,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-11-18","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-11-18","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-11-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-11-19","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-01-13","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-01-14","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-01-14","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-03-06","etapeTypeId":"edm","etapeStatutId":"def"},{"date":"2021-03-09","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2021-04-18","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-04-18","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":39,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-06-17","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-06-17","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-06-17","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-06-17","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-06-25","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-06-25","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-07-03","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-07-17","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-09-28","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-09-29","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-09-29","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-10-20","etapeTypeId":"sco","etapeStatutId":"fai"}]},{"id":40,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-09-11","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-09-11","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-09-12","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-09-29","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-10-05","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-10-05","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-10-24","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-03-08","etapeTypeId":"edm","etapeStatutId":"def"},{"date":"2021-03-11","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2021-04-18","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-04-20","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":41,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-12-25","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":5}}},{"date":"2020-12-29","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-01-10","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-01-25","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-01-26","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-01-30","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-01-31","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-02-22","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-02-22","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-02-27","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2021-03-27","etapeTypeId":"rcb","etapeStatutId":"fai","contenu":{"arm":{"franchissements":5}}},{"date":"2021-10-26","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":5}}},{"date":"2021-10-27","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2022-03-02","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-03-02","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":42,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-12-15","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-12-23","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":5}}},{"date":"2020-12-23","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-01-11","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-01-12","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-02-16","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-02-16","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-02-16","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-03-06","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-03-29","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2021-07-27","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":5}}},{"date":"2021-09-25","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2021-09-26","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-09-26","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2021-10-12","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":43,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-07-07","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":4}}},{"date":"2021-07-07","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-07-07","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-07-07","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-07-07","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-07-16","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-07-16","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-07-24","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-12-02","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":4}}},{"date":"2022-02-04","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2022-02-12","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-02-12","etapeTypeId":"aca","etapeStatutId":"ajo"},{"date":"2022-02-25","etapeTypeId":"mna","etapeStatutId":"fai"},{"date":"2022-03-17","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-03-17","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2022-04-01","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":44,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-11-11","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-11-17","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":9}}},{"date":"2020-11-17","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-01-26","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-02-10","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-02-20","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":9}}},{"date":"2021-02-26","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-02-26","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-03-04","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-04-21","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-04-24","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-04-29","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-05-18","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-06-10","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-06-10","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-06-10","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":45,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-10-21","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-10-21","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-10-23","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-11-05","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-11-27","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-11-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-01-01","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-01-07","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-01-08","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-01-29","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-01-29","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-02-07","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":46,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-06-02","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-06-03","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":12}}},{"date":"2021-06-03","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-06-11","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-07-03","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-07-08","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-07-08","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-07-11","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-02-05","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":12}}},{"date":"2022-02-06","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2022-03-04","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-03-04","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2022-03-20","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":47,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-11-27","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-11-27","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-11-28","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-11-28","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-12-08","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-12-08","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-01-03","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-03-14","etapeTypeId":"edm","etapeStatutId":"def"},{"date":"2021-03-18","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2021-04-25","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-04-27","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":48,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-02-05","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-02-19","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":9}}},{"date":"2021-02-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-02-19","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-02-26","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-03-08","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-03-13","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-03-14","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-04-26","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-07-21","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":9}}},{"date":"2021-09-18","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2021-09-18","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-09-18","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2021-10-08","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":49,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-02-16","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-02-17","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-02-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-02-25","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-03-26","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-03-26","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-04-17","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-04-17","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-05-27","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-05-27","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-06-19","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":50,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-03-12","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-03-20","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":9}}},{"date":"2020-03-22","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-03-28","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-03-28","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-04-23","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-04-23","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-04-23","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-04-23","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-05-14","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":9}}},{"date":"2020-07-27","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-08-01","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-08-23","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-08-24","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-08-24","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-08-28","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":51,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-07-13","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":11}}},{"date":"2020-08-02","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-10-14","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-10-15","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-10-17","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-11-06","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-11-06","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-11-12","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":11}}},{"date":"2020-12-11","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-12-17","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2020-12-18","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-01-08","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-01-08","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-01-16","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-01-27","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-01-27","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-02-27","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":52,"demarcheStatutId":"cls","demarchePublique":true,"etapes":[{"date":"2018-09-01","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2019-12-31","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2020-01-01","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-01-01","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-01-08","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-02-25","etapeTypeId":"mod","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2020-03-27","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-03-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-05-04","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-05-04","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-05-04","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-05-07","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-05-12","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-07-10","etapeTypeId":"css","etapeStatutId":"fai"}]},{"id":53,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-04-19","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":3}}},{"date":"2020-05-27","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-06-02","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-06-06","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-17","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-06-20","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-06-20","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-06-22","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-08-11","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":3}}},{"date":"2020-09-28","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2020-09-28","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2020-10-27","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-11-01","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2020-11-15","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":54,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-04-16","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-04-18","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-04-21","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-05-16","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-06-02","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-06-02","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-06-06","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-06-06","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2020-07-25","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-08-05","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2020-08-05","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":55,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-07-17","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-07-25","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-07-29","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-08-01","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-08-12","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-08-12","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-09-13","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-09-25","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2020-10-02","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2020-10-29","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-11-08","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2020-11-12","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":56,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-07-19","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":1}}},{"date":"2021-07-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-07-20","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-07-20","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-07-20","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-07-21","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-09-08","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-09-08","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-12-05","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":1}}},{"date":"2021-12-12","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2022-02-03","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-02-03","etapeTypeId":"aca","etapeStatutId":"ajo"},{"date":"2022-02-15","etapeTypeId":"mna","etapeStatutId":"fai"},{"date":"2022-03-08","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-03-08","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-03-23","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2022-04-18","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2022-04-18","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2022-04-18","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":57,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2019-10-23","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2019-10-23","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2019-11-15","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2019-11-22","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2019-11-27","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2019-11-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-04-16","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-04-16","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2020-05-22","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-05-22","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2020-05-27","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":58,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-09-25","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-09-28","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-09-28","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-10-08","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-10-18","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-10-18","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-11-06","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-11-07","etapeTypeId":"aof","etapeStatutId":"fre"},{"date":"2020-11-15","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-11-20","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-12-17","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":59,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-05-09","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-05-23","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-05-23","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-05-23","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-05-26","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-05-26","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-06-03","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-06-17","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-08-29","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-08-30","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-08-30","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-09-18","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":60,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-06-13","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-06-14","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-14","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-06-27","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-07-15","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-07-15","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-07-15","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-07-15","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2020-08-01","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-08-10","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2020-08-16","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":61,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-11-12","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-11-17","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-11-30","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-12-01","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-12-04","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-12-04","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-12-22","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-01-06","etapeTypeId":"edm","etapeStatutId":"def"},{"date":"2021-01-11","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2021-01-27","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-02-04","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-03-11","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":62,"demarcheStatutId":"cls","demarchePublique":true,"etapes":[{"date":"2020-06-04","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-06-13","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":10}}},{"date":"2020-06-14","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-06-17","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-21","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-07-04","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":10}}},{"date":"2020-07-05","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-07-05","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-07-15","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-07-15","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-08-09","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-08-14","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-08-21","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-10-14","etapeTypeId":"css","etapeStatutId":"fai"}]},{"id":63,"demarcheStatutId":"cls","demarchePublique":true,"etapes":[{"date":"2020-06-14","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-07-14","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":10}}},{"date":"2020-11-17","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":10}}},{"date":"2020-11-17","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-11-18","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-11-18","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-11-29","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-11-29","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-12-07","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-12-14","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2020-12-19","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-01-04","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-01-04","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-01-13","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-02-22","etapeTypeId":"css","etapeStatutId":"fai"}]},{"id":64,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-03-02","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-03-10","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":7}}},{"date":"2020-03-13","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-03-18","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-03-18","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-04-13","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-04-13","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-04-13","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-04-13","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-05-12","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":7}}},{"date":"2020-07-17","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-07-22","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-08-13","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-08-14","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-08-14","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-08-18","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":65,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-04-11","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-04-14","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-04-28","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-04-28","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-05-11","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-05-11","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-05-11","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-05-11","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2020-08-14","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-08-19","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2020-08-26","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":66,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2019-10-20","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":10}}},{"date":"2019-11-20","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2019-11-24","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2019-11-25","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2019-12-08","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2019-12-11","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2019-12-12","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":10}}},{"date":"2019-12-15","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-01-12","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-03-03","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2020-03-08","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2020-03-09","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-03-10","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2020-03-19","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":67,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-11-23","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":12}}},{"date":"2020-11-30","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-12-02","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-12-24","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-02-01","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-02-09","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-02-09","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-02-09","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-03-07","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-03-28","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2021-04-06","etapeTypeId":"rcb","etapeStatutId":"fai","contenu":{"arm":{"franchissements":12}}},{"date":"2021-07-28","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":12}}},{"date":"2021-09-27","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2021-09-27","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-09-27","etapeTypeId":"aca","etapeStatutId":"ajo"},{"date":"2021-10-16","etapeTypeId":"mna","etapeStatutId":"fai"},{"date":"2021-12-15","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-12-15","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":68,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-08-18","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-09-08","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":9}}},{"date":"2020-09-08","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-09-21","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-10-24","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-11-22","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-11-22","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-11-28","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-01-03","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-03-29","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2021-05-03","etapeTypeId":"rcb","etapeStatutId":"fai","contenu":{"arm":{"franchissements":9}}},{"date":"2021-05-10","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-05-11","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":9}}},{"date":"2021-05-17","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-05-17","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-08-22","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-08-22","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-08-22","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-08-22","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2021-12-22","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":69,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-02-12","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-03-13","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-03-13","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-03-13","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-03-19","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-03-19","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-03-20","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-04-20","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-04-24","etapeTypeId":"aof","etapeStatutId":"fre"},{"date":"2021-04-27","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-05-02","etapeTypeId":"aca","etapeStatutId":"ajo"},{"date":"2021-05-21","etapeTypeId":"mna","etapeStatutId":"fai"},{"date":"2021-09-11","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-09-11","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-09-28","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-09-28","etapeTypeId":"mns","etapeStatutId":"fai"},{"date":"2021-12-30","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2021-12-31","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":70,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2020-07-11","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-07-17","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":9}}},{"date":"2020-07-18","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-07-27","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-07-31","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-08-02","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":9}}},{"date":"2020-09-11","etapeTypeId":"des","etapeStatutId":"fai"},{"date":"2020-11-08","etapeTypeId":"vfd","etapeStatutId":"fai"}]},{"id":71,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-10-06","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-10-06","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-10-08","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-10-22","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-11-12","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-11-12","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-11-17","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-12-23","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2020-12-24","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-01-14","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-01-14","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-01-23","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":72,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-07-10","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":9}}},{"date":"2021-07-10","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-07-10","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-07-10","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-07-10","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-07-15","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-07-15","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-07-17","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-08-31","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":9}}},{"date":"2021-10-02","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-10-09","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-10-09","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-10-16","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-11-09","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-11-09","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-11-16","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2022-03-31","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2022-03-31","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":73,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-12-03","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":14}}},{"date":"2020-12-03","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-12-08","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-12-14","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-12-14","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-12-31","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2021-01-04","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-01-05","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-01-27","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-01-27","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-02-19","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":14}}},{"date":"2021-03-23","etapeTypeId":"aof","etapeStatutId":"fre"},{"date":"2021-04-02","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-04-09","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-04-14","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-06-02","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-06-02","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-06-02","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2021-10-05","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":74,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2021-10-26","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-10-27","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-10-30","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2021-10-30","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-11-02","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-11-21","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-11-21","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-11-21","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-03-16","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":75,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-10-07","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-10-12","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-10-14","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":4}}},{"date":"2021-10-14","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-10-19","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-10-22","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-10-22","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-10-22","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-11-29","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":4}}},{"date":"2021-12-06","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2022-01-28","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-01-28","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-02-22","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2022-02-22","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2022-03-11","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2022-03-11","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2022-06-15","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":76,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2021-12-18","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-12-18","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-12-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-12-19","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-12-25","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-12-25","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-01-08","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-03-28","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":77,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-08-13","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":4}}},{"date":"2021-08-13","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-08-14","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-08-14","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-08-14","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-08-14","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-08-14","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-08-14","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-09-27","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2021-12-29","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":4}}},{"date":"2022-04-30","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2022-05-07","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-06-04","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2022-07-04","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":78,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2021-08-02","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-08-23","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-09-01","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":10}}},{"date":"2021-09-01","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-09-01","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-09-02","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-09-06","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-09-07","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-03-03","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":79,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-09-25","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-10-02","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":7}}},{"date":"2021-10-02","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-10-02","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-10-02","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-10-28","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":7}}},{"date":"2021-12-01","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-12-01","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-12-01","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-12-16","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-12-17","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-12-17","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-12-29","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2022-01-14","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2022-01-28","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2022-01-28","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":80,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-10-20","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-11-05","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-11-10","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":13}}},{"date":"2021-11-10","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-11-18","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-11-26","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-11-26","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-11-27","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-12-10","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2022-01-25","etapeTypeId":"rcb","etapeStatutId":"fai","contenu":{"arm":{"franchissements":13}}},{"date":"2022-01-28","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":14}}},{"date":"2022-02-04","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2022-02-12","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-02-12","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-03-09","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2022-03-09","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2022-03-31","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2022-03-31","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":81,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-11-27","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-12-05","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2021-12-05","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-12-05","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-12-12","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-12-14","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":9}}},{"date":"2021-12-21","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-12-21","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-01-04","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-02-01","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2022-02-09","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-02-09","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":82,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-08-24","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-11-26","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-10-30","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2021-10-30","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-10-31","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-11-21","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":8}}},{"date":"2021-11-28","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-11-28","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-11-28","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-12-11","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-12-12","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-12-12","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-12-24","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2022-01-10","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2022-01-27","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2022-01-27","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2022-08-12","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":83,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2021-12-16","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-12-21","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2021-12-21","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-12-22","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-01-10","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-01-17","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-01-17","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-01-17","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-05-08","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":84,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-09-09","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-09-09","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-09-10","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-09-10","etapeTypeId":"mcp","etapeStatutId":"inc"},{"date":"2021-09-10","etapeTypeId":"mcm","etapeStatutId":"fai"},{"date":"2021-09-17","etapeTypeId":"rcm","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-09-17","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-09-28","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-09-28","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-09-28","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-11-29","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2022-01-21","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-01-21","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-02-03","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":85,"demarcheStatutId":"cls","demarchePublique":true,"etapes":[{"date":"2020-05-23","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-08-15","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2020-08-16","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-08-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-08-28","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-09-12","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-09-12","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-09-30","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-10-16","etapeTypeId":"aof","etapeStatutId":"fre"},{"date":"2020-11-07","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-11-12","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-12-10","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-02-24","etapeTypeId":"css","etapeStatutId":"fai"}]},{"id":86,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-07-13","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-07-21","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":5}}},{"date":"2021-07-21","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-07-22","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-07-22","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-07-26","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-07-26","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-07-26","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-11-29","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":5}}},{"date":"2022-02-02","etapeTypeId":"aof","etapeStatutId":"fre"},{"date":"2022-02-10","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-02-10","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-03-07","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2022-03-07","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2022-03-30","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2022-03-30","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":87,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-05-15","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{}}},{"date":"2021-05-15","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-05-22","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-05-22","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-05-29","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-05-29","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-06-02","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-06-20","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-06-30","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-06-30","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-07-18","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":88,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-05-20","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{}}},{"date":"2021-05-22","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-05-27","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-05-27","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-06-03","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-06-03","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-06-07","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-06-25","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-07-05","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-07-05","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-07-23","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":89,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-05-25","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{}}},{"date":"2021-05-25","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-06-01","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-06-01","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-06-08","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-06-08","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-06-12","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-06-30","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-07-10","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-07-10","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-07-28","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":90,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-06-30","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-08-06","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-01-29","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":5}}},{"date":"2021-01-29","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-01-29","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-02-10","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-02-10","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-02-16","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2021-02-17","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-04-02","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-05-20","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":5}}},{"date":"2021-08-24","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2021-08-24","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-08-24","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2021-09-09","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":91,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-03-10","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-09-19","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-09-20","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":13}}},{"date":"2020-12-22","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-12-22","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-02-12","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-02-12","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-02-12","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-03-01","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-03-06","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-04-16","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":13}}},{"date":"2021-04-16","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-04-16","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-04-26","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-05-11","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-05-11","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-05-20","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":92,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-01-05","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-01-06","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-01-10","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-01-12","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-02-01","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-02-01","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-02-02","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-02-02","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-03-16","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-04-08","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-04-13","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-05-09","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":93,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-07-22","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":7}}},{"date":"2021-07-22","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-07-22","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-07-22","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-07-22","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-07-25","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-07-25","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-07-25","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-09-12","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2021-12-13","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":7}}},{"date":"2022-05-06","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2022-05-13","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-06-10","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2022-07-10","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":94,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-02-08","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-02-25","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":8}}},{"date":"2021-04-11","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-04-11","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-04-22","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-04-25","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-04-25","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-04-30","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-07-26","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":8}}},{"date":"2021-09-24","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2021-09-24","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-09-24","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2021-10-10","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":95,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2019-01-27","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2019-01-27","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":3}}},{"date":"2020-02-19","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":3}}},{"date":"2020-02-25","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-03-08","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-03-08","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-03-17","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-03-18","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-03-31","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-04-08","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2020-05-18","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-05-18","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-05-23","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-06-22","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-06-22","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-07-06","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":96,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2019-12-15","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":7}}},{"date":"2019-12-15","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2019-12-15","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-01-17","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-01-26","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-02-08","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-02-08","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-02-08","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-02-08","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-02-14","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":7}}},{"date":"2020-06-18","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-06-20","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-07-12","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-07-19","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-07-19","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-10-01","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":97,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-07-11","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-07-18","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-07-19","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":11}}},{"date":"2020-07-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-07-19","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-08-08","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":11}}},{"date":"2020-08-26","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-08-26","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-08-26","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-08-26","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-09-13","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-09-18","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-09-25","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-10-03","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-10-03","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-10-15","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":98,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-04-01","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":4}}},{"date":"2021-05-12","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":4}}},{"date":"2021-05-12","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-05-12","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-05-12","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-05-12","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-05-12","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-05-12","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-05-25","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-05-31","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-06-10","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-06-10","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-06-28","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-07-29","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-07-29","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-07-29","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2021-11-23","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":99,"demarcheStatutId":"cls","demarchePublique":true,"etapes":[{"date":"2020-03-02","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-03-17","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2020-03-17","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-03-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-03-20","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-04-02","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-04-02","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-04-02","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-04-15","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2020-06-15","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-06-17","etapeTypeId":"aca","etapeStatutId":"ajo"},{"date":"2020-07-09","etapeTypeId":"mna","etapeStatutId":"fai"},{"date":"2020-12-23","etapeTypeId":"css","etapeStatutId":"fai"}]},{"id":100,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2019-09-01","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":6}}},{"date":"2019-09-01","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2019-09-06","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-02-15","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-02-24","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-03-08","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-03-09","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-03-21","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-03-27","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-05-08","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":6}}},{"date":"2020-05-21","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-05-23","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-06-06","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-06-14","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-06-14","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-07-25","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":101,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-05-21","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-06-05","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":4}}},{"date":"2020-06-05","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-05","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-06-13","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-06-20","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-06-20","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-07-06","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-07-06","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-07-17","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":4}}},{"date":"2020-08-24","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-08-29","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-09-20","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-10-18","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-10-18","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-10-26","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":102,"demarcheStatutId":"cls","demarchePublique":true,"etapes":[{"date":"2020-01-04","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-05-26","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2020-06-27","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-07-09","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-08-13","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-08-27","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-08-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-08-27","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-08-27","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-09-10","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2020-09-13","etapeTypeId":"rcb","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":5}}},{"date":"2020-09-20","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":5}}},{"date":"2020-11-14","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-11-14","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-11-27","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-02-06","etapeTypeId":"css","etapeStatutId":"fai"}]},{"id":103,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-01-03","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":10}}},{"date":"2020-01-16","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-01-22","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-02-03","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-02-03","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-02-13","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-02-13","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-02-17","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":10}}},{"date":"2020-04-02","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-04-02","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2020-04-13","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-04-15","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2020-04-20","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":104,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2020-06-14","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-06-15","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-06-15","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-20","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-06-28","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-07-07","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":105,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-06-26","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-06-29","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-06-30","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-07-05","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-07-21","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-07-21","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-07-21","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-07-21","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-08-07","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-08-16","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-08-23","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":106,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-05-12","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-05-14","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{}}},{"date":"2021-05-14","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-05-22","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-05-28","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-05-28","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-06-01","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-06-19","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-06-29","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-06-29","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-07-17","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":107,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-05-20","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-05-22","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{}}},{"date":"2021-05-22","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-05-30","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-06-05","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-06-05","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-06-09","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-06-27","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-07-07","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-07-07","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-07-25","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":108,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2021-06-07","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-11-22","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-01-23","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":2}}},{"date":"2022-02-08","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-02-08","etapeTypeId":"mcp","etapeStatutId":"inc"},{"date":"2022-02-08","etapeTypeId":"mcm","etapeStatutId":"fai"},{"date":"2022-02-17","etapeTypeId":"des","etapeStatutId":"fai"},{"date":"2022-02-21","etapeTypeId":"vfd","etapeStatutId":"fai"}]},{"id":109,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-08-10","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-03-02","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2022-03-02","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-03-02","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-03-04","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-03-04","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-03-04","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-04-13","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2022-04-20","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-05-18","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2022-06-17","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":110,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-08-22","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-03-05","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2022-03-05","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-03-13","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-03-15","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-03-15","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-03-15","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-04-25","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2022-05-02","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-05-30","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2022-06-29","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":111,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2022-03-12","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-03-19","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-03-26","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":8}}},{"date":"2022-03-26","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-03-27","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-03-28","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-03-28","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-03-29","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-04-16","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":8}}},{"date":"2022-07-08","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2022-07-17","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-07-17","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":112,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-02-22","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2022-02-22","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-02-22","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-03-05","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-03-06","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-03-06","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-03-07","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-05-01","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2022-05-08","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-06-05","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-07-09","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":113,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-02-23","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-02-26","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2022-02-26","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-03-06","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-03-08","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-03-08","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-03-08","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-05-02","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2022-05-09","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-06-06","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-07-10","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":114,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2021-08-16","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-03-15","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2022-03-15","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-03-24","etapeTypeId":"mcp","etapeStatutId":"inc"},{"date":"2022-03-24","etapeTypeId":"mcm","etapeStatutId":"fai"},{"date":"2022-04-27","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":115,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2022-09-15","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-09-24","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2022-09-24","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-09-24","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-09-24","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-09-24","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-09-27","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-10-19","etapeTypeId":"aof","etapeStatutId":"fre"},{"date":"2022-11-16","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-11-16","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2023-01-24","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":116,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2022-06-19","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-06-25","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-08-16","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":18}}},{"date":"2022-08-16","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-08-23","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-09-14","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-09-14","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-09-14","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2023-01-09","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":18}}},{"date":"2023-01-22","etapeTypeId":"ede","etapeStatutId":"def"},{"date":"2023-01-23","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2023-01-30","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2023-02-01","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":117,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-05-02","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-06-01","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-08-10","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":8}}},{"date":"2022-08-10","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-08-10","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-09-14","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-09-14","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-09-14","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-12-07","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":8}}},{"date":"2022-12-26","etapeTypeId":"aof","etapeStatutId":"fre"},{"date":"2023-01-02","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2023-01-02","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2023-01-14","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2023-02-04","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2023-02-04","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2023-02-18","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":118,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-06-10","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-06-23","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-06-11","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":4}}},{"date":"2022-06-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-06-20","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-09-11","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-09-11","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-09-11","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-11-27","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":4}}},{"date":"2022-12-23","etapeTypeId":"aof","etapeStatutId":"fre"},{"date":"2022-12-30","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-12-30","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2023-01-11","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2023-03-22","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2023-03-22","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2023-03-23","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":119,"demarcheStatutId":"ins","demarchePublique":false,"etapes":[{"date":"2022-05-21","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-07-09","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-09-26","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":9}}},{"date":"2022-09-26","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-09-26","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-10-03","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-10-03","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-10-06","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-10-09","etapeTypeId":"edm","etapeStatutId":"fav"}]},{"id":120,"demarcheStatutId":"ins","demarchePublique":false,"etapes":[{"date":"2022-05-18","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-06-24","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-09-11","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":4}}},{"date":"2022-09-14","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-09-14","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-09-18","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-09-18","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-09-21","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-09-24","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2023-01-26","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":4}}}]},{"id":121,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-06-26","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-07-01","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-07-05","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":8}}},{"date":"2022-07-05","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-07-06","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-09-21","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-09-21","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-09-21","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-12-07","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":8}}},{"date":"2023-01-02","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2023-01-09","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2023-01-09","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2023-01-21","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2023-02-11","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2023-02-11","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2023-02-11","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":122,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-04-13","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-04-17","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-05-09","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":14}}},{"date":"2022-05-09","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-05-22","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-05-25","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-05-25","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-05-29","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-06-06","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":14}}},{"date":"2022-10-09","etapeTypeId":"aof","etapeStatutId":"fre"},{"date":"2022-10-18","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-10-18","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-10-22","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2022-11-01","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2023-01-21","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2023-01-21","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":123,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2022-03-16","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-03-26","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-03-28","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":3}}},{"date":"2022-03-28","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-03-28","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-03-28","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-03-28","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-03-29","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-07-04","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2022-12-08","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":3}}},{"date":"2023-01-03","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2023-01-10","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2023-01-10","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":124,"demarcheStatutId":"ins","demarchePublique":false,"etapes":[{"date":"2023-01-07","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2023-01-11","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2023-01-11","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2023-01-14","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2023-01-14","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2023-01-19","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2023-01-19","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2023-01-24","etapeTypeId":"edm","etapeStatutId":"fav"}]},{"id":125,"demarcheStatutId":"ins","demarchePublique":false,"etapes":[{"date":"2023-01-17","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2023-01-27","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2023-01-27","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2023-01-27","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2023-01-31","etapeTypeId":"vfd","etapeStatutId":"fai"}]},{"id":126,"demarcheStatutId":"ins","demarchePublique":false,"etapes":[{"date":"2023-02-20","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2023-02-20","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false,"franchissements":0}}},{"date":"2023-02-20","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2023-02-21","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2023-02-21","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2023-02-21","etapeTypeId":"mcr","etapeStatutId":"fav"}]},{"id":127,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-12-15","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-12-25","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2022-12-25","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2023-01-10","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2023-01-19","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2023-01-19","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2023-01-22","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2023-01-22","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2023-01-24","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2023-01-31","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2023-02-05","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2023-02-05","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":128,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-12-23","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2023-01-13","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2023-01-13","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2023-01-28","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2023-02-11","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2023-02-11","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2023-02-14","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2023-02-14","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2023-02-16","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2023-02-23","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2023-02-28","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2023-02-28","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":129,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2022-10-25","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-10-25","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":8}}},{"date":"2022-10-25","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-11-02","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-11-02","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-11-04","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-11-04","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-11-07","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2023-01-16","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2023-02-27","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":8}}},{"date":"2023-03-07","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2023-03-16","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2023-03-16","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":130,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2019-09-24","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":0}}},{"date":"2019-10-18","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2019-11-19","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2019-11-30","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2019-12-20","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2019-12-31","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2019-12-31","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-02-02","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-03-22","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2020-03-22","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-03-29","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-03-29","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-04-07","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-05-03","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-05-03","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-05-16","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":131,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2022-04-03","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2022-04-03","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-06-17","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":132,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2018-07-15","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-02-06","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2020-02-12","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-02-12","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-02-24","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-03-03","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2020-03-04","etapeTypeId":"rcb","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":0}}},{"date":"2020-03-04","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-03-04","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-04-04","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-04-04","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-05-05","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-05-05","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-06-09","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-06-16","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-06-16","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-06-23","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":133,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-06-03","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-06-07","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-06-07","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-06-07","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-06-27","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-06-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-07-03","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-09-13","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-11-20","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-11-21","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-11-21","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-12-03","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":134,"demarcheStatutId":"ins","demarchePublique":false,"etapes":[{"date":"2022-04-20","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-04-21","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-04-22","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":3}}},{"date":"2022-06-18","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-06-23","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-10-02","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-10-02","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-10-02","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-10-13","etapeTypeId":"aof","etapeStatutId":"fav"}]},{"id":135,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-10-10","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-10-21","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-10-28","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":9}}},{"date":"2021-10-28","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-10-31","etapeTypeId":"mcp","etapeStatutId":"inc"},{"date":"2021-10-31","etapeTypeId":"mcm","etapeStatutId":"fai"},{"date":"2021-11-12","etapeTypeId":"rcm","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":9}}},{"date":"2021-11-12","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-11-14","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-11-17","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-11-17","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-11-25","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-12-04","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2022-01-16","etapeTypeId":"rcb","etapeStatutId":"fai","contenu":{"arm":{"franchissements":9}}},{"date":"2023-01-13","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":9}}},{"date":"2023-01-26","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2023-02-03","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2023-02-05","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":136,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-03-17","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2022-03-17","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-03-17","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-04-06","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-04-12","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-04-12","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-04-20","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-06-20","etapeTypeId":"aof","etapeStatutId":"fre"},{"date":"2022-06-29","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-06-29","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-07-20","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":137,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-04-06","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-05-17","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2022-05-17","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-05-25","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-05-31","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-05-31","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-06-01","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-06-28","etapeTypeId":"aof","etapeStatutId":"fre"},{"date":"2022-07-07","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-07-07","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-07-28","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2022-07-28","etapeTypeId":"mns","etapeStatutId":"fai"},{"date":"2022-10-15","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":138,"demarcheStatutId":"ins","demarchePublique":false,"etapes":[{"date":"2023-04-05","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2023-04-05","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":139,"demarcheStatutId":"ins","demarchePublique":false,"etapes":[{"date":"2023-03-19","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2023-04-01","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2023-04-01","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2023-04-01","etapeTypeId":"mcp","etapeStatutId":"com"}]},{"id":140,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-03-06","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-03-31","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-06-02","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2022-06-06","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-06-07","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-08-29","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-08-29","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-08-29","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-11-14","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":3}}},{"date":"2022-12-10","etapeTypeId":"aof","etapeStatutId":"fre"},{"date":"2022-12-17","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-12-17","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-12-29","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2023-02-02","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2023-02-02","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2023-02-02","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":141,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2022-04-10","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-12-12","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-12-12","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":3}}},{"date":"2022-12-12","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-12-13","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-12-14","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-12-14","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-12-14","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2023-01-14","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2023-02-25","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":3}}},{"date":"2023-03-05","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2023-03-14","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2023-03-14","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":142,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-06-14","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-06-25","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-07-03","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":8}}},{"date":"2022-07-03","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-07-04","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-09-21","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-09-21","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-09-21","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-12-07","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":8}}},{"date":"2023-01-02","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2023-01-09","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2023-01-09","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2023-01-21","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2023-02-25","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2023-02-25","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2023-02-25","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":143,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-04-17","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-04-24","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-04-26","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":12}}},{"date":"2022-04-26","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-05-10","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-05-13","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-05-13","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-06-13","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-06-27","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2022-12-01","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":12}}},{"date":"2022-12-27","etapeTypeId":"aof","etapeStatutId":"fre"},{"date":"2023-01-03","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2023-01-03","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2023-01-15","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2023-02-05","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2023-02-05","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2023-02-05","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":144,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-09-18","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-11-04","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-05-15","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":6}}},{"date":"2022-05-15","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-05-30","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-07-23","etapeTypeId":"mod","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":6}}},{"date":"2022-09-28","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-09-28","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-09-28","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2022-12-14","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":6}}},{"date":"2023-01-09","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2023-01-16","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2023-01-16","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2023-02-15","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2023-02-15","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2023-02-15","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2023-02-15","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":145,"demarcheStatutId":"ins","demarchePublique":false,"etapes":[{"date":"2022-01-20","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2023-02-27","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2023-02-27","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2023-03-09","etapeTypeId":"mcp","etapeStatutId":"com"}]},{"id":146,"demarcheStatutId":"ins","demarchePublique":true,"etapes":[{"date":"2021-10-06","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":5}}},{"date":"2021-10-06","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-10-07","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-10-07","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-10-07","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-10-13","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-10-13","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-10-13","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-11-25","etapeTypeId":"edm","etapeStatutId":"def"},{"date":"2022-03-17","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":5}}},{"date":"2022-09-29","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2022-10-07","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-10-08","etapeTypeId":"aca","etapeStatutId":"ajo"}]},{"id":147,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-06-04","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-06-04","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-04","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-06-10","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-07-25","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-07-25","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-07-26","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-08-22","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-08-23","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-08-28","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-09-04","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":148,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-05-01","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-05-06","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-05-06","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-05-18","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-08-05","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-08-05","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-08-06","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-08-06","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-08-07","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-08-12","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-08-19","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-08-19","etapeTypeId":"mns","etapeStatutId":"fai"}]},{"id":149,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-05-21","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-05-21","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-05-23","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-06-02","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-06-23","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-06-23","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-07-09","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-07-09","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-08-27","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-09-01","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-09-08","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]}] \ No newline at end of file +[{"id":0,"demarcheStatutId":"ins","demarchePublique":true,"etapes":[{"date":"2022-11-13","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-11-22","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-11-29","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":8}}},{"date":"2022-11-29","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-12-01","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-12-19","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-12-19","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2023-02-03","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":8}}},{"date":"2023-03-10","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2023-03-19","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2023-03-19","etapeTypeId":"aca","etapeStatutId":"fav"}]},{"id":1,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2022-09-15","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-09-27","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2022-09-27","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-09-27","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-09-28","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-09-28","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-10-19","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-11-16","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-11-16","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2023-01-24","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":2,"demarcheStatutId":"ins","demarchePublique":true,"etapes":[{"date":"2022-09-01","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-09-23","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-10-14","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":12}}},{"date":"2022-10-14","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-11-04","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-11-10","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-11-10","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-12-04","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":12}}},{"date":"2022-12-10","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-12-17","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-12-17","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-12-29","etapeTypeId":"mnb","etapeStatutId":"fai"}]},{"id":3,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-11-02","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-11-03","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2021-11-03","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-11-13","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-11-13","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-11-19","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-11-19","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-11-24","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":5}}},{"date":"2022-01-28","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-02-05","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-02-05","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-03-02","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2022-03-02","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2022-03-02","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2022-03-05","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2022-07-06","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":4,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-01-15","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-02-17","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-02-18","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":3}}},{"date":"2022-02-18","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-03-04","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-03-04","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-03-04","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-03-10","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":3}}},{"date":"2022-04-30","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-05-07","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-06-04","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-07-04","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2022-08-05","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2022-08-05","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2022-09-22","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":5,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2022-03-31","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2022-03-31","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-06-15","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":6,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-07-12","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-08-12","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-08-13","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2020-08-16","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-08-20","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-09-02","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-09-02","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-10-02","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2020-11-14","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-11-20","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-11-20","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-12-03","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-01-20","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-01-20","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-02-07","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":7,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-03-03","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-03-05","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-03-23","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":13}}},{"date":"2020-04-13","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-04-21","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-04-27","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-04-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-06-01","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":13}}},{"date":"2020-08-27","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-08-28","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-09-02","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-09-09","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-09-15","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-09-15","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-09-18","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":8,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-06-02","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-06-19","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":9}}},{"date":"2020-06-20","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-06-27","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-27","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-07-10","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":9}}},{"date":"2020-07-11","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-07-11","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-07-21","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-08-15","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-08-20","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-08-27","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-10-17","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-10-17","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-11-26","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":9,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-10-08","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-10-08","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-10-10","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-10-23","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-11-14","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-11-14","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-12-25","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2020-12-26","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-01-16","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-01-24","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-01-25","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":10,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-07-10","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":6}}},{"date":"2021-07-10","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-07-11","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-07-11","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-07-11","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-07-18","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-07-18","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-11-22","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2021-12-10","etapeTypeId":"rcb","etapeStatutId":"fai","contenu":{"arm":{"franchissements":6}}},{"date":"2021-12-17","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":7}}},{"date":"2022-01-17","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-01-25","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-01-25","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":11,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-03-21","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-05-16","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":3}}},{"date":"2020-05-20","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-05-20","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-05-27","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-06-09","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-06-09","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-06-18","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-07-10","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":3}}},{"date":"2020-08-01","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-08-16","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-09-17","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-09-25","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-09-25","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-09-30","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":12,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-06-19","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-06-28","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":11}}},{"date":"2020-06-28","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-07-09","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-07-09","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-07-23","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":11}}},{"date":"2020-07-25","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-07-28","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-07-30","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-08-24","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-08-29","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-09-05","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-09-20","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-09-20","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-09-25","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":13,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-06-14","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-01-24","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-02-24","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":8}}},{"date":"2021-02-27","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-03-08","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-03-14","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-03-14","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-04-13","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-04-18","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-04-24","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":8}}},{"date":"2021-04-26","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-04-26","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-05-15","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-06-08","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-06-08","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-06-09","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":14,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-07-23","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2020-08-08","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-08-29","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-09-03","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-09-03","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-10-14","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2020-10-17","etapeTypeId":"rcb","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":4}}},{"date":"2020-10-24","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-10-24","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-10-24","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":4}}},{"date":"2020-10-24","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-12-18","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-12-18","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-12-31","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-01-19","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-01-19","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-02-07","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":15,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-01-02","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":7}}},{"date":"2020-01-26","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-01-26","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-01-27","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-01-31","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-02-13","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-02-13","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-02-21","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-04-27","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":7}}},{"date":"2020-05-18","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-05-20","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-06-11","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-08-06","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-08-06","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-08-28","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":16,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-07-20","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-08-13","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":8}}},{"date":"2020-08-13","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-10-12","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-10-17","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-10-18","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-10-18","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-10-18","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-10-26","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":8}}},{"date":"2020-12-20","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-12-20","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-01-02","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-03-05","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-03-05","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-04-03","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":17,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-04-02","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-05-03","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":7}}},{"date":"2020-05-07","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-05-14","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-05-17","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-05-27","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-05-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-06-05","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-06-11","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":7}}},{"date":"2020-07-19","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-07-24","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-09-04","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-09-12","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-09-12","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-09-17","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":18,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-06-04","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-06-17","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-06-25","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2020-06-25","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-29","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-07-24","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-07-24","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-09-30","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-02-01","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":14}}},{"date":"2021-04-07","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-04-07","etapeTypeId":"aca","etapeStatutId":"ajo"},{"date":"2021-04-13","etapeTypeId":"mna","etapeStatutId":"fai"},{"date":"2021-12-02","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-12-02","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":19,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2019-10-31","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2019-11-05","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-03-08","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-03-12","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-03-18","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-03-19","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-04-05","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-05-31","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-06-02","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2020-06-24","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":20,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2019-11-19","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2019-12-03","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2019-12-06","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2019-12-14","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2019-12-18","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2019-12-18","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-03-26","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2020-03-31","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-04-01","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-04-02","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2020-04-11","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":21,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-04-30","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-04-30","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-04-30","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-05-15","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-05-16","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-05-16","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-08-31","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-09-01","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-09-06","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-09-13","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":22,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2019-09-18","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2019-10-02","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-02-24","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-02-24","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-03-26","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-03-26","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-03-26","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-04-07","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-05-06","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-05-29","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-05-29","etapeTypeId":"mns","etapeStatutId":"fai"}]},{"id":23,"demarcheStatutId":"cls","demarchePublique":true,"etapes":[{"date":"2020-09-10","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-09-10","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-09-11","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-09-24","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-09-28","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-09-28","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-10-14","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-12-16","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-12-16","etapeTypeId":"aca","etapeStatutId":"ajo"},{"date":"2020-12-29","etapeTypeId":"mna","etapeStatutId":"fai"},{"date":"2021-03-03","etapeTypeId":"css","etapeStatutId":"fai"}]},{"id":24,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-09-10","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-09-11","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false,"franchissements":0}}},{"date":"2020-09-11","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-10-02","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-10-05","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-10-26","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-12-07","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-12-13","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-12-13","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2020-12-26","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":25,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-09-06","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false,"franchissements":0}}},{"date":"2020-09-06","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-09-07","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-10-11","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-10-14","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-10-14","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-12-02","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-12-08","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-12-08","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2020-12-21","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":26,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-05-19","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-05-29","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-05-29","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-05-29","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-06-03","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-06-03","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-07-11","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-09-22","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-09-23","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-09-23","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-10-14","etapeTypeId":"sco","etapeStatutId":"fai"}]},{"id":27,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-11-03","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false,"franchissements":0}}},{"date":"2020-11-03","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-11-03","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-11-04","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-11-13","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-11-13","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-02-18","etapeTypeId":"edm","etapeStatutId":"def"},{"date":"2021-02-18","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-04-01","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-04-03","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":28,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-06-19","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-06-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-06-19","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-06-19","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-06-27","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-06-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-07-19","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-09-30","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-10-01","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-10-01","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-10-22","etapeTypeId":"sco","etapeStatutId":"fai"}]},{"id":29,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2019-09-18","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":19}}},{"date":"2019-10-06","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2019-11-15","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2019-11-16","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2019-11-22","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2019-11-29","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2019-11-29","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2019-11-29","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":19}}},{"date":"2019-11-29","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-04-29","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-05-08","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-05-13","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-05-17","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-05-17","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-08-12","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":30,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-01-06","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false,"franchissements":0}}},{"date":"2021-01-07","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-01-07","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-01-26","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-02-05","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-02-05","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-02-23","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-04-28","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-05-01","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-05-06","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2021-05-21","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":31,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2019-12-26","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2019-12-30","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":18}}},{"date":"2020-01-07","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-01-14","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-01-23","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2020-02-04","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-02-05","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-02-12","etapeTypeId":"rcb","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":18}}},{"date":"2020-02-27","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":18}}},{"date":"2020-03-19","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-04-02","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-05-12","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-05-12","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-05-17","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-06-16","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-06-16","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-08-19","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":32,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-06-12","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-06-13","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":10}}},{"date":"2021-06-13","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-06-19","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-06-19","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-06-25","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-06-25","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-07-05","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-09-16","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":17}}},{"date":"2021-10-18","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-10-25","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-10-25","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-11-01","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-12-02","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-12-02","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-12-02","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2022-04-16","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2022-04-16","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":33,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2020-05-14","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":10}}},{"date":"2020-05-14","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-06-19","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":10}}},{"date":"2020-06-20","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-07-17","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-07-17","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-08-14","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":34,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-06-14","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-06-21","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":12}}},{"date":"2021-06-21","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-06-21","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-06-22","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-06-27","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-06-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-07-07","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-09-21","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":17}}},{"date":"2021-10-20","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-10-27","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-10-27","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-11-03","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-11-21","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-11-21","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-12-04","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2022-04-18","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2022-04-18","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":35,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2019-11-04","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2019-11-05","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2019-11-05","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2019-11-18","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2019-11-28","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2019-11-28","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2019-11-30","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-05-13","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-05-27","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-06-10","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":36,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-01-06","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false,"franchissements":0}}},{"date":"2021-01-07","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-01-11","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-01-29","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-02-12","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-02-12","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-03-01","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-04-09","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-04-14","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-04-14","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-05-10","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-05-10","etapeTypeId":"mns","etapeStatutId":"fai"}]},{"id":37,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-08-15","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-12-28","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-01-08","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":0}}},{"date":"2021-01-09","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-01-24","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-01-26","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-01-29","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-02-26","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-03-06","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-04-06","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-04-11","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-04-16","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-05-08","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-05-08","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-05-08","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":38,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-11-18","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-11-18","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-11-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-11-19","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-01-13","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-01-14","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-03-06","etapeTypeId":"edm","etapeStatutId":"def"},{"date":"2021-03-09","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-04-18","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-04-18","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":39,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-06-17","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-06-17","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-06-17","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-06-17","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-06-25","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-06-25","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-07-17","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-09-28","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-09-29","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-09-29","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-10-20","etapeTypeId":"sco","etapeStatutId":"fai"}]},{"id":40,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-09-11","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-09-11","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-09-12","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-09-29","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-10-05","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-10-05","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-03-08","etapeTypeId":"edm","etapeStatutId":"def"},{"date":"2021-03-11","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-04-18","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-04-20","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":41,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-12-25","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":5}}},{"date":"2020-12-29","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-01-10","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-01-25","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-01-26","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-01-30","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-01-31","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-02-22","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-02-27","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2021-03-27","etapeTypeId":"rcb","etapeStatutId":"fai","contenu":{"arm":{"franchissements":5}}},{"date":"2021-10-26","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":5}}},{"date":"2021-10-27","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-03-02","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-03-02","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":42,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-12-15","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-12-23","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":5}}},{"date":"2020-12-23","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-01-11","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-01-12","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-02-16","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-02-16","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-03-06","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-03-29","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2021-07-27","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":5}}},{"date":"2021-09-25","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-09-26","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-09-26","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2021-10-12","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":43,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-07-07","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":4}}},{"date":"2021-07-07","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-07-07","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-07-07","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-07-07","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-07-16","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-07-16","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-12-02","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":4}}},{"date":"2022-02-04","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-02-12","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-02-12","etapeTypeId":"aca","etapeStatutId":"ajo"},{"date":"2022-02-25","etapeTypeId":"mna","etapeStatutId":"fai"},{"date":"2022-03-17","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-03-17","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2022-04-01","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":44,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-11-11","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-11-17","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":9}}},{"date":"2020-11-17","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-01-26","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-02-10","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-02-20","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":9}}},{"date":"2021-02-26","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-02-26","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-04-21","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-04-24","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-04-29","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-05-18","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-06-10","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-06-10","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-06-10","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":45,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-10-21","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-10-21","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-10-23","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-11-05","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-11-27","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-11-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-01-07","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-01-08","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-01-29","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-01-29","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-02-07","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":46,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-06-02","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-06-03","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":12}}},{"date":"2021-06-03","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-06-11","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-07-03","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-07-08","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-07-08","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-02-05","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":12}}},{"date":"2022-02-06","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-03-04","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-03-04","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2022-03-20","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":47,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-11-27","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-11-27","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-11-28","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-11-28","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-12-08","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-12-08","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-03-14","etapeTypeId":"edm","etapeStatutId":"def"},{"date":"2021-03-18","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-04-25","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-04-27","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":48,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-02-05","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-02-19","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":9}}},{"date":"2021-02-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-02-19","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-02-26","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-03-08","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-03-13","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-04-26","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-07-21","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":9}}},{"date":"2021-09-18","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-09-18","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-09-18","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2021-10-08","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":49,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-02-16","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-02-17","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-02-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-02-25","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-03-26","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-03-26","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-04-17","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-05-27","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-05-27","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-06-19","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":50,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-03-12","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-03-20","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":9}}},{"date":"2020-03-22","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-03-28","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-03-28","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-04-23","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-04-23","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-04-23","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-05-14","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":9}}},{"date":"2020-07-27","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-08-01","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-08-23","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-08-24","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-08-24","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-08-28","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":51,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-07-13","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":11}}},{"date":"2020-08-02","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-10-14","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-10-15","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-10-17","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-11-06","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-11-06","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-11-12","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":11}}},{"date":"2020-12-17","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2020-12-18","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-01-08","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-01-08","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-01-16","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-01-27","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-01-27","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-02-27","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":52,"demarcheStatutId":"cls","demarchePublique":true,"etapes":[{"date":"2018-09-01","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2019-12-31","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2020-01-01","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-01-01","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-01-08","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-02-25","etapeTypeId":"mod","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2020-03-27","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-03-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-05-04","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-05-04","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-05-07","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-05-12","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-07-10","etapeTypeId":"css","etapeStatutId":"fai"}]},{"id":53,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-04-19","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":3}}},{"date":"2020-05-27","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-06-02","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-06-06","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-17","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-06-20","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-06-20","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-08-11","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":3}}},{"date":"2020-09-28","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2020-09-28","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-10-27","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-11-01","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2020-11-15","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":54,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-04-16","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-04-18","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-04-21","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-05-16","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-06-02","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-06-02","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-06-06","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-07-25","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-08-05","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2020-08-05","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":55,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-07-17","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-07-25","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-07-29","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-08-01","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-08-12","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-08-12","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-09-25","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2020-10-02","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-10-29","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-11-08","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2020-11-12","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":56,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-07-19","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":1}}},{"date":"2021-07-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-07-20","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-07-20","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-07-20","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-07-21","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-09-08","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-12-05","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":1}}},{"date":"2021-12-12","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-02-03","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-02-03","etapeTypeId":"aca","etapeStatutId":"ajo"},{"date":"2022-02-15","etapeTypeId":"mna","etapeStatutId":"fai"},{"date":"2022-03-08","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-03-08","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-03-23","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2022-04-18","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2022-04-18","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2022-04-18","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":57,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2019-10-23","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2019-10-23","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2019-11-15","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2019-11-22","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2019-11-27","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2019-11-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-04-16","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-05-22","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-05-22","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2020-05-27","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":58,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-09-25","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-09-28","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-09-28","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-10-08","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-10-18","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-10-18","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-11-07","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-11-15","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-11-20","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-12-17","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":59,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-05-09","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-05-23","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-05-23","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-05-23","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-05-26","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-05-26","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-06-17","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-08-29","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-08-30","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-08-30","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-09-18","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":60,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-06-13","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-06-14","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-14","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-06-27","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-07-15","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-07-15","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-07-15","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-08-01","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-08-10","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2020-08-16","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":61,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-11-12","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-11-17","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-11-30","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-12-01","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-12-04","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-12-04","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-01-06","etapeTypeId":"edm","etapeStatutId":"def"},{"date":"2021-01-11","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-01-27","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-02-04","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-03-11","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":62,"demarcheStatutId":"cls","demarchePublique":true,"etapes":[{"date":"2020-06-04","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-06-13","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":10}}},{"date":"2020-06-14","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-06-17","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-21","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-07-04","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":10}}},{"date":"2020-07-05","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-07-05","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-07-15","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-08-09","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-08-14","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-08-21","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-10-14","etapeTypeId":"css","etapeStatutId":"fai"}]},{"id":63,"demarcheStatutId":"cls","demarchePublique":true,"etapes":[{"date":"2020-06-14","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-07-14","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":10}}},{"date":"2020-11-17","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":10}}},{"date":"2020-11-17","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-11-18","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-11-18","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-11-29","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-11-29","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-12-14","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2020-12-19","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-01-04","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-01-04","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-01-13","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-02-22","etapeTypeId":"css","etapeStatutId":"fai"}]},{"id":64,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-03-02","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-03-10","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":7}}},{"date":"2020-03-13","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-03-18","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-03-18","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-04-13","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-04-13","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-04-13","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-05-12","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":7}}},{"date":"2020-07-17","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-07-22","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-08-13","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-08-14","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-08-14","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-08-18","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":65,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-04-11","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-04-14","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-04-28","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-04-28","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-05-11","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-05-11","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-05-11","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-08-14","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-08-19","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2020-08-26","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":66,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2019-10-20","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":10}}},{"date":"2019-11-20","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2019-11-24","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2019-11-25","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2019-12-08","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2019-12-11","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2019-12-12","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":10}}},{"date":"2019-12-15","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-03-03","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2020-03-08","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-03-09","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-03-10","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2020-03-19","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":67,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-11-23","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":12}}},{"date":"2020-11-30","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-12-02","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-12-24","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-02-01","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-02-09","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-02-09","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-03-07","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-03-28","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2021-04-06","etapeTypeId":"rcb","etapeStatutId":"fai","contenu":{"arm":{"franchissements":12}}},{"date":"2021-07-28","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":12}}},{"date":"2021-09-27","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-09-27","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-09-27","etapeTypeId":"aca","etapeStatutId":"ajo"},{"date":"2021-10-16","etapeTypeId":"mna","etapeStatutId":"fai"},{"date":"2021-12-15","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-12-15","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":68,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-08-18","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-09-08","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":9}}},{"date":"2020-09-08","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-09-21","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-10-24","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-11-22","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-11-22","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-01-03","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-03-29","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2021-05-03","etapeTypeId":"rcb","etapeStatutId":"fai","contenu":{"arm":{"franchissements":9}}},{"date":"2021-05-10","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-05-11","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":9}}},{"date":"2021-05-17","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-05-17","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-08-22","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-08-22","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-08-22","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-08-22","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2021-12-22","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":69,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-02-12","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-03-13","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-03-13","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-03-13","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-03-19","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-03-19","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-04-20","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-04-24","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-04-27","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-05-02","etapeTypeId":"aca","etapeStatutId":"ajo"},{"date":"2021-05-21","etapeTypeId":"mna","etapeStatutId":"fai"},{"date":"2021-09-11","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-09-11","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-09-28","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-09-28","etapeTypeId":"mns","etapeStatutId":"fai"},{"date":"2021-12-30","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2021-12-31","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":70,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2020-07-11","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-07-17","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":9}}},{"date":"2020-07-18","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-07-27","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-07-31","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-08-02","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":9}}},{"date":"2020-09-11","etapeTypeId":"des","etapeStatutId":"fai"},{"date":"2020-11-08","etapeTypeId":"vfd","etapeStatutId":"fai"}]},{"id":71,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-10-06","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-10-06","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-10-08","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-10-22","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-11-12","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-11-12","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-12-23","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2020-12-24","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-01-14","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-01-14","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-01-23","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":72,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-07-10","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":9}}},{"date":"2021-07-10","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-07-10","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-07-10","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-07-10","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-07-15","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-07-15","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-08-31","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":9}}},{"date":"2021-10-02","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-10-09","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-10-09","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-10-16","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-11-09","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-11-09","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-11-16","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2022-03-31","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2022-03-31","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":73,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-12-03","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":14}}},{"date":"2020-12-03","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-12-08","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-12-14","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-12-14","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-12-31","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2021-01-04","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-01-05","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-01-27","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-02-19","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":14}}},{"date":"2021-03-23","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-04-02","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-04-09","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-04-14","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-06-02","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-06-02","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-06-02","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2021-10-05","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":74,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2021-10-26","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-10-27","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-10-30","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2021-10-30","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-11-02","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-11-21","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-11-21","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-03-16","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":75,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-10-07","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-10-12","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-10-14","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":4}}},{"date":"2021-10-14","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-10-19","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-10-22","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-10-22","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-11-29","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":4}}},{"date":"2021-12-06","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-01-28","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-01-28","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-02-22","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2022-02-22","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2022-03-11","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2022-03-11","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2022-06-15","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":76,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2021-12-18","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-12-18","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-12-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-12-19","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-12-25","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-12-25","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-03-28","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":77,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-08-13","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":4}}},{"date":"2021-08-13","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-08-14","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-08-14","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-08-14","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-08-14","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-08-14","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-09-27","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2021-12-29","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":4}}},{"date":"2022-04-30","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-05-07","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-06-04","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2022-07-04","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":78,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2021-08-02","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-08-23","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-09-01","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":10}}},{"date":"2021-09-01","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-09-01","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-09-02","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-09-06","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-03-03","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":79,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-09-25","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-10-02","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":7}}},{"date":"2021-10-02","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-10-02","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-10-02","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-10-28","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":7}}},{"date":"2021-12-01","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-12-01","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-12-16","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-12-17","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-12-17","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-12-29","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2022-01-14","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2022-01-28","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2022-01-28","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":80,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-10-20","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-11-05","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-11-10","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":13}}},{"date":"2021-11-10","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-11-18","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-11-26","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-11-26","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-12-10","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2022-01-25","etapeTypeId":"rcb","etapeStatutId":"fai","contenu":{"arm":{"franchissements":13}}},{"date":"2022-01-28","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":14}}},{"date":"2022-02-04","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-02-12","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-02-12","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-03-09","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2022-03-09","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2022-03-31","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2022-03-31","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":81,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-11-27","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-12-05","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2021-12-05","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-12-05","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-12-12","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-12-14","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":9}}},{"date":"2021-12-21","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-12-21","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-02-01","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-02-09","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-02-09","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":82,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-08-24","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-11-26","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-10-30","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2021-10-30","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-10-31","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-11-21","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":8}}},{"date":"2021-11-28","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-11-28","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-12-11","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-12-12","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-12-12","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-12-24","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2022-01-10","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2022-01-27","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2022-01-27","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2022-08-12","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":83,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2021-12-16","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-12-21","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2021-12-21","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-12-22","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-01-10","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-01-17","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-01-17","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-05-08","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":84,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-09-09","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-09-09","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-09-10","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-09-10","etapeTypeId":"mcp","etapeStatutId":"inc"},{"date":"2021-09-10","etapeTypeId":"mcm","etapeStatutId":"fai"},{"date":"2021-09-17","etapeTypeId":"rcm","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-09-17","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-09-28","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-09-28","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-11-29","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-01-21","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-01-21","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-02-03","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":85,"demarcheStatutId":"cls","demarchePublique":true,"etapes":[{"date":"2020-05-23","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-08-15","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2020-08-16","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-08-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-08-28","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-09-12","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-09-12","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-10-16","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-11-07","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-11-12","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-12-10","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-02-24","etapeTypeId":"css","etapeStatutId":"fai"}]},{"id":86,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-07-13","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-07-21","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":5}}},{"date":"2021-07-21","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-07-22","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-07-22","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-07-26","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-07-26","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-11-29","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":5}}},{"date":"2022-02-02","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-02-10","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-02-10","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-03-07","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2022-03-07","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2022-03-30","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2022-03-30","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":87,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-05-15","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{}}},{"date":"2021-05-15","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-05-22","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-05-22","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-05-29","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-05-29","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-06-20","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-06-30","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-06-30","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-07-18","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":88,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-05-20","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{}}},{"date":"2021-05-22","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-05-27","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-05-27","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-06-03","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-06-03","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-06-25","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-07-05","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-07-05","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-07-23","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":89,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-05-25","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{}}},{"date":"2021-05-25","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-06-01","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-06-01","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-06-08","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-06-08","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-06-30","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-07-10","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-07-10","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-07-28","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":90,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-06-30","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-08-06","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-01-29","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":5}}},{"date":"2021-01-29","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-01-29","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-02-10","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-02-10","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-02-16","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2021-04-02","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-05-20","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":5}}},{"date":"2021-08-24","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-08-24","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-08-24","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2021-09-09","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":91,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-03-10","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-09-19","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-09-20","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":13}}},{"date":"2020-12-22","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-12-22","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-02-12","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-02-12","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-03-01","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-03-06","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-04-16","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":13}}},{"date":"2021-04-16","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-04-16","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-04-26","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-05-11","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-05-11","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-05-20","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":92,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-01-05","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-01-06","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-01-10","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-01-12","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-02-01","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-02-01","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-02-02","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-03-16","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-04-08","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-04-13","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-05-09","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":93,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-07-22","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":7}}},{"date":"2021-07-22","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-07-22","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-07-22","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-07-22","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-07-25","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-07-25","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-09-12","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2021-12-13","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":7}}},{"date":"2022-05-06","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-05-13","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-06-10","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2022-07-10","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":94,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-02-08","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-02-25","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":8}}},{"date":"2021-04-11","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-04-11","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-04-22","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-04-25","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-04-25","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-07-26","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":8}}},{"date":"2021-09-24","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-09-24","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-09-24","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2021-10-10","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":95,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2019-01-27","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2019-01-27","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":3}}},{"date":"2020-02-19","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":3}}},{"date":"2020-02-25","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-03-08","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-03-08","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-03-17","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-03-18","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-04-08","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-05-18","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-05-18","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-05-23","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-06-22","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-06-22","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-07-06","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":96,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2019-12-15","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":7}}},{"date":"2019-12-15","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2019-12-15","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-01-17","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-01-26","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-02-08","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-02-08","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-02-08","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-02-14","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":7}}},{"date":"2020-06-18","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-06-20","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-07-12","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-07-19","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-07-19","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-10-01","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":97,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-07-11","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-07-18","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-07-19","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":11}}},{"date":"2020-07-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-07-19","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-08-08","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":11}}},{"date":"2020-08-26","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-08-26","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-08-26","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-09-13","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-09-18","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-09-25","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-10-03","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-10-03","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-10-15","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":98,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-04-01","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":4}}},{"date":"2021-05-12","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":4}}},{"date":"2021-05-12","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-05-12","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-05-12","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-05-12","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-05-12","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-05-12","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-05-31","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-06-10","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-06-10","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-06-28","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-07-29","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2021-07-29","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2021-07-29","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2021-11-23","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":99,"demarcheStatutId":"cls","demarchePublique":true,"etapes":[{"date":"2020-03-02","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-03-17","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2020-03-17","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-03-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-03-20","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-04-02","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-04-02","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-04-15","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-06-15","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-06-17","etapeTypeId":"aca","etapeStatutId":"ajo"},{"date":"2020-07-09","etapeTypeId":"mna","etapeStatutId":"fai"},{"date":"2020-12-23","etapeTypeId":"css","etapeStatutId":"fai"}]},{"id":100,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2019-09-01","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":6}}},{"date":"2019-09-01","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2019-09-06","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-02-15","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-02-24","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-03-08","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-03-09","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-03-27","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-05-08","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":6}}},{"date":"2020-05-21","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-05-23","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-06-06","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-06-14","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-06-14","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-07-25","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":101,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-05-21","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-06-05","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":4}}},{"date":"2020-06-05","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-05","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-06-13","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-06-20","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-06-20","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-07-06","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-07-17","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":4}}},{"date":"2020-08-24","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-08-29","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-09-20","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-10-18","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-10-18","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-10-26","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":102,"demarcheStatutId":"cls","demarchePublique":true,"etapes":[{"date":"2020-01-04","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-05-26","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2020-06-27","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-07-09","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-08-13","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-08-27","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-08-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-08-27","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-09-10","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2020-09-13","etapeTypeId":"rcb","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":5}}},{"date":"2020-09-20","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":5}}},{"date":"2020-11-14","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-11-14","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-11-27","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2021-02-06","etapeTypeId":"css","etapeStatutId":"fai"}]},{"id":103,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2020-01-03","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":10}}},{"date":"2020-01-16","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-01-22","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-02-03","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-02-03","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-02-13","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-02-13","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-02-17","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":10}}},{"date":"2020-04-02","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-04-13","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-04-15","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2020-04-20","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":104,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2020-06-14","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-06-15","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-06-15","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-20","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-06-28","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-07-07","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":105,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-06-26","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-06-29","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-06-30","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-07-05","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-07-21","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-07-21","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-07-21","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-08-07","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-08-16","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-08-23","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":106,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-05-12","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-05-14","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{}}},{"date":"2021-05-14","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-05-22","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-05-28","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-05-28","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-06-19","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-06-29","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-06-29","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-07-17","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":107,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-05-20","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-05-22","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{}}},{"date":"2021-05-22","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-05-30","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-06-05","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-06-05","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-06-27","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-07-07","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-07-07","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-07-25","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":108,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2021-06-07","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-11-22","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-01-23","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":2}}},{"date":"2022-02-08","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-02-08","etapeTypeId":"mcp","etapeStatutId":"inc"},{"date":"2022-02-08","etapeTypeId":"mcm","etapeStatutId":"fai"},{"date":"2022-02-17","etapeTypeId":"des","etapeStatutId":"fai"},{"date":"2022-02-21","etapeTypeId":"vfd","etapeStatutId":"fai"}]},{"id":109,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-08-10","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-03-02","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2022-03-02","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-03-02","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-03-04","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-03-04","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-04-13","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-04-20","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-05-18","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2022-06-17","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":110,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-08-22","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-03-05","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2022-03-05","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-03-13","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-03-15","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-03-15","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-04-25","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-05-02","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-05-30","etapeTypeId":"aca","etapeStatutId":"def"},{"date":"2022-06-29","etapeTypeId":"mnd","etapeStatutId":"fai"}]},{"id":111,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2022-03-12","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-03-19","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-03-26","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":8}}},{"date":"2022-03-26","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-03-27","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-03-28","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-03-28","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-04-16","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":8}}},{"date":"2022-07-08","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-07-17","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-07-17","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":112,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-02-22","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2022-02-22","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-02-22","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-03-05","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-03-06","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-03-06","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-05-01","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-05-08","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-06-05","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-07-09","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":113,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-02-23","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-02-26","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2022-02-26","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-03-06","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-03-08","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-03-08","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-05-02","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-05-09","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-06-06","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-07-10","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":114,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2021-08-16","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-03-15","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2022-03-15","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-03-24","etapeTypeId":"mcp","etapeStatutId":"inc"},{"date":"2022-03-24","etapeTypeId":"mcm","etapeStatutId":"fai"},{"date":"2022-04-27","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":115,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2022-09-15","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-09-24","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2022-09-24","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-09-24","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-09-24","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-09-24","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-10-19","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-11-16","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-11-16","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2023-01-24","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":116,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2022-06-19","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-06-25","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-08-16","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":18}}},{"date":"2022-08-16","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-08-23","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-09-14","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-09-14","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2023-01-09","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":18}}},{"date":"2023-01-22","etapeTypeId":"ede","etapeStatutId":"def"},{"date":"2023-01-23","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2023-01-30","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2023-02-01","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":117,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-05-02","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-06-01","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-08-10","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":8}}},{"date":"2022-08-10","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-08-10","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-09-14","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-09-14","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-12-07","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":8}}},{"date":"2022-12-26","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2023-01-02","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2023-01-02","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2023-01-14","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2023-02-04","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2023-02-04","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2023-02-18","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":118,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-06-10","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-06-23","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-06-11","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":4}}},{"date":"2022-06-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-06-20","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-09-11","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-09-11","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-11-27","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":4}}},{"date":"2022-12-23","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-12-30","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-12-30","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2023-01-11","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2023-03-22","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2023-03-22","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2023-03-23","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":119,"demarcheStatutId":"ins","demarchePublique":false,"etapes":[{"date":"2022-05-21","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-07-09","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-09-26","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":9}}},{"date":"2022-09-26","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-09-26","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-10-03","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-10-03","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-10-09","etapeTypeId":"edm","etapeStatutId":"fav"}]},{"id":120,"demarcheStatutId":"ins","demarchePublique":false,"etapes":[{"date":"2022-05-18","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-06-24","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-09-11","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":4}}},{"date":"2022-09-14","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-09-14","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-09-18","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-09-18","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-09-24","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2023-01-26","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":4}}}]},{"id":121,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-06-26","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-07-01","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-07-05","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":8}}},{"date":"2022-07-05","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-07-06","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-09-21","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-09-21","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-12-07","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":8}}},{"date":"2023-01-02","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2023-01-09","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2023-01-09","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2023-01-21","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2023-02-11","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2023-02-11","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2023-02-11","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":122,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-04-13","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-04-17","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-05-09","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":14}}},{"date":"2022-05-09","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-05-22","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-05-25","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-05-25","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-06-06","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":14}}},{"date":"2022-10-09","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-10-18","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-10-18","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-10-22","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2022-11-01","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2023-01-21","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2023-01-21","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":123,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2022-03-16","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-03-26","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-03-28","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":3}}},{"date":"2022-03-28","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-03-28","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-03-28","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-03-28","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-07-04","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2022-12-08","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":3}}},{"date":"2023-01-03","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2023-01-10","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2023-01-10","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":124,"demarcheStatutId":"ins","demarchePublique":false,"etapes":[{"date":"2023-01-07","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2023-01-11","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2023-01-11","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2023-01-14","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2023-01-14","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2023-01-19","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2023-01-24","etapeTypeId":"edm","etapeStatutId":"fav"}]},{"id":125,"demarcheStatutId":"ins","demarchePublique":false,"etapes":[{"date":"2023-01-17","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2023-01-27","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2023-01-27","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2023-01-27","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2023-01-31","etapeTypeId":"vfd","etapeStatutId":"fai"}]},{"id":126,"demarcheStatutId":"ins","demarchePublique":false,"etapes":[{"date":"2023-02-20","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2023-02-20","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false,"franchissements":0}}},{"date":"2023-02-20","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2023-02-21","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2023-02-21","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2023-02-21","etapeTypeId":"mcr","etapeStatutId":"fav"}]},{"id":127,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-12-15","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-12-25","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2022-12-25","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2023-01-10","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2023-01-19","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2023-01-19","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2023-01-22","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2023-01-24","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2023-01-31","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2023-02-05","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2023-02-05","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":128,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-12-23","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2023-01-13","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2023-01-13","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2023-01-28","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2023-02-11","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2023-02-11","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2023-02-14","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2023-02-16","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2023-02-23","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2023-02-28","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2023-02-28","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":129,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2022-10-25","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-10-25","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":8}}},{"date":"2022-10-25","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-11-02","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-11-02","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-11-04","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-11-04","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2023-01-16","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2023-02-27","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":8}}},{"date":"2023-03-07","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2023-03-16","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2023-03-16","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":130,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2019-09-24","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":0}}},{"date":"2019-10-18","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2019-11-19","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2019-11-30","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2019-12-20","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2019-12-31","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2019-12-31","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-03-22","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2020-03-22","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-03-29","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-03-29","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-04-07","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-05-03","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-05-03","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-05-16","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":131,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2022-04-03","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2022-04-03","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-06-17","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":132,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2018-07-15","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-02-06","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2020-02-12","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-02-12","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-02-24","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-03-03","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2020-03-04","etapeTypeId":"rcb","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":0}}},{"date":"2020-03-04","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-03-04","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-04-04","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-05-05","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-05-05","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-06-09","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2020-06-16","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2020-06-16","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2020-06-23","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":133,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-06-03","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-06-07","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-06-07","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-06-07","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-06-27","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-06-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-09-13","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-11-20","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-11-21","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2021-11-21","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2021-12-03","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":134,"demarcheStatutId":"ins","demarchePublique":false,"etapes":[{"date":"2022-04-20","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-04-21","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-04-22","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":3}}},{"date":"2022-06-18","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-06-23","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-10-02","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-10-02","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-10-13","etapeTypeId":"asc","etapeStatutId":"fai"}]},{"id":135,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-10-10","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-10-21","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-10-28","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":9}}},{"date":"2021-10-28","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-10-31","etapeTypeId":"mcp","etapeStatutId":"inc"},{"date":"2021-10-31","etapeTypeId":"mcm","etapeStatutId":"fai"},{"date":"2021-11-12","etapeTypeId":"rcm","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":9}}},{"date":"2021-11-12","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-11-14","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-11-17","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-11-25","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2021-12-04","etapeTypeId":"mcb","etapeStatutId":"fai"},{"date":"2022-01-16","etapeTypeId":"rcb","etapeStatutId":"fai","contenu":{"arm":{"franchissements":9}}},{"date":"2023-01-13","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":9}}},{"date":"2023-01-26","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2023-02-03","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2023-02-05","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":136,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-03-17","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2022-03-17","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-03-17","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-04-06","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-04-12","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-04-12","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-06-20","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-06-29","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-06-29","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-07-20","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":137,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-04-06","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-05-17","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2022-05-17","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-05-25","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-05-31","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-05-31","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-06-28","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-07-07","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-07-07","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-07-28","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2022-07-28","etapeTypeId":"mns","etapeStatutId":"fai"},{"date":"2022-10-15","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":138,"demarcheStatutId":"ins","demarchePublique":false,"etapes":[{"date":"2023-04-05","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2023-04-05","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":139,"demarcheStatutId":"ins","demarchePublique":false,"etapes":[{"date":"2023-03-19","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2023-04-01","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2023-04-01","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2023-04-01","etapeTypeId":"mcp","etapeStatutId":"com"}]},{"id":140,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-03-06","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-03-31","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-06-02","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}},{"date":"2022-06-06","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-06-07","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-08-29","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-08-29","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-11-14","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":3}}},{"date":"2022-12-10","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-12-17","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-12-17","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2022-12-29","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2023-02-02","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2023-02-02","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2023-02-02","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":141,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2022-04-10","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-12-12","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-12-12","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":3}}},{"date":"2022-12-12","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-12-13","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-12-14","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-12-14","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2023-01-14","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2023-02-25","etapeTypeId":"rde","etapeStatutId":"def","contenu":{"arm":{"franchissements":3}}},{"date":"2023-03-05","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2023-03-14","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2023-03-14","etapeTypeId":"aca","etapeStatutId":"def"}]},{"id":142,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-06-14","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-06-25","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-07-03","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":8}}},{"date":"2022-07-03","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-07-04","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-09-21","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-09-21","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-12-07","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":8}}},{"date":"2023-01-02","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2023-01-09","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2023-01-09","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2023-01-21","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2023-02-25","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2023-02-25","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2023-02-25","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":143,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-04-17","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-04-24","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-04-26","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":12}}},{"date":"2022-04-26","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-05-10","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-05-13","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-05-13","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-06-27","etapeTypeId":"edm","etapeStatutId":"fav"},{"date":"2022-12-01","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":12}}},{"date":"2022-12-27","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2023-01-03","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2023-01-03","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2023-01-15","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2023-02-05","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2023-02-05","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2023-02-05","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":144,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-09-18","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-11-04","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2022-05-15","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":6}}},{"date":"2022-05-15","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-05-30","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2022-07-23","etapeTypeId":"mod","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":6}}},{"date":"2022-09-28","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2022-09-28","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-12-14","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":6}}},{"date":"2023-01-09","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2023-01-16","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2023-01-16","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2023-02-15","etapeTypeId":"mnb","etapeStatutId":"fai"},{"date":"2023-02-15","etapeTypeId":"pfc","etapeStatutId":"fai"},{"date":"2023-02-15","etapeTypeId":"vfc","etapeStatutId":"fai"},{"date":"2023-02-15","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true}}}]},{"id":145,"demarcheStatutId":"ins","demarchePublique":false,"etapes":[{"date":"2022-01-20","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2023-02-27","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2023-02-27","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2023-03-09","etapeTypeId":"mcp","etapeStatutId":"com"}]},{"id":146,"demarcheStatutId":"ins","demarchePublique":true,"etapes":[{"date":"2021-10-06","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":true,"franchissements":5}}},{"date":"2021-10-06","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-10-07","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-10-07","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2021-10-07","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2021-10-13","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2021-10-13","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-11-25","etapeTypeId":"edm","etapeStatutId":"def"},{"date":"2022-03-17","etapeTypeId":"rde","etapeStatutId":"fav","contenu":{"arm":{"franchissements":5}}},{"date":"2022-09-29","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-10-07","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2022-10-08","etapeTypeId":"aca","etapeStatutId":"ajo"}]},{"id":147,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-06-04","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-06-04","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-04","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-06-10","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-07-25","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-07-25","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-08-22","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-08-23","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-08-28","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-09-04","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]},{"id":148,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-05-01","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-05-06","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-05-06","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-05-18","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-08-05","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-08-05","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-08-06","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-08-07","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-08-12","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-08-19","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-08-19","etapeTypeId":"mns","etapeStatutId":"fai"}]},{"id":149,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-05-21","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-05-21","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-05-23","etapeTypeId":"pfd","etapeStatutId":"fai"},{"date":"2020-06-02","etapeTypeId":"mcp","etapeStatutId":"com"},{"date":"2020-06-23","etapeTypeId":"vfd","etapeStatutId":"fai"},{"date":"2020-06-23","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-07-09","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-08-27","etapeTypeId":"sca","etapeStatutId":"fai"},{"date":"2020-09-01","etapeTypeId":"aca","etapeStatutId":"fav"},{"date":"2020-09-08","etapeTypeId":"sco","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}}]}] diff --git a/packages/api/src/business/rules-demarches/arm/oct.machine.test.ts b/packages/api/src/business/rules-demarches/arm/oct.machine.test.ts index afb4dbd0d..91fb032d7 100644 --- a/packages/api/src/business/rules-demarches/arm/oct.machine.test.ts +++ b/packages/api/src/business/rules-demarches/arm/oct.machine.test.ts @@ -3,9 +3,11 @@ import { interpretMachine, orderAndInterpretMachine as commonOrderAndInterpretMa import { IContenu } from '../../../types.js' import { EtapeStatutId, ETAPES_STATUTS } from 'camino-common/src/static/etapesStatuts.js' import { ETAPES_TYPES, EtapeTypeId } from 'camino-common/src/static/etapesTypes.js' +import { EtapesTypesEtapesStatuts as ETES } from 'camino-common/src/static/etapesTypesEtapesStatuts.js' import { Etape } from '../machine-common.js' import { toCaminoDate } from 'camino-common/src/date.js' import { describe, expect, test } from 'vitest' +import { PAYS_IDS } from 'camino-common/src/static/pays.js' const etapesProd = require('./oct.cas.json') const orderAndInterpretMachine = (etapes: readonly Etape[]) => { return commonOrderAndInterpretMachine(new ArmOctMachine(), etapes) @@ -122,7 +124,33 @@ describe('vérifie l’arbre d’octroi d’ARM', () => { 'MODIFIER_DEMANDE', ]) }) - + test('peut faire une edm après une asc', () => { + const etapes = [ + { ...ETES.paiementDesFraisDeDossier.FAIT, date: toCaminoDate('2023-09-01') }, + { ...ETES.demande.FAIT, date: toCaminoDate('2023-09-09'), paysId: PAYS_IDS['Département de la Guyane'], surface: 3.14 }, + { ...ETES.depotDeLaDemande.FAIT, date: toCaminoDate('2023-09-09') }, + { ...ETES.completudeDeLaDemande.COMPLETE, date: toCaminoDate('2023-09-20') }, + { ...ETES.validationDuPaiementDesFraisDeDossier.FAIT, date: toCaminoDate('2023-09-26') }, + { ...ETES.recevabiliteDeLaDemande.FAVORABLE, date: toCaminoDate('2023-09-27') }, + { ...ETES.avisDesServicesEtCommissionsConsultatives.FAIT, date: toCaminoDate('2023-09-27') }, + { ...ETES.expertiseDGTMServicePreventionDesRisquesEtIndustriesExtractives_DATE_.FAVORABLE, date: toCaminoDate('2024-03-27') }, + ] + expect(() => orderAndInterpretMachine(etapes)).not.toThrowError() + }) + test('ne peut pas faire une sca avant la asc', () => { + const etapes = [ + { ...ETES.paiementDesFraisDeDossier.FAIT, date: toCaminoDate('2023-09-01') }, + { ...ETES.demande.FAIT, date: toCaminoDate('2023-09-09'), paysId: PAYS_IDS['Département de la Guyane'], surface: 3.14 }, + { ...ETES.depotDeLaDemande.FAIT, date: toCaminoDate('2023-09-09') }, + { ...ETES.completudeDeLaDemande.COMPLETE, date: toCaminoDate('2023-09-20') }, + { ...ETES.validationDuPaiementDesFraisDeDossier.FAIT, date: toCaminoDate('2023-09-26') }, + { ...ETES.recevabiliteDeLaDemande.FAVORABLE, date: toCaminoDate('2023-09-27') }, + { ...ETES.saisineDeLaCommissionDesAutorisationsDeRecherchesMinieres_CARM_.FAIT, date: toCaminoDate('2023-09-27') }, + ] + expect(() => orderAndInterpretMachine(etapes)).toThrowErrorMatchingInlineSnapshot( + `[Error: Error: cannot execute step: '{"etapeTypeId":"sca","etapeStatutId":"fai","date":"2023-09-27"}' after '["pfd_fai","mfr_fai","mdp_fai","mcp_com","vfd_fai","mcr_fav"]'. The event {"type":"FAIRE_SAISINE_CARM"} should be one of 'CLASSER_SANS_SUITE,DESISTER_PAR_LE_DEMANDEUR,MODIFIER_DEMANDE,RECEVOIR_EXPERTISE_SERVICE_EAU,RECEVOIR_EXPERTISE_SERVICE_MINES,RENDRE_AVIS_DES_SERVICES_ET_COMMISSIONS_CONSULTATIVES']` + ) + }) test('la demande ne peut pas être effectuée après une modification de la demande', () => { const service = orderAndInterpretMachine([ { @@ -441,13 +469,8 @@ describe('vérifie l’arbre d’octroi d’ARM', () => { date: toCaminoDate('2020-01-07'), }, { - etapeTypeId: 'eof', + etapeTypeId: 'asc', etapeStatutId: 'fai', - date: toCaminoDate('2020-01-08'), - }, - { - etapeTypeId: 'aof', - etapeStatutId: 'fav', date: toCaminoDate('2020-01-09'), }, { @@ -507,15 +530,10 @@ describe('vérifie l’arbre d’octroi d’ARM', () => { date: toCaminoDate('2020-01-01'), }, { - etapeTypeId: 'eof', + etapeTypeId: 'asc', etapeStatutId: 'fai', date: toCaminoDate('2020-01-01'), }, - { - etapeTypeId: 'aof', - etapeStatutId: 'fav', - date: toCaminoDate('2020-01-01'), - }, { etapeTypeId: 'sca', etapeStatutId: 'fai', @@ -553,12 +571,7 @@ describe('vérifie l’arbre d’octroi d’ARM', () => { etapeStatutId: 'fai', }, { - etapeTypeId: 'aof', - date: toCaminoDate('2020-06-19'), - etapeStatutId: 'def', - }, - { - etapeTypeId: 'eof', + etapeTypeId: 'asc', date: toCaminoDate('2020-06-19'), etapeStatutId: 'fai', }, @@ -628,15 +641,10 @@ describe('vérifie l’arbre d’octroi d’ARM', () => { etapeStatutId: 'fav', }, { - etapeTypeId: 'eof', + etapeTypeId: 'asc', date: toCaminoDate('2020-02-05'), etapeStatutId: 'fai', }, - { - etapeTypeId: 'aof', - date: toCaminoDate('2020-02-05'), - etapeStatutId: 'fav', - }, { etapeTypeId: 'mod', date: toCaminoDate('2020-06-17'), @@ -670,7 +678,7 @@ describe('vérifie l’arbre d’octroi d’ARM', () => { ]) }) - test('peut créer une "sca" après une "aof" et "rde"', () => { + test('peut créer une "sca" après une "asc" et "rde"', () => { orderAndInterpretMachine([ { etapeTypeId: 'dae', @@ -715,15 +723,10 @@ describe('vérifie l’arbre d’octroi d’ARM', () => { etapeStatutId: 'fav', }, { - etapeTypeId: 'eof', + etapeTypeId: 'asc', date: toCaminoDate('2020-08-10'), etapeStatutId: 'fai', }, - { - etapeTypeId: 'aof', - date: toCaminoDate('2020-08-10'), - etapeStatutId: 'fav', - }, { etapeTypeId: 'sca', date: toCaminoDate('2020-09-04'), @@ -771,12 +774,7 @@ describe('vérifie l’arbre d’octroi d’ARM', () => { contenu: { arm: { franchissements: 3 } }, }, { - etapeTypeId: 'aof', - etapeStatutId: 'fav', - date: toCaminoDate('2020-02-08'), - }, - { - etapeTypeId: 'eof', + etapeTypeId: 'asc', etapeStatutId: 'fai', date: toCaminoDate('2020-02-07'), }, @@ -822,12 +820,7 @@ describe('vérifie l’arbre d’octroi d’ARM', () => { test('les étapes sont vérifiées dans le bon ordre', () => { orderAndInterpretMachine([ { - etapeTypeId: 'aof', - etapeStatutId: 'fav', - date: toCaminoDate('2021-06-08'), - }, - { - etapeTypeId: 'eof', + etapeTypeId: 'asc', etapeStatutId: 'fai', date: toCaminoDate('2021-06-02'), }, @@ -909,8 +902,8 @@ describe('vérifie l’arbre d’octroi d’ARM', () => { date: toCaminoDate('2021-09-24'), }, { - etapeTypeId: 'aof', - etapeStatutId: 'def', + etapeTypeId: 'asc', + etapeStatutId: 'fai', date: toCaminoDate('2021-09-23'), }, { @@ -924,11 +917,6 @@ describe('vérifie l’arbre d’octroi d’ARM', () => { etapeStatutId: 'fav', date: toCaminoDate('2021-04-30'), }, - { - etapeTypeId: 'eof', - etapeStatutId: 'fai', - date: toCaminoDate('2021-03-17'), - }, { etapeTypeId: 'mcb', etapeStatutId: 'fai', @@ -973,61 +961,6 @@ describe('vérifie l’arbre d’octroi d’ARM', () => { ]) }) - test('peut réaliser une demande d’informations sur l’avis de l’ONF', () => { - orderAndInterpretMachine([ - { - etapeTypeId: 'aof', - etapeStatutId: 'def', - date: toCaminoDate('2021-09-23'), - }, - { - etapeTypeId: 'ria', - etapeStatutId: 'fai', - date: toCaminoDate('2021-09-21'), - }, - { - etapeTypeId: 'mia', - etapeStatutId: 'fai', - date: toCaminoDate('2021-09-20'), - }, - { - etapeTypeId: 'eof', - etapeStatutId: 'fai', - date: toCaminoDate('2021-03-17'), - }, - { - etapeTypeId: 'mcr', - etapeStatutId: 'fav', - date: toCaminoDate('2021-03-10'), - }, - { - etapeTypeId: 'vfd', - etapeStatutId: 'fai', - date: toCaminoDate('2021-03-10'), - }, - { - etapeTypeId: 'mcp', - etapeStatutId: 'com', - date: toCaminoDate('2021-02-26'), - }, - { - etapeTypeId: 'mdp', - etapeStatutId: 'fai', - date: toCaminoDate('2021-02-26'), - }, - { - etapeTypeId: 'mfr', - etapeStatutId: 'fai', - date: toCaminoDate('2021-02-26'), - }, - { - etapeTypeId: 'pfd', - etapeStatutId: 'fai', - date: toCaminoDate('2020-09-03'), - }, - ]) - }) - test('peut réaliser une demande de compléments après un avis de la CARM ajourné', () => { orderAndInterpretMachine([ { @@ -1061,14 +994,9 @@ describe('vérifie l’arbre d’octroi d’ARM', () => { date: toCaminoDate('2021-09-24'), }, { - etapeTypeId: 'aof', - etapeStatutId: 'fav', - date: toCaminoDate('2021-09-23'), - }, - { - etapeTypeId: 'eof', + etapeTypeId: 'asc', etapeStatutId: 'fai', - date: toCaminoDate('2021-03-17'), + date: toCaminoDate('2021-09-23'), }, { etapeTypeId: 'mcr', @@ -1136,14 +1064,9 @@ describe('vérifie l’arbre d’octroi d’ARM', () => { date: toCaminoDate('2021-09-24'), }, { - etapeTypeId: 'aof', - etapeStatutId: 'fav', - date: toCaminoDate('2021-09-23'), - }, - { - etapeTypeId: 'eof', + etapeTypeId: 'asc', etapeStatutId: 'fai', - date: toCaminoDate('2021-03-17'), + date: toCaminoDate('2021-09-23'), }, { etapeTypeId: 'mcr', @@ -1221,14 +1144,9 @@ describe('vérifie l’arbre d’octroi d’ARM', () => { date: toCaminoDate('2021-09-24'), }, { - etapeTypeId: 'aof', - etapeStatutId: 'fav', - date: toCaminoDate('2021-09-23'), - }, - { - etapeTypeId: 'eof', + etapeTypeId: 'asc', etapeStatutId: 'fai', - date: toCaminoDate('2021-03-17'), + date: toCaminoDate('2021-09-23'), }, { etapeTypeId: 'mcr', @@ -1374,14 +1292,9 @@ describe('vérifie l’arbre d’octroi d’ARM', () => { date: toCaminoDate('2021-10-01'), }, { - etapeTypeId: 'aof', - etapeStatutId: 'fav', - date: toCaminoDate('2021-09-23'), - }, - { - etapeTypeId: 'eof', + etapeTypeId: 'asc', etapeStatutId: 'fai', - date: toCaminoDate('2021-03-17'), + date: toCaminoDate('2021-09-23'), }, { etapeTypeId: 'mcr', @@ -1481,14 +1394,9 @@ describe('vérifie l’arbre d’octroi d’ARM', () => { date: toCaminoDate('2021-10-01'), }, { - etapeTypeId: 'aof', - etapeStatutId: 'fav', - date: toCaminoDate('2021-09-23'), - }, - { - etapeTypeId: 'eof', + etapeTypeId: 'asc', etapeStatutId: 'fai', - date: toCaminoDate('2021-03-17'), + date: toCaminoDate('2021-09-23'), }, { etapeTypeId: 'mcr', diff --git a/packages/api/src/business/rules-demarches/arm/oct.machine.ts b/packages/api/src/business/rules-demarches/arm/oct.machine.ts index f2c695404..87be32dfc 100644 --- a/packages/api/src/business/rules-demarches/arm/oct.machine.ts +++ b/packages/api/src/business/rules-demarches/arm/oct.machine.ts @@ -50,10 +50,7 @@ type XStateEvent = | { type: 'NOTIFIER_DEMANDEUR_CSS' } | { type: 'DECLARER_DEMANDE_FAVORABLE' } | { type: 'DECLARER_DEMANDE_DEFAVORABLE' } - | { type: 'FAIRE_EXPERTISE_ONF' } - | { type: 'RENDRE_AVIS_ONF' } - | { type: 'DEMANDER_INFORMATION_AVIS_ONF' } - | { type: 'RECEVOIR_INFORMATION_AVIS_ONF' } + | { type: 'RENDRE_AVIS_DES_SERVICES_ET_COMMISSIONS_CONSULTATIVES' } | { type: 'FAIRE_SAISINE_CARM' } | { type: 'RENDRE_AVIS_FAVORABLE_CARM' } | { type: 'RENDRE_AVIS_DEFAVORABLE_CARM' } @@ -70,8 +67,6 @@ type XStateEvent = | { type: 'RECEVOIR_INFORMATION_MCR' } | { type: 'DEMANDER_COMPLEMENTS_MCR' } | { type: 'RECEVOIR_COMPLEMENTS_MCR' } - | { type: 'DEMANDER_INFORMATION_EXPERTISE_ONF' } - | { type: 'RECEVOIR_INFORMATION_EXPERTISE_ONF' } | { type: 'RECEVOIR_EXPERTISE_SERVICE_EAU' } | { type: 'RECEVOIR_EXPERTISE_SERVICE_MINES' } | { type: 'NOTIFIER_DEMANDEUR_SIGNATURE_ARM' } @@ -143,10 +138,7 @@ const trad: { [key in Event]: { db: DBEtat; mainStep: boolean } } = { }, mainStep: false, }, - FAIRE_EXPERTISE_ONF: { db: EtapesTypesEtapesStatuts.expertiseDeLOfficeNationalDesForets, mainStep: true }, - RENDRE_AVIS_ONF: { db: EtapesTypesEtapesStatuts.avisDeLOfficeNationalDesForets, mainStep: true }, - DEMANDER_INFORMATION_AVIS_ONF: { db: EtapesTypesEtapesStatuts.demandeDinformations_AvisDeLOfficeNationalDesForets_, mainStep: false }, - RECEVOIR_INFORMATION_AVIS_ONF: { db: EtapesTypesEtapesStatuts.receptionDinformation_AvisDeLOfficeNationalDesForets_, mainStep: false }, + RENDRE_AVIS_DES_SERVICES_ET_COMMISSIONS_CONSULTATIVES: { db: EtapesTypesEtapesStatuts.avisDesServicesEtCommissionsConsultatives, mainStep: true }, FAIRE_SAISINE_CARM: { db: EtapesTypesEtapesStatuts.saisineDeLaCommissionDesAutorisationsDeRecherchesMinieres_CARM_, mainStep: true }, RENDRE_AVIS_FAVORABLE_CARM: { db: { @@ -179,8 +171,6 @@ const trad: { [key in Event]: { db: DBEtat; mainStep: boolean } } = { RECEVOIR_INFORMATION_MCR: { db: EtapesTypesEtapesStatuts.receptionDinformation_RecevabiliteDeLaDemande_, mainStep: false }, DEMANDER_COMPLEMENTS_MCR: { db: EtapesTypesEtapesStatuts.demandeDeComplements_RecevabiliteDeLaDemande_, mainStep: false }, RECEVOIR_COMPLEMENTS_MCR: { db: EtapesTypesEtapesStatuts.receptionDeComplements_RecevabiliteDeLaDemande_, mainStep: false }, - DEMANDER_INFORMATION_EXPERTISE_ONF: { db: EtapesTypesEtapesStatuts.demandeDinformations_ExpertiseDeLOfficeNationalDesForets_, mainStep: false }, - RECEVOIR_INFORMATION_EXPERTISE_ONF: { db: EtapesTypesEtapesStatuts.receptionDinformation_ExpertiseDeLOfficeNationalDesForets_, mainStep: false }, RECEVOIR_EXPERTISE_SERVICE_EAU: { db: EtapesTypesEtapesStatuts.expertiseDREALOuDGTMServiceEau, mainStep: false }, RECEVOIR_EXPERTISE_SERVICE_MINES: { db: EtapesTypesEtapesStatuts.expertiseDGTMServicePreventionDesRisquesEtIndustriesExtractives_DATE_, mainStep: false }, NOTIFIER_DEMANDEUR_SIGNATURE_ARM: { db: EtapesTypesEtapesStatuts.notificationAuDemandeur_SignatureDeLautorisationDeRechercheMiniere_, mainStep: true }, @@ -307,7 +297,7 @@ type MecanisationInconnu = MecanisationConnu | 'inconnu' interface OctARMContext extends CaminoCommonContext { mecanisation: MecanisationInconnu - expertiseONFFaite: boolean + avisDesServicesEtCommissionsConsultativesFait: boolean paiementFraisDossierValide: boolean } @@ -413,8 +403,8 @@ const armOctMachine = createMachine({ initial: 'demandeEnConstructionOuDeposeeOuEnInstructionMachine', context: { mecanisation: 'inconnu', - expertiseONFFaite: false, visibilite: 'confidentielle', + avisDesServicesEtCommissionsConsultativesFait: false, demarcheStatut: DemarchesStatutsIds.EnConstruction, paiementFraisDossierValide: false, }, @@ -616,54 +606,26 @@ const armOctMachine = createMachine({ DEMANDER_INFORMATION_MCR: 'receptionInformationPourLaRecevabiliteAFaire', DEMANDER_COMPLEMENTS_MCR: 'receptionComplementsPourLaRecevabiliteAFaire', DECLARER_DEMANDE_FAVORABLE: 'expertisesMachine', - DECLARER_DEMANDE_DEFAVORABLE: 'avisONFARendre', + DECLARER_DEMANDE_DEFAVORABLE: 'avisDesServicesEtCommissionsConsultativesARendre', }, }, receptionInformationPourLaRecevabiliteAFaire: { on: { RECEVOIR_INFORMATION_MCR: 'recevabiliteDeLaDemandeAFaire', DECLARER_DEMANDE_FAVORABLE: 'expertisesMachine', - DECLARER_DEMANDE_DEFAVORABLE: 'avisONFARendre', + DECLARER_DEMANDE_DEFAVORABLE: 'avisDesServicesEtCommissionsConsultativesARendre', }, }, receptionComplementsPourLaRecevabiliteAFaire: { on: { RECEVOIR_COMPLEMENTS_MCR: 'recevabiliteDeLaDemandeAFaire', DECLARER_DEMANDE_FAVORABLE: 'expertisesMachine', - DECLARER_DEMANDE_DEFAVORABLE: 'avisONFARendre', + DECLARER_DEMANDE_DEFAVORABLE: 'avisDesServicesEtCommissionsConsultativesARendre', }, }, expertisesMachine: { type: 'parallel', states: { - expertiseONFMachine: { - initial: 'expertiseONFAFaire', - states: { - expertiseONFAFaire: { - on: { - DEMANDER_INFORMATION_EXPERTISE_ONF: 'expertiseOuReceptionInformationONFAFaire', - FAIRE_EXPERTISE_ONF: 'demandeAvisONFAFaire', - }, - }, - expertiseOuReceptionInformationONFAFaire: { - on: { - FAIRE_EXPERTISE_ONF: 'demandeAvisONFAFaire', - RECEVOIR_INFORMATION_EXPERTISE_ONF: 'expertiseONFAFaire', - }, - }, - demandeAvisONFAFaire: { - on: { - DEMANDER_INFORMATION_AVIS_ONF: 'receptionInformationAvisONFAFaire', - }, - entry: assign({ expertiseONFFaite: true }), - }, - receptionInformationAvisONFAFaire: { - on: { - RECEVOIR_INFORMATION_AVIS_ONF: 'demandeAvisONFAFaire', - }, - }, - }, - }, expertiseServiceEauMachine: { initial: 'expertiseServiceEauAfaire', states: { @@ -688,20 +650,37 @@ const armOctMachine = createMachine({ expertiseServiceMinesFait: { type: 'final' }, }, }, + avisDesServicesEtCommissionsConsultativesMachine: { + initial: 'avisDesServicesEtCommissionsConsultativesARendre', + states: { + avisDesServicesEtCommissionsConsultativesARendre: { + on: { + RENDRE_AVIS_DES_SERVICES_ET_COMMISSIONS_CONSULTATIVES: { + target: 'avisDesServicesEtCommissionsConsultativesRendu', + actions: assign({ avisDesServicesEtCommissionsConsultativesFait: true }), + }, + }, + }, + avisDesServicesEtCommissionsConsultativesRendu: { type: 'final' }, + }, + }, }, on: { - RENDRE_AVIS_ONF: { - target: 'avisONFRendu', - guard: ({ context }) => context.expertiseONFFaite, + FAIRE_SAISINE_CARM: { + target: '#avisCommissionAutorisationDeRecherchesMinieresAFaire', + actions: assign({ + visibilite: 'publique', + }), + guard: ({ context }) => context.avisDesServicesEtCommissionsConsultativesFait, }, }, }, - avisONFARendre: { + avisDesServicesEtCommissionsConsultativesARendre: { on: { - RENDRE_AVIS_ONF: 'avisONFRendu', + RENDRE_AVIS_DES_SERVICES_ET_COMMISSIONS_CONSULTATIVES: 'avisDesServicesEtCommissionsConsultativesRendu', }, }, - avisONFRendu: { type: 'final' }, + avisDesServicesEtCommissionsConsultativesRendu: { type: 'final' }, }, }, declarationLoiSurLEauMachine: { @@ -784,7 +763,7 @@ const armOctMachine = createMachine({ DEMANDER_COMPLEMENTS_RDE: { target: [ 'demandeEnConstructionOuDeposeeOuEnInstructionMachine.declarationLoiSurLEauMachine.receptionDeComplementsAFaire', - 'demandeEnConstructionOuDeposeeOuEnInstructionMachine.pasRdeMachine.avisONFRendu', + 'demandeEnConstructionOuDeposeeOuEnInstructionMachine.pasRdeMachine.avisDesServicesEtCommissionsConsultativesRendu', ], guard: ({ context }) => isMecanise(context.mecanisation) && !context.mecanisation.franchissementCoursEau, }, @@ -801,6 +780,7 @@ const armOctMachine = createMachine({ }, }, avisCommissionAutorisationDeRecherchesMinieresAFaire: { + id: 'avisCommissionAutorisationDeRecherchesMinieresAFaire', on: { RENDRE_AVIS_FAVORABLE_CARM: [ { diff --git a/packages/api/src/business/rules-demarches/arm/ren-pro.machine.test.ts b/packages/api/src/business/rules-demarches/arm/ren-pro.machine.test.ts index 691a61fff..c8ebbe191 100644 --- a/packages/api/src/business/rules-demarches/arm/ren-pro.machine.test.ts +++ b/packages/api/src/business/rules-demarches/arm/ren-pro.machine.test.ts @@ -26,7 +26,7 @@ describe('vérifie l’arbre de renonciation et de prolongation d’ARM', () => { ...ETES.modificationDeLaDemande.FAIT, date: toCaminoDate('2020-06-30') }, ]) ).toThrowErrorMatchingInlineSnapshot( - `[Error: Error: cannot execute step: '{"etapeTypeId":"mod","etapeStatutId":"fai","date":"2020-06-30"}' after '["mfr_fai","mdp_fai","mcr_fav"]'. The event {"type":"RECEVOIR_MODIFICATION_DE_LA_DEMANDE"} should be one of 'CLASSER_SANS_SUITE,DEMANDER_INFORMATION_EXPERTISE_ONF,DESISTER_PAR_LE_DEMANDEUR,FAIRE_EXPERTISE_ONF']` + `[Error: Error: cannot execute step: '{"etapeTypeId":"mod","etapeStatutId":"fai","date":"2020-06-30"}' after '["mfr_fai","mdp_fai","mcr_fav"]'. The event {"type":"RECEVOIR_MODIFICATION_DE_LA_DEMANDE"} should be one of 'CLASSER_SANS_SUITE,DESISTER_PAR_LE_DEMANDEUR,RENDRE_AVIS_DES_SERVICES_ET_COMMISSIONS_CONSULTATIVES']` ) }) @@ -44,13 +44,12 @@ describe('vérifie l’arbre de renonciation et de prolongation d’ARM', () => ) }) - test('peut mettre une "aof" après une "eof"', () => { + test('peut mettre une "asc" après une "mcp"', () => { const service = orderAndInterpretMachine(armRenProMachine, [ { ...ETES.demande.FAIT, date: toCaminoDate('2020-05-27') }, { ...ETES.depotDeLaDemande.FAIT, date: toCaminoDate('2020-05-30') }, { ...ETES.recevabiliteDeLaDemande.FAVORABLE, date: toCaminoDate('2020-05-30') }, - { ...ETES.expertiseDeLOfficeNationalDesForets.FAIT, date: toCaminoDate('2020-06-30') }, - { ...ETES.avisDeLOfficeNationalDesForets.FAVORABLE, date: toCaminoDate('2020-06-30') }, + { ...ETES.avisDesServicesEtCommissionsConsultatives.FAIT, date: toCaminoDate('2020-06-30') }, ]) expect(service.getSnapshot().context.demarcheStatut).toBe(DemarchesStatutsIds.Accepte) }) diff --git a/packages/api/src/business/rules-demarches/arm/ren-pro.machine.ts b/packages/api/src/business/rules-demarches/arm/ren-pro.machine.ts index 44cce6caf..687f4db4e 100644 --- a/packages/api/src/business/rules-demarches/arm/ren-pro.machine.ts +++ b/packages/api/src/business/rules-demarches/arm/ren-pro.machine.ts @@ -12,14 +12,7 @@ type XStateEvent = | { type: 'FAIRE_RECEVABILITE_DEMANDE_DEFAVORABLE' } | { type: 'RECEVOIR_MODIFICATION_DE_LA_DEMANDE' } | { type: 'RECEVOIR_COMPLEMENTS_POUR_RECEVABILITE' } - | { type: 'DEMANDER_INFORMATION_EXPERTISE_ONF' } - | { type: 'RECEVOIR_INFORMATION_EXPERTISE_ONF' } - | { type: 'FAIRE_EXPERTISE_ONF' } - | { type: 'DEMANDER_INFORMATION_AVIS_ONF' } - | { type: 'RECEVOIR_INFORMATION_AVIS_ONF' } - | { type: 'RENDRE_AVIS_ONF_FAVORABLE' } - | { type: 'RENDRE_AVIS_ONF_DEFAVORABLE' } - | { type: 'NOTIFIER_DEMANDEUR_APRES_AVIS_ONF_DEFAVORABLE' } + | { type: 'RENDRE_AVIS_DES_SERVICES_ET_COMMISSIONS_CONSULTATIVES' } | { type: 'FAIRE_AVENANT_ARM' } | { type: 'NOTIFIER_AVENANT_ARM' } | { type: 'DESISTER_PAR_LE_DEMANDEUR' } @@ -27,7 +20,8 @@ type XStateEvent = | { type: 'NOTIFIER_DEMANDEUR_APRES_CLASSEMENT_SANS_SUITE' } type Event = XStateEvent['type'] - +// TODO 2024-06-12 on finit toujours en statut accepté après l'avis, et on fait l'avenant à l'autorisation de recherch minière (aco) +// Si un jour on a un cas de rejet (peu probable car cette arbre ne sera plus utilisé avec la réforme), il faudra probablement rajouter une étape intermédiaire const trad: { [key in Event]: { db: DBEtat; mainStep: boolean } } = { FAIRE_DEMANDE: { db: EtapesTypesEtapesStatuts.demande, mainStep: true }, DEPOSER_DEMANDE: { db: EtapesTypesEtapesStatuts.depotDeLaDemande, mainStep: true }, @@ -46,14 +40,7 @@ const trad: { [key in Event]: { db: DBEtat; mainStep: boolean } } = { }, RECEVOIR_MODIFICATION_DE_LA_DEMANDE: { db: EtapesTypesEtapesStatuts.modificationDeLaDemande, mainStep: false }, RECEVOIR_COMPLEMENTS_POUR_RECEVABILITE: { db: EtapesTypesEtapesStatuts.receptionDeComplements_RecevabiliteDeLaDemande_, mainStep: false }, - DEMANDER_INFORMATION_EXPERTISE_ONF: { db: EtapesTypesEtapesStatuts.demandeDinformations_ExpertiseDeLOfficeNationalDesForets_, mainStep: false }, - RECEVOIR_INFORMATION_EXPERTISE_ONF: { db: EtapesTypesEtapesStatuts.receptionDinformation_ExpertiseDeLOfficeNationalDesForets_, mainStep: false }, - FAIRE_EXPERTISE_ONF: { db: EtapesTypesEtapesStatuts.expertiseDeLOfficeNationalDesForets, mainStep: true }, - DEMANDER_INFORMATION_AVIS_ONF: { db: EtapesTypesEtapesStatuts.demandeDinformations_AvisDeLOfficeNationalDesForets_, mainStep: false }, - RECEVOIR_INFORMATION_AVIS_ONF: { db: EtapesTypesEtapesStatuts.receptionDinformation_AvisDeLOfficeNationalDesForets_, mainStep: false }, - RENDRE_AVIS_ONF_FAVORABLE: { db: { FAVORABLE: EtapesTypesEtapesStatuts.avisDeLOfficeNationalDesForets.FAVORABLE }, mainStep: true }, - RENDRE_AVIS_ONF_DEFAVORABLE: { db: { DEFAVORABLE: EtapesTypesEtapesStatuts.avisDeLOfficeNationalDesForets.DEFAVORABLE }, mainStep: true }, - NOTIFIER_DEMANDEUR_APRES_AVIS_ONF_DEFAVORABLE: { db: EtapesTypesEtapesStatuts.notificationAuDemandeur_AvisDefavorable_, mainStep: true }, + RENDRE_AVIS_DES_SERVICES_ET_COMMISSIONS_CONSULTATIVES: { db: EtapesTypesEtapesStatuts.avisDesServicesEtCommissionsConsultatives, mainStep: true }, FAIRE_AVENANT_ARM: { db: EtapesTypesEtapesStatuts.avenantALautorisationDeRechercheMiniere, mainStep: true }, NOTIFIER_AVENANT_ARM: { db: EtapesTypesEtapesStatuts.notificationAuDemandeur_SignatureDeLavenantALautorisationDeRechercheMiniere_, mainStep: true }, DESISTER_PAR_LE_DEMANDEUR: { db: EtapesTypesEtapesStatuts.desistementDuDemandeur, mainStep: false }, @@ -134,7 +121,7 @@ const armRenProMachine = createMachine({ on: { DEMANDER_COMPLEMENTS_POUR_RECEVABILITE: 'complementsPourRecevabiliteAFaire', FAIRE_RECEVABILITE_DEMANDE_FAVORABLE: { - target: 'expertiseONFAFaire', + target: 'avisDesServicesEtCommissionsConsultativesARendre', actions: assign({ demarcheStatut: DemarchesStatutsIds.EnInstruction, visibilite: 'publique', @@ -147,7 +134,7 @@ const armRenProMachine = createMachine({ on: { RECEVOIR_COMPLEMENTS_POUR_RECEVABILITE: 'recevabiliteDeLaDemandeAFaire', FAIRE_RECEVABILITE_DEMANDE_FAVORABLE: { - target: 'expertiseONFAFaire', + target: 'avisDesServicesEtCommissionsConsultativesARendre', actions: assign({ demarcheStatut: DemarchesStatutsIds.EnInstruction, visibilite: 'publique', @@ -161,50 +148,14 @@ const armRenProMachine = createMachine({ RECEVOIR_MODIFICATION_DE_LA_DEMANDE: 'recevabiliteDeLaDemandeAFaire', }, }, - expertiseONFAFaire: { - on: { - DEMANDER_INFORMATION_EXPERTISE_ONF: 'expertiseOuReceptionInformationONFAFaire', - FAIRE_EXPERTISE_ONF: 'demandeAvisONFAFaire', - }, - }, - expertiseOuReceptionInformationONFAFaire: { - on: { - FAIRE_EXPERTISE_ONF: 'demandeAvisONFAFaire', - RECEVOIR_INFORMATION_EXPERTISE_ONF: 'expertiseONFAFaire', - }, - }, - demandeAvisONFAFaire: { - on: { - DEMANDER_INFORMATION_AVIS_ONF: 'receptionInformationAvisONFAFaire', - RENDRE_AVIS_ONF_FAVORABLE: { - target: 'avenantARMAFaire', - actions: assign({ - demarcheStatut: DemarchesStatutsIds.Accepte, - }), - }, - RENDRE_AVIS_ONF_DEFAVORABLE: { - target: 'notificationDuDemandeurApresAvisONFDefavorableAFaire', - actions: assign({ - demarcheStatut: DemarchesStatutsIds.Rejete, - }), - }, - }, - }, - receptionInformationAvisONFAFaire: { + avisDesServicesEtCommissionsConsultativesARendre: { on: { - RECEVOIR_INFORMATION_AVIS_ONF: 'demandeAvisONFAFaire', - RENDRE_AVIS_ONF_FAVORABLE: { + RENDRE_AVIS_DES_SERVICES_ET_COMMISSIONS_CONSULTATIVES: { target: 'avenantARMAFaire', actions: assign({ demarcheStatut: DemarchesStatutsIds.Accepte, }), }, - RENDRE_AVIS_ONF_DEFAVORABLE: { - target: 'notificationDuDemandeurApresAvisONFDefavorableAFaire', - actions: assign({ - demarcheStatut: DemarchesStatutsIds.Rejete, - }), - }, }, }, avenantARMAFaire: { @@ -213,11 +164,6 @@ const armRenProMachine = createMachine({ notificationAvenantARMAFaire: { on: { NOTIFIER_AVENANT_ARM: 'avenantARMAFaire' }, }, - notificationDuDemandeurApresAvisONFDefavorableAFaire: { - on: { - NOTIFIER_DEMANDEUR_APRES_AVIS_ONF_DEFAVORABLE: 'done', - }, - }, notificationDuDemandeurApresClassementSansSuiteAFaire: { on: { NOTIFIER_DEMANDEUR_APRES_CLASSEMENT_SANS_SUITE: 'done' }, }, diff --git a/packages/api/src/business/rules-demarches/arm/ren.cas.json b/packages/api/src/business/rules-demarches/arm/ren.cas.json index a2ee7b307..c37370ef2 100644 --- a/packages/api/src/business/rules-demarches/arm/ren.cas.json +++ b/packages/api/src/business/rules-demarches/arm/ren.cas.json @@ -1 +1 @@ -[{"id":0,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-06-16","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-06-16","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-06-16","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-06-16","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-06-16","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-06-16","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2021-06-16","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":1,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-04-18","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-04-18","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-04-18","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-04-18","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-04-18","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-04-18","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":2,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-06-11","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-06-11","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-11","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-06-17","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-06-17","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-06-17","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":3,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-11-04","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-11-04","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-11-04","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-11-04","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-11-04","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-12-09","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":4,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-01-18","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-01-18","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-01-18","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-01-18","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-01-21","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-01-21","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2021-01-21","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":5,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-01-03","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-01-03","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-01-06","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-01-06","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-01-06","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-01-06","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":6,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-12-05","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-12-05","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-12-05","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-12-13","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-12-13","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-12-13","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2020-12-31","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":7,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-06-17","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-06-17","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-17","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-06-18","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-06-19","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-06-23","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2020-06-23","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":8,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-12-24","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-12-24","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-12-24","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-12-26","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-12-26","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-12-26","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2021-01-09","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":9,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-04-14","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-04-24","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-04-24","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-04-24","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-04-24","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-04-26","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2020-04-26","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":10,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-06-06","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-06-06","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-06-06","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-06-06","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-06-06","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-06-06","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2021-06-06","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":11,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-08-19","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-08-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-08-19","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-08-19","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-08-19","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-08-19","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":12,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-05-15","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-05-15","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-05-18","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-05-18","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-06-11","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-06-11","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":13,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-12-05","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-12-05","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-12-05","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-12-13","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-12-13","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-12-13","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2020-12-30","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":14,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-05-03","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-05-03","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-05-03","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-05-03","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-05-03","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-05-04","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2021-05-04","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":15,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-03-17","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-03-18","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-03-18","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-03-18","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-03-18","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-03-18","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2021-03-24","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":16,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-06-23","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-06-23","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-23","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-06-23","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-06-23","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-06-29","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2020-06-29","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":17,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-06-01","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-06-01","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-01","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-06-07","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-06-07","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-06-08","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2020-06-08","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":18,"demarcheStatutId":"eco","demarchePublique":false,"etapes":[]},{"id":19,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-04-05","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-04-05","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-04-05","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-04-15","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-04-15","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-04-15","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2020-05-11","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":20,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2020-06-13","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-06-13","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-26","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":21,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-06-12","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-06-12","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-06-12","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-06-12","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-06-12","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-06-12","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2021-06-12","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":22,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-11-14","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-11-14","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-12-19","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-12-19","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-12-19","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-12-19","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":23,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-01-01","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-01-01","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-01-05","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-01-05","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-01-05","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-01-05","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2021-01-05","etapeTypeId":"mnv","etapeStatutId":"fai"},{"date":"2021-07-19","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":24,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-04-08","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-04-08","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-04-08","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-04-08","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-04-08","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-04-08","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":25,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-06-23","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-06-23","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-23","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-06-23","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-06-23","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-06-30","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2020-06-30","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":26,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-04-15","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-04-15","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-04-15","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-04-15","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2021-04-15","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-04-15","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":27,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-06-07","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-06-07","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-07","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-06-07","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-06-14","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-06-14","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2020-06-14","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":28,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-06-05","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-06-05","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-05","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-06-05","etapeTypeId":"eof","etapeStatutId":"fai"},{"date":"2020-06-05","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2020-06-10","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2020-06-10","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":29,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2020-03-06","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-03-17","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-03-03","etapeTypeId":"des","etapeStatutId":"fai"}]}] +[{"id":0,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-06-16","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-06-16","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-06-16","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-06-16","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-06-16","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2021-06-16","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":1,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-04-18","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-04-18","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-04-18","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-04-18","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-04-18","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":2,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-06-11","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-06-11","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-11","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-06-17","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-06-17","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":3,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-11-04","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-11-04","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-11-04","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-11-04","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-12-09","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":4,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-01-18","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-01-18","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-01-18","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-01-18","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-01-21","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2021-01-21","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":5,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-01-03","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-01-03","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-01-06","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-01-06","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-01-06","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":6,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-12-05","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2020-12-05","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-12-05","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-12-13","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-12-13","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2020-12-31","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":7,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-06-17","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-06-17","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-17","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-06-18","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-06-23","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2020-06-23","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":8,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-12-24","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-12-24","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-12-24","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-12-26","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-12-26","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2021-01-09","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":9,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-04-14","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-04-24","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-04-24","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-04-24","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-04-26","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2020-04-26","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":10,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-06-06","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-06-06","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-06-06","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-06-06","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-06-06","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2021-06-06","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":11,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-08-19","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-08-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-08-19","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-08-19","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-08-19","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":12,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-05-15","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-05-15","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-05-18","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-05-18","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-06-11","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":13,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-12-05","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-12-05","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-12-05","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-12-13","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-12-13","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2020-12-30","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":14,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-05-03","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-05-03","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-05-03","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-05-03","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-05-04","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2021-05-04","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":15,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-03-17","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-03-18","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-03-18","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-03-18","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-03-18","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2021-03-24","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":16,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-06-23","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-06-23","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-23","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-06-23","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-06-29","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2020-06-29","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":17,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-06-01","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-06-01","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-01","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-06-07","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-06-08","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2020-06-08","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":18,"demarcheStatutId":"eco","demarchePublique":false,"etapes":[]},{"id":19,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-04-05","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-04-05","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-04-05","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-04-15","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-04-15","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2020-05-11","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":20,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2020-06-13","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-06-13","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-26","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":21,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-06-12","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-06-12","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-06-12","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-06-12","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-06-12","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2021-06-12","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":22,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-11-14","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-11-14","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-12-19","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-12-19","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-12-19","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":23,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-01-01","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-01-01","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-01-05","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-01-05","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-01-05","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2021-01-05","etapeTypeId":"mnv","etapeStatutId":"fai"},{"date":"2021-07-19","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":24,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-04-08","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-04-08","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-04-08","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-04-08","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-04-08","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":25,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-06-23","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-06-23","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-23","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-06-23","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-06-30","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2020-06-30","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":26,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-04-15","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-04-15","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-04-15","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-04-15","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-04-15","etapeTypeId":"aco","etapeStatutId":"fai"}]},{"id":27,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-06-07","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-06-07","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-07","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-06-07","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-06-14","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2020-06-14","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":28,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-06-05","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-06-05","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-06-05","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-06-05","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-06-10","etapeTypeId":"aco","etapeStatutId":"fai"},{"date":"2020-06-10","etapeTypeId":"mnv","etapeStatutId":"fai"}]},{"id":29,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2020-03-06","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-03-17","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-03-03","etapeTypeId":"des","etapeStatutId":"fai"}]}] diff --git a/packages/api/src/business/rules-demarches/axm/oct.cas.json b/packages/api/src/business/rules-demarches/axm/oct.cas.json index a7f733b48..4c1df6ef7 100644 --- a/packages/api/src/business/rules-demarches/axm/oct.cas.json +++ b/packages/api/src/business/rules-demarches/axm/oct.cas.json @@ -1 +1 @@ -[{"id":0,"demarcheStatutId":"ins","demarchePublique":true,"etapes":[{"date":"2021-03-31","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-06-19","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-03-08","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-03-22","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-10-23","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-10-23","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2022-10-23","etapeTypeId":"afp","etapeStatutId":"fav"},{"date":"2022-10-23","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-10-25","etapeTypeId":"ars","etapeStatutId":"fav"},{"date":"2022-11-01","etapeTypeId":"aac","etapeStatutId":"fav"},{"date":"2022-11-05","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2022-11-21","etapeTypeId":"agn","etapeStatutId":"fav"},{"date":"2022-11-26","etapeTypeId":"apd","etapeStatutId":"fre"},{"date":"2022-11-26","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-12-04","etapeTypeId":"apo","etapeStatutId":"ajo"}]},{"id":1,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-03-28","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-06-16","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-03-05","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-03-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-10-20","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-10-20","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2022-10-20","etapeTypeId":"afp","etapeStatutId":"fav"},{"date":"2022-10-20","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-10-22","etapeTypeId":"ars","etapeStatutId":"fav"},{"date":"2022-10-29","etapeTypeId":"aac","etapeStatutId":"fav"},{"date":"2022-11-02","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2022-11-18","etapeTypeId":"agn","etapeStatutId":"fav"},{"date":"2022-11-23","etapeTypeId":"apd","etapeStatutId":"fre"},{"date":"2022-11-23","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-12-01","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-12-11","etapeTypeId":"dex","etapeStatutId":"acc"},{"date":"2022-12-15","etapeTypeId":"mno","etapeStatutId":"fai"}]},{"id":2,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-09-26","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2020-10-03","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-01-06","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-01-09","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-05-29","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-06-03","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2022-06-03","etapeTypeId":"afp","etapeStatutId":"fre"},{"date":"2022-06-03","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-06-05","etapeTypeId":"aac","etapeStatutId":"fav"},{"date":"2022-06-11","etapeTypeId":"ars","etapeStatutId":"fav"},{"date":"2022-06-20","etapeTypeId":"ass","etapeStatutId":"fav"},{"date":"2022-06-27","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2022-06-30","etapeTypeId":"agn","etapeStatutId":"fav"},{"date":"2022-07-25","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-09-01","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-09-10","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-09-19","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":3,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2021-07-22","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-10-28","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-10-29","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-10-29","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":4,"demarcheStatutId":"eco","demarchePublique":false,"etapes":[{"date":"2021-01-01","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-01-14","etapeTypeId":"dae","etapeStatutId":"exe"}]},{"id":5,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2022-11-26","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-12-10","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2023-01-02","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2023-01-02","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":6,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-03-20","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-06-08","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-06-10","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-06-10","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-09-03","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-09-29","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-10-13","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-10-13","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-10-13","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2021-10-29","etapeTypeId":"agn","etapeStatutId":"def"},{"date":"2021-11-03","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2021-11-18","etapeTypeId":"apd","etapeStatutId":"def"},{"date":"2021-12-09","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2021-12-17","etapeTypeId":"apo","etapeStatutId":"def"},{"date":"2022-01-11","etapeTypeId":"dex","etapeStatutId":"rej"}]},{"id":7,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2021-06-12","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-06-27","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-07-01","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-07-08","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-01-21","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":8,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-07-10","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-07-13","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-08-19","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2020-10-05","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-04-05","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-05-11","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-05-16","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-05-16","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-05-16","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2021-05-17","etapeTypeId":"afp","etapeStatutId":"fre"},{"date":"2021-05-19","etapeTypeId":"aac","etapeStatutId":"fav"},{"date":"2021-05-30","etapeTypeId":"aof","etapeStatutId":"fre"},{"date":"2021-05-31","etapeTypeId":"ass","etapeStatutId":"fav"},{"date":"2021-06-05","etapeTypeId":"agn","etapeStatutId":"fav"},{"date":"2021-07-28","etapeTypeId":"cps","etapeStatutId":"fav"},{"date":"2021-07-28","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2021-08-23","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2021-09-08","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2021-09-11","etapeTypeId":"sas","etapeStatutId":"fai"},{"date":"2021-10-23","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":9,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-07-21","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-07-24","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-08-30","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2020-10-16","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-04-16","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-05-22","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-05-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-05-27","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-05-27","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2021-05-28","etapeTypeId":"afp","etapeStatutId":"fre"},{"date":"2021-05-30","etapeTypeId":"aac","etapeStatutId":"fav"},{"date":"2021-06-10","etapeTypeId":"aof","etapeStatutId":"fre"},{"date":"2021-06-11","etapeTypeId":"ass","etapeStatutId":"fav"},{"date":"2021-06-16","etapeTypeId":"agn","etapeStatutId":"fav"},{"date":"2021-08-08","etapeTypeId":"cps","etapeStatutId":"fav"},{"date":"2021-08-08","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2021-09-03","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2021-09-19","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2021-09-22","etapeTypeId":"sas","etapeStatutId":"fai"},{"date":"2021-11-03","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":10,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-07-05","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-07-08","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-08-14","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2020-09-30","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-03-31","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-05-06","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-05-11","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-05-11","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-05-11","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2021-05-12","etapeTypeId":"afp","etapeStatutId":"fre"},{"date":"2021-05-14","etapeTypeId":"aac","etapeStatutId":"fav"},{"date":"2021-05-25","etapeTypeId":"aof","etapeStatutId":"fre"},{"date":"2021-05-26","etapeTypeId":"ass","etapeStatutId":"fav"},{"date":"2021-05-31","etapeTypeId":"agn","etapeStatutId":"fav"},{"date":"2021-07-23","etapeTypeId":"cps","etapeStatutId":"fav"},{"date":"2021-07-23","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2021-08-18","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2021-09-03","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2021-09-06","etapeTypeId":"sas","etapeStatutId":"fai"},{"date":"2021-10-18","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":11,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2019-08-16","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-01-05","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-02-18","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-02-18","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-07-20","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-07-22","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-07-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-07-27","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-07-27","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2021-07-27","etapeTypeId":"afp","etapeStatutId":"fav"},{"date":"2021-07-30","etapeTypeId":"auc","etapeStatutId":"fav"},{"date":"2021-07-30","etapeTypeId":"aof","etapeStatutId":"fre"},{"date":"2021-09-10","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2021-10-26","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2021-11-05","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2021-11-17","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":12,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-12-20","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-01-10","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-01-12","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-01-14","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-10-15","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-10-15","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-10-15","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2021-10-24","etapeTypeId":"agn","etapeStatutId":"fav"},{"date":"2021-11-01","etapeTypeId":"aof","etapeStatutId":"fre"},{"date":"2021-11-18","etapeTypeId":"ars","etapeStatutId":"fav"},{"date":"2021-11-21","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2021-12-04","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2021-12-12","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-01-06","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":13,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-03-27","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-06-15","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-06-17","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-06-17","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-09-10","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-10-06","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-10-20","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-10-20","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-10-20","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2021-11-05","etapeTypeId":"agn","etapeStatutId":"def"},{"date":"2021-11-10","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2021-11-25","etapeTypeId":"apd","etapeStatutId":"def"},{"date":"2021-12-16","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2021-12-24","etapeTypeId":"apo","etapeStatutId":"def"},{"date":"2022-01-18","etapeTypeId":"dex","etapeStatutId":"rej"}]},{"id":14,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-10-05","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-11-06","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-01-25","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-01-26","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-08-25","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-08-25","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-08-25","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2022-08-26","etapeTypeId":"afp","etapeStatutId":"fav"},{"date":"2022-08-26","etapeTypeId":"aac","etapeStatutId":"fav"},{"date":"2022-08-30","etapeTypeId":"ars","etapeStatutId":"fav"},{"date":"2022-09-07","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2022-09-22","etapeTypeId":"agn","etapeStatutId":"def"},{"date":"2022-10-26","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-11-04","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-11-24","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":15,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2020-10-04","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-11-24","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-12-12","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2020-12-12","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-01-04","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":16,"demarcheStatutId":"eco","demarchePublique":false,"etapes":[{"date":"2021-01-20","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-02-03","etapeTypeId":"dae","etapeStatutId":"exe"}]},{"id":17,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-05-17","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-06-09","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-06-15","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-06-26","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-10-10","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-10-10","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-10-10","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2021-10-25","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2021-11-08","etapeTypeId":"agn","etapeStatutId":"def"},{"date":"2021-11-13","etapeTypeId":"ars","etapeStatutId":"fav"},{"date":"2021-12-28","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-01-16","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-01-26","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-02-20","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":18,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-05-30","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-06-23","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-06-28","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-07-10","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-10-23","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-10-23","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-10-23","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2021-11-07","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2021-11-21","etapeTypeId":"agn","etapeStatutId":"def"},{"date":"2021-11-26","etapeTypeId":"ars","etapeStatutId":"fav"},{"date":"2022-01-10","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-01-29","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-02-08","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-03-05","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":19,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-12-10","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-02-24","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-04-28","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-04-28","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-06-20","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-07-30","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-08-14","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-08-14","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-08-14","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2022-01-13","etapeTypeId":"aec","etapeStatutId":"fav"},{"date":"2022-01-15","etapeTypeId":"afp","etapeStatutId":"fav"},{"date":"2022-01-19","etapeTypeId":"ass","etapeStatutId":"fav"},{"date":"2022-01-20","etapeTypeId":"aac","etapeStatutId":"fav"},{"date":"2022-01-26","etapeTypeId":"agn","etapeStatutId":"def"},{"date":"2022-01-28","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2022-02-24","etapeTypeId":"apd","etapeStatutId":"fre"},{"date":"2022-02-24","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-03-04","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-03-16","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":20,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-10-29","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-06-24","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-07-23","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-07-23","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-12-14","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2022-01-10","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2022-01-24","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-01-24","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-01-24","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2022-01-25","etapeTypeId":"afp","etapeStatutId":"fav"},{"date":"2022-01-27","etapeTypeId":"ass","etapeStatutId":"fav"},{"date":"2022-02-08","etapeTypeId":"aac","etapeStatutId":"fav"},{"date":"2022-02-14","etapeTypeId":"agn","etapeStatutId":"def"},{"date":"2022-02-21","etapeTypeId":"ars","etapeStatutId":"fav"},{"date":"2022-03-15","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-03-15","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-03-23","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-04-04","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":21,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-11-27","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-03-04","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-06-11","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-06-11","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-08-26","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-09-09","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-09-30","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-09-30","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-09-30","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2021-10-01","etapeTypeId":"afp","etapeStatutId":"fav"},{"date":"2021-10-13","etapeTypeId":"aac","etapeStatutId":"fav"},{"date":"2021-10-22","etapeTypeId":"auc","etapeStatutId":"fav"},{"date":"2021-10-22","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2021-10-29","etapeTypeId":"ars","etapeStatutId":"fav"},{"date":"2021-10-29","etapeTypeId":"agn","etapeStatutId":"fav"},{"date":"2021-11-03","etapeTypeId":"abs","etapeStatutId":"dre"},{"date":"2022-01-30","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-02-10","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-02-18","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-03-02","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":22,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-06-07","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-09-24","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-11-06","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-11-06","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-02-11","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-02-11","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-02-11","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2022-02-18","etapeTypeId":"afp","etapeStatutId":"fre"},{"date":"2022-02-18","etapeTypeId":"ass","etapeStatutId":"fre"},{"date":"2022-02-22","etapeTypeId":"aac","etapeStatutId":"fav"},{"date":"2022-03-15","etapeTypeId":"aof","etapeStatutId":"fre"},{"date":"2022-03-20","etapeTypeId":"agn","etapeStatutId":"fav"},{"date":"2022-03-26","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-03-26","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-04-05","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-04-25","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":23,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-09-29","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-11-26","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-03-30","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-03-30","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-08-22","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-09-16","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-11-01","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-11-01","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-11-01","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2021-11-02","etapeTypeId":"afp","etapeStatutId":"fav"},{"date":"2021-11-07","etapeTypeId":"aac","etapeStatutId":"fav"},{"date":"2021-11-08","etapeTypeId":"auc","etapeStatutId":"fav"},{"date":"2021-11-11","etapeTypeId":"aof","etapeStatutId":"fre"},{"date":"2021-11-24","etapeTypeId":"agn","etapeStatutId":"def"},{"date":"2021-12-06","etapeTypeId":"ars","etapeStatutId":"fav"},{"date":"2022-01-09","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-03-28","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-04-07","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-04-21","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":24,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-10-01","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2020-11-27","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-02-22","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-02-22","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-06-15","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2022-06-25","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2022-07-20","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-11-24","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2022-11-24","etapeTypeId":"afp","etapeStatutId":"fav"},{"date":"2022-11-24","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-11-25","etapeTypeId":"ars","etapeStatutId":"fav"},{"date":"2022-12-01","etapeTypeId":"aac","etapeStatutId":"fav"},{"date":"2022-12-12","etapeTypeId":"ass","etapeStatutId":"fav"},{"date":"2022-12-16","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2022-12-22","etapeTypeId":"agn","etapeStatutId":"def"},{"date":"2022-12-23","etapeTypeId":"ama","etapeStatutId":"fav"},{"date":"2023-01-05","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2023-02-01","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2023-02-15","etapeTypeId":"dex","etapeStatutId":"acc"},{"date":"2023-02-16","etapeTypeId":"mno","etapeStatutId":"fai"}]},{"id":25,"demarcheStatutId":"ins","demarchePublique":true,"etapes":[{"date":"2022-04-26","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-06-16","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-06-23","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-06-23","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2023-01-05","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2023-01-19","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2023-02-16","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2023-02-16","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2023-02-16","etapeTypeId":"afp","etapeStatutId":"fav"},{"date":"2023-03-06","etapeTypeId":"abs","etapeStatutId":"def"},{"date":"2023-03-09","etapeTypeId":"ars","etapeStatutId":"def"},{"date":"2023-03-10","etapeTypeId":"aac","etapeStatutId":"fav"},{"date":"2023-03-14","etapeTypeId":"aof","etapeStatutId":"fre"}]},{"id":26,"demarcheStatutId":"ins","demarchePublique":true,"etapes":[{"date":"2022-04-11","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-06-01","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-06-08","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-06-08","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-12-21","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2023-01-04","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2023-02-01","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2023-02-01","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2023-02-01","etapeTypeId":"afp","etapeStatutId":"fav"},{"date":"2023-02-19","etapeTypeId":"abs","etapeStatutId":"def"},{"date":"2023-02-22","etapeTypeId":"ars","etapeStatutId":"def"},{"date":"2023-02-23","etapeTypeId":"aac","etapeStatutId":"fav"},{"date":"2023-02-27","etapeTypeId":"aof","etapeStatutId":"fre"}]},{"id":27,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2022-04-26","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-04-29","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-07-02","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-07-02","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":28,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2022-04-17","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-04-20","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-06-23","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-06-23","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":29,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-06-05","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-06-27","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-08-21","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-08-21","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-12-30","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2022-03-07","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2022-03-18","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-03-18","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-03-18","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2022-03-19","etapeTypeId":"aec","etapeStatutId":"fav"},{"date":"2022-03-19","etapeTypeId":"aac","etapeStatutId":"fav"},{"date":"2022-03-19","etapeTypeId":"afp","etapeStatutId":"fav"},{"date":"2022-03-31","etapeTypeId":"ass","etapeStatutId":"fav"},{"date":"2022-04-08","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2022-04-09","etapeTypeId":"agn","etapeStatutId":"def"},{"date":"2022-06-16","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-06-16","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-06-25","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-07-07","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":30,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2022-01-24","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-07-07","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-08-10","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-08-11","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":31,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2022-01-26","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-07-08","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-08-11","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-08-12","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":32,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-07-24","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-08-30","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-11-22","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-11-22","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-05-17","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2022-06-07","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2022-06-26","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-06-26","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2022-06-26","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-06-27","etapeTypeId":"afp","etapeStatutId":"fre"},{"date":"2022-07-13","etapeTypeId":"ars","etapeStatutId":"fav"},{"date":"2022-07-17","etapeTypeId":"agn","etapeStatutId":"def"},{"date":"2022-07-20","etapeTypeId":"aof","etapeStatutId":"fre"},{"date":"2022-07-26","etapeTypeId":"abs","etapeStatutId":"fre"},{"date":"2022-07-31","etapeTypeId":"aac","etapeStatutId":"fav"},{"date":"2022-09-10","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-09-10","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-09-19","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-09-28","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":33,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2020-09-23","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2020-09-30","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-11-09","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-11-09","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-05-26","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-07-08","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-07-13","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-07-13","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2021-07-13","etapeTypeId":"afp","etapeStatutId":"def"},{"date":"2021-11-22","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":34,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2022-06-02","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-10-02","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-12-09","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-12-09","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":35,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2022-11-26","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-12-10","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-12-21","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2023-12-21","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":36,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2022-07-27","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-10-26","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-12-21","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-12-21","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":37,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2021-01-19","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-01-30","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-04-18","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-06-21","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":38,"demarcheStatutId":"eco","demarchePublique":false,"etapes":[{"date":"2022-07-23","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-10-18","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-11-21","etapeTypeId":"mfr","etapeStatutId":"fai"}]},{"id":39,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2021-06-07","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-10-07","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-10-14","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-10-14","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":40,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2021-06-22","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-10-22","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-10-29","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-10-29","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":41,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2022-11-25","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-12-05","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2023-01-16","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2023-01-16","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":42,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-01-18","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-03-18","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-05-02","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-05-02","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-09-06","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-09-19","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-09-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-09-27","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-09-27","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2021-09-27","etapeTypeId":"afp","etapeStatutId":"fav"},{"date":"2021-10-10","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2021-10-14","etapeTypeId":"agn","etapeStatutId":"def"},{"date":"2021-10-27","etapeTypeId":"ama","etapeStatutId":"fav"},{"date":"2021-10-27","etapeTypeId":"ars","etapeStatutId":"fav"},{"date":"2021-11-04","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2021-12-11","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2021-12-19","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-01-22","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":43,"demarcheStatutId":"eco","demarchePublique":false,"etapes":[]},{"id":44,"demarcheStatutId":"eco","demarchePublique":false,"etapes":[]},{"id":45,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-12-28","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-03-27","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-07-04","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-07-04","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-02-19","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-02-19","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-02-19","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2022-02-19","etapeTypeId":"ass","etapeStatutId":"fav"},{"date":"2022-02-28","etapeTypeId":"aec","etapeStatutId":"fav"},{"date":"2022-03-12","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2022-03-21","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-04-02","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-04-12","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-04-26","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":46,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-12-29","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-03-28","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-07-05","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-07-05","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-12-05","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-12-06","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2022-02-20","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-02-20","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-02-20","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2022-02-20","etapeTypeId":"ass","etapeStatutId":"fav"},{"date":"2022-03-01","etapeTypeId":"aec","etapeStatutId":"fav"},{"date":"2022-03-13","etapeTypeId":"aof","etapeStatutId":"fav"},{"date":"2022-03-22","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-04-03","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-04-13","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-04-27","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":47,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-02-03","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-02-17","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-05-03","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-05-03","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-11-29","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-02-09","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-02-09","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2022-02-10","etapeTypeId":"afp","etapeStatutId":"fav"},{"date":"2022-02-13","etapeTypeId":"aac","etapeStatutId":"fav"},{"date":"2022-02-13","etapeTypeId":"agn","etapeStatutId":"fav"},{"date":"2022-02-23","etapeTypeId":"aof","etapeStatutId":"fre"},{"date":"2022-03-13","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-04-11","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-04-21","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-05-05","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":48,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-03-30","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-04-25","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-06-05","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-06-05","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-09-10","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-10-17","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-11-12","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-11-12","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-11-12","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2021-11-13","etapeTypeId":"aac","etapeStatutId":"fav"},{"date":"2021-11-13","etapeTypeId":"afp","etapeStatutId":"fav"},{"date":"2021-11-20","etapeTypeId":"auc","etapeStatutId":"fav"},{"date":"2021-11-21","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2021-12-06","etapeTypeId":"agn","etapeStatutId":"def"},{"date":"2021-12-12","etapeTypeId":"ars","etapeStatutId":"fav"},{"date":"2022-03-12","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-05-13","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-05-15","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-05-29","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":49,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-03-07","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-04-18","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-06-11","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-06-11","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-08-24","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-11-25","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-12-31","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-12-31","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-12-31","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2022-01-01","etapeTypeId":"afp","etapeStatutId":"fav"},{"date":"2022-01-03","etapeTypeId":"aec","etapeStatutId":"fav"},{"date":"2022-01-14","etapeTypeId":"ass","etapeStatutId":"fav"},{"date":"2022-01-15","etapeTypeId":"aac","etapeStatutId":"fav"},{"date":"2022-01-17","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2022-01-17","etapeTypeId":"agn","etapeStatutId":"def"},{"date":"2022-01-31","etapeTypeId":"ars","etapeStatutId":"fav"},{"date":"2022-04-15","etapeTypeId":"apd","etapeStatutId":"def"},{"date":"2022-04-22","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-04-24","etapeTypeId":"apo","etapeStatutId":"def"},{"date":"2022-05-08","etapeTypeId":"dex","etapeStatutId":"rej"}]},{"id":50,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-02-01","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-10-09","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-03-13","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-03-13","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-08-26","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-09-26","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-11-18","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-11-18","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-11-18","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2021-11-19","etapeTypeId":"afp","etapeStatutId":"def"},{"date":"2021-11-24","etapeTypeId":"aac","etapeStatutId":"fav"},{"date":"2021-11-25","etapeTypeId":"auc","etapeStatutId":"fav"},{"date":"2021-12-02","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2021-12-05","etapeTypeId":"ars","etapeStatutId":"fav"},{"date":"2021-12-11","etapeTypeId":"agn","etapeStatutId":"fav"},{"date":"2022-05-11","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-05-18","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-05-20","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-06-03","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":51,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-06-27","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-07-14","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-08-04","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-08-04","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-02-28","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2022-03-15","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2022-03-31","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-03-31","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-03-31","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2022-04-04","etapeTypeId":"aac","etapeStatutId":"fav"},{"date":"2022-04-11","etapeTypeId":"ars","etapeStatutId":"fav"},{"date":"2022-04-18","etapeTypeId":"afp","etapeStatutId":"fav"},{"date":"2022-04-26","etapeTypeId":"aof","etapeStatutId":"fre"},{"date":"2022-04-26","etapeTypeId":"agn","etapeStatutId":"def"},{"date":"2022-05-09","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-05-22","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-05-31","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-06-12","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":52,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2021-12-17","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-03-16","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-03-23","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-03-26","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-12-06","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2023-02-28","etapeTypeId":"rca","etapeStatutId":"fai"}]},{"id":53,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-03-15","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-04-02","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-04-03","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-04-13","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-11-28","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2022-12-07","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2022-12-21","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-12-21","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-12-21","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2022-12-25","etapeTypeId":"afp","etapeStatutId":"fav"},{"date":"2022-12-27","etapeTypeId":"aac","etapeStatutId":"fav"},{"date":"2023-01-02","etapeTypeId":"ars","etapeStatutId":"fav"},{"date":"2023-01-09","etapeTypeId":"agn","etapeStatutId":"fav"},{"date":"2023-01-15","etapeTypeId":"aof","etapeStatutId":"def"},{"date":"2023-01-18","etapeTypeId":"abs","etapeStatutId":"def"},{"date":"2023-03-04","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2023-03-21","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2023-04-03","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":54,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2022-10-08","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2023-04-03","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2023-04-03","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2023-04-03","etapeTypeId":"mdp","etapeStatutId":"fai"}]}] +[{"id":0,"demarcheStatutId":"ins","demarchePublique":true,"etapes":[{"date":"2021-03-31","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-06-19","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-03-08","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-03-22","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-10-23","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-10-23","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-10-23","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-11-26","etapeTypeId":"apd","etapeStatutId":"fre"},{"date":"2022-11-26","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-12-04","etapeTypeId":"apo","etapeStatutId":"ajo"}]},{"id":1,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-03-28","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-06-16","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-03-05","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-03-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-10-20","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-10-20","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-10-20","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-11-23","etapeTypeId":"apd","etapeStatutId":"fre"},{"date":"2022-11-23","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-12-01","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-12-11","etapeTypeId":"dex","etapeStatutId":"acc"},{"date":"2022-12-15","etapeTypeId":"mno","etapeStatutId":"fai"}]},{"id":2,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-09-26","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2020-10-03","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-01-06","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-01-09","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-05-29","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-06-03","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-06-03","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-07-25","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-09-01","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-09-10","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-09-19","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":3,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2021-07-22","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-10-28","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-10-29","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-10-29","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":4,"demarcheStatutId":"eco","demarchePublique":false,"etapes":[{"date":"2021-01-01","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-01-14","etapeTypeId":"dae","etapeStatutId":"exe"}]},{"id":5,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2022-11-26","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-12-10","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2023-01-02","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2023-01-02","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":6,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-03-20","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-06-08","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-06-10","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-06-10","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-09-03","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-09-29","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-10-13","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-10-13","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-10-13","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-11-18","etapeTypeId":"apd","etapeStatutId":"def"},{"date":"2021-12-09","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2021-12-17","etapeTypeId":"apo","etapeStatutId":"def"},{"date":"2022-01-11","etapeTypeId":"dex","etapeStatutId":"rej"}]},{"id":7,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2021-06-12","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-06-27","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-07-01","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-07-08","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-01-21","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":8,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-07-10","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-07-13","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-08-19","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2020-10-05","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-04-05","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-05-11","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-05-16","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-05-16","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-05-16","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-07-28","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2021-08-23","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2021-09-08","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2021-09-11","etapeTypeId":"sas","etapeStatutId":"fai"},{"date":"2021-10-23","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":9,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-07-21","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-07-24","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-08-30","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2020-10-16","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-04-16","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-05-22","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-05-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-05-27","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-05-27","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-08-08","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2021-09-03","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2021-09-19","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2021-09-22","etapeTypeId":"sas","etapeStatutId":"fai"},{"date":"2021-11-03","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":10,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-07-05","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-07-08","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-08-14","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2020-09-30","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-03-31","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-05-06","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-05-11","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-05-11","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-05-11","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-07-23","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2021-08-18","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2021-09-03","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2021-09-06","etapeTypeId":"sas","etapeStatutId":"fai"},{"date":"2021-10-18","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":11,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2019-08-16","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-01-05","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-02-18","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-02-18","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-07-20","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-07-22","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-07-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-07-27","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-07-27","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-09-10","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2021-10-26","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2021-11-05","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2021-11-17","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":12,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-12-20","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-01-10","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-01-12","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-01-14","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-10-15","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-10-15","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-10-15","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-11-21","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2021-12-04","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2021-12-12","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-01-06","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":13,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-03-27","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-06-15","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-06-17","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-06-17","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-09-10","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-10-06","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-10-20","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-10-20","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-10-20","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-11-25","etapeTypeId":"apd","etapeStatutId":"def"},{"date":"2021-12-16","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2021-12-24","etapeTypeId":"apo","etapeStatutId":"def"},{"date":"2022-01-18","etapeTypeId":"dex","etapeStatutId":"rej"}]},{"id":14,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-10-05","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-11-06","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-01-25","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-01-26","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-08-25","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-08-25","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-08-25","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-10-26","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-11-04","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-11-24","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":15,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2020-10-04","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-11-24","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-12-12","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2020-12-12","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-01-04","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":16,"demarcheStatutId":"eco","demarchePublique":false,"etapes":[{"date":"2021-01-20","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-02-03","etapeTypeId":"dae","etapeStatutId":"exe"}]},{"id":17,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-05-17","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-06-09","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-06-15","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-06-26","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-10-10","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-10-10","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-10-10","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-12-28","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-01-16","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-01-26","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-02-20","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":18,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-05-30","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-06-23","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-06-28","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-07-10","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-10-23","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-10-23","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-10-23","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-01-10","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-01-29","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-02-08","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-03-05","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":19,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-12-10","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-02-24","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-04-28","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-04-28","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-06-20","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-07-30","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-08-14","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-08-14","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-08-14","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-02-24","etapeTypeId":"apd","etapeStatutId":"fre"},{"date":"2022-02-24","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-03-04","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-03-16","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":20,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-10-29","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-06-24","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-07-23","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-07-23","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-12-14","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2022-01-10","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2022-01-24","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-01-24","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-01-24","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-03-15","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-03-15","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-03-23","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-04-04","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":21,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-11-27","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-03-04","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-06-11","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-06-11","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-08-26","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-09-09","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-09-30","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-09-30","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-09-30","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-01-30","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-02-10","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-02-18","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-03-02","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":22,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-06-07","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-09-24","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-11-06","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-11-06","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-02-11","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-02-11","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-02-11","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-03-26","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-03-26","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-04-05","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-04-25","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":23,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-09-29","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-11-26","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-03-30","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-03-30","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-08-22","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-09-16","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-11-01","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-11-01","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-11-01","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-01-09","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-03-28","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-04-07","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-04-21","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":24,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-10-01","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2020-11-27","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-02-22","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-02-22","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-06-15","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2022-06-25","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2022-07-20","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-11-24","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-11-24","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-12-23","etapeTypeId":"ama","etapeStatutId":"fav"},{"date":"2023-01-05","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2023-02-01","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2023-02-15","etapeTypeId":"dex","etapeStatutId":"acc"},{"date":"2023-02-16","etapeTypeId":"mno","etapeStatutId":"fai"}]},{"id":25,"demarcheStatutId":"ins","demarchePublique":true,"etapes":[{"date":"2022-04-26","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-06-16","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-06-23","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-06-23","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2023-01-05","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2023-01-19","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2023-02-16","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2023-02-16","etapeTypeId":"asc","etapeStatutId":"fai"}]},{"id":26,"demarcheStatutId":"ins","demarchePublique":true,"etapes":[{"date":"2022-04-11","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-06-01","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-06-08","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-06-08","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-12-21","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2023-01-04","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2023-02-01","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2023-02-01","etapeTypeId":"asc","etapeStatutId":"fai"}]},{"id":27,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2022-04-26","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-04-29","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-07-02","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-07-02","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":28,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2022-04-17","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-04-20","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-06-23","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-06-23","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":29,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-06-05","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-06-27","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-08-21","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-08-21","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-12-30","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2022-03-07","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2022-03-18","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-03-18","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-03-18","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-06-16","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-06-16","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-06-25","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-07-07","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":30,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2022-01-24","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-07-07","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-08-10","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-08-11","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":31,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2022-01-26","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-07-08","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-08-11","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-08-12","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":32,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-07-24","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-08-30","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-11-22","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-11-22","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-05-17","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2022-06-07","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2022-06-26","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-06-26","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-06-26","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-09-10","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-09-10","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-09-19","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-09-28","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":33,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2020-09-23","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2020-09-30","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-11-09","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-11-09","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-05-26","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-07-08","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-07-13","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-07-13","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-11-22","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":34,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2022-06-02","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-10-02","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-12-09","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-12-09","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":35,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2022-11-26","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-12-10","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-12-21","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2023-12-21","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":36,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2022-07-27","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-10-26","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-12-21","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-12-21","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":37,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2021-01-19","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-01-30","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-04-18","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-06-21","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":38,"demarcheStatutId":"eco","demarchePublique":false,"etapes":[{"date":"2022-07-23","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-10-18","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-11-21","etapeTypeId":"mfr","etapeStatutId":"fai"}]},{"id":39,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2021-06-07","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-10-07","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-10-14","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-10-14","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":40,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2021-06-22","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-10-22","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-10-29","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-10-29","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":41,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2022-11-25","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-12-05","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2023-01-16","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2023-01-16","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":42,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-01-18","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-03-18","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-05-02","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-05-02","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-09-06","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-09-19","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-09-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-09-27","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-09-27","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-10-27","etapeTypeId":"ama","etapeStatutId":"fav"},{"date":"2021-11-04","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2021-12-11","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2021-12-19","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-01-22","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":43,"demarcheStatutId":"eco","demarchePublique":false,"etapes":[]},{"id":44,"demarcheStatutId":"eco","demarchePublique":false,"etapes":[]},{"id":45,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-12-28","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-03-27","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-07-04","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-07-04","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-02-19","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-02-19","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-02-19","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-03-21","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-04-02","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-04-12","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-04-26","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":46,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-12-29","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-03-28","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-07-05","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-07-05","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-12-05","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-12-06","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2022-02-20","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-02-20","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-02-20","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-03-22","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-04-03","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-04-13","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-04-27","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":47,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-02-03","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-02-17","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-05-03","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-05-03","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-11-29","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-02-09","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-02-09","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-03-13","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-04-11","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-04-21","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-05-05","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":48,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-03-30","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-04-25","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-06-05","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-06-05","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-09-10","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-10-17","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-11-12","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-11-12","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-11-12","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-03-12","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-05-13","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-05-15","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-05-29","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":49,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2021-03-07","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-04-18","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-06-11","etapeTypeId":"mfr","etapeStatutId":"fai","contenu":{"arm":{"mecanise":false}}},{"date":"2021-06-11","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-08-24","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-11-25","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-12-31","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-12-31","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-12-31","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-04-15","etapeTypeId":"apd","etapeStatutId":"def"},{"date":"2022-04-22","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-04-24","etapeTypeId":"apo","etapeStatutId":"def"},{"date":"2022-05-08","etapeTypeId":"dex","etapeStatutId":"rej"}]},{"id":50,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-02-01","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2020-10-09","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-03-13","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-03-13","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-08-26","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-09-26","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2021-11-18","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-11-18","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-11-18","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-05-11","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-05-18","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-05-20","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-06-03","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":51,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2021-06-27","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2021-07-14","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2021-08-04","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-08-04","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-02-28","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2022-03-15","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2022-03-31","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-03-31","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-03-31","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-05-09","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-05-22","etapeTypeId":"spo","etapeStatutId":"fai"},{"date":"2022-05-31","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2022-06-12","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":52,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2021-12-17","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-03-16","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-03-23","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-03-26","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-12-06","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2023-02-28","etapeTypeId":"rca","etapeStatutId":"fai"}]},{"id":53,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-03-15","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2022-04-02","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-04-03","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2022-04-13","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-11-28","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2022-12-07","etapeTypeId":"rca","etapeStatutId":"fai"},{"date":"2022-12-21","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-12-21","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-12-21","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2023-03-04","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2023-03-21","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2023-04-03","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":54,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2022-10-08","etapeTypeId":"dae","etapeStatutId":"exe"},{"date":"2023-04-03","etapeTypeId":"asl","etapeStatutId":"fav"},{"date":"2023-04-03","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2023-04-03","etapeTypeId":"mdp","etapeStatutId":"fai"}]}] diff --git a/packages/api/src/business/rules-demarches/axm/oct.machine.test.ts b/packages/api/src/business/rules-demarches/axm/oct.machine.test.ts index 46d58fc62..5dbfc4082 100644 --- a/packages/api/src/business/rules-demarches/axm/oct.machine.test.ts +++ b/packages/api/src/business/rules-demarches/axm/oct.machine.test.ts @@ -104,7 +104,7 @@ describe('vérifie l’arbre d’octroi d’AXM', () => { ...ETES.saisineDesCollectivitesLocales.FAIT, date: toCaminoDate('2022-04-15'), }, - { ...ETES.saisineDesServices.FAIT, date: toCaminoDate('2022-04-15') }, + { ...ETES.avisDesServicesEtCommissionsConsultatives.FAIT, date: toCaminoDate('2022-04-15') }, { ...ETES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement.FAVORABLE, date: toCaminoDate('2022-06-15'), @@ -139,7 +139,7 @@ describe('vérifie l’arbre d’octroi d’AXM', () => { ...ETES.saisineDesCollectivitesLocales.FAIT, date: toCaminoDate('2022-04-15'), }, - { ...ETES.saisineDesServices.FAIT, date: toCaminoDate('2022-04-15') }, + { ...ETES.avisDesServicesEtCommissionsConsultatives.FAIT, date: toCaminoDate('2022-04-15') }, { ...ETES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement.FAVORABLE, date: toCaminoDate('2022-06-15'), @@ -170,82 +170,6 @@ describe('vérifie l’arbre d’octroi d’AXM', () => { 'RENDRE_DECISION_ADMINISTRATION_REJETE', ]) }) - test('après une saisine des services avec un accord du propriétaire du sol AVEC réserves, la confirmation de l’accord est obligatoire', () => { - const service = orderAndInterpretMachine(axmOctMachine, [ - { ...ETES.demande.FAIT, date: toCaminoDate('2022-04-14') }, - { - ...ETES.decisionDeLaMissionAutoriteEnvironnementale_ExamenAuCasParCasDuProjet_.EXEMPTE, - date: toCaminoDate('2020-01-01'), - }, - { - ...ETES.decisionDuProprietaireDuSol.FAVORABLE_AVEC_RESERVE, - date: toCaminoDate('2020-01-01'), - }, - { ...ETES.depotDeLaDemande.FAIT, date: toCaminoDate('2022-04-15') }, - { - ...ETES.recevabiliteDeLaDemande.FAVORABLE, - date: toCaminoDate('2022-04-15'), - }, - { - ...ETES.saisineDesCollectivitesLocales.FAIT, - date: toCaminoDate('2022-04-15'), - }, - { ...ETES.avisDunMaire.FAVORABLE, date: toCaminoDate('2022-04-15') }, - { ...ETES.saisineDesServices.FAIT, date: toCaminoDate('2022-04-15') }, - { - ...ETES.avisDGTMServiceMilieuxNaturelsBiodiversiteSitesEtPaysages_MNBST_.FAVORABLE, - date: toCaminoDate('2022-04-15'), - }, - { - ...ETES.avisDGTMServiceAmenagementUrbanismeConstructionLogement_AUCL_.FAVORABLE, - date: toCaminoDate('2022-04-16'), - }, - { - ...ETES.avisDeLaDirectionDesEntreprisesDeLaConcurrenceDeLaConsommationDuTravailEtDeLemploi.FAVORABLE, - date: toCaminoDate('2022-04-16'), - }, - { - ...ETES.avisDeLaDirectionDalimentationDeLagricultureEtDeLaForet.FAVORABLE, - date: toCaminoDate('2022-04-16'), - }, - { - ...ETES.avisDeDirectionRegionaleDesAffairesCulturelles.FAVORABLE, - date: toCaminoDate('2022-04-16'), - }, - { - ...ETES.avisDeLagenceRegionaleDeSante.FAVORABLE, - date: toCaminoDate('2022-04-16'), - }, - { - ...ETES.avisDeLaDirectionRegionaleDesFinancesPubliques.FAVORABLE, - date: toCaminoDate('2022-04-16'), - }, - { - ...ETES.avisDeLaCaisseGeneraleDeSecuriteSociale.FAVORABLE, - date: toCaminoDate('2022-04-16'), - }, - { - ...ETES.avisDeLOfficeNationalDesForets.FAVORABLE, - date: toCaminoDate('2022-04-16'), - }, - { - ...ETES.avisDeLetatMajorOrpaillageEtPecheIllicite_EMOPI_.FAVORABLE, - date: toCaminoDate('2022-04-16'), - }, - { - ...ETES.avisDeLaGendarmerieNationale.FAVORABLE, - date: toCaminoDate('2022-04-16'), - }, - ]) - - expect(service).canOnlyTransitionTo({ machine: axmOctMachine, date: toCaminoDate('2022-04-16') }, [ - 'DEMANDER_INFORMATION_POUR_AVIS_DREAL', - 'FAIRE_CLASSEMENT_SANS_SUITE', - 'FAIRE_CONFIRMATION_PROPRIETAIRE_DU_SOL', - 'FAIRE_DESISTEMENT_DEMANDEUR', - 'FAIRE_NOTE_INTERNE_SIGNALEE', - ]) - }) test('ne peut pas faire de note interne signalée avant une demande', () => { const service = orderAndInterpretMachine(axmOctMachine, []) @@ -358,11 +282,7 @@ describe('vérifie l’arbre d’octroi d’AXM', () => { date: toCaminoDate('2022-04-16'), }, { ...ETES.avisDunMaire.FAVORABLE, date: toCaminoDate('2022-04-17') }, - { ...ETES.saisineDesServices.FAIT, date: toCaminoDate('2022-04-18') }, - { - ...ETES.avisDGTMServiceMilieuxNaturelsBiodiversiteSitesEtPaysages_MNBST_.FAVORABLE, - date: toCaminoDate('2022-04-19'), - }, + { ...ETES.avisDesServicesEtCommissionsConsultatives.FAIT, date: toCaminoDate('2022-04-18') }, { ...ETES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement.FAVORABLE, date: toCaminoDate('2022-05-20'), @@ -422,47 +342,23 @@ describe('vérifie l’arbre d’octroi d’AXM', () => { ...ETES.saisineDesCollectivitesLocales.FAIT, date: toCaminoDate('2022-04-16'), }, - { ...ETES.saisineDesServices.FAIT, date: toCaminoDate('2022-04-18') }, + { ...ETES.avisDesServicesEtCommissionsConsultatives.FAIT, date: toCaminoDate('2022-04-18') }, ] const service = orderAndInterpretMachine(axmOctMachine, etapes) expect(service).canOnlyTransitionTo({ machine: axmOctMachine, date: toCaminoDate('2022-05-18') }, [ 'RENDRE_AVIS_DREAL', 'FAIRE_CLASSEMENT_SANS_SUITE', 'DEMANDER_INFORMATION_POUR_AVIS_DREAL', - 'FAIRE_CONFIRMATION_PROPRIETAIRE_DU_SOL', 'FAIRE_DESISTEMENT_DEMANDEUR', 'FAIRE_NOTE_INTERNE_SIGNALEE', - 'RENDRE_AVIS_AGENCE_REGIONALE_SANTE', - 'RENDRE_AVIS_CAISSE_GENERALE_DE_SECURITE_SOCIALE', - 'RENDRE_AVIS_DGTMAUCL', - 'RENDRE_AVIS_DGTM_MNBST', - 'RENDRE_AVIS_DIRECTION_ALIMENTATION_AGRICULTURE_FORET', - 'RENDRE_AVIS_DIRECTION_ENTREPRISE_CONCURRENCE_CONSOMMATION_TRAVAIL_EMPLOI', - 'RENDRE_AVIS_DIRECTION_REGIONALE_AFFAIRES_CULTURELLES', - 'RENDRE_AVIS_DIRECTION_REGIONALE_FINANCES_PUBLIQUES', 'RENDRE_AVIS_DUN_MAIRE', - 'RENDRE_AVIS_ETAT_MAJOR_ORPAILLAGE_ET_PECHE_ILLICITE', - 'RENDRE_AVIS_GENDARMERIE_NATIONALE', - 'RENDRE_AVIS_OFFICE_NATIONAL_DES_FORETS', ]) expect(service).canOnlyTransitionTo({ machine: axmOctMachine, date: toCaminoDate('2022-05-17') }, [ 'FAIRE_CLASSEMENT_SANS_SUITE', 'DEMANDER_INFORMATION_POUR_AVIS_DREAL', - 'FAIRE_CONFIRMATION_PROPRIETAIRE_DU_SOL', 'FAIRE_DESISTEMENT_DEMANDEUR', 'FAIRE_NOTE_INTERNE_SIGNALEE', - 'RENDRE_AVIS_AGENCE_REGIONALE_SANTE', - 'RENDRE_AVIS_CAISSE_GENERALE_DE_SECURITE_SOCIALE', - 'RENDRE_AVIS_DGTMAUCL', - 'RENDRE_AVIS_DGTM_MNBST', - 'RENDRE_AVIS_DIRECTION_ALIMENTATION_AGRICULTURE_FORET', - 'RENDRE_AVIS_DIRECTION_ENTREPRISE_CONCURRENCE_CONSOMMATION_TRAVAIL_EMPLOI', - 'RENDRE_AVIS_DIRECTION_REGIONALE_AFFAIRES_CULTURELLES', - 'RENDRE_AVIS_DIRECTION_REGIONALE_FINANCES_PUBLIQUES', 'RENDRE_AVIS_DUN_MAIRE', - 'RENDRE_AVIS_ETAT_MAJOR_ORPAILLAGE_ET_PECHE_ILLICITE', - 'RENDRE_AVIS_GENDARMERIE_NATIONALE', - 'RENDRE_AVIS_OFFICE_NATIONAL_DES_FORETS', ]) }) diff --git a/packages/api/src/business/rules-demarches/axm/oct.machine.ts b/packages/api/src/business/rules-demarches/axm/oct.machine.ts index 3dc310cd4..c7b371234 100644 --- a/packages/api/src/business/rules-demarches/axm/oct.machine.ts +++ b/packages/api/src/business/rules-demarches/axm/oct.machine.ts @@ -6,9 +6,9 @@ import { DemarchesStatutsIds } from 'camino-common/src/static/demarchesStatuts.j import { ADMINISTRATION_IDS } from 'camino-common/src/static/administrations.js' import { CaminoDate, dateAddMonths, daysBetween } from 'camino-common/src/date.js' -type FaireSaisineDesServices = { +type RendreAvisDesServicesEtCommissionsConsultatives = { date: CaminoDate - type: 'FAIRE_SAISINE_DES_SERVICES' + type: 'RENDRE_AVIS_DES_SERVICES_ET_COMMISSIONS_CONSULTATIVES' } type RendreAvisDreal = { @@ -33,8 +33,7 @@ type AXMOctXStateEvent = | { type: 'FAIRE_SAISINE_COLLECTIVITES_LOCALES' } | { type: 'RENDRE_AVIS_DUN_MAIRE' } | RendreAvisDreal - | FaireSaisineDesServices - | { type: 'RENDRE_AVIS_DGTM_MNBST' } + | RendreAvisDesServicesEtCommissionsConsultatives | { type: 'FAIRE_SAISINE_COMMISSION_DEPARTEMENTALE_DES_MINES' } | { type: 'RENDRE_AVIS_COMMISSION_DEPARTEMENTALE_DES_MINES' } | { type: 'RENDRE_AVIS_COMMISSION_DEPARTEMENTALE_DES_MINES_AJOURNE' } @@ -46,19 +45,6 @@ type AXMOctXStateEvent = | { type: 'PUBLIER_DANS_UN_JOURNAL_LOCAL_OU_NATIONAL' } | { type: 'NOTIFIER_COLLECTIVITES_LOCALES' } | { type: 'RENDRE_DECISION_ABROGATION' } - | { type: 'RENDRE_AVIS_DGTMAUCL' } - | { - type: 'RENDRE_AVIS_DIRECTION_ENTREPRISE_CONCURRENCE_CONSOMMATION_TRAVAIL_EMPLOI' - } - | { type: 'RENDRE_AVIS_DIRECTION_ALIMENTATION_AGRICULTURE_FORET' } - | { type: 'RENDRE_AVIS_DIRECTION_REGIONALE_AFFAIRES_CULTURELLES' } - | { type: 'RENDRE_AVIS_AGENCE_REGIONALE_SANTE' } - | { type: 'RENDRE_AVIS_DIRECTION_REGIONALE_FINANCES_PUBLIQUES' } - | { type: 'RENDRE_AVIS_CAISSE_GENERALE_DE_SECURITE_SOCIALE' } - | { type: 'RENDRE_AVIS_OFFICE_NATIONAL_DES_FORETS' } - | { type: 'RENDRE_AVIS_ETAT_MAJOR_ORPAILLAGE_ET_PECHE_ILLICITE' } - | { type: 'RENDRE_AVIS_GENDARMERIE_NATIONALE' } - | { type: 'FAIRE_CONFIRMATION_PROPRIETAIRE_DU_SOL' } | { type: 'FAIRE_NOTE_INTERNE_SIGNALEE' } | { type: 'DEMANDER_INFORMATION_POUR_AVIS_DREAL' } | { type: 'RECEVOIR_INFORMATION_POUR_AVIS_DREAL' } @@ -148,8 +134,7 @@ const trad: { [key in Event]: { db: DBEtat; mainStep: boolean } } = { FAIRE_SAISINE_COLLECTIVITES_LOCALES: { db: ETES.saisineDesCollectivitesLocales, mainStep: true }, RENDRE_AVIS_DUN_MAIRE: { db: ETES.avisDunMaire, mainStep: false }, RENDRE_AVIS_DREAL: { db: ETES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement, mainStep: true }, - FAIRE_SAISINE_DES_SERVICES: { db: ETES.saisineDesServices, mainStep: true }, - RENDRE_AVIS_DGTM_MNBST: { db: ETES.avisDGTMServiceMilieuxNaturelsBiodiversiteSitesEtPaysages_MNBST_, mainStep: false }, + RENDRE_AVIS_DES_SERVICES_ET_COMMISSIONS_CONSULTATIVES: { db: ETES.avisDesServicesEtCommissionsConsultatives, mainStep: true }, FAIRE_SAISINE_COMMISSION_DEPARTEMENTALE_DES_MINES: { db: ETES.saisineDeLaCommissionDepartementaleDesMines_CDM_, mainStep: false }, FAIRE_SAISINE_AUTORITE_SIGNATAIRE: { db: ETES.saisineDeLautoriteSignataire, mainStep: false }, NOTIFIER_DEMANDEUR: { db: ETES.notificationAuDemandeur, mainStep: true }, @@ -157,17 +142,6 @@ const trad: { [key in Event]: { db: DBEtat; mainStep: boolean } } = { PUBLIER_DANS_UN_JOURNAL_LOCAL_OU_NATIONAL: { db: ETES.publicationDansUnJournalLocalOuNational, mainStep: true }, NOTIFIER_COLLECTIVITES_LOCALES: { db: ETES.notificationDesCollectivitesLocales, mainStep: true }, RENDRE_DECISION_ABROGATION: { db: ETES.abrogationDeLaDecision, mainStep: false }, - RENDRE_AVIS_DGTMAUCL: { db: ETES.avisDGTMServiceAmenagementUrbanismeConstructionLogement_AUCL_, mainStep: false }, - RENDRE_AVIS_DIRECTION_ENTREPRISE_CONCURRENCE_CONSOMMATION_TRAVAIL_EMPLOI: { db: ETES.avisDeLaDirectionDesEntreprisesDeLaConcurrenceDeLaConsommationDuTravailEtDeLemploi, mainStep: false }, - RENDRE_AVIS_DIRECTION_ALIMENTATION_AGRICULTURE_FORET: { db: ETES.avisDeLaDirectionDalimentationDeLagricultureEtDeLaForet, mainStep: false }, - RENDRE_AVIS_DIRECTION_REGIONALE_AFFAIRES_CULTURELLES: { db: ETES.avisDeDirectionRegionaleDesAffairesCulturelles, mainStep: false }, - RENDRE_AVIS_AGENCE_REGIONALE_SANTE: { db: ETES.avisDeLagenceRegionaleDeSante, mainStep: false }, - RENDRE_AVIS_DIRECTION_REGIONALE_FINANCES_PUBLIQUES: { db: ETES.avisDeLaDirectionRegionaleDesFinancesPubliques, mainStep: false }, - RENDRE_AVIS_CAISSE_GENERALE_DE_SECURITE_SOCIALE: { db: ETES.avisDeLaCaisseGeneraleDeSecuriteSociale, mainStep: false }, - RENDRE_AVIS_OFFICE_NATIONAL_DES_FORETS: { db: ETES.avisDeLOfficeNationalDesForets, mainStep: false }, - RENDRE_AVIS_ETAT_MAJOR_ORPAILLAGE_ET_PECHE_ILLICITE: { db: ETES.avisDeLetatMajorOrpaillageEtPecheIllicite_EMOPI_, mainStep: false }, - RENDRE_AVIS_GENDARMERIE_NATIONALE: { db: ETES.avisDeLaGendarmerieNationale, mainStep: false }, - FAIRE_CONFIRMATION_PROPRIETAIRE_DU_SOL: { db: ETES.confirmationDeLaccordDuProprietaireDuSol, mainStep: true }, FAIRE_NOTE_INTERNE_SIGNALEE: { db: ETES.noteInterneSignalee, mainStep: false }, DEMANDER_INFORMATION_POUR_AVIS_DREAL: { db: ETES.demandeDinformations_AvisDuDREALDEALOuDGTM_, mainStep: false }, RECEVOIR_INFORMATION_POUR_AVIS_DREAL: { db: ETES.receptionDinformation_AvisDuDREALDEALOuDGTM_, mainStep: false }, @@ -189,7 +163,7 @@ export class AxmOctMachine extends CaminoMachine<AxmContext, AXMOctXStateEvent> toPotentialCaminoXStateEvent(event: AXMOctXStateEvent['type'], date: CaminoDate): AXMOctXStateEvent[] { switch (event) { - case 'FAIRE_SAISINE_DES_SERVICES': + case 'RENDRE_AVIS_DES_SERVICES_ET_COMMISSIONS_CONSULTATIVES': case 'RENDRE_AVIS_DREAL': return [{ type: event, date }] default: @@ -210,7 +184,7 @@ export class AxmOctMachine extends CaminoMachine<AxmContext, AXMOctXStateEvent> if (entry) { const eventFromEntry = entry[0] switch (eventFromEntry) { - case 'FAIRE_SAISINE_DES_SERVICES': + case 'RENDRE_AVIS_DES_SERVICES_ET_COMMISSIONS_CONSULTATIVES': case 'RENDRE_AVIS_DREAL': { return { type: eventFromEntry, date: etape.date } } @@ -225,7 +199,7 @@ export class AxmOctMachine extends CaminoMachine<AxmContext, AXMOctXStateEvent> } } -type SaisineDesServices = { faite: false } | { faite: true; date: CaminoDate } +type RendreAvisDesServicesEtCommissonsConsultatives = { faite: false } | { faite: true; date: CaminoDate } interface AxmContext extends CaminoCommonContext { demandeFaite: boolean notificationDuDemandeurFaite: boolean @@ -233,13 +207,12 @@ interface AxmContext extends CaminoCommonContext { publicationDecisionsRecueilActesAdministratifsFaite: boolean publicationDansUnJournalLocalOuNationalFaite: boolean daeRequiseOuDemandeDeposee: boolean - decisionDuProprietaireDuSolFavorableSansReserve: boolean saisineDesCollectivitesLocalesFaite: boolean - saisineDesServices: SaisineDesServices + avisDesServicesEtCommissionsConsultatives: RendreAvisDesServicesEtCommissonsConsultatives } const peutRendreAvisDREAL = ({ context, event }: { context: AxmContext; event: RendreAvisDreal }): boolean => { - return context.saisineDesServices.faite && daysBetween(dateAddMonths(context.saisineDesServices.date, 1), event.date) >= 0 + return context.avisDesServicesEtCommissionsConsultatives.faite && daysBetween(dateAddMonths(context.avisDesServicesEtCommissionsConsultatives.date, 1), event.date) >= 0 } const axmOctMachine = createMachine({ @@ -254,9 +227,8 @@ const axmOctMachine = createMachine({ notificationDesCollectivitesLocalesFaite: false, publicationDecisionsRecueilActesAdministratifsFaite: false, publicationDansUnJournalLocalOuNationalFaite: false, - decisionDuProprietaireDuSolFavorableSansReserve: false, saisineDesCollectivitesLocalesFaite: false, - saisineDesServices: { faite: false }, + avisDesServicesEtCommissionsConsultatives: { faite: false }, daeRequiseOuDemandeDeposee: false, visibilite: 'confidentielle', }, @@ -319,12 +291,7 @@ const axmOctMachine = createMachine({ states: { decisionARendre: { on: { - RENDRE_DECISION_DU_PROPRIETAIRE_DU_SOL_FAVORABLE: { - target: 'decisionRendue', - actions: assign({ - decisionDuProprietaireDuSolFavorableSansReserve: true, - }), - }, + RENDRE_DECISION_DU_PROPRIETAIRE_DU_SOL_FAVORABLE: 'decisionRendue', RENDRE_DECISION_DU_PROPRIETAIRE_DU_SOL_FAVORABLE_AVEC_RESERVE: 'decisionRendue', RENDRE_DECISION_DU_PROPRIETAIRE_DU_SOL_DEFAVORABLE: '#classementSansSuiteAFaire', }, @@ -398,7 +365,7 @@ const axmOctMachine = createMachine({ rendreAvisDrealPasEncorePossible: { always: { target: 'rendreAvisDrealAFaire', - guard: ({ context }) => context.saisineDesServices.faite && context.saisineDesCollectivitesLocalesFaite && context.decisionDuProprietaireDuSolFavorableSansReserve, + guard: ({ context }) => context.avisDesServicesEtCommissionsConsultatives.faite && context.saisineDesCollectivitesLocalesFaite, }, }, rendreAvisDrealAFaire: { @@ -447,16 +414,16 @@ const axmOctMachine = createMachine({ avisDunMaireRendu: { type: 'final' }, }, }, - saisineDesServicesMachine: { - initial: 'saisineDesServicesAFaire', + avisDesServicesEtCommissionsConsultativesMachine: { + initial: 'avisDesServicesEtCommissionsConsultativesAFaire', states: { - saisineDesServicesAFaire: { + avisDesServicesEtCommissionsConsultativesAFaire: { on: { - FAIRE_SAISINE_DES_SERVICES: { - target: 'avisDesServicesARendre', - guard: ({ context }) => !context.saisineDesServices.faite, + RENDRE_AVIS_DES_SERVICES_ET_COMMISSIONS_CONSULTATIVES: { + target: 'avisDesServicesEtCommissionsConsultativesRendu', + guard: ({ context }) => !context.avisDesServicesEtCommissionsConsultatives.faite, actions: assign({ - saisineDesServices: ({ event }) => { + avisDesServicesEtCommissionsConsultatives: ({ event }) => { return { faite: true, date: event.date, @@ -466,155 +433,7 @@ const axmOctMachine = createMachine({ }, }, }, - avisDesServicesARendre: { - type: 'parallel', - - states: { - confirmationAccordProprietaireDuSolMachine: { - initial: 'confirmationAccordProprietaireDuSolAFaire', - states: { - confirmationAccordProprietaireDuSolAFaire: { - on: { - FAIRE_CONFIRMATION_PROPRIETAIRE_DU_SOL: 'confirmationAccordProprietaireDuSolFait', - }, - }, - confirmationAccordProprietaireDuSolFait: { - type: 'final', - entry: assign({ - decisionDuProprietaireDuSolFavorableSansReserve: true, - }), - }, - }, - }, - avisDgtmMNBSTMachine: { - initial: 'avisDgtmMNBSTARendre', - states: { - avisDgtmMNBSTARendre: { - on: { RENDRE_AVIS_DGTM_MNBST: 'avisDgtmMNBSTRendu' }, - }, - avisDgtmMNBSTRendu: { type: 'final' }, - }, - }, - avisDGTMAUCLMachine: { - initial: 'avisDGTMAUCLARendre', - states: { - avisDGTMAUCLARendre: { - on: { RENDRE_AVIS_DGTMAUCL: 'avisDGTMAUCLRendu' }, - }, - avisDGTMAUCLRendu: { type: 'final' }, - }, - }, - avisDirectionEntrepriseConcurrenceConsommationTravailEmploiMachine: { - initial: 'avisDirectionEntrepriseConcurrenceConsommationTravailEmploiARendre', - states: { - avisDirectionEntrepriseConcurrenceConsommationTravailEmploiARendre: { - on: { - RENDRE_AVIS_DIRECTION_ENTREPRISE_CONCURRENCE_CONSOMMATION_TRAVAIL_EMPLOI: 'avisDirectionEntrepriseConcurrenceConsommationTravailEmploiRendu', - }, - }, - avisDirectionEntrepriseConcurrenceConsommationTravailEmploiRendu: { type: 'final' }, - }, - }, - avisDirectionAlimentationAgricultureForetMachine: { - initial: 'avisDirectionAlimentationAgricultureForetARendre', - states: { - avisDirectionAlimentationAgricultureForetARendre: { - on: { - RENDRE_AVIS_DIRECTION_ALIMENTATION_AGRICULTURE_FORET: 'avisDirectionAlimentationAgricultureForetRendu', - }, - }, - avisDirectionAlimentationAgricultureForetRendu: { - type: 'final', - }, - }, - }, - avisDirectionRegionaleAffairesCulturellesMachine: { - initial: 'avisDirectionRegionaleAffairesCulturellesARendre', - states: { - avisDirectionRegionaleAffairesCulturellesARendre: { - on: { - RENDRE_AVIS_DIRECTION_REGIONALE_AFFAIRES_CULTURELLES: 'avisDirectionRegionaleAffairesCulturellesRendu', - }, - }, - avisDirectionRegionaleAffairesCulturellesRendu: { - type: 'final', - }, - }, - }, - avisAgenceRegionaleSanteMachine: { - initial: 'avisAgenceRegionaleSanteARendre', - states: { - avisAgenceRegionaleSanteARendre: { - on: { - RENDRE_AVIS_AGENCE_REGIONALE_SANTE: 'avisAgenceRegionaleSanteRendu', - }, - }, - avisAgenceRegionaleSanteRendu: { type: 'final' }, - }, - }, - avisDirectionRegionaleFinancesPubliquesMachine: { - initial: 'avisDirectionRegionaleFinancesPubliquesARendre', - states: { - avisDirectionRegionaleFinancesPubliquesARendre: { - on: { - RENDRE_AVIS_DIRECTION_REGIONALE_FINANCES_PUBLIQUES: 'avisDirectionRegionaleFinancesPubliquesRendu', - }, - }, - avisDirectionRegionaleFinancesPubliquesRendu: { - type: 'final', - }, - }, - }, - avisCaisseGeneraleDeSecuriteSocialeMachine: { - initial: 'avisCaisseGeneraleDeSecuriteSocialeARendre', - states: { - avisCaisseGeneraleDeSecuriteSocialeARendre: { - on: { - RENDRE_AVIS_CAISSE_GENERALE_DE_SECURITE_SOCIALE: 'avisCaisseGeneraleDeSecuriteSocialeRendu', - }, - }, - avisCaisseGeneraleDeSecuriteSocialeRendu: { type: 'final' }, - }, - }, - avisOfficeNationalDesForetsMachine: { - initial: 'avisOfficeNationalDesForetsARendre', - states: { - avisOfficeNationalDesForetsARendre: { - on: { - RENDRE_AVIS_OFFICE_NATIONAL_DES_FORETS: 'avisOfficeNationalDesForetsRendu', - }, - }, - avisOfficeNationalDesForetsRendu: { type: 'final' }, - }, - }, - avisGendarmerieNationaleMachine: { - initial: 'avisGendarmerieNationaleARendre', - states: { - avisGendarmerieNationaleARendre: { - on: { - RENDRE_AVIS_GENDARMERIE_NATIONALE: 'avisGendarmerieNationaleRendu', - }, - }, - avisGendarmerieNationaleRendu: { type: 'final' }, - }, - }, - avisEtatMajorOrpaillageEtPecheIlliciteMachine: { - initial: 'avisEtatMajorOrpaillageEtPecheIlliciteARendre', - states: { - avisEtatMajorOrpaillageEtPecheIlliciteARendre: { - on: { - RENDRE_AVIS_ETAT_MAJOR_ORPAILLAGE_ET_PECHE_ILLICITE: 'avisEtatMajorOrpaillageEtPecheIlliciteRendu', - }, - }, - avisEtatMajorOrpaillageEtPecheIlliciteRendu: { - type: 'final', - }, - }, - }, - }, - onDone: 'avisDesServicesRendus', - }, - avisDesServicesRendus: { type: 'final' }, + avisDesServicesEtCommissionsConsultativesRendu: { type: 'final' }, }, }, }, diff --git a/packages/api/src/business/rules-demarches/axm/pro.cas.json b/packages/api/src/business/rules-demarches/axm/pro.cas.json index 9097ae289..66e4746bb 100644 --- a/packages/api/src/business/rules-demarches/axm/pro.cas.json +++ b/packages/api/src/business/rules-demarches/axm/pro.cas.json @@ -1 +1 @@ -[{"id":0,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2022-11-11","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-11-14","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":1,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2019-01-17","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2019-01-17","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-01-22","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":2,"demarcheStatutId":"ins","demarchePublique":true,"etapes":[{"date":"2021-11-16","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-11-17","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-04-26","etapeTypeId":"mcr","etapeStatutId":"fav"}]},{"id":3,"demarcheStatutId":"cls","demarchePublique":true,"etapes":[{"date":"2019-12-21","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2019-12-21","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-02-09","etapeTypeId":"css","etapeStatutId":"fai"}]},{"id":4,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-02-21","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-02-25","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-10-25","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-10-25","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-10-25","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2023-02-16","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2023-03-16","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2023-03-29","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":5,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-03-23","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-03-23","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-10-20","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-10-20","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2022-10-20","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-12-04","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2023-01-13","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2023-01-27","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":6,"demarcheStatutId":"cls","demarchePublique":true,"etapes":[{"date":"2012-06-13","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2012-06-13","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2014-05-06","etapeTypeId":"css","etapeStatutId":"fai"}]},{"id":7,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2023-02-15","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2023-02-15","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":8,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2011-09-16","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2011-09-16","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":9,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2019-12-12","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2019-12-12","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2019-12-15","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-01-22","etapeTypeId":"dim","etapeStatutId":"rej"}]},{"id":10,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2019-10-06","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2019-10-26","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":11,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2020-02-05","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-02-24","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":12,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2022-06-04","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-06-04","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":13,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2022-03-08","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-03-08","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-11-05","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":14,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2016-10-11","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2016-10-11","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":15,"demarcheStatutId":"cls","demarchePublique":true,"etapes":[{"date":"2013-11-18","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2013-11-18","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2015-08-10","etapeTypeId":"css","etapeStatutId":"fai"}]},{"id":16,"demarcheStatutId":"cls","demarchePublique":true,"etapes":[{"date":"2020-05-18","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-05-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-11-15","etapeTypeId":"css","etapeStatutId":"fai"}]},{"id":17,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2017-05-01","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2017-05-01","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-05-18","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":18,"demarcheStatutId":"cls","demarchePublique":true,"etapes":[{"date":"2020-06-30","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-06-30","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-08-14","etapeTypeId":"css","etapeStatutId":"fai"}]},{"id":19,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-04-22","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-04-28","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-12-01","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-12-01","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-12-01","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2023-01-06","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2023-01-20","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2023-01-29","etapeTypeId":"dex","etapeStatutId":"acc"}]}] \ No newline at end of file +[{"id":0,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2022-11-11","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-11-14","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":1,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2019-01-17","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2019-01-17","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-01-22","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":2,"demarcheStatutId":"ins","demarchePublique":true,"etapes":[{"date":"2021-11-16","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2021-11-17","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-04-26","etapeTypeId":"mcr","etapeStatutId":"fav"}]},{"id":3,"demarcheStatutId":"cls","demarchePublique":true,"etapes":[{"date":"2019-12-21","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2019-12-21","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-02-09","etapeTypeId":"css","etapeStatutId":"fai"}]},{"id":4,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-02-21","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-02-25","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-10-25","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-10-25","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-10-25","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2023-02-16","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2023-03-16","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2023-03-29","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":5,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-03-23","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-03-23","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-10-20","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-10-20","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-10-20","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-12-04","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2023-01-13","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2023-01-27","etapeTypeId":"dex","etapeStatutId":"acc"}]},{"id":6,"demarcheStatutId":"cls","demarchePublique":true,"etapes":[{"date":"2012-06-13","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2012-06-13","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2014-05-06","etapeTypeId":"css","etapeStatutId":"fai"}]},{"id":7,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2023-02-15","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2023-02-15","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":8,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2011-09-16","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2011-09-16","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":9,"demarcheStatutId":"rej","demarchePublique":true,"etapes":[{"date":"2019-12-12","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2019-12-12","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2019-12-15","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-01-22","etapeTypeId":"dim","etapeStatutId":"rej"}]},{"id":10,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2019-10-06","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2019-10-26","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":11,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2020-02-05","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-02-24","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":12,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2022-06-04","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-06-04","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":13,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2022-03-08","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-03-08","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-11-05","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":14,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2016-10-11","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2016-10-11","etapeTypeId":"mdp","etapeStatutId":"fai"}]},{"id":15,"demarcheStatutId":"cls","demarchePublique":true,"etapes":[{"date":"2013-11-18","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2013-11-18","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2015-08-10","etapeTypeId":"css","etapeStatutId":"fai"}]},{"id":16,"demarcheStatutId":"cls","demarchePublique":true,"etapes":[{"date":"2020-05-18","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-05-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-11-15","etapeTypeId":"css","etapeStatutId":"fai"}]},{"id":17,"demarcheStatutId":"des","demarchePublique":true,"etapes":[{"date":"2017-05-01","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2017-05-01","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-05-18","etapeTypeId":"des","etapeStatutId":"fai"}]},{"id":18,"demarcheStatutId":"cls","demarchePublique":true,"etapes":[{"date":"2020-06-30","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2020-06-30","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-08-14","etapeTypeId":"css","etapeStatutId":"fai"}]},{"id":19,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-04-22","etapeTypeId":"mfr","etapeStatutId":"fai"},{"date":"2022-04-28","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-12-01","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-12-01","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2022-12-01","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2023-01-06","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2023-01-20","etapeTypeId":"apo","etapeStatutId":"fav"},{"date":"2023-01-29","etapeTypeId":"dex","etapeStatutId":"acc"}]}] diff --git a/packages/api/src/business/rules-demarches/axm/pro.machine.test.ts b/packages/api/src/business/rules-demarches/axm/pro.machine.test.ts index 5533d41c6..cfa15d642 100644 --- a/packages/api/src/business/rules-demarches/axm/pro.machine.test.ts +++ b/packages/api/src/business/rules-demarches/axm/pro.machine.test.ts @@ -21,7 +21,7 @@ describe('vérifie l’arbre de prolongation d’AXM', () => { 'FAIRE_CLASSEMENT_SANS_SUITE', 'FAIRE_DESISTEMENT_DEMANDEUR', 'FAIRE_SAISINE_COLLECTIVITES_LOCALES', - 'FAIRE_SAISINE_DES_SERVICES', + 'RENDRE_AVIS_DES_SERVICES_ET_COMMISSIONS_CONSULTATIVES', 'RENDRE_DECISION_IMPLICITE_REJET', ]) }) diff --git a/packages/api/src/business/rules-demarches/axm/pro.machine.ts b/packages/api/src/business/rules-demarches/axm/pro.machine.ts index e890c7232..73709e0c3 100644 --- a/packages/api/src/business/rules-demarches/axm/pro.machine.ts +++ b/packages/api/src/business/rules-demarches/axm/pro.machine.ts @@ -6,9 +6,9 @@ import { DemarchesStatutsIds } from 'camino-common/src/static/demarchesStatuts.j import { ADMINISTRATION_IDS } from 'camino-common/src/static/administrations.js' import { CaminoDate, dateAddMonths, daysBetween } from 'camino-common/src/date.js' -type FaireSaisineDesServices = { +type RendreAvisDesServicesEtCommissionsConsultatives = { date: CaminoDate - type: 'FAIRE_SAISINE_DES_SERVICES' + type: 'RENDRE_AVIS_DES_SERVICES_ET_COMMISSIONS_CONSULTATIVES' } type RendreAvisDreal = { @@ -27,8 +27,7 @@ type AXMProXStateEvent = | { type: 'FAIRE_SAISINE_COLLECTIVITES_LOCALES' } | { type: 'RENDRE_AVIS_DUN_MAIRE' } | RendreAvisDreal - | FaireSaisineDesServices - | { type: 'RENDRE_AVIS_DGTM_MNBST' } + | RendreAvisDesServicesEtCommissionsConsultatives | { type: 'FAIRE_SAISINE_COMMISSION_DEPARTEMENTALE_DES_MINES' } | { type: 'RENDRE_AVIS_COMMISSION_DEPARTEMENTALE_DES_MINES' } | { type: 'RENDRE_AVIS_COMMISSION_DEPARTEMENTALE_DES_MINES_AJOURNE' } @@ -40,18 +39,6 @@ type AXMProXStateEvent = | { type: 'PUBLIER_DANS_UN_JOURNAL_LOCAL_OU_NATIONAL' } | { type: 'NOTIFIER_COLLECTIVITES_LOCALES' } | { type: 'RENDRE_DECISION_ABROGATION' } - | { type: 'RENDRE_AVIS_DGTMAUCL' } - | { - type: 'RENDRE_AVIS_DIRECTION_ENTREPRISE_CONCURRENCE_CONSOMMATION_TRAVAIL_EMPLOI' - } - | { type: 'RENDRE_AVIS_DIRECTION_ALIMENTATION_AGRICULTURE_FORET' } - | { type: 'RENDRE_AVIS_DIRECTION_REGIONALE_AFFAIRES_CULTURELLES' } - | { type: 'RENDRE_AVIS_AGENCE_REGIONALE_SANTE' } - | { type: 'RENDRE_AVIS_DIRECTION_REGIONALE_FINANCES_PUBLIQUES' } - | { type: 'RENDRE_AVIS_CAISSE_GENERALE_DE_SECURITE_SOCIALE' } - | { type: 'RENDRE_AVIS_OFFICE_NATIONAL_DES_FORETS' } - | { type: 'RENDRE_AVIS_ETAT_MAJOR_ORPAILLAGE_ET_PECHE_ILLICITE' } - | { type: 'RENDRE_AVIS_GENDARMERIE_NATIONALE' } | { type: 'DEMANDER_INFORMATION_POUR_AVIS_DREAL' } | { type: 'RECEVOIR_INFORMATION_POUR_AVIS_DREAL' } | { type: 'RENDRE_DECISION_IMPLICITE_REJET' } @@ -70,24 +57,13 @@ const trad: { [key in Event]: { db: DBEtat; mainStep: boolean } } = { FAIRE_SAISINE_COLLECTIVITES_LOCALES: { db: ETES.saisineDesCollectivitesLocales, mainStep: true }, RENDRE_AVIS_DUN_MAIRE: { db: ETES.avisDunMaire, mainStep: false }, RENDRE_AVIS_DREAL: { db: ETES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement, mainStep: true }, - FAIRE_SAISINE_DES_SERVICES: { db: ETES.saisineDesServices, mainStep: true }, - RENDRE_AVIS_DGTM_MNBST: { db: ETES.avisDGTMServiceMilieuxNaturelsBiodiversiteSitesEtPaysages_MNBST_, mainStep: false }, + RENDRE_AVIS_DES_SERVICES_ET_COMMISSIONS_CONSULTATIVES: { db: ETES.avisDesServicesEtCommissionsConsultatives, mainStep: true }, FAIRE_SAISINE_COMMISSION_DEPARTEMENTALE_DES_MINES: { db: ETES.saisineDeLaCommissionDepartementaleDesMines_CDM_, mainStep: false }, NOTIFIER_DEMANDEUR: { db: ETES.notificationAuDemandeur, mainStep: true }, PUBLIER_DECISIONS_RECUEIL_ACTES_ADMINISTRATIFS: { db: ETES.publicationDeDecisionAuRecueilDesActesAdministratifs, mainStep: true }, PUBLIER_DANS_UN_JOURNAL_LOCAL_OU_NATIONAL: { db: ETES.publicationDansUnJournalLocalOuNational, mainStep: true }, NOTIFIER_COLLECTIVITES_LOCALES: { db: ETES.notificationDesCollectivitesLocales, mainStep: true }, RENDRE_DECISION_ABROGATION: { db: ETES.abrogationDeLaDecision, mainStep: false }, - RENDRE_AVIS_DGTMAUCL: { db: ETES.avisDGTMServiceAmenagementUrbanismeConstructionLogement_AUCL_, mainStep: false }, - RENDRE_AVIS_DIRECTION_ENTREPRISE_CONCURRENCE_CONSOMMATION_TRAVAIL_EMPLOI: { db: ETES.avisDeLaDirectionDesEntreprisesDeLaConcurrenceDeLaConsommationDuTravailEtDeLemploi, mainStep: false }, - RENDRE_AVIS_DIRECTION_ALIMENTATION_AGRICULTURE_FORET: { db: ETES.avisDeLaDirectionDalimentationDeLagricultureEtDeLaForet, mainStep: false }, - RENDRE_AVIS_DIRECTION_REGIONALE_AFFAIRES_CULTURELLES: { db: ETES.avisDeDirectionRegionaleDesAffairesCulturelles, mainStep: false }, - RENDRE_AVIS_AGENCE_REGIONALE_SANTE: { db: ETES.avisDeLagenceRegionaleDeSante, mainStep: false }, - RENDRE_AVIS_DIRECTION_REGIONALE_FINANCES_PUBLIQUES: { db: ETES.avisDeLaDirectionRegionaleDesFinancesPubliques, mainStep: false }, - RENDRE_AVIS_CAISSE_GENERALE_DE_SECURITE_SOCIALE: { db: ETES.avisDeLaCaisseGeneraleDeSecuriteSociale, mainStep: false }, - RENDRE_AVIS_OFFICE_NATIONAL_DES_FORETS: { db: ETES.avisDeLOfficeNationalDesForets, mainStep: false }, - RENDRE_AVIS_ETAT_MAJOR_ORPAILLAGE_ET_PECHE_ILLICITE: { db: ETES.avisDeLetatMajorOrpaillageEtPecheIllicite_EMOPI_, mainStep: false }, - RENDRE_AVIS_GENDARMERIE_NATIONALE: { db: ETES.avisDeLaGendarmerieNationale, mainStep: false }, DEMANDER_INFORMATION_POUR_AVIS_DREAL: { db: ETES.demandeDinformations_AvisDuDREALDEALOuDGTM_, mainStep: false }, RECEVOIR_INFORMATION_POUR_AVIS_DREAL: { db: ETES.receptionDinformation_AvisDuDREALDEALOuDGTM_, mainStep: false }, RENDRE_DECISION_ANNULATION_PAR_JUGE_ADMINISTRATIF: { db: ETES.decisionDuJugeAdministratif, mainStep: false }, @@ -156,7 +132,7 @@ export class AxmProMachine extends CaminoMachine<AxmProContext, AXMProXStateEven toPotentialCaminoXStateEvent(event: AXMProXStateEvent['type'], date: CaminoDate): AXMProXStateEvent[] { switch (event) { - case 'FAIRE_SAISINE_DES_SERVICES': + case 'RENDRE_AVIS_DES_SERVICES_ET_COMMISSIONS_CONSULTATIVES': case 'RENDRE_AVIS_DREAL': return [{ type: event, date }] default: @@ -177,7 +153,7 @@ export class AxmProMachine extends CaminoMachine<AxmProContext, AXMProXStateEven if (entry) { const eventFromEntry = entry[0] switch (eventFromEntry) { - case 'FAIRE_SAISINE_DES_SERVICES': + case 'RENDRE_AVIS_DES_SERVICES_ET_COMMISSIONS_CONSULTATIVES': case 'RENDRE_AVIS_DREAL': { return { type: eventFromEntry, date: etape.date } } @@ -192,10 +168,10 @@ export class AxmProMachine extends CaminoMachine<AxmProContext, AXMProXStateEven } } -type SaisineDesServices = { faite: false } | { faite: true; date: CaminoDate } +type AvisDesServicesEtCommissionsConsultatives = { faite: false } | { faite: true; date: CaminoDate } interface AxmProContext extends CaminoCommonContext { saisineDesCollectivitesLocalesFaite: boolean - saisineDesServices: SaisineDesServices + avisDesServicesEtCommissionsConsultatives: AvisDesServicesEtCommissionsConsultatives notificationDuDemandeurFaite: boolean notificationDesCollectivitesLocalesFaite: boolean publicationDecisionsRecueilActesAdministratifsFaite: boolean @@ -203,7 +179,7 @@ interface AxmProContext extends CaminoCommonContext { } const peutRendreAvisDREAL = ({ context, event }: { context: AxmProContext; event: RendreAvisDreal }): boolean => { - return context.saisineDesServices.faite && daysBetween(dateAddMonths(context.saisineDesServices.date, 1), event.date) >= 0 + return context.avisDesServicesEtCommissionsConsultatives.faite && daysBetween(dateAddMonths(context.avisDesServicesEtCommissionsConsultatives.date, 1), event.date) >= 0 } const axmProMachine = createMachine({ @@ -218,7 +194,7 @@ const axmProMachine = createMachine({ publicationDecisionsRecueilActesAdministratifsFaite: false, publicationDansUnJournalLocalOuNationalFaite: false, saisineDesCollectivitesLocalesFaite: false, - saisineDesServices: { faite: false }, + avisDesServicesEtCommissionsConsultatives: { faite: false }, visibilite: 'confidentielle', }, on: { @@ -297,7 +273,7 @@ const axmProMachine = createMachine({ rendreAvisDrealPasEncorePossible: { always: { target: 'rendreAvisDrealAFaire', - guard: ({ context }) => context.saisineDesServices.faite && context.saisineDesCollectivitesLocalesFaite, + guard: ({ context }) => context.avisDesServicesEtCommissionsConsultatives.faite && context.saisineDesCollectivitesLocalesFaite, }, }, rendreAvisDrealAFaire: { @@ -346,16 +322,16 @@ const axmProMachine = createMachine({ avisDunMaireRendu: { type: 'final' }, }, }, - saisineDesServicesMachine: { - initial: 'saisineDesServicesAFaire', + avisDesServicesEtCommissionsConsultativesMachine: { + initial: 'avisDesServicesEtCommissionsConsultativesAFaire', states: { - saisineDesServicesAFaire: { + avisDesServicesEtCommissionsConsultativesAFaire: { on: { - FAIRE_SAISINE_DES_SERVICES: { - target: 'avisDesServicesARendre', - guard: ({ context }) => !context.saisineDesServices.faite, + RENDRE_AVIS_DES_SERVICES_ET_COMMISSIONS_CONSULTATIVES: { + target: 'avisDesServicesEtCommissionsConsultativesRendu', + guard: ({ context }) => !context.avisDesServicesEtCommissionsConsultatives.faite, actions: assign({ - saisineDesServices: ({ event }) => { + avisDesServicesEtCommissionsConsultatives: ({ event }) => { return { faite: true, date: event.date, @@ -365,139 +341,7 @@ const axmProMachine = createMachine({ }, }, }, - avisDesServicesARendre: { - type: 'parallel', - - states: { - avisDgtmMNBSTMachine: { - initial: 'avisDgtmMNBSTARendre', - states: { - avisDgtmMNBSTARendre: { - on: { RENDRE_AVIS_DGTM_MNBST: 'avisDgtmMNBSTRendu' }, - }, - avisDgtmMNBSTRendu: { type: 'final' }, - }, - }, - avisDGTMAUCLMachine: { - initial: 'avisDGTMAUCLARendre', - states: { - avisDGTMAUCLARendre: { - on: { RENDRE_AVIS_DGTMAUCL: 'avisDGTMAUCLRendu' }, - }, - avisDGTMAUCLRendu: { type: 'final' }, - }, - }, - avisDirectionEntrepriseConcurrenceConsommationTravailEmploiMachine: { - initial: 'avisDirectionEntrepriseConcurrenceConsommationTravailEmploiARendre', - states: { - avisDirectionEntrepriseConcurrenceConsommationTravailEmploiARendre: { - on: { - RENDRE_AVIS_DIRECTION_ENTREPRISE_CONCURRENCE_CONSOMMATION_TRAVAIL_EMPLOI: 'avisDirectionEntrepriseConcurrenceConsommationTravailEmploiRendu', - }, - }, - avisDirectionEntrepriseConcurrenceConsommationTravailEmploiRendu: { type: 'final' }, - }, - }, - avisDirectionAlimentationAgricultureForetMachine: { - initial: 'avisDirectionAlimentationAgricultureForetARendre', - states: { - avisDirectionAlimentationAgricultureForetARendre: { - on: { - RENDRE_AVIS_DIRECTION_ALIMENTATION_AGRICULTURE_FORET: 'avisDirectionAlimentationAgricultureForetRendu', - }, - }, - avisDirectionAlimentationAgricultureForetRendu: { - type: 'final', - }, - }, - }, - avisDirectionRegionaleAffairesCulturellesMachine: { - initial: 'avisDirectionRegionaleAffairesCulturellesARendre', - states: { - avisDirectionRegionaleAffairesCulturellesARendre: { - on: { - RENDRE_AVIS_DIRECTION_REGIONALE_AFFAIRES_CULTURELLES: 'avisDirectionRegionaleAffairesCulturellesRendu', - }, - }, - avisDirectionRegionaleAffairesCulturellesRendu: { - type: 'final', - }, - }, - }, - avisAgenceRegionaleSanteMachine: { - initial: 'avisAgenceRegionaleSanteARendre', - states: { - avisAgenceRegionaleSanteARendre: { - on: { - RENDRE_AVIS_AGENCE_REGIONALE_SANTE: 'avisAgenceRegionaleSanteRendu', - }, - }, - avisAgenceRegionaleSanteRendu: { type: 'final' }, - }, - }, - avisDirectionRegionaleFinancesPubliquesMachine: { - initial: 'avisDirectionRegionaleFinancesPubliquesARendre', - states: { - avisDirectionRegionaleFinancesPubliquesARendre: { - on: { - RENDRE_AVIS_DIRECTION_REGIONALE_FINANCES_PUBLIQUES: 'avisDirectionRegionaleFinancesPubliquesRendu', - }, - }, - avisDirectionRegionaleFinancesPubliquesRendu: { - type: 'final', - }, - }, - }, - avisCaisseGeneraleDeSecuriteSocialeMachine: { - initial: 'avisCaisseGeneraleDeSecuriteSocialeARendre', - states: { - avisCaisseGeneraleDeSecuriteSocialeARendre: { - on: { - RENDRE_AVIS_CAISSE_GENERALE_DE_SECURITE_SOCIALE: 'avisCaisseGeneraleDeSecuriteSocialeRendu', - }, - }, - avisCaisseGeneraleDeSecuriteSocialeRendu: { type: 'final' }, - }, - }, - avisOfficeNationalDesForetsMachine: { - initial: 'avisOfficeNationalDesForetsARendre', - states: { - avisOfficeNationalDesForetsARendre: { - on: { - RENDRE_AVIS_OFFICE_NATIONAL_DES_FORETS: 'avisOfficeNationalDesForetsRendu', - }, - }, - avisOfficeNationalDesForetsRendu: { type: 'final' }, - }, - }, - avisGendarmerieNationaleMachine: { - initial: 'avisGendarmerieNationaleARendre', - states: { - avisGendarmerieNationaleARendre: { - on: { - RENDRE_AVIS_GENDARMERIE_NATIONALE: 'avisGendarmerieNationaleRendu', - }, - }, - avisGendarmerieNationaleRendu: { type: 'final' }, - }, - }, - avisEtatMajorOrpaillageEtPecheIlliciteMachine: { - initial: 'avisEtatMajorOrpaillageEtPecheIlliciteARendre', - states: { - avisEtatMajorOrpaillageEtPecheIlliciteARendre: { - on: { - RENDRE_AVIS_ETAT_MAJOR_ORPAILLAGE_ET_PECHE_ILLICITE: 'avisEtatMajorOrpaillageEtPecheIlliciteRendu', - }, - }, - avisEtatMajorOrpaillageEtPecheIlliciteRendu: { - type: 'final', - }, - }, - }, - }, - onDone: 'avisDesServicesRendus', - }, - avisDesServicesRendus: { type: 'final' }, + avisDesServicesEtCommissionsConsultativesRendu: { type: 'final' }, }, }, }, diff --git a/packages/api/src/business/rules-demarches/machine-common.test.ts b/packages/api/src/business/rules-demarches/machine-common.test.ts index 51a19d744..c27c497aa 100644 --- a/packages/api/src/business/rules-demarches/machine-common.test.ts +++ b/packages/api/src/business/rules-demarches/machine-common.test.ts @@ -1,6 +1,7 @@ import { toCaminoDate } from 'camino-common/src/date.js' import { TitreEtapeForMachine, toMachineEtapes } from './machine-common.js' import { describe, expect, test, vi } from 'vitest' +import { ETAPE_IS_NOT_BROUILLON, ETAPE_IS_BROUILLON } from 'camino-common/src/etape.js' console.error = vi.fn() describe('toMachineEtapes', () => { @@ -11,7 +12,7 @@ describe('toMachineEtapes', () => { typeId: 'mfr', statutId: 'fai', date: toCaminoDate('2022-01-01'), - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, communes: [], ordre: 0, surface: null, @@ -31,7 +32,7 @@ describe('toMachineEtapes', () => { { typeId: 'mfr', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2022-01-01'), contenu: { arm: { mecanise: true } }, communes: [], @@ -55,7 +56,7 @@ describe('toMachineEtapes', () => { { typeId: 'mfr', statutId: 'fai', - isBrouillon: true, + isBrouillon: ETAPE_IS_BROUILLON, date: toCaminoDate('2022-01-01'), contenu: { arm: { mecanise: true } }, communes: [], diff --git a/packages/api/src/business/rules-demarches/machine-common.ts b/packages/api/src/business/rules-demarches/machine-common.ts index bc4a0f4b5..db7605501 100644 --- a/packages/api/src/business/rules-demarches/machine-common.ts +++ b/packages/api/src/business/rules-demarches/machine-common.ts @@ -10,8 +10,9 @@ import { Regions } from 'camino-common/src/static/region.js' import { PaysId } from 'camino-common/src/static/pays.js' import { communeIdValidator } from 'camino-common/src/static/communes.js' import { z } from 'zod' -import { etapeIdValidator } from 'camino-common/src/etape.js' +import { etapeBrouillonValidator, etapeIdValidator } from 'camino-common/src/etape.js' import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools.js' +import { km2Validator } from 'camino-common/src/number.js' export interface Etape { // TODO 2022-07-28 : ceci pourrait être réduit en utilisant les états de 'trad' etapeTypeId: EtapeTypeId @@ -36,8 +37,8 @@ export const titreEtapeForMachineValidator = z.object({ contenu: z.any().nullable(), heritageContenu: z.any().nullable(), communes: z.array(z.object({ id: communeIdValidator })).nullable(), - surface: z.number().nullable(), - isBrouillon: z.boolean(), + surface: km2Validator.nullable(), + isBrouillon: etapeBrouillonValidator, }) export type TitreEtapeForMachine = z.infer<typeof titreEtapeForMachineValidator> diff --git a/packages/api/src/business/rules-demarches/machine-helper.test.ts b/packages/api/src/business/rules-demarches/machine-helper.test.ts index 156777195..bd7da5431 100644 --- a/packages/api/src/business/rules-demarches/machine-helper.test.ts +++ b/packages/api/src/business/rules-demarches/machine-helper.test.ts @@ -68,15 +68,10 @@ describe('orderMachine', () => { date: toCaminoDate('2020-01-11'), }, { - etapeTypeId: 'eof', + etapeTypeId: 'asc', etapeStatutId: 'fai', date: toCaminoDate('2020-01-11'), }, - { - etapeTypeId: 'aof', - etapeStatutId: 'fav', - date: toCaminoDate('2020-01-11'), - }, { etapeTypeId: 'sca', etapeStatutId: 'fai', @@ -153,12 +148,7 @@ describe('orderMachine', () => { { "date": "2020-01-11", "etapeStatutId": "fai", - "etapeTypeId": "eof", - }, - { - "date": "2020-01-11", - "etapeStatutId": "fav", - "etapeTypeId": "aof", + "etapeTypeId": "asc", }, { "date": "2020-01-11", @@ -230,11 +220,6 @@ describe('demarcheStatut', () => { etapeTypeId: 'mcr', etapeStatutId: 'fav', }, - { - date: toCaminoDate('2021-09-16'), - etapeTypeId: 'eof', - etapeStatutId: 'fai', - }, { date: toCaminoDate('2021-12-13'), etapeTypeId: 'rde', @@ -243,8 +228,8 @@ describe('demarcheStatut', () => { }, { date: toCaminoDate('2021-12-20'), - etapeTypeId: 'aof', - etapeStatutId: 'def', + etapeTypeId: 'asc', + etapeStatutId: 'fai', }, { date: toCaminoDate('2022-02-11'), @@ -431,7 +416,7 @@ describe('mainStep', () => { ] `) }) - test('possibleNextEtapes après une recevabilité favorable on doit faire une expertise de l’onf', () => { + test('possibleNextEtapes après une recevabilité favorable on rendre un avis des services et commissions consultatives', () => { expect( armOctMachine.possibleNextEtapes( [ @@ -464,18 +449,6 @@ describe('mainStep', () => { "etapeTypeId": "css", "mainStep": false, }, - { - "contenu": undefined, - "etapeStatutId": "fai", - "etapeTypeId": "mio", - "mainStep": false, - }, - { - "contenu": undefined, - "etapeStatutId": "fai", - "etapeTypeId": "eof", - "mainStep": true, - }, { "contenu": undefined, "etapeStatutId": "fav", @@ -500,10 +473,16 @@ describe('mainStep', () => { "etapeTypeId": "edm", "mainStep": false, }, + { + "contenu": undefined, + "etapeStatutId": "fai", + "etapeTypeId": "asc", + "mainStep": true, + }, ] `) }) - test('après une expertise de l’onf on doit avoir l’avis de l’onf', () => { + test('après un avis des services et commissions consultatives on doit avoir la saisine de la commission des autorisations de recherches minières', () => { expect( armOctMachine.possibleNextEtapes( [ @@ -513,7 +492,7 @@ describe('mainStep', () => { { etapeTypeId: 'mcp', etapeStatutId: 'com', date: toCaminoDate('2021-02-02') }, { etapeTypeId: 'vfd', etapeStatutId: 'fai', date: toCaminoDate('2021-02-02') }, { etapeTypeId: 'mcr', etapeStatutId: 'fav', date: toCaminoDate('2021-02-02') }, - { etapeTypeId: 'eof', etapeStatutId: 'fai', date: toCaminoDate('2021-02-02') }, + { etapeTypeId: 'asc', etapeStatutId: 'fai', date: toCaminoDate('2020-02-02') }, ], toCaminoDate('2021-02-03') ) @@ -539,26 +518,8 @@ describe('mainStep', () => { }, { "contenu": undefined, - "etapeStatutId": "fav", - "etapeTypeId": "aof", - "mainStep": true, - }, - { - "contenu": undefined, - "etapeStatutId": "fre", - "etapeTypeId": "aof", - "mainStep": true, - }, - { - "contenu": undefined, - "etapeStatutId": "def", - "etapeTypeId": "aof", - "mainStep": true, - }, - { - "contenu": undefined, - "etapeStatutId": "dre", - "etapeTypeId": "aof", + "etapeStatutId": "fai", + "etapeTypeId": "sca", "mainStep": true, }, { @@ -585,12 +546,6 @@ describe('mainStep', () => { "etapeTypeId": "edm", "mainStep": false, }, - { - "contenu": undefined, - "etapeStatutId": "fai", - "etapeTypeId": "mia", - "mainStep": false, - }, ] `) }) @@ -653,7 +608,7 @@ describe('mainStep', () => { ] `) }) - test('après une recevabilité défavorable on doit avoir un avis de l’onf', () => { + test('après une recevabilité défavorable on doit avoir un avis des services et commissions consultatives', () => { expect( armOctMachine.possibleNextEtapes( [ @@ -688,26 +643,8 @@ describe('mainStep', () => { }, { "contenu": undefined, - "etapeStatutId": "fav", - "etapeTypeId": "aof", - "mainStep": true, - }, - { - "contenu": undefined, - "etapeStatutId": "fre", - "etapeTypeId": "aof", - "mainStep": true, - }, - { - "contenu": undefined, - "etapeStatutId": "def", - "etapeTypeId": "aof", - "mainStep": true, - }, - { - "contenu": undefined, - "etapeStatutId": "dre", - "etapeTypeId": "aof", + "etapeStatutId": "fai", + "etapeTypeId": "asc", "mainStep": true, }, ] diff --git a/packages/api/src/business/rules-demarches/prm/oct.cas.json b/packages/api/src/business/rules-demarches/prm/oct.cas.json index 1710c4c18..9f8a58e58 100644 --- a/packages/api/src/business/rules-demarches/prm/oct.cas.json +++ b/packages/api/src/business/rules-demarches/prm/oct.cas.json @@ -1 +1 @@ -[{"id":0,"demarcheStatutId":"ins","demarchePublique":true,"etapes":[{"date":"2022-08-11","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR","surface":155.79},{"date":"2022-08-11","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-08-14","etapeTypeId":"spp","etapeStatutId":"fai"},{"date":"2022-12-04","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-12-10","etapeTypeId":"anf","etapeStatutId":"ter","paysId":"FR","surface":155.79},{"date":"2023-04-26","etapeTypeId":"ppu","etapeStatutId":"pro"}]},{"id":1,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2019-11-25","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"GF"},{"date":"2019-12-23","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-02-19","etapeTypeId":"spp","etapeStatutId":"fai"},{"date":"2020-06-23","etapeTypeId":"mif","etapeStatutId":"fai"},{"date":"2020-07-29","etapeTypeId":"rif","etapeStatutId":"fai"}]},{"id":2,"demarcheStatutId":"eco","demarchePublique":false,"etapes":[{"date":"2022-12-22","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR"}]},{"id":3,"demarcheStatutId":"ins","demarchePublique":true,"etapes":[{"date":"2023-02-06","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR"},{"date":"2023-02-22","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2023-03-08","etapeTypeId":"spp","etapeStatutId":"fai"},{"date":"2023-03-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2023-04-07","etapeTypeId":"anf","etapeStatutId":"enc","paysId":"FR"}]},{"id":4,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2022-04-26","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"GF","surface":24.96},{"date":"2022-05-17","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-05-23","etapeTypeId":"spp","etapeStatutId":"fai"}]},{"id":5,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2019-11-27","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"GF","surface":149.52},{"date":"2019-12-25","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-02-21","etapeTypeId":"spp","etapeStatutId":"fai"},{"date":"2020-06-26","etapeTypeId":"mif","etapeStatutId":"fai"},{"date":"2020-07-31","etapeTypeId":"rif","etapeStatutId":"fai"}]},{"id":6,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2020-10-16","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"GF","surface":178.72},{"date":"2020-12-11","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-01-12","etapeTypeId":"spp","etapeStatutId":"fai"}]},{"id":7,"demarcheStatutId":"ins","demarchePublique":true,"etapes":[{"date":"2021-05-20","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR","surface":171},{"date":"2021-05-27","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-05-29","etapeTypeId":"mod","etapeStatutId":"fai","paysId":"FR","surface":171},{"date":"2021-07-11","etapeTypeId":"spp","etapeStatutId":"fai"},{"date":"2022-02-18","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-02-22","etapeTypeId":"anf","etapeStatutId":"fai","paysId":"FR","surface":171},{"date":"2022-02-23","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2022-03-07","etapeTypeId":"ars","etapeStatutId":"fre"},{"date":"2022-03-07","etapeTypeId":"apm","etapeStatutId":"fav"},{"date":"2022-03-12","etapeTypeId":"aac","etapeStatutId":"fre"},{"date":"2022-03-19","etapeTypeId":"apl","etapeStatutId":"fre"},{"date":"2022-07-21","etapeTypeId":"ppu","etapeStatutId":"fai"},{"date":"2022-08-18","etapeTypeId":"ppc","etapeStatutId":"ter"},{"date":"2023-06-25","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2023-06-25","etapeTypeId":"app","etapeStatutId":"fav"}]},{"id":8,"demarcheStatutId":"ins","demarchePublique":true,"etapes":[{"date":"2022-07-12","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR","surface":226.6},{"date":"2022-07-12","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-08-09","etapeTypeId":"spp","etapeStatutId":"fai"},{"date":"2022-09-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-11-17","etapeTypeId":"anf","etapeStatutId":"ter","paysId":"FR"},{"date":"2023-01-09","etapeTypeId":"ppu","etapeStatutId":"fai"}]},{"id":9,"demarcheStatutId":"ins","demarchePublique":true,"etapes":[{"date":"2022-03-30","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR","surface":39.2},{"date":"2022-04-26","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-06-05","etapeTypeId":"spp","etapeStatutId":"fai"},{"date":"2022-09-20","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-12-28","etapeTypeId":"anf","etapeStatutId":"fai","paysId":"FR","surface":39.2},{"date":"2023-01-09","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2023-05-30","etapeTypeId":"ppu","etapeStatutId":"pro"}]},{"id":10,"demarcheStatutId":"eco","demarchePublique":false,"etapes":[{"date":"2023-03-13","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR","surface":9}]}] \ No newline at end of file +[{"id":0,"demarcheStatutId":"ins","demarchePublique":true,"etapes":[{"date":"2022-08-11","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR","surface":155.79},{"date":"2022-08-11","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-08-14","etapeTypeId":"spp","etapeStatutId":"fai"},{"date":"2022-12-04","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-12-10","etapeTypeId":"anf","etapeStatutId":"ter","paysId":"FR","surface":155.79},{"date":"2023-04-26","etapeTypeId":"ppu","etapeStatutId":"pro"}]},{"id":1,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2019-11-25","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"GF"},{"date":"2019-12-23","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-02-19","etapeTypeId":"spp","etapeStatutId":"fai"},{"date":"2020-06-23","etapeTypeId":"mif","etapeStatutId":"fai"},{"date":"2020-07-29","etapeTypeId":"rif","etapeStatutId":"fai"}]},{"id":2,"demarcheStatutId":"eco","demarchePublique":false,"etapes":[{"date":"2022-12-22","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR"}]},{"id":3,"demarcheStatutId":"ins","demarchePublique":true,"etapes":[{"date":"2023-02-06","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR"},{"date":"2023-02-22","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2023-03-08","etapeTypeId":"spp","etapeStatutId":"fai"},{"date":"2023-03-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2023-04-07","etapeTypeId":"anf","etapeStatutId":"enc","paysId":"FR"}]},{"id":4,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2022-04-26","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"GF","surface":24.96},{"date":"2022-05-17","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-05-23","etapeTypeId":"spp","etapeStatutId":"fai"}]},{"id":5,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2019-11-27","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"GF","surface":149.52},{"date":"2019-12-25","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-02-21","etapeTypeId":"spp","etapeStatutId":"fai"},{"date":"2020-06-26","etapeTypeId":"mif","etapeStatutId":"fai"},{"date":"2020-07-31","etapeTypeId":"rif","etapeStatutId":"fai"}]},{"id":6,"demarcheStatutId":"dep","demarchePublique":false,"etapes":[{"date":"2020-10-16","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"GF","surface":178.72},{"date":"2020-12-11","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-01-12","etapeTypeId":"spp","etapeStatutId":"fai"}]},{"id":7,"demarcheStatutId":"ins","demarchePublique":true,"etapes":[{"date":"2021-05-20","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR","surface":171},{"date":"2021-05-27","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-05-29","etapeTypeId":"mod","etapeStatutId":"fai","paysId":"FR","surface":171},{"date":"2021-07-11","etapeTypeId":"spp","etapeStatutId":"fai"},{"date":"2022-02-18","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-02-22","etapeTypeId":"anf","etapeStatutId":"fai","paysId":"FR","surface":171},{"date":"2022-02-23","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-07-21","etapeTypeId":"ppu","etapeStatutId":"fai"},{"date":"2022-08-18","etapeTypeId":"ppc","etapeStatutId":"ter"},{"date":"2023-06-25","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2023-06-25","etapeTypeId":"app","etapeStatutId":"fav"}]},{"id":8,"demarcheStatutId":"ins","demarchePublique":true,"etapes":[{"date":"2022-07-12","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR","surface":226.6},{"date":"2022-07-12","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-08-09","etapeTypeId":"spp","etapeStatutId":"fai"},{"date":"2022-09-27","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-11-17","etapeTypeId":"anf","etapeStatutId":"ter","paysId":"FR"},{"date":"2023-01-09","etapeTypeId":"ppu","etapeStatutId":"fai"}]},{"id":9,"demarcheStatutId":"ins","demarchePublique":true,"etapes":[{"date":"2022-03-30","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR","surface":39.2},{"date":"2022-04-26","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-06-05","etapeTypeId":"spp","etapeStatutId":"fai"},{"date":"2022-09-20","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-12-28","etapeTypeId":"anf","etapeStatutId":"fai","paysId":"FR","surface":39.2},{"date":"2023-01-09","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2023-05-30","etapeTypeId":"ppu","etapeStatutId":"pro"}]},{"id":10,"demarcheStatutId":"eco","demarchePublique":false,"etapes":[{"date":"2023-03-13","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR","surface":9}]}] diff --git a/packages/api/src/business/rules-demarches/prm/oct.machine.test.ts b/packages/api/src/business/rules-demarches/prm/oct.machine.test.ts index a7d276791..0229b089e 100644 --- a/packages/api/src/business/rules-demarches/prm/oct.machine.test.ts +++ b/packages/api/src/business/rules-demarches/prm/oct.machine.test.ts @@ -15,8 +15,7 @@ describe('vérifie l’arbre d’octroi de PRM', () => { { ...ETES.saisineDuPrefet.FAIT, date: toCaminoDate('2022-04-16') }, { ...ETES.recevabiliteDeLaDemande.FAVORABLE, date: toCaminoDate('2022-04-17') }, { ...ETES.avisDeMiseEnConcurrenceAuJORF.FAIT, date: toCaminoDate('2022-04-18') }, - { ...ETES.saisineDesServices.FAIT, date: toCaminoDate('2022-04-19') }, - { ...ETES.avisDeLOfficeNationalDesForets.FAVORABLE, date: toCaminoDate('2022-04-20') }, + { ...ETES.avisDesServicesEtCommissionsConsultatives.FAIT, date: toCaminoDate('2022-04-19') }, { ...ETES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement.FAVORABLE, date: toCaminoDate('2022-05-20') }, { ...ETES.avisDuPrefet.FAVORABLE, date: toCaminoDate('2022-05-20') }, { ...ETES.ouvertureDeLaParticipationDuPublic.FAIT, date: toCaminoDate('2022-05-18') }, @@ -51,10 +50,9 @@ describe('vérifie l’arbre d’octroi de PRM', () => { { ...ETES.saisineDuPrefet.FAIT, date: toCaminoDate('2022-04-16') }, { ...ETES.recevabiliteDeLaDemande.FAVORABLE, date: toCaminoDate('2022-04-17') }, { ...ETES.avisDeMiseEnConcurrenceAuJORF.FAIT, date: toCaminoDate('2022-04-18') }, - { ...ETES.saisineDesServices.FAIT, date: toCaminoDate('2022-04-19') }, + { ...ETES.avisDesServicesEtCommissionsConsultatives.FAIT, date: toCaminoDate('2022-04-19') }, { ...ETES.saisineDesCollectivitesLocales.FAIT, date: toCaminoDate('2022-04-19') }, { ...ETES.avisDunMaire.FAVORABLE, date: toCaminoDate('2022-04-19') }, - { ...ETES.avisDeLOfficeNationalDesForets.FAVORABLE, date: toCaminoDate('2022-04-20') }, { ...ETES.avisDeLaCommissionDepartementaleDesMines_CDM_.FAVORABLE, date: toCaminoDate('2022-05-20') }, { ...ETES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement.FAVORABLE, date: toCaminoDate('2022-05-20') }, { ...ETES.avisDuPrefet.FAVORABLE, date: toCaminoDate('2022-05-20') }, @@ -63,6 +61,22 @@ describe('vérifie l’arbre d’octroi de PRM', () => { ] expect(() => orderAndInterpretMachine(prmOctMachine, etapes)).not.toThrowError() }) + test('peut créer une demande d’octroi de PRM en Guyane sans avis du maire', () => { + const etapes = [ + { ...ETES.demande.FAIT, date: toCaminoDate('2023-09-05'), paysId: PAYS_IDS['Département de la Guyane'], surface: 14 }, + { ...ETES.depotDeLaDemande.FAIT, date: toCaminoDate('2023-09-06') }, + { ...ETES.saisineDuPrefet.FAIT, date: toCaminoDate('2023-09-21') }, + { ...ETES.demandeDeComplements_RecevabiliteDeLaDemande_.FAIT, date: toCaminoDate('2023-11-16') }, + { ...ETES.receptionDeComplements_RecevabiliteDeLaDemande_.FAIT, date: toCaminoDate('2023-11-22') }, + { ...ETES.recevabiliteDeLaDemande.FAVORABLE, date: toCaminoDate('2023-12-06') }, + { ...ETES.avisDesServicesEtCommissionsConsultatives.FAIT, date: toCaminoDate('2023-12-06') }, + { ...ETES.saisineDesCollectivitesLocales.FAIT, date: toCaminoDate('2023-12-06') }, + { ...ETES.avisDeLaCommissionDepartementaleDesMines_CDM_.FAVORABLE, date: toCaminoDate('2024-01-29') }, + { ...ETES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement.FAVORABLE, date: toCaminoDate('2024-02-02') }, + { ...ETES.avisDuPrefet.FAVORABLE, date: toCaminoDate('2024-02-15') }, + ] + expect(() => orderAndInterpretMachine(prmOctMachine, etapes)).not.toThrowError() + }) test('peut créer une demande d’octroi de PRM en Outre mer (hors Guyane)', () => { const etapes = [ @@ -71,8 +85,7 @@ describe('vérifie l’arbre d’octroi de PRM', () => { { ...ETES.saisineDuPrefet.FAIT, date: toCaminoDate('2022-04-16') }, { ...ETES.recevabiliteDeLaDemande.FAVORABLE, date: toCaminoDate('2022-04-17') }, { ...ETES.avisDeMiseEnConcurrenceAuJORF.FAIT, date: toCaminoDate('2022-04-18') }, - { ...ETES.saisineDesServices.FAIT, date: toCaminoDate('2022-04-19') }, - { ...ETES.avisDeLOfficeNationalDesForets.FAVORABLE, date: toCaminoDate('2022-04-20') }, + { ...ETES.avisDesServicesEtCommissionsConsultatives.FAIT, date: toCaminoDate('2022-04-19') }, { ...ETES.avisDeLaCommissionDepartementaleDesMines_CDM_.FAVORABLE, date: toCaminoDate('2022-05-20') }, { ...ETES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement.FAVORABLE, date: toCaminoDate('2022-05-20') }, { ...ETES.avisDuPrefet.FAVORABLE, date: toCaminoDate('2022-05-20') }, @@ -89,26 +102,26 @@ describe('vérifie l’arbre d’octroi de PRM', () => { { ...ETES.saisineDuPrefet.FAIT, date: toCaminoDate('2022-04-16') }, { ...ETES.recevabiliteDeLaDemande.FAVORABLE, date: toCaminoDate('2022-04-17') }, { ...ETES.avisDeMiseEnConcurrenceAuJORF.FAIT, date: toCaminoDate('2022-04-18') }, - { ...ETES.saisineDesServices.FAIT, date: toCaminoDate('2022-04-19') }, + { ...ETES.avisDesServicesEtCommissionsConsultatives.FAIT, date: toCaminoDate('2022-04-19') }, { ...ETES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement.FAVORABLE, date: toCaminoDate('2022-04-20') }, ] expect(() => orderAndInterpretMachine(prmOctMachine, etapes)).toThrowErrorMatchingInlineSnapshot( - `[Error: Error: cannot execute step: '{"etapeTypeId":"apd","etapeStatutId":"fav","date":"2022-04-20"}' after '["mfr_fai","mdp_fai","spp_fai","mcr_fav","anf_fai","ssr_fai"]'. The event {"type":"RENDRE_RAPPORT_DREAL","date":"2022-04-20"} should be one of 'CLASSER_SANS_SUITE,DEMANDER_INFORMATIONS,DEPOSER_DEMANDE_CONCURRENTE,DESISTER_PAR_LE_DEMANDEUR,MODIFIER_DEMANDE,RECEVOIR_INFORMATIONS,RENDRE_AVIS_AGENCE_REGIONALE_SANTE_ARS,RENDRE_AVIS_AUTORITE_MILITAIRE,RENDRE_AVIS_DES_DTT,RENDRE_AVIS_DIRECTION_REGIONALE_AFFAIRES_CULTURELLES,RENDRE_AVIS_DIRECTION_REGIONALE_FINANCES_PUBLIQUES,RENDRE_AVIS_INSTITUT_NATIONAL_ORIGINE_ET_QUALITE_INAO,RENDRE_AVIS_ONF,RENDRE_AVIS_PARC_NATIONAL,RENDRE_AVIS_PARC_NATUREL_REGIONAL,RENDRE_AVIS_SERVICE_ADMINISTRATIF_CIVIL_LOCAL']` + `[Error: Error: cannot execute step: '{"etapeTypeId":"apd","etapeStatutId":"fav","date":"2022-04-20"}' after '["mfr_fai","mdp_fai","spp_fai","mcr_fav","anf_fai","asc_fai"]'. The event {"type":"RENDRE_RAPPORT_DREAL","date":"2022-04-20"} should be one of 'CLASSER_SANS_SUITE,DEMANDER_INFORMATIONS,DEPOSER_DEMANDE_CONCURRENTE,DESISTER_PAR_LE_DEMANDEUR,MODIFIER_DEMANDE,RECEVOIR_INFORMATIONS']` ) }) - test('ne peut pas faire 2 saisines des services', () => { + test('ne peut pas faire 2 avis des services et commissions consultatives', () => { const etapes = [ { ...ETES.demande.FAIT, date: toCaminoDate('2022-04-14'), paysId: PAYS_IDS['République Française'] }, { ...ETES.depotDeLaDemande.FAIT, date: toCaminoDate('2022-04-15') }, { ...ETES.saisineDuPrefet.FAIT, date: toCaminoDate('2022-04-16') }, { ...ETES.recevabiliteDeLaDemande.FAVORABLE, date: toCaminoDate('2022-04-17') }, { ...ETES.avisDeMiseEnConcurrenceAuJORF.FAIT, date: toCaminoDate('2022-04-18') }, - { ...ETES.saisineDesServices.FAIT, date: toCaminoDate('2022-04-19') }, - { ...ETES.saisineDesServices.FAIT, date: toCaminoDate('2022-04-19') }, + { ...ETES.avisDesServicesEtCommissionsConsultatives.FAIT, date: toCaminoDate('2022-04-19') }, + { ...ETES.avisDesServicesEtCommissionsConsultatives.FAIT, date: toCaminoDate('2022-04-19') }, ] expect(() => orderAndInterpretMachine(prmOctMachine, etapes)).toThrowErrorMatchingInlineSnapshot( - `[Error: Error: cannot execute step: '{"etapeTypeId":"ssr","etapeStatutId":"fai","date":"2022-04-19"}' after '["mfr_fai","mdp_fai","spp_fai","mcr_fav","anf_fai","ssr_fai"]'. The event {"type":"FAIRE_SAISINE_DES_SERVICES","date":"2022-04-19"} should be one of 'CLASSER_SANS_SUITE,DEMANDER_INFORMATIONS,DEPOSER_DEMANDE_CONCURRENTE,DESISTER_PAR_LE_DEMANDEUR,MODIFIER_DEMANDE,RECEVOIR_INFORMATIONS,RENDRE_AVIS_AGENCE_REGIONALE_SANTE_ARS,RENDRE_AVIS_AUTORITE_MILITAIRE,RENDRE_AVIS_DES_DTT,RENDRE_AVIS_DIRECTION_REGIONALE_AFFAIRES_CULTURELLES,RENDRE_AVIS_DIRECTION_REGIONALE_FINANCES_PUBLIQUES,RENDRE_AVIS_INSTITUT_NATIONAL_ORIGINE_ET_QUALITE_INAO,RENDRE_AVIS_ONF,RENDRE_AVIS_PARC_NATIONAL,RENDRE_AVIS_PARC_NATUREL_REGIONAL,RENDRE_AVIS_SERVICE_ADMINISTRATIF_CIVIL_LOCAL']` + `[Error: Error: cannot execute step: '{"etapeTypeId":"asc","etapeStatutId":"fai","date":"2022-04-19"}' after '["mfr_fai","mdp_fai","spp_fai","mcr_fav","anf_fai","asc_fai"]'. The event {"type":"RENDRE_AVIS_SERVICES_ET_COMMISSIONS_CONSULTATIVES","date":"2022-04-19"} should be one of 'CLASSER_SANS_SUITE,DEMANDER_INFORMATIONS,DEPOSER_DEMANDE_CONCURRENTE,DESISTER_PAR_LE_DEMANDEUR,MODIFIER_DEMANDE,RECEVOIR_INFORMATIONS']` ) }) @@ -122,7 +135,7 @@ describe('vérifie l’arbre d’octroi de PRM', () => { { ...ETES.ouvertureDeLaParticipationDuPublic.FAIT, date: toCaminoDate('2022-04-19') }, ] expect(() => orderAndInterpretMachine(prmOctMachine, etapes)).toThrowErrorMatchingInlineSnapshot( - `[Error: Error: cannot execute step: '{"etapeTypeId":"ppu","etapeStatutId":"fai","date":"2022-04-19"}' after '["mfr_fai","mdp_fai","spp_fai","mcr_fav","anf_fai"]'. The event {"type":"OUVRIR_PARTICIPATION_DU_PUBLIC","date":"2022-04-19"} should be one of 'CLASSER_SANS_SUITE,DEMANDER_INFORMATIONS,DEPOSER_DEMANDE_CONCURRENTE,DESISTER_PAR_LE_DEMANDEUR,FAIRE_SAISINE_DES_SERVICES,MODIFIER_DEMANDE,RECEVOIR_INFORMATIONS']` + `[Error: Error: cannot execute step: '{"etapeTypeId":"ppu","etapeStatutId":"fai","date":"2022-04-19"}' after '["mfr_fai","mdp_fai","spp_fai","mcr_fav","anf_fai"]'. The event {"type":"OUVRIR_PARTICIPATION_DU_PUBLIC","date":"2022-04-19"} should be one of 'CLASSER_SANS_SUITE,DEMANDER_INFORMATIONS,DEPOSER_DEMANDE_CONCURRENTE,DESISTER_PAR_LE_DEMANDEUR,MODIFIER_DEMANDE,RECEVOIR_INFORMATIONS,RENDRE_AVIS_SERVICES_ET_COMMISSIONS_CONSULTATIVES']` ) }) @@ -133,8 +146,7 @@ describe('vérifie l’arbre d’octroi de PRM', () => { { ...ETES.saisineDuPrefet.FAIT, date: toCaminoDate('2022-04-16') }, { ...ETES.recevabiliteDeLaDemande.FAVORABLE, date: toCaminoDate('2022-04-17') }, { ...ETES.avisDeMiseEnConcurrenceAuJORF.FAIT, date: toCaminoDate('2022-04-18') }, - { ...ETES.saisineDesServices.FAIT, date: toCaminoDate('2022-04-19') }, - { ...ETES.avisDeLOfficeNationalDesForets.FAVORABLE, date: toCaminoDate('2022-04-20') }, + { ...ETES.avisDesServicesEtCommissionsConsultatives.FAIT, date: toCaminoDate('2022-04-19') }, { ...ETES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement.FAVORABLE, date: toCaminoDate('2022-05-20') }, { ...ETES.avisDuPrefet.FAVORABLE, date: toCaminoDate('2022-05-20') }, { ...ETES.ouvertureDeLaParticipationDuPublic.FAIT, date: toCaminoDate('2022-05-18') }, @@ -151,7 +163,7 @@ describe('vérifie l’arbre d’octroi de PRM', () => { ] expect(() => orderAndInterpretMachine(prmOctMachine, etapes)).toThrowErrorMatchingInlineSnapshot( - `[Error: Error: cannot execute step: '{"etapeTypeId":"rpu","etapeStatutId":"fai","date":"2022-06-01"}' after '["mfr_fai","mdp_fai","spp_fai","mcr_fav","anf_fai","ssr_fai","aof_fav","ppu_fai","ppc_ter","apd_fav","app_fav","cac_fai","scg_fai","rcg_fav","acg_fav","sas_fai","dex_rej","npp_fai","mno_fai"]'. The event {"type":"PUBLIER_DECISIONS_RECUEIL_ACTES_ADMINISTRATIFS"} should be one of 'RENDRE_DECISION_ABROGATION,RENDRE_DECISION_ANNULATION_PAR_JUGE_ADMINISTRATIF']` + `[Error: Error: cannot execute step: '{"etapeTypeId":"rpu","etapeStatutId":"fai","date":"2022-06-01"}' after '["mfr_fai","mdp_fai","spp_fai","mcr_fav","anf_fai","asc_fai","ppu_fai","ppc_ter","apd_fav","app_fav","cac_fai","scg_fai","rcg_fav","acg_fav","sas_fai","dex_rej","npp_fai","mno_fai"]'. The event {"type":"PUBLIER_DECISIONS_RECUEIL_ACTES_ADMINISTRATIFS"} should be one of 'RENDRE_DECISION_ABROGATION,RENDRE_DECISION_ANNULATION_PAR_JUGE_ADMINISTRATIF']` ) }) diff --git a/packages/api/src/business/rules-demarches/prm/oct.machine.ts b/packages/api/src/business/rules-demarches/prm/oct.machine.ts index d64a03d68..f689782b5 100644 --- a/packages/api/src/business/rules-demarches/prm/oct.machine.ts +++ b/packages/api/src/business/rules-demarches/prm/oct.machine.ts @@ -16,9 +16,9 @@ type OuvrirParticipationDuPublic = { type: 'OUVRIR_PARTICIPATION_DU_PUBLIC' } -type FaireSaisineDesServices = { +type RendreAvisServicesEtCommissionsConsultatives = { date: CaminoDate - type: 'FAIRE_SAISINE_DES_SERVICES' + type: 'RENDRE_AVIS_SERVICES_ET_COMMISSIONS_CONSULTATIVES' } type RendreAvisCDM = { @@ -49,17 +49,7 @@ type XStateEvent = | { type: 'DEPOSER_DEMANDE_CONCURRENTE' } | OuvrirParticipationDuPublic | { type: 'CLOTURER_PARTICIPATION_DU_PUBLIC' } - | FaireSaisineDesServices - | { type: 'RENDRE_AVIS_ONF' } - | { type: 'RENDRE_AVIS_SERVICE_ADMINISTRATIF_CIVIL_LOCAL' } - | { type: 'RENDRE_AVIS_AUTORITE_MILITAIRE' } - | { type: 'RENDRE_AVIS_DES_DTT' } - | { type: 'RENDRE_AVIS_PARC_NATUREL_REGIONAL' } - | { type: 'RENDRE_AVIS_PARC_NATIONAL' } - | { type: 'RENDRE_AVIS_AGENCE_REGIONALE_SANTE_ARS' } - | { type: 'RENDRE_AVIS_INSTITUT_NATIONAL_ORIGINE_ET_QUALITE_INAO' } - | { type: 'RENDRE_AVIS_DIRECTION_REGIONALE_AFFAIRES_CULTURELLES' } - | { type: 'RENDRE_AVIS_DIRECTION_REGIONALE_FINANCES_PUBLIQUES' } + | RendreAvisServicesEtCommissionsConsultatives | { type: 'RENDRE_AVIS_POLICE_EAU' } | RendreAvisCDM | RendreRapportDREAL @@ -111,17 +101,7 @@ const trad: { [key in Event]: { db: DBEtat; mainStep: boolean } } = { DEPOSER_DEMANDE_CONCURRENTE: { db: EtapesTypesEtapesStatuts.avisDeDemandeConcurrente, mainStep: false }, OUVRIR_PARTICIPATION_DU_PUBLIC: { db: EtapesTypesEtapesStatuts.ouvertureDeLaParticipationDuPublic, mainStep: true }, CLOTURER_PARTICIPATION_DU_PUBLIC: { db: EtapesTypesEtapesStatuts.clotureDeLaParticipationDuPublic, mainStep: true }, - FAIRE_SAISINE_DES_SERVICES: { db: EtapesTypesEtapesStatuts.saisineDesServices, mainStep: true }, - RENDRE_AVIS_ONF: { db: EtapesTypesEtapesStatuts.avisDeLOfficeNationalDesForets, mainStep: false }, - RENDRE_AVIS_SERVICE_ADMINISTRATIF_CIVIL_LOCAL: { db: EtapesTypesEtapesStatuts.avisDunServiceAdministratifLocal, mainStep: false }, - RENDRE_AVIS_AUTORITE_MILITAIRE: { db: EtapesTypesEtapesStatuts.avisDeLautoriteMilitaire, mainStep: false }, - RENDRE_AVIS_DES_DTT: { db: EtapesTypesEtapesStatuts.avisDeLaDirectionDepartementaleDesTerritoiresEtDeLaMerDDT_M_, mainStep: false }, - RENDRE_AVIS_PARC_NATUREL_REGIONAL: { db: EtapesTypesEtapesStatuts.avisDuParcNaturelRegional, mainStep: false }, - RENDRE_AVIS_PARC_NATIONAL: { db: EtapesTypesEtapesStatuts.avisDuParcNational, mainStep: false }, - RENDRE_AVIS_AGENCE_REGIONALE_SANTE_ARS: { db: EtapesTypesEtapesStatuts.avisDeLagenceRegionaleDeSante, mainStep: false }, - RENDRE_AVIS_INSTITUT_NATIONAL_ORIGINE_ET_QUALITE_INAO: { db: EtapesTypesEtapesStatuts.avisDeLInstitutNationalDeLorigineEtDeLaQualite, mainStep: false }, - RENDRE_AVIS_DIRECTION_REGIONALE_AFFAIRES_CULTURELLES: { db: EtapesTypesEtapesStatuts.avisDeDirectionRegionaleDesAffairesCulturelles, mainStep: false }, - RENDRE_AVIS_DIRECTION_REGIONALE_FINANCES_PUBLIQUES: { db: EtapesTypesEtapesStatuts.avisDeLaDirectionRegionaleDesFinancesPubliques, mainStep: false }, + RENDRE_AVIS_SERVICES_ET_COMMISSIONS_CONSULTATIVES: { db: EtapesTypesEtapesStatuts.avisDesServicesEtCommissionsConsultatives, mainStep: true }, RENDRE_AVIS_POLICE_EAU: { db: EtapesTypesEtapesStatuts.expertiseDREALOuDGTMServiceEau, mainStep: false }, RENDRE_AVIS_CDM: { db: EtapesTypesEtapesStatuts.avisDeLaCommissionDepartementaleDesMines_CDM_, mainStep: true }, @@ -165,7 +145,7 @@ export class PrmOctMachine extends CaminoMachine<PrmOctContext, XStateEvent> { switch (event) { case 'RENDRE_AVIS_DE_MISE_EN_CONCURRENCE_AU_JORF': case 'OUVRIR_PARTICIPATION_DU_PUBLIC': - case 'FAIRE_SAISINE_DES_SERVICES': + case 'RENDRE_AVIS_SERVICES_ET_COMMISSIONS_CONSULTATIVES': case 'RENDRE_AVIS_CDM': case 'RENDRE_RAPPORT_DREAL': return [{ type: event, date }] @@ -196,7 +176,7 @@ export class PrmOctMachine extends CaminoMachine<PrmOctContext, XStateEvent> { switch (eventFromEntry) { case 'RENDRE_AVIS_DE_MISE_EN_CONCURRENCE_AU_JORF': case 'OUVRIR_PARTICIPATION_DU_PUBLIC': - case 'FAIRE_SAISINE_DES_SERVICES': + case 'RENDRE_AVIS_SERVICES_ET_COMMISSIONS_CONSULTATIVES': case 'RENDRE_AVIS_CDM': case 'RENDRE_RAPPORT_DREAL': return { type: eventFromEntry, date: etape.date } @@ -225,7 +205,7 @@ export class PrmOctMachine extends CaminoMachine<PrmOctContext, XStateEvent> { interface PrmOctContext extends CaminoCommonContext { dateAvisMiseEnConcurrentJorf: CaminoDate | null - dateSaisineDesServices: CaminoDate | null + dateAvisDesServicesEtCommissionsConsultatives: CaminoDate | null paysId: PaysId | null surface: number | null } @@ -235,11 +215,11 @@ const peutOuvrirParticipationDuPublic = ({ context, event }: { context: PrmOctCo } const peutRendreRapportDREAL = ({ context, event }: { context: PrmOctContext; event: RendreRapportDREAL }): boolean => { - return isMetropole(context.paysId) && !!context.dateSaisineDesServices && daysBetween(dateAddMonths(context.dateSaisineDesServices, 1), event.date) >= 0 + return !!context.dateAvisDesServicesEtCommissionsConsultatives && daysBetween(dateAddMonths(context.dateAvisDesServicesEtCommissionsConsultatives, 1), event.date) >= 0 } const peutRendreAvisCDM = ({ context, event }: { context: PrmOctContext; event: RendreAvisCDM }): boolean => { - return isOutreMer(context.paysId) && !!context.dateSaisineDesServices && daysBetween(dateAddMonths(context.dateSaisineDesServices, 1), event.date) >= 0 + return isOutreMer(context.paysId) && !!context.dateAvisDesServicesEtCommissionsConsultatives && daysBetween(dateAddMonths(context.dateAvisDesServicesEtCommissionsConsultatives, 1), event.date) >= 0 } const estExempteDeLaMiseEnConcurrence = ({ context }: { context: PrmOctContext }): boolean => { @@ -260,7 +240,7 @@ const prmOctMachine = createMachine({ initial: 'demandeAFaire', context: { dateAvisMiseEnConcurrentJorf: null, - dateSaisineDesServices: null, + dateAvisDesServicesEtCommissionsConsultatives: null, visibilite: 'confidentielle', demarcheStatut: DemarchesStatutsIds.EnConstruction, paysId: null, @@ -398,126 +378,26 @@ const prmOctMachine = createMachine({ done: { type: 'final' }, }, }, - saisineDesServicesMachine: { - initial: 'saisineDesServicesAFaire', + avisDesServicesEtCommissionsConsultativesMachine: { + initial: 'avisDesServicesEtCommissionsConsultativesAFaire', states: { - saisineDesServicesAFaire: { + avisDesServicesEtCommissionsConsultativesAFaire: { on: { - FAIRE_SAISINE_DES_SERVICES: { - target: 'avisDesServicesARendre', + RENDRE_AVIS_SERVICES_ET_COMMISSIONS_CONSULTATIVES: { + target: 'avisDesServicesRendus', actions: assign({ - dateSaisineDesServices: ({ event }) => event.date, + dateAvisDesServicesEtCommissionsConsultatives: ({ event }) => event.date, }), }, }, }, - avisDesServicesARendre: { - type: 'parallel', - - states: { - rendreAvisDrealAFaire: { - on: { - RENDRE_AVIS_CDM: { target: '#rapportDREALAFaire', guard: peutRendreAvisCDM }, - RENDRE_RAPPORT_DREAL: { target: '#avisPrefetARendre', guard: peutRendreRapportDREAL }, - }, - }, - avisServiceAdministratifCivilLocal: { - initial: 'avisServiceAdministratifCivilLocalARendre', - states: { - avisServiceAdministratifCivilLocalARendre: { - on: { RENDRE_AVIS_SERVICE_ADMINISTRATIF_CIVIL_LOCAL: 'avisServiceAdministratifCivilLocalRendu' }, - }, - avisServiceAdministratifCivilLocalRendu: { type: 'final' }, - }, - }, - avisAutoriteMilitaire: { - initial: 'avisAutoriteMilitaireARendre', - states: { - avisAutoriteMilitaireARendre: { - on: { RENDRE_AVIS_AUTORITE_MILITAIRE: 'avisAutoriteMilitaireRendu' }, - }, - avisAutoriteMilitaireRendu: { type: 'final' }, - }, - }, - avisDesDDT: { - initial: 'avisDesDDTARendre', - states: { - avisDesDDTARendre: { - on: { - RENDRE_AVIS_DES_DTT: { target: 'avisDesDDTRendu', guard: ({ context }) => !isGuyane(context.paysId) }, - RENDRE_AVIS_POLICE_EAU: { target: 'avisDesDDTRendu', guard: ({ context }) => isGuyane(context.paysId) }, - }, - }, - avisDesDDTRendu: { type: 'final' }, - }, - }, - avisParcNaturelRegional: { - initial: 'avisParcNaturelRegionalARendre', - states: { - avisParcNaturelRegionalARendre: { - on: { RENDRE_AVIS_PARC_NATUREL_REGIONAL: 'avisParcNaturelRegionalRendu' }, - }, - avisParcNaturelRegionalRendu: { type: 'final' }, - }, - }, - avisParcNational: { - initial: 'avisParcNationalARendre', - states: { - avisParcNationalARendre: { - on: { RENDRE_AVIS_PARC_NATIONAL: 'avisParcNationalRendu' }, - }, - avisParcNationalRendu: { type: 'final' }, - }, - }, - avisAgenceRegionaleSanteARS: { - initial: 'avisAgenceRegionaleSanteARSARendre', - states: { - avisAgenceRegionaleSanteARSARendre: { - on: { RENDRE_AVIS_AGENCE_REGIONALE_SANTE_ARS: 'avisAgenceRegionaleSanteARSRendu' }, - }, - avisAgenceRegionaleSanteARSRendu: { type: 'final' }, - }, - }, - avisONF: { - initial: 'avisONFARendre', - states: { - avisONFARendre: { - on: { RENDRE_AVIS_ONF: 'avisONFRendu' }, - }, - avisONFRendu: { type: 'final' }, - }, - }, - avisInstitutNationalOrigineEtQualiteINAO: { - initial: 'avisInstitutNationalOrigineEtQualiteINAOARendre', - states: { - avisInstitutNationalOrigineEtQualiteINAOARendre: { - on: { RENDRE_AVIS_INSTITUT_NATIONAL_ORIGINE_ET_QUALITE_INAO: 'avisInstitutNationalOrigineEtQualiteINAORendu' }, - }, - avisInstitutNationalOrigineEtQualiteINAORendu: { type: 'final' }, - }, - }, - avisDirectionRegionaleAffairesCulturelles: { - initial: 'avisDirectionRegionaleAffairesCulturellesARendre', - states: { - avisDirectionRegionaleAffairesCulturellesARendre: { - on: { RENDRE_AVIS_DIRECTION_REGIONALE_AFFAIRES_CULTURELLES: 'avisDirectionRegionaleAffairesCulturellesRendu' }, - }, - avisDirectionRegionaleAffairesCulturellesRendu: { type: 'final' }, - }, - }, - avisDirectionRegionaleFinancesPubliques: { - initial: 'avisDirectionRegionaleFinancesPubliquesARendre', - states: { - avisDirectionRegionaleFinancesPubliquesARendre: { - on: { RENDRE_AVIS_DIRECTION_REGIONALE_FINANCES_PUBLIQUES: 'avisDirectionRegionaleFinancesPubliquesRendu' }, - }, - avisDirectionRegionaleFinancesPubliquesRendu: { type: 'final' }, - }, - }, + avisDesServicesRendus: { + type: 'final', + on: { + RENDRE_AVIS_CDM: { target: '#rapportDREALAFaire', guard: peutRendreAvisCDM }, + RENDRE_RAPPORT_DREAL: { target: '#avisPrefetARendre', guard: peutRendreRapportDREAL }, }, - onDone: 'avisDesServicesRendus', }, - avisDesServicesRendus: { type: 'final' }, }, }, }, @@ -537,13 +417,19 @@ const prmOctMachine = createMachine({ }, avisCommissionDepartementaleDesMinesEnGuyaneEtOutreMerARendre: { on: { - RENDRE_AVIS_CDM: 'rapportDREALAFaire', + RENDRE_AVIS_CDM: { + target: 'rapportDREALAFaire', + guard: peutRendreAvisCDM, + }, }, }, rapportDREALAFaire: { id: 'rapportDREALAFaire', on: { - RENDRE_RAPPORT_DREAL: 'avisPrefetARendre', + RENDRE_RAPPORT_DREAL: { + target: 'avisPrefetARendre', + guard: peutRendreRapportDREAL, + }, }, }, avisPrefetARendre: { diff --git a/packages/api/src/business/rules-demarches/pxg/oct.cas.json b/packages/api/src/business/rules-demarches/pxg/oct.cas.json index 5c5ede6ba..96d3f064d 100644 --- a/packages/api/src/business/rules-demarches/pxg/oct.cas.json +++ b/packages/api/src/business/rules-demarches/pxg/oct.cas.json @@ -1 +1 @@ -[{"id":0,"demarcheStatutId":"eco","demarchePublique":false,"etapes":[{"date":"2022-03-26","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR","surface":0.15}]},{"id":1,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-07-03","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR"},{"date":"2020-07-12","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-09-08","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2020-10-05","etapeTypeId":"rca","etapeStatutId":"fai","paysId":"FR"},{"date":"2020-11-16","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-07-15","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2021-07-21","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-07-26","etapeTypeId":"wse","etapeStatutId":"fai"},{"date":"2021-09-26","etapeTypeId":"wae","etapeStatutId":"fav"},{"date":"2021-12-05","etapeTypeId":"epu","etapeStatutId":"fai"},{"date":"2022-01-03","etapeTypeId":"epc","etapeStatutId":"ter"},{"date":"2022-04-11","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-05-02","etapeTypeId":"wtp","etapeStatutId":"fai"},{"date":"2022-05-13","etapeTypeId":"wau","etapeStatutId":"fav"},{"date":"2022-05-13","etapeTypeId":"acd","etapeStatutId":"fav"},{"date":"2022-05-23","etapeTypeId":"dex","etapeStatutId":"acc","paysId":"FR"}]},{"id":2,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2019-06-23","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR"},{"date":"2019-06-23","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2019-09-12","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2020-02-24","etapeTypeId":"rca","etapeStatutId":"fai","paysId":"FR"},{"date":"2020-04-03","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-04-03","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2020-04-11","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2020-05-12","etapeTypeId":"wse","etapeStatutId":"fai"},{"date":"2020-07-12","etapeTypeId":"wae","etapeStatutId":"fav"},{"date":"2022-05-09","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-06-05","etapeTypeId":"wtp","etapeStatutId":"fai"},{"date":"2022-06-05","etapeTypeId":"wau","etapeStatutId":"fav"},{"date":"2022-06-05","etapeTypeId":"acd","etapeStatutId":"fav"},{"date":"2022-07-25","etapeTypeId":"dex","etapeStatutId":"acc","paysId":"FR"}]},{"id":3,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-11-17","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR"},{"date":"2020-11-17","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-04-11","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-06-13","etapeTypeId":"rca","etapeStatutId":"fai","paysId":"FR"},{"date":"2021-06-28","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-06-28","etapeTypeId":"wse","etapeStatutId":"fai"},{"date":"2021-06-29","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-08-29","etapeTypeId":"wae","etapeStatutId":"fav"},{"date":"2021-08-30","etapeTypeId":"ama","etapeStatutId":"fav"},{"date":"2021-09-13","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2022-01-26","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-02-01","etapeTypeId":"wtp","etapeStatutId":"fai"},{"date":"2022-02-12","etapeTypeId":"wau","etapeStatutId":"fav"},{"date":"2022-02-13","etapeTypeId":"acd","etapeStatutId":"fav"},{"date":"2022-02-21","etapeTypeId":"dex","etapeStatutId":"acc","paysId":"FR"}]},{"id":4,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2019-12-19","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR","surface":0.03},{"date":"2019-12-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-04-06","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2020-05-28","etapeTypeId":"rca","etapeStatutId":"fai","paysId":"FR","surface":0.03},{"date":"2020-07-08","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-07-08","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2020-07-08","etapeTypeId":"wse","etapeStatutId":"fai"},{"date":"2020-07-08","etapeTypeId":"wae","etapeStatutId":"fav"},{"date":"2020-07-08","etapeTypeId":"epu","etapeStatutId":"fai"},{"date":"2020-07-08","etapeTypeId":"epc","etapeStatutId":"ter"},{"date":"2020-07-08","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2020-08-05","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2020-08-05","etapeTypeId":"wtp","etapeStatutId":"fai"},{"date":"2020-08-05","etapeTypeId":"wau","etapeStatutId":"fav"},{"date":"2020-09-30","etapeTypeId":"dex","etapeStatutId":"acc","paysId":"FR","surface":0.03}]},{"id":5,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2017-10-31","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR"},{"date":"2017-10-31","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2018-01-10","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2018-12-15","etapeTypeId":"rca","etapeStatutId":"fai","paysId":"FR"},{"date":"2019-01-17","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2019-01-17","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2019-01-17","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2019-01-18","etapeTypeId":"wse","etapeStatutId":"fai"},{"date":"2019-03-18","etapeTypeId":"wae","etapeStatutId":"fav"},{"date":"2019-08-23","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2019-09-13","etapeTypeId":"wtp","etapeStatutId":"fai"},{"date":"2019-09-13","etapeTypeId":"wau","etapeStatutId":"fav"},{"date":"2019-09-13","etapeTypeId":"acd","etapeStatutId":"fav"},{"date":"2019-10-10","etapeTypeId":"dex","etapeStatutId":"acc","paysId":"FR"}]},{"id":6,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-06-27","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR","surface":0.19},{"date":"2022-06-27","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-07-02","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-09-04","etapeTypeId":"wse","etapeStatutId":"fai"},{"date":"2022-11-04","etapeTypeId":"wae","etapeStatutId":"fav"},{"date":"2022-12-15","etapeTypeId":"epu","etapeStatutId":"fai"},{"date":"2023-01-16","etapeTypeId":"ssr","etapeStatutId":"fai"},{"date":"2023-01-16","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2023-01-16","etapeTypeId":"epc","etapeStatutId":"ter"},{"date":"2023-04-21","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2023-06-03","etapeTypeId":"wtp","etapeStatutId":"fai"},{"date":"2023-06-17","etapeTypeId":"wau","etapeStatutId":"fav"},{"date":"2023-06-23","etapeTypeId":"dex","etapeStatutId":"acc","paysId":"FR","surface":0.19}]},{"id":7,"demarcheStatutId":"eco","demarchePublique":false,"etapes":[]}] +[{"id":0,"demarcheStatutId":"eco","demarchePublique":false,"etapes":[{"date":"2022-03-26","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR","surface":0.15}]},{"id":1,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-07-03","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR"},{"date":"2020-07-12","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-09-08","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2020-10-05","etapeTypeId":"rca","etapeStatutId":"fai","paysId":"FR"},{"date":"2020-11-16","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-07-15","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2021-07-21","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-07-26","etapeTypeId":"wse","etapeStatutId":"fai"},{"date":"2021-09-26","etapeTypeId":"wae","etapeStatutId":"fav"},{"date":"2021-12-05","etapeTypeId":"epu","etapeStatutId":"fai"},{"date":"2022-01-03","etapeTypeId":"epc","etapeStatutId":"ter"},{"date":"2022-04-11","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-05-02","etapeTypeId":"wtp","etapeStatutId":"fai"},{"date":"2022-05-13","etapeTypeId":"wau","etapeStatutId":"fav"},{"date":"2022-05-23","etapeTypeId":"dex","etapeStatutId":"acc","paysId":"FR"}]},{"id":2,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2019-06-23","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR"},{"date":"2019-06-23","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2019-09-12","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2020-02-24","etapeTypeId":"rca","etapeStatutId":"fai","paysId":"FR"},{"date":"2020-04-03","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-04-03","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-04-11","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2020-05-12","etapeTypeId":"wse","etapeStatutId":"fai"},{"date":"2020-07-12","etapeTypeId":"wae","etapeStatutId":"fav"},{"date":"2022-05-09","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-06-05","etapeTypeId":"wtp","etapeStatutId":"fai"},{"date":"2022-06-05","etapeTypeId":"wau","etapeStatutId":"fav"},{"date":"2022-07-25","etapeTypeId":"dex","etapeStatutId":"acc","paysId":"FR"}]},{"id":3,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2020-11-17","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR"},{"date":"2020-11-17","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2021-04-11","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2021-06-13","etapeTypeId":"rca","etapeStatutId":"fai","paysId":"FR"},{"date":"2021-06-28","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2021-06-28","etapeTypeId":"wse","etapeStatutId":"fai"},{"date":"2021-06-29","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2021-08-29","etapeTypeId":"wae","etapeStatutId":"fav"},{"date":"2021-08-30","etapeTypeId":"ama","etapeStatutId":"fav"},{"date":"2021-09-13","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2022-01-26","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2022-02-01","etapeTypeId":"wtp","etapeStatutId":"fai"},{"date":"2022-02-12","etapeTypeId":"wau","etapeStatutId":"fav"},{"date":"2022-02-21","etapeTypeId":"dex","etapeStatutId":"acc","paysId":"FR"}]},{"id":4,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2019-12-19","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR","surface":0.03},{"date":"2019-12-19","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2020-04-06","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2020-05-28","etapeTypeId":"rca","etapeStatutId":"fai","paysId":"FR","surface":0.03},{"date":"2020-07-08","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2020-07-08","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2020-07-08","etapeTypeId":"wse","etapeStatutId":"fai"},{"date":"2020-07-08","etapeTypeId":"wae","etapeStatutId":"fav"},{"date":"2020-07-08","etapeTypeId":"epu","etapeStatutId":"fai"},{"date":"2020-07-08","etapeTypeId":"epc","etapeStatutId":"ter"},{"date":"2020-07-08","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2020-08-05","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2020-08-05","etapeTypeId":"wtp","etapeStatutId":"fai"},{"date":"2020-08-05","etapeTypeId":"wau","etapeStatutId":"fav"},{"date":"2020-09-30","etapeTypeId":"dex","etapeStatutId":"acc","paysId":"FR","surface":0.03}]},{"id":5,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2017-10-31","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR"},{"date":"2017-10-31","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2018-01-10","etapeTypeId":"mca","etapeStatutId":"fai"},{"date":"2018-12-15","etapeTypeId":"rca","etapeStatutId":"fai","paysId":"FR"},{"date":"2019-01-17","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2019-01-17","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2019-01-17","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2019-01-18","etapeTypeId":"wse","etapeStatutId":"fai"},{"date":"2019-03-18","etapeTypeId":"wae","etapeStatutId":"fav"},{"date":"2019-08-23","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2019-09-13","etapeTypeId":"wtp","etapeStatutId":"fai"},{"date":"2019-09-13","etapeTypeId":"wau","etapeStatutId":"fav"},{"date":"2019-10-10","etapeTypeId":"dex","etapeStatutId":"acc","paysId":"FR"}]},{"id":6,"demarcheStatutId":"acc","demarchePublique":true,"etapes":[{"date":"2022-06-27","etapeTypeId":"mfr","etapeStatutId":"fai","paysId":"FR","surface":0.19},{"date":"2022-06-27","etapeTypeId":"mdp","etapeStatutId":"fai"},{"date":"2022-07-02","etapeTypeId":"mcr","etapeStatutId":"fav"},{"date":"2022-09-04","etapeTypeId":"wse","etapeStatutId":"fai"},{"date":"2022-11-04","etapeTypeId":"wae","etapeStatutId":"fav"},{"date":"2022-12-15","etapeTypeId":"epu","etapeStatutId":"fai"},{"date":"2023-01-16","etapeTypeId":"asc","etapeStatutId":"fai"},{"date":"2023-01-16","etapeTypeId":"scl","etapeStatutId":"fai"},{"date":"2023-01-16","etapeTypeId":"epc","etapeStatutId":"ter"},{"date":"2023-04-21","etapeTypeId":"apd","etapeStatutId":"fav"},{"date":"2023-06-03","etapeTypeId":"wtp","etapeStatutId":"fai"},{"date":"2023-06-17","etapeTypeId":"wau","etapeStatutId":"fav"},{"date":"2023-06-23","etapeTypeId":"dex","etapeStatutId":"acc","paysId":"FR","surface":0.19}]},{"id":7,"demarcheStatutId":"eco","demarchePublique":false,"etapes":[]}] diff --git a/packages/api/src/business/rules-demarches/pxg/oct.machine.test.ts b/packages/api/src/business/rules-demarches/pxg/oct.machine.test.ts index 0c95b4427..27deba799 100644 --- a/packages/api/src/business/rules-demarches/pxg/oct.machine.test.ts +++ b/packages/api/src/business/rules-demarches/pxg/oct.machine.test.ts @@ -31,11 +31,7 @@ describe('vérifie l’arbre d’octroi des PXG', () => { ...ETES.recevabiliteDeLaDemande.FAVORABLE, date: toCaminoDate('2022-04-17'), }, - { ...ETES.saisineDesServices.FAIT, date: toCaminoDate('2022-04-18') }, - { - ...ETES.avisDeLaDirectionDesEntreprisesDeLaConcurrenceDeLaConsommationDuTravailEtDeLemploi.FAVORABLE, - date: toCaminoDate('2022-04-18'), - }, + { ...ETES.avisDesServicesEtCommissionsConsultatives.FAIT, date: toCaminoDate('2022-04-18') }, { ...ETES.saisineDesCollectivitesLocales.FAIT, date: toCaminoDate('2022-04-19'), @@ -94,11 +90,7 @@ describe('vérifie l’arbre d’octroi des PXG', () => { ...ETES.recevabiliteDeLaDemande.FAVORABLE, date: toCaminoDate('2022-04-17'), }, - { ...ETES.saisineDesServices.FAIT, date: toCaminoDate('2022-04-18') }, - { - ...ETES.avisDeLaDirectionDesEntreprisesDeLaConcurrenceDeLaConsommationDuTravailEtDeLemploi.FAVORABLE, - date: toCaminoDate('2022-04-18'), - }, + { ...ETES.avisDesServicesEtCommissionsConsultatives.FAIT, date: toCaminoDate('2022-04-18') }, { ...ETES.saisineDesCollectivitesLocales.FAIT, date: toCaminoDate('2022-04-19'), diff --git a/packages/api/src/business/rules-demarches/pxg/oct.machine.ts b/packages/api/src/business/rules-demarches/pxg/oct.machine.ts index 328f7b3b6..882b8411e 100644 --- a/packages/api/src/business/rules-demarches/pxg/oct.machine.ts +++ b/packages/api/src/business/rules-demarches/pxg/oct.machine.ts @@ -12,17 +12,7 @@ type PXGOctXStateEvent = | { type: 'FAIRE_RECEVABILITE_DEMANDE_DEFAVORABLE' } | { type: 'RECEVOIR_MODIFICATION_DE_LA_DEMANDE' } | { type: 'RECEVOIR_COMPLEMENTS_POUR_RECEVABILITE' } - | { type: 'FAIRE_SAISINES_DES_SERVICES' } - | { type: 'RENDRE_AVIS_DGTM_MNBST' } - | { type: 'RENDRE_AVIS_DGTMAUCL' } - | { - type: 'RENDRE_AVIS_DIRECTION_ENTREPRISE_CONCURRENCE_CONSOMMATION_TRAVAIL_EMPLOI' - } - | { type: 'RENDRE_AVIS_DIRECTION_ALIMENTATION_AGRICULTURE_FORET' } - | { type: 'RENDRE_AVIS_DIRECTION_REGIONALE_AFFAIRES_CULTURELLES' } - | { type: 'RENDRE_AVIS_DIRECTION_REGIONALE_FINANCES_PUBLIQUES' } - | { type: 'RENDRE_AVIS_CAISSE_GENERALE_DE_SECURITE_SOCIALE' } - | { type: 'RENDRE_AVIS_AGENCE_REGIONALE_SANTE' } + | { type: 'RENDRE_AVIS_SERVICES_ET_COMMISSIONS_CONSULTATIVES' } | { type: 'RENDRE_AVIS_DREAL' } | { type: 'FAIRE_SAISINE_DES_COLLECTIVITES_LOCALES' } | { type: 'RENDRE_CONSULTATION_DES_CONSEILS_MUNICIPAUX' } @@ -33,7 +23,6 @@ type PXGOctXStateEvent = | { type: 'CLOTURER_ENQUETE_PUBLIQUE' } | { type: 'TRANSMETTRE_PROJET_DE_PRESCRIPTIONS_AU_DEMANDEUR' } | { type: 'RENDRE_AVIS_DU_DEMANDEUR_SUR_LES_PRESCRIPTIONS_PROPOSEES' } - | { type: 'RENDRE_PASSAGE_CODERST' } | { type: 'RENDRE_DECISION_ADMINISTRATION_FAVORABLE' } | { type: 'RENDRE_DECISION_ADMINISTRATION_DEFAVORABLE' } | { type: 'NOTIFICATION_DU_DEMANDEUR' } @@ -73,15 +62,7 @@ const trad: { [key in Event]: { db: DBEtat; mainStep: boolean } } = { DEMANDER_COMPLEMENTS_POUR_RECEVABILITE: { db: ETES.demandeDeComplements_RecevabiliteDeLaDemande_, mainStep: false }, RECEVOIR_MODIFICATION_DE_LA_DEMANDE: { db: ETES.modificationDeLaDemande, mainStep: true }, RECEVOIR_COMPLEMENTS_POUR_RECEVABILITE: { db: ETES.receptionDeComplements_RecevabiliteDeLaDemande_, mainStep: false }, - FAIRE_SAISINES_DES_SERVICES: { db: ETES.saisineDesServices, mainStep: true }, - RENDRE_AVIS_DGTM_MNBST: { db: ETES.avisDGTMServiceMilieuxNaturelsBiodiversiteSitesEtPaysages_MNBST_, mainStep: false }, - RENDRE_AVIS_DGTMAUCL: { db: ETES.avisDGTMServiceAmenagementUrbanismeConstructionLogement_AUCL_, mainStep: false }, - RENDRE_AVIS_DIRECTION_ENTREPRISE_CONCURRENCE_CONSOMMATION_TRAVAIL_EMPLOI: { db: ETES.avisDeLaDirectionDesEntreprisesDeLaConcurrenceDeLaConsommationDuTravailEtDeLemploi, mainStep: false }, - RENDRE_AVIS_DIRECTION_ALIMENTATION_AGRICULTURE_FORET: { db: ETES.avisDeLaDirectionDalimentationDeLagricultureEtDeLaForet, mainStep: false }, - RENDRE_AVIS_DIRECTION_REGIONALE_AFFAIRES_CULTURELLES: { db: ETES.avisDeDirectionRegionaleDesAffairesCulturelles, mainStep: false }, - RENDRE_AVIS_AGENCE_REGIONALE_SANTE: { db: ETES.avisDeLagenceRegionaleDeSante, mainStep: false }, - RENDRE_AVIS_DIRECTION_REGIONALE_FINANCES_PUBLIQUES: { db: ETES.avisDeLaDirectionRegionaleDesFinancesPubliques, mainStep: false }, - RENDRE_AVIS_CAISSE_GENERALE_DE_SECURITE_SOCIALE: { db: ETES.avisDeLaCaisseGeneraleDeSecuriteSociale, mainStep: false }, + RENDRE_AVIS_SERVICES_ET_COMMISSIONS_CONSULTATIVES: { db: ETES.avisDesServicesEtCommissionsConsultatives, mainStep: true }, RENDRE_AVIS_DREAL: { db: ETES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement, mainStep: true }, FAIRE_SAISINE_DES_COLLECTIVITES_LOCALES: { db: ETES.saisineDesCollectivitesLocales, mainStep: true }, RENDRE_CONSULTATION_DES_CONSEILS_MUNICIPAUX: { db: ETES.avisDunMaire, mainStep: false }, @@ -92,7 +73,6 @@ const trad: { [key in Event]: { db: DBEtat; mainStep: boolean } } = { CLOTURER_ENQUETE_PUBLIQUE: { db: ETES.clotureDeLenquetePublique, mainStep: false }, TRANSMETTRE_PROJET_DE_PRESCRIPTIONS_AU_DEMANDEUR: { db: ETES.transmissionDuProjetDePrescriptionsAuDemandeur, mainStep: true }, RENDRE_AVIS_DU_DEMANDEUR_SUR_LES_PRESCRIPTIONS_PROPOSEES: { db: ETES.avisDuDemandeurSurLesPrescriptionsProposees, mainStep: true }, - RENDRE_PASSAGE_CODERST: { db: ETES.avisDuConseilDepartementalDeLenvironnementEtDesRisquesSanitairesEtTechnologiques_Coderst_, mainStep: false }, NOTIFICATION_DU_DEMANDEUR: { db: ETES.notificationAuDemandeur, mainStep: true }, PUBLIER_DECISION_RECUEIL_DES_ACTES_ADMINISTRATIFS: { db: ETES.publicationDeDecisionAuRecueilDesActesAdministratifs, mainStep: true }, FAIRE_DESISTEMENT_DEMANDEUR: { db: ETES.desistementDuDemandeur, mainStep: false }, @@ -130,7 +110,7 @@ export class PxgOctMachine extends CaminoMachine<PxgContext, PXGOctXStateEvent> } interface PxgContext extends CaminoCommonContext { - saisineDesServicesFaite: boolean + avisDesServicesEtCommissionsConsultativesFaite: boolean saisineDesCollectivitesLocalesFaites: boolean saisineAutoriteEnvironnementaleFaite: boolean avisAutoriteEnvironnementaleFaite: boolean @@ -139,7 +119,7 @@ interface PxgContext extends CaminoCommonContext { } const peutRendreAvisDREAL = ({ context }: { context: PxgContext }): boolean => { - return context.saisineDesServicesFaite && context.saisineDesCollectivitesLocalesFaites && context.avisAutoriteEnvironnementaleFaite + return context.avisDesServicesEtCommissionsConsultativesFaite && context.saisineDesCollectivitesLocalesFaites && context.avisAutoriteEnvironnementaleFaite } const pxgOctMachine = createMachine({ @@ -149,7 +129,7 @@ const pxgOctMachine = createMachine({ context: { demarcheStatut: DemarchesStatutsIds.EnConstruction, visibilite: 'confidentielle', - saisineDesServicesFaite: false, + avisDesServicesEtCommissionsConsultativesFaite: false, saisineDesCollectivitesLocalesFaites: false, saisineAutoriteEnvironnementaleFaite: false, avisAutoriteEnvironnementaleFaite: false, @@ -262,15 +242,15 @@ const pxgOctMachine = createMachine({ }, }, }, - saisineDesServicesMachine: { - initial: 'saisineDesServicesAFaire', + avisDesServicesEtCommissionsConsultativesMachine: { + initial: 'avisDesServicesEtCommissionsConsultativesAFaire', states: { - saisineDesServicesAFaire: { + avisDesServicesEtCommissionsConsultativesAFaire: { on: { - FAIRE_SAISINES_DES_SERVICES: { - target: 'avisDesServicesARendre', + RENDRE_AVIS_SERVICES_ET_COMMISSIONS_CONSULTATIVES: { + target: 'avisDesServicesEtCommissionsConsultativesRendu', actions: assign({ - saisineDesServicesFaite: true, + avisDesServicesEtCommissionsConsultativesFaite: true, demarcheStatut: ({ context }) => { return context.saisineDesCollectivitesLocalesFaites && context.saisineAutoriteEnvironnementaleFaite ? DemarchesStatutsIds.EnInstruction : context.demarcheStatut }, @@ -278,100 +258,8 @@ const pxgOctMachine = createMachine({ }, }, }, - avisDesServicesARendre: { - type: 'parallel', - states: { - avisDgtmMNBSTMachine: { - initial: 'avisDgtmMNBSTARendre', - states: { - avisDgtmMNBSTARendre: { - on: { RENDRE_AVIS_DGTM_MNBST: 'avisDgtmMNBSTRendu' }, - }, - avisDgtmMNBSTRendu: { type: 'final' }, - }, - }, - avisDGTMAUCLMachine: { - initial: 'avisDGTMAUCLARendre', - states: { - avisDGTMAUCLARendre: { - on: { RENDRE_AVIS_DGTMAUCL: 'avisDGTMAUCLRendu' }, - }, - avisDGTMAUCLRendu: { type: 'final' }, - }, - }, - avisDirectionEntrepriseConcurrenceConsommationTravailEmploiMachine: { - initial: 'avisDirectionEntrepriseConcurrenceConsommationTravailEmploiARendre', - states: { - avisDirectionEntrepriseConcurrenceConsommationTravailEmploiARendre: { - on: { - RENDRE_AVIS_DIRECTION_ENTREPRISE_CONCURRENCE_CONSOMMATION_TRAVAIL_EMPLOI: 'avisDirectionEntrepriseConcurrenceConsommationTravailEmploiRendu', - }, - }, - avisDirectionEntrepriseConcurrenceConsommationTravailEmploiRendu: { type: 'final' }, - }, - }, - avisDirectionAlimentationAgricultureForetMachine: { - initial: 'avisDirectionAlimentationAgricultureForetARendre', - states: { - avisDirectionAlimentationAgricultureForetARendre: { - on: { - RENDRE_AVIS_DIRECTION_ALIMENTATION_AGRICULTURE_FORET: 'avisDirectionAlimentationAgricultureForetRendu', - }, - }, - avisDirectionAlimentationAgricultureForetRendu: { - type: 'final', - }, - }, - }, - avisDirectionRegionaleAffairesCulturellesMachine: { - initial: 'avisDirectionRegionaleAffairesCulturellesARendre', - states: { - avisDirectionRegionaleAffairesCulturellesARendre: { - on: { - RENDRE_AVIS_DIRECTION_REGIONALE_AFFAIRES_CULTURELLES: 'avisDirectionRegionaleAffairesCulturellesRendu', - }, - }, - avisDirectionRegionaleAffairesCulturellesRendu: { - type: 'final', - }, - }, - }, - avisAgenceRegionaleSanteMachine: { - initial: 'avisAgenceRegionaleSanteARendre', - states: { - avisAgenceRegionaleSanteARendre: { - on: { - RENDRE_AVIS_AGENCE_REGIONALE_SANTE: 'avisAgenceRegionaleSanteRendu', - }, - }, - avisAgenceRegionaleSanteRendu: { type: 'final' }, - }, - }, - avisDirectionRegionaleFinancesPubliquesMachine: { - initial: 'avisDirectionRegionaleFinancesPubliquesARendre', - states: { - avisDirectionRegionaleFinancesPubliquesARendre: { - on: { - RENDRE_AVIS_DIRECTION_REGIONALE_FINANCES_PUBLIQUES: 'avisDirectionRegionaleFinancesPubliquesRendu', - }, - }, - avisDirectionRegionaleFinancesPubliquesRendu: { - type: 'final', - }, - }, - }, - avisCaisseGeneraleDeSecuriteSocialeMachine: { - initial: 'avisCaisseGeneraleDeSecuriteSocialeARendre', - states: { - avisCaisseGeneraleDeSecuriteSocialeARendre: { - on: { - RENDRE_AVIS_CAISSE_GENERALE_DE_SECURITE_SOCIALE: 'avisCaisseGeneraleDeSecuriteSocialeRendu', - }, - }, - avisCaisseGeneraleDeSecuriteSocialeRendu: { type: 'final' }, - }, - }, - }, + avisDesServicesEtCommissionsConsultativesRendu: { + type: 'final', }, }, }, @@ -385,7 +273,7 @@ const pxgOctMachine = createMachine({ actions: assign({ saisineDesCollectivitesLocalesFaites: true, demarcheStatut: ({ context }) => { - return context.saisineAutoriteEnvironnementaleFaite && context.saisineDesServicesFaite ? DemarchesStatutsIds.EnInstruction : context.demarcheStatut + return context.saisineAutoriteEnvironnementaleFaite && context.avisDesServicesEtCommissionsConsultativesFaite ? DemarchesStatutsIds.EnInstruction : context.demarcheStatut }, }), }, @@ -433,7 +321,7 @@ const pxgOctMachine = createMachine({ actions: assign({ saisineAutoriteEnvironnementaleFaite: true, demarcheStatut: ({ context, event: _event }) => { - return context.saisineDesCollectivitesLocalesFaites && context.saisineDesServicesFaite ? DemarchesStatutsIds.EnInstruction : context.demarcheStatut + return context.saisineDesCollectivitesLocalesFaites && context.avisDesServicesEtCommissionsConsultativesFaite ? DemarchesStatutsIds.EnInstruction : context.demarcheStatut }, }), }, @@ -483,7 +371,6 @@ const pxgOctMachine = createMachine({ }, passageCoderstOuDecisionDeLAdministrationARendre: { on: { - RENDRE_PASSAGE_CODERST: 'decisionDeLAdministrationARendre', RENDRE_DECISION_ADMINISTRATION_FAVORABLE: { target: 'notificationDuDemandeurEtPublicationDeDecisionAuRecueilDesActesAdministratifsAFaire', actions: assign({ diff --git a/packages/api/src/business/rules/__snapshots__/titre-activites-build.test.ts.snap b/packages/api/src/business/rules/__snapshots__/titre-activites-build.test.ts.snap index e418227e4..967048bcb 100644 --- a/packages/api/src/business/rules/__snapshots__/titre-activites-build.test.ts.snap +++ b/packages/api/src/business/rules/__snapshots__/titre-activites-build.test.ts.snap @@ -14,6 +14,7 @@ exports[`construction des activités d'un titre > crée des activités 1`] = ` "description": "<b>g (gramme)</b> contenu dans les minerais", "id": "auru", "nom": "or", + "optionnel": false, "type": "number", "uniteId": "mgr", }, @@ -21,6 +22,7 @@ exports[`construction des activités d'un titre > crée des activités 1`] = ` "description": "<b>x 1000 t (millier de tonnes)</b> extrait par abattage net livré", "id": "naca", "nom": "sel (chlorure de sodium)", + "optionnel": false, "type": "number", "uniteId": "mtk", }, @@ -28,6 +30,7 @@ exports[`construction des activités d'un titre > crée des activités 1`] = ` "description": "<b>x 1000 t (millier de tonnes)</b> extrait en dissolution par sondage et livré raffiné", "id": "nacb", "nom": "sel (chlorure de sodium)", + "optionnel": false, "type": "number", "uniteId": "mtk", }, @@ -35,6 +38,7 @@ exports[`construction des activités d'un titre > crée des activités 1`] = ` "description": "<b>x 1000 t (millier de tonnes)</b> extrait en dissolution par sondage et livré en dissolution", "id": "nacc", "nom": "sel (chlorure de sodium contenu)", + "optionnel": false, "type": "number", "uniteId": "mtk", }, @@ -77,12 +81,14 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "description": "Masse d’or brut en sortie de mine extrait au cours du trimestre (exemple : masse sous la forme de concentré gravimétrique).", "id": "orBrut", "nom": "Or brut extrait (g)", + "optionnel": false, "type": "number", }, { "description": "Masse en gramme de l’ensemble des produits contaminés envoyés en traitement au cours du trimestre.", "id": "mercure", "nom": "Mercure récupéré (g)", + "optionnel": false, "type": "number", }, { @@ -90,12 +96,14 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "description": "Volume total en litre de carburant détaxé consommé au cours du trimestre par les travaux réalisés sur le chantier.", "id": "carburantDetaxe", "nom": "Carburant détaxé (l)", + "optionnel": false, "type": "number", }, { "description": "Volume total en litre de carburant conventionnel consommé au cours du trimestre par les travaux réalisés sur le chantier.", "id": "carburantConventionnel", "nom": "Carburant conventionnel (l)", + "optionnel": false, "type": "number", }, { @@ -103,6 +111,7 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "description": "Nombre moyen de pompes actives au cours du trimestre utilisées sur le chantier (pompe à gravier, pompe de relevage…).", "id": "pompes", "nom": "Pompes actives", + "optionnel": false, "type": "number", }, { @@ -110,12 +119,14 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "description": "Nombre moyen de pelles actives au cours du trimestre utilisées sur le chantier (aménagement, exploitation, réhabilitation).", "id": "pelles", "nom": "Pelles actives", + "optionnel": false, "type": "number", }, { "description": "Nombre moyen de salariés sur le chantier au cours du trimestre.", "id": "effectifs", "nom": "Effectifs", + "optionnel": false, "type": "number", }, { @@ -123,6 +134,7 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "description": "Montant en euros des investissements consentis au cours du trimestre listés à l’<a href="https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000021850940&cidTexte=LEGITEXT000006069569" target="_blank" title="Page de l’article - site externe" rel="noopener noreferrer">article 318 C de l’annexe II du code général des impôts</a>. Afin de bénéficier des déductions fiscales afférentes, les justificatifs attestant de la réalisation effective des investissements sont susceptibles de vous êtres demandés par l’administration.", "id": "environnement", "nom": "Dépenses relatives à la protection de l’environnement (euros)", + "optionnel": false, "type": "number", }, ], @@ -135,6 +147,7 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "dateDebut": "2018-01-01", "id": "1", "nom": "Janvier", + "optionnel": false, "options": [ { "id": "nonDebutes", @@ -164,6 +177,7 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "dateDebut": "2018-01-01", "id": "2", "nom": "Février", + "optionnel": false, "options": [ { "id": "nonDebutes", @@ -193,6 +207,7 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "dateDebut": "2018-01-01", "id": "3", "nom": "Mars", + "optionnel": false, "options": [ { "id": "nonDebutes", @@ -252,12 +267,14 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "description": "Masse d’or brut en sortie de mine extrait au cours du trimestre (exemple : masse sous la forme de concentré gravimétrique).", "id": "orBrut", "nom": "Or brut extrait (g)", + "optionnel": false, "type": "number", }, { "description": "Masse en gramme de l’ensemble des produits contaminés envoyés en traitement au cours du trimestre.", "id": "mercure", "nom": "Mercure récupéré (g)", + "optionnel": false, "type": "number", }, { @@ -265,12 +282,14 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "description": "Volume total en litre de carburant détaxé consommé au cours du trimestre par les travaux réalisés sur le chantier.", "id": "carburantDetaxe", "nom": "Carburant détaxé (l)", + "optionnel": false, "type": "number", }, { "description": "Volume total en litre de carburant conventionnel consommé au cours du trimestre par les travaux réalisés sur le chantier.", "id": "carburantConventionnel", "nom": "Carburant conventionnel (l)", + "optionnel": false, "type": "number", }, { @@ -278,6 +297,7 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "description": "Nombre moyen de pompes actives au cours du trimestre utilisées sur le chantier (pompe à gravier, pompe de relevage…).", "id": "pompes", "nom": "Pompes actives", + "optionnel": false, "type": "number", }, { @@ -285,12 +305,14 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "description": "Nombre moyen de pelles actives au cours du trimestre utilisées sur le chantier (aménagement, exploitation, réhabilitation).", "id": "pelles", "nom": "Pelles actives", + "optionnel": false, "type": "number", }, { "description": "Nombre moyen de salariés sur le chantier au cours du trimestre.", "id": "effectifs", "nom": "Effectifs", + "optionnel": false, "type": "number", }, { @@ -298,6 +320,7 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "description": "Montant en euros des investissements consentis au cours du trimestre listés à l’<a href="https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000021850940&cidTexte=LEGITEXT000006069569" target="_blank" title="Page de l’article - site externe" rel="noopener noreferrer">article 318 C de l’annexe II du code général des impôts</a>. Afin de bénéficier des déductions fiscales afférentes, les justificatifs attestant de la réalisation effective des investissements sont susceptibles de vous êtres demandés par l’administration.", "id": "environnement", "nom": "Dépenses relatives à la protection de l’environnement (euros)", + "optionnel": false, "type": "number", }, ], @@ -310,6 +333,7 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "dateDebut": "2018-01-01", "id": "4", "nom": "Avril", + "optionnel": false, "options": [ { "id": "nonDebutes", @@ -339,6 +363,7 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "dateDebut": "2018-01-01", "id": "5", "nom": "Mai", + "optionnel": false, "options": [ { "id": "nonDebutes", @@ -368,6 +393,7 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "dateDebut": "2018-01-01", "id": "6", "nom": "Juin", + "optionnel": false, "options": [ { "id": "nonDebutes", @@ -427,12 +453,14 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "description": "Masse d’or brut en sortie de mine extrait au cours du trimestre (exemple : masse sous la forme de concentré gravimétrique).", "id": "orBrut", "nom": "Or brut extrait (g)", + "optionnel": false, "type": "number", }, { "description": "Masse en gramme de l’ensemble des produits contaminés envoyés en traitement au cours du trimestre.", "id": "mercure", "nom": "Mercure récupéré (g)", + "optionnel": false, "type": "number", }, { @@ -440,12 +468,14 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "description": "Volume total en litre de carburant détaxé consommé au cours du trimestre par les travaux réalisés sur le chantier.", "id": "carburantDetaxe", "nom": "Carburant détaxé (l)", + "optionnel": false, "type": "number", }, { "description": "Volume total en litre de carburant conventionnel consommé au cours du trimestre par les travaux réalisés sur le chantier.", "id": "carburantConventionnel", "nom": "Carburant conventionnel (l)", + "optionnel": false, "type": "number", }, { @@ -453,6 +483,7 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "description": "Nombre moyen de pompes actives au cours du trimestre utilisées sur le chantier (pompe à gravier, pompe de relevage…).", "id": "pompes", "nom": "Pompes actives", + "optionnel": false, "type": "number", }, { @@ -460,12 +491,14 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "description": "Nombre moyen de pelles actives au cours du trimestre utilisées sur le chantier (aménagement, exploitation, réhabilitation).", "id": "pelles", "nom": "Pelles actives", + "optionnel": false, "type": "number", }, { "description": "Nombre moyen de salariés sur le chantier au cours du trimestre.", "id": "effectifs", "nom": "Effectifs", + "optionnel": false, "type": "number", }, { @@ -473,6 +506,7 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "description": "Montant en euros des investissements consentis au cours du trimestre listés à l’<a href="https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000021850940&cidTexte=LEGITEXT000006069569" target="_blank" title="Page de l’article - site externe" rel="noopener noreferrer">article 318 C de l’annexe II du code général des impôts</a>. Afin de bénéficier des déductions fiscales afférentes, les justificatifs attestant de la réalisation effective des investissements sont susceptibles de vous êtres demandés par l’administration.", "id": "environnement", "nom": "Dépenses relatives à la protection de l’environnement (euros)", + "optionnel": false, "type": "number", }, ], @@ -485,6 +519,7 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "dateDebut": "2018-01-01", "id": "7", "nom": "Juillet", + "optionnel": false, "options": [ { "id": "nonDebutes", @@ -514,6 +549,7 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "dateDebut": "2018-01-01", "id": "8", "nom": "Août", + "optionnel": false, "options": [ { "id": "nonDebutes", @@ -543,6 +579,7 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "dateDebut": "2018-01-01", "id": "9", "nom": "Septembre", + "optionnel": false, "options": [ { "id": "nonDebutes", @@ -602,12 +639,14 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "description": "Masse d’or brut en sortie de mine extrait au cours du trimestre (exemple : masse sous la forme de concentré gravimétrique).", "id": "orBrut", "nom": "Or brut extrait (g)", + "optionnel": false, "type": "number", }, { "description": "Masse en gramme de l’ensemble des produits contaminés envoyés en traitement au cours du trimestre.", "id": "mercure", "nom": "Mercure récupéré (g)", + "optionnel": false, "type": "number", }, { @@ -615,12 +654,14 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "description": "Volume total en litre de carburant détaxé consommé au cours du trimestre par les travaux réalisés sur le chantier.", "id": "carburantDetaxe", "nom": "Carburant détaxé (l)", + "optionnel": false, "type": "number", }, { "description": "Volume total en litre de carburant conventionnel consommé au cours du trimestre par les travaux réalisés sur le chantier.", "id": "carburantConventionnel", "nom": "Carburant conventionnel (l)", + "optionnel": false, "type": "number", }, { @@ -628,6 +669,7 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "description": "Nombre moyen de pompes actives au cours du trimestre utilisées sur le chantier (pompe à gravier, pompe de relevage…).", "id": "pompes", "nom": "Pompes actives", + "optionnel": false, "type": "number", }, { @@ -635,12 +677,14 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "description": "Nombre moyen de pelles actives au cours du trimestre utilisées sur le chantier (aménagement, exploitation, réhabilitation).", "id": "pelles", "nom": "Pelles actives", + "optionnel": false, "type": "number", }, { "description": "Nombre moyen de salariés sur le chantier au cours du trimestre.", "id": "effectifs", "nom": "Effectifs", + "optionnel": false, "type": "number", }, { @@ -648,6 +692,7 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "description": "Montant en euros des investissements consentis au cours du trimestre listés à l’<a href="https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000021850940&cidTexte=LEGITEXT000006069569" target="_blank" title="Page de l’article - site externe" rel="noopener noreferrer">article 318 C de l’annexe II du code général des impôts</a>. Afin de bénéficier des déductions fiscales afférentes, les justificatifs attestant de la réalisation effective des investissements sont susceptibles de vous êtres demandés par l’administration.", "id": "environnement", "nom": "Dépenses relatives à la protection de l’environnement (euros)", + "optionnel": false, "type": "number", }, ], @@ -660,6 +705,7 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "dateDebut": "2018-01-01", "id": "10", "nom": "Octobre", + "optionnel": false, "options": [ { "id": "nonDebutes", @@ -689,6 +735,7 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "dateDebut": "2018-01-01", "id": "11", "nom": "Novembre", + "optionnel": false, "options": [ { "id": "nonDebutes", @@ -718,6 +765,7 @@ exports[`construction des activités d'un titre > crée des activités 2`] = ` "dateDebut": "2018-01-01", "id": "12", "nom": "Décembre", + "optionnel": false, "options": [ { "id": "nonDebutes", diff --git a/packages/api/src/business/rules/titre-activites-build.test.ts b/packages/api/src/business/rules/titre-activites-build.test.ts index c4b0d4530..817b26187 100644 --- a/packages/api/src/business/rules/titre-activites-build.test.ts +++ b/packages/api/src/business/rules/titre-activites-build.test.ts @@ -7,6 +7,7 @@ import { toCaminoDate } from 'camino-common/src/date.js' import { newDemarcheId, newEtapeId, newTitreId } from '../../database/models/_format/id-create.js' import { ACTIVITES_TYPES_IDS } from 'camino-common/src/static/activitesTypes.js' import { titreIdValidator } from 'camino-common/src/validators/titres.js' +import { ETAPE_IS_NOT_BROUILLON } from 'camino-common/src/etape.js' const titreId = titreIdValidator.parse('titre-id') @@ -67,7 +68,7 @@ describe("construction des activités d'un titre", () => { date: toCaminoDate('2018-01-01'), typeId: 'dpu', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, substances: ['auru', 'nacl'], surface: null, ordre: 1, diff --git a/packages/api/src/business/rules/titre-activites-build.ts b/packages/api/src/business/rules/titre-activites-build.ts index 26bd5dbc1..e80b70cd3 100644 --- a/packages/api/src/business/rules/titre-activites-build.ts +++ b/packages/api/src/business/rules/titre-activites-build.ts @@ -9,7 +9,7 @@ import { FrequenceId, Frequences, getNumberOfMonths } from 'camino-common/src/st import { SubstanceLegaleId } from 'camino-common/src/static/substancesLegales.js' import { CaminoDate, toCaminoDate } from 'camino-common/src/date.js' import { TitreTypeId } from 'camino-common/src/static/titresTypes.js' -import { DeepReadonly } from 'camino-common/src/typescript-tools.js' +import { DeepReadonly, isNotNullNorUndefinedNorEmpty, isNullOrUndefined } from 'camino-common/src/typescript-tools.js' import { ActiviteSection, ActiviteSectionElement, ActivitesTypes, ActivitesTypesId, isSubstancesFiscales } from 'camino-common/src/static/activitesTypes.js' import { TitreId } from 'camino-common/src/validators/titres.js' @@ -45,12 +45,12 @@ const titreActiviteSectionsBuild = ( return sections.reduce<DeepReadonly<ActiviteSection[]>>((newSections: DeepReadonly<ActiviteSection[]>, s) => { let elements: DeepReadonly<ActiviteSectionElement[]> = [] - if (!isSubstancesFiscales(s) && s.elements) { + if (!isSubstancesFiscales(s) && isNotNullNorUndefinedNorEmpty(s.elements)) { elements = titreActiviteSectionElementsFormat(s.elements, periodeId, date) } else if (['gra', 'grx'].includes(activiteTypeId) && isSubstancesFiscales(s)) { const substances = titreEtapePropFind('substances', toCaminoDate(date), titreDemarches, titreTypeId) as SubstanceLegaleId[] | null - if (substances?.length) { + if (isNotNullNorUndefinedNorEmpty(substances)) { const substancesFiscales = substancesFiscalesFind(substances) elements = substancesFiscales.map(sf => { @@ -61,6 +61,7 @@ const titreActiviteSectionsBuild = ( type: 'number', description: `<b>${unite.symbole} (${unite.nom})</b> ${sf.description}`, uniteId: sf.uniteId, + optionnel: false, } return element @@ -82,8 +83,8 @@ const titreActiviteSectionsBuild = ( }, []) } -const titreActiviteFind = (activiteTypeId: ActivitesTypesId, annee: number, periodeId: number, titreActivites?: ITitreActivite[] | null) => - !!titreActivites?.length && titreActivites.find(a => a.typeId === activiteTypeId && a.annee === annee && a.periodeId === periodeId) +const titreActiviteFind = (activiteTypeId: ActivitesTypesId, annee: number, periodeId: number, titreActivites?: ITitreActivite[] | null): boolean => + titreActivites?.some(a => a.typeId === activiteTypeId && a.annee === annee && a.periodeId === periodeId) ?? false /** * Construit une activité (si elle n'existe pas déjà) @@ -161,7 +162,7 @@ export const titreActivitesBuild = ( ) => { // si le titre n'a pas de phases de démarches // aucune activité ne peut être créées - if (!titreDemarches?.some(d => d.demarcheDateDebut)) return [] + if ((titreDemarches ?? []).every(d => isNullOrUndefined(d.demarcheDateDebut))) return [] const activiteType = ActivitesTypes[activiteTypeId] @@ -172,7 +173,7 @@ export const titreActivitesBuild = ( periodes.reduce((acc: ITitreActivite[], _, i) => { const activiteSections = activiteType.sections - const titreActivite = titreActiviteBuild(activiteType.id, i + 1, activiteSections, annee, activiteType.frequenceId, aujourdhui, titreId, titreDemarches, titreTypeId, titreActivites) + const titreActivite = titreActiviteBuild(activiteType.id, i + 1, activiteSections, annee, activiteType.frequenceId, aujourdhui, titreId, titreDemarches ?? [], titreTypeId, titreActivites) if (titreActivite) { acc.push(titreActivite) diff --git a/packages/api/src/business/rules/titre-demarche-annulation-date-fin-find.test.ts b/packages/api/src/business/rules/titre-demarche-annulation-date-fin-find.test.ts index e63cd2e4d..545699c00 100644 --- a/packages/api/src/business/rules/titre-demarche-annulation-date-fin-find.test.ts +++ b/packages/api/src/business/rules/titre-demarche-annulation-date-fin-find.test.ts @@ -4,6 +4,7 @@ import { EtapeTypeId } from 'camino-common/src/static/etapesTypes.js' import { newDemarcheId, newEtapeId } from '../../database/models/_format/id-create.js' import { toCaminoDate } from 'camino-common/src/date.js' import { describe, expect, test } from 'vitest' +import { ETAPE_IS_NOT_BROUILLON } from 'camino-common/src/etape.js' describe("date de fin d'une démarche d'annulation", () => { test.each<EtapeTypeId>(['dex', 'dux', 'dim'])("retourne la date d'une démarche d'annulation si elle n'a pas de date de fin pour une %p", typeId => { const titreDemarcheAnnulationEtapes: ITitreEtape[] = [ @@ -12,7 +13,7 @@ describe("date de fin d'une démarche d'annulation", () => { titreDemarcheId: newDemarcheId('h-cx-courdemanges-1988-ret01'), typeId, statutId: 'acc', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 1, date: toCaminoDate('2013-05-21'), }, @@ -27,7 +28,7 @@ describe("date de fin d'une démarche d'annulation", () => { titreDemarcheId: newDemarcheId('h-cx-courdemanges-1988-ret01'), typeId, statutId: 'acc', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 1, date: toCaminoDate('2013-05-21'), dateFin: toCaminoDate('2013-05-25'), @@ -60,7 +61,7 @@ describe("date de fin d'une démarche d'annulation", () => { titreDemarcheId: newDemarcheId('h-cx-courdemanges-1988-ret01'), typeId: 'aco', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, ordre: 1, date: toCaminoDate('2013-05-21'), dateFin: toCaminoDate('2013-05-25'), diff --git a/packages/api/src/business/rules/titre-demarche-public-find.test.ts b/packages/api/src/business/rules/titre-demarche-public-find.test.ts index 3934cdbee..d4c1549a2 100644 --- a/packages/api/src/business/rules/titre-demarche-public-find.test.ts +++ b/packages/api/src/business/rules/titre-demarche-public-find.test.ts @@ -6,6 +6,7 @@ import { newDemarcheId, newEtapeId, newTitreId } from '../../database/models/_fo import { toCaminoDate } from 'camino-common/src/date.js' import { describe, expect, test } from 'vitest' import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes.js' +import { ETAPE_IS_NOT_BROUILLON } from 'camino-common/src/etape.js' const etapesBuild = (etapesProps: Partial<ITitreEtape>[]) => etapesProps.map( (etapeProps, i) => @@ -590,7 +591,7 @@ describe("publicité d'une démarche", () => { demarcheDateDebut: toCaminoDate('2020-01-01'), demarcheDateFin: toCaminoDate('2021-01-01'), id: newDemarcheId(), - etapes: etapesBuild([{ typeId: 'mdp', statutId: 'fai', date: toCaminoDate('2017-01-01'), isBrouillon: false }]), + etapes: etapesBuild([{ typeId: 'mdp', statutId: 'fai', date: toCaminoDate('2017-01-01'), isBrouillon: ETAPE_IS_NOT_BROUILLON }]), titreId: newTitreId('titreId'), }, 'arm' @@ -604,8 +605,8 @@ describe("publicité d'une démarche", () => { demarcheDateFin: toCaminoDate('2021-01-01'), id: newDemarcheId(), etapes: etapesBuild([ - { typeId: 'mfr', statutId: 'fai', date: toCaminoDate('2020-01-01'), isBrouillon: false }, - { typeId: 'mdp', statutId: 'fai', date: toCaminoDate('2020-01-02'), isBrouillon: false }, + { typeId: 'mfr', statutId: 'fai', date: toCaminoDate('2020-01-01'), isBrouillon: ETAPE_IS_NOT_BROUILLON }, + { typeId: 'mdp', statutId: 'fai', date: toCaminoDate('2020-01-02'), isBrouillon: ETAPE_IS_NOT_BROUILLON }, ]), titreId: newTitreId('titreId'), }, @@ -622,7 +623,7 @@ describe("publicité d'une démarche", () => { demarcheDateDebut: toCaminoDate('2020-01-01'), demarcheDateFin: toCaminoDate('2021-01-01'), id: newDemarcheId(), - etapes: etapesBuild([{ typeId: 'mcr', date: toCaminoDate('2017-01-01'), isBrouillon: false }]), + etapes: etapesBuild([{ typeId: 'mcr', date: toCaminoDate('2017-01-01'), isBrouillon: ETAPE_IS_NOT_BROUILLON }]), titreId: newTitreId('titreId'), }, 'arm' @@ -637,9 +638,9 @@ describe("publicité d'une démarche", () => { demarcheDateFin: toCaminoDate('2021-01-01'), id: newDemarcheId(), etapes: etapesBuild([ - { typeId: 'mfr', statutId: 'fai', date: toCaminoDate('2020-01-01'), isBrouillon: false }, - { typeId: 'mdp', statutId: 'fai', date: toCaminoDate('2020-01-02'), isBrouillon: false }, - { typeId: 'mcr', statutId: 'fav', date: toCaminoDate('2020-01-03'), isBrouillon: false }, + { typeId: 'mfr', statutId: 'fai', date: toCaminoDate('2020-01-01'), isBrouillon: ETAPE_IS_NOT_BROUILLON }, + { typeId: 'mdp', statutId: 'fai', date: toCaminoDate('2020-01-02'), isBrouillon: ETAPE_IS_NOT_BROUILLON }, + { typeId: 'mcr', statutId: 'fav', date: toCaminoDate('2020-01-03'), isBrouillon: ETAPE_IS_NOT_BROUILLON }, ]), titreId: newTitreId('titreId'), }, @@ -657,8 +658,8 @@ describe("publicité d'une démarche", () => { demarcheDateFin: toCaminoDate('2021-01-01'), id: newDemarcheId(), etapes: etapesBuild([ - { typeId: 'mcr', date: toCaminoDate('2017-01-01'), isBrouillon: false }, - { typeId: 'eof', date: toCaminoDate('2017-01-01'), isBrouillon: false }, + { typeId: 'mcr', date: toCaminoDate('2017-01-01'), isBrouillon: ETAPE_IS_NOT_BROUILLON }, + { typeId: 'asc', date: toCaminoDate('2017-01-01'), isBrouillon: ETAPE_IS_NOT_BROUILLON }, ]), titreId: newTitreId('titreId'), }, @@ -673,10 +674,10 @@ describe("publicité d'une démarche", () => { demarcheDateFin: toCaminoDate('2021-01-01'), id: newDemarcheId(), etapes: etapesBuild([ - { typeId: 'mfr', statutId: 'fai', date: toCaminoDate('2020-01-01'), isBrouillon: false }, - { typeId: 'mdp', statutId: 'fai', date: toCaminoDate('2020-01-02'), isBrouillon: false }, - { typeId: 'mcr', statutId: 'fav', date: toCaminoDate('2020-01-03'), isBrouillon: false }, - { typeId: 'eof', statutId: 'fai', date: toCaminoDate('2020-01-05'), isBrouillon: false }, + { typeId: 'mfr', statutId: 'fai', date: toCaminoDate('2020-01-01'), isBrouillon: ETAPE_IS_NOT_BROUILLON }, + { typeId: 'mdp', statutId: 'fai', date: toCaminoDate('2020-01-02'), isBrouillon: ETAPE_IS_NOT_BROUILLON }, + { typeId: 'mcr', statutId: 'fav', date: toCaminoDate('2020-01-03'), isBrouillon: ETAPE_IS_NOT_BROUILLON }, + { typeId: 'asc', statutId: 'fai', date: toCaminoDate('2020-01-05'), isBrouillon: ETAPE_IS_NOT_BROUILLON }, ]), titreId: newTitreId('titreId'), }, @@ -693,7 +694,7 @@ describe("publicité d'une démarche", () => { demarcheDateDebut: toCaminoDate('2020-01-01'), demarcheDateFin: toCaminoDate('2021-01-01'), id: newDemarcheId(), - etapes: etapesBuild([{ typeId: 'css', date: toCaminoDate('2017-01-01'), isBrouillon: false }]), + etapes: etapesBuild([{ typeId: 'css', date: toCaminoDate('2017-01-01'), isBrouillon: ETAPE_IS_NOT_BROUILLON }]), titreId: newTitreId('titreId'), }, 'arm' @@ -707,10 +708,10 @@ describe("publicité d'une démarche", () => { demarcheDateFin: toCaminoDate('2021-01-01'), id: newDemarcheId(), etapes: etapesBuild([ - { typeId: 'mfr', statutId: 'fai', date: toCaminoDate('2020-01-01'), isBrouillon: false }, - { typeId: 'mdp', statutId: 'fai', date: toCaminoDate('2020-01-02'), isBrouillon: false }, - { typeId: 'mcr', statutId: 'fav', date: toCaminoDate('2020-01-03'), isBrouillon: false }, - { typeId: 'css', statutId: 'fai', date: toCaminoDate('2020-01-05'), isBrouillon: false }, + { typeId: 'mfr', statutId: 'fai', date: toCaminoDate('2020-01-01'), isBrouillon: ETAPE_IS_NOT_BROUILLON }, + { typeId: 'mdp', statutId: 'fai', date: toCaminoDate('2020-01-02'), isBrouillon: ETAPE_IS_NOT_BROUILLON }, + { typeId: 'mcr', statutId: 'fav', date: toCaminoDate('2020-01-03'), isBrouillon: ETAPE_IS_NOT_BROUILLON }, + { typeId: 'css', statutId: 'fai', date: toCaminoDate('2020-01-05'), isBrouillon: ETAPE_IS_NOT_BROUILLON }, ]), titreId: newTitreId('titreId'), }, @@ -728,7 +729,7 @@ describe("publicité d'une démarche", () => { demarcheDateDebut: toCaminoDate('2017-01-01'), demarcheDateFin: toCaminoDate('2021-01-01'), id: newDemarcheId(), - etapes: etapesBuild([{ typeId: 'des', date: toCaminoDate('2017-01-01'), isBrouillon: false }]), + etapes: etapesBuild([{ typeId: 'des', date: toCaminoDate('2017-01-01'), isBrouillon: ETAPE_IS_NOT_BROUILLON }]), titreId: newTitreId('titreId'), }, 'arm' @@ -743,9 +744,9 @@ describe("publicité d'une démarche", () => { demarcheDateFin: toCaminoDate('2021-01-01'), id: newDemarcheId(), etapes: etapesBuild([ - { typeId: 'mfr', statutId: 'fai', date: toCaminoDate('2020-01-01'), isBrouillon: false }, - { typeId: 'mdp', statutId: 'fai', date: toCaminoDate('2020-01-02'), isBrouillon: false }, - { typeId: 'des', statutId: 'fai', date: toCaminoDate('2020-01-05'), isBrouillon: false }, + { typeId: 'mfr', statutId: 'fai', date: toCaminoDate('2020-01-01'), isBrouillon: ETAPE_IS_NOT_BROUILLON }, + { typeId: 'mdp', statutId: 'fai', date: toCaminoDate('2020-01-02'), isBrouillon: ETAPE_IS_NOT_BROUILLON }, + { typeId: 'des', statutId: 'fai', date: toCaminoDate('2020-01-05'), isBrouillon: ETAPE_IS_NOT_BROUILLON }, ]), titreId: newTitreId('titreId'), }, @@ -764,7 +765,7 @@ describe("publicité d'une démarche", () => { demarcheDateDebut: toCaminoDate('2020-01-01'), demarcheDateFin: toCaminoDate('2021-01-01'), id: newDemarcheId(), - etapes: etapesBuild([{ typeId: etapeTypeId, isBrouillon: false }]), + etapes: etapesBuild([{ typeId: etapeTypeId, isBrouillon: ETAPE_IS_NOT_BROUILLON }]), titreId: newTitreId('titreId'), }, 'pcc' @@ -781,7 +782,7 @@ describe("publicité d'une démarche", () => { demarcheDateDebut: toCaminoDate('2020-01-01'), demarcheDateFin: toCaminoDate('2021-01-01'), id: newDemarcheId(), - etapes: etapesBuild([{ typeId: 'ane', isBrouillon: false }]), + etapes: etapesBuild([{ typeId: 'ane', isBrouillon: ETAPE_IS_NOT_BROUILLON }]), titreId: newTitreId('WQaZgPfDcQw9tFliMgBIDH3Z'), }, 'pcc' @@ -798,8 +799,8 @@ describe("publicité d'une démarche", () => { demarcheDateDebut: toCaminoDate('2020-01-01'), demarcheDateFin: null, etapes: etapesBuild([ - { typeId: 'mfr', isBrouillon: false }, - { typeId: 'mdp', isBrouillon: false }, + { typeId: 'mfr', isBrouillon: ETAPE_IS_NOT_BROUILLON }, + { typeId: 'mdp', isBrouillon: ETAPE_IS_NOT_BROUILLON }, ]), titreId: newTitreId('titreId'), }, @@ -816,7 +817,7 @@ describe("publicité d'une démarche", () => { typeId: 'pr1', demarcheDateDebut: toCaminoDate('2020-01-01'), demarcheDateFin: null, - etapes: etapesBuild([{ typeId: 'mfr', isBrouillon: false }]), + etapes: etapesBuild([{ typeId: 'mfr', isBrouillon: ETAPE_IS_NOT_BROUILLON }]), titreId: newTitreId('titreId'), }, 'prm' diff --git a/packages/api/src/business/rules/titre-demarche-statut-id-find.test.ts b/packages/api/src/business/rules/titre-demarche-statut-id-find.test.ts index f9e0850d5..2c8aea822 100644 --- a/packages/api/src/business/rules/titre-demarche-statut-id-find.test.ts +++ b/packages/api/src/business/rules/titre-demarche-statut-id-find.test.ts @@ -7,6 +7,8 @@ import { toCaminoDate } from 'camino-common/src/date.js' import { describe, expect, test } from 'vitest' import { EtapeStatutId } from 'camino-common/src/static/etapesStatuts.js' import { TitreEtapeForMachine } from '../rules-demarches/machine-common.js' +import { ETAPE_IS_BROUILLON } from 'camino-common/src/etape.js' +import { EtapeTypeId } from 'camino-common/src/static/etapesTypes.js' const etapesBuild = (etapesProps: Partial<ITitreEtape>[]): TitreEtapeForMachine[] => etapesProps.map( (etapeProps, i) => @@ -95,8 +97,7 @@ describe("statut d'une démarche", () => { { typeId: 'mcp', statutId: 'com', date: toCaminoDate('2020-01-23') }, { typeId: 'vfd', statutId: 'fai', date: toCaminoDate('2020-02-05') }, { typeId: 'mcr', statutId: 'fav', date: toCaminoDate('2020-02-06') }, - { typeId: 'eof', statutId: 'fai', date: toCaminoDate('2020-02-07') }, - { typeId: 'aof', statutId: 'fav', date: toCaminoDate('2020-02-08') }, + { typeId: 'asc', statutId: 'fai', date: toCaminoDate('2020-02-07') }, { typeId: 'rde', statutId: 'fav', @@ -237,7 +238,7 @@ describe("statut d'une démarche", () => { }) test("une démarche d'octroi dont l'étape la plus récente est mfr a le statut “en construction”", () => { - expect(titreDemarcheStatutIdFind('oct', etapesBuild([{ typeId: 'mfr', statutId: 'fai', isBrouillon: true }]), 'pxm', newDemarcheId())).toEqual('eco') + expect(titreDemarcheStatutIdFind('oct', etapesBuild([{ typeId: 'mfr', statutId: 'fai', isBrouillon: ETAPE_IS_BROUILLON }]), 'pxm', newDemarcheId())).toEqual('eco') }) test("une démarche d'octroi dont l'étape la plus récente est mcr a le statut “en instruction”", () => { @@ -259,8 +260,7 @@ describe("statut d'une démarche", () => { { typeId: 'mcp', statutId: 'com', date: toCaminoDate('2021-02-27') }, { typeId: 'vfd', statutId: 'fai', date: toCaminoDate('2021-03-10') }, { typeId: 'mcr', statutId: 'fav', date: toCaminoDate('2021-03-11') }, - { typeId: 'eof', statutId: 'fai', date: toCaminoDate('2021-03-17') }, - { typeId: 'aof', statutId: 'fav', date: toCaminoDate('2021-09-23') }, + { typeId: 'asc', statutId: 'fai', date: toCaminoDate('2021-09-23') }, { typeId: 'sca', statutId: 'fai', date: toCaminoDate('2021-09-24') }, { typeId: 'aca', statutId: 'def', date: toCaminoDate('2021-09-25') }, ]), @@ -281,8 +281,7 @@ describe("statut d'une démarche", () => { { typeId: 'mcp', statutId: 'com', date: toCaminoDate('2021-02-27') }, { typeId: 'vfd', statutId: 'fai', date: toCaminoDate('2021-03-10') }, { typeId: 'mcr', statutId: 'fav', date: toCaminoDate('2021-03-11') }, - { typeId: 'eof', statutId: 'fai', date: toCaminoDate('2021-03-17') }, - { typeId: 'aof', statutId: 'fav', date: toCaminoDate('2021-09-23') }, + { typeId: 'asc', statutId: 'fai', date: toCaminoDate('2021-09-23') }, { typeId: 'sca', statutId: 'fai', date: toCaminoDate('2021-09-24') }, { typeId: 'aca', statutId: 'fav', date: toCaminoDate('2021-09-25') }, ]), @@ -308,18 +307,14 @@ describe("statut d'une démarche", () => { expect(titreDemarcheStatutIdFind('ret', etapesBuild([{ typeId: 'spp' }]), 'pxm', newDemarcheId())).toEqual('ins') }) - test("une démarche de retrait dont l'étape la plus récente est eof a le statut “en instruction”", () => { - expect(titreDemarcheStatutIdFind('ret', etapesBuild([{ typeId: 'ide' }, { typeId: 'eof' }]), 'pxm', newDemarcheId())).toEqual('ins') + test("une démarche de retrait dont l'étape la plus récente est asc a le statut “en instruction”", () => { + expect(titreDemarcheStatutIdFind('ret', etapesBuild([{ typeId: 'ide' }, { typeId: 'asc' }]), 'pxm', newDemarcheId())).toEqual('ins') }) test("une démarche de retrait dont l'étape la plus récente est aco a le statut “terminé”", () => { expect(titreDemarcheStatutIdFind('ret', etapesBuild([{ typeId: 'aco' }]), 'pxm', newDemarcheId())).toEqual('ter') }) - test("une démarche de retrait dont l'étape la plus récente est aof refusée a le statut “css”", () => { - expect(titreDemarcheStatutIdFind('ret', etapesBuild([{ typeId: 'aof', statutId: 'def' }]), 'pxm', newDemarcheId())).toEqual('cls') - }) - test("une démarche de retrait dont l'étape la plus récente de css a été faite a le statut “classé sans suite”", () => { expect(titreDemarcheStatutIdFind('ret', etapesBuild([{ typeId: 'css' }]), 'pxm', newDemarcheId())).toEqual('cls') }) @@ -357,7 +352,7 @@ describe("statut d'une démarche", () => { ).toEqual('ind') }) - test.each<[Travaux, EtapeStatutId, DemarcheStatutId]>([ + test.each<[EtapeTypeId, EtapeStatutId, DemarcheStatutId]>([ [Travaux.DemandeAutorisationOuverture, 'fai', Demarches.Depose], [Travaux.DepotDemande, 'fai', Demarches.Depose], [Travaux.Recevabilite, 'def', Demarches.EnInstruction], @@ -367,59 +362,46 @@ describe("statut d'une démarche", () => { [Travaux.SaisineAutoriteEnvironmentale, 'fai', Demarches.EnInstruction], [Travaux.MemoireReponseExploitant, 'fai', Demarches.EnInstruction], [Travaux.AvisReception, 'fai', Demarches.EnInstruction], - [Travaux.SaisineServiceEtat, 'fai', Demarches.EnInstruction], + [Travaux.AvisDesServicesEtCommissionsConsultatives, 'fai', Demarches.EnInstruction], [Travaux.AvisAutoriteEnvironmentale, 'fai', Demarches.EnInstruction], [Travaux.MemoireReponseExploitant, 'fai', Demarches.EnInstruction], [Travaux.AvisRapportDirecteurREAL, 'fai', Demarches.EnInstruction], [Travaux.TransPrescriptionsDemandeur, 'fai', Demarches.EnInstruction], - [Travaux.AvisCODERST, 'fai', Demarches.EnInstruction], [Travaux.AvisPrescriptionsDemandeur, 'fai', Demarches.EnInstruction], [Travaux.ArreteOuvertureTravauxMiniers, 'fai', Demarches.Accepte], [Travaux.PubliDecisionRecueilActesAdmin, 'fai', Demarches.Accepte], [Travaux.Abandon, 'fai', Demarches.Desiste], - ])("pour une démarche de travaux de type 'aom' sur un titre, dont la dernière étape est '$etapeTypeId' au statut $statutId, le résultat est $resultId", (etapeTypeId, statutId, resultId) => { + ])("pour une démarche de travaux de type 'aom' sur un titre, dont la dernière étape est '%s' au statut %s, le résultat est %s", (etapeTypeId, statutId, resultId) => { expect(titreDemarcheStatutIdFind('aom', etapesBuild([{ typeId: etapeTypeId, statutId }]), 'pxm', newDemarcheId())).toEqual(resultId) }) - test.each<[Travaux, EtapeStatutId, DemarcheStatutId]>([ + test.each<[EtapeTypeId, EtapeStatutId, DemarcheStatutId]>([ [Travaux.DeclarationOuverture, 'fai', Demarches.Depose], [Travaux.DepotDemande, 'fai', Demarches.Depose], [Travaux.Recevabilite, 'def', Demarches.EnInstruction], [Travaux.Recevabilite, 'fav', Demarches.EnInstruction], [Travaux.DemandeComplements, 'fai', Demarches.EnInstruction], [Travaux.ReceptionComplements, 'fai', Demarches.EnInstruction], - [Travaux.SaisineServiceEtat, 'fai', Demarches.EnInstruction], - [Travaux.AvisServiceAdminLocal, 'fai', Demarches.EnInstruction], - [Travaux.AvisDDTM, 'fai', Demarches.EnInstruction], - [Travaux.AvisAutoriteMilitaire, 'fai', Demarches.EnInstruction], - [Travaux.AvisARS, 'fai', Demarches.EnInstruction], - [Travaux.AvisDRAC, 'fai', Demarches.EnInstruction], + [Travaux.AvisDesServicesEtCommissionsConsultatives, 'fai', Demarches.EnInstruction], [Travaux.AvisPrefetMaritime, 'fai', Demarches.EnInstruction], - [Travaux.AvisAutresInstances, 'fai', Demarches.EnInstruction], [Travaux.RapportDREAL, 'fai', Demarches.EnInstruction], [Travaux.TransPrescriptionsDemandeur, 'fai', Demarches.EnInstruction], [Travaux.AvisPrescriptionsDemandeur, 'fai', Demarches.EnInstruction], [Travaux.DonneActeDeclaration, 'fai', Demarches.Accepte], [Travaux.Abandon, 'fai', Demarches.Desiste], - ])("pour une démarche de travaux de type 'dot' sur un titre, dont la dernière étape est '$etapeTypeId' au statut $statutId, le résultat est $resultId", (etapeTypeId, statutId, resultId) => { + ])("pour une démarche de travaux de type 'dot' sur un titre, dont la dernière étape est '%s' au statut %s, le résultat est %s", (etapeTypeId, statutId, resultId) => { expect(titreDemarcheStatutIdFind('dot', etapesBuild([{ typeId: etapeTypeId, statutId }]), 'pxm', newDemarcheId())).toEqual(resultId) }) - test.each<[Travaux, EtapeStatutId, DemarcheStatutId]>([ + test.each<[EtapeTypeId, EtapeStatutId, DemarcheStatutId]>([ [Travaux.DeclarationArret, 'fai', Demarches.Depose], [Travaux.DepotDemande, 'fai', Demarches.Depose], [Travaux.Recevabilite, 'def', Demarches.EnInstruction], [Travaux.Recevabilite, 'fav', Demarches.EnInstruction], [Travaux.AvisReception, 'fav', Demarches.EnInstruction], - [Travaux.SaisineServiceEtat, 'fai', Demarches.EnInstruction], + [Travaux.AvisDesServicesEtCommissionsConsultatives, 'fai', Demarches.EnInstruction], [Travaux.ArretePrefectoralSursis, 'fai', Demarches.EnInstruction], - [Travaux.AvisServiceAdminLocal, 'fai', Demarches.EnInstruction], - [Travaux.AvisDDTM, 'fai', Demarches.EnInstruction], - [Travaux.AvisAutoriteMilitaire, 'fai', Demarches.EnInstruction], - [Travaux.AvisARS, 'fai', Demarches.EnInstruction], - [Travaux.AvisDRAC, 'fai', Demarches.EnInstruction], [Travaux.AvisPrefetMaritime, 'fai', Demarches.EnInstruction], - [Travaux.AvisAutresInstances, 'fai', Demarches.EnInstruction], [Travaux.AvisPrescriptionsDemandeur, 'fai', Demarches.EnInstruction], [Travaux.RapportDREAL, 'fai', Demarches.EnInstruction], [Travaux.ArretePrefectDonneActe1, 'fai', Demarches.EnInstruction], @@ -430,7 +412,7 @@ describe("statut d'une démarche", () => { [Travaux.PubliDecisionRecueilActesAdmin, 'fai', Demarches.FinPoliceMines], [Travaux.PorterAConnaissance, 'fai', Demarches.FinPoliceMines], [Travaux.Abandon, 'fai', Demarches.Desiste], - ])("pour une démarche de travaux de type 'dam' sur un titre, dont la dernière étape est '$etapeTypeId' au statut $statutId, le résultat est $resultId", (etapeTypeId, statutId, resultId) => { + ])("pour une démarche de travaux de type 'dam' sur un titre, dont la dernière étape est '%s' au statut %s, le résultat est %s", (etapeTypeId, statutId, resultId) => { expect(titreDemarcheStatutIdFind('dam', etapesBuild([{ typeId: etapeTypeId, statutId }]), 'pxm', newDemarcheId())).toEqual(resultId) }) }) diff --git a/packages/api/src/business/rules/titre-demarche-statut-id-find.ts b/packages/api/src/business/rules/titre-demarche-statut-id-find.ts index c7adc6505..d30697e49 100644 --- a/packages/api/src/business/rules/titre-demarche-statut-id-find.ts +++ b/packages/api/src/business/rules/titre-demarche-statut-id-find.ts @@ -38,7 +38,7 @@ const titreDemarchesDemandesTypes: DemarcheTypeId[] = ['oct', 'pro', 'pr1', 'pr2 const titreDemarchesTravauxTypes = ['aom', 'dam', 'dot'] as const satisfies readonly TravauxIds[] -const titreEtapesDecisivesUnilateralesTypes: EtapeTypeId[] = ['ide', 'spp', 'dup', 'dux', 'aof', 'aco', ...titreEtapesDecisivesCommunesTypes] +const titreEtapesDecisivesUnilateralesTypes: EtapeTypeId[] = ['ide', 'spp', 'dup', 'dux', 'aco', ...titreEtapesDecisivesCommunesTypes] const titreDemarchesUnilateralesTypes: DemarcheTypeId[] = ['ret', 'prr', 'dec'] @@ -83,7 +83,7 @@ const titreDemarcheUnilateralStatutIdFind = (titreDemarcheEtapes: Pick<ITitreEta const titreEtapesDecisivesUnilaterale = titreDemarcheEtapes.filter(titreEtape => titreEtapesDecisivesUnilateralesTypes.includes(titreEtape.typeId)) // si aucune étape décisive n'est présente dans la démarche - // le statut est indétrminé + // le statut est indéterminé if (!titreEtapesDecisivesUnilaterale.length) return DemarchesStatutsIds.Indetermine // l'étape la plus récente @@ -112,12 +112,6 @@ const titreDemarcheUnilateralStatutIdFind = (titreDemarcheEtapes: Pick<ITitreEta return DemarchesStatutsIds.Termine } - // - le type de l’étape est l’avis de l’ONF défavorable - if (titreEtapeRecent.typeId === 'aof' && titreEtapeRecent.statutId === 'def') { - // - le statut de la démarche est "classement sans suite" - return DemarchesStatutsIds.ClasseSansSuite - } - // - si il y a plusieurs étapes if (titreDemarcheEtapes.length > 1) { // - le statut de la démarche est "en instruction" @@ -239,20 +233,13 @@ const titreDemarcheTravauxStatutIdFind = (titreDemarcheEtapes: Pick<ITitreEtape, [Travaux.SaisineAutoriteEnvironmentale]: DemarchesStatutsIds.EnInstruction, [Travaux.AvisAutoriteEnvironmentale]: DemarchesStatutsIds.EnInstruction, [Travaux.ArretePrefectoralSursis]: DemarchesStatutsIds.EnInstruction, - [Travaux.SaisineServiceEtat]: DemarchesStatutsIds.EnInstruction, - [Travaux.AvisServiceAdminLocal]: DemarchesStatutsIds.EnInstruction, - [Travaux.AvisDDTM]: DemarchesStatutsIds.EnInstruction, - [Travaux.AvisAutoriteMilitaire]: DemarchesStatutsIds.EnInstruction, - [Travaux.AvisARS]: DemarchesStatutsIds.EnInstruction, - [Travaux.AvisDRAC]: DemarchesStatutsIds.EnInstruction, + [Travaux.AvisDesServicesEtCommissionsConsultatives]: DemarchesStatutsIds.EnInstruction, [Travaux.AvisPrefetMaritime]: DemarchesStatutsIds.EnInstruction, - [Travaux.AvisAutresInstances]: DemarchesStatutsIds.EnInstruction, [Travaux.AvisRapportDirecteurREAL]: DemarchesStatutsIds.EnInstruction, [Travaux.TransPrescriptionsDemandeur]: DemarchesStatutsIds.EnInstruction, [Travaux.OuvertureEnquetePublique]: DemarchesStatutsIds.EnInstruction, [Travaux.MemoireReponseExploitant]: DemarchesStatutsIds.EnInstruction, [Travaux.ClotureEnquetePublique]: DemarchesStatutsIds.EnInstruction, - [Travaux.AvisCODERST]: DemarchesStatutsIds.EnInstruction, [Travaux.AvisPrescriptionsDemandeur]: DemarchesStatutsIds.EnInstruction, [Travaux.RapportDREAL]: DemarchesStatutsIds.EnInstruction, [Travaux.ArretePrescriptionComplementaire]: DemarchesStatutsIds.EnInstruction, diff --git a/packages/api/src/business/rules/titre-etape-prop-find.test.ts b/packages/api/src/business/rules/titre-etape-prop-find.test.ts index 7c792e170..2e4e644c9 100644 --- a/packages/api/src/business/rules/titre-etape-prop-find.test.ts +++ b/packages/api/src/business/rules/titre-etape-prop-find.test.ts @@ -3,6 +3,9 @@ import { ITitreDemarche } from '../../types.js' import { titreEtapePropFind } from './titre-etape-prop-find.js' import { vi, describe, expect, test } from 'vitest' import { toCaminoDate } from 'camino-common/src/date.js' +import { ETAPE_IS_NOT_BROUILLON, etapeIdValidator } from 'camino-common/src/etape.js' +import { titreIdValidator } from 'camino-common/src/validators/titres.js' +import { demarcheIdValidator } from 'camino-common/src/demarche.js' console.error = vi.fn() describe("valeur d'une propriété pour une étape", () => { @@ -17,20 +20,23 @@ describe("valeur d'une propriété pour une étape", () => { }) test("retourne la propriété de l'étape antérieure qui contient la propriété voulue", () => { + const demarcheId = demarcheIdValidator.parse('demarche-01') expect( titreEtapePropFind( 'titulaires', date, [ { - id: 'demarche-01', + id: demarcheId, + titreId: titreIdValidator.parse('titreId'), typeId: 'oct', etapes: [ { - id: 'demarche-01-etape-01', - typeId: 'aac', - statutId: 'acc', - isBrouillon: false, + id: etapeIdValidator.parse('demarche-01-etape-01'), + titreDemarcheId: demarcheId, + typeId: 'asc', + statutId: 'fai', + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1000-01-01'), titulaireIds: [], ordre: 1, @@ -38,10 +44,11 @@ describe("valeur d'une propriété pour une étape", () => { surface: null, }, { - id: 'demarche-01-etape-02', - typeId: 'aac', - statutId: 'acc', - isBrouillon: false, + id: etapeIdValidator.parse('demarche-01-etape-02'), + titreDemarcheId: demarcheId, + typeId: 'asc', + statutId: 'fai', + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1000-01-01'), titulaireIds: ['fr-xxxxxxxxx'], ordre: 1, @@ -63,39 +70,40 @@ describe("valeur d'une propriété pour une étape", () => { date, [ { - id: 'demarche-01', + id: demarcheIdValidator.parse('demarche-01'), + titreId: titreIdValidator.parse('titreId'), statutId: 'acc', - type: { id: 'oct' }, + typeId: 'oct', etapes: [ { - id: 'demarche-01-etape-01', - typeId: 'aac', - statutId: 'acc', - isBrouillon: false, + id: etapeIdValidator.parse('demarche-01-etape-01'), + titreDemarcheId: demarcheIdValidator.parse('demarche-01'), + typeId: 'asc', + statutId: 'fai', + isBrouillon: ETAPE_IS_NOT_BROUILLON, surface: 0, ordre: 1, communes: null, - date: '1000-01-01', + date: toCaminoDate('1000-01-01'), }, ], }, { - type: { id: 'oct' }, typeId: 'oct', etapes: [ { - id: 'demarche-02-etape-01', - date: '1000-01-01', - typeId: 'aac', - statutId: 'acc', - isBrouillon: false, + id: etapeIdValidator.parse('demarche-02-etape-01'), + date: toCaminoDate('1000-01-01'), + typeId: 'asc', + statutId: 'fai', + isBrouillon: ETAPE_IS_NOT_BROUILLON, surface: 0, ordre: 1, communes: null, }, ], }, - ] as unknown as ITitreDemarche[], + ] as ITitreDemarche[], 'pxm' ) ).toEqual(0) @@ -108,24 +116,25 @@ describe("valeur d'une propriété pour une étape", () => { date, [ { - id: 'demarche-01', + id: demarcheIdValidator.parse('demarche-01'), + titreId: titreIdValidator.parse('titreId'), typeId: 'oct', - type: { id: 'oct' }, etapes: [ { - id: 'demarche-02-etape-01', - date: '1000-01-01', - statutId: 'acc', - isBrouillon: false, + id: etapeIdValidator.parse('demarche-02-etape-01'), + titreDemarcheId: demarcheIdValidator.parse('demarche-01'), + date: toCaminoDate('1000-01-01'), + statutId: 'fai', + isBrouillon: ETAPE_IS_NOT_BROUILLON, titulaireIds: null, - typeId: 'aac', + typeId: 'asc', surface: 0, ordre: 1, communes: null, }, ], }, - ] as unknown as ITitreDemarche[], + ] as ITitreDemarche[], 'pxm' ) ).toBeNull() diff --git a/packages/api/src/business/rules/titre-phases-find.test.ts b/packages/api/src/business/rules/titre-phases-find.test.ts index 74b8aedc1..514504fcf 100644 --- a/packages/api/src/business/rules/titre-phases-find.test.ts +++ b/packages/api/src/business/rules/titre-phases-find.test.ts @@ -10,8 +10,9 @@ import { DemarchesStatutsIds } from 'camino-common/src/static/demarchesStatuts' import { TitreTypeId } from 'camino-common/src/static/titresTypes' import { ETAPES_STATUTS } from 'camino-common/src/static/etapesStatuts.js' -import { etapeSlugValidator } from 'camino-common/src/etape.js' +import { ETAPE_IS_BROUILLON, ETAPE_IS_NOT_BROUILLON, etapeSlugValidator } from 'camino-common/src/etape.js' import { FeatureMultiPolygon } from 'camino-common/src/perimetre.js' +import { km2Validator } from 'camino-common/src/number.js' const titresProd = require('./titre-phases-find.cas.json') export type TitrePhasesTest = [TitreTypeId, TitreDemarchePhaseFind[]] @@ -48,7 +49,7 @@ describe("phases d'une démarche", () => { typeId: 'dpu', statutId: 'acc', ordre: 2, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2200-01-01'), duree: 2 * 12, titreDemarcheId: newDemarcheId('h-cx-courdemanges-1988-oct01'), @@ -57,7 +58,7 @@ describe("phases d'une démarche", () => { typeId: 'dex', statutId: 'acc', ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2200-01-01'), duree: 2 * 12, titreDemarcheId: newDemarcheId('h-cx-courdemanges-1988-oct01'), @@ -106,7 +107,7 @@ describe("phases d'une démarche", () => { typeId: 'dex', statutId: 'acc', ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2200-01-01'), duree: 2 * 12, titreDemarcheId: newDemarcheId('h-ax-courdemanges-1988-oct01'), @@ -138,7 +139,7 @@ describe("phases d'une démarche", () => { typeId: 'rpu', statutId: 'acc', ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2200-01-01'), dateFin: toCaminoDate('2200-01-02'), titreDemarcheId: newDemarcheId('m-pr-courdemanges-1988-oct01'), @@ -170,7 +171,7 @@ describe("phases d'une démarche", () => { typeId: 'dpu', statutId: 'acc', ordre: 2, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2200-01-01'), dateDebut: toCaminoDate('2200-01-02'), duree: 2 * 12, @@ -180,7 +181,7 @@ describe("phases d'une démarche", () => { typeId: 'dex', statutId: 'acc', ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2200-01-01'), dateDebut: toCaminoDate('2200-01-02'), duree: 2 * 12, @@ -215,7 +216,7 @@ describe("phases d'une démarche", () => { typeId: 'dpu', statutId: 'acc', ordre: 2, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2200-01-01'), dateFin: toCaminoDate('2500-01-01'), }, @@ -224,7 +225,7 @@ describe("phases d'une démarche", () => { typeId: 'dex', statutId: 'acc', ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2200-01-01'), dateFin: toCaminoDate('2500-01-01'), }, @@ -242,7 +243,7 @@ describe("phases d'une démarche", () => { typeId: 'dpu', statutId: 'acc', ordre: 2, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2300-01-02'), dateFin: toCaminoDate('3000-01-01'), }, @@ -251,7 +252,7 @@ describe("phases d'une démarche", () => { typeId: 'dex', statutId: 'acc', ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2300-01-02'), dateFin: toCaminoDate('3000-01-01'), }, @@ -288,7 +289,7 @@ describe("phases d'une démarche", () => { typeId: 'dpu', statutId: 'acc', ordre: 2, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2000-01-02'), duree: 20 * 12, }, @@ -297,7 +298,7 @@ describe("phases d'une démarche", () => { typeId: 'dex', statutId: 'acc', ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2000-01-01'), duree: 20 * 12, }, @@ -315,7 +316,7 @@ describe("phases d'une démarche", () => { typeId: 'dpu', statutId: 'acc', ordre: 2, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2019-01-03'), }, { @@ -323,7 +324,7 @@ describe("phases d'une démarche", () => { typeId: 'dex', statutId: 'acc', ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2019-01-02'), }, ], @@ -355,7 +356,7 @@ describe("phases d'une démarche", () => { typeId: 'dpu', statutId: 'acc', ordre: 2, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2000-01-02'), duree: 20 * 12, }, @@ -364,7 +365,7 @@ describe("phases d'une démarche", () => { typeId: 'dex', statutId: 'acc', ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2000-01-01'), duree: 20 * 12, }, @@ -382,7 +383,7 @@ describe("phases d'une démarche", () => { typeId: 'dpu', statutId: 'acc', ordre: 2, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2019-01-03'), }, { @@ -390,7 +391,7 @@ describe("phases d'une démarche", () => { typeId: 'dex', statutId: 'acc', ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2019-01-02'), geojson4326Perimetre: multiPolygonWith4Points, }, @@ -428,9 +429,19 @@ describe("phases d'une démarche", () => { typeId: 'mut', statutId: 'cls', etapes: [ - { titreDemarcheId: demarcheId1, id: newEtapeId('3'), ordre: 1, isBrouillon: false, date: toCaminoDate('2016-12-28'), duree: 1920, surface: 5.51, typeId: 'mfr', statutId: 'fai' }, - { titreDemarcheId: demarcheId1, id: newEtapeId('1'), ordre: 2, isBrouillon: false, date: toCaminoDate('2016-12-28'), typeId: 'mdp', statutId: 'fai' }, - { titreDemarcheId: demarcheId1, id: newEtapeId('2'), ordre: 3, isBrouillon: false, date: toCaminoDate('2017-04-07'), typeId: 'css', statutId: 'fai' }, + { + titreDemarcheId: demarcheId1, + id: newEtapeId('3'), + ordre: 1, + isBrouillon: ETAPE_IS_NOT_BROUILLON, + date: toCaminoDate('2016-12-28'), + duree: 1920, + surface: km2Validator.parse(5.51), + typeId: 'mfr', + statutId: 'fai', + }, + { titreDemarcheId: demarcheId1, id: newEtapeId('1'), ordre: 2, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2016-12-28'), typeId: 'mdp', statutId: 'fai' }, + { titreDemarcheId: demarcheId1, id: newEtapeId('2'), ordre: 3, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2017-04-07'), typeId: 'css', statutId: 'fai' }, ], }, { @@ -440,9 +451,19 @@ describe("phases d'une démarche", () => { typeId: 'pro', statutId: 'cls', etapes: [ - { titreDemarcheId: demarcheId2, id: newEtapeId('4'), ordre: 1, isBrouillon: false, date: toCaminoDate('2016-12-28'), duree: 1920, surface: 5.51, typeId: 'mfr', statutId: 'fai' }, - { titreDemarcheId: demarcheId2, id: newEtapeId('5'), ordre: 2, isBrouillon: false, date: toCaminoDate('2016-12-28'), typeId: 'mdp', statutId: 'fai' }, - { titreDemarcheId: demarcheId2, id: newEtapeId('6'), ordre: 3, isBrouillon: false, date: toCaminoDate('2017-04-07'), typeId: 'css', statutId: 'fai' }, + { + titreDemarcheId: demarcheId2, + id: newEtapeId('4'), + ordre: 1, + isBrouillon: ETAPE_IS_NOT_BROUILLON, + date: toCaminoDate('2016-12-28'), + duree: 1920, + surface: km2Validator.parse(5.51), + typeId: 'mfr', + statutId: 'fai', + }, + { titreDemarcheId: demarcheId2, id: newEtapeId('5'), ordre: 2, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2016-12-28'), typeId: 'mdp', statutId: 'fai' }, + { titreDemarcheId: demarcheId2, id: newEtapeId('6'), ordre: 3, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2017-04-07'), typeId: 'css', statutId: 'fai' }, ], }, { @@ -452,9 +473,9 @@ describe("phases d'une démarche", () => { typeId: 'dam', statutId: 'ins', etapes: [ - { id: newEtapeId('7'), titreDemarcheId: demarcheId3, ordre: 3, isBrouillon: false, date: toCaminoDate('2014-12-23'), typeId: 'wpp', statutId: 'fai' }, - { id: newEtapeId('8'), titreDemarcheId: demarcheId3, ordre: 1, isBrouillon: false, date: toCaminoDate('2013-08-01'), typeId: 'wfd', statutId: 'fai' }, - { id: newEtapeId('9'), titreDemarcheId: demarcheId3, ordre: 2, isBrouillon: false, date: toCaminoDate('2014-08-25'), typeId: 'wre', statutId: 'fav' }, + { id: newEtapeId('7'), titreDemarcheId: demarcheId3, ordre: 3, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2014-12-23'), typeId: 'wpp', statutId: 'fai' }, + { id: newEtapeId('8'), titreDemarcheId: demarcheId3, ordre: 1, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2013-08-01'), typeId: 'wfd', statutId: 'fai' }, + { id: newEtapeId('9'), titreDemarcheId: demarcheId3, ordre: 2, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2014-08-25'), typeId: 'wre', statutId: 'fav' }, ], }, { @@ -464,8 +485,8 @@ describe("phases d'une démarche", () => { typeId: 'mut', statutId: 'acc', etapes: [ - { id: newEtapeId('10'), titreDemarcheId: demarcheId4, ordre: 1, isBrouillon: false, date: toCaminoDate('2002-12-24'), typeId: 'dex', statutId: 'acc' }, - { titreDemarcheId: demarcheId4, id: newEtapeId('11'), ordre: 2, isBrouillon: false, date: toCaminoDate('2003-01-08'), typeId: 'dpu', statutId: 'acc' }, + { id: newEtapeId('10'), titreDemarcheId: demarcheId4, ordre: 1, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2002-12-24'), typeId: 'dex', statutId: 'acc' }, + { titreDemarcheId: demarcheId4, id: newEtapeId('11'), ordre: 2, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2003-01-08'), typeId: 'dpu', statutId: 'acc' }, ], }, { @@ -475,8 +496,8 @@ describe("phases d'une démarche", () => { typeId: 'mut', statutId: 'acc', etapes: [ - { id: newEtapeId('12'), titreDemarcheId: demarcheId5, ordre: 1, isBrouillon: false, date: toCaminoDate('2000-09-26'), typeId: 'dex', statutId: 'acc' }, - { id: newEtapeId('13'), titreDemarcheId: demarcheId5, ordre: 2, isBrouillon: false, date: toCaminoDate('2000-10-06'), typeId: 'dpu', statutId: 'acc' }, + { id: newEtapeId('12'), titreDemarcheId: demarcheId5, ordre: 1, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2000-09-26'), typeId: 'dex', statutId: 'acc' }, + { id: newEtapeId('13'), titreDemarcheId: demarcheId5, ordre: 2, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2000-10-06'), typeId: 'dpu', statutId: 'acc' }, ], }, { @@ -486,8 +507,8 @@ describe("phases d'une démarche", () => { typeId: 'mut', statutId: 'acc', etapes: [ - { id: newEtapeId('id'), titreDemarcheId: demarcheId6, ordre: 1, isBrouillon: false, date: toCaminoDate('1975-11-24'), typeId: 'dex', statutId: 'acc' }, - { id: newEtapeId('15'), titreDemarcheId: demarcheId6, ordre: 2, isBrouillon: false, date: toCaminoDate('1975-11-27'), typeId: 'dpu', statutId: 'acc' }, + { id: newEtapeId('id'), titreDemarcheId: demarcheId6, ordre: 1, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1975-11-24'), typeId: 'dex', statutId: 'acc' }, + { id: newEtapeId('15'), titreDemarcheId: demarcheId6, ordre: 2, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1975-11-27'), typeId: 'dpu', statutId: 'acc' }, ], }, { @@ -498,8 +519,8 @@ describe("phases d'une démarche", () => { statutId: 'acc', etapes: [ - { id: newEtapeId('16'), titreDemarcheId: demarcheId7, ordre: 1, isBrouillon: false, date: toCaminoDate('1970-11-16'), typeId: 'dex', statutId: 'acc' }, - { id: newEtapeId('17'), titreDemarcheId: demarcheId7, ordre: 2, isBrouillon: false, date: toCaminoDate('1970-11-19'), typeId: 'dpu', statutId: 'acc' }, + { id: newEtapeId('16'), titreDemarcheId: demarcheId7, ordre: 1, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1970-11-16'), typeId: 'dex', statutId: 'acc' }, + { id: newEtapeId('17'), titreDemarcheId: demarcheId7, ordre: 2, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1970-11-19'), typeId: 'dpu', statutId: 'acc' }, ], }, { @@ -509,8 +530,8 @@ describe("phases d'une démarche", () => { typeId: 'mut', statutId: 'acc', etapes: [ - { id: newEtapeId('18'), titreDemarcheId: demarcheId8, ordre: 2, isBrouillon: false, date: toCaminoDate('1949-08-31'), typeId: 'dpu', statutId: 'acc' }, - { id: newEtapeId('19'), titreDemarcheId: demarcheId8, ordre: 1, isBrouillon: false, date: toCaminoDate('1949-08-23'), typeId: 'dex', statutId: 'acc' }, + { id: newEtapeId('18'), titreDemarcheId: demarcheId8, ordre: 2, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1949-08-31'), typeId: 'dpu', statutId: 'acc' }, + { id: newEtapeId('19'), titreDemarcheId: demarcheId8, ordre: 1, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1949-08-23'), typeId: 'dex', statutId: 'acc' }, ], }, { @@ -520,8 +541,8 @@ describe("phases d'une démarche", () => { typeId: 'exp', statutId: 'acc', etapes: [ - { id: newEtapeId('20'), titreDemarcheId: demarcheId9, ordre: 1, isBrouillon: false, date: toCaminoDate('1889-02-27'), typeId: 'dex', statutId: 'acc' }, - { id: newEtapeId('21'), titreDemarcheId: demarcheId9, ordre: 2, isBrouillon: false, date: toCaminoDate('1889-02-27'), typeId: 'dpu', statutId: 'acc' }, + { id: newEtapeId('20'), titreDemarcheId: demarcheId9, ordre: 1, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1889-02-27'), typeId: 'dex', statutId: 'acc' }, + { id: newEtapeId('21'), titreDemarcheId: demarcheId9, ordre: 2, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1889-02-27'), typeId: 'dpu', statutId: 'acc' }, ], }, { @@ -531,8 +552,8 @@ describe("phases d'une démarche", () => { typeId: 'exp', statutId: 'acc', etapes: [ - { id: newEtapeId('22'), titreDemarcheId: demarcheId10, ordre: 2, isBrouillon: false, date: toCaminoDate('1879-11-14'), typeId: 'dpu', statutId: 'acc' }, - { id: newEtapeId('23'), titreDemarcheId: demarcheId10, ordre: 1, isBrouillon: false, date: toCaminoDate('1879-07-26'), typeId: 'dex', statutId: 'acc' }, + { id: newEtapeId('22'), titreDemarcheId: demarcheId10, ordre: 2, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1879-11-14'), typeId: 'dpu', statutId: 'acc' }, + { id: newEtapeId('23'), titreDemarcheId: demarcheId10, ordre: 1, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1879-07-26'), typeId: 'dex', statutId: 'acc' }, ], }, { @@ -542,8 +563,8 @@ describe("phases d'une démarche", () => { typeId: 'oct', statutId: 'acc', etapes: [ - { id: newEtapeId('24'), titreDemarcheId: demarcheId11, ordre: 1, isBrouillon: false, date: toCaminoDate('1858-03-24'), typeId: 'dex', statutId: 'acc' }, - { id: newEtapeId('25'), titreDemarcheId: demarcheId11, ordre: 2, isBrouillon: false, date: toCaminoDate('1858-03-24'), typeId: 'dpu', statutId: 'acc' }, + { id: newEtapeId('24'), titreDemarcheId: demarcheId11, ordre: 1, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1858-03-24'), typeId: 'dex', statutId: 'acc' }, + { id: newEtapeId('25'), titreDemarcheId: demarcheId11, ordre: 2, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1858-03-24'), typeId: 'dpu', statutId: 'acc' }, ], }, ] @@ -569,9 +590,9 @@ describe("phases d'une démarche", () => { typeId: 'pro', statutId: 'cls', etapes: [ - { titreDemarcheId: demarcheIdProlongation, id: newEtapeId('2'), ordre: 3, isBrouillon: false, date: toCaminoDate('2011-04-07'), typeId: 'css', statutId: 'fai' }, - { titreDemarcheId: demarcheIdProlongation, id: newEtapeId('1'), ordre: 2, isBrouillon: false, date: toCaminoDate('2008-12-28'), typeId: 'mdp', statutId: 'fai' }, - { titreDemarcheId: demarcheIdProlongation, id: newEtapeId('3'), ordre: 1, isBrouillon: false, date: toCaminoDate('2008-12-28'), duree: 60, typeId: 'mfr', statutId: 'fai' }, + { titreDemarcheId: demarcheIdProlongation, id: newEtapeId('2'), ordre: 3, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2011-04-07'), typeId: 'css', statutId: 'fai' }, + { titreDemarcheId: demarcheIdProlongation, id: newEtapeId('1'), ordre: 2, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2008-12-28'), typeId: 'mdp', statutId: 'fai' }, + { titreDemarcheId: demarcheIdProlongation, id: newEtapeId('3'), ordre: 1, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2008-12-28'), duree: 60, typeId: 'mfr', statutId: 'fai' }, ], }, { @@ -581,8 +602,8 @@ describe("phases d'une démarche", () => { typeId: 'oct', statutId: 'acc', etapes: [ - { id: newEtapeId('24'), titreDemarcheId: demarcheIdOctroi, ordre: 1, isBrouillon: false, date: toCaminoDate('2000-03-24'), typeId: 'dex', statutId: 'acc', duree: 120 }, - { id: newEtapeId('25'), titreDemarcheId: demarcheIdOctroi, ordre: 2, isBrouillon: false, date: toCaminoDate('2000-03-24'), typeId: 'dpu', statutId: 'acc' }, + { id: newEtapeId('24'), titreDemarcheId: demarcheIdOctroi, ordre: 1, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2000-03-24'), typeId: 'dex', statutId: 'acc', duree: 120 }, + { id: newEtapeId('25'), titreDemarcheId: demarcheIdOctroi, ordre: 2, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2000-03-24'), typeId: 'dpu', statutId: 'acc' }, ], }, ] @@ -611,8 +632,8 @@ describe("phases d'une démarche", () => { typeId: 'oct', statutId: 'acc', etapes: [ - { id: newEtapeId('24'), titreDemarcheId: demarcheIdOctroi, ordre: 1, isBrouillon: false, date: toCaminoDate('2000-03-24'), typeId: 'dex', statutId: 'acc', duree: 120 }, - { id: newEtapeId('25'), titreDemarcheId: demarcheIdOctroi, ordre: 2, isBrouillon: false, date: toCaminoDate('2000-03-24'), typeId: 'dpu', statutId: 'rej' }, + { id: newEtapeId('24'), titreDemarcheId: demarcheIdOctroi, ordre: 1, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2000-03-24'), typeId: 'dex', statutId: 'acc', duree: 120 }, + { id: newEtapeId('25'), titreDemarcheId: demarcheIdOctroi, ordre: 2, isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2000-03-24'), typeId: 'dpu', statutId: 'rej' }, ], }, ] @@ -636,7 +657,7 @@ describe("phases d'une démarche", () => { typeId: 'dpu', statutId: 'acc', ordre: 2, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1970-09-17'), }, { @@ -645,7 +666,7 @@ describe("phases d'une démarche", () => { typeId: 'dex', statutId: 'acc', ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1970-09-09'), }, ], @@ -664,7 +685,7 @@ describe("phases d'une démarche", () => { typeId: 'dpu', statutId: 'acc', ordre: 2, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1994-10-18'), dateFin: toCaminoDate('2044-10-18'), duree: 600, @@ -675,7 +696,7 @@ describe("phases d'une démarche", () => { typeId: 'dex', statutId: 'acc', ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1994-10-13'), duree: 600, }, @@ -694,7 +715,7 @@ describe("phases d'une démarche", () => { typeId: 'mfr', statutId: 'fai', ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2019-10-22'), }, { @@ -703,7 +724,7 @@ describe("phases d'une démarche", () => { typeId: 'mdp', statutId: 'fai', ordre: 2, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2019-11-20'), }, { @@ -712,7 +733,7 @@ describe("phases d'une démarche", () => { typeId: 'dex', statutId: 'acc', ordre: 5, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2022-05-09'), }, { @@ -721,7 +742,7 @@ describe("phases d'une démarche", () => { typeId: 'dpu', statutId: 'acc', ordre: 6, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2022-05-09'), }, { @@ -730,7 +751,7 @@ describe("phases d'une démarche", () => { typeId: 'apd', statutId: 'fav', ordre: 3, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2020-05-11'), }, { @@ -739,7 +760,7 @@ describe("phases d'une démarche", () => { typeId: 'app', statutId: 'fav', ordre: 4, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2020-06-30'), slug: etapeSlugValidator.parse('m-cx-pontaubert-1970-ren01-app01'), }, @@ -776,7 +797,7 @@ describe("phases d'une démarche", () => { typeId: 'dpu', statutId: 'acc', ordre: 2, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1970-09-17'), }, { @@ -785,7 +806,7 @@ describe("phases d'une démarche", () => { typeId: 'dex', statutId: 'acc', ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1970-09-09'), }, ], @@ -803,7 +824,7 @@ describe("phases d'une démarche", () => { typeId: 'dpu', statutId: 'acc', ordre: 2, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1994-10-18'), dateFin: toCaminoDate('2044-10-18'), duree: 600, @@ -814,7 +835,7 @@ describe("phases d'une démarche", () => { typeId: 'dex', statutId: 'acc', ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1994-10-13'), duree: 600, }, @@ -833,7 +854,7 @@ describe("phases d'une démarche", () => { typeId: 'mfr', statutId: 'fai', ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2019-10-22'), }, { @@ -842,7 +863,7 @@ describe("phases d'une démarche", () => { typeId: 'mdp', statutId: 'fai', ordre: 2, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2019-11-20'), }, { @@ -851,7 +872,7 @@ describe("phases d'une démarche", () => { typeId: 'apd', statutId: 'fav', ordre: 3, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2020-05-11'), }, { @@ -860,7 +881,7 @@ describe("phases d'une démarche", () => { typeId: 'dim', statutId: 'acc', ordre: 5, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2022-05-09'), }, { @@ -869,7 +890,7 @@ describe("phases d'une démarche", () => { typeId: 'app', statutId: 'fav', ordre: 4, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2020-06-30'), }, ], @@ -906,7 +927,7 @@ describe("phases d'une démarche", () => { typeId: 'dpu', statutId: 'acc', ordre: 2, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1968-01-24'), }, { @@ -915,7 +936,7 @@ describe("phases d'une démarche", () => { typeId: 'dex', statutId: 'acc', ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1968-01-13'), }, ], @@ -933,7 +954,7 @@ describe("phases d'une démarche", () => { typeId: 'dpu', statutId: 'acc', ordre: 2, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1981-09-13'), dateFin: toCaminoDate('2031-09-13'), }, @@ -943,7 +964,7 @@ describe("phases d'une démarche", () => { typeId: 'dex', statutId: 'acc', ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1981-09-09'), }, ], @@ -979,7 +1000,7 @@ describe("phases d'une démarche", () => { typeId: 'dpu', statutId: 'acc', ordre: 2, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2017-11-11'), duree: 60, }, @@ -989,7 +1010,7 @@ describe("phases d'une démarche", () => { typeId: 'dex', statutId: 'acc', ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2017-11-06'), }, ], @@ -1007,7 +1028,7 @@ describe("phases d'une démarche", () => { typeId: 'mfr', statutId: 'fai', ordre: 2, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2022-07-08'), duree: 60, }, @@ -1044,7 +1065,7 @@ describe("phases d'une démarche", () => { typeId: 'dpu', statutId: 'acc', ordre: 2, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2017-11-11'), duree: 60, }, @@ -1054,7 +1075,7 @@ describe("phases d'une démarche", () => { typeId: 'dex', statutId: 'acc', ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2017-11-06'), }, ], @@ -1072,7 +1093,7 @@ describe("phases d'une démarche", () => { typeId: 'mfr', statutId: ETAPES_STATUTS.FAIT, ordre: 2, - isBrouillon: true, + isBrouillon: ETAPE_IS_BROUILLON, date: toCaminoDate('2022-07-08'), duree: 60, }, @@ -1105,7 +1126,7 @@ describe("phases d'une démarche", () => { typeId: 'dpu', statutId: 'rej', ordre: 3, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2018-11-11'), }, { @@ -1114,7 +1135,7 @@ describe("phases d'une démarche", () => { typeId: 'dpu', statutId: 'acc', ordre: 2, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2017-11-11'), duree: 60, }, @@ -1124,7 +1145,7 @@ describe("phases d'une démarche", () => { typeId: 'dex', statutId: 'acc', ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2017-11-06'), }, ], @@ -1161,7 +1182,7 @@ describe("phases d'une démarche", () => { ordre: 2, typeId: 'dpu', duree: 36, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2010-11-05'), statutId: 'acc', geojson4326Perimetre: multiPolygonWith4Points, @@ -1170,7 +1191,7 @@ describe("phases d'une démarche", () => { titreDemarcheId: demarcheId1, ordre: 1, typeId: 'dex', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2010-10-18'), statutId: 'acc', }, @@ -1187,7 +1208,7 @@ describe("phases d'une démarche", () => { titreDemarcheId: demarcheId2, ordre: 5, typeId: 'apd', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2015-05-13'), statutId: 'fav', }, @@ -1195,7 +1216,7 @@ describe("phases d'une démarche", () => { titreDemarcheId: demarcheId2, ordre: 11, typeId: 'dex', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2015-12-04'), statutId: 'acc', }, @@ -1203,7 +1224,7 @@ describe("phases d'une démarche", () => { titreDemarcheId: demarcheId2, ordre: 9, typeId: 'acg', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2015-11-09'), statutId: 'fav', }, @@ -1212,7 +1233,7 @@ describe("phases d'une démarche", () => { ordre: 1, typeId: 'mfr', duree: 60, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2013-10-30'), statutId: 'fai', }, @@ -1220,7 +1241,7 @@ describe("phases d'une démarche", () => { titreDemarcheId: demarcheId2, ordre: 10, typeId: 'acg', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2015-11-12'), statutId: 'fav', }, @@ -1228,7 +1249,7 @@ describe("phases d'une démarche", () => { titreDemarcheId: demarcheId2, ordre: 6, typeId: 'app', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2015-06-04'), statutId: 'fav', }, @@ -1236,7 +1257,7 @@ describe("phases d'une démarche", () => { titreDemarcheId: demarcheId2, ordre: 7, typeId: 'scg', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2015-10-08'), statutId: 'fai', }, @@ -1245,7 +1266,7 @@ describe("phases d'une démarche", () => { ordre: 12, typeId: 'dpu', dateFin: toCaminoDate('2018-11-05'), - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2015-12-17'), statutId: 'acc', }, @@ -1253,7 +1274,7 @@ describe("phases d'une démarche", () => { titreDemarcheId: demarcheId2, ordre: 3, typeId: 'spp', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2013-11-19'), statutId: 'fai', }, @@ -1261,7 +1282,7 @@ describe("phases d'une démarche", () => { titreDemarcheId: demarcheId2, ordre: 2, typeId: 'mdp', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2013-10-30'), statutId: 'fai', }, @@ -1269,7 +1290,7 @@ describe("phases d'une démarche", () => { titreDemarcheId: demarcheId2, ordre: 4, typeId: 'apo', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2015-02-11'), statutId: 'fav', }, @@ -1277,7 +1298,7 @@ describe("phases d'une démarche", () => { titreDemarcheId: demarcheId2, ordre: 8, typeId: 'rcg', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2015-10-08'), statutId: 'fav', }, @@ -1294,7 +1315,7 @@ describe("phases d'une démarche", () => { titreDemarcheId: demarcheId3, ordre: 2, typeId: 'mdp', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2015-07-31'), statutId: 'fai', }, @@ -1303,7 +1324,7 @@ describe("phases d'une démarche", () => { ordre: 1, typeId: 'mfr', duree: 540, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2015-07-31'), statutId: 'fai', }, @@ -1321,7 +1342,7 @@ describe("phases d'une démarche", () => { ordre: 1, typeId: 'mfr', duree: 60, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2018-06-29'), statutId: 'fai', }, @@ -1329,7 +1350,7 @@ describe("phases d'une démarche", () => { titreDemarcheId: demarcheId4, ordre: 12, typeId: 'apd', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2021-07-30'), statutId: 'fav', }, @@ -1337,56 +1358,40 @@ describe("phases d'une démarche", () => { titreDemarcheId: demarcheId4, ordre: 4, typeId: 'mco', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2019-06-13'), statutId: 'fai', }, { titreDemarcheId: demarcheId4, ordre: 10, - typeId: 'aac', - isBrouillon: false, + typeId: 'asc', + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2020-02-04'), - statutId: 'fre', + statutId: 'fai', }, { titreDemarcheId: demarcheId4, ordre: 14, typeId: 'apd', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2021-12-16'), statutId: 'fav', }, - { - titreDemarcheId: demarcheId4, - ordre: 11, - typeId: 'apm', - isBrouillon: false, - date: toCaminoDate('2020-02-24'), - statutId: 'def', - }, { titreDemarcheId: demarcheId4, ordre: 5, typeId: 'rco', duree: 60, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2019-08-30'), statutId: 'fai', }, - { - titreDemarcheId: demarcheId4, - ordre: 9, - typeId: 'apl', - isBrouillon: false, - date: toCaminoDate('2020-01-31'), - statutId: 'def', - }, { titreDemarcheId: demarcheId4, ordre: 2, typeId: 'mdp', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2018-07-04'), statutId: 'fai', }, @@ -1394,7 +1399,7 @@ describe("phases d'une démarche", () => { titreDemarcheId: demarcheId4, ordre: 15, typeId: 'ppu', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2023-01-18'), statutId: 'fai', }, @@ -1402,7 +1407,7 @@ describe("phases d'une démarche", () => { titreDemarcheId: demarcheId4, ordre: 6, typeId: 'mco', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2019-11-19'), statutId: 'fai', }, @@ -1410,7 +1415,7 @@ describe("phases d'une démarche", () => { titreDemarcheId: demarcheId4, ordre: 3, typeId: 'spp', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2018-07-20'), statutId: 'fai', }, @@ -1418,7 +1423,7 @@ describe("phases d'une démarche", () => { titreDemarcheId: demarcheId4, ordre: 16, typeId: 'ppc', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2023-02-08'), statutId: 'ter', }, @@ -1426,7 +1431,7 @@ describe("phases d'une démarche", () => { titreDemarcheId: demarcheId4, ordre: 8, typeId: 'mcr', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2020-01-29'), statutId: 'fav', }, @@ -1435,7 +1440,7 @@ describe("phases d'une démarche", () => { ordre: 7, typeId: 'rco', duree: 60, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2019-12-26'), statutId: 'fai', }, @@ -1443,7 +1448,7 @@ describe("phases d'une démarche", () => { titreDemarcheId: demarcheId4, ordre: 13, typeId: 'apo', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2021-10-29'), statutId: 'fav', }, @@ -1488,7 +1493,7 @@ describe("phases d'une démarche", () => { dateFin: toCaminoDate('2014-11-11'), duree: 60, dateDebut: null, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2009-11-11'), statutId: 'acc', geojson4326Perimetre: multiPolygonWith4Points, @@ -1500,7 +1505,7 @@ describe("phases d'une démarche", () => { dateFin: toCaminoDate('2014-11-11'), duree: 60, dateDebut: null, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2009-10-28'), statutId: 'acc', geojson4326Perimetre: null, @@ -1521,7 +1526,7 @@ describe("phases d'une démarche", () => { dateFin: null, duree: null, dateDebut: null, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2014-10-10'), statutId: 'fai', geojson4326Perimetre: null, @@ -1533,7 +1538,7 @@ describe("phases d'une démarche", () => { dateFin: null, duree: 60, dateDebut: null, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2014-09-18'), statutId: 'fai', geojson4326Perimetre: null, @@ -1545,7 +1550,7 @@ describe("phases d'une démarche", () => { dateFin: null, duree: null, dateDebut: null, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2016-03-24'), statutId: 'rej', geojson4326Perimetre: null, @@ -1557,7 +1562,7 @@ describe("phases d'une démarche", () => { dateFin: null, duree: null, dateDebut: null, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2014-09-24'), statutId: 'fai', geojson4326Perimetre: null, @@ -1597,7 +1602,7 @@ describe("phases d'une démarche", () => { dateFin: toCaminoDate('2009-11-17'), duree: 60, dateDebut: null, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2004-11-17'), statutId: 'acc', geojson4326Perimetre: multiPolygonWith4Points, @@ -1609,7 +1614,7 @@ describe("phases d'une démarche", () => { dateFin: toCaminoDate('2009-11-17'), duree: 60, dateDebut: null, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2004-11-08'), statutId: 'acc', geojson4326Perimetre: null, @@ -1630,7 +1635,7 @@ describe("phases d'une démarche", () => { dateFin: null, duree: 24, dateDebut: null, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2009-08-14'), statutId: 'fai', geojson4326Perimetre: null, @@ -1642,7 +1647,7 @@ describe("phases d'une démarche", () => { dateFin: null, duree: null, dateDebut: null, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2011-12-05'), statutId: 'fav', geojson4326Perimetre: null, @@ -1654,7 +1659,7 @@ describe("phases d'une démarche", () => { dateFin: null, duree: null, dateDebut: null, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2009-11-27'), statutId: 'fai', geojson4326Perimetre: null, @@ -1666,7 +1671,7 @@ describe("phases d'une démarche", () => { dateFin: null, duree: null, dateDebut: null, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2009-08-17'), statutId: 'fai', geojson4326Perimetre: null, @@ -1678,7 +1683,7 @@ describe("phases d'une démarche", () => { dateFin: null, duree: null, dateDebut: null, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2012-08-24'), statutId: 'fai', geojson4326Perimetre: null, @@ -1690,7 +1695,7 @@ describe("phases d'une démarche", () => { dateFin: null, duree: null, dateDebut: null, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2011-10-06'), statutId: 'fav', geojson4326Perimetre: null, @@ -1702,7 +1707,7 @@ describe("phases d'une démarche", () => { dateFin: null, duree: null, dateDebut: null, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2011-06-30'), statutId: 'fav', geojson4326Perimetre: null, @@ -1742,7 +1747,7 @@ describe("phases d'une démarche", () => { dateFin: toCaminoDate('2014-11-11'), duree: 60, dateDebut: null, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2009-11-11'), statutId: 'acc', geojson4326Perimetre: multiPolygonWith4Points, @@ -1754,7 +1759,7 @@ describe("phases d'une démarche", () => { dateFin: toCaminoDate('2014-11-11'), duree: 60, dateDebut: null, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2009-10-28'), statutId: 'acc', geojson4326Perimetre: null, @@ -1775,7 +1780,7 @@ describe("phases d'une démarche", () => { dateFin: null, duree: null, dateDebut: null, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2016-03-24'), statutId: 'rej', geojson4326Perimetre: null, @@ -1787,7 +1792,7 @@ describe("phases d'une démarche", () => { dateFin: null, duree: null, dateDebut: null, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2014-09-24'), statutId: 'fai', geojson4326Perimetre: null, @@ -1826,7 +1831,7 @@ describe("phases d'une démarche", () => { typeId: 'dpu', dateFin: toCaminoDate('2033-11-22'), dateDebut: toCaminoDate('2003-11-22'), - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2003-11-22'), statutId: 'acc', geojson4326Perimetre: null, @@ -1837,7 +1842,7 @@ describe("phases d'une démarche", () => { typeId: 'dex', dateFin: toCaminoDate('2033-11-22'), dateDebut: toCaminoDate('2003-11-22'), - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2003-11-22'), statutId: 'acc', geojson4326Perimetre: null, @@ -1846,7 +1851,7 @@ describe("phases d'une démarche", () => { titreDemarcheId: newDemarcheId('demarcheIdOctroi'), ordre: 1, typeId: 'dex', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2003-04-26'), statutId: 'rej', geojson4326Perimetre: null, @@ -1883,7 +1888,7 @@ describe("phases d'une démarche", () => { typeId: 'dpu', dateFin: toCaminoDate('2033-11-23'), dateDebut: toCaminoDate('2003-11-23'), - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2003-11-23'), statutId: 'acc', geojson4326Perimetre: null, @@ -1894,7 +1899,7 @@ describe("phases d'une démarche", () => { typeId: 'dpu', dateFin: toCaminoDate('2033-11-22'), dateDebut: toCaminoDate('2003-11-22'), - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2003-11-22'), statutId: 'rej', geojson4326Perimetre: null, @@ -1903,7 +1908,7 @@ describe("phases d'une démarche", () => { titreDemarcheId: newDemarcheId('demarcheIdOctroi'), ordre: 1, typeId: 'dex', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2003-04-26'), statutId: 'acc', geojson4326Perimetre: null, diff --git a/packages/api/src/business/rules/titre-prop-etape-find.test.ts b/packages/api/src/business/rules/titre-prop-etape-find.test.ts index ddfc6e33f..784ef087f 100644 --- a/packages/api/src/business/rules/titre-prop-etape-find.test.ts +++ b/packages/api/src/business/rules/titre-prop-etape-find.test.ts @@ -8,6 +8,8 @@ import { TitresStatutIds } from 'camino-common/src/static/titresStatuts.js' import { newEntrepriseId } from 'camino-common/src/entreprise.js' import { ETAPES_TYPES } from 'camino-common/src/static/etapesTypes.js' import { ETAPES_STATUTS } from 'camino-common/src/static/etapesStatuts.js' +import { ETAPE_IS_NOT_BROUILLON, ETAPE_IS_BROUILLON } from 'camino-common/src/etape.js' +import { km2Validator } from 'camino-common/src/number.js' const currentDate = toCaminoDate('2023-04-06') describe("id de l'étape d'une propriété valide (dé-normalise)", () => { @@ -28,7 +30,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { typeId: 'dpu', statutId: 'acc', ordre: 2, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1989-01-02'), geojson4326Perimetre: { type: 'Feature', properties: {}, geometry: { type: 'MultiPolygon', coordinates: [[[[1, 2]]]] } }, }, @@ -37,7 +39,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { titreDemarcheId: newDemarcheId('h-cx-courdemanges-1989-oct01'), typeId: 'dex', statutId: 'acc', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1989-01-01'), ordre: 1, }, @@ -54,7 +56,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { titreDemarcheId: newDemarcheId('h-cx-courdemanges-1989-mut01'), typeId: 'dpu', statutId: 'acc', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1989-02-03'), ordre: 2, }, @@ -62,7 +64,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { id: newEtapeId('h-cx-courdemanges-1989-mut01-dex01'), titreDemarcheId: newDemarcheId('h-cx-courdemanges-1989-mut01'), typeId: 'dex', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1989-02-02'), statutId: 'acc', ordre: 1, @@ -92,7 +94,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { typeId: 'dpu', statutId: 'acc', ordre: 2, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1989-01-02'), geojson4326Perimetre: null, }, @@ -100,7 +102,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { id: newEtapeId('h-cx-courdemanges-1988-oct01-dex01'), titreDemarcheId: newDemarcheId('h-cx-courdemanges-1988-oct01'), typeId: 'dex', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1989-01-01'), statutId: 'acc', ordre: 1, @@ -128,7 +130,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { id: newEtapeId('h-cx-courdemanges-1986-oct01-dpu01'), titreDemarcheId: newDemarcheId('h-cx-courdemanges-1986-oct01'), typeId: 'dpu', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1986-01-02'), statutId: 'acc', ordre: 2, @@ -138,7 +140,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { titreDemarcheId: newDemarcheId('h-cx-courdemanges-1986-oct01'), typeId: 'dex', statutId: 'acc', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1986-01-01'), ordre: 1, }, @@ -156,7 +158,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { typeId: 'dpu', statutId: 'acc', ordre: 2, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1986-02-02'), geojson4326Perimetre: { type: 'Feature', properties: {}, geometry: { type: 'MultiPolygon', coordinates: [[[[1, 2]]]] } }, }, @@ -166,7 +168,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { typeId: 'dex', statutId: 'acc', ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1986-02-01'), }, ], @@ -194,7 +196,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { typeId: 'dpu', statutId: 'acc', ordre: 2, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1986-01-02'), }, { @@ -203,7 +205,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { typeId: 'dex', statutId: 'acc', ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1986-01-01'), }, ], @@ -221,7 +223,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { statutId: 'acc', ordre: 2, geojson4326Perimetre: { type: 'Feature', properties: {}, geometry: { type: 'MultiPolygon', coordinates: [[[[1, 2]]]] } }, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1986-02-02'), }, { @@ -230,7 +232,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { typeId: 'dex', statutId: 'acc', ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1986-02-01'), }, ], @@ -258,7 +260,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { titreDemarcheId: newDemarcheId('h-cx-courdemanges-1985-mut01'), typeId: 'dpu', statutId: 'acc', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1985-01-01'), ordre: 2, geojson4326Perimetre: { type: 'Feature', properties: {}, geometry: { type: 'MultiPolygon', coordinates: [[[[1, 2]]]] } }, @@ -267,7 +269,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { id: newEtapeId('h-cx-courdemanges-1985-mut01-dex01'), titreDemarcheId: newDemarcheId('h-cx-courdemanges-1985-mut01'), typeId: 'dex', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1985-01-01'), statutId: 'acc', ordre: 1, @@ -285,7 +287,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { typeId: 'dpu', statutId: 'acc', ordre: 2, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1985-02-02'), geojson4326Perimetre: { type: 'Feature', properties: {}, geometry: { type: 'MultiPolygon', coordinates: [[[[1, 2]]]] } }, }, @@ -295,7 +297,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { typeId: 'dex', statutId: 'acc', ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1985-02-01'), }, ], @@ -323,14 +325,14 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { typeId: 'dpu', statutId: 'rej', ordre: 2, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1984-01-01'), geojson4326Perimetre: { type: 'Feature', properties: {}, geometry: { type: 'MultiPolygon', coordinates: [[[[1, 2]]]] } }, }, { id: newEtapeId('h-cx-courdemanges-1984-oct01-dex01'), titreDemarcheId: newDemarcheId('h-cx-courdemanges-1984-oct01'), - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1984-01-01'), typeId: 'dex', statutId: 'rej', @@ -357,7 +359,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { etapes: [ { id: newEtapeId('h-cx-courdemanges-1983-oct01-mfr01'), - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1983-01-01'), titreDemarcheId: newDemarcheId(newDemarcheId('h-cx-courdemanges-1983-oct01')), typeId: 'mfr', @@ -389,7 +391,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { titreDemarcheId: newDemarcheId('h-cx-courdemanges-1981-pro01'), typeId: 'dpu', statutId: 'acc', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1981-01-01'), ordre: 1, geojson4326Perimetre: { type: 'Feature', properties: {}, geometry: { type: 'MultiPolygon', coordinates: [[[[1, 2]]]] } }, @@ -405,7 +407,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { id: newEtapeId('h-cx-courdemanges-1981-oct01-dpu01'), titreDemarcheId: newDemarcheId('h-cx-courdemanges-1981-oct01'), typeId: 'dpu', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1981-01-01'), statutId: 'acc', ordre: 1, @@ -448,7 +450,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { id: newEtapeId('h-cx-courdemanges-1981-oct01-dpu01'), titreDemarcheId: newDemarcheId('h-cx-courdemanges-1981-oct01'), typeId: 'dpu', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1981-01-01'), statutId: 'acc', ordre: 1, @@ -477,7 +479,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { titreDemarcheId: newDemarcheId('h-cx-courdemanges-1981-mut01'), typeId: 'dpu', statutId: 'acc', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1981-01-01'), ordre: 1, geojson4326Perimetre: { type: 'Feature', properties: {}, geometry: { type: 'MultiPolygon', coordinates: [[[[1, 2]]]] } }, @@ -493,7 +495,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { id: newEtapeId('h-cx-courdemanges-1981-oct01-dpu01'), titreDemarcheId: newDemarcheId('h-cx-courdemanges-1981-oct01'), typeId: 'dpu', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1981-01-01'), statutId: 'acc', ordre: 1, @@ -522,14 +524,14 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { etapes: [ { id: newEtapeId('h-cx-courdemanges-1981-pro01-dpu01'), - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1981-01-01'), titreDemarcheId: newDemarcheId('h-cx-courdemanges-1981-pro01'), - typeId: 'aac', - statutId: 'acc', + typeId: 'asc', + statutId: 'fai', ordre: 1, geojson4326Perimetre: { type: 'Feature', properties: {}, geometry: { type: 'MultiPolygon', coordinates: [[[[1, 2]]]] } }, - surface: 3.2, + surface: km2Validator.parse(3.2), substances: ['auru'], communes: ['paris' as unknown as ICommune], }, @@ -547,7 +549,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { typeId: 'dpu', statutId: 'acc', ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1981-01-01'), geojson4326Perimetre: { type: 'Feature', @@ -564,7 +566,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { ], }, }, - surface: 3, + surface: km2Validator.parse(3), substances: ['arge'], communes: ['tours'] as unknown as ICommune[], }, @@ -591,14 +593,14 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { etapes: [ { id: newEtapeId('h-cx-courdemanges-1981-pro01-dpu01'), - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1981-01-01'), titreDemarcheId: newDemarcheId(newDemarcheId('h-cx-courdemanges-1981-pro01')), - typeId: 'aac', - statutId: 'acc', + typeId: 'asc', + statutId: 'fai', ordre: 1, geojson4326Perimetre: { type: 'Feature', properties: {}, geometry: { type: 'MultiPolygon', coordinates: [[[[1, 2]]]] } }, - surface: 3.2, + surface: km2Validator.parse(3.2), substances: ['auru'], titulaireIds: [newEntrepriseId('titulaire2')], amodiataireIds: [newEntrepriseId('amodiataire2')], @@ -616,7 +618,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { titreDemarcheId: newDemarcheId(newDemarcheId('h-cx-courdemanges-1981-oct01')), typeId: 'dpu', statutId: 'acc', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1981-01-01'), ordre: 1, geojson4326Perimetre: { @@ -634,7 +636,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { ], }, }, - surface: 3, + surface: km2Validator.parse(3), substances: ['arge'], titulaireIds: [newEntrepriseId('titulaire1')], amodiataireIds: [newEntrepriseId('amodiataire1')], @@ -664,7 +666,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { typeId: 'mfr', statutId: 'fai', ordre: 1, - isBrouillon: true, + isBrouillon: ETAPE_IS_BROUILLON, date: toCaminoDate('1982-01-01'), dateFin: toCaminoDate('2018-12-31'), titulaireIds: [newEntrepriseId('fr-123456789')], @@ -699,7 +701,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { typeId: 'dpu', statutId: 'acc', ordre: 1, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1982-01-01'), dateFin: toCaminoDate('2018-12-31'), amodiataireIds: [newEntrepriseId('fr-123456789')], @@ -731,7 +733,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { statutId: 'acc', ordre: 1, dateFin: toCaminoDate('4018-12-31'), - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1982-01-01'), amodiataireIds: [newEntrepriseId('fr-123456789')], }, @@ -767,7 +769,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { titreDemarcheId: newDemarcheId('h-cx-courdemanges-1981-amo01'), typeId: 'dpu', statutId: 'acc', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1981-01-01'), ordre: 1, amodiataireIds: [newEntrepriseId('fr-123456789')], @@ -783,7 +785,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { id: newEtapeId('h-cx-courdemanges-1981-pro01-dpu01'), titreDemarcheId: newDemarcheId('h-cx-courdemanges-1981-pro01'), typeId: 'dpu', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1981-01-01'), statutId: 'acc', ordre: 1, @@ -798,7 +800,7 @@ describe("id de l'étape d'une propriété valide (dé-normalise)", () => { { id: newEtapeId('h-cx-courdemanges-1981-oct01-dpu01'), titreDemarcheId: newDemarcheId('h-cx-courdemanges-1981-oct01'), - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('1981-01-01'), typeId: 'dpu', statutId: 'acc', @@ -843,7 +845,7 @@ describe("id de l'étape qui a un contenu", () => { id: newEtapeId('etape-id'), titreDemarcheId: newDemarcheId('demarche-id'), typeId: 'dpu', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2020-01-01'), statutId: 'acc', contenu: { arm: { mecanisee: true } }, @@ -872,7 +874,7 @@ describe("id de l'étape qui a un contenu", () => { id: newEtapeId('etape-id'), titreDemarcheId: newDemarcheId('demarche-id'), typeId: 'dpu', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2020-01-03'), statutId: 'acc', contenu: { arm: { mecanisee: true } }, @@ -888,7 +890,7 @@ describe("id de l'étape qui a un contenu", () => { id: newEtapeId('etape-id-2'), titreDemarcheId: newDemarcheId('demarche-id'), typeId: 'dex', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2020-01-01'), statutId: 'fai', }, @@ -912,7 +914,7 @@ describe("id de l'étape qui a un contenu", () => { id: newEtapeId('etape-id'), titreDemarcheId: newDemarcheId('demarche-id'), typeId: 'dpu', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2020-01-01'), statutId: 'acc', contenu: { arm: { mecanisee: true } }, @@ -939,7 +941,7 @@ describe("id de l'étape qui a un contenu", () => { id: newEtapeId('etape-id'), titreDemarcheId: newDemarcheId('demarche-id'), typeId: 'mfr', - isBrouillon: true, + isBrouillon: ETAPE_IS_BROUILLON, date: toCaminoDate('2020-01-03'), statutId: 'fai', contenu: { arm: { mecanisee: true } }, @@ -965,7 +967,7 @@ describe("id de l'étape qui a un contenu", () => { id: newEtapeId('etape-id'), titreDemarcheId: newDemarcheId('demarche-id'), typeId: 'mfr', - isBrouillon: true, + isBrouillon: ETAPE_IS_BROUILLON, date: toCaminoDate('2020-01-03'), statutId: 'fai', contenu: { arm: { mecanisee: true } }, diff --git a/packages/api/src/business/utils/titre-etape-heritage-contenu-find.test.ts b/packages/api/src/business/utils/titre-etape-heritage-contenu-find.test.ts index 7771056d7..607b19ba0 100644 --- a/packages/api/src/business/utils/titre-etape-heritage-contenu-find.test.ts +++ b/packages/api/src/business/utils/titre-etape-heritage-contenu-find.test.ts @@ -162,13 +162,13 @@ describe('retourne le contenu de l’étape en fonction de son héritage', () => [prevTitreEtape.id]: [ { id: 'section', - elements: [{ id: 'element', type: 'date' }], + elements: [{ id: 'element', type: 'date', optionnel: false }], }, ], [titreEtape.id]: [ { id: 'section', - elements: [{ id: 'element', type: 'date' }], + elements: [{ id: 'element', type: 'date', optionnel: false }], }, ], } @@ -199,8 +199,8 @@ describe('retourne le contenu de l’étape en fonction de son héritage', () => titreEtape.heritageContenu!.section.element.actif = true const dictionary: Record<string, DeepReadonly<Section>[]> = { - [prevTitreEtape.id]: [{ id: 'section', elements: [{ id: 'element', type: 'text' }] }], - [titreEtape.id]: [{ id: 'section', elements: [{ id: 'element', type: 'text' }] }], + [prevTitreEtape.id]: [{ id: 'section', elements: [{ id: 'element', type: 'text', optionnel: false }] }], + [titreEtape.id]: [{ id: 'section', elements: [{ id: 'element', type: 'text', optionnel: false }] }], } expect(titreEtapeHeritageContenuFind([prevTitreEtape, titreEtape], titreEtape, dictionary)).toEqual({ @@ -231,8 +231,8 @@ describe('retourne le contenu de l’étape en fonction de son héritage', () => titreEtape.heritageContenu!.section.element.etapeId = newEtapeId('prevEtapeId') const dictionary: Record<string, DeepReadonly<Section>[]> = { - [prevTitreEtape.id]: [{ id: 'section', elements: [{ id: 'element', type: 'text' }] }], - [titreEtape.id]: [{ id: 'section', elements: [{ id: 'element', type: 'text' }] }], + [prevTitreEtape.id]: [{ id: 'section', elements: [{ id: 'element', type: 'text', optionnel: false }] }], + [titreEtape.id]: [{ id: 'section', elements: [{ id: 'element', type: 'text', optionnel: false }] }], } expect(titreEtapeHeritageContenuFind([prevTitreEtape, titreEtape], titreEtape, dictionary)).toEqual({ @@ -263,8 +263,8 @@ describe('retourne le contenu de l’étape en fonction de son héritage', () => titreEtape.heritageContenu!.section.element.etapeId = newEtapeId('prevEtapeId') const dictionary: Record<string, DeepReadonly<Section>[]> = { - [prevTitreEtape.id]: [{ id: 'section', elements: [{ id: 'element', type: 'text' }] }], - [titreEtape.id]: [{ id: 'section', elements: [{ id: 'element', type: 'text' }] }], + [prevTitreEtape.id]: [{ id: 'section', elements: [{ id: 'element', type: 'text', optionnel: false }] }], + [titreEtape.id]: [{ id: 'section', elements: [{ id: 'element', type: 'text', optionnel: false }] }], } expect(titreEtapeHeritageContenuFind([prevTitreEtape, titreEtape], titreEtape, dictionary)).toEqual({ diff --git a/packages/api/src/business/utils/titre-etape-heritage-props-find.ts b/packages/api/src/business/utils/titre-etape-heritage-props-find.ts index 334940c21..693254822 100644 --- a/packages/api/src/business/utils/titre-etape-heritage-props-find.ts +++ b/packages/api/src/business/utils/titre-etape-heritage-props-find.ts @@ -3,9 +3,10 @@ import { objectClone } from '../../tools/index.js' import { SubstanceLegaleId } from 'camino-common/src/static/substancesLegales.js' import { CaminoDate } from 'camino-common/src/date.js' import { FeatureMultiPolygon, equalGeojson } from 'camino-common/src/perimetre.js' -import { exhaustiveCheck, isNotNullNorUndefined } from 'camino-common/src/typescript-tools.js' +import { exhaustiveCheck, isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools.js' import { ETAPE_HERITAGE_PROPS, EtapeHeritageProps } from 'camino-common/src/heritage.js' import { EntrepriseId } from 'camino-common/src/entreprise' +import { ZERO_KM2 } from 'camino-common/src/number.js' const propertyArrayCheck = (newValue: string[], prevValue: string[], propId: string) => { if (prevValue?.length !== newValue?.length) { @@ -61,7 +62,7 @@ export const titreEtapeHeritagePropsFind = (titreEtape: ITitreEtape, prevTitreEt ETAPE_HERITAGE_PROPS.forEach(propId => { const heritage = newTitreEtape.heritageProps![propId] - if (!heritage) { + if (isNullOrUndefined(heritage)) { newTitreEtape = objectClone(newTitreEtape) hasChanged = true newTitreEtape.heritageProps![propId] = { actif: false, etapeId: null } @@ -104,7 +105,7 @@ export const titreEtapeHeritagePropsFind = (titreEtape: ITitreEtape, prevTitreEt geojsonOriginePerimetre: prevTitreEtape.geojsonOriginePerimetre, geojsonOrigineForages: prevTitreEtape.geojsonOrigineForages, geojson4326Forages: prevTitreEtape.geojson4326Forages, - surface: prevTitreEtape.surface ?? 0, + surface: prevTitreEtape.surface ?? ZERO_KM2, } newTitreEtape = { ...newTitreEtape, ...perimetre } break diff --git a/packages/api/src/business/utils/titre-etapes-sort.test.ts b/packages/api/src/business/utils/titre-etapes-sort.test.ts index 8e60181fc..1a0bd5c66 100644 --- a/packages/api/src/business/utils/titre-etapes-sort.test.ts +++ b/packages/api/src/business/utils/titre-etapes-sort.test.ts @@ -6,6 +6,7 @@ import { DEMARCHES_TYPES_IDS } from 'camino-common/src/static/demarchesTypes.js' import { TITRES_TYPES_IDS } from 'camino-common/src/static/titresTypes.js' import { ETAPES_TYPES } from 'camino-common/src/static/etapesTypes.js' import { TitreEtapeForMachine } from '../rules-demarches/machine-common.js' +import { ETAPE_IS_BROUILLON, ETAPE_IS_NOT_BROUILLON } from 'camino-common/src/etape.js' const titreEtapesSortedDescResult = [ { typeId: 'dpu', ordre: 2, date: '1988-03-11' }, @@ -55,7 +56,7 @@ describe('trie les étapes', () => { ordre: 2, date: toCaminoDate('1988-03-06'), statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, communes: [], contenu: {}, surface: null, @@ -66,7 +67,7 @@ describe('trie les étapes', () => { ordre: 1, date: toCaminoDate('1988-03-06'), statutId: 'fav', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, communes: [], contenu: {}, surface: null, @@ -87,7 +88,7 @@ describe('trie les étapes', () => { ordre: 2, date: toCaminoDate('1988-03-06'), statutId: 'fav', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, communes: [], contenu: {}, surface: null, @@ -98,7 +99,7 @@ describe('trie les étapes', () => { ordre: 2, date: toCaminoDate('1988-03-06'), statutId: 'fav', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, communes: [], contenu: {}, surface: null, @@ -109,7 +110,7 @@ describe('trie les étapes', () => { ordre: 2, date: toCaminoDate('1988-03-06'), statutId: 'fav', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, communes: [], contenu: {}, surface: null, @@ -145,7 +146,7 @@ describe('trie les étapes', () => { ordre: 1, date: toCaminoDate('2020-01-01'), statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, communes: [], contenu: {}, surface: null, @@ -156,7 +157,7 @@ describe('trie les étapes', () => { ordre: 2, date: toCaminoDate('2020-01-01'), statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, communes: [], contenu: {}, surface: null, @@ -167,7 +168,7 @@ describe('trie les étapes', () => { ordre: 3, date: toCaminoDate('2020-01-01'), statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, surface: null, communes: [], contenu: {}, @@ -187,7 +188,7 @@ describe('trie les étapes', () => { typeId: 'mcr', date: toCaminoDate('2020-01-01'), statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, surface: null, ordre: 1, communes: [], @@ -200,7 +201,7 @@ describe('trie les étapes', () => { id: newEtapeId('2'), date: toCaminoDate('2020-01-01'), statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, surface: null, ordre: 2, communes: [], @@ -211,7 +212,7 @@ describe('trie les étapes', () => { typeId: 'vfd', date: toCaminoDate('2020-01-01'), statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, surface: null, ordre: 3, communes: [], @@ -230,7 +231,7 @@ describe('trie les étapes', () => { typeId: 'mcd', date: toCaminoDate('2020-01-01'), statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, surface: null, ordre: 5, contenu: {}, @@ -244,7 +245,7 @@ describe('trie les étapes', () => { typeId: 'mfr', date: toCaminoDate('2020-01-01'), statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, surface: null, contenu: {}, communes: [], @@ -255,7 +256,7 @@ describe('trie les étapes', () => { typeId: 'mdp', date: toCaminoDate('2020-01-01'), statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, surface: null, contenu: {}, communes: [], @@ -266,7 +267,7 @@ describe('trie les étapes', () => { typeId: 'mcd', date: toCaminoDate('2020-01-01'), statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, surface: null, contenu: {}, communes: [], @@ -277,7 +278,7 @@ describe('trie les étapes', () => { typeId: 'rcd', date: toCaminoDate('2020-01-01'), statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, surface: null, contenu: {}, communes: [], @@ -288,4 +289,100 @@ describe('trie les étapes', () => { const result = titreEtapesSortAscByDate(etapes, newDemarcheId(), DEMARCHES_TYPES_IDS.Octroi, TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX) expect(result).toContain(secondMcd) }) + + test('tri les étapes via la machine, et remet les étapes en brouillon en fonction de leur date', () => { + const etapes: TitreEtapeForMachine[] = [ + { + id: newEtapeId('mfr'), + ordre: 1, + typeId: 'mfr', + date: toCaminoDate('2020-01-01'), + statutId: 'fai', + isBrouillon: ETAPE_IS_NOT_BROUILLON, + surface: null, + contenu: {}, + communes: [], + }, + { + id: newEtapeId('mdp'), + ordre: 2, + typeId: 'mdp', + date: toCaminoDate('2020-01-02'), + statutId: 'fai', + isBrouillon: ETAPE_IS_NOT_BROUILLON, + surface: null, + contenu: {}, + communes: [], + }, + { + id: newEtapeId('pfd'), + ordre: 3, + typeId: 'pfd', + date: toCaminoDate('2020-01-03'), + statutId: 'fai', + isBrouillon: ETAPE_IS_NOT_BROUILLON, + surface: null, + contenu: {}, + communes: [], + }, + { + id: newEtapeId('mcp'), + ordre: 4, + typeId: 'mcp', + date: toCaminoDate('2020-01-04'), + statutId: 'fav', + isBrouillon: ETAPE_IS_NOT_BROUILLON, + surface: null, + contenu: {}, + communes: [], + }, + { + id: newEtapeId('vfd'), + ordre: 5, + typeId: 'vfd', + date: toCaminoDate('2020-01-05'), + statutId: 'fai', + isBrouillon: ETAPE_IS_NOT_BROUILLON, + surface: null, + contenu: {}, + communes: [], + }, + { + id: newEtapeId('asc'), + ordre: 0, + typeId: 'asc', + date: toCaminoDate('2020-01-07'), + statutId: 'fai', + isBrouillon: ETAPE_IS_BROUILLON, + surface: null, + contenu: {}, + communes: [], + }, + { + id: newEtapeId('mcr'), + ordre: 6, + typeId: 'pfd', + date: toCaminoDate('2020-01-06'), + statutId: 'fai', + isBrouillon: ETAPE_IS_NOT_BROUILLON, + surface: null, + contenu: {}, + communes: [], + }, + ] + + const result = titreEtapesSortAscByDate(etapes, newDemarcheId(), DEMARCHES_TYPES_IDS.Octroi, TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX) + expect(result.map(({ id }) => id)).toMatchInlineSnapshot(` + [ + "mfr", + "mdp", + "pfd", + "mcp", + "vfd", + "mcr", + "asc", + ] + `) + expect(result[result.length - 1].id).toBe('asc') + }) }) diff --git a/packages/api/src/business/utils/titre-etapes-sort.ts b/packages/api/src/business/utils/titre-etapes-sort.ts index efab1ddc2..8c51ece17 100644 --- a/packages/api/src/business/utils/titre-etapes-sort.ts +++ b/packages/api/src/business/utils/titre-etapes-sort.ts @@ -5,13 +5,14 @@ import { TitreTypeId } from 'camino-common/src/static/titresTypes.js' import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes.js' import { getEtapesTDE } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/index.js' import { DemarcheId } from 'camino-common/src/demarche.js' +import { isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools.js' +import { ETAPE_IS_BROUILLON } from 'camino-common/src/etape.js' // classe les étapes selon leur ordre inverse: 3, 2, 1. export const titreEtapesSortDescByOrdre = <T extends Pick<ITitreEtape, 'ordre'>>(titreEtapes: T[]): T[] => titreEtapes.slice().sort((a, b) => b.ordre! - a.ordre!) // classe les étapes selon leur ordre: 1, 2, 3, … export const titreEtapesSortAscByOrdre = <T extends Pick<ITitreEtape, 'ordre'>>(titreEtapes: T[]): T[] => titreEtapes.slice().sort((a, b) => a.ordre! - b.ordre!) - // classe les étapes selon leur dates, ordre et etapesTypes.ordre le cas échéant export const titreEtapesSortAscByDate = <T extends TitreEtapeForMachine>(titreEtapes: T[], demarcheId: DemarcheId, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId): T[] => { const demarcheDefinition = demarcheDefinitionFind(titreTypeId, demarcheTypeId, titreEtapes, demarcheId) @@ -30,6 +31,18 @@ export const titreEtapesSortAscByDate = <T extends TitreEtapeForMachine>(titreEt } } + // On remet les brouillons à la bonne date, car la machine les a ignorés + const etapesInBrouillon = titreEtapes.filter(({ isBrouillon }) => isBrouillon) + if (isNotNullNorUndefinedNorEmpty(etapesInBrouillon)) { + return [...result, ...etapesInBrouillon].sort((a, b) => { + if (a.isBrouillon === ETAPE_IS_BROUILLON || b.isBrouillon === ETAPE_IS_BROUILLON) { + return a.date.localeCompare(b.date) + } + + return 0 + }) + } + return result } else { return titreEtapes.slice().sort((a, b) => { diff --git a/packages/api/src/business/validations/titre-demarche-etat-validate.test.ts b/packages/api/src/business/validations/titre-demarche-etat-validate.test.ts index b5dae1778..6c4074e9d 100644 --- a/packages/api/src/business/validations/titre-demarche-etat-validate.test.ts +++ b/packages/api/src/business/validations/titre-demarche-etat-validate.test.ts @@ -6,6 +6,7 @@ import { EtapesTypesEtapesStatuts } from 'camino-common/src/static/etapesTypesEt import { describe, test, expect, vi } from 'vitest' import { toCaminoDate } from 'camino-common/src/date.js' import { EtapeTypeId } from 'camino-common/src/static/etapesTypes.js' +import { ETAPE_IS_BROUILLON, ETAPE_IS_NOT_BROUILLON } from 'camino-common/src/etape.js' console.warn = vi.fn() describe('teste titreDemarcheUpdatedEtatValidate', () => { @@ -16,7 +17,7 @@ describe('teste titreDemarcheUpdatedEtatValidate', () => { typeId: 'arm', demarches: [{ typeId: 'oct' }], } as ITitre, - { typeId: 'mfr', date: '2030-01-01', isBrouillon: true } as Pick< + { typeId: 'mfr', date: '2030-01-01', isBrouillon: ETAPE_IS_BROUILLON } as Pick< Required<ITitreEtape>, 'id' | 'statutId' | 'typeId' | 'date' | 'ordre' | 'contenu' | 'titreDemarcheId' | 'communes' | 'isBrouillon' >, @@ -34,10 +35,10 @@ describe('teste titreDemarcheUpdatedEtatValidate', () => { typeId: 'arm', demarches: [{ typeId: 'pro' }, { typeId: 'oct' }], } as ITitre, - { id: newEtapeId(), typeId: 'mdp', statutId: 'fai', isBrouillon: false, date: toCaminoDate('2022-05-04'), communes: null, contenu: null, ordre: 1, surface: null }, + { id: newEtapeId(), typeId: 'mdp', statutId: 'fai', isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2022-05-04'), communes: null, contenu: null, surface: null }, newDemarcheId(), - [{ id: newEtapeId('1'), typeId: 'mfr', statutId: 'fai', isBrouillon: false, date: toCaminoDate('2022-05-03'), communes: null, contenu: null, ordre: 1, surface: null }] + [{ id: newEtapeId('1'), typeId: 'mfr', statutId: 'fai', isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2022-05-03'), communes: null, contenu: null, ordre: 1, surface: null }] ) expect(valid).toHaveLength(0) @@ -54,18 +55,17 @@ describe('teste titreDemarcheUpdatedEtatValidate', () => { id: newEtapeId('1'), typeId: 'mfr', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2022-05-04'), communes: null, contenu: null, - ordre: 1, surface: null, }, newDemarcheId(), [ - { id: newEtapeId('1'), typeId: 'mfr', date: toCaminoDate('2022-05-03'), statutId: 'fai', isBrouillon: false, communes: null, contenu: null, ordre: 1, surface: null }, - { id: newEtapeId('2'), typeId: 'mdp', date: toCaminoDate('2022-05-04'), statutId: 'fai', isBrouillon: false, communes: null, contenu: null, ordre: 2, surface: null }, + { id: newEtapeId('1'), typeId: 'mfr', date: toCaminoDate('2022-05-03'), statutId: 'fai', isBrouillon: ETAPE_IS_NOT_BROUILLON, communes: null, contenu: null, ordre: 1, surface: null }, + { id: newEtapeId('2'), typeId: 'mdp', date: toCaminoDate('2022-05-04'), statutId: 'fai', isBrouillon: ETAPE_IS_NOT_BROUILLON, communes: null, contenu: null, ordre: 2, surface: null }, ] ) @@ -79,7 +79,10 @@ describe('teste titreDemarcheUpdatedEtatValidate', () => { typeId: 'arm', demarches: [{ typeId: 'oct' }], } as ITitre, - { id: '1', typeId: 'mfr', isBrouillon: true } as Pick<Required<ITitreEtape>, 'id' | 'statutId' | 'typeId' | 'date' | 'ordre' | 'contenu' | 'titreDemarcheId' | 'communes' | 'isBrouillon'>, + { id: '1', typeId: 'mfr', isBrouillon: ETAPE_IS_BROUILLON } as Pick< + Required<ITitreEtape>, + 'id' | 'statutId' | 'typeId' | 'date' | 'ordre' | 'contenu' | 'titreDemarcheId' | 'communes' | 'isBrouillon' + >, newDemarcheId(), [{ id: '1', typeId: 'mfr', date: '2000-01-01' }] as Pick<Required<ITitreEtape>, 'id' | 'statutId' | 'typeId' | 'date' | 'ordre' | 'contenu' | 'titreDemarcheId' | 'communes' | 'isBrouillon'>[], @@ -96,7 +99,10 @@ describe('teste titreDemarcheUpdatedEtatValidate', () => { typeId: 'arm', demarches: [{ typeId: 'oct' }], } as ITitre, - { id: '1', typeId: 'mfr', isBrouillon: true } as Pick<Required<ITitreEtape>, 'id' | 'statutId' | 'typeId' | 'date' | 'ordre' | 'contenu' | 'titreDemarcheId' | 'communes' | 'isBrouillon'>, + { id: '1', typeId: 'mfr', isBrouillon: ETAPE_IS_BROUILLON } as Pick< + Required<ITitreEtape>, + 'id' | 'statutId' | 'typeId' | 'date' | 'ordre' | 'contenu' | 'titreDemarcheId' | 'communes' | 'isBrouillon' + >, newDemarcheId(), [] @@ -197,7 +203,7 @@ describe('teste titreDemarcheUpdatedEtatValidate', () => { typeId: 'axm', demarches: [{ typeId: 'oct' }], } as ITitre, - { typeId: 'mfr', statutId: 'fai', isBrouillon: true, date: '2030-01-01' } as Pick< + { typeId: 'mfr', statutId: 'fai', isBrouillon: ETAPE_IS_BROUILLON, date: '2030-01-01' } as Pick< Required<ITitreEtape>, 'id' | 'statutId' | 'typeId' | 'date' | 'ordre' | 'contenu' | 'titreDemarcheId' | 'communes' | 'isBrouillon' >, @@ -214,13 +220,13 @@ describe('teste titreDemarcheUpdatedEtatValidate', () => { typeId: 'axm', demarches: [{ typeId: 'oct' }], } as ITitre, - { typeId: 'mfr', statutId: 'fai', isBrouillon: true } as Pick< + { typeId: 'mfr', statutId: 'fai', isBrouillon: ETAPE_IS_BROUILLON } as Pick< Required<ITitreEtape>, 'id' | 'statutId' | 'typeId' | 'date' | 'ordre' | 'contenu' | 'titreDemarcheId' | 'communes' | 'isBrouillon' >, newDemarcheId(), - [{ id: '1', typeId: 'dae', statutId: 'exe', isBrouillon: false }] as Pick< + [{ id: '1', typeId: 'dae', statutId: 'exe', isBrouillon: ETAPE_IS_NOT_BROUILLON }] as Pick< Required<ITitreEtape>, 'id' | 'statutId' | 'typeId' | 'date' | 'ordre' | 'contenu' | 'titreDemarcheId' | 'communes' | 'isBrouillon' >[] @@ -236,14 +242,14 @@ describe('teste titreDemarcheUpdatedEtatValidate', () => { typeId: 'axm', demarches: [{ typeId: 'oct' }], } as ITitre, - { id: '1', typeId: 'mfr', statutId: 'fai', isBrouillon: true } as Pick< + { id: '1', typeId: 'mfr', statutId: 'fai', isBrouillon: ETAPE_IS_BROUILLON } as Pick< Required<ITitreEtape>, 'id' | 'statutId' | 'typeId' | 'date' | 'ordre' | 'contenu' | 'titreDemarcheId' | 'communes' | 'isBrouillon' >, newDemarcheId(), [ - { id: '1', typeId: 'mfr', statutId: 'fai', isBrouillon: true }, + { id: '1', typeId: 'mfr', statutId: 'fai', isBrouillon: ETAPE_IS_BROUILLON }, { id: '2', typeId: 'dae' }, ] as Pick<Required<ITitreEtape>, 'id' | 'statutId' | 'typeId' | 'date' | 'ordre' | 'contenu' | 'titreDemarcheId' | 'communes' | 'isBrouillon'>[] ) @@ -259,14 +265,14 @@ describe('teste titreDemarcheUpdatedEtatValidate', () => { typeId: 'axm', demarches: [{ typeId: 'oct' }], } as ITitre, - { id: '3', typeId: 'mfr', statutId: 'fai', isBrouillon: true } as Pick< + { id: '3', typeId: 'mfr', statutId: 'fai', isBrouillon: ETAPE_IS_BROUILLON } as Pick< Required<ITitreEtape>, 'id' | 'statutId' | 'typeId' | 'date' | 'ordre' | 'contenu' | 'titreDemarcheId' | 'communes' | 'isBrouillon' >, newDemarcheId(), [ - { id: '1', typeId: 'mfr', statutId: 'fai', isBrouillon: true }, + { id: '1', typeId: 'mfr', statutId: 'fai', isBrouillon: ETAPE_IS_BROUILLON }, { id: '2', typeId: 'dae' }, ] as Pick<Required<ITitreEtape>, 'id' | 'statutId' | 'typeId' | 'date' | 'ordre' | 'contenu' | 'titreDemarcheId' | 'communes' | 'isBrouillon'>[] ) @@ -285,10 +291,9 @@ describe('teste titreDemarcheUpdatedEtatValidate', () => { typeId: 'aaa' as EtapeTypeId, date: toCaminoDate('2022-01-01'), statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, communes: null, contenu: null, - ordre: 1, surface: null, }, newDemarcheId(), @@ -298,7 +303,7 @@ describe('teste titreDemarcheUpdatedEtatValidate', () => { id: newEtapeId('1'), typeId: EtapesTypesEtapesStatuts.demande.FAIT.etapeTypeId, statutId: EtapesTypesEtapesStatuts.demande.FAIT.etapeStatutId, - isBrouillon: true, + isBrouillon: ETAPE_IS_BROUILLON, date: toCaminoDate('2021-01-01'), communes: null, contenu: null, @@ -309,7 +314,7 @@ describe('teste titreDemarcheUpdatedEtatValidate', () => { id: newEtapeId('2'), typeId: EtapesTypesEtapesStatuts.decisionDeLaMissionAutoriteEnvironnementale_ExamenAuCasParCasDuProjet_.REQUIS.etapeTypeId, statutId: EtapesTypesEtapesStatuts.decisionDeLaMissionAutoriteEnvironnementale_ExamenAuCasParCasDuProjet_.REQUIS.etapeStatutId, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2021-01-02'), communes: null, contenu: null, diff --git a/packages/api/src/business/validations/titre-demarche-etat-validate.ts b/packages/api/src/business/validations/titre-demarche-etat-validate.ts index 6d9756ea1..a4594a612 100644 --- a/packages/api/src/business/validations/titre-demarche-etat-validate.ts +++ b/packages/api/src/business/validations/titre-demarche-etat-validate.ts @@ -7,6 +7,7 @@ import { titreEtapeForMachineValidator, toMachineEtapes } from '../rules-demarch import { titreEtapeTypeAndStatusValidate } from './titre-etape-type-and-status-validate.js' import { DemarcheId } from 'camino-common/src/demarche.js' import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes.js' +import { ETAPE_IS_BROUILLON } from 'camino-common/src/etape.js' const titreDemarcheEtapesBuild = <T extends Pick<Partial<ITitreEtape>, 'id'>>(titreEtape: DeepReadonly<T>, suppression: boolean, titreDemarcheEtapes?: DeepReadonly<T[]> | null): DeepReadonly<T[]> => { if (isNullOrUndefinedOrEmpty(titreDemarcheEtapes)) { @@ -40,8 +41,8 @@ const titreDemarcheEtapesBuild = <T extends Pick<Partial<ITitreEtape>, 'id'>>(ti // est valide par rapport aux définitions des types d'étape export const titreDemarcheUpdatedEtatValidate = ( demarcheTypeId: DemarcheTypeId, - titre: ITitre, - titreEtape: Pick<Partial<ITitreEtape>, 'id'> & Pick<ITitreEtape, 'statutId' | 'typeId' | 'date' | 'ordre' | 'contenu' | 'communes' | 'surface' | 'isBrouillon'>, + titre: Pick<ITitre, 'typeId' | 'demarches'>, + titreEtape: Pick<Partial<ITitreEtape>, 'id'> & Pick<ITitreEtape, 'statutId' | 'typeId' | 'date' | 'contenu' | 'surface' | 'communes' | 'isBrouillon'>, demarcheId: DemarcheId, titreDemarcheEtapes?: Pick<ITitreEtape, 'id' | 'statutId' | 'typeId' | 'date' | 'ordre' | 'contenu' | 'communes' | 'surface' | 'isBrouillon'>[] | null, suppression = false @@ -68,7 +69,7 @@ export const titreDemarcheUpdatedEtatValidate = ( } // si on essaye d’ajouter ou de modifier une demande non déposée - if (titreEtape.typeId === 'mfr' && titreEtape.isBrouillon && !suppression) { + if (titreEtape.typeId === 'mfr' && titreEtape.isBrouillon === ETAPE_IS_BROUILLON && !suppression) { const etapesDemande = titreDemarcheEtapes?.filter(te => te.typeId === 'mfr') // si c’est la création de la première demande, pas besoin de faire de vérification avec l’arbre @@ -86,7 +87,7 @@ export const titreDemarcheUpdatedEtatValidate = ( // vérifie que toutes les étapes existent dans l’arbre try { - const etapes = titreDemarcheEtapesNew.map(etape => titreEtapeForMachineValidator.omit({ id: true }).partial({ ordre: true }).parse(etape)) + const etapes = titreDemarcheEtapesNew.map(etape => titreEtapeForMachineValidator.omit({ id: true, ordre: true }).parse(etape)) const ok = demarcheDefinition.machine.isEtapesOk(demarcheDefinition.machine.orderMachine(toMachineEtapes(etapes))) if (!ok) { titreDemarchesErrors.push('la démarche n’est pas valide') diff --git a/packages/api/src/business/validations/titre-etape-type-and-status-validate.test.ts b/packages/api/src/business/validations/titre-etape-type-and-status-validate.test.ts index 21c20b4aa..5efd17091 100644 --- a/packages/api/src/business/validations/titre-etape-type-and-status-validate.test.ts +++ b/packages/api/src/business/validations/titre-etape-type-and-status-validate.test.ts @@ -10,7 +10,7 @@ describe("valide le type et le statut d'une étape en fonction du type de titre }) test("le statut de l'étape ne correspond pas au type de titre et de démarche", () => { - expect(titreEtapeTypeAndStatusValidate('arm', 'oct', 'mdp', 'rej')).toEqual(['statut de l\'étape "rej" invalide pour une type d\'étape mdp pour une démarche de type octroi']) + expect(titreEtapeTypeAndStatusValidate('arm', 'oct', 'mdp', 'rej')).toEqual(['statut de l\'étape "rej" invalide pour une étape mdp pour une démarche de type octroi']) }) test("le type de l'étape n'est pas compatible avec le type de titre et de démarche", () => { diff --git a/packages/api/src/business/validations/titre-etape-type-and-status-validate.ts b/packages/api/src/business/validations/titre-etape-type-and-status-validate.ts index 8a94c6072..c1c1a4a0c 100644 --- a/packages/api/src/business/validations/titre-etape-type-and-status-validate.ts +++ b/packages/api/src/business/validations/titre-etape-type-and-status-validate.ts @@ -20,7 +20,7 @@ export const titreEtapeTypeAndStatusValidate = (titreTypeId: TitreTypeId, demarc const titreEtapeStatut = etapesStatuts.find(etapeStatut => etapeStatut.id === etapeStatutId) if (!titreEtapeStatut) { - return [`statut de l'étape "${etapeStatutId}" invalide pour une type d'étape ${etapeTypeId} pour une démarche de type ${DemarchesTypes[demarcheTypeId].nom}`] + return [`statut de l'étape "${etapeStatutId}" invalide pour une étape ${etapeTypeId} pour une démarche de type ${DemarchesTypes[demarcheTypeId].nom}`] } return [] diff --git a/packages/api/src/business/validations/titre-etape-updation-validate.test.ts b/packages/api/src/business/validations/titre-etape-updation-validate.test.ts index f90abfe1d..c42197bba 100644 --- a/packages/api/src/business/validations/titre-etape-updation-validate.test.ts +++ b/packages/api/src/business/validations/titre-etape-updation-validate.test.ts @@ -1,57 +1,224 @@ -import { ITitreEtape, ITitreDemarche, ITitre } from '../../types.js' +import { ITitreDemarche, ITitre } from '../../types.js' import { titreEtapeUpdationValidate } from './titre-etape-updation-validate.js' import { userSuper } from '../../database/user-super.js' import { describe, test, expect } from 'vitest' - +import { FlattenEtape } from 'camino-common/src/etape-form.js' +import { ETAPE_IS_BROUILLON, ETAPE_IS_NOT_BROUILLON, etapeIdValidator, etapeSlugValidator } from 'camino-common/src/etape.js' +import { caminoDateValidator, toCaminoDate } from 'camino-common/src/date.js' +import { demarcheIdValidator } from 'camino-common/src/demarche.js' +import { entrepriseIdValidator } from 'camino-common/src/entreprise.js' +import { titreIdValidator } from 'camino-common/src/validators/titres.js' +import { km2Validator } from 'camino-common/src/number.js' +const etapeBrouillonValide: FlattenEtape = { + id: etapeIdValidator.parse('etapeId'), + titulaires: { + value: [], + heritee: false, + etapeHeritee: null, + }, + amodiataires: { + value: [], + heritee: false, + etapeHeritee: null, + }, + dateDebut: { + value: null, + heritee: false, + etapeHeritee: null, + }, + dateFin: { + value: null, + heritee: false, + etapeHeritee: null, + }, + perimetre: { + value: null, + heritee: false, + etapeHeritee: null, + }, + duree: { + value: null, + heritee: false, + etapeHeritee: null, + }, + substances: { + value: ['auru'], + heritee: false, + etapeHeritee: null, + }, + contenu: {}, + date: caminoDateValidator.parse('2024-01-01'), + isBrouillon: ETAPE_IS_BROUILLON, + notes: '', + slug: etapeSlugValidator.parse('etapeSlug'), + statutId: 'fai', + titreDemarcheId: demarcheIdValidator.parse('demarcheId'), + typeId: 'mfr', +} +const etapeComplete: FlattenEtape = { + ...etapeBrouillonValide, + isBrouillon: ETAPE_IS_NOT_BROUILLON, + typeId: 'mod', + contenu: { arm: { mecanise: { value: true, heritee: true, etapeHeritee: { date: toCaminoDate('2022-01-01'), etapeTypeId: 'mfr', value: true } } } }, +} +const demarcheId = demarcheIdValidator.parse('demarcheId') +const titreDemarche: ITitreDemarche = { + id: demarcheId, + typeId: 'oct', + titreId: titreIdValidator.parse('titreId'), + etapes: [ + { + date: toCaminoDate('2022-01-01'), + id: etapeIdValidator.parse('mfrid'), + isBrouillon: ETAPE_IS_NOT_BROUILLON, + statutId: 'fai', + typeId: 'mfr', + titreDemarcheId: demarcheId, + communes: [], + surface: km2Validator.parse(12), + }, + ], +} +const titreARM: Pick<ITitre, 'typeId' | 'demarches'> = { + typeId: 'arm', + demarches: [titreDemarche], +} describe('valide l’étape avant de l’enregistrer', () => { test("une ARM ou une AXM ne peuvent pas recevoir d'amodiataires", () => { - const titreDemarche = { typeId: 'oct' } as unknown as ITitreDemarche - // ARM - let titreEtape = { - typeId: 'mfr', - amodiataireIds: [], - } as unknown as ITitreEtape - - let titre = { - id: 'foo', - typeId: 'arm', - } as unknown as ITitre - - let errors = titreEtapeUpdationValidate(titreEtape, titreDemarche, titre, [], [], [], userSuper, null, null) - expect(errors).not.toContain("une autorisation de recherche ne peut pas inclure d'amodiataires") - expect(errors).not.toContain("une autorisation d'exploitation ne peut pas inclure d'amodiataires") - - titreEtape = { + const titreEtape: FlattenEtape = { + id: etapeIdValidator.parse('etapeId'), + titulaires: { + value: [], + heritee: false, + etapeHeritee: null, + }, + amodiataires: { + value: [], + heritee: false, + etapeHeritee: null, + }, + dateDebut: { + value: caminoDateValidator.parse('2024-01-01'), + heritee: false, + etapeHeritee: null, + }, + dateFin: { + value: caminoDateValidator.parse('2030-01-01'), + heritee: false, + etapeHeritee: null, + }, + perimetre: { + value: null, + heritee: false, + etapeHeritee: null, + }, + duree: { + value: null, + heritee: false, + etapeHeritee: null, + }, + substances: { + value: [], + heritee: false, + etapeHeritee: null, + }, + contenu: {}, + date: caminoDateValidator.parse('2024-01-01'), + isBrouillon: ETAPE_IS_NOT_BROUILLON, + notes: '', + slug: etapeSlugValidator.parse('etapeSlug'), + statutId: 'fai', + titreDemarcheId: demarcheIdValidator.parse('demarcheId'), typeId: 'mfr', - amodiataireIds: ['foo'], - } as unknown as ITitreEtape - - errors = titreEtapeUpdationValidate(titreEtape, titreDemarche, titre, [], [], [], userSuper, null, null) - expect(errors).toContain("une autorisation de recherche ne peut pas inclure d'amodiataires") + } + let errors = titreEtapeUpdationValidate(titreEtape, titreDemarche, titreARM, [], [], [], [], [], userSuper, null, null) + expect(errors).toMatchInlineSnapshot(` + [ + "impossible d’éditer la date de début", + "impossible d’éditer la date d’échéance", + "Les substances sont obligatoires", + "la durée est obligatoire", + "Les titulaires sont obligatoires", + "l’élément "Prospection mécanisée" de la section "Caractéristiques ARM" est obligatoire", + "Le périmètre est obligatoire", + "le document "Documents cartographiques" (car) est obligatoire", + "le document "Dossier de demande" (dom) est obligatoire", + "le document "Formulaire de demande" (for) est obligatoire", + "le document "Justificatif de paiement" (jpa) est obligatoire", + "Il y a des documents d'entreprise obligatoires, mais il n'y a pas de titulaire", + ] + `) // AXM - titreEtape = { - typeId: 'mfr', - amodiataireIds: [], - } as unknown as ITitreEtape - - titre = { - id: 'foo', + const titreAxm: Pick<ITitre, 'typeId'> = { typeId: 'axm', - } as unknown as ITitre + } - errors = titreEtapeUpdationValidate(titreEtape, titreDemarche, titre, [], [], [], userSuper, null, null) - expect(errors).not.toContain("une autorisation d'exploitation ne peut pas inclure d'amodiataires") - expect(errors).not.toContain("une autorisation de recherche ne peut pas inclure d'amodiataires") - - titreEtape = { - typeId: 'mfr', - amodiataireIds: ['foo'], - } as unknown as ITitreEtape + errors = titreEtapeUpdationValidate(titreEtape, titreDemarche, titreAxm, [], [], [], [], [], userSuper, null, null) + expect(errors).toMatchInlineSnapshot(` + [ + "impossible d’éditer la date de début", + "impossible d’éditer la date d’échéance", + "Les substances sont obligatoires", + "la durée est obligatoire", + "Les titulaires sont obligatoires", + "Le périmètre est obligatoire", + "le document "Documents cartographiques" (car) est obligatoire", + "le document "Lettre de demande" (lem) est obligatoire", + "le document "Identification de matériel" (idm) est obligatoire", + "le document "Mesures prévues pour réhabiliter le site " (mes) est obligatoire", + "le document "Méthodes pour l'exécution des travaux" (met) est obligatoire", + "le document "Programme des travaux " (prg) est obligatoire", + "le document "Schéma de pénétration du massif forestier" (sch) est obligatoire", + "Il y a des documents d'entreprise obligatoires, mais il n'y a pas de titulaire", + ] + `) + }) + test('valide brouillon', () => { + const errors = titreEtapeUpdationValidate(etapeBrouillonValide, { ...titreDemarche, etapes: [] }, titreARM, [], [], [], [], [], userSuper, null, null) + expect(errors).toStrictEqual([]) + }) + test('valide complète', () => { + const errors = titreEtapeUpdationValidate(etapeComplete, titreDemarche, titreARM, [{ etape_document_type_id: 'doe' }], [], [], [], [], userSuper, null, null) + expect(errors).toStrictEqual([]) + }) - errors = titreEtapeUpdationValidate(titreEtape, titreDemarche, titre, [], [], [], userSuper, null, null) - expect(errors).toContain("une autorisation d'exploitation ne peut pas inclure d'amodiataires") + test('valide complète avec héritage', () => { + const errors = titreEtapeUpdationValidate( + { ...etapeComplete, duree: { value: 12, heritee: true, etapeHeritee: { date: toCaminoDate('2022-01-01'), etapeTypeId: 'mfr', value: 12 } } }, + titreDemarche, + titreARM, + [{ etape_document_type_id: 'doe' }], + [], + [], + [], + [], + userSuper, + null, + null + ) + expect(errors).toStrictEqual([]) + }) + test('ne peut pas éditer les amodiataires sur une ARM', () => { + const errors = titreEtapeUpdationValidate( + { ...etapeComplete, amodiataires: { value: [entrepriseIdValidator.parse('entrepriseIdAmodiataire')], heritee: false, etapeHeritee: null } }, + titreDemarche, + titreARM, + [{ etape_document_type_id: 'doe' }], + [], + [], + [], + [], + userSuper, + null, + null + ) + expect(errors).toMatchInlineSnapshot(` + [ + "une autorisation de recherche ne peut pas inclure d'amodiataires", + ] + `) }) }) diff --git a/packages/api/src/business/validations/titre-etape-updation-validate.ts b/packages/api/src/business/validations/titre-etape-updation-validate.ts index 1bf2d2557..08211ae0c 100644 --- a/packages/api/src/business/validations/titre-etape-updation-validate.ts +++ b/packages/api/src/business/validations/titre-etape-updation-validate.ts @@ -1,28 +1,28 @@ import { ITitreEtape, ITitreDemarche, ITitre } from '../../types.js' import { titreDemarcheUpdatedEtatValidate } from './titre-demarche-etat-validate.js' -import { heritageContenuValidate } from './utils/heritage-contenu-validate.js' -import { propsNumbersCheck } from './utils/props-numbers-check.js' import { contenuNumbersCheck } from './utils/contenu-numbers-check.js' -import { propsDatesCheck } from './utils/props-dates-check.js' import { contenuDatesCheck } from './utils/contenu-dates-check.js' import { canEditAmodiataires, canEditDates, canEditDuree, canEditTitulaires, isEtapeComplete } from 'camino-common/src/permissions/titres-etapes.js' import { User } from 'camino-common/src/roles.js' import { SDOMZoneId } from 'camino-common/src/static/sdom.js' import { getSections } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.js' import { EntrepriseDocument, EntrepriseId } from 'camino-common/src/entreprise.js' -import { EtapeDocument, GetEtapeDocumentsByEtapeIdAslDocument, GetEtapeDocumentsByEtapeIdDaeDocument } from 'camino-common/src/etape.js' -const numberProps = ['duree', 'surface'] as unknown as [keyof ITitreEtape] - -const dateProps = ['date', 'dateDebut', 'dateFin'] as unknown as [keyof ITitreEtape] +import { ETAPE_IS_NOT_BROUILLON, EtapeAvis, EtapeDocument, GetEtapeDocumentsByEtapeIdAslDocument, GetEtapeDocumentsByEtapeIdDaeDocument } from 'camino-common/src/etape.js' +import { CommuneId } from 'camino-common/src/static/communes.js' +import { isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools.js' +import { FlattenEtape } from 'camino-common/src/etape-form.js' +import { flattenContenuToSimpleContenu } from 'camino-common/src/sections.js' export const titreEtapeUpdationValidate = ( - titreEtape: ITitreEtape, + etape: Pick<Partial<FlattenEtape>, 'id'> & Omit<FlattenEtape, 'id'>, titreDemarche: ITitreDemarche, - titre: ITitre, + titre: Pick<ITitre, 'typeId' | 'demarches'>, documents: Pick<EtapeDocument, 'etape_document_type_id'>[], - entrepriseDocuments: Pick<EntrepriseDocument, 'entreprise_document_type_id'>[], + etapeAvis: Pick<EtapeAvis, 'avis_type_id'>[], + entrepriseDocuments: Pick<EntrepriseDocument, 'entreprise_document_type_id' | 'entreprise_id'>[], sdomZones: SDOMZoneId[] | null | undefined, + communes: CommuneId[] | null | undefined, user: User, daeDocument: Omit<GetEtapeDocumentsByEtapeIdDaeDocument, 'id'> | null, aslDocument: Omit<GetEtapeDocumentsByEtapeIdAslDocument, 'id'> | null, @@ -30,89 +30,58 @@ export const titreEtapeUpdationValidate = ( ) => { const errors: string[] = [] - const sections = getSections(titre.typeId, titreDemarche.typeId, titreEtape.typeId) - - // le champ heritageContenu est cohérent avec les sections - const errorsHeritageContenu = heritageContenuValidate(sections, titreEtape.heritageContenu) - - errors.push(...errorsHeritageContenu) + const sections = getSections(titre.typeId, titreDemarche.typeId, etape.typeId) - if (!(titreEtape.heritageProps?.duree?.actif ?? false) && !canEditDuree(titre.typeId, titreDemarche.typeId) && (titreEtape.duree ?? 0) !== (titreEtapeOld?.duree ?? 0)) { + if (!etape.duree.heritee && !canEditDuree(titre.typeId, titreDemarche.typeId) && (etape.duree.value ?? 0) !== (titreEtapeOld?.duree ?? 0)) { errors.push('impossible d’éditer la durée') } - if (!canEditDates(titre.typeId, titreDemarche.typeId, titreEtape.typeId, user)) { - if ((titreEtape.dateDebut ?? '') !== (titreEtapeOld?.dateDebut ?? '')) { + if (!canEditDates(titre.typeId, titreDemarche.typeId, etape.typeId, user)) { + if (!etape.dateDebut.heritee && (etape.dateDebut.value ?? '') !== (titreEtapeOld?.dateDebut ?? '')) { errors.push('impossible d’éditer la date de début') } - if ((titreEtape.dateFin ?? '') !== (titreEtapeOld?.dateFin ?? '')) { + if (!etape.dateFin.heritee && (etape.dateFin.value ?? '') !== (titreEtapeOld?.dateFin ?? '')) { errors.push('impossible d’éditer la date d’échéance') } } - if (!canEditTitulaires(titre.typeId, user) && entreprisesHaveChanged(titreEtape.titulaireIds ?? [], titreEtapeOld?.titulaireIds ?? [])) { - errors.push(`une autorisation ${titre.typeId === 'arm' ? 'de recherche' : "d'exploitation"} ne peut pas inclure de titulaires`) + if (!etape.titulaires.heritee && !canEditTitulaires(titre.typeId, user) && entreprisesHaveChanged(etape.titulaires.value ?? [], titreEtapeOld?.titulaireIds ?? [])) { + errors.push("impossible d'éditer les titulaires") } - if (!canEditAmodiataires(titre.typeId, user) && entreprisesHaveChanged(titreEtape.amodiataireIds ?? [], titreEtapeOld?.amodiataireIds ?? [])) { + if (!etape.amodiataires.heritee && !canEditAmodiataires(titre.typeId, user) && entreprisesHaveChanged(etape.amodiataires.value ?? [], titreEtapeOld?.amodiataireIds ?? [])) { errors.push(`une autorisation ${titre.typeId === 'arm' ? 'de recherche' : "d'exploitation"} ne peut pas inclure d'amodiataires`) } if (sections.length) { - // 1. les champs number ne peuvent avoir une durée négative - const errorsNumbers = propsNumbersCheck(numberProps, titreEtape) - if (errorsNumbers) { - errors.push(errorsNumbers) - } - - if (titreEtape.contenu) { - const errorsContenu = contenuNumbersCheck(sections, titreEtape.contenu) - if (errorsContenu) { + if (isNotNullNorUndefined(etape.contenu)) { + const errorsContenu = contenuNumbersCheck(sections, etape.contenu) + if (isNotNullNorUndefined(errorsContenu)) { errors.push(errorsContenu) } } - // 2. les champs date ne peuvent avoir une date invalide - const errorsDates = propsDatesCheck<ITitreEtape>(dateProps, titreEtape) - if (errorsDates) { - errors.push(errorsDates) - } - - // 3. les champs date des sections ne peuvent avoir une date invalide - if (titreEtape.contenu) { - const errorsContenu = contenuDatesCheck(sections, titreEtape.contenu) - if (errorsContenu) { + if (isNotNullNorUndefined(etape.contenu)) { + const errorsContenu = contenuDatesCheck(sections, etape.contenu) + if (isNotNullNorUndefined(errorsContenu)) { errors.push(errorsContenu) } } if ( - titreEtape.typeId !== 'mfr' && - titreEtape.heritageContenu && - titreEtape.heritageContenu.arm && - titreEtape.heritageContenu.arm.mecanise && - !titreEtape.heritageContenu.arm.mecanise.actif && - titreEtape.contenu && - titreEtape.contenu.arm && - titreEtape.contenu.arm.mecanise + etape.typeId !== 'mfr' && + isNotNullNorUndefined(etape.contenu.arm?.mecanise) && + etape.contenu.arm.mecanise.value === true && + !etape.contenu.arm.mecanise.heritee && + (isNullOrUndefined(etape.contenu.arm.mecanise.etapeHeritee?.value) || etape.contenu.arm.mecanise.etapeHeritee.value === false) ) { errors.push('une demande non mécanisée ne peut pas devenir mécanisée') } } // 4. si l’étape n’est pas en cours de construction - if (!titreEtape.isBrouillon) { - const etapeComplete = isEtapeComplete( - { ...titreEtape, contenu: titreEtape.contenu ?? {} }, - titre.typeId, - titreDemarche.typeId, - documents, - entrepriseDocuments, - sdomZones, - daeDocument, - aslDocument, - user - ) + if (etape.isBrouillon === ETAPE_IS_NOT_BROUILLON) { + const etapeComplete = isEtapeComplete(etape, titre.typeId, titreDemarche.typeId, documents, entrepriseDocuments, sdomZones, communes ?? [], daeDocument, aslDocument, etapeAvis, user) if (!etapeComplete.valid) { errors.push(...etapeComplete.errors) } @@ -122,14 +91,30 @@ export const titreEtapeUpdationValidate = ( return errors } - return titreEtapeUpdationBusinessValidate(titreEtape, titreDemarche, titre) + return titreEtapeUpdationBusinessValidate(etape, titreDemarche, titre, isNotNullNorUndefined(communes) ? communes.map(communeId => ({ id: communeId })) : communes) } -const titreEtapeUpdationBusinessValidate = (titreEtape: ITitreEtape, titreDemarche: ITitreDemarche, titre: ITitre) => { +const titreEtapeUpdationBusinessValidate = ( + titreEtape: Pick<Partial<FlattenEtape>, 'id'> & Pick<FlattenEtape, 'statutId' | 'typeId' | 'date' | 'contenu' | 'perimetre' | 'isBrouillon'>, + titreDemarche: ITitreDemarche, + titre: Pick<ITitre, 'typeId' | 'demarches'>, + communes: ITitreEtape['communes'] +) => { const errors = [] // 1. la date de l'étape est possible // en fonction de l'ordre des types d'étapes de la démarche - const demarcheUpdatedErrors = titreDemarcheUpdatedEtatValidate(titreDemarche.typeId, titre, titreEtape, titreDemarche.id, titreDemarche.etapes!) + const demarcheUpdatedErrors = titreDemarcheUpdatedEtatValidate( + titreDemarche.typeId, + titre, + { + ...titreEtape, + contenu: flattenContenuToSimpleContenu(titreEtape.contenu), + surface: titreEtape.perimetre.value?.surface ?? null, + communes, + }, + titreDemarche.id, + titreDemarche.etapes! + ) if (demarcheUpdatedErrors.length) { errors.push(...demarcheUpdatedErrors) } diff --git a/packages/api/src/business/validations/utils/contenu-dates-check.test.ts b/packages/api/src/business/validations/utils/contenu-dates-check.test.ts index 57e517406..5e977ac6b 100644 --- a/packages/api/src/business/validations/utils/contenu-dates-check.test.ts +++ b/packages/api/src/business/validations/utils/contenu-dates-check.test.ts @@ -2,13 +2,14 @@ import { contenuDatesCheck } from './contenu-dates-check.js' import { describe, test, expect } from 'vitest' import { Section } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.js' import { DeepReadonly } from 'camino-common/src/typescript-tools.js' +import { CaminoDate } from 'camino-common/src/date.js' const sections: DeepReadonly<Section[]> = [ { id: 'section', elements: [ - { id: 'date', type: 'date' }, - { id: 'mot', type: 'text' }, + { id: 'date', type: 'date', optionnel: false }, + { id: 'mot', type: 'text', optionnel: false }, ], }, ] @@ -17,7 +18,7 @@ describe("vérifie la validité des propriétés dont le type est date d'une ét test("la sections n'a pas d'éléments", () => { expect( contenuDatesCheck([{ id: 'section-sans-elements', elements: [] }], { - section: { date: '2000-01-01', mot: 'coucou' }, + section: { date: { value: '2000-01-01' as CaminoDate }, mot: { value: 'coucou' } }, }) ).toEqual(null) }) @@ -25,7 +26,7 @@ describe("vérifie la validité des propriétés dont le type est date d'une ét test('les propriétés de type date ne contiennent pas de valeur négative', () => { expect( contenuDatesCheck(sections, { - section: { date: '2000-01-01', mot: 'coucou' }, + section: { date: { value: '2000-01-01' as CaminoDate }, mot: { value: 'coucou' } }, }) ).toEqual(null) }) @@ -33,8 +34,8 @@ describe("vérifie la validité des propriétés dont le type est date d'une ét test("les dates n'ont pas de coordonnées de référence", () => { expect( contenuDatesCheck(sections, { - section: { date: '2000-42-42', mot: 'coucou' }, + section: { date: { value: '2000-42-42' as CaminoDate }, mot: { value: 'coucou' } }, }) - ).toBe('le champ "date" n\'est pas une date valide') + ).toContain('le champ "date" est invalide') }) }) diff --git a/packages/api/src/business/validations/utils/contenu-dates-check.ts b/packages/api/src/business/validations/utils/contenu-dates-check.ts index 83d295cdf..084c1b030 100644 --- a/packages/api/src/business/validations/utils/contenu-dates-check.ts +++ b/packages/api/src/business/validations/utils/contenu-dates-check.ts @@ -1,17 +1,17 @@ -import { dateValidate } from 'camino-common/src/date.js' +import { caminoDateValidator } from 'camino-common/src/date.js' import { Section } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.js' -import { DeepReadonly } from 'camino-common/src/typescript-tools.js' -import { IContenu } from '../../../types.js' +import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools.js' +import { FlattenedContenuElement } from 'camino-common/src/etape-form.js' -export const contenuDatesCheck = (sections: DeepReadonly<Section[]>, contenu: IContenu) => { +export const contenuDatesCheck = (sections: DeepReadonly<Section[]>, contenu: Record<string, Record<string, Pick<FlattenedContenuElement, 'value'>>>): string | null => { const errors = sections.reduce( (errors: string[], section) => - section.elements && contenu[section.id] + isNotNullNorUndefinedNorEmpty(section.elements) && isNotNullNorUndefined(contenu[section.id]) ? section.elements.reduce((errors, element) => { - if (element.type === 'date' && contenu[section.id][element.id]) { - const dateCheck = dateValidate(contenu[section.id][element.id] as string) - if (!dateCheck.valid) { - errors.push(`le champ "${element.id}" n'est pas une date valide`) + if (element.type === 'date' && isNotNullNorUndefined(contenu[section.id][element.id])) { + const { success, error } = caminoDateValidator.safeParse(contenu[section.id][element.id].value) + if (!success) { + errors.push(`le champ "${element.id}" est invalide`, error.message) } } diff --git a/packages/api/src/business/validations/utils/contenu-numbers-check.test.ts b/packages/api/src/business/validations/utils/contenu-numbers-check.test.ts index 146a520e1..0542f262a 100644 --- a/packages/api/src/business/validations/utils/contenu-numbers-check.test.ts +++ b/packages/api/src/business/validations/utils/contenu-numbers-check.test.ts @@ -3,20 +3,20 @@ import { describe, test, expect } from 'vitest' describe('vérifie la validité du contenu de type nombre', () => { test("la sections n'a pas d'éléments", () => { - expect(contenuNumbersCheck([{ id: 'section-sans-elements', elements: [] }], { section: { number: 123 } })).toEqual(null) + expect(contenuNumbersCheck([{ id: 'section-sans-elements', elements: [] }], { section: { number: { value: 123 } } })).toEqual(null) }) test('un champ de section dont le type est un nombre et qui a une valeur positive est validée', () => { - expect(contenuNumbersCheck([{ id: 'section', elements: [{ id: 'number', type: 'number' }] }], { section: { number: 123 } })).toBeNull() + expect(contenuNumbersCheck([{ id: 'section', elements: [{ id: 'number', type: 'number', optionnel: false }] }], { section: { number: { value: 123 } } })).toBeNull() }) test('un champ de section dont le type est un nombre et qui a une valeur négative retourne une erreur', () => { expect( - contenuNumbersCheck([{ id: 'section', elements: [{ id: 'number', type: 'number' }] }], { + contenuNumbersCheck([{ id: 'section', elements: [{ id: 'number', type: 'number', optionnel: false }] }], { section: { - number: -1, + number: { value: -1 }, }, }) - ).toEqual('le champ "number" ne peut pas avoir une valeur négative') + ).toContain('le champ "number" est invalide') }) }) diff --git a/packages/api/src/business/validations/utils/contenu-numbers-check.ts b/packages/api/src/business/validations/utils/contenu-numbers-check.ts index a565b6fe9..2029bb4e3 100644 --- a/packages/api/src/business/validations/utils/contenu-numbers-check.ts +++ b/packages/api/src/business/validations/utils/contenu-numbers-check.ts @@ -1,17 +1,19 @@ import { Section } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.js' -import { DeepReadonly } from 'camino-common/src/typescript-tools.js' -import { IContenu } from '../../../types.js' +import { DeepReadonly, isNotNullNorUndefined, isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools.js' +import { numberElementValueValidator } from 'camino-common/src/sections.js' +import { FlattenedContenuElement } from 'camino-common/src/etape-form.js' -export const contenuNumbersCheck = (sections: DeepReadonly<Section[]>, contenu: IContenu) => { +export const contenuNumbersCheck = (sections: DeepReadonly<Section[]>, contenu: Record<string, Record<string, Pick<FlattenedContenuElement, 'value'>>>) => { const errors = sections.reduce((errors: string[], section) => { - if (!section.elements) return errors + if (isNullOrUndefinedOrEmpty(section.elements)) return errors return section.elements.reduce((errors, element) => { - if (element.type === 'number' && contenu[section.id] && contenu[section.id][element.id]) { - const value = contenu[section.id][element.id] + if (element.type === 'number' && isNotNullNorUndefined(contenu[section.id]?.[element.id])) { + const value = contenu[section.id][element.id].value - if (typeof value === 'number' && value < 0) { - errors.push(`le champ "${element.id}" ne peut pas avoir une valeur négative`) + const { success, error } = numberElementValueValidator.safeParse(value) + if (!success) { + errors.push(`le champ "${element.id}" est invalide: `, error.message) } } diff --git a/packages/api/src/business/validations/utils/heritage-contenu-validate.test.ts b/packages/api/src/business/validations/utils/heritage-contenu-validate.test.ts deleted file mode 100644 index 0ac1488be..000000000 --- a/packages/api/src/business/validations/utils/heritage-contenu-validate.test.ts +++ /dev/null @@ -1,76 +0,0 @@ -/* eslint-disable @typescript-eslint/ban-ts-comment */ - -import { describe, test, expect } from 'vitest' - -import { heritageContenuValidate } from './heritage-contenu-validate.js' - -describe('vérifie la structure json de heritageContenu', () => { - test('la structure est correcte', () => { - expect(heritageContenuValidate([], {})).toHaveLength(0) - expect(heritageContenuValidate(null, {})).toHaveLength(0) - expect(heritageContenuValidate([], null)).toHaveLength(0) - expect(heritageContenuValidate([{ id: 'section', elements: [{ id: 'element', type: 'text' }] }], { section: { element: { actif: true } } })).toHaveLength(0) - expect(heritageContenuValidate([{ id: 'section', elements: [{ id: 'element', type: 'text' }] }], { section: { element: { actif: false } } })).toHaveLength(0) - }) - - test('la structure n’est pas correcte car l’héritage est absent', () => { - expect(heritageContenuValidate([{ id: 'section', elements: [{ id: 'element', type: 'text' }] }], null)).toContain('la section "section" n’a pas d’héritage') - }) - - test('la structure n’est pas correcte car il y a une section manquante', () => { - expect(heritageContenuValidate([{ id: 'section', elements: [{ id: 'element', type: 'text' }] }], {})).toContain('la section "section" n’a pas d’héritage') - }) - - test('la structure n’est pas correcte car il y a une section en trop', () => { - expect( - heritageContenuValidate([], { - section: { element: { actif: true } }, - }) - ).toContain('la section "section" est inconnue') - }) - - test('la structure n’est pas correcte car il y a un element inconnu dans une section', () => { - expect( - heritageContenuValidate([{ id: 'section', elements: [{ id: 'element', type: 'text' }] }], { - section: { element: { actif: true }, toto: { actif: true } }, - }) - ).toContain('l’élement "toto" de la section "section" est inconnu') - }) - - test('la structure n’est pas correcte car il y a un element en trop dans une section', () => { - expect( - heritageContenuValidate( - [ - { - id: 'section', - elements: [ - { id: 'element', type: 'text' }, - { id: 'toto', type: 'text' }, - ], - }, - ], - { - section: { element: { actif: true } }, - } - ) - ).toContain('l’élement "toto" de la section "section" n’a pas d’héritage') - }) - - test('la structure n’est pas correcte car il y a un champ en trop dans un élément', () => { - expect( - heritageContenuValidate([{ id: 'section', elements: [{ id: 'element', type: 'text' }] }], { - // @ts-ignore - section: { element: { actif: true, toto: 1 } }, - }) - ).toContain('le champ "toto" de l’élement "element" de la section "section" est inconnu') - }) - - test('la structure n’est pas correcte car le champ actif d’un élément n’est pas un booléen', () => { - expect( - heritageContenuValidate([{ id: 'section', elements: [{ id: 'element', type: 'text' }] }], { - // @ts-ignore - section: { element: { actif: 'toto' } }, - }) - ).toContain('le champ "actif" de l’élement "element" de la section "section" doit être un booléen') - }) -}) diff --git a/packages/api/src/business/validations/utils/heritage-contenu-validate.ts b/packages/api/src/business/validations/utils/heritage-contenu-validate.ts deleted file mode 100644 index 9adba63a4..000000000 --- a/packages/api/src/business/validations/utils/heritage-contenu-validate.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Section } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.js' -import { DeepReadonly } from 'camino-common/src/typescript-tools.js' -import { IHeritageContenu } from '../../../types.js' - -export const heritageContenuValidate = (sections?: DeepReadonly<Section[]> | null, heritageContenu?: IHeritageContenu | null) => { - const errors = [] as string[] - - if ((!heritageContenu || !Object.keys(heritageContenu).length) && !sections?.length) { - return errors - } - - sections!.forEach(section => { - const heritageSection = heritageContenu ? heritageContenu[section.id] : null - - if (!heritageSection) { - errors.push(`la section "${section.id}" n’a pas d’héritage`) - } else { - const elements = section.elements ? section.elements : [] - - elements.forEach(element => { - const heritageElement = heritageSection[element.id] - - if (!heritageElement) { - errors.push(`l’élement "${element.id}" de la section "${section.id}" n’a pas d’héritage`) - } else { - Object.keys(heritageElement).forEach(attribute => { - if (attribute !== 'actif') { - errors.push(`le champ "${attribute}" de l’élement "${element.id}" de la section "${section.id}" est inconnu`) - } else if (typeof heritageElement.actif !== 'boolean') { - errors.push(`le champ "actif" de l’élement "${element.id}" de la section "${section.id}" doit être un booléen`) - } - }) - } - }) - } - }) - - if (heritageContenu) { - Object.keys(heritageContenu).forEach(sectionId => { - const section = sections!.find(s => s.id === sectionId) - if (!section) { - errors.push(`la section "${sectionId}" est inconnue`) - } else { - Object.keys(heritageContenu[sectionId]).forEach(elementId => { - if (!section.elements?.find(e => e.id === elementId)) { - errors.push(`l’élement "${elementId}" de la section "${sectionId}" est inconnu`) - } - }) - } - }) - } - - return errors -} diff --git a/packages/api/src/business/validations/utils/props-dates-check.ts b/packages/api/src/business/validations/utils/props-dates-check.ts deleted file mode 100644 index e62787db6..000000000 --- a/packages/api/src/business/validations/utils/props-dates-check.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { dateValidate } from 'camino-common/src/date.js' -import { ITitreActivite, ITitreEtape } from '../../../types.js' - -/** - * Vérifie que les champs `date` d'une étape ou activité sont valides - * - * @param propsNames - Noms des propriétés date de l'étape ou activité - * @param element - Étape ou activité dont on vérifie les propriétés date - * @returns un tableau d'erreurs si au moins une date est invalide - * - */ - -export const propsDatesCheck = <T extends ITitreActivite | ITitreEtape>(propsNames: [keyof T], element: T) => { - const errors = propsNames.reduce((errors: string[], propId) => { - if (element[propId]) { - const dateCheck = dateValidate(element[propId] as unknown as string) - if (!dateCheck.valid) { - errors.push(`le champ "${String(propId)}" n'est pas une date valide`) - } - } - - return errors - }, []) - - if (errors.length) { - return errors.join(', ') - } - - return null -} diff --git a/packages/api/src/business/validations/utils/props-numbers-check.ts b/packages/api/src/business/validations/utils/props-numbers-check.ts deleted file mode 100644 index 3f8d141d6..000000000 --- a/packages/api/src/business/validations/utils/props-numbers-check.ts +++ /dev/null @@ -1,15 +0,0 @@ -export const propsNumbersCheck = <T>(props: [keyof T], element: T) => { - const errors = props.reduce((errors: string[], prop) => { - if (element[prop] && (element[prop] as unknown as number) < 0) { - errors.push(`le champ "${String(prop)}" ne peut pas avoir une valeur négative`) - } - - return errors - }, []) - - if (errors.length) { - return errors.join(', ') - } - - return null -} diff --git a/packages/api/src/database/models/_format/id-create.ts b/packages/api/src/database/models/_format/id-create.ts index 34cc81ebd..f876e75b1 100644 --- a/packages/api/src/database/models/_format/id-create.ts +++ b/packages/api/src/database/models/_format/id-create.ts @@ -4,9 +4,10 @@ import { EntrepriseDocumentId, entrepriseDocumentIdValidator } from 'camino-comm import { ActiviteDocumentTypeId, DocumentTypeId } from 'camino-common/src/static/documentsTypes.js' import { randomBytes } from 'node:crypto' import { TitreId } from 'camino-common/src/validators/titres.js' -import { EtapeDocumentId, EtapeId, etapeDocumentIdValidator } from 'camino-common/src/etape.js' +import { EtapeAvisId, EtapeDocumentId, EtapeId, etapeAvisIdValidator, etapeDocumentIdValidator } from 'camino-common/src/etape.js' import { UtilisateurId } from 'camino-common/src/roles.js' import { ActiviteDocumentId, activiteDocumentIdValidator } from 'camino-common/src/activite.js' +import { AvisTypeId } from 'camino-common/src/static/avisTypes' export const idGenerate = <T extends string = string>(length = 24): T => randomBytes(length / 2).toString('hex') as T @@ -41,6 +42,11 @@ export const newEtapeDocumentId = (date: CaminoDate, documentTypeId: DocumentTyp return etapeDocumentIdValidator.parse(`${date}-${documentTypeId}-${hash}`) } +export const newEtapeAvisId = (documentTypeId: AvisTypeId): EtapeAvisId => { + const hash = idGenerate(8) + + return etapeAvisIdValidator.parse(`avis-${documentTypeId}-${hash}`) +} export const newUtilisateurId = (value: string = idGenerate(6)): UtilisateurId => { return value as UtilisateurId diff --git a/packages/api/src/database/models/titres-etapes.ts b/packages/api/src/database/models/titres-etapes.ts index 98c5ca1fa..7a06728e0 100644 --- a/packages/api/src/database/models/titres-etapes.ts +++ b/packages/api/src/database/models/titres-etapes.ts @@ -126,6 +126,11 @@ class TitresEtapes extends Model { } public $formatDatabaseJson(json: Pojo) { + delete json.entrepriseDocumentIds + delete json.etapeDocuments + delete json.etapeAvis + delete json.daeDocument + delete json.aslDocument delete json.modification delete json.suppression json = super.$formatDatabaseJson(json) diff --git a/packages/api/src/database/queries/permissions/titres-etapes.test.integration.ts b/packages/api/src/database/queries/permissions/titres-etapes.test.integration.ts index 50e98257c..e2cfd3431 100644 --- a/packages/api/src/database/queries/permissions/titres-etapes.test.integration.ts +++ b/packages/api/src/database/queries/permissions/titres-etapes.test.integration.ts @@ -8,6 +8,7 @@ import { titresEtapesQueryModify } from './titres-etapes.js' import TitresDemarches from '../../models/titres-demarches.js' import { toCaminoDate } from 'camino-common/src/date.js' import { beforeAll, expect, afterAll, test, describe, vi } from 'vitest' +import { ETAPE_IS_BROUILLON } from 'camino-common/src/etape.js' console.info = vi.fn() console.error = vi.fn() @@ -49,7 +50,7 @@ describe('titresEtapesQueryModify', () => { date: toCaminoDate('2022-03-09'), typeId: 'mfr', statutId: 'fai', - isBrouillon: true, + isBrouillon: ETAPE_IS_BROUILLON, titreDemarcheId, archive: false, }, @@ -58,7 +59,7 @@ describe('titresEtapesQueryModify', () => { date: toCaminoDate('2022-03-09'), typeId: 'mfr', statutId: 'fai', - isBrouillon: true, + isBrouillon: ETAPE_IS_BROUILLON, titreDemarcheId, archive: true, }, diff --git a/packages/api/src/database/queries/titres-demarches.test.integration.ts b/packages/api/src/database/queries/titres-demarches.test.integration.ts index f8e00d9d3..26b1a3f52 100644 --- a/packages/api/src/database/queries/titres-demarches.test.integration.ts +++ b/packages/api/src/database/queries/titres-demarches.test.integration.ts @@ -6,6 +6,7 @@ import TitresEtapes from '../models/titres-etapes.js' import { titreDemarcheArchive } from './titres-demarches.js' import { toCaminoDate } from 'camino-common/src/date.js' import { beforeAll, expect, afterAll, test, describe, vi } from 'vitest' +import { ETAPE_IS_BROUILLON } from 'camino-common/src/etape.js' console.info = vi.fn() console.error = vi.fn() @@ -37,7 +38,7 @@ describe('teste les requêtes sur les démarches', () => { titreDemarcheId: demarche.id, typeId: 'mfr', statutId: 'fai', - isBrouillon: true, + isBrouillon: ETAPE_IS_BROUILLON, date: toCaminoDate('2020-02-02'), }) expect(etape.archive).toBeFalsy() diff --git a/packages/api/src/database/queries/titres-etapes.queries.ts b/packages/api/src/database/queries/titres-etapes.queries.ts index c1d7014e4..ade21c281 100644 --- a/packages/api/src/database/queries/titres-etapes.queries.ts +++ b/packages/api/src/database/queries/titres-etapes.queries.ts @@ -11,8 +11,30 @@ import { IDeleteEtapeDocumentsDbQuery, IUpdateEtapeDocumentFileDbQuery, IUpdateEtapeDocumentInfoDbQuery, + IInsertEtapeAvisDbQuery, + IGetAvisByEtapeIdQueryQuery, + IGetLargeobjectIdByEtapeAvisIdInternalQuery, + IUpdateEtapeAvisInfoDbQuery, + IUpdateEtapeAvisFileDbQuery, + IDeleteEtapeAvisDbQuery, } from './titres-etapes.queries.types.js' -import { EtapeDocument, EtapeDocumentId, EtapeDocumentModification, etapeDocumentValidator, EtapeDocumentWithFileModification, EtapeId, TempEtapeDocument } from 'camino-common/src/etape.js' +import { + ETAPE_IS_NOT_BROUILLON, + EtapeAvisId, + etapeAvisIdValidator, + EtapeAvisModification, + EtapeAvisWithFileModification, + EtapeBrouillon, + EtapeDocument, + EtapeDocumentId, + EtapeDocumentModification, + etapeDocumentValidator, + EtapeDocumentWithFileModification, + EtapeId, + etapeIdValidator, + TempEtapeAvis, + TempEtapeDocument, +} from 'camino-common/src/etape.js' import { EntrepriseDocumentId, entrepriseDocumentValidator, EntrepriseId, EtapeEntrepriseDocument, etapeEntrepriseDocumentValidator } from 'camino-common/src/entreprise.js' import { Pool } from 'pg' import { User } from 'camino-common/src/roles.js' @@ -23,12 +45,17 @@ import { canReadDocument } from '../../api/rest/permissions/documents.js' import { AdministrationId } from 'camino-common/src/static/administrations.js' import { EtapeTypeId } from 'camino-common/src/static/etapesTypes.js' import { TitreTypeId } from 'camino-common/src/static/titresTypes.js' -import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, SimplePromiseFn } from 'camino-common/src/typescript-tools.js' +import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, SimplePromiseFn } from 'camino-common/src/typescript-tools.js' import { CanReadDemarche } from '../../api/rest/permissions/demarches.js' -import { newEtapeDocumentId } from '../models/_format/id-create.js' -import { getCurrent } from 'camino-common/src/date.js' -import { createLargeObject, LargeObjectId } from '../largeobjects.js' +import { newEtapeAvisId, newEtapeDocumentId } from '../models/_format/id-create.js' +import { caminoDateValidator, getCurrent } from 'camino-common/src/date.js' +import { createLargeObject, LargeObjectId, largeObjectIdValidator } from '../largeobjects.js' import { canDeleteEtapeDocument } from 'camino-common/src/permissions/titres-etapes.js' +import { avisStatutIdValidator, avisTypeIdValidator, avisVisibilityIdValidator } from 'camino-common/src/static/avisTypes.js' +import { canReadAvis } from '../../api/rest/permissions/avis.js' +import { getEtapeDataForEdition } from '../../api/rest/etapes.queries.js' +import { etapeAvisStepIsComplete } from 'camino-common/src/permissions/etape-form.js' +import { CommuneId } from 'camino-common/src/static/communes.js' export const insertTitreEtapeEntrepriseDocument = async (pool: Pool, params: { titre_etape_id: EtapeId; entreprise_document_id: EntrepriseDocumentId }) => dbQueryAndValidate(insertTitreEtapeEntrepriseDocumentInternal, params, pool, z.void()) @@ -88,7 +115,7 @@ export const getEntrepriseDocumentLargeObjectIdsByEtapeId = async (params: { tit return result.filter(r => canSeeEntrepriseDocuments(user, r.entreprise_id)) } -export const updateEtapeDocuments = async (pool: Pool, _user: User, titre_etape_id: EtapeId, isBrouillon: boolean, etapeDocuments: EtapeDocumentModification[]) => { +export const updateEtapeDocuments = async (pool: Pool, _user: User, titre_etape_id: EtapeId, isBrouillon: EtapeBrouillon, etapeDocuments: EtapeDocumentModification[]) => { const documentsInDb = await dbQueryAndValidate(getDocumentsByEtapeIdQuery, { titre_etape_id }, pool, getDocumentsByEtapeIdQueryValidator) const etapeDocumentToUpdate = etapeDocuments.filter((document): document is EtapeDocumentWithFileModification => 'id' in document) @@ -159,6 +186,84 @@ insert into etapes_documents (id, etape_document_type_id, etape_id, description, values ($ id !, $ etape_document_type_id !, $ etape_id !, $ description, $ public_lecture !, $ entreprises_lecture !, $ largeobject_id !) ` +export const insertEtapeAvis = async (pool: Pool, titre_etape_id: EtapeId, etapeAvis: TempEtapeAvis[]) => { + for (const avis of etapeAvis) { + const id = newEtapeAvisId(avis.avis_type_id) + const largeobject_id = isNotNullNorUndefined(avis.temp_document_name) ? await createLargeObject(pool, avis.temp_document_name) : null + await insertEtapeAvisWithLargeObjectId(pool, titre_etape_id, avis, id, largeobject_id) + } +} +const updateEtapeAvisFileDb = sql<Redefine<IUpdateEtapeAvisFileDbQuery, { id: EtapeAvisId; largeobject_id: LargeObjectId }, void>>` +update + etape_avis +set + largeobject_id = $ largeobject_id ! +where + id = $ id ! +` +const updateEtapeAvisInfoDb = sql<Redefine<IUpdateEtapeAvisInfoDbQuery, Omit<EtapeAvisWithFileModification, 'has_file' | 'temp_document_name'>, void>>` +update + etape_avis +set + avis_statut_id = $ avis_statut_id !, + avis_visibility_id = $ avis_visibility_id !, + date = $ date !, + avis_type_id = $ avis_type_id !, + description = $ description +where + id = $ id ! +` +const deleteEtapeAvisDb = sql<Redefine<IDeleteEtapeAvisDbQuery, { ids: EtapeAvisId[] }, void>>` +delete from etape_avis +where id in $$ ids ! +` + +export const updateEtapeAvis = async ( + pool: Pool, + titre_etape_id: EtapeId, + isBrouillon: EtapeBrouillon, + etapeAvis: EtapeAvisModification[], + etapeTypeId: EtapeTypeId, + titreTypeId: TitreTypeId, + communeIds: DeepReadonly<CommuneId[]> +) => { + if (isBrouillon === ETAPE_IS_NOT_BROUILLON && !etapeAvisStepIsComplete({ typeId: etapeTypeId }, etapeAvis, titreTypeId, communeIds).valid) { + throw new Error('Impossible de mettre à jour les avis, car ils ne sont pas complets') + } + + const avisInDb = await dbQueryAndValidate(getAvisByEtapeIdQuery, { titre_etape_id }, pool, etapeAvisDbValidator) + + const avisListToUpdate = etapeAvis.filter((avis): avis is EtapeAvisWithFileModification => 'id' in avis) + + const etapeDocumentIdsToUpdate = avisListToUpdate.map(({ id }) => id) + const toDeleteAvis = avisInDb.filter(({ id }) => !etapeDocumentIdsToUpdate.includes(id)) + const toInsertAvis = etapeAvis.filter((avis): avis is TempEtapeAvis => !('id' in avis)) + if (isNotNullNorUndefinedNorEmpty(toDeleteAvis)) { + await dbQueryAndValidate(deleteEtapeAvisDb, { ids: toDeleteAvis.map(({ id }) => id) }, pool, z.void()) + } + if (isNotNullNorUndefinedNorEmpty(avisListToUpdate)) { + for (const avisToUpdate of avisListToUpdate) { + if (isNotNullNorUndefined(avisToUpdate.temp_document_name)) { + const largeobject_id = await createLargeObject(pool, avisToUpdate.temp_document_name) + await dbQueryAndValidate(updateEtapeAvisFileDb, { id: avisToUpdate.id, largeobject_id }, pool, z.void()) + } + await dbQueryAndValidate(updateEtapeAvisInfoDb, avisToUpdate, pool, z.void()) + } + } + if (isNotNullNorUndefinedNorEmpty(toInsertAvis)) { + await insertEtapeAvis(pool, titre_etape_id, toInsertAvis) + } +} + +// VISIBLE FOR TEST +export const insertEtapeAvisWithLargeObjectId = async (pool: Pool, titre_etape_id: EtapeId, avis: TempEtapeAvis, id: EtapeAvisId, largeobject_id: LargeObjectId | null) => { + return dbQueryAndValidate(insertEtapeAvisDb, { ...avis, etape_id: titre_etape_id, id, largeobject_id }, pool, z.void()) +} +const insertEtapeAvisDb = sql<Redefine<IInsertEtapeAvisDbQuery, { etape_id: EtapeId; id: EtapeAvisId; largeobject_id: LargeObjectId | null } & Omit<TempEtapeAvis, 'temp_document_name'>, void>>` +insert into etape_avis (id, avis_type_id, etape_id, description, avis_statut_id, date, avis_visibility_id, largeobject_id) + values ($ id !, $ avis_type_id !, $ etape_id !, $ description !, $ avis_statut_id !, $ date !, $ avis_visibility_id !, $ largeobject_id !) +` + const etapeDocumentLargeObjectIdValidator = z.number().brand('EtapeDocumentLargeObjectId') const getDocumentsByEtapeIdQueryValidator = etapeDocumentValidator.extend({ largeobject_id: etapeDocumentLargeObjectIdValidator }) @@ -199,7 +304,96 @@ export const getEtapeDocumentLargeObjectIdsByEtapeId = async ( return filteredDocuments } +const etapeAvisDbValidator = z.object({ + id: etapeAvisIdValidator, + description: z.string(), + avis_type_id: avisTypeIdValidator, + avis_statut_id: avisStatutIdValidator, + largeobject_id: largeObjectIdValidator.nullable(), + date: caminoDateValidator, + avis_visibility_id: avisVisibilityIdValidator, +}) +type EtapeAvisDb = z.infer<typeof etapeAvisDbValidator> +const getAvisByEtapeIdQuery = sql<Redefine<IGetAvisByEtapeIdQueryQuery, { titre_etape_id: EtapeId }, EtapeAvisDb>>` +select + a.id, + a.description, + a.avis_type_id, + a.avis_statut_id, + a.largeobject_id, + a.date, + a.avis_visibility_id +from + etape_avis a +where + a.etape_id = $ titre_etape_id ! +` +export const getEtapeAvisLargeObjectIdsByEtapeId = async ( + titre_etape_id: EtapeId, + pool: Pool, + user: User, + titreTypeId: SimplePromiseFn<TitreTypeId>, + titresAdministrationsLocales: SimplePromiseFn<AdministrationId[]>, + entreprisesTitulairesOuAmodiataires: SimplePromiseFn<EntrepriseId[]>, + etapeTypeId: EtapeTypeId, + demarche: CanReadDemarche +): Promise<EtapeAvisDb[]> => { + const result = await dbQueryAndValidate(getAvisByEtapeIdQuery, { titre_etape_id }, pool, etapeAvisDbValidator) + const filteredAvis: EtapeAvisDb[] = [] + + for (const avis of result) { + if (await canReadAvis(avis, user, titreTypeId, titresAdministrationsLocales, entreprisesTitulairesOuAmodiataires, etapeTypeId, demarche)) { + filteredAvis.push(avis) + } + } + + return filteredAvis +} +const loidByEtapeAvisIdValidator = z.object({ + largeobject_id: largeObjectIdValidator, + etape_id: etapeIdValidator, + avis_visibility_id: avisVisibilityIdValidator, +}) +export const getLargeobjectIdByEtapeAvisId = async (pool: Pool, user: User, etapeAvisId: EtapeAvisId): Promise<LargeObjectId | null> => { + const result = await dbQueryAndValidate( + getLargeobjectIdByEtapeAvisIdInternal, + { + etapeAvisId, + }, + pool, + loidByEtapeAvisIdValidator + ) + + if (result.length === 1) { + const etapeAvis = result[0] + const { etapeData, titreTypeId, administrationsLocales, entreprisesTitulairesOuAmodiataires } = await getEtapeDataForEdition(pool, etapeAvis.etape_id) + + if ( + await canReadAvis(etapeAvis, user, titreTypeId, administrationsLocales, entreprisesTitulairesOuAmodiataires, etapeData.etape_type_id, { + demarche_type_id: etapeData.demarche_type_id, + entreprises_lecture: etapeData.demarche_entreprises_lecture, + public_lecture: etapeData.demarche_public_lecture, + titre_public_lecture: etapeData.titre_public_lecture, + }) + ) { + return etapeAvis.largeobject_id + } + } + + return null +} +const getLargeobjectIdByEtapeAvisIdInternal = sql<Redefine<IGetLargeobjectIdByEtapeAvisIdInternalQuery, { etapeAvisId: EtapeAvisId }, z.infer<typeof loidByEtapeAvisIdValidator>>>` +select + d.largeobject_id, + d.etape_id, + d.avis_visibility_id +from + etape_avis d +where + d.id = $ etapeAvisId ! +LIMIT 1 +` export const getDocumentsByEtapeId = async ( titre_etape_id: EtapeId, pool: Pool, diff --git a/packages/api/src/database/queries/titres-etapes.queries.types.ts b/packages/api/src/database/queries/titres-etapes.queries.types.ts index 449d4b4bc..3bed86c8e 100644 --- a/packages/api/src/database/queries/titres-etapes.queries.types.ts +++ b/packages/api/src/database/queries/titres-etapes.queries.types.ts @@ -134,6 +134,75 @@ export interface IInsertEtapeDocumentDbQuery { result: IInsertEtapeDocumentDbResult; } +/** 'UpdateEtapeAvisFileDb' parameters type */ +export interface IUpdateEtapeAvisFileDbParams { + id: string; + largeobject_id: number; +} + +/** 'UpdateEtapeAvisFileDb' return type */ +export type IUpdateEtapeAvisFileDbResult = void; + +/** 'UpdateEtapeAvisFileDb' query type */ +export interface IUpdateEtapeAvisFileDbQuery { + params: IUpdateEtapeAvisFileDbParams; + result: IUpdateEtapeAvisFileDbResult; +} + +/** 'UpdateEtapeAvisInfoDb' parameters type */ +export interface IUpdateEtapeAvisInfoDbParams { + avis_statut_id: string; + avis_type_id: string; + avis_visibility_id: string; + date: string; + description?: string | null | void; + id: string; +} + +/** 'UpdateEtapeAvisInfoDb' return type */ +export type IUpdateEtapeAvisInfoDbResult = void; + +/** 'UpdateEtapeAvisInfoDb' query type */ +export interface IUpdateEtapeAvisInfoDbQuery { + params: IUpdateEtapeAvisInfoDbParams; + result: IUpdateEtapeAvisInfoDbResult; +} + +/** 'DeleteEtapeAvisDb' parameters type */ +export interface IDeleteEtapeAvisDbParams { + ids: readonly (string)[]; +} + +/** 'DeleteEtapeAvisDb' return type */ +export type IDeleteEtapeAvisDbResult = void; + +/** 'DeleteEtapeAvisDb' query type */ +export interface IDeleteEtapeAvisDbQuery { + params: IDeleteEtapeAvisDbParams; + result: IDeleteEtapeAvisDbResult; +} + +/** 'InsertEtapeAvisDb' parameters type */ +export interface IInsertEtapeAvisDbParams { + avis_statut_id: string; + avis_type_id: string; + avis_visibility_id: string; + date: string; + description: string; + etape_id: string; + id: string; + largeobject_id: number; +} + +/** 'InsertEtapeAvisDb' return type */ +export type IInsertEtapeAvisDbResult = void; + +/** 'InsertEtapeAvisDb' query type */ +export interface IInsertEtapeAvisDbQuery { + params: IInsertEtapeAvisDbParams; + result: IInsertEtapeAvisDbResult; +} + /** 'GetDocumentsByEtapeIdQuery' parameters type */ export interface IGetDocumentsByEtapeIdQueryParams { titre_etape_id: string; @@ -155,3 +224,43 @@ export interface IGetDocumentsByEtapeIdQueryQuery { result: IGetDocumentsByEtapeIdQueryResult; } +/** 'GetAvisByEtapeIdQuery' parameters type */ +export interface IGetAvisByEtapeIdQueryParams { + titre_etape_id: string; +} + +/** 'GetAvisByEtapeIdQuery' return type */ +export interface IGetAvisByEtapeIdQueryResult { + avis_statut_id: string; + avis_type_id: string; + avis_visibility_id: string; + date: string; + description: string; + id: string; + largeobject_id: number | null; +} + +/** 'GetAvisByEtapeIdQuery' query type */ +export interface IGetAvisByEtapeIdQueryQuery { + params: IGetAvisByEtapeIdQueryParams; + result: IGetAvisByEtapeIdQueryResult; +} + +/** 'GetLargeobjectIdByEtapeAvisIdInternal' parameters type */ +export interface IGetLargeobjectIdByEtapeAvisIdInternalParams { + etapeAvisId: string; +} + +/** 'GetLargeobjectIdByEtapeAvisIdInternal' return type */ +export interface IGetLargeobjectIdByEtapeAvisIdInternalResult { + avis_visibility_id: string; + etape_id: string; + largeobject_id: number | null; +} + +/** 'GetLargeobjectIdByEtapeAvisIdInternal' query type */ +export interface IGetLargeobjectIdByEtapeAvisIdInternalQuery { + params: IGetLargeobjectIdByEtapeAvisIdInternalParams; + result: IGetLargeobjectIdByEtapeAvisIdInternalResult; +} + diff --git a/packages/api/src/database/queries/titres.test.integration.ts b/packages/api/src/database/queries/titres.test.integration.ts index 011bbf67c..dd51579ec 100644 --- a/packages/api/src/database/queries/titres.test.integration.ts +++ b/packages/api/src/database/queries/titres.test.integration.ts @@ -6,6 +6,7 @@ import TitresEtapes from '../models/titres-etapes.js' import { titreArchive } from './titres.js' import { toCaminoDate } from 'camino-common/src/date.js' import { beforeAll, expect, afterAll, test, describe, vi } from 'vitest' +import { ETAPE_IS_BROUILLON } from 'camino-common/src/etape.js' console.info = vi.fn() console.error = vi.fn() @@ -39,7 +40,7 @@ describe('teste les requêtes sur les titres', () => { titreDemarcheId: demarche.id, typeId: 'mfr', statutId: 'fai', - isBrouillon: true, + isBrouillon: ETAPE_IS_BROUILLON, date: toCaminoDate('2020-02-02'), }) expect(etape.archive).toBeFalsy() diff --git a/packages/api/src/knex/migrations/20240610091608_add_avis-documents.ts b/packages/api/src/knex/migrations/20240610091608_add_avis-documents.ts new file mode 100644 index 000000000..3e6645203 --- /dev/null +++ b/packages/api/src/knex/migrations/20240610091608_add_avis-documents.ts @@ -0,0 +1,237 @@ +/* eslint-disable no-restricted-syntax */ +/* eslint-disable sql/no-unsafe-query */ +import { DemarcheId } from 'camino-common/src/demarche.js' +import { EtapeDocumentId, EtapeId } from 'camino-common/src/etape.js' +import { AvisStatutId, AvisTypeId, AvisVisibilityId, AvisVisibilityIds } from 'camino-common/src/static/avisTypes.js' +import { EtapeStatutId } from 'camino-common/src/static/etapesStatuts.js' +import { EtapeTypeId } from 'camino-common/src/static/etapesTypes.js' +import { DeepReadonly, isNotNullNorUndefinedNorEmpty, isNullOrUndefined } from 'camino-common/src/typescript-tools.js' +import { Knex } from 'knex' +import { LargeObjectId } from '../../database/largeobjects.js' +import { newEtapeAvisId } from '../../database/models/_format/id-create.js' +import { CaminoDate } from 'camino-common/src/date.js' +import { Section, getSectionsWithValue } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.js' +import { TitreTypeId } from 'camino-common/src/static/titresTypes.js' +import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes.js' +import { valeurFind } from 'camino-common/src/sections.js' +import { Contenu } from 'camino-common/src/permissions/sections.js' + +const oldSections = { + eof: [ + { + id: 'onf', + nom: 'Office National des Forêts', + elements: [ + { id: 'motifs', nom: 'Motifs', type: 'textarea', optionnel: true, description: "Élément d'expertise" }, + { id: 'expert', nom: 'Expert', type: 'text', optionnel: true, description: "Agent ONF qui a réalisé l'expertise" }, + { id: 'agent', nom: 'Agent', type: 'text', optionnel: true, description: 'Chargé de mission foncier du Service Aménagement du Territoire' }, + { + id: 'dateDebut', + nom: 'Date de début', + type: 'date', + optionnel: true, + description: 'Date de début de l’expertise', + }, + ], + }, + ], + aof: [ + { + id: 'onf', + nom: 'Office National des Forêts', + elements: [ + { id: 'motifs', nom: 'Motifs', type: 'textarea', optionnel: true, description: "Élément d'expertise" }, + { + id: 'signataire', + nom: 'Signataire', + type: 'text', + optionnel: true, + description: 'Directeur ONF ou responsable du service Service Aménagement du Territoire qui apparaitra sur les documents externe pour signature', + }, + ], + }, + ], +} as const + +const ETAPE_TYPE_ID_TO_AVIS_TYPE_ID: { [key in string]?: AvisTypeId } = { + ssr: 'lettreDeSaisineDesServices', + wss: 'lettreDeSaisineDesServices', + cps: 'confirmationAccordProprietaireDuSol', + aac: 'avisDirectionRegionaleDesAffairesCulturelles', + wac: 'avisDirectionRegionaleDesAffairesCulturelles', + aaf: 'avisDirectionAlimentationAgricultureForet', + acd: 'avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques', + wat: 'avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques', + abs: 'avisServiceMilieuxNaturelsBiodiversiteSitesPaysages', + aec: 'avisDirectionsRégionalesEconomieEmploiTravailSolidarités', + afp: 'avisDirectionRegionaleFinancesPubliques', + agn: 'avisGendarmerieNationale', + ami: 'avisParcNaturelMarin', + aim: 'avisIFREMER', + aof: 'avisOfficeNationalDesForets', + eof: 'expertiseOfficeNationalDesForets', + aop: 'avisInstitutNationalOrigineQualite', + api: 'avisEtatMajorOrpaillagePecheIllicite', + apl: 'avisServiceAdministratifLocal', + apm: 'avisAutoriteMilitaire', + wam: 'avisAutoriteMilitaire', + apn: 'avisParcNational', + wdt: 'avisDirectionDepartementaleTerritoiresMer', + wad: 'avisDirectionDepartementaleTerritoiresMer', + ars: 'avisAgenceRegionaleSante', + was: 'avisAgenceRegionaleSante', + ass: 'avisCaisseGeneraleSecuriteSociale', + wai: 'autreAvis', + ari: 'autreAvis', + wal: 'autreAvis', + pnr: 'autreAvis', + auc: 'autreAvis', +} as const +const getVisibilityId = (etapeDocument: Pick<DocumentFromDb, 'public_lecture' | 'entreprises_lecture'>): AvisVisibilityId => { + if (etapeDocument.public_lecture) { + return AvisVisibilityIds.Public + } + + if (etapeDocument.entreprises_lecture) { + return AvisVisibilityIds.TitulairesEtAdministrations + } + + return AvisVisibilityIds.Administrations +} +const etapeTypesToDelete = Object.keys(ETAPE_TYPE_ID_TO_AVIS_TYPE_ID) +const ETAPE_STATUT_ID_TO_AVIS_STATUT_ID: { [key in EtapeStatutId]?: AvisStatutId } = { + fav: 'Favorable', + def: 'Défavorable', + fre: 'Favorable avec réserves', + fai: 'Favorable', + dre: 'Défavorable', +} as const +type EtapeFromDb = { id: EtapeId; date: CaminoDate; titre_demarche_id: DemarcheId; type_id: EtapeTypeId | 'eof' | 'aof'; statut_id: EtapeStatutId; contenu: Contenu } +type DocumentFromDb = { id: EtapeDocumentId; largeobject_id: LargeObjectId; description: string; public_lecture: boolean; entreprises_lecture: boolean } +export const up = async (knex: Knex) => { + await knex.raw(`DELETE FROM etapes_documents where etape_id in (select id FROM titres_etapes where archive is true and type_id in (${etapeTypesToDelete.map(_ => '?').join(',')}))`, [ + ...etapeTypesToDelete, + ]) + await knex.raw(`DELETE FROM titres_etapes where archive is true and type_id in (${etapeTypesToDelete.map(_ => '?').join(',')})`, [...etapeTypesToDelete]) + await knex.raw( + 'CREATE TABLE etape_avis (id character varying(255) NOT NULL, avis_type_id character varying(255) NOT NULL, avis_statut_id character varying(255) NOT NULL, avis_visibility_id character varying(255) NOT NULL, etape_id character varying(255) NOT NULL, description text NOT NULL, date character varying(10) NOT NULL, largeobject_id oid)' + ) + + const allEtapesDb: { rows: EtapeFromDb[] } = await knex.raw( + `SELECT * FROM titres_etapes + WHERE titres_etapes.type_id IN (${etapeTypesToDelete.map(_ => '?').join(',')}) + ORDER BY titres_etapes.ordre ASC`, + [...etapeTypesToDelete] + ) + + const etapesByDemarcheId = allEtapesDb.rows.reduce<Record<DemarcheId, EtapeFromDb[]>>((acc, etape) => { + if (acc[etape.titre_demarche_id] === undefined) { + acc[etape.titre_demarche_id] = [] + } + acc[etape.titre_demarche_id].push(etape) + + return acc + }, {}) + + for (const etapes of Object.values(etapesByDemarcheId)) { + // @ts-ignore + const ssrEtape = etapes.find(({ type_id }) => type_id === 'ssr') + // @ts-ignore + const aofEtape = etapes.find(({ type_id }) => type_id === 'aof') + + const etapePivotId = ssrEtape?.id ?? aofEtape?.id ?? etapes[0].id + + for (let index = 0; index < etapes.length; index++) { + const etape = etapes[index] + + // documents et avis vide + const documents: { rows: DocumentFromDb[] } = await knex.raw(`SELECT * from etapes_documents where etape_id= :id`, { id: etape.id }) + const avisTypeId = ETAPE_TYPE_ID_TO_AVIS_TYPE_ID[etape.type_id] + const avisStatutId = ETAPE_STATUT_ID_TO_AVIS_STATUT_ID[etape.statut_id] + if (isNullOrUndefined(avisTypeId) || isNullOrUndefined(avisStatutId)) { + console.error('une étape type id ou statut non prise en compte', etape) + } else { + const titreTypeIdDemarcheTypeId: { rows: [{ titre_type_id: TitreTypeId; demarche_type_id: DemarcheTypeId }] } = await knex.raw( + ` + SELECT t.type_id as titre_type_id, d.type_id as demarche_type_id from titres_demarches d join titres t on t.id = d.titre_id where d.id= :id`, + { id: etape.titre_demarche_id } + ) + let sections: DeepReadonly<Section[]> = [] + if (titreTypeIdDemarcheTypeId.rows[0].titre_type_id === 'arm' && titreTypeIdDemarcheTypeId.rows[0].demarche_type_id === 'oct' && (etape.type_id === 'eof' || etape.type_id === 'aof')) { + sections = oldSections[etape.type_id] + } + const descriptionSections: string[] = [] + + if (isNotNullNorUndefinedNorEmpty(sections)) { + const sectionsWithValue = getSectionsWithValue(sections, etape.contenu) + for (const section of sectionsWithValue) { + for (const element of section.elements) { + const value = valeurFind(element) + if (value !== '–') { + descriptionSections.push(`- ${element.nom} : ${valeurFind(element)}`) + } + } + } + } + + for (let i = 0; i < documents.rows.length; i++) { + const document = documents.rows[i] + + let description: string = document.description ?? '' + if (i === 0) { + if (isNotNullNorUndefinedNorEmpty(description)) { + description = `${description} +${descriptionSections.join('\n')}` + } else { + description = descriptionSections.join('\n') + } + } + const row = { + id: document.id, + avis_type_id: avisTypeId, + etape_id: etapePivotId, + + description, + avis_statut_id: avisStatutId, + date: etape.date, + largeobject_id: document.largeobject_id, + avis_visibility_id: getVisibilityId(document), + } + await knex.raw( + 'INSERT INTO etape_avis(id, avis_type_id, etape_id, description, avis_statut_id, date, largeobject_id, avis_visibility_id) VALUES(:id, :avis_type_id, :etape_id, :description, :avis_statut_id, :date, :largeobject_id, :avis_visibility_id)', + { ...row, etape_id: etapePivotId } + ) + await knex.raw('DELETE FROM etapes_documents WHERE id = :id', { id: row.id }) + } + if (documents.rows.length === 0) { + const row = { + id: newEtapeAvisId(avisTypeId), + avis_type_id: avisTypeId, + etape_id: etapePivotId, + description: descriptionSections.join('\n'), + avis_statut_id: avisStatutId, + date: etape.date, + largeobject_id: null, + avis_visibility_id: 'Administrations', + } + await knex.raw( + 'INSERT INTO etape_avis(id, avis_type_id, etape_id, description, avis_statut_id, date, largeobject_id, avis_visibility_id) VALUES(:id, :avis_type_id, :etape_id, :description, :avis_statut_id, :date, :largeobject_id, :avis_visibility_id)', + { ...row, etape_id: etapePivotId } + ) + } + } + + if (etapePivotId === etape.id) { + await knex.raw(`UPDATE titres_etapes SET type_id = 'asc', statut_id='fai' WHERE id = :id`, { + id: etape.id, + }) + } else { + await knex.raw(`DELETE FROM titres_etapes WHERE id = :id`, { + id: etape.id, + }) + } + } + } +} + +export const down = () => ({}) diff --git a/packages/api/src/pg-database.ts b/packages/api/src/pg-database.ts index 22f1b0a74..9c2f7fcbd 100644 --- a/packages/api/src/pg-database.ts +++ b/packages/api/src/pg-database.ts @@ -2,14 +2,13 @@ import { TaggedQuery } from '@pgtyped/runtime' import type { Pool } from 'pg' import { z } from 'zod' import type { ZodType, ZodTypeDef } from 'zod' - export type Redefine<T, P, O> = T extends { params: infer A; result: infer B } ? { inputs: keyof A; outputs: keyof B } extends { inputs: keyof P; outputs: keyof O } ? { inputs: keyof P; outputs: keyof O } extends { inputs: keyof A; outputs: keyof B } ? { params: P; result: O } - : false - : false - : false + : { __camino_error: 'toutes les clés de redefine ne sont pas présentes dans pgtyped' } + : { __camino_error: 'toutes les clés de pgtyped ne sont pas présentes dans redefine' } + : { __camino_error: 'on a pas params et result' } export const dbQueryAndValidate = async <Params, Result, T extends ZodType<Result, ZodTypeDef, unknown>>( query: TaggedQuery<{ params: Params; result: Result }>, diff --git a/packages/api/src/server/rest.ts b/packages/api/src/server/rest.ts index 2c4cf2f5e..cf46627d8 100644 --- a/packages/api/src/server/rest.ts +++ b/packages/api/src/server/rest.ts @@ -8,7 +8,7 @@ import { join } from 'path' import { inspect } from 'node:util' import { activites, demarches, entreprises, titre, titres, travaux } from '../api/rest/index.js' -import { NewDownload, etapeDocumentDownload, etapeTelecharger, streamLargeObjectInResponse } from '../api/rest/fichiers.js' +import { NewDownload, avisDocumentDownload, etapeDocumentDownload, etapeTelecharger, streamLargeObjectInResponse } from '../api/rest/fichiers.js' import { getTitreLiaisons, postTitreLiaisons, removeTitre, titresAdministrations, titresONF, updateTitre, utilisateurTitreAbonner, getTitre, getUtilisateurTitreAbonner } from '../api/rest/titres.js' import { creerEntreprise, @@ -40,12 +40,22 @@ import { import { CaminoConfig, caminoConfigValidator } from 'camino-common/src/static/config.js' import { CaminoRequest, CustomResponse } from '../api/rest/express-type.js' import { User } from 'camino-common/src/roles.js' -import { deleteEtape, deposeEtape, getEtapeDocuments, getEtapeEntrepriseDocuments, getEtapesTypesEtapesStatusWithMainStep } from '../api/rest/etapes.js' +import { + createEtape, + deleteEtape, + deposeEtape, + getEtape, + getEtapeAvis, + getEtapeDocuments, + getEtapeEntrepriseDocuments, + getEtapesTypesEtapesStatusWithMainStep, + updateEtape, +} from '../api/rest/etapes.js' import { z } from 'zod' import { getCommunes } from '../api/rest/communes.js' import { SendFileOptions } from 'express-serve-static-core' import { activiteDocumentDownload, getActivite, updateActivite, deleteActivite } from '../api/rest/activites.js' -import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools.js' +import { DeepReadonly, isNotNullNorUndefined } from 'camino-common/src/typescript-tools.js' import { getDemarcheByIdOrSlug } from '../api/rest/demarches.js' import { geojsonImport, geojsonImportPoints, convertGeojsonPointsToGeoSystemeId, getPerimetreInfos, geojsonImportForages } from '../api/rest/perimetre.js' import { getDataGouvStats } from '../api/rest/statistiques/datagouv.js' @@ -74,7 +84,7 @@ type IRestResolver = ( user: User ) => Promise<IRestResolverResult | null> -type RestGetCall<Route extends GetRestRoutes> = (pool: Pool) => (req: CaminoRequest, res: CustomResponse<z.infer<(typeof CaminoRestRoutes)[Route]['get']['output']>>) => Promise<void> +type RestGetCall<Route extends GetRestRoutes> = (pool: Pool) => (req: CaminoRequest, res: CustomResponse<DeepReadonly<z.infer<(typeof CaminoRestRoutes)[Route]['get']['output']>>>) => Promise<void> type RestPostCall<Route extends PostRestRoutes> = (pool: Pool) => (req: CaminoRequest, res: CustomResponse<z.infer<(typeof CaminoRestRoutes)[Route]['post']['output']>>) => Promise<void> type RestPutCall<Route extends PutRestRoutes> = (pool: Pool) => (req: CaminoRequest, res: CustomResponse<z.infer<(typeof CaminoRestRoutes)[Route]['put']['output']>>) => Promise<void> type RestDeleteCall = (pool: Pool) => (req: CaminoRequest, res: CustomResponse<void | Error>) => Promise<void> @@ -102,6 +112,7 @@ const restRouteImplementations: Readonly<{ [key in CaminoRestRoute]: Transform<k '/download/fichiers/:documentId': { newDownload: etapeDocumentDownload }, '/download/entrepriseDocuments/:documentId': { newDownload: entrepriseDocumentDownload }, '/download/activiteDocuments/:documentId': { newDownload: activiteDocumentDownload }, + '/download/avisDocument/:etapeAvisId': { newDownload: avisDocumentDownload }, '/fichiers/:documentId': { newDownload: etapeDocumentDownload }, '/titres/:id': { download: titre }, '/titres': { download: titres }, @@ -145,10 +156,12 @@ const restRouteImplementations: Readonly<{ [key in CaminoRestRoute]: Transform<k '/rest/administrations/:administrationId/activiteTypeEmails/delete': { post: deleteAdministrationActiviteTypeEmails }, '/rest/demarches/:demarcheId/geojson': { get: getPerimetreInfos }, '/rest/etapes/:etapeId/geojson': { get: getPerimetreInfos }, - '/rest/etapes/:etapeId': { delete: deleteEtape }, + '/rest/etapes/:etapeIdOrSlug': { delete: deleteEtape, get: getEtape }, + '/rest/etapes': { post: createEtape, put: updateEtape }, '/rest/etapes/:etapeId/depot': { put: deposeEtape }, '/rest/etapes/:etapeId/entrepriseDocuments': { get: getEtapeEntrepriseDocuments }, '/rest/etapes/:etapeId/etapeDocuments': { get: getEtapeDocuments }, + '/rest/etapes/:etapeId/etapeAvis': { get: getEtapeAvis }, '/rest/activites/:activiteId': { get: getActivite, put: updateActivite, delete: deleteActivite }, '/rest/communes': { get: getCommunes }, '/rest/geojson/import/:geoSystemeId': { post: geojsonImport }, diff --git a/packages/api/src/tools/demarches/tests-creation.ts b/packages/api/src/tools/demarches/tests-creation.ts index 899b7e82a..7912d5b85 100644 --- a/packages/api/src/tools/demarches/tests-creation.ts +++ b/packages/api/src/tools/demarches/tests-creation.ts @@ -55,9 +55,9 @@ const writeEtapesForTest = async () => { }) ?? [] ).map(etape => titreEtapeForMachineValidator.parse(etape)) ) - // Pour anonymiser la date en gardant les délai en mois entre la saisine et l'apd, - // on trouve la date de saisine et on calcule un delta random pour tomber dans le même mois - const firstSaisineDate = etapes.find(etape => etape.etapeTypeId === ETAPES_TYPES.saisineDesServices)?.date ?? etapes[0].date + // Pour anonymiser la date en gardant les délai en mois entre les 'avis des services et commissions consultatives' et l'apd, + // on trouve la date et on calcule un delta random pour tomber dans le même mois + const firstSaisineDate = etapes.find(etape => etape.etapeTypeId === ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives)?.date ?? etapes[0].date const decalageJour = daysBetween(firstSaisineDate, setDayInMonth(firstSaisineDate, Math.floor(Math.random() * 28))) try { if (!demarcheDefinition.machine.isEtapesOk(etapes)) { diff --git a/packages/api/src/tools/phases/tests-creation.ts b/packages/api/src/tools/phases/tests-creation.ts index 7e1cff261..3cb8dacb2 100644 --- a/packages/api/src/tools/phases/tests-creation.ts +++ b/packages/api/src/tools/phases/tests-creation.ts @@ -14,6 +14,7 @@ import { newDemarcheId, newTitreId } from '../../database/models/_format/id-crea import { TitreDemarchePhaseFind, TitreEtapePhaseFind } from '../../business/rules/titre-phases-find.js' import { TitreId } from 'camino-common/src/validators/titres.js' import { isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools.js' +import { EtapeBrouillon } from 'camino-common/src/etape.js' const writePhasesForTest = async () => { const demarches: { @@ -42,7 +43,7 @@ const writePhasesForTest = async () => { date: CaminoDate duree: number | null statut_id: EtapeStatutId - is_brouillon: boolean + is_brouillon: EtapeBrouillon geojson4326_perimetre: NonNullable<unknown> | null }[] } = diff --git a/packages/api/src/types.ts b/packages/api/src/types.ts index 75d65452c..7e58fd070 100644 --- a/packages/api/src/types.ts +++ b/packages/api/src/types.ts @@ -22,53 +22,47 @@ import { ActivitesTypesId } from 'camino-common/src/static/activitesTypes.js' import { CommuneId } from 'camino-common/src/static/communes.js' import { ForetId } from 'camino-common/src/static/forets.js' import { TitreId, TitreSlug } from 'camino-common/src/validators/titres.js' -import { EtapeId, EtapeSlug } from 'camino-common/src/etape' +import { EtapeBrouillon, EtapeId, EtapeSlug } from 'camino-common/src/etape' import { ActiviteId } from 'camino-common/src/activite.js' import { FeatureCollectionForages, FeatureCollectionPoints, FeatureMultiPolygon, GeojsonPoint, MultiPolygon } from 'camino-common/src/perimetre.js' import { EtapeHeritageProps } from 'camino-common/src/heritage' import { GeoSystemeId } from 'camino-common/src/static/geoSystemes' import { ElementWithValue } from 'camino-common/src/sections' - -enum TitreEtapesTravauxTypes { - DemandeAutorisationOuverture = 'wfa', - DeclarationOuverture = 'wfo', - DeclarationArret = 'wfd', - DepotDemande = 'wdd', - DemandeComplements = 'wdc', - ReceptionComplements = 'wrc', - Recevabilite = 'wre', - AvisReception = 'war', - SaisineAutoriteEnvironmentale = 'wse', - AvisAutoriteEnvironmentale = 'wae', - SaisineServiceEtat = 'wss', - AvisServiceAdminLocal = 'wal', - AvisDDTM = 'wad', - AvisAutoriteMilitaire = 'wam', - AvisARS = 'was', - AvisDRAC = 'wac', - AvisPrefetMaritime = 'wap', - AvisAutresInstances = 'wai', - ArretePrefectoralSursis = 'wps', - MemoireReponseExploitant = 'wmm', - OuvertureEnquetePublique = 'woe', - ClotureEnquetePublique = 'wce', - RapportDREAL = 'wrd', - AvisRapportDirecteurREAL = 'wrl', - TransPrescriptionsDemandeur = 'wtp', - AvisCODERST = 'wat', - AvisPrescriptionsDemandeur = 'wau', - PubliDecisionRecueilActesAdmin = 'wpa', - DonneActeDeclaration = 'wda', - ArretePrefectDonneActe1 = 'wpp', - ArretePrefectDonneActe2 = 'wpo', - ArretePrescriptionComplementaire = 'wpc', - ArreteOuvertureTravauxMiniers = 'wao', - MemoireFinTravaux = 'wmt', - Recolement = 'wrt', - Abandon = 'wab', - DecisionAdmin = 'wdm', - PorterAConnaissance = 'wpb', -} +import { KM2 } from 'camino-common/src/number' + +const TitreEtapesTravauxTypes = { + AvisDesServicesEtCommissionsConsultatives: 'asc', + DemandeAutorisationOuverture: 'wfa', + DeclarationOuverture: 'wfo', + DeclarationArret: 'wfd', + DepotDemande: 'wdd', + DemandeComplements: 'wdc', + ReceptionComplements: 'wrc', + Recevabilite: 'wre', + AvisReception: 'war', + SaisineAutoriteEnvironmentale: 'wse', + AvisAutoriteEnvironmentale: 'wae', + AvisPrefetMaritime: 'wap', + ArretePrefectoralSursis: 'wps', + MemoireReponseExploitant: 'wmm', + OuvertureEnquetePublique: 'woe', + ClotureEnquetePublique: 'wce', + RapportDREAL: 'wrd', + AvisRapportDirecteurREAL: 'wrl', + TransPrescriptionsDemandeur: 'wtp', + AvisPrescriptionsDemandeur: 'wau', + PubliDecisionRecueilActesAdmin: 'wpa', + DonneActeDeclaration: 'wda', + ArretePrefectDonneActe1: 'wpp', + ArretePrefectDonneActe2: 'wpo', + ArretePrescriptionComplementaire: 'wpc', + ArreteOuvertureTravauxMiniers: 'wao', + MemoireFinTravaux: 'wmt', + Recolement: 'wrt', + Abandon: 'wab', + DecisionAdmin: 'wdm', + PorterAConnaissance: 'wpb', +} as const satisfies Record<string, EtapeTypeId> export interface IFields { [key: string]: IFields @@ -239,14 +233,14 @@ export interface ITitreEtapePerimetre { geojsonOrigineGeoSystemeId: GeoSystemeId | null | undefined geojson4326Forages: FeatureCollectionForages | null | undefined geojsonOrigineForages: FeatureCollectionForages | null | undefined - surface: number | null | undefined + surface: KM2 | null | undefined } type ITitreEtape = { id: EtapeId slug?: EtapeSlug typeId: EtapeTypeId statutId: EtapeStatutId - isBrouillon: boolean + isBrouillon: EtapeBrouillon ordre?: number | null date: CaminoDate duree?: number | null @@ -260,6 +254,7 @@ type ITitreEtape = { amodiataireIds?: EntrepriseId[] | null administrationsLocales?: AdministrationId[] | null entrepriseDocumentIds?: EntrepriseDocumentId[] | null + etapeDocuments?: unknown[] communes?: ICommune[] | null forets?: ForetId[] | null sdomZones?: SDOMZoneId[] | null diff --git a/packages/api/tests/_utils/administrations-permissions.ts b/packages/api/tests/_utils/administrations-permissions.ts index 1ee641f18..791402c00 100644 --- a/packages/api/tests/_utils/administrations-permissions.ts +++ b/packages/api/tests/_utils/administrations-permissions.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/strict-boolean-expressions */ import { ITitre } from '../../src/types.js' -import { graphQLCall, queryImport } from './index.js' +import { graphQLCall, queryImport, restPostCall } from './index.js' import Titres from '../../src/database/models/titres.js' import options from '../../src/database/queries/_options.js' @@ -18,12 +18,15 @@ import type { Pool } from 'pg' import { getSections } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.js' import { TitreId } from 'camino-common/src/validators/titres.js' import TitresDemarches from '../../src/database/models/titres-demarches.js' -import { ETAPE_HERITAGE_PROPS } from 'camino-common/src/heritage.js' import { GEO_SYSTEME_IDS } from 'camino-common/src/static/geoSystemes.js' import { DocumentTypeId } from 'camino-common/src/static/documentsTypes.js' import { copyFileSync, mkdirSync } from 'node:fs' -import { TempEtapeDocument } from 'camino-common/src/etape.js' +import { ETAPE_IS_NOT_BROUILLON, TempEtapeDocument } from 'camino-common/src/etape.js' import { tempDocumentNameValidator } from 'camino-common/src/document.js' +import { userSuper } from '../../src/database/user-super.js' +import { defaultHeritageProps } from 'camino-common/src/etape-form.js' +import { isNullOrUndefined } from 'camino-common/src/typescript-tools.js' +import { HTTP_STATUS } from 'camino-common/src/http.js' const dir = `${process.cwd()}/files/tmp/` @@ -157,6 +160,11 @@ export const creationCheck = async (pool: Pool, administrationId: string, creer: const slug = result.body.data.demarcheCreer.slug const demarche = await TitresDemarches.query().findOne({ slug }) + expect(demarche).not.toBeUndefined() + expect(demarche).not.toBeNull() + if (isNullOrUndefined(demarche)) { + throw new Error('pour typescript') + } const etapeTypeId = 'mfr' @@ -196,7 +204,7 @@ export const creationCheck = async (pool: Pool, administrationId: string, creer: return acc }, {} as any) - const documentTypesIds = getDocuments(titreTypeId, demarche?.typeId, etapeTypeId) + const documentTypesIds = getDocuments(titreTypeId, demarche.typeId, etapeTypeId) .filter(({ optionnel }) => !optionnel) .map(({ id }) => id) const etapeDocuments = [] @@ -204,75 +212,66 @@ export const creationCheck = async (pool: Pool, administrationId: string, creer: for (const documentTypeId of documentTypesIds) { etapeDocuments.push(testDocumentCreateTemp(documentTypeId)) } - const res = await graphQLCall( - pool, - queryImport('titre-etape-creer'), - { - etape: { - typeId: etapeTypeId, - statutId: 'fai', - titreDemarcheId: demarche?.id, - date: '2022-01-01', - duree: 10, - heritageProps: ETAPE_HERITAGE_PROPS.reduce( - (acc, prop) => { - acc[prop] = { actif: false } - - return acc - }, - {} as { - [key: string]: { actif: boolean } - } - ), - heritageContenu, - contenu, - substances: ['auru'], - etapeDocuments, - geojson4326Perimetre: { - type: 'Feature', - properties: {}, - geometry: { - type: 'MultiPolygon', - coordinates: [ - [ - [ - [1, 2], - [1, 2], - [1, 2], - [1, 2], - ], - ], + const res = await restPostCall(pool, '/rest/etapes', {}, userSuper, { + typeId: etapeTypeId, + statutId: 'fai', + titreDemarcheId: demarche.id, + date: toCaminoDate('2022-01-01'), + etapeAvis: [], + duree: 10, + dateDebut: null, + dateFin: null, + geojson4326Points: null, + geojsonOriginePoints: null, + geojsonOrigineForages: null, + titulaireIds: [], + amodiataireIds: [], + notes: null, + entrepriseDocumentIds: [], + heritageProps: defaultHeritageProps, + heritageContenu, + contenu, + substances: ['auru'], + etapeDocuments, + geojson4326Perimetre: { + type: 'Feature', + properties: {}, + geometry: { + type: 'MultiPolygon', + coordinates: [ + [ + [ + [1, 2], + [1, 2], + [1, 2], + [1, 2], ], - }, - }, - geojsonOrigineGeoSystemeId: GEO_SYSTEME_IDS.WGS84, - geojsonOriginePerimetre: { - type: 'Feature', - properties: {}, - geometry: { - type: 'MultiPolygon', - coordinates: [ - [ - [ - [1, 2], - [1, 2], - [1, 2], - [1, 2], - ], - ], + ], + ], + }, + }, + geojsonOrigineGeoSystemeId: GEO_SYSTEME_IDS.WGS84, + geojsonOriginePerimetre: { + type: 'Feature', + properties: {}, + geometry: { + type: 'MultiPolygon', + coordinates: [ + [ + [ + [1, 2], + [1, 2], + [1, 2], + [1, 2], ], - }, - }, + ], + ], }, }, - { - role: 'super', - } - ) + }) if (creer) { - expect(res.body.errors).toBe(undefined) - expect(res.body.data).toMatchObject({ etapeCreer: {} }) + expect(res.statusCode).toBe(HTTP_STATUS.HTTP_STATUS_OK) } else { expect(res.body.errors[0].message).toBe('droits insuffisants pour créer cette étape') } @@ -326,7 +325,7 @@ const titreBuild = ( ordre: 0, titreDemarcheId: newDemarcheId(`${titreId}-demarche-id`), statutId: 'enc', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, date: toCaminoDate('2020-01-01'), administrationsLocales: administrationIdLocale ? [administrationIdLocale] : [], }, diff --git a/packages/api/tests/_utils/index.ts b/packages/api/tests/_utils/index.ts index 3d3801a9f..122afda5d 100644 --- a/packages/api/tests/_utils/index.ts +++ b/packages/api/tests/_utils/index.ts @@ -15,7 +15,7 @@ import { CaminoRestRoutes, DeleteRestRoutes, getRestRoute, GetRestRoutes, PostRe import { z } from 'zod' import { newUtilisateurId } from '../../src/database/models/_format/id-create.js' import { idUserKeycloakRecognised } from '../keycloak.js' -import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools.js' +import { DeepReadonly, isNotNullNorUndefined } from 'camino-common/src/typescript-tools.js' import { config } from '../../src/config/index.js' export const queryImport = (nom: string) => @@ -63,7 +63,7 @@ export const restPostCall = async <Route extends PostRestRoutes>( caminoRestRoute: Route, params: CaminoRestParams<Route>, user: TestUser | undefined, - body: z.infer<(typeof CaminoRestRoutes)[Route]['post']['input']> + body: DeepReadonly<z.infer<(typeof CaminoRestRoutes)[Route]['post']['input']>> ): Promise<request.Test> => { const req = request(app(pool)) .post(getRestRoute(caminoRestRoute, params)) diff --git a/packages/api/tests/queries/titre-etape-creer.graphql b/packages/api/tests/queries/titre-etape-creer.graphql deleted file mode 100644 index 227069ccf..000000000 --- a/packages/api/tests/queries/titre-etape-creer.graphql +++ /dev/null @@ -1,9 +0,0 @@ -mutation EtapeCreer($etape: InputEtapeCreation!) { - etapeCreer(etape: $etape) { - ...etape - } -} - -fragment etape on Etape { - id -} diff --git a/packages/api/tests/queries/titre-etape-modifier.graphql b/packages/api/tests/queries/titre-etape-modifier.graphql deleted file mode 100644 index 632c21ef4..000000000 --- a/packages/api/tests/queries/titre-etape-modifier.graphql +++ /dev/null @@ -1,9 +0,0 @@ -mutation EtapeModifier($etape: InputEtapeModification!) { - etapeModifier(etape: $etape) { - ...etape - } -} - -fragment etape on Etape { - id -} diff --git a/packages/common/package.json b/packages/common/package.json index 8cebcc174..92df90fa3 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -11,8 +11,8 @@ "lint": "prettier --check src && eslint src" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "^7.7.1", - "@typescript-eslint/parser": "^7.7.1", + "@typescript-eslint/eslint-plugin": "^7.12.0", + "@typescript-eslint/parser": "^7.12.0", "@vitest/coverage-v8": "^1.5.2", "prettier": "^3.2.5", "typescript": "^5.4.5", diff --git a/packages/common/src/date.test.ts b/packages/common/src/date.test.ts index 8c5432431..a5130a71d 100644 --- a/packages/common/src/date.test.ts +++ b/packages/common/src/date.test.ts @@ -13,12 +13,15 @@ import { dateFormat, isBefore, intervalleAnnees, + caminoDateValidator, } from './date.js' import { test, expect } from 'vitest' test('toCaminoDate', () => { expect(() => toCaminoDate('123123')).toThrowError() expect(() => toCaminoDate(new Date('plop'))).toThrowError() + expect(() => toCaminoDate('2000-42-42')).toThrowError() + expect(() => caminoDateValidator.parse('2000-42-42')).toThrowError() }) test('dateFormat', () => { diff --git a/packages/common/src/date.ts b/packages/common/src/date.ts index 4523e3f3e..180aac8f9 100644 --- a/packages/common/src/date.ts +++ b/packages/common/src/date.ts @@ -15,19 +15,20 @@ export const daysBetween = (a: CaminoDate, b: CaminoDate) => { export const isBefore = (a: CaminoDate, b: CaminoDate): boolean => { return a < b } - export const caminoDateValidator = z .string() .regex(/^\d{4}-\d{2}-\d{2}$/) .brand<'Date'>() + .refine(date => !isNaN(new Date(date).getTime()), { message: 'date invalide' }) export type CaminoDate = z.infer<typeof caminoDateValidator> export type CaminoDateFormated = string & { __camino: 'DateFormated' } +// TODO 2024-06-12 utiliser le validateur zod pour faire tout ça directement, avec une union string/date et un transform export const toCaminoDate = (date: Date | string): CaminoDate => { if (typeof date === 'string') { const parsedDate = caminoDateValidator.safeParse(date) - if (parsedDate.success && !isNaN(new Date(date).getTime())) { + if (parsedDate.success) { return parsedDate.data } else { throw new Error(`Invalid date string: ${date}`) diff --git a/packages/common/src/demarche.test.ts b/packages/common/src/demarche.test.ts index 6b66bd026..e22e77104 100644 --- a/packages/common/src/demarche.test.ts +++ b/packages/common/src/demarche.test.ts @@ -43,7 +43,7 @@ test('getDemarcheContenu arm', () => { id: 'arm', nom: 'Caractéristiques ARM', elements: [ - { id: 'mecanise', nom: 'Prospection mécanisée', description: '', type: 'radio', value: true }, + { id: 'mecanise', nom: 'Prospection mécanisée', description: '', type: 'radio', value: true, optionnel: false }, { id: 'franchissements', nom: "Franchissements de cours d'eau", description: "Nombre de franchissements de cours d'eau", optionnel: true, type: 'integer', value: 12 }, ], }, diff --git a/packages/common/src/demarche.ts b/packages/common/src/demarche.ts index e5e5e936e..702fa30fa 100644 --- a/packages/common/src/demarche.ts +++ b/packages/common/src/demarche.ts @@ -8,7 +8,7 @@ import { entrepriseIdValidator, etapeEntrepriseDocumentValidator } from './entre import { EtapeTypeId, etapeTypeIdFondamentaleValidator, etapeTypeIdNonFondamentaleValidator } from './static/etapesTypes.js' import { etapeStatutIdValidator } from './static/etapesStatuts.js' import { sectionWithValueValidator } from './sections.js' -import { etapeDocumentValidator, etapeIdValidator, etapeSlugValidator } from './etape.js' +import { etapeAvisValidator, etapeBrouillonValidator, etapeDocumentValidator, etapeIdValidator, etapeSlugValidator } from './etape.js' import { sdomZoneIdValidator } from './static/sdom.js' import { km2Validator, numberFormat } from './number.js' import { DeviseId, deviseIdValidator, DEVISES_IDS, Devises } from './static/devise.js' @@ -32,7 +32,7 @@ export type DemarcheIdOrSlug = z.infer<typeof demarcheIdOrSlugValidator> const demarcheEtapeCommonValidator = z.object({ etape_statut_id: etapeStatutIdValidator, - is_brouillon: z.boolean(), + is_brouillon: etapeBrouillonValidator, date: caminoDateValidator, id: etapeIdValidator, ordre: z.number(), @@ -41,6 +41,7 @@ const demarcheEtapeCommonValidator = z.object({ sections_with_values: z.array(sectionWithValueValidator), entreprises_documents: z.array(etapeEntrepriseDocumentValidator), etape_documents: z.array(etapeDocumentValidator), + avis_documents: z.array(etapeAvisValidator), }) export type DemarcheEtapeCommon = z.infer<typeof demarcheEtapeCommonValidator> diff --git a/packages/common/src/etape-form.ts b/packages/common/src/etape-form.ts index 58a1968b1..3193c0b4c 100644 --- a/packages/common/src/etape-form.ts +++ b/packages/common/src/etape-form.ts @@ -1,32 +1,36 @@ import { z } from 'zod' -import { caminoDateValidator } from './date' -import { demarcheIdValidator, demarcheSlugValidator } from './demarche' -import { entrepriseDocumentIdValidator, entrepriseIdValidator } from './entreprise' +import { caminoDateValidator } from './date.js' +import { demarcheIdValidator, demarcheSlugValidator } from './demarche.js' +import { entrepriseDocumentIdValidator, entrepriseIdValidator } from './entreprise.js' import { documentComplementaireAslEtapeDocumentModificationValidator, documentComplementaireDaeEtapeDocumentModificationValidator, + etapeAvisModificationValidator, + etapeBrouillonValidator, etapeDocumentModificationValidator, etapeIdValidator, etapeSlugValidator, -} from './etape' -import { km2Validator } from './number' -import { featureCollectionForagesValidator, featureCollectionPointsValidator, featureMultiPolygonValidator } from './perimetre' -import { demarcheTypeIdValidator } from './static/demarchesTypes' -import { etapeStatutIdValidator } from './static/etapesStatuts' -import { etapeTypeIdValidator } from './static/etapesTypes' -import { geoSystemeIdValidator } from './static/geoSystemes' -import { substanceLegaleIdValidator } from './static/substancesLegales' -import { titreTypeIdValidator } from './static/titresTypes' -import { titreIdValidator, titreSlugValidator } from './validators/titres' -import { makeFlattenValidator, nullToDefault } from './zod-tools' +} from './etape.js' +import { km2Validator } from './number.js' +import { featureCollectionForagesValidator, featureCollectionPointsValidator, featureMultiPolygonValidator } from './perimetre.js' +import { demarcheTypeIdValidator } from './static/demarchesTypes.js' +import { etapeStatutIdValidator } from './static/etapesStatuts.js' +import { etapeTypeIdValidator } from './static/etapesTypes.js' +import { geoSystemeIdValidator } from './static/geoSystemes.js' +import { substanceLegaleIdValidator } from './static/substancesLegales.js' +import { titreTypeIdValidator } from './static/titresTypes.js' +import { titreIdValidator, titreSlugValidator } from './validators/titres.js' +import { makeFlattenValidator, nullToDefault } from './zod-tools.js' +import { numberElementValueValidator } from './sections.js' const contenuValidator = z .record(z.string(), z.record(z.string(), z.union([caminoDateValidator, z.string(), z.number(), z.boolean(), z.array(z.string())]).nullable())) .nullable() .transform(nullToDefault({})) -const dureeValidator = z.number().nullable() +export type EtapeContenu = z.infer<typeof contenuValidator> +const dureeValidator = z.number().nonnegative().nullable() -const defaultHeritageProps = { +export const defaultHeritageProps = { dateDebut: { actif: false, etape: null }, dateFin: { actif: false, etape: null }, duree: { actif: false, etape: null }, @@ -34,7 +38,7 @@ const defaultHeritageProps = { substances: { actif: false, etape: null }, titulaires: { actif: false, etape: null }, amodiataires: { actif: false, etape: null }, -} +} as const const heritagePropsValidator = z .object({ @@ -65,7 +69,7 @@ const heritagePropsValidator = z .nullable() .transform(nullToDefault(defaultHeritageProps)) -const heritageContenuValidator = z +export const heritageContenuValidator = z .record( z.string(), z.record(z.string(), z.object({ actif: z.boolean(), etape: z.object({ typeId: etapeTypeIdValidator, date: caminoDateValidator, contenu: contenuValidator }).nullable().optional() })) @@ -73,7 +77,9 @@ const heritageContenuValidator = z .nullable() .transform(nullToDefault({})) -export const graphqlEtapeValidator = z.object({ +export type HeritageContenu = z.infer<typeof heritageContenuValidator> + +const graphqlEtapeValidator = z.object({ id: etapeIdValidator, slug: etapeSlugValidator, titreDemarcheId: demarcheIdValidator, @@ -110,7 +116,7 @@ export const graphqlEtapeValidator = z.object({ notes: z.string().nullable(), heritageProps: heritagePropsValidator, heritageContenu: heritageContenuValidator, - isBrouillon: z.boolean(), + isBrouillon: etapeBrouillonValidator, }) const perimetreObjectValidator = z.object({ @@ -124,6 +130,11 @@ const perimetreObjectValidator = z.object({ surface: km2Validator.nullable(), }) +const flattenedContenuElementValidator = makeFlattenValidator(z.union([caminoDateValidator, z.string(), numberElementValueValidator, z.boolean(), z.array(z.string())]).nullable()) +export type FlattenedContenuElement = z.infer<typeof flattenedContenuElementValidator> +const flattenedContenuValidator = z.record(z.string(), z.record(z.string(), flattenedContenuElementValidator)) +export type FlattenedContenu = z.infer<typeof flattenedContenuValidator> + export const flattenEtapeValidator = graphqlEtapeValidator .omit({ heritageProps: true, @@ -153,10 +164,13 @@ export const flattenEtapeValidator = graphqlEtapeValidator substances: makeFlattenValidator(z.array(substanceLegaleIdValidator)), titulaires: makeFlattenValidator(z.array(entrepriseIdValidator)), amodiataires: makeFlattenValidator(z.array(entrepriseIdValidator)), - contenu: z.record(z.string(), z.record(z.string(), makeFlattenValidator(z.union([caminoDateValidator, z.string(), z.number(), z.boolean(), z.array(z.string())]).nullable()))), + contenu: flattenedContenuValidator, }) export type FlattenEtape = z.infer<typeof flattenEtapeValidator> + +export type GraphqlEtape = z.infer<typeof graphqlEtapeValidator> + const graphqlInputHeritagePropValidator = z.object({ actif: z.boolean(), }) @@ -171,7 +185,7 @@ const graphqlInputHeritagePropsValidator = z.object({ amodiataires: graphqlInputHeritagePropValidator, }) -export const graphqlEtapeCreationValidator = graphqlEtapeValidator +export const restEtapeCreationValidator = graphqlEtapeValidator .pick({ typeId: true, statutId: true, @@ -197,13 +211,14 @@ export const graphqlEtapeCreationValidator = graphqlEtapeValidator heritageContenu: z.record(z.string(), z.record(z.string(), z.object({ actif: z.boolean() }))), etapeDocuments: z.array(etapeDocumentModificationValidator), entrepriseDocumentIds: z.array(entrepriseDocumentIdValidator), + etapeAvis: z.array(etapeAvisModificationValidator), }) -export type GraphqlEtapeCreation = z.infer<typeof graphqlEtapeCreationValidator> +export type RestEtapeCreation = z.infer<typeof restEtapeCreationValidator> -export const graphqlEtapeModificationValidator = graphqlEtapeCreationValidator.extend({ +export const restEtapeModificationValidator = restEtapeCreationValidator.extend({ id: etapeIdValidator, daeDocument: documentComplementaireDaeEtapeDocumentModificationValidator.nullable(), aslDocument: documentComplementaireAslEtapeDocumentModificationValidator.nullable(), }) -export type GraphqlEtapeModification = z.infer<typeof graphqlEtapeModificationValidator> +export type RestEtapeModification = z.infer<typeof restEtapeModificationValidator> diff --git a/packages/common/src/etape.ts b/packages/common/src/etape.ts index 347575c00..3e11ff5dc 100644 --- a/packages/common/src/etape.ts +++ b/packages/common/src/etape.ts @@ -1,20 +1,21 @@ import { CaminoDate, caminoDateValidator } from './date.js' -import { EntrepriseId } from './entreprise.js' import { EtapeHeritageProps, MappingHeritagePropsNameEtapePropsName } from './heritage.js' -import { AdministrationId } from './static/administrations.js' import { DOCUMENTS_TYPES_IDS, documentTypeIdValidator } from './static/documentsTypes.js' import { EtapeStatutId, etapeStatutIdValidator } from './static/etapesStatuts.js' import { EtapeTypeId, etapeTypeIdValidator } from './static/etapesTypes.js' -import { SubstanceLegaleId } from './static/substancesLegales.js' import { z } from 'zod' -import { FeatureCollectionForages, FeatureCollectionPoints, FeatureMultiPolygon } from './perimetre.js' -import { KM2 } from './number.js' -import { GeoSystemeId } from './static/geoSystemes.js' import { tempDocumentNameValidator } from './document.js' -import { ElementWithValue } from './sections.js' import { DemarcheTypeId } from './static/demarchesTypes.js' import { TitreTypeId } from './static/titresTypes.js' import { User, isEntrepriseOrBureauDEtude } from './roles.js' +import { avisStatutIdValidator, avisTypeIdValidator, avisVisibilityIdValidator } from './static/avisTypes.js' +import { GraphqlEtape } from './etape-form.js' + +export const etapeBrouillonValidator = z.boolean().brand('EtapeBrouillon') +export type EtapeBrouillon = z.infer<typeof etapeBrouillonValidator> + +export const ETAPE_IS_BROUILLON = true as EtapeBrouillon +export const ETAPE_IS_NOT_BROUILLON = false as EtapeBrouillon export const etapeIdValidator = z.string().brand<'EtapeId'>() export type EtapeId = z.infer<typeof etapeIdValidator> @@ -27,41 +28,12 @@ export type EtapeIdOrSlug = z.infer<typeof etapeIdOrSlugValidator> type HeritageProp<T> = { actif: boolean; etape?: T | null } -// TODO 2023-06-14 Utiliser seulement par l’ui, à bouger dedans -type Etape = { - id: EtapeId | null - contenu: Record<string, Record<string, ElementWithValue['value']>> - date: CaminoDate | null - typeId: EtapeTypeId | null - statutId: EtapeStatutId | null - isBrouillon: boolean - substances: SubstanceLegaleId[] - titulaireIds: EntrepriseId[] - amodiataireIds: EntrepriseId[] - administrations?: AdministrationId[] - communes?: string[] - - geojson4326Perimetre: FeatureMultiPolygon | null - geojson4326Points: FeatureCollectionPoints | null - geojsonOriginePerimetre: FeatureMultiPolygon | null - geojsonOriginePoints: FeatureCollectionPoints | null - geojsonOrigineGeoSystemeId: GeoSystemeId | null - geojson4326Forages: FeatureCollectionForages | null - geojsonOrigineForages: FeatureCollectionForages | null - surface: KM2 | null - - notes: null | string - duree: number | null - dateDebut: CaminoDate | null - dateFin: CaminoDate | null -} - type EtapePropsFromHeritagePropName<key extends EtapeHeritageProps> = MappingHeritagePropsNameEtapePropsName[key][number] -type EtapeWithHeritage = InternalEtapeWithHeritage<EtapeHeritageProps, Omit<Etape, 'typeId' | 'date' | 'statutId'> & { typeId: EtapeTypeId; date: CaminoDate; statutId: EtapeStatutId }> +type EtapeWithHeritage = InternalEtapeWithHeritage<EtapeHeritageProps, Omit<GraphqlEtape, 'typeId' | 'date' | 'statutId'> & { typeId: EtapeTypeId; date: CaminoDate; statutId: EtapeStatutId }> type HeritageContenu = Record<string, Record<string, HeritageProp<Pick<EtapeWithHeritage, 'contenu' | 'typeId' | 'date'>>>> -type InternalEtapeWithHeritage<HeritagePropsKeys extends EtapeHeritageProps, T extends Pick<Etape, 'date' | EtapePropsFromHeritagePropName<HeritagePropsKeys>> & { typeId: EtapeTypeId }> = T & { +type InternalEtapeWithHeritage<HeritagePropsKeys extends EtapeHeritageProps, T extends Pick<GraphqlEtape, 'date' | EtapePropsFromHeritagePropName<HeritagePropsKeys>> & { typeId: EtapeTypeId }> = T & { heritageProps: { [key in HeritagePropsKeys]: HeritageProp<Pick<T, 'typeId' | 'date' | EtapePropsFromHeritagePropName<key>>> } @@ -114,13 +86,39 @@ export const getEtapeDocumentsByEtapeIdValidator = z.object({ export type GetEtapeDocumentsByEtapeId = z.infer<typeof getEtapeDocumentsByEtapeIdValidator> +export const etapeAvisIdValidator = z.string().brand('EtapeAvis') +export type EtapeAvisId = z.infer<typeof etapeAvisIdValidator> +export const etapeAvisValidator = z.object({ + id: etapeAvisIdValidator, + avis_type_id: avisTypeIdValidator, + date: caminoDateValidator, + avis_statut_id: avisStatutIdValidator, + has_file: z.boolean(), + description: z.string(), + avis_visibility_id: avisVisibilityIdValidator, +}) +export type EtapeAvis = z.infer<typeof etapeAvisValidator> + +const etapeAvisWithFileModificationValidator = etapeAvisValidator.extend({ temp_document_name: tempDocumentNameValidator.optional() }) +export type EtapeAvisWithFileModification = z.infer<typeof etapeAvisWithFileModificationValidator> + +export const tempEtapeAvisValidator = etapeAvisWithFileModificationValidator.omit({ id: true, has_file: true }) +export type TempEtapeAvis = z.infer<typeof tempEtapeAvisValidator> + +export const getEtapeAvisByEtapeIdValidator = z.array(etapeAvisValidator) + +export type GetEtapeAvisByEtapeId = z.infer<typeof getEtapeAvisByEtapeIdValidator> + +export const etapeAvisModificationValidator = z.union([etapeAvisWithFileModificationValidator, tempEtapeAvisValidator]) +export type EtapeAvisModification = z.infer<typeof etapeAvisModificationValidator> + export const needAslAndDae = ( tde: { etapeTypeId: EtapeTypeId demarcheTypeId: DemarcheTypeId titreTypeId: TitreTypeId }, - isBrouillon: boolean, + isBrouillon: EtapeBrouillon, user: User ): boolean => { return tde.etapeTypeId === 'mfr' && tde.demarcheTypeId === 'oct' && tde.titreTypeId === 'axm' && isEntrepriseOrBureauDEtude(user) && isBrouillon diff --git a/packages/common/src/number.ts b/packages/common/src/number.ts index 177988753..d10f20bb2 100644 --- a/packages/common/src/number.ts +++ b/packages/common/src/number.ts @@ -33,11 +33,11 @@ export const toDegresMinutes = (value: number): { degres: number; minutes: numbe } } -export const km2Validator = z.number().brand('CAMINO_KM2') +export const km2Validator = z.number().nonnegative().brand('CAMINO_KM2') export const m2Validator = z .number() .transform(value => parseInt(`${value}`)) .brand('CAMINO_M2') - +export const ZERO_KM2 = km2Validator.parse(0) export type KM2 = z.infer<typeof km2Validator> export type M2 = z.infer<typeof m2Validator> diff --git a/packages/common/src/perimetre.ts b/packages/common/src/perimetre.ts index 26ee314ab..226ac0e24 100644 --- a/packages/common/src/perimetre.ts +++ b/packages/common/src/perimetre.ts @@ -134,7 +134,7 @@ export const geojsonInformationsValidator = z.object({ export type GeojsonInformations = z.infer<typeof geojsonInformationsValidator> -export const perimetreInformationsValidator = geojsonInformationsValidator.pick({ superposition_alertes: true, sdomZoneIds: true }) +export const perimetreInformationsValidator = geojsonInformationsValidator.pick({ superposition_alertes: true, sdomZoneIds: true }).extend({ communes: z.array(communeIdValidator) }) export type PerimetreInformations = z.infer<typeof perimetreInformationsValidator> export const geojsonImportBodyValidator = z.object({ diff --git a/packages/common/src/permissions/documents.test.ts b/packages/common/src/permissions/documents.test.ts deleted file mode 100644 index e2b98a3f8..000000000 --- a/packages/common/src/permissions/documents.test.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { describe, test, expect } from 'vitest' -import { isDocumentsComplete } from './documents.js' -describe('teste isDocumentsComplete', () => { - test('tous les documents sont optionnels', () => { - const errors = isDocumentsComplete([], [{ id: 'arr', optionnel: true }]) - expect(errors.valid).toBe(true) - }) - - test('il manque un document obligatoire', () => { - const errors = isDocumentsComplete([], [{ id: 'arr', optionnel: false }]) - expect(errors.valid).toBe(false) - expect(errors).toMatchInlineSnapshot(` - { - "errors": [ - "le document "arr" est obligatoire", - ], - "valid": false, - } - `) - }) - - test('il manque le fichier à un document obligatoire', () => { - const errors = isDocumentsComplete( - [ - { - etape_document_type_id: 'aac', - }, - ], - [{ id: 'arr', optionnel: false }] - ) - expect(errors.valid).toBe(false) - expect(errors).toMatchInlineSnapshot(` - { - "errors": [ - "le document "arr" est obligatoire", - ], - "valid": false, - } - `) - }) - - test('le document obligatoire est complet', () => { - const errors = isDocumentsComplete( - [ - { - etape_document_type_id: 'arr', - }, - ], - [{ id: 'arr', optionnel: false }] - ) - expect(errors.valid).toBe(true) - }) -}) diff --git a/packages/common/src/permissions/documents.ts b/packages/common/src/permissions/documents.ts deleted file mode 100644 index a815cc757..000000000 --- a/packages/common/src/permissions/documents.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { DocumentType } from 'camino-common/src/static/documentsTypes.js' -import { EtapeDocument } from '../etape' - -export const isDocumentsComplete = ( - documents: Pick<EtapeDocument, 'etape_document_type_id'>[], - documentsTypes?: Pick<DocumentType, 'id' | 'optionnel'>[] -): { valid: true } | { valid: false; errors: string[] } => { - const errors = [] as string[] - - if (documentsTypes) { - documentsTypes - .filter(dt => !dt.optionnel) - .forEach(dt => { - if (!documents?.find(d => d.etape_document_type_id === dt.id)) { - errors.push(`le document "${dt.id}" est obligatoire`) - } - }) - } else if (documents?.length) { - errors.push(`impossible de lier un document`) - } - - if (errors.length === 0) { - return { valid: true } - } - - return { valid: false, errors } -} diff --git a/packages/common/src/permissions/etape-form.test.ts b/packages/common/src/permissions/etape-form.test.ts index 24fb6624c..6ffad2d99 100644 --- a/packages/common/src/permissions/etape-form.test.ts +++ b/packages/common/src/permissions/etape-form.test.ts @@ -2,53 +2,141 @@ import { expect, test } from 'vitest' import { entrepriseDocumentsStepIsComplete, entrepriseDocumentsStepIsVisible, + etapeAvisStepIsVisible, etapeDocumentsStepIsComplete, etapeDocumentsStepIsVisible, fondamentaleStepIsComplete, fondamentaleStepIsVisible, + getAvisTypes, getDocumentsTypes, perimetreStepIsComplete, perimetreStepIsVisible, sectionsStepIsComplete, sectionsStepIsVisible, } from './etape-form' -import { documentTypeIdComplementaireObligatoireASL, documentTypeIdComplementaireObligatoireDAE, etapeDocumentIdValidator } from '../etape' +import { ETAPE_IS_BROUILLON, ETAPE_IS_NOT_BROUILLON, documentTypeIdComplementaireObligatoireASL, documentTypeIdComplementaireObligatoireDAE, etapeDocumentIdValidator } from '../etape' import { toCaminoDate } from '../date' import { testBlankUser } from '../tests-utils' -import { entrepriseDocumentIdValidator, entrepriseIdValidator } from '../entreprise' +import { entrepriseIdValidator } from '../entreprise' +import { communeIdValidator } from '../static/communes' test('fondamentaleStepIsVisible', () => { expect(fondamentaleStepIsVisible('mfr')).toBe(true) - expect(fondamentaleStepIsVisible('aac')).toBe(false) + expect(fondamentaleStepIsVisible('acg')).toBe(false) }) test('fondamentaleStepIsComplete', () => { - expect(fondamentaleStepIsComplete({ duree: { value: 0, heritee: false, etapeHeritee: null }, substances: { value: [], heritee: false, etapeHeritee: null }, typeId: 'aac' }, 'amo', 'prr')).toBe(true) - - expect(fondamentaleStepIsComplete({ duree: { value: 0, heritee: false, etapeHeritee: null }, substances: { value: [], heritee: false, etapeHeritee: null }, typeId: 'dpu' }, 'amo', 'prr')).toBe(true) - expect(fondamentaleStepIsComplete({ duree: { value: 0, heritee: false, etapeHeritee: null }, substances: { value: [], heritee: false, etapeHeritee: null }, typeId: 'mfr' }, 'amo', 'prr')).toBe( - false - ) + expect( + fondamentaleStepIsComplete( + { + duree: { value: 0, heritee: false, etapeHeritee: null }, + substances: { value: [], heritee: false, etapeHeritee: null }, + typeId: 'acg', + titulaires: { value: [], heritee: false, etapeHeritee: null }, + }, + 'amo', + 'prr' + ).valid + ).toBe(true) expect( - fondamentaleStepIsComplete({ duree: { value: 0, heritee: false, etapeHeritee: null }, substances: { value: ['auru'], heritee: false, etapeHeritee: null }, typeId: 'mfr' }, 'oct', 'prr') + fondamentaleStepIsComplete( + { + duree: { value: 0, heritee: false, etapeHeritee: null }, + substances: { value: [], heritee: false, etapeHeritee: null }, + typeId: 'dpu', + titulaires: { value: [], heritee: false, etapeHeritee: null }, + }, + 'amo', + 'prr' + ).valid ).toBe(true) expect( - fondamentaleStepIsComplete({ duree: { value: 2, heritee: false, etapeHeritee: null }, substances: { value: ['auru'], heritee: false, etapeHeritee: null }, typeId: 'mfr' }, 'oct', 'arm') + fondamentaleStepIsComplete( + { + duree: { value: 0, heritee: false, etapeHeritee: null }, + substances: { value: [], heritee: false, etapeHeritee: null }, + typeId: 'mfr', + titulaires: { value: [], heritee: false, etapeHeritee: null }, + }, + 'amo', + 'prr' + ).valid + ).toBe(false) + + expect( + fondamentaleStepIsComplete( + { + duree: { value: 0, heritee: false, etapeHeritee: null }, + substances: { value: ['auru'], heritee: false, etapeHeritee: null }, + typeId: 'mfr', + titulaires: { value: [], heritee: false, etapeHeritee: null }, + }, + 'oct', + 'prr' + ).valid ).toBe(true) expect( - fondamentaleStepIsComplete({ duree: { value: 0, heritee: false, etapeHeritee: null }, substances: { value: ['auru'], heritee: false, etapeHeritee: null }, typeId: 'mfr' }, 'oct', 'arm') + fondamentaleStepIsComplete( + { + duree: { value: 2, heritee: false, etapeHeritee: null }, + substances: { value: ['auru'], heritee: false, etapeHeritee: null }, + typeId: 'mfr', + titulaires: { value: [], heritee: false, etapeHeritee: null }, + }, + 'oct', + 'arm' + ).valid + ).toBe(false) + expect( + fondamentaleStepIsComplete( + { + duree: { value: 0, heritee: false, etapeHeritee: null }, + substances: { value: ['auru'], heritee: false, etapeHeritee: null }, + typeId: 'mfr', + titulaires: { value: [], heritee: false, etapeHeritee: null }, + }, + 'oct', + 'arm' + ).valid + ).toBe(false) + expect( + fondamentaleStepIsComplete( + { + duree: { value: 2, heritee: false, etapeHeritee: null }, + substances: { value: [], heritee: false, etapeHeritee: null }, + typeId: 'mfr', + titulaires: { value: [], heritee: false, etapeHeritee: null }, + }, + 'oct', + 'arm' + ).valid ).toBe(false) - expect(fondamentaleStepIsComplete({ duree: { value: 2, heritee: false, etapeHeritee: null }, substances: { value: [], heritee: false, etapeHeritee: null }, typeId: 'mfr' }, 'oct', 'arm')).toBe( - false - ) expect( - fondamentaleStepIsComplete({ duree: { value: 0, heritee: false, etapeHeritee: null }, substances: { value: ['auru'], heritee: false, etapeHeritee: null }, typeId: 'mfr' }, 'mut', 'arm') + fondamentaleStepIsComplete( + { + duree: { value: 0, heritee: false, etapeHeritee: null }, + substances: { value: ['auru'], heritee: false, etapeHeritee: null }, + typeId: 'mfr', + titulaires: { value: [], heritee: false, etapeHeritee: null }, + }, + 'mut', + 'arm' + ).valid ).toBe(true) - expect(fondamentaleStepIsComplete({ duree: { value: 0, heritee: false, etapeHeritee: null }, substances: { value: [], heritee: false, etapeHeritee: null }, typeId: 'mfr' }, 'mut', 'arm')).toBe( - false - ) + expect( + fondamentaleStepIsComplete( + { + duree: { value: 0, heritee: false, etapeHeritee: null }, + substances: { value: [], heritee: false, etapeHeritee: null }, + typeId: 'mfr', + titulaires: { value: [], heritee: false, etapeHeritee: null }, + }, + 'mut', + 'arm' + ).valid + ).toBe(false) }) test('sectionsStepIsVisible', () => { @@ -57,13 +145,13 @@ test('sectionsStepIsVisible', () => { }) test('sectionsStepIsComplete', () => { - expect(sectionsStepIsComplete({ typeId: 'mfr', contenu: {} }, 'oct', 'arm')).toBe(false) - expect(sectionsStepIsComplete({ typeId: 'mfr', contenu: { arm: { mecanise: { value: true, heritee: false, etapeHeritee: null } } } }, 'oct', 'arm')).toBe(true) + expect(sectionsStepIsComplete({ typeId: 'mfr', contenu: {} }, 'oct', 'arm').valid).toBe(false) + expect(sectionsStepIsComplete({ typeId: 'mfr', contenu: { arm: { mecanise: { value: true, heritee: false, etapeHeritee: null } } } }, 'oct', 'arm').valid).toBe(true) }) test('perimetreStepIsVisible', () => { expect(perimetreStepIsVisible({ typeId: 'mfr' })).toBe(true) - expect(perimetreStepIsVisible({ typeId: 'aac' })).toBe(false) + expect(perimetreStepIsVisible({ typeId: 'acg' })).toBe(false) }) test('perimetreStepIsComplete', () => { @@ -84,7 +172,7 @@ test('perimetreStepIsComplete', () => { heritee: false, etapeHeritee: null, }, - }) + }).valid ).toBe(false) expect( perimetreStepIsComplete({ @@ -103,11 +191,11 @@ test('perimetreStepIsComplete', () => { heritee: false, etapeHeritee: null, }, - }) + }).valid ).toBe(true) expect( perimetreStepIsComplete({ - typeId: 'aac', + typeId: 'acg', perimetre: { value: { geojson4326Perimetre: null, @@ -122,7 +210,7 @@ test('perimetreStepIsComplete', () => { heritee: false, etapeHeritee: null, }, - }) + }).valid ).toBe(true) expect( perimetreStepIsComplete({ @@ -141,7 +229,7 @@ test('perimetreStepIsComplete', () => { heritee: false, etapeHeritee: null, }, - }) + }).valid ).toBe(true) }) @@ -217,32 +305,34 @@ const axmDocumentsComplete = [ const entreprise1 = { id: entrepriseIdValidator.parse('id1'), nom: 'entrepriseNom' } test('etapeDocumentsStepIsComplete', () => { - expect(etapeDocumentsStepIsComplete({ typeId: 'asl', contenu: {}, isBrouillon: false }, 'oct', 'axm', [], [], null, null, null)).toBe(false) + expect(etapeDocumentsStepIsComplete({ typeId: 'asl', contenu: {}, isBrouillon: ETAPE_IS_NOT_BROUILLON }, 'oct', 'axm', [], [], null, null, null).valid).toBe(false) expect( etapeDocumentsStepIsComplete( - { typeId: 'asl', contenu: {}, isBrouillon: false }, + { typeId: 'asl', contenu: {}, isBrouillon: ETAPE_IS_NOT_BROUILLON }, 'oct', 'axm', - [{ id: etapeDocumentIdValidator.parse('idDoc1'), description: null, entreprises_lecture: true, public_lecture: true, etape_document_type_id: documentTypeIdComplementaireObligatoireASL }], + [{ etape_document_type_id: documentTypeIdComplementaireObligatoireASL }], [], null, null, null - ) + ).valid ).toBe(true) - expect(etapeDocumentsStepIsComplete({ typeId: 'mfr', contenu: {}, isBrouillon: true }, 'oct', 'axm', axmDocumentsComplete, [], null, null, { ...testBlankUser, role: 'super' })).toBe(true) expect( - etapeDocumentsStepIsComplete({ typeId: 'mfr', contenu: {}, isBrouillon: true }, 'oct', 'axm', axmDocumentsComplete, [], null, null, { + etapeDocumentsStepIsComplete({ typeId: 'mfr', contenu: {}, isBrouillon: ETAPE_IS_BROUILLON }, 'oct', 'axm', axmDocumentsComplete, [], null, null, { ...testBlankUser, role: 'super' }).valid + ).toBe(true) + expect( + etapeDocumentsStepIsComplete({ typeId: 'mfr', contenu: {}, isBrouillon: ETAPE_IS_BROUILLON }, 'oct', 'axm', axmDocumentsComplete, [], null, null, { ...testBlankUser, role: 'entreprise', entreprises: [entreprise1], - }) + }).valid ).toBe(false) expect( etapeDocumentsStepIsComplete( - { typeId: 'mfr', contenu: {}, isBrouillon: true }, + { typeId: 'mfr', contenu: {}, isBrouillon: ETAPE_IS_BROUILLON }, 'oct', 'axm', axmDocumentsComplete, @@ -255,7 +345,6 @@ test('etapeDocumentsStepIsComplete', () => { etape_statut_id: 'exe', public_lecture: true, etape_document_type_id: documentTypeIdComplementaireObligatoireDAE, - id: etapeDocumentIdValidator.parse('daeId'), }, { date: toCaminoDate('2023-02-02'), @@ -264,10 +353,9 @@ test('etapeDocumentsStepIsComplete', () => { etape_statut_id: 'exe', public_lecture: true, etape_document_type_id: documentTypeIdComplementaireObligatoireASL, - id: etapeDocumentIdValidator.parse('aslId'), }, { ...testBlankUser, role: 'entreprise', entreprises: [entreprise1] } - ) + ).valid ).toBe(true) }) @@ -283,7 +371,7 @@ test('entrepriseDocumentsStepIsComplete', () => { 'oct', 'axm', [] - ) + ).valid ).toBe(true) expect( entrepriseDocumentsStepIsComplete( @@ -291,8 +379,8 @@ test('entrepriseDocumentsStepIsComplete', () => { 'oct', 'axm', [] - ) - ).toBe(true) + ).valid + ).toBe(false) expect( entrepriseDocumentsStepIsComplete( @@ -300,7 +388,7 @@ test('entrepriseDocumentsStepIsComplete', () => { 'oct', 'axm', [] - ) + ).valid ).toBe(false) expect( entrepriseDocumentsStepIsComplete( @@ -308,7 +396,7 @@ test('entrepriseDocumentsStepIsComplete', () => { 'oct', 'axm', [] - ) + ).valid ).toBe(false) expect( @@ -323,38 +411,32 @@ test('entrepriseDocumentsStepIsComplete', () => { 'arm', [ { - id: entrepriseDocumentIdValidator.parse('idatf'), documentTypeId: 'atf', entrepriseId: entreprise1.id, }, { - id: entrepriseDocumentIdValidator.parse('idcur'), documentTypeId: 'cur', entrepriseId: entreprise1.id, }, { - id: entrepriseDocumentIdValidator.parse('idjid'), documentTypeId: 'jid', entrepriseId: entreprise1.id, }, { - id: entrepriseDocumentIdValidator.parse('idjct'), documentTypeId: 'jct', entrepriseId: entreprise1.id, }, { - id: entrepriseDocumentIdValidator.parse('idkbi'), documentTypeId: 'kbi', entrepriseId: entreprise1.id, }, { - id: entrepriseDocumentIdValidator.parse('idjcf'), documentTypeId: 'jcf', entrepriseId: entreprise1.id, }, ] - ) + ).valid ).toBe(true) }) @@ -863,3 +945,319 @@ test('getDocumentsTypes', () => { ] `) }) + +test('getAvisType', () => { + expect(getAvisTypes('mfr', 'arm', [])).toMatchInlineSnapshot(`[]`) + expect(getAvisTypes('asc', 'arm', [])).toMatchInlineSnapshot(` + [ + { + "id": "lettreDeSaisineDesServices", + "nom": "Lettre de saisine des services", + "optionnel": false, + }, + { + "id": "avisDirectionRegionaleDesAffairesCulturelles", + "nom": "Avis de la Direction Régionale Des Affaires Culturelles (DRAC)", + "optionnel": true, + }, + { + "id": "avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques", + "nom": "Avis du Conseil Départemental de l'Environnement et des Risques Sanitaires et Technologiques (CODERST)", + "optionnel": true, + }, + { + "id": "avisDirectionsRégionalesEconomieEmploiTravailSolidarités", + "nom": "Avis de la Direction régionale de l’économie, de l’emploi, du travail et des solidarités", + "optionnel": true, + }, + { + "id": "avisDirectionRegionaleFinancesPubliques", + "nom": "Avis de la Direction Regionale Des Finances Publiques", + "optionnel": true, + }, + { + "id": "avisGendarmerieNationale", + "nom": "Avis de la Gendarmerie Nationale", + "optionnel": true, + }, + { + "id": "avisIFREMER", + "nom": "Avis de l'IFREMER", + "optionnel": true, + }, + { + "id": "avisInstitutNationalOrigineQualite", + "nom": "Avis de l'Institut National de l'origine et de la Qualité", + "optionnel": true, + }, + { + "id": "avisServiceAdministratifLocal", + "nom": "Avis d'un Service Administratif Local", + "optionnel": true, + }, + { + "id": "avisAutoriteMilitaire", + "nom": "Avis de l'Autorité militaire", + "optionnel": true, + }, + { + "id": "avisParcNational", + "nom": "Avis du Parc National", + "optionnel": true, + }, + { + "id": "avisDirectionDepartementaleTerritoiresMer", + "nom": "Avis de la Direction Départementale des Territoires et de la Mer (DDTM)", + "optionnel": true, + }, + { + "id": "avisAgenceRegionaleSante", + "nom": "Avis de l'Agence Régionale de Santé (ARS)", + "optionnel": true, + }, + { + "id": "avisCaisseGeneraleSecuriteSociale", + "nom": "Avis de la Caisse Générale de Sécurité Sociale", + "optionnel": true, + }, + { + "id": "autreAvis", + "nom": "Autre avis", + "optionnel": true, + }, + { + "id": "avisOfficeNationalDesForets", + "nom": "Avis de l'Office National des Forêts", + "optionnel": false, + }, + { + "id": "expertiseOfficeNationalDesForets", + "nom": "Expertise de l'Office National des Forêts", + "optionnel": true, + }, + { + "id": "avisParcNaturelMarin", + "nom": "Avis du Parc Naturel Marin", + "optionnel": true, + }, + ] + `) + expect(getAvisTypes('asc', 'arm', [communeIdValidator.parse('97302')])).toMatchInlineSnapshot(` + [ + { + "id": "lettreDeSaisineDesServices", + "nom": "Lettre de saisine des services", + "optionnel": false, + }, + { + "id": "avisDirectionRegionaleDesAffairesCulturelles", + "nom": "Avis de la Direction Régionale Des Affaires Culturelles (DRAC)", + "optionnel": true, + }, + { + "id": "avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques", + "nom": "Avis du Conseil Départemental de l'Environnement et des Risques Sanitaires et Technologiques (CODERST)", + "optionnel": true, + }, + { + "id": "avisDirectionsRégionalesEconomieEmploiTravailSolidarités", + "nom": "Avis de la Direction régionale de l’économie, de l’emploi, du travail et des solidarités", + "optionnel": true, + }, + { + "id": "avisDirectionRegionaleFinancesPubliques", + "nom": "Avis de la Direction Regionale Des Finances Publiques", + "optionnel": true, + }, + { + "id": "avisGendarmerieNationale", + "nom": "Avis de la Gendarmerie Nationale", + "optionnel": true, + }, + { + "id": "avisIFREMER", + "nom": "Avis de l'IFREMER", + "optionnel": true, + }, + { + "id": "avisInstitutNationalOrigineQualite", + "nom": "Avis de l'Institut National de l'origine et de la Qualité", + "optionnel": true, + }, + { + "id": "avisServiceAdministratifLocal", + "nom": "Avis d'un Service Administratif Local", + "optionnel": true, + }, + { + "id": "avisAutoriteMilitaire", + "nom": "Avis de l'Autorité militaire", + "optionnel": true, + }, + { + "id": "avisParcNational", + "nom": "Avis du Parc National", + "optionnel": true, + }, + { + "id": "avisDirectionDepartementaleTerritoiresMer", + "nom": "Avis de la Direction Départementale des Territoires et de la Mer (DDTM)", + "optionnel": true, + }, + { + "id": "avisAgenceRegionaleSante", + "nom": "Avis de l'Agence Régionale de Santé (ARS)", + "optionnel": true, + }, + { + "id": "avisCaisseGeneraleSecuriteSociale", + "nom": "Avis de la Caisse Générale de Sécurité Sociale", + "optionnel": true, + }, + { + "id": "autreAvis", + "nom": "Autre avis", + "optionnel": true, + }, + { + "id": "avisOfficeNationalDesForets", + "nom": "Avis de l'Office National des Forêts", + "optionnel": false, + }, + { + "id": "expertiseOfficeNationalDesForets", + "nom": "Expertise de l'Office National des Forêts", + "optionnel": true, + }, + { + "id": "avisParcNaturelMarin", + "nom": "Avis du Parc Naturel Marin", + "optionnel": true, + }, + { + "id": "avisDirectionAlimentationAgricultureForet", + "nom": "Avis de la Direction de l'Alimentation de l'Agriculture et de la Forêt (DRAF)", + "optionnel": true, + }, + { + "id": "avisEtatMajorOrpaillagePecheIllicite", + "nom": "Avis de l'État-major Orpaillage et Pêche Illicite (EMOPI)", + "optionnel": true, + }, + ] + `) + expect(getAvisTypes('asc', 'axm', [communeIdValidator.parse('97302')])).toMatchInlineSnapshot(` + [ + { + "id": "lettreDeSaisineDesServices", + "nom": "Lettre de saisine des services", + "optionnel": false, + }, + { + "id": "avisDirectionRegionaleDesAffairesCulturelles", + "nom": "Avis de la Direction Régionale Des Affaires Culturelles (DRAC)", + "optionnel": true, + }, + { + "id": "avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques", + "nom": "Avis du Conseil Départemental de l'Environnement et des Risques Sanitaires et Technologiques (CODERST)", + "optionnel": true, + }, + { + "id": "avisDirectionsRégionalesEconomieEmploiTravailSolidarités", + "nom": "Avis de la Direction régionale de l’économie, de l’emploi, du travail et des solidarités", + "optionnel": true, + }, + { + "id": "avisDirectionRegionaleFinancesPubliques", + "nom": "Avis de la Direction Regionale Des Finances Publiques", + "optionnel": true, + }, + { + "id": "avisGendarmerieNationale", + "nom": "Avis de la Gendarmerie Nationale", + "optionnel": true, + }, + { + "id": "avisIFREMER", + "nom": "Avis de l'IFREMER", + "optionnel": true, + }, + { + "id": "avisInstitutNationalOrigineQualite", + "nom": "Avis de l'Institut National de l'origine et de la Qualité", + "optionnel": true, + }, + { + "id": "avisServiceAdministratifLocal", + "nom": "Avis d'un Service Administratif Local", + "optionnel": true, + }, + { + "id": "avisAutoriteMilitaire", + "nom": "Avis de l'Autorité militaire", + "optionnel": true, + }, + { + "id": "avisParcNational", + "nom": "Avis du Parc National", + "optionnel": true, + }, + { + "id": "avisDirectionDepartementaleTerritoiresMer", + "nom": "Avis de la Direction Départementale des Territoires et de la Mer (DDTM)", + "optionnel": true, + }, + { + "id": "avisAgenceRegionaleSante", + "nom": "Avis de l'Agence Régionale de Santé (ARS)", + "optionnel": true, + }, + { + "id": "avisCaisseGeneraleSecuriteSociale", + "nom": "Avis de la Caisse Générale de Sécurité Sociale", + "optionnel": true, + }, + { + "id": "autreAvis", + "nom": "Autre avis", + "optionnel": true, + }, + { + "id": "avisOfficeNationalDesForets", + "nom": "Avis de l'Office National des Forêts", + "optionnel": false, + }, + { + "id": "expertiseOfficeNationalDesForets", + "nom": "Expertise de l'Office National des Forêts", + "optionnel": true, + }, + { + "id": "avisParcNaturelMarin", + "nom": "Avis du Parc Naturel Marin", + "optionnel": true, + }, + { + "id": "avisDirectionAlimentationAgricultureForet", + "nom": "Avis de la Direction de l'Alimentation de l'Agriculture et de la Forêt (DRAF)", + "optionnel": true, + }, + { + "id": "avisEtatMajorOrpaillagePecheIllicite", + "nom": "Avis de l'État-major Orpaillage et Pêche Illicite (EMOPI)", + "optionnel": true, + }, + { + "id": "confirmationAccordProprietaireDuSol", + "nom": "Confirmation de l'accord du propriétaire du sol", + "optionnel": true, + }, + ] + `) +}) + +test('etapeAvisStepIsVisible', () => { + expect(etapeAvisStepIsVisible({ typeId: 'mfr' }, 'arm', [])).toBe(false) + expect(etapeAvisStepIsVisible({ typeId: 'asc' }, 'arm', [])).toBe(true) +}) diff --git a/packages/common/src/permissions/etape-form.ts b/packages/common/src/permissions/etape-form.ts index 7f3e394a3..e46aee14e 100644 --- a/packages/common/src/permissions/etape-form.ts +++ b/packages/common/src/permissions/etape-form.ts @@ -1,59 +1,138 @@ import { EntrepriseDocumentId, EntrepriseId } from '../entreprise.js' import { FlattenEtape } from '../etape-form.js' -import { DocumentComplementaireAslEtapeDocumentModification, DocumentComplementaireDaeEtapeDocumentModification, EtapeDocument, TempEtapeDocument, needAslAndDae } from '../etape.js' -import { User } from '../roles.js' +import { + DocumentComplementaireAslEtapeDocumentModification, + DocumentComplementaireDaeEtapeDocumentModification, + EtapeAvis, + EtapeDocument, + TempEtapeAvis, + TempEtapeDocument, + needAslAndDae, +} from '../etape.js' +import { User, isAdministrationAdmin, isAdministrationEditeur, isSuper } from '../roles.js' +import { AvisTypeId, AvisTypes } from '../static/avisTypes.js' +import { CommuneId } from '../static/communes' import { DemarcheTypeId } from '../static/demarchesTypes.js' -import { EntrepriseDocumentTypeId } from '../static/documentsTypes.js' +import { DEPARTEMENT_IDS, toDepartementId } from '../static/departement.js' +import { DocumentsTypes, EntrepriseDocumentTypeId } from '../static/documentsTypes.js' import { ETAPES_TYPES, EtapeTypeId, EtapesTypes } from '../static/etapesTypes.js' import { SDOMZoneId } from '../static/sdom.js' -import { TitreTypeId } from '../static/titresTypes.js' +import { TitreTypeId, TitresTypes } from '../static/titresTypes.js' +import { TITRES_TYPES_TYPES_IDS } from '../static/titresTypesTypes.js' import { getDocuments } from '../static/titresTypes_demarchesTypes_etapesTypes/documents.js' import { getEntrepriseDocuments } from '../static/titresTypes_demarchesTypes_etapesTypes/entrepriseDocuments.js' import { documentTypeIdsBySdomZonesGet } from '../static/titresTypes_demarchesTypes_etapesTypes/sdom.js' import { getSections, getSectionsWithValue } from '../static/titresTypes_demarchesTypes_etapesTypes/sections.js' -import { isNotNullNorUndefinedNorEmpty, isNotNullNorUndefined, DeepReadonly, onlyUnique } from '../typescript-tools.js' +import { isNotNullNorUndefinedNorEmpty, DeepReadonly, onlyUnique, NonEmptyArray, isNonEmptyArray, isNullOrUndefinedOrEmpty, isNullOrUndefined, Nullable } from '../typescript-tools.js' import { sectionsWithValueCompleteValidate } from './sections.js' -import { dureeOptionalCheck } from './titres-etapes.js' +import { isDureeOptional } from './titres-etapes.js' + +type ValidReturn = { valid: true } | { valid: false; errors: NonEmptyArray<string> } + +export const dateTypeStepIsVisible = (user: User): boolean => { + return isSuper(user) || isAdministrationAdmin(user) || isAdministrationEditeur(user) +} +export const dateTypeStepIsComplete = (etape: DeepReadonly<Nullable<Pick<FlattenEtape, 'typeId' | 'date' | 'statutId'>>>, user: User): ValidReturn => { + if (!dateTypeStepIsVisible(user)) { + return { valid: true } + } + + const errors: string[] = [] + if (isNullOrUndefined(etape.date)) { + errors.push("La date de l'étape est obligatoire") + } + + if (isNullOrUndefined(etape.typeId)) { + errors.push("Le type de l'étape est obligatoire") + } + + if (isNullOrUndefined(etape.statutId)) { + errors.push("Le statut de l'étape est obligatoire") + } + + if (isNonEmptyArray(errors)) { + return { valid: false, errors } + } + + return { valid: true } +} export const fondamentaleStepIsVisible = (etapeTypeId: EtapeTypeId): boolean => { return EtapesTypes[etapeTypeId].fondamentale } -export const fondamentaleStepIsComplete = (flattened: DeepReadonly<Pick<FlattenEtape, 'typeId' | 'duree' | 'substances'>>, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId): boolean => { +const isTitulairesRequired = (etapeTypeId: EtapeTypeId, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId): boolean => + getEntrepriseDocuments(titreTypeId, demarcheTypeId, etapeTypeId).some(({ optionnel }) => !optionnel) +export const fondamentaleStepIsComplete = ( + flattened: DeepReadonly<Pick<FlattenEtape, 'typeId' | 'duree' | 'substances' | 'titulaires'>>, + demarcheTypeId: DemarcheTypeId, + titreTypeId: TitreTypeId +): ValidReturn => { if (!fondamentaleStepIsVisible(flattened.typeId)) { - return true + return { valid: true } } + const errors: string[] = [] - return ( - flattened.typeId !== ETAPES_TYPES.demande || - (isNotNullNorUndefinedNorEmpty(flattened.substances.value) && - (dureeOptionalCheck(flattened.typeId, demarcheTypeId, titreTypeId) || (isNotNullNorUndefined(flattened.duree.value) && flattened.duree.value > 0))) - ) + if (flattened.typeId !== ETAPES_TYPES.demande) { + return { valid: true } + } + + if (isNullOrUndefinedOrEmpty(flattened.substances.value)) { + errors.push('Les substances sont obligatoires') + } + + if (!isDureeOptional(flattened.typeId, demarcheTypeId, titreTypeId) && (isNullOrUndefined(flattened.duree.value) || flattened.duree.value === 0)) { + errors.push('la durée est obligatoire') + } + + if (isTitulairesRequired(flattened.typeId, demarcheTypeId, titreTypeId) && isNullOrUndefinedOrEmpty(flattened.titulaires.value)) { + errors.push('Les titulaires sont obligatoires') + } + + if (isNonEmptyArray(errors)) { + return { valid: false, errors } + } + + return { valid: true } } export const sectionsStepIsVisible = (etape: Pick<FlattenEtape, 'typeId'>, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId): boolean => { return getSections(titreTypeId, demarcheTypeId, etape.typeId).length > 0 } -export const sectionsStepIsComplete = (etape: DeepReadonly<Pick<FlattenEtape, 'typeId' | 'contenu'>>, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId): boolean => { +export const sectionsStepIsComplete = (etape: DeepReadonly<Pick<FlattenEtape, 'typeId' | 'contenu'>>, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId): ValidReturn => { if (!sectionsStepIsVisible(etape, demarcheTypeId, titreTypeId)) { - return true + return { valid: true } } const sections = getSections(titreTypeId, demarcheTypeId, etape.typeId) const sectionsWithValue = getSectionsWithValue(sections, etape.contenu) + const errors: string[] = sectionsWithValueCompleteValidate(sectionsWithValue) - return sectionsWithValueCompleteValidate(sectionsWithValue).length === 0 + if (isNonEmptyArray(errors)) { + return { valid: false, errors } + } + + return { valid: true } } export const perimetreStepIsVisible = (etape: Pick<FlattenEtape, 'typeId'>): boolean => { return EtapesTypes[etape.typeId].fondamentale } -export const perimetreStepIsComplete = (etape: DeepReadonly<Pick<FlattenEtape, 'typeId' | 'perimetre'>>): boolean => { +export const perimetreStepIsComplete = (etape: DeepReadonly<Pick<FlattenEtape, 'typeId' | 'perimetre'>>): ValidReturn => { if (!perimetreStepIsVisible(etape)) { - return true + return { valid: true } + } + + const errors: string[] = [] + if (etape.typeId === 'mfr' && isNullOrUndefined(etape.perimetre.value?.geojson4326Perimetre)) { + errors.push('Le périmètre est obligatoire') } - return etape.typeId !== 'mfr' || isNotNullNorUndefined(etape.perimetre.value?.geojson4326Perimetre) + if (isNonEmptyArray(errors)) { + return { valid: false, errors } + } + + return { valid: true } } export const getDocumentsTypes = ( @@ -86,6 +165,51 @@ export const getDocumentsTypes = ( return dts } +export const getAvisTypes = (etapeTypeId: EtapeTypeId, titreTypeId: TitreTypeId, communeIds: DeepReadonly<CommuneId[]>): { id: AvisTypeId; optionnel: boolean }[] => { + const avis = [] + if (etapeTypeId === ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives) { + avis.push( + ...[ + { ...AvisTypes.lettreDeSaisineDesServices, optionnel: false }, + { ...AvisTypes.avisDirectionRegionaleDesAffairesCulturelles, optionnel: true }, + { ...AvisTypes.avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques, optionnel: true }, + { ...AvisTypes.avisDirectionsRégionalesEconomieEmploiTravailSolidarités, optionnel: true }, + { ...AvisTypes.avisDirectionRegionaleFinancesPubliques, optionnel: true }, + { ...AvisTypes.avisGendarmerieNationale, optionnel: true }, + { ...AvisTypes.avisIFREMER, optionnel: true }, + { ...AvisTypes.avisInstitutNationalOrigineQualite, optionnel: true }, + { ...AvisTypes.avisServiceAdministratifLocal, optionnel: true }, + { ...AvisTypes.avisAutoriteMilitaire, optionnel: true }, + { ...AvisTypes.avisParcNational, optionnel: true }, + { ...AvisTypes.avisDirectionDepartementaleTerritoiresMer, optionnel: true }, + { ...AvisTypes.avisAgenceRegionaleSante, optionnel: true }, + { ...AvisTypes.avisCaisseGeneraleSecuriteSociale, optionnel: true }, + { ...AvisTypes.autreAvis, optionnel: true }, + { ...AvisTypes.avisOfficeNationalDesForets, optionnel: false }, + { ...AvisTypes.expertiseOfficeNationalDesForets, optionnel: true }, + // TODO 2024-05-14: rendre obligatoire pour les PNMs quand ces derniers seront implémentés + { ...AvisTypes.avisParcNaturelMarin, optionnel: true }, + ] + ) + + if (communeIds.some(id => toDepartementId(id) === DEPARTEMENT_IDS.Guyane)) { + avis.push( + ...[ + { ...AvisTypes.avisDirectionAlimentationAgricultureForet, optionnel: true }, + { ...AvisTypes.avisEtatMajorOrpaillagePecheIllicite, optionnel: true }, + ] + ) + } + + // TODO 2024-06-18 Normalement c'est obligatoire si avis propriétaire du sol est favorable avec réserve, optionnel pour le moment + if (TitresTypes[titreTypeId].typeId === TITRES_TYPES_TYPES_IDS.AUTORISATION_D_EXPLOITATION) { + avis.push({ ...AvisTypes.confirmationAccordProprietaireDuSol, optionnel: true }) + } + } + + return avis +} + export const etapeDocumentsStepIsVisible = (etape: Pick<FlattenEtape, 'typeId'>, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId): boolean => { return getDocuments(titreTypeId, demarcheTypeId, etape.typeId).length > 0 } @@ -93,27 +217,61 @@ export const etapeDocumentsStepIsComplete = ( etape: DeepReadonly<Pick<FlattenEtape, 'typeId' | 'contenu' | 'isBrouillon'>>, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId, - etapeDocuments: DeepReadonly<(EtapeDocument | TempEtapeDocument)[]>, + etapeDocuments: DeepReadonly<Pick<EtapeDocument | TempEtapeDocument, 'etape_document_type_id'>[]>, sdomZoneIds: DeepReadonly<SDOMZoneId[]>, - daeDocument: DeepReadonly<DocumentComplementaireDaeEtapeDocumentModification> | null, - aslDocument: DeepReadonly<DocumentComplementaireAslEtapeDocumentModification> | null, + daeDocument: DeepReadonly<Omit<DocumentComplementaireDaeEtapeDocumentModification, 'id'>> | null, + aslDocument: DeepReadonly<Omit<DocumentComplementaireAslEtapeDocumentModification, 'id'>> | null, user: User -): boolean => { +): ValidReturn => { if (!etapeDocumentsStepIsVisible(etape, demarcheTypeId, titreTypeId)) { - return true + return { valid: true } } + const errors: string[] = [] const documentTypes = getDocumentsTypes({ typeId: etape.typeId }, demarcheTypeId, titreTypeId, sdomZoneIds, etape.contenu?.arm?.mecanise?.value === true) - if (documentTypes.every(({ optionnel, id }) => optionnel || etapeDocuments.some(({ etape_document_type_id }) => etape_document_type_id === id))) { - if (needAslAndDae({ etapeTypeId: etape.typeId, demarcheTypeId, titreTypeId }, etape.isBrouillon, user)) { - return isNotNullNorUndefined(daeDocument) && isNotNullNorUndefined(aslDocument) + errors.push( + ...documentTypes + .filter(({ optionnel, id }) => !optionnel && etapeDocuments.every(({ etape_document_type_id }) => etape_document_type_id !== id)) + .map(({ id }) => `le document "${DocumentsTypes[id].nom}" (${id}) est obligatoire`) + ) + + if (needAslAndDae({ etapeTypeId: etape.typeId, demarcheTypeId, titreTypeId }, etape.isBrouillon, user)) { + if (isNullOrUndefined(daeDocument)) { + errors.push('L’arrêté préfectoral de la mission autorité environnementale est obligatoire') } + if (isNullOrUndefined(aslDocument)) { + errors.push('La lettre de décision du propriétaire du sol est obligatoire') + } + } - return true + if (isNonEmptyArray(errors)) { + return { valid: false, errors } } - return false + return { valid: true } +} + +export const etapeAvisStepIsVisible = (etape: Pick<FlattenEtape, 'typeId'>, titreTypeId: TitreTypeId, communeIds: DeepReadonly<CommuneId[]>): boolean => { + return getAvisTypes(etape.typeId, titreTypeId, communeIds).length > 0 +} + +export const etapeAvisStepIsComplete = ( + etape: DeepReadonly<Pick<FlattenEtape, 'typeId'>>, + etapeAvis: DeepReadonly<Pick<EtapeAvis | TempEtapeAvis, 'avis_type_id'>[]>, + titreTypeId: TitreTypeId, + communeIds: DeepReadonly<CommuneId[]> +): ValidReturn => { + if (!etapeAvisStepIsVisible(etape, titreTypeId, communeIds)) { + return { valid: true } + } + + const avisTypes = getAvisTypes(etape.typeId, titreTypeId, communeIds) + if (avisTypes.some(avisType => !avisType.optionnel && etapeAvis.every(avis => avis.avis_type_id !== avisType.id))) { + return { valid: false, errors: ['Il manque des avis obligatoires'] } + } + + return { valid: true } } export const entrepriseDocumentsStepIsVisible = (etape: Pick<FlattenEtape, 'typeId'>, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId): boolean => { @@ -123,19 +281,27 @@ export const entrepriseDocumentsStepIsComplete = ( etape: DeepReadonly<Pick<FlattenEtape, 'typeId' | 'contenu' | 'titulaires' | 'amodiataires'>>, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId, - entreprisesDocuments: DeepReadonly<SelectedEntrepriseDocument[]> -): boolean => { + entreprisesDocuments: DeepReadonly<Pick<SelectedEntrepriseDocument, 'documentTypeId' | 'entrepriseId'>[]> +): ValidReturn => { if (!entrepriseDocumentsStepIsVisible(etape, demarcheTypeId, titreTypeId)) { - return true + return { valid: true } } const documentTypes = getEntrepriseDocuments(titreTypeId, demarcheTypeId, etape.typeId) const entrepriseIds = [...etape.titulaires.value, ...etape.amodiataires.value].filter(onlyUnique) - return entrepriseIds.every(eId => - documentTypes.every(({ optionnel, id }) => optionnel || entreprisesDocuments.some(({ documentTypeId, entrepriseId }) => documentTypeId === id && entrepriseId === eId)) - ) + if (isNullOrUndefinedOrEmpty(entrepriseIds) && isTitulairesRequired(etape.typeId, demarcheTypeId, titreTypeId)) { + return { valid: false, errors: ["Il y a des documents d'entreprise obligatoires, mais il n'y a pas de titulaire"] } + } + + if ( + entrepriseIds.some(eId => documentTypes.some(({ optionnel, id }) => !optionnel && entreprisesDocuments.every(({ documentTypeId, entrepriseId }) => documentTypeId !== id || entrepriseId !== eId))) + ) { + return { valid: false, errors: ["Il manque des documents d'entreprise obligatoires"] } + } + + return { valid: true } } export type SelectedEntrepriseDocument = { diff --git a/packages/common/src/permissions/sections.test.ts b/packages/common/src/permissions/sections.test.ts index c1bef241d..e48da9e99 100644 --- a/packages/common/src/permissions/sections.test.ts +++ b/packages/common/src/permissions/sections.test.ts @@ -9,8 +9,6 @@ describe('sectionElementWithValueCompleteValidate', () => { [null, false, false], ['un texte', false, true], [null, true, true], - [null, undefined, false], - ['un text', undefined, true], ])('Pour élément text', (value, optionnel, expectedComplete) => { expect(sectionElementWithValueCompleteValidate({ type: 'text', value, optionnel })).toEqual(expectedComplete) }) @@ -20,8 +18,6 @@ describe('sectionElementWithValueCompleteValidate', () => { [null, false, false], [10, false, true], [null, true, true], - [null, undefined, false], - [10, undefined, true], ])('Pour élément number ou integer', (value, optionnel, expectedComplete) => { expect(sectionElementWithValueCompleteValidate({ type: 'number', value, optionnel })).toEqual(expectedComplete) expect(sectionElementWithValueCompleteValidate({ type: 'integer', value, optionnel })).toEqual(expectedComplete) @@ -32,8 +28,6 @@ describe('sectionElementWithValueCompleteValidate', () => { [null, false, false], [true, false, true], [null, true, true], - [null, undefined, false], - [true, undefined, true], ])('Pour élément radio', (value, optionnel, expectedComplete) => { expect(sectionElementWithValueCompleteValidate({ type: 'radio', value, optionnel })).toEqual(expectedComplete) }) @@ -43,8 +37,6 @@ describe('sectionElementWithValueCompleteValidate', () => { [null, false, true], [true, false, true], [null, true, true], - [null, undefined, true], - [true, undefined, true], ])('Pour élément checkbox', (value, optionnel, expectedComplete) => { expect(sectionElementWithValueCompleteValidate({ type: 'checkbox', value, optionnel })).toEqual(expectedComplete) }) @@ -52,10 +44,8 @@ describe('sectionElementWithValueCompleteValidate', () => { test.each<[string[], ElementWithValue['optionnel'], boolean]>([ [[], false, true], [[], true, true], - [[], undefined, true], [['item'], false, true], [['item'], true, true], - [['item'], undefined, true], ])('Pour élément checkboxes', (value, optionnel, expectedComplete) => { expect(sectionElementWithValueCompleteValidate({ type: 'checkboxes', value, optionnel })).toEqual(expectedComplete) }) @@ -65,8 +55,6 @@ describe('sectionElementWithValueCompleteValidate', () => { [null, false, false], ['id1', false, true], [null, true, true], - [null, undefined, false], - ['id1', undefined, true], ])('Pour élément select', (value, optionnel, expectedComplete) => { expect(sectionElementWithValueCompleteValidate({ type: 'select', value, optionnel })).toEqual(expectedComplete) }) @@ -75,8 +63,6 @@ describe('sectionElementWithValueCompleteValidate', () => { [getCurrent(), false, true], [null, false, false], [null, true, true], - [null, undefined, false], - [getCurrent(), undefined, true], ])('Pour élément date', (value, optionnel, expectedComplete) => { expect(sectionElementWithValueCompleteValidate({ type: 'date', value, optionnel })).toEqual(expectedComplete) }) diff --git a/packages/common/src/permissions/sections.ts b/packages/common/src/permissions/sections.ts index dedd3da37..d3a4d8c24 100644 --- a/packages/common/src/permissions/sections.ts +++ b/packages/common/src/permissions/sections.ts @@ -1,26 +1,9 @@ -import { Section } from '../static/titresTypes_demarchesTypes_etapesTypes/sections.js' import { ElementWithValue } from '../sections.js' import { DeepReadonly, isNullOrUndefined } from '../typescript-tools.js' // @deprecated ==> type better export type Contenu = { [key in string]?: { [secondKey in string]?: unknown } } | null -// @deprecated => sectionsWithValueCompleteValidate -export const contenuCompleteValidate = (sections: DeepReadonly<Section[]>, contenu: Contenu): string[] => { - const errors: string[] = [] - sections.forEach(s => - s.elements?.forEach(e => { - if (isNullOrUndefined(e.optionnel) && !['radio', 'checkbox'].includes(e.type)) { - if (!contenu || !contenu[s.id] || contenu[s.id]?.[e.id] === undefined || contenu[s.id]?.[e.id] === null || contenu[s.id]?.[e.id] === '') { - errors.push(`l’élément "${e.nom}" de la section "${s.nom}" est obligatoire`) - } - } - }) - ) - - return errors -} - export const sectionsWithValueCompleteValidate = (sections_with_value: DeepReadonly<{ nom?: string; elements: Pick<ElementWithValue, 'nom' | 'optionnel' | 'value' | 'type'>[] }[]>): string[] => { const errors: string[] = [] sections_with_value.forEach(s => diff --git a/packages/common/src/permissions/titres-etapes.test.ts b/packages/common/src/permissions/titres-etapes.test.ts index 62db5895d..2e5e1031b 100644 --- a/packages/common/src/permissions/titres-etapes.test.ts +++ b/packages/common/src/permissions/titres-etapes.test.ts @@ -1,7 +1,21 @@ import { TitreTypeId } from '../static/titresTypes.js' import { EtapeTypeId } from '../static/etapesTypes.js' import { DemarcheTypeId } from '../static/demarchesTypes.js' -import { canCreateEtape, canEditEtape, canEditAmodiataires, canEditDates, canEditDuree, canEditTitulaires, dureeOptionalCheck, isEtapeComplete, canDeleteEtape } from './titres-etapes.js' + +import { + canCreateEtape, + canEditEtape, + canEditAmodiataires, + canEditDates, + canEditDuree, + canEditTitulaires, + isDureeOptional, + isEtapeComplete, + IsEtapeCompleteDocuments, + IsEtapeCompleteEntrepriseDocuments, + IsEtapeCompleteEtape, + canDeleteEtape, +} from './titres-etapes.js' import { AdministrationId, ADMINISTRATION_IDS } from '../static/administrations.js' import { test, expect } from 'vitest' import { TestUser, testBlankUser } from '../tests-utils.js' @@ -9,8 +23,11 @@ import { TitreStatutId } from '../static/titresStatuts.js' import { EntrepriseId, entrepriseIdValidator, newEntrepriseId } from '../entreprise.js' import { SubstanceLegaleId } from '../static/substancesLegales.js' import { FeatureMultiPolygon } from '../perimetre.js' -import { toCaminoDate } from '../date.js' +import { caminoDateValidator, toCaminoDate } from '../date.js' +import { ETAPE_IS_BROUILLON, ETAPE_IS_NOT_BROUILLON } from '../etape.js' import { EntrepriseUserNotNull } from '../roles.js' +import { communeIdValidator } from '../static/communes.js' +import { SDOMZoneIds } from '../static/sdom.js' test.each<{ etapeTypeId: EtapeTypeId; demarcheTypeId: DemarcheTypeId; titreTypeId: TitreTypeId; optional: boolean }>([ { etapeTypeId: 'mfr', demarcheTypeId: 'oct', titreTypeId: 'arm', optional: false }, @@ -18,8 +35,8 @@ test.each<{ etapeTypeId: EtapeTypeId; demarcheTypeId: DemarcheTypeId; titreTypeI { etapeTypeId: 'dex', demarcheTypeId: 'oct', titreTypeId: 'axm', optional: true }, { etapeTypeId: 'mfr', demarcheTypeId: 'oct', titreTypeId: 'prm', optional: true }, { etapeTypeId: 'mfr', demarcheTypeId: 'dep', titreTypeId: 'arm', optional: true }, -])('dureeOptionalCheck $etapeTypeId | $demarcheTypeId | $titreTypeId | $optional', ({ etapeTypeId, demarcheTypeId, titreTypeId, optional }) => { - expect(dureeOptionalCheck(etapeTypeId, demarcheTypeId, titreTypeId)).toEqual(optional) +])('isDureeOptional $etapeTypeId | $demarcheTypeId | $titreTypeId | $optional', ({ etapeTypeId, demarcheTypeId, titreTypeId, optional }) => { + expect(isDureeOptional(etapeTypeId, demarcheTypeId, titreTypeId)).toEqual(optional) }) test.each<{ titreTypeId: TitreTypeId; demarcheTypeId: DemarcheTypeId; canEdit: boolean }>([ @@ -91,7 +108,7 @@ test.each<{ { user: { role: 'super' }, etapeTypeId: 'mfr', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, titreTitulaires: [], titresAdministrationsLocales: [], demarcheTypeId: 'ren', @@ -101,7 +118,7 @@ test.each<{ { user: { role: 'defaut' }, etapeTypeId: 'mfr', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, titreTitulaires: [], titresAdministrationsLocales: [], demarcheTypeId: 'ren', @@ -111,7 +128,7 @@ test.each<{ { user: { role: 'editeur', administrationId: 'ope-brgm-01' }, etapeTypeId: 'mfr', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, titreTitulaires: [], titresAdministrationsLocales: [], demarcheTypeId: 'ren', @@ -121,7 +138,7 @@ test.each<{ { user: { role: 'lecteur', administrationId: 'ope-brgm-01' }, etapeTypeId: 'mfr', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, titreTitulaires: [], titresAdministrationsLocales: [], demarcheTypeId: 'ren', @@ -131,7 +148,7 @@ test.each<{ { user: { role: 'entreprise', entreprises: [{ id: newEntrepriseId('1'), nom: 'nom' }] }, etapeTypeId: 'mfr', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, titreTitulaires: [newEntrepriseId('1')], titresAdministrationsLocales: [], demarcheTypeId: 'ren', @@ -141,7 +158,7 @@ test.each<{ { user: { role: 'entreprise', entreprises: [{ id: newEntrepriseId('1'), nom: 'nom' }] }, etapeTypeId: 'mfr', - isBrouillon: true, + isBrouillon: ETAPE_IS_BROUILLON, titreTitulaires: [newEntrepriseId('1')], titresAdministrationsLocales: [], demarcheTypeId: 'oct', @@ -151,7 +168,7 @@ test.each<{ { user: { role: 'admin', administrationId: 'ope-brgm-01' }, etapeTypeId: 'mfr', - isBrouillon: true, + isBrouillon: ETAPE_IS_BROUILLON, titreTitulaires: [], titresAdministrationsLocales: ['ope-brgm-01'], demarcheTypeId: 'oct', @@ -161,7 +178,7 @@ test.each<{ { user: { role: 'editeur', administrationId: 'ope-brgm-01' }, etapeTypeId: 'mfr', - isBrouillon: true, + isBrouillon: ETAPE_IS_BROUILLON, titreTitulaires: [], titresAdministrationsLocales: ['ope-brgm-01'], demarcheTypeId: 'oct', @@ -171,7 +188,7 @@ test.each<{ { user: { role: 'lecteur', administrationId: 'ope-brgm-01' }, etapeTypeId: 'mfr', - isBrouillon: true, + isBrouillon: ETAPE_IS_BROUILLON, titreTitulaires: [], titresAdministrationsLocales: ['ope-brgm-01'], demarcheTypeId: 'oct', @@ -181,7 +198,7 @@ test.each<{ { user: { role: 'admin', administrationId: ADMINISTRATION_IDS['DGTM - GUYANE'] }, etapeTypeId: 'mfr', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, titreTitulaires: [], titresAdministrationsLocales: ['ope-brgm-01'], demarcheTypeId: 'oct', @@ -191,7 +208,7 @@ test.each<{ { user: { role: 'admin', administrationId: ADMINISTRATION_IDS['GENDARMERIE NATIONALE - GUYANE'] }, etapeTypeId: 'aca', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, titreTitulaires: [], titresAdministrationsLocales: ['ope-brgm-01'], demarcheTypeId: 'oct', @@ -245,25 +262,45 @@ const multiPolygonWith4Points: FeatureMultiPolygon = { ], }, } -const etapeComplete: Parameters<typeof isEtapeComplete>[0] = { + +const titulaireId = entrepriseIdValidator.parse('titulaireId') +const etapeComplete: IsEtapeCompleteEtape = { + contenu: {}, + date: caminoDateValidator.parse('2023-02-01'), typeId: 'mfr', - substances: ['auru'], - geojson4326Perimetre: multiPolygonWith4Points, - duree: 4, - isBrouillon: false, + statutId: 'fai', + substances: { value: ['auru'], heritee: false, etapeHeritee: null }, + titulaires: { value: [titulaireId], heritee: false, etapeHeritee: null }, + amodiataires: { value: [], heritee: false, etapeHeritee: null }, + perimetre: { + value: { + geojson4326Perimetre: multiPolygonWith4Points, + geojson4326Points: null, + geojsonOriginePerimetre: null, + geojsonOriginePoints: null, + geojsonOrigineGeoSystemeId: null, + geojson4326Forages: null, + geojsonOrigineForages: null, + surface: null, + }, + heritee: false, + etapeHeritee: null, + }, + duree: { value: 4, heritee: false, etapeHeritee: null }, + isBrouillon: ETAPE_IS_NOT_BROUILLON, } -const armDocuments: Parameters<typeof isEtapeComplete>[3] = [{ etape_document_type_id: 'car' }, { etape_document_type_id: 'dom' }, { etape_document_type_id: 'for' }, { etape_document_type_id: 'jpa' }] -const armEntrepriseDocuments: Parameters<typeof isEtapeComplete>[4] = [ - { entreprise_document_type_id: 'cur' }, - { entreprise_document_type_id: 'jid' }, - { entreprise_document_type_id: 'jct' }, - { entreprise_document_type_id: 'kbi' }, - { entreprise_document_type_id: 'jcf' }, - { entreprise_document_type_id: 'atf' }, +const armDocuments: IsEtapeCompleteDocuments = [{ etape_document_type_id: 'car' }, { etape_document_type_id: 'dom' }, { etape_document_type_id: 'for' }, { etape_document_type_id: 'jpa' }] +const armEntrepriseDocuments: IsEtapeCompleteEntrepriseDocuments = [ + { entreprise_document_type_id: 'cur', entreprise_id: titulaireId }, + { entreprise_document_type_id: 'jid', entreprise_id: titulaireId }, + { entreprise_document_type_id: 'jct', entreprise_id: titulaireId }, + { entreprise_document_type_id: 'kbi', entreprise_id: titulaireId }, + { entreprise_document_type_id: 'jcf', entreprise_id: titulaireId }, + { entreprise_document_type_id: 'atf', entreprise_id: titulaireId }, ] -const axmDocuments: Parameters<typeof isEtapeComplete>[3] = [ +const axmDocuments: IsEtapeCompleteDocuments = [ { etape_document_type_id: 'car' }, { etape_document_type_id: 'lem' }, { etape_document_type_id: 'idm' }, @@ -273,133 +310,208 @@ const axmDocuments: Parameters<typeof isEtapeComplete>[3] = [ { etape_document_type_id: 'prg' }, ] -const axmEntrepriseDocuments: Parameters<typeof isEtapeComplete>[4] = [ - { entreprise_document_type_id: 'lis' }, - { entreprise_document_type_id: 'jac' }, - { entreprise_document_type_id: 'bil' }, - { entreprise_document_type_id: 'ref' }, - { entreprise_document_type_id: 'deb' }, - { entreprise_document_type_id: 'atf' }, - { entreprise_document_type_id: 'jid' }, - { entreprise_document_type_id: 'jct' }, +const axmEntrepriseDocuments: IsEtapeCompleteEntrepriseDocuments = [ + { entreprise_document_type_id: 'lis', entreprise_id: titulaireId }, + { entreprise_document_type_id: 'jac', entreprise_id: titulaireId }, + { entreprise_document_type_id: 'bil', entreprise_id: titulaireId }, + { entreprise_document_type_id: 'ref', entreprise_id: titulaireId }, + { entreprise_document_type_id: 'deb', entreprise_id: titulaireId }, + { entreprise_document_type_id: 'atf', entreprise_id: titulaireId }, + { entreprise_document_type_id: 'jid', entreprise_id: titulaireId }, + { entreprise_document_type_id: 'jct', entreprise_id: titulaireId }, ] +test('teste la complétude d’une demande d’AXM faite par un utilisateur entreprises en Guyane en Zone1 du SDOM', () => { + expect( + isEtapeComplete( + { ...etapeComplete, isBrouillon: ETAPE_IS_BROUILLON }, + 'axm', + 'oct', + axmDocuments, + axmEntrepriseDocuments, + [SDOMZoneIds.Zone1], + [communeIdValidator.parse('97302')], + { arrete_prefectoral: '', date: toCaminoDate('2024-01-01'), description: null, entreprises_lecture: true, etape_document_type_id: 'arp', etape_statut_id: 'fai', public_lecture: true }, + { date: toCaminoDate('2024-04-22'), description: null, entreprises_lecture: true, etape_document_type_id: 'let', etape_statut_id: 'fai', public_lecture: true }, + [], + { ...testBlankUser, role: 'entreprise', entreprises: [{ id: entrepriseIdValidator.parse('id1'), nom: 'nomEntreprise' }] } + ) + ).toMatchInlineSnapshot(` + { + "errors": [ + "le document "Notice d’impact" (nip) est obligatoire", + ], + "valid": false, + } + `) +}) + test('teste la complétude d’une demande d’AXM faite par un utilisateur entreprises', () => { expect( isEtapeComplete( - { ...etapeComplete, isBrouillon: true }, + { ...etapeComplete, isBrouillon: ETAPE_IS_BROUILLON }, 'axm', 'oct', axmDocuments, axmEntrepriseDocuments, [], + [], { arrete_prefectoral: '', date: toCaminoDate('2024-01-01'), description: null, entreprises_lecture: true, etape_document_type_id: 'arp', etape_statut_id: 'fai', public_lecture: true }, { date: toCaminoDate('2024-04-22'), description: null, entreprises_lecture: true, etape_document_type_id: 'let', etape_statut_id: 'fai', public_lecture: true }, + [], { ...testBlankUser, role: 'entreprise', entreprises: [{ id: entrepriseIdValidator.parse('id1'), nom: 'nomEntreprise' }] } ) ).toStrictEqual({ valid: true }) }) test('teste la complétude d’une demande d’ARM', () => { - expect(isEtapeComplete(etapeComplete, 'arm', 'oct', armDocuments, armEntrepriseDocuments, [], null, null, { ...testBlankUser, role: 'super' })).toStrictEqual({ valid: true }) + expect( + isEtapeComplete( + { ...etapeComplete, contenu: { arm: { mecanise: { value: false, etapeHeritee: null, heritee: false } } } }, + 'arm', + 'oct', + armDocuments, + armEntrepriseDocuments, + [], + [], + null, + null, + [], + { ...testBlankUser, role: 'super' } + ) + ).toStrictEqual({ valid: true }) }) -test.each<[SubstanceLegaleId[], EtapeTypeId, TitreTypeId, Parameters<typeof isEtapeComplete>[3], Parameters<typeof isEtapeComplete>[4], boolean]>([ - [[], 'mfr', 'arm', armDocuments, armEntrepriseDocuments, true], - [[], 'mfr', 'axm', armDocuments, armEntrepriseDocuments, true], - [[], 'rde', 'arm', armDocuments, [], false], - [[], 'mfr', 'prm', armDocuments, armEntrepriseDocuments, false], - [['auru'], 'mfr', 'arm', armDocuments, armEntrepriseDocuments, false], - [['auru'], 'mfr', 'axm', axmDocuments, axmEntrepriseDocuments, false], - [[], 'mfr', 'axm', axmDocuments, axmEntrepriseDocuments, true], -])('teste la complétude des substances', (substances, etapeType, titreType, testDocuments, entrepriseDocuments, error) => { - const titreEtape = { +test.each<[SubstanceLegaleId[], EtapeTypeId, TitreTypeId, IsEtapeCompleteDocuments, IsEtapeCompleteEntrepriseDocuments]>([ + [[], 'rde', 'arm', armDocuments, []], + [['auru'], 'mfr', 'arm', armDocuments, armEntrepriseDocuments], + [['auru'], 'mfr', 'axm', axmDocuments, axmEntrepriseDocuments], +])('teste la complétude des substances complètes %#', (substances, etapeType, titreType, testDocuments, entrepriseDocuments) => { + const titreEtape: IsEtapeCompleteEtape = { ...etapeComplete, - substances, + substances: { value: substances, heritee: false, etapeHeritee: null }, + contenu: { arm: { mecanise: { value: false, etapeHeritee: null, heritee: false } } }, typeId: etapeType, } - const result = isEtapeComplete(titreEtape, titreType, 'oct', testDocuments, entrepriseDocuments, [], null, null, { ...testBlankUser, role: 'super' }) + const result = isEtapeComplete(titreEtape, titreType, 'oct', testDocuments, entrepriseDocuments, [], [], null, null, [], { ...testBlankUser, role: 'super' }) - const errorLabel = 'au moins une substance doit être renseignée' + expect(result.valid, JSON.stringify(result)).toBe(true) +}) - if (error) { - if (!result.valid) { - expect(result.errors).toContain(errorLabel) - } else { - throw new Error('') - } +test.each<[SubstanceLegaleId[], EtapeTypeId, TitreTypeId, IsEtapeCompleteDocuments, IsEtapeCompleteEntrepriseDocuments]>([ + [[], 'mfr', 'arm', armDocuments, armEntrepriseDocuments], + [[], 'mfr', 'axm', armDocuments, armEntrepriseDocuments], + [[], 'mfr', 'prm', armDocuments, armEntrepriseDocuments], + [[], 'mfr', 'axm', axmDocuments, axmEntrepriseDocuments], +])('teste la complétude des substances incomplètes %#', (substances, etapeType, titreType, testDocuments, entrepriseDocuments) => { + const titreEtape: IsEtapeCompleteEtape = { + ...etapeComplete, + substances: { value: substances, heritee: false, etapeHeritee: null }, + typeId: etapeType, + } + + const result = isEtapeComplete(titreEtape, titreType, 'oct', testDocuments, entrepriseDocuments, [], [], null, null, [], { ...testBlankUser, role: 'super' }) + + const errorLabel = 'Les substances sont obligatoires' + expect(result.valid).toBe(false) + if (!result.valid) { + expect(result.errors, JSON.stringify(result)).toContain(errorLabel) } else { - expect(result).toStrictEqual({ valid: true }) + throw new Error('') } }) -test.each<[FeatureMultiPolygon | null, EtapeTypeId, TitreTypeId, Parameters<typeof isEtapeComplete>[3], Parameters<typeof isEtapeComplete>[4], boolean]>([ - [null, 'mfr', 'arm', armDocuments, armEntrepriseDocuments, true], - [null, 'mfr', 'axm', axmDocuments, axmEntrepriseDocuments, true], - [null, 'rde', 'arm', armDocuments, [], false], - [null, 'mfr', 'prm', [], [], false], - [multiPolygonWith4Points, 'mfr', 'arm', armDocuments, armEntrepriseDocuments, false], - [multiPolygonWith4Points, 'mfr', 'axm', axmDocuments, axmEntrepriseDocuments, false], -])('teste la complétude du périmètre', (geojson4326Perimetre, etapeType, titreType, documents, entrepriseDocuments, error) => { - const titreEtape: Parameters<typeof isEtapeComplete>[0] = { +test.each<[FeatureMultiPolygon | null, EtapeTypeId, TitreTypeId, IsEtapeCompleteDocuments, IsEtapeCompleteEntrepriseDocuments]>([ + [null, 'mfr', 'arm', armDocuments, armEntrepriseDocuments], + [null, 'mfr', 'axm', axmDocuments, axmEntrepriseDocuments], + [null, 'mfr', 'prm', [], []], +])('teste la complétude du périmètre incomplet %#', (geojson4326Perimetre, etapeType, titreType, documents, entrepriseDocuments) => { + const titreEtape: IsEtapeCompleteEtape = { ...etapeComplete, - geojson4326Perimetre, + perimetre: { + value: { + geojson4326Points: null, + geojsonOriginePerimetre: null, + geojsonOriginePoints: null, + geojsonOrigineGeoSystemeId: null, + geojson4326Forages: null, + geojsonOrigineForages: null, + surface: null, + geojson4326Perimetre, + }, + heritee: false, + etapeHeritee: null, + }, typeId: etapeType, } - const result = isEtapeComplete(titreEtape, titreType, 'oct', documents, entrepriseDocuments, [], null, null, { ...testBlankUser, role: 'super' }) + const result = isEtapeComplete(titreEtape, titreType, 'oct', documents, entrepriseDocuments, [], [], null, null, [], { ...testBlankUser, role: 'super' }) - const errorLabel = 'le périmètre doit être renseigné' - if (error) { - if (!result.valid) { - expect(result.errors).toContain(errorLabel) - } else { - throw new Error('') - } + const errorLabel = 'Le périmètre est obligatoire' + expect(result.valid).toBe(false) + if (!result.valid) { + expect(result.errors, JSON.stringify(result)).toContain(errorLabel) } else { - expect(result).toStrictEqual({ valid: true }) + throw new Error('') } }) +test.each<[FeatureMultiPolygon | null, EtapeTypeId, TitreTypeId, IsEtapeCompleteDocuments, IsEtapeCompleteEntrepriseDocuments]>([ + [null, 'rde', 'arm', armDocuments, []], + [multiPolygonWith4Points, 'mfr', 'arm', armDocuments, armEntrepriseDocuments], + [multiPolygonWith4Points, 'mfr', 'axm', axmDocuments, axmEntrepriseDocuments], +])('teste la complétude du périmètre complet %#', (geojson4326Perimetre, etapeType, titreType, documents, entrepriseDocuments) => { + const titreEtape: IsEtapeCompleteEtape = { + ...etapeComplete, + contenu: titreType === 'arm' ? { arm: { mecanise: { value: false, heritee: false, etapeHeritee: null } } } : {}, + perimetre: { + value: { + geojson4326Points: null, + geojsonOriginePerimetre: null, + geojsonOriginePoints: null, + geojsonOrigineGeoSystemeId: null, + geojson4326Forages: null, + geojsonOrigineForages: null, + surface: null, + geojson4326Perimetre, + }, + heritee: false, + etapeHeritee: null, + }, + typeId: etapeType, + } -test('[DEPRECATED] une demande d’ARM mécanisée a des documents obligatoires supplémentaires', () => { - const errors = isEtapeComplete({ ...etapeComplete, contenu: { arm: { mecanise: true } } }, 'arm', 'oct', armDocuments, armEntrepriseDocuments, [], null, null, { ...testBlankUser, role: 'super' }) - expect(errors).toMatchInlineSnapshot(` - { - "errors": [ - "le document "dep" est obligatoire", - "le document "doe" est obligatoire", - ], - "valid": false, - } - `) + const result = isEtapeComplete(titreEtape, titreType, 'oct', documents, entrepriseDocuments, [], [], null, null, [], { ...testBlankUser, role: 'super' }) + + expect(result).toStrictEqual({ valid: true }) }) test('une demande d’ARM mécanisée a des documents obligatoires supplémentaires', () => { const errors = isEtapeComplete( - { ...etapeComplete, sectionsWithValue: [{ id: 'arm', elements: [{ id: 'mecanise', type: 'radio', value: true }] }] }, + { ...etapeComplete, contenu: { arm: { mecanise: { value: true, heritee: false, etapeHeritee: null } } } }, 'arm', 'oct', armDocuments, armEntrepriseDocuments, [], + [], null, null, + [], { ...testBlankUser, role: 'super' } ) expect(errors).toMatchInlineSnapshot(` { "errors": [ - "le document "dep" est obligatoire", - "le document "doe" est obligatoire", + "le document "Décision cas par cas" (dep) est obligatoire", + "le document "Dossier "Loi sur l'eau"" (doe) est obligatoire", ], "valid": false, } `) }) -test.each<[number | undefined | null, EtapeTypeId, TitreTypeId, Parameters<typeof isEtapeComplete>[3], Parameters<typeof isEtapeComplete>[4], boolean]>([ - [undefined, 'mfr', 'arm', armDocuments, armEntrepriseDocuments, true], +test.each<[number | null, EtapeTypeId, TitreTypeId, IsEtapeCompleteDocuments, IsEtapeCompleteEntrepriseDocuments, boolean]>([ [null, 'mfr', 'axm', axmDocuments, axmEntrepriseDocuments, true], [0, 'mfr', 'axm', axmDocuments, axmEntrepriseDocuments, true], [0, 'mfr', 'arm', armDocuments, armEntrepriseDocuments, true], @@ -407,16 +519,17 @@ test.each<[number | undefined | null, EtapeTypeId, TitreTypeId, Parameters<typeo [0, 'rde', 'arm', [], [], false], [3, 'mfr', 'arm', armDocuments, armEntrepriseDocuments, false], [3, 'mfr', 'axm', axmDocuments, axmEntrepriseDocuments, false], -])('teste la complétude de la durée %i pour une étapeType %s, un titreType %s', (duree, etapeType, titreType, documents, entreprisedocuments, error) => { - const titreEtape = { +])('%# teste la complétude de la durée %s pour une étapeType %s, un titreType %s', (duree, etapeType, titreType, documents, entreprisedocuments, error) => { + const titreEtape: IsEtapeCompleteEtape = { ...etapeComplete, - duree, + duree: { value: duree, heritee: false, etapeHeritee: null }, + contenu: { arm: { mecanise: { value: false, heritee: false, etapeHeritee: null } } }, typeId: etapeType, } - const result = isEtapeComplete(titreEtape, titreType, 'oct', documents, entreprisedocuments, [], null, null, { ...testBlankUser, role: 'super' }) + const result = isEtapeComplete(titreEtape, titreType, 'oct', documents, entreprisedocuments, [], [], null, null, [], { ...testBlankUser, role: 'super' }) - const errorLabel = 'la durée doit être renseignée' + const errorLabel = 'la durée est obligatoire' if (error) { if (!result.valid) { expect(result.errors).toContain(errorLabel) diff --git a/packages/common/src/permissions/titres-etapes.ts b/packages/common/src/permissions/titres-etapes.ts index 09ea106ed..99109855f 100644 --- a/packages/common/src/permissions/titres-etapes.ts +++ b/packages/common/src/permissions/titres-etapes.ts @@ -10,20 +10,32 @@ import { canAdministrationEtapeTypeId } from '../static/administrationsTitresTyp import { TitreStatutId } from '../static/titresStatuts.js' import { EntrepriseDocument, EntrepriseId } from '../entreprise.js' -import { getSections } from '../static/titresTypes_demarchesTypes_etapesTypes/sections.js' -import { getEntrepriseDocuments } from '../static/titresTypes_demarchesTypes_etapesTypes/entrepriseDocuments.js' import { SDOMZoneId } from '../static/sdom.js' -import { NonEmptyArray, isNonEmptyArray, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined } from '../typescript-tools.js' -import { DocumentType, EntrepriseDocumentTypeId } from '../static/documentsTypes.js' -import { SubstanceLegaleId } from '../static/substancesLegales.js' -import { isDocumentsComplete } from './documents.js' -import { contenuCompleteValidate, sectionsWithValueCompleteValidate } from './sections.js' -import { ElementWithValue, SectionWithValue } from '../sections.js' -import { FeatureMultiPolygon } from '../perimetre.js' -import { EtapeDocument, GetEtapeDocumentsByEtapeId, GetEtapeDocumentsByEtapeIdAslDocument, GetEtapeDocumentsByEtapeIdDaeDocument, needAslAndDae } from '../etape.js' -import { getDocumentsTypes } from './etape-form.js' - -export const dureeOptionalCheck = (etapeTypeId: EtapeTypeId, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId): boolean => { +import { DeepReadonly, NonEmptyArray, isNonEmptyArray } from '../typescript-tools.js' +import { + ETAPE_IS_BROUILLON, + EtapeAvis, + EtapeBrouillon, + EtapeDocument, + GetEtapeDocumentsByEtapeId, + GetEtapeDocumentsByEtapeIdAslDocument, + GetEtapeDocumentsByEtapeIdDaeDocument, + TempEtapeAvis, + TempEtapeDocument, +} from '../etape.js' +import { + dateTypeStepIsComplete, + entrepriseDocumentsStepIsComplete, + etapeAvisStepIsComplete, + etapeDocumentsStepIsComplete, + fondamentaleStepIsComplete, + perimetreStepIsComplete, + sectionsStepIsComplete, +} from './etape-form.js' +import { CommuneId } from '../static/communes.js' +import { FlattenEtape } from '../etape-form.js' + +export const isDureeOptional = (etapeTypeId: EtapeTypeId, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId): boolean => { if (titreTypeId !== 'axm' && titreTypeId !== 'arm') { return true } @@ -154,115 +166,86 @@ const canCreateOrEditEtape = ( return false } -type IsEtapeCompleteEtape = { - typeId: EtapeTypeId - isBrouillon: boolean - /** - @deprecated use sectionsWithValue/ - */ - contenu?: Record<string, Record<string, ElementWithValue['value']>> - sectionsWithValue?: SectionWithValue[] - geojson4326Perimetre?: null | FeatureMultiPolygon - substances?: null | SubstanceLegaleId[] - duree?: number | null -} +export type IsEtapeCompleteEtape = DeepReadonly<Pick<FlattenEtape, 'typeId' | 'date' | 'statutId' | 'duree' | 'contenu' | 'substances' | 'perimetre' | 'isBrouillon' | 'titulaires' | 'amodiataires'>> +export type IsEtapeCompleteDocuments = DeepReadonly<Pick<EtapeDocument | TempEtapeDocument, 'etape_document_type_id'>[]> +export type IsEtapeCompleteEntrepriseDocuments = DeepReadonly<Pick<EntrepriseDocument, 'entreprise_document_type_id' | 'entreprise_id'>[]> +type IsEtapeCompleteSdomZones = DeepReadonly<SDOMZoneId[]> | null | undefined +type IsEtapeCompleteCommunes = DeepReadonly<CommuneId[]> +type IsEtapeCompleteDaeDocument = DeepReadonly<Omit<GetEtapeDocumentsByEtapeIdDaeDocument, 'id'> | null> +type IsEtapeCompleteAslDocument = DeepReadonly<Omit<GetEtapeDocumentsByEtapeIdAslDocument, 'id'> | null> +type IsEtapeCompleteEtapeAvis = DeepReadonly<Pick<EtapeAvis, 'avis_type_id'>[]> -// TODO 2024-04-17 utiliser toutes les stepIsComplete export const isEtapeComplete = ( - titreEtape: IsEtapeCompleteEtape, + etape: IsEtapeCompleteEtape, titreTypeId: TitreTypeId, demarcheTypeId: DemarcheTypeId, - documents: Pick<EtapeDocument, 'etape_document_type_id'>[], - entrepriseDocuments: Pick<EntrepriseDocument, 'entreprise_document_type_id'>[], - sdomZones: SDOMZoneId[] | null | undefined, - daeDocument: Omit<GetEtapeDocumentsByEtapeIdDaeDocument, 'id'> | null, - aslDocument: Omit<GetEtapeDocumentsByEtapeIdAslDocument, 'id'> | null, + documents: IsEtapeCompleteDocuments, + entrepriseDocuments: IsEtapeCompleteEntrepriseDocuments, + sdomZones: IsEtapeCompleteSdomZones, + communes: IsEtapeCompleteCommunes, + daeDocument: IsEtapeCompleteDaeDocument, + aslDocument: IsEtapeCompleteAslDocument, + etapeAvis: IsEtapeCompleteEtapeAvis, user: User ): { valid: true } | { valid: false; errors: NonEmptyArray<string> } => { - const errors: string[] = [] - const sections = getSections(titreTypeId, demarcheTypeId, titreEtape.typeId) - // les éléments non optionnel des sections sont renseignés - const hasAtLeasOneSectionMandatory: boolean = sections.some(section => { - return section.elements.some(element => (element.optionnel ?? true) === false) - }) - if (hasAtLeasOneSectionMandatory) { - if (isNotNullNorUndefined(titreEtape.contenu)) { - errors.push(...contenuCompleteValidate(sections, titreEtape.contenu)) - } else if (isNotNullNorUndefinedNorEmpty(titreEtape.sectionsWithValue)) { - errors.push(...sectionsWithValueCompleteValidate(titreEtape.sectionsWithValue)) - } else { - errors.push('les contenus ne sont pas présents dans l’étape alors que les sections ont des éléments obligatoires') + const isCompleteChecks = [ + dateTypeStepIsComplete(etape, user), + fondamentaleStepIsComplete(etape, demarcheTypeId, titreTypeId), + sectionsStepIsComplete(etape, demarcheTypeId, titreTypeId), + perimetreStepIsComplete(etape), + etapeDocumentsStepIsComplete(etape, demarcheTypeId, titreTypeId, documents, sdomZones ?? [], daeDocument, aslDocument, user), + entrepriseDocumentsStepIsComplete( + etape, + demarcheTypeId, + titreTypeId, + entrepriseDocuments.map(ed => ({ documentTypeId: ed.entreprise_document_type_id, entrepriseId: ed.entreprise_id })) + ), + etapeAvisStepIsComplete(etape, etapeAvis, titreTypeId, communes), + ] + const errors: string[] = isCompleteChecks.reduce<string[]>((acc, c) => { + if (!c.valid) { + acc.push(...c.errors) } - } - if (needAslAndDae({ etapeTypeId: titreEtape.typeId, demarcheTypeId, titreTypeId }, titreEtape.isBrouillon, user)) { - if (isNullOrUndefined(daeDocument)) { - errors.push('L’arrêté préfectoral de la mission autorité environnementale est obligatoire') - } - if (isNullOrUndefined(aslDocument)) { - errors.push('La lettre de décision du propriétaire du sol est obligatoire') - } - } + return acc + }, []) - let contenu = titreEtape.contenu - if (isNullOrUndefined(contenu) && isNotNullNorUndefinedNorEmpty(titreEtape.sectionsWithValue)) { - contenu = titreEtape.sectionsWithValue.reduce( - (accSection, section) => ({ ...accSection, [section.id]: section.elements.reduce((accElement, element) => ({ ...accElement, [element.id]: element.value }), {}) }), - {} - ) - } - const dts: DocumentType[] = getDocumentsTypes({ ...titreEtape }, demarcheTypeId, titreTypeId, sdomZones ?? [], contenu?.arm?.mecanise === true) - - const documentsErrors = isDocumentsComplete(documents ?? [], dts) - if (!documentsErrors.valid) { - errors.push(...documentsErrors.errors) + if (isNonEmptyArray(errors)) { + return { valid: false, errors } } - // les documents d'entreprise obligatoires sont tous présents - const entrepriseDocumentsTypes = getEntrepriseDocuments(titreTypeId, demarcheTypeId, titreEtape.typeId) - - const entrepriseDocumentsTypesIds: EntrepriseDocumentTypeId[] = [] - if (entrepriseDocuments.length) { - for (const entrepriseDocumentType of entrepriseDocuments) { - if (!entrepriseDocumentsTypes.map(({ id }) => id).includes(entrepriseDocumentType.entreprise_document_type_id)) { - errors.push(`impossible de lier un document d'entreprise de type ${entrepriseDocumentType.entreprise_document_type_id}`) - } - entrepriseDocumentsTypesIds.push(entrepriseDocumentType.entreprise_document_type_id) - } - } - entrepriseDocumentsTypes - .filter(({ optionnel }) => !optionnel) - .forEach(jt => { - if (!entrepriseDocumentsTypesIds.includes(jt.id)) { - errors.push(`le document d'entreprise « ${jt.nom} » obligatoire est manquant`) - } - }) + return { valid: true } +} - // Si c’est une demande d’AEX ou d’ARM, certaines informations sont obligatoires - if (titreEtape.typeId === 'mfr' && ['arm', 'axm'].includes(titreTypeId)) { - // le périmètre doit être défini - if (isNullOrUndefined(titreEtape.geojson4326Perimetre)) { - errors.push('le périmètre doit être renseigné') - } +type IsEtapeDeposableEtapeAvis = DeepReadonly<Pick<EtapeAvis | TempEtapeAvis, 'avis_type_id'>[]> +export const isEtapeDeposable = ( + user: User, + titreTypeId: TitreTypeId, + demarcheTypeId: DemarcheTypeId, + titreEtape: DeepReadonly<Pick<FlattenEtape, 'typeId' | 'date' | 'statutId' | 'duree' | 'contenu' | 'substances' | 'perimetre' | 'isBrouillon' | 'titulaires' | 'amodiataires'>>, + etapeDocuments: IsEtapeCompleteDocuments, + entrepriseDocuments: IsEtapeCompleteEntrepriseDocuments, + sdomZones: IsEtapeCompleteSdomZones, + communes: IsEtapeCompleteCommunes, + daeDocument: IsEtapeCompleteDaeDocument, + aslDocument: IsEtapeCompleteAslDocument, + etapeAvis: IsEtapeDeposableEtapeAvis +): boolean => { + if (titreEtape.isBrouillon === ETAPE_IS_BROUILLON) { + const complete = isEtapeComplete(titreEtape, titreTypeId, demarcheTypeId, etapeDocuments, entrepriseDocuments, sdomZones, communes, daeDocument, aslDocument, etapeAvis, user) + if (!complete.valid) { + console.warn(complete.errors) - // il doit exister au moins une substance - if (!titreEtape.substances || !titreEtape.substances.length || !titreEtape.substances.some(substanceId => !!substanceId)) { - errors.push('au moins une substance doit être renseignée') + return false } - } - - if ((isNullOrUndefined(titreEtape.duree) || titreEtape.duree === 0) && !dureeOptionalCheck(titreEtape.typeId, demarcheTypeId, titreTypeId)) { - errors.push('la durée doit être renseignée') - } - if (isNonEmptyArray(errors)) { - return { valid: false, errors } + return true } - return { valid: true } + return false } -export const isEtapeDeposable = ( +export const canDeposeEtape = ( user: User, titre: { typeId: TitreTypeId @@ -271,38 +254,28 @@ export const isEtapeDeposable = ( administrationsLocales: AdministrationId[] }, demarcheTypeId: DemarcheTypeId, - titreEtape: IsEtapeCompleteEtape, + titreEtape: DeepReadonly<Pick<FlattenEtape, 'typeId' | 'date' | 'statutId' | 'duree' | 'contenu' | 'substances' | 'perimetre' | 'isBrouillon' | 'titulaires' | 'amodiataires'>>, etapeDocuments: Pick<EtapeDocument, 'etape_document_type_id'>[], - entrepriseDocuments: Pick<EntrepriseDocument, 'entreprise_document_type_id'>[], + entrepriseDocuments: Pick<EntrepriseDocument, 'entreprise_document_type_id' | 'entreprise_id'>[], sdomZones: SDOMZoneId[] | null | undefined, + communes: CommuneId[], daeDocument: GetEtapeDocumentsByEtapeId['dae'], - aslDocument: GetEtapeDocumentsByEtapeId['asl'] + aslDocument: GetEtapeDocumentsByEtapeId['asl'], + etapeAvis: IsEtapeDeposableEtapeAvis ): boolean => { - if (titreEtape.typeId === ETAPES_TYPES.demande && titreEtape.isBrouillon) { - if ( - canCreateOrEditEtape( - user, - titreEtape.typeId, - titreEtape.isBrouillon, - titre.titulaires, - titre.administrationsLocales, - demarcheTypeId, - { typeId: titre.typeId, titreStatutId: titre.titreStatutId }, - 'modification' - ) - ) { - const complete = isEtapeComplete(titreEtape, titre.typeId, demarcheTypeId, etapeDocuments, entrepriseDocuments, sdomZones, daeDocument, aslDocument, user) - if (!complete.valid) { - console.warn(complete.errors) - - return false - } - - return true - } - } - - return false + return ( + isEtapeDeposable(user, titre.typeId, demarcheTypeId, titreEtape, etapeDocuments, entrepriseDocuments, sdomZones, communes, daeDocument, aslDocument, etapeAvis) && + canCreateOrEditEtape( + user, + titreEtape.typeId, + titreEtape.isBrouillon, + titre.titulaires, + titre.administrationsLocales, + demarcheTypeId, + { typeId: titre.typeId, titreStatutId: titre.titreStatutId }, + 'modification' + ) + ) } -export const canDeleteEtapeDocument = (isBrouillon: boolean): boolean => isBrouillon +export const canDeleteEtapeDocument = (isBrouillon: EtapeBrouillon): boolean => isBrouillon diff --git a/packages/common/src/rest.ts b/packages/common/src/rest.ts index d0e4b04c7..a9b812cdf 100644 --- a/packages/common/src/rest.ts +++ b/packages/common/src/rest.ts @@ -25,7 +25,15 @@ import { } from './titres.js' import { adminUserNotNullValidator, userValidator } from './roles.js' import { caminoAnneeValidator, caminoDateValidator } from './date.js' -import { etapeDocumentIdValidator, etapeIdOrSlugValidator, etapeIdValidator, etapeTypeEtapeStatutWithMainStepValidator, getEtapeDocumentsByEtapeIdValidator } from './etape.js' +import { + etapeDocumentIdValidator, + etapeIdOrSlugValidator, + etapeIdValidator, + etapeTypeEtapeStatutWithMainStepValidator, + getEtapeDocumentsByEtapeIdValidator, + getEtapeAvisByEtapeIdValidator, + etapeAvisIdValidator, +} from './etape.js' import { statistiquesDGTMValidator, statistiquesDataGouvValidator, @@ -52,6 +60,7 @@ import { import { titreIdOrSlugValidator, titreIdValidator } from './validators/titres.js' import { administrationIdValidator } from './static/administrations.js' import { administrationActiviteTypeEmailValidator } from './administrations.js' +import { flattenEtapeValidator, restEtapeCreationValidator, restEtapeModificationValidator } from './etape-form.js' type CaminoRoute<T extends string> = (keyof ZodParseUrlParams<T> extends never ? {} : { params: ZodParseUrlParams<T> }) & { get?: { output: ZodType } @@ -95,9 +104,11 @@ const IDS = [ '/rest/demarches/:demarcheId/geojson', '/rest/etapes/:etapeId/geojson', '/rest/etapes/:etapeId/etapeDocuments', + '/rest/etapes/:etapeId/etapeAvis', '/rest/etapes/:etapeId/entrepriseDocuments', - '/rest/etapes/:etapeId', + '/rest/etapes/:etapeIdOrSlug', '/rest/etapes/:etapeId/depot', + '/rest/etapes', '/rest/activites/:activiteId', '/rest/geojson/import/:geoSystemeId', '/rest/geojson_points/:geoSystemeId', @@ -109,6 +120,7 @@ const IDS = [ // NE PAS TOUCHER CES ROUTES, UTILISÉES PAR D'AUTRES '/download/fichiers/:documentId', '/download/entrepriseDocuments/:documentId', + '/download/avisDocument/:etapeAvisId', '/download/activiteDocuments/:documentId', '/fichiers/:documentId', '/titres/:id', @@ -177,9 +189,11 @@ export const CaminoRestRoutes = { '/rest/demarches/:demarcheId/geojson': { params: { demarcheId: demarcheIdOrSlugValidator }, get: { output: perimetreInformationsValidator } }, '/rest/etapes/:etapeId/geojson': { params: { etapeId: etapeIdOrSlugValidator }, get: { output: perimetreInformationsValidator } }, '/rest/etapes/:etapeId/etapeDocuments': { params: { etapeId: etapeIdValidator }, get: { output: getEtapeDocumentsByEtapeIdValidator } }, + '/rest/etapes/:etapeId/etapeAvis': { params: { etapeId: etapeIdValidator }, get: { output: getEtapeAvisByEtapeIdValidator } }, '/rest/etapes/:etapeId/entrepriseDocuments': { params: { etapeId: etapeIdValidator }, get: { output: z.array(etapeEntrepriseDocumentValidator) } }, - '/rest/etapes/:etapeId': { params: { etapeId: etapeIdValidator }, delete: true }, + '/rest/etapes/:etapeIdOrSlug': { params: { etapeIdOrSlug: etapeIdOrSlugValidator }, delete: true, get: { output: flattenEtapeValidator } }, '/rest/etapes/:etapeId/depot': { params: { etapeId: etapeIdValidator }, put: { input: z.void(), output: z.void() } }, + '/rest/etapes': { post: { input: restEtapeCreationValidator, output: etapeIdValidator }, put: { input: restEtapeModificationValidator, output: etapeIdValidator } }, '/rest/activites/:activiteId': { params: { activiteId: activiteIdOrSlugValidator }, get: { output: activiteValidator }, put: { input: activiteEditionValidator, output: z.void() }, delete: true }, '/rest/communes': { get: { output: z.array(communeValidator) } }, '/rest/geojson_points/:geoSystemeId': { params: { geoSystemeId: geoSystemeIdValidator }, post: { input: featureCollectionPointsValidator, output: featureCollectionPointsValidator } }, @@ -198,6 +212,7 @@ export const CaminoRestRoutes = { '/deconnecter': { get: { output: z.string() } }, '/changerMotDePasse': { get: { output: z.string() } }, '/download/fichiers/:documentId': { params: { documentId: etapeDocumentIdValidator }, newDownload: true }, + '/download/avisDocument/:etapeAvisId': { params: { etapeAvisId: etapeAvisIdValidator }, newDownload: true }, '/download/entrepriseDocuments/:documentId': { params: { documentId: entrepriseDocumentIdValidator }, newDownload: true }, '/download/activiteDocuments/:documentId': { params: { documentId: activiteDocumentIdValidator }, newDownload: true }, '/fichiers/:documentId': { params: { documentId: etapeDocumentIdValidator }, newDownload: true }, diff --git a/packages/common/src/sections.test.ts b/packages/common/src/sections.test.ts new file mode 100644 index 000000000..cc143bd92 --- /dev/null +++ b/packages/common/src/sections.test.ts @@ -0,0 +1,62 @@ +import { test, expect } from 'vitest' +import { simpleContenuToFlattenedContenu } from './sections' +import { caminoDateValidator } from './date' + +test('simpleContenuToFlattenedContenu', () => { + expect( + simpleContenuToFlattenedContenu( + 'arm', + 'oct', + 'mfr', + { arm: { mecanise: true } }, + { arm: { mecanise: { actif: true, etape: { date: caminoDateValidator.parse('2023-02-02'), typeId: 'mfr', contenu: { arm: { mecanise: false } } } } } } + ) + ).toMatchInlineSnapshot(` + { + "arm": { + "franchissements": { + "etapeHeritee": null, + "heritee": false, + "value": null, + }, + "mecanise": { + "etapeHeritee": { + "date": "2023-02-02", + "etapeTypeId": "mfr", + "value": false, + }, + "heritee": true, + "value": false, + }, + }, + } + `) + expect( + simpleContenuToFlattenedContenu( + 'arm', + 'oct', + 'mfr', + { arm: { mecanise: true } }, + { arm: { mecanise: { actif: false, etape: { date: caminoDateValidator.parse('2023-02-02'), typeId: 'mfr', contenu: { arm: { mecanise: false } } } } } } + ) + ).toMatchInlineSnapshot(` + { + "arm": { + "franchissements": { + "etapeHeritee": null, + "heritee": false, + "value": null, + }, + "mecanise": { + "etapeHeritee": { + "date": "2023-02-02", + "etapeTypeId": "mfr", + "value": false, + }, + "heritee": false, + "value": true, + }, + }, + } + `) +}) diff --git a/packages/common/src/sections.ts b/packages/common/src/sections.ts index d6e0c96bf..897a9294f 100644 --- a/packages/common/src/sections.ts +++ b/packages/common/src/sections.ts @@ -4,6 +4,7 @@ import { checkboxElementValidator, checkboxesElementValidator, dateElementValidator, + getSections, numberElementValidator, radioElementValidator, selectElementWithOptionsValidator, @@ -12,6 +13,10 @@ import { } from './static/titresTypes_demarchesTypes_etapesTypes/sections.js' import { z } from 'zod' import { DeepReadonly, isNotNullNorUndefined } from './typescript-tools.js' +import { TitreTypeId } from './static/titresTypes.js' +import { DemarcheTypeId } from './static/demarchesTypes.js' +import { EtapeTypeId } from './static/etapesTypes.js' +import { EtapeContenu, FlattenEtape, FlattenedContenu, RestEtapeCreation, HeritageContenu } from './etape-form.js' const dateElementWithValueValidator = dateElementValidator.extend({ value: caminoDateValidator.nullable() }) @@ -19,7 +24,8 @@ const textElementWithValueValidator = textElementValidator.extend({ value: z.str const urlElementWithValueValidator = urlElementValidator.extend({ value: z.string().nullable() }) -const numberElementWithValueValidator = numberElementValidator.extend({ value: z.number().nullable() }) +export const numberElementValueValidator = z.number().nonnegative().nullable() +const numberElementWithValueValidator = numberElementValidator.extend({ value: numberElementValueValidator }) type NumberElementWithValue = z.infer<typeof numberElementWithValueValidator> const radioElementWithValueValidator = radioElementValidator.extend({ value: z.boolean().nullable() }) @@ -92,3 +98,50 @@ export const valeurFind = (element: ElementWithValue): string | '–' => { return element.value } + +export const simpleContenuToFlattenedContenu = ( + titreTypeId: TitreTypeId, + demarcheTypeId: DemarcheTypeId, + etapeTypeId: EtapeTypeId, + contenu: EtapeContenu, + heritageContenu: HeritageContenu +): FlattenedContenu => { + const sections = getSections(titreTypeId, demarcheTypeId, etapeTypeId) + + return sections.reduce<FlattenedContenu>((accSection, section) => { + accSection[section.id] = section.elements.reduce<FlattenedContenu[string]>((accElement, element) => { + const elementHeritage = heritageContenu[section.id]?.[element.id] ?? { actif: false, etape: null } + const value = elementHeritage.actif ? elementHeritage.etape?.contenu[section.id]?.[element.id] ?? null : contenu?.[section.id]?.[element.id] ?? null + accElement[element.id] = { + value, + heritee: elementHeritage.actif, + etapeHeritee: isNotNullNorUndefined(elementHeritage.etape) + ? { + etapeTypeId: elementHeritage.etape.typeId, + date: elementHeritage.etape.date, + value: elementHeritage.etape.contenu[section.id]?.[element.id] ?? null, + } + : null, + } + + return accElement + }, {}) + + return accSection + }, {}) +} + +export const flattenContenuToSimpleContenu = (flattenContenu: FlattenEtape['contenu']): RestEtapeCreation['contenu'] => { + return Object.keys(flattenContenu).reduce<RestEtapeCreation['contenu']>((sectionsAcc, section) => { + sectionsAcc = { + ...sectionsAcc, + [section]: Object.keys(flattenContenu[section]).reduce<RestEtapeCreation['contenu'][string]>((elementsAcc, element) => { + elementsAcc = { ...elementsAcc, [element]: flattenContenu[section][element].value } + + return elementsAcc + }, {}), + } + + return sectionsAcc + }, {}) +} diff --git a/packages/common/src/static/activitesTypes.ts b/packages/common/src/static/activitesTypes.ts index 1e5157f8b..e1ed7fe23 100644 --- a/packages/common/src/static/activitesTypes.ts +++ b/packages/common/src/static/activitesTypes.ts @@ -81,6 +81,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2018-01-01'), description: 'Masse d’or brut en sortie de mine extrait au cours du trimestre (exemple : masse sous la forme de concentré gravimétrique).', + optionnel: false, }, { id: 'orExtrait', @@ -88,6 +89,7 @@ export const ActivitesTypes: { type: 'number', dateFin: toCaminoDate('2018-01-01'), description: "Masse d'or brut en sortie de mine, ou nette obtenue après traitement métallurgique, extrait au cours du trimestre.", + optionnel: false, }, { id: 'volumeMinerai', @@ -95,12 +97,14 @@ export const ActivitesTypes: { type: 'number', dateFin: toCaminoDate('2018-01-01'), description: 'Volume en mètre cube de minerai extrait au cours du trimestre.', + optionnel: false, }, { id: 'mercure', nom: 'Mercure récupéré (g)', type: 'number', description: 'Masse en gramme de l’ensemble des produits contaminés envoyés en traitement au cours du trimestre.', + optionnel: false, }, { id: 'carburantDetaxe', @@ -108,12 +112,14 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2018-01-01'), description: 'Volume total en litre de carburant détaxé consommé au cours du trimestre par les travaux réalisés sur le chantier.', + optionnel: false, }, { id: 'carburantConventionnel', nom: 'Carburant conventionnel (l)', type: 'number', description: 'Volume total en litre de carburant conventionnel consommé au cours du trimestre par les travaux réalisés sur le chantier.', + optionnel: false, }, { id: 'pompes', @@ -121,6 +127,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2018-01-01'), description: 'Nombre moyen de pompes actives au cours du trimestre utilisées sur le chantier (pompe à gravier, pompe de relevage…).', + optionnel: false, }, { id: 'pelles', @@ -128,12 +135,14 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2018-01-01'), description: 'Nombre moyen de pelles actives au cours du trimestre utilisées sur le chantier (aménagement, exploitation, réhabilitation).', + optionnel: false, }, { id: 'effectifs', nom: 'Effectifs', type: 'number', description: 'Nombre moyen de salariés sur le chantier au cours du trimestre.', + optionnel: false, }, { id: 'depensesTotales', @@ -141,6 +150,7 @@ export const ActivitesTypes: { type: 'number', dateFin: toCaminoDate('2018-01-01'), description: "Montant en euros des dépenses sur l'exploitation.", + optionnel: false, }, { id: 'environnement', @@ -149,6 +159,7 @@ export const ActivitesTypes: { dateDebut: toCaminoDate('2018-01-01'), description: 'Montant en euros des investissements consentis au cours du trimestre listés à l’<a href="https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000021850940&cidTexte=LEGITEXT000006069569" target="_blank" title="Page de l’article - site externe" rel="noopener noreferrer">article 318 C de l’annexe II du code général des impôts</a>. Afin de bénéficier des déductions fiscales afférentes, les justificatifs attestant de la réalisation effective des investissements sont susceptibles de vous êtres demandés par l’administration.', + optionnel: false, }, ], }, @@ -184,6 +195,7 @@ export const ActivitesTypes: { ], dateDebut: toCaminoDate('2018-01-01'), periodeId: 1, + optionnel: false, }, { id: '2', @@ -213,6 +225,7 @@ export const ActivitesTypes: { ], dateDebut: toCaminoDate('2018-01-01'), periodeId: 1, + optionnel: false, }, { id: '3', @@ -242,6 +255,7 @@ export const ActivitesTypes: { ], dateDebut: toCaminoDate('2018-01-01'), periodeId: 1, + optionnel: false, }, { id: '4', @@ -271,6 +285,7 @@ export const ActivitesTypes: { ], dateDebut: toCaminoDate('2018-01-01'), periodeId: 2, + optionnel: false, }, { id: '5', @@ -300,6 +315,7 @@ export const ActivitesTypes: { ], dateDebut: toCaminoDate('2018-01-01'), periodeId: 2, + optionnel: false, }, { id: '6', @@ -329,6 +345,7 @@ export const ActivitesTypes: { ], dateDebut: toCaminoDate('2018-01-01'), periodeId: 2, + optionnel: false, }, { id: '7', @@ -358,6 +375,7 @@ export const ActivitesTypes: { ], dateDebut: toCaminoDate('2018-01-01'), periodeId: 3, + optionnel: false, }, { id: '8', @@ -387,6 +405,7 @@ export const ActivitesTypes: { ], dateDebut: toCaminoDate('2018-01-01'), periodeId: 3, + optionnel: false, }, { id: '9', @@ -416,6 +435,7 @@ export const ActivitesTypes: { ], dateDebut: toCaminoDate('2018-01-01'), periodeId: 3, + optionnel: false, }, { id: '10', @@ -445,6 +465,7 @@ export const ActivitesTypes: { ], dateDebut: toCaminoDate('2018-01-01'), periodeId: 4, + optionnel: false, }, { id: '11', @@ -474,6 +495,7 @@ export const ActivitesTypes: { ], dateDebut: toCaminoDate('2018-01-01'), periodeId: 4, + optionnel: false, }, { id: '12', @@ -503,6 +525,7 @@ export const ActivitesTypes: { ], dateDebut: toCaminoDate('2018-01-01'), periodeId: 4, + optionnel: false, }, ], }, @@ -674,6 +697,7 @@ export const ActivitesTypes: { }, ], dateDebut: toCaminoDate('2019-01-01'), + optionnel: false, }, { id: 'surfaceLevesSpectrometrie', @@ -706,6 +730,7 @@ export const ActivitesTypes: { }, ], dateDebut: toCaminoDate('2019-01-01'), + optionnel: false, }, { id: 'surfaceLevesPolarisationProvoquee', @@ -738,6 +763,7 @@ export const ActivitesTypes: { }, ], dateDebut: toCaminoDate('2019-01-01'), + optionnel: false, }, { id: 'surfaceLevesSismiques', @@ -770,6 +796,7 @@ export const ActivitesTypes: { }, ], dateDebut: toCaminoDate('2019-01-01'), + optionnel: false, }, { id: 'surfaceLevesConductivite', @@ -802,6 +829,7 @@ export const ActivitesTypes: { }, ], dateDebut: toCaminoDate('2019-01-01'), + optionnel: false, }, { id: 'surfaceLevesAutre', @@ -834,6 +862,7 @@ export const ActivitesTypes: { }, ], dateDebut: toCaminoDate('2019-01-01'), + optionnel: false, }, { id: 'complementLevesGeochimie', @@ -1043,6 +1072,7 @@ export const ActivitesTypes: { nom: 'autres', }, ], + optionnel: false, }, { id: 'complementAnalyses', @@ -1090,6 +1120,7 @@ export const ActivitesTypes: { ], dateDebut: toCaminoDate('2019-01-01'), description: 'Nature des études effectuées', + optionnel: false, }, { id: 'complementEtudes', @@ -1120,6 +1151,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Montant en euros de l'ensemble des dépenses effectuées au cours de l'année", + optionnel: false, }, ], }, @@ -1133,6 +1165,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Montant en euros des dépenses de levés topographiques au cours de l'année", + optionnel: false, }, ], }, @@ -1146,6 +1179,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Montant en euros des dépenses de cartographie géologique au cours de l'année", + optionnel: false, }, ], }, @@ -1159,6 +1193,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Montant en euros des dépenses de levés géochimiques au cours de l'année", + optionnel: false, }, ], }, @@ -1172,6 +1207,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Montant en euros des dépenses de levés géophysique au cours de l'année", + optionnel: false, }, ], }, @@ -1185,6 +1221,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Montant en euros des dépenses de tranchées et puits au cours de l'année", + optionnel: false, }, ], }, @@ -1198,6 +1235,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Montant en euros des dépenses de sondages tarières au cours de l'année", + optionnel: false, }, { id: 'depensesLevesSondagesDestructifs', @@ -1205,6 +1243,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Montant en euros des dépenses de sondages destructifs au cours de l'année", + optionnel: false, }, { id: 'depensesLevesSondagesCarottés', @@ -1212,6 +1251,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Montant en euros des dépenses de sondages carottés au cours de l'année", + optionnel: false, }, ], }, @@ -1225,6 +1265,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Montant en euros des dépenses d'analyses multi-éléments au cours de l'année", + optionnel: false, }, { id: 'depensesTraitementMineralurgiques', @@ -1232,6 +1273,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Montant en euros des dépenses de traitements minéralurgiques au cours de l'année", + optionnel: false, }, ], }, @@ -1245,6 +1287,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Montant en euros des dépenses d'études environnementales au cours de l'année", + optionnel: false, }, { id: 'depensesEtudeEconomiquePreliminaire', @@ -1252,6 +1295,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Montant en euros des dépenses d'étude économique préliminaire au cours de l'année", + optionnel: false, }, { id: 'depensesEtudeEconomiquePreFaisabilite', @@ -1259,6 +1303,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Montant en euros des dépenses d'étude économique pré-faisabilité au cours de l'année", + optionnel: false, }, { id: 'depensesEtudeEconomiqueFaisabilité', @@ -1266,6 +1311,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Montant en euros des dépenses d'étude économique faisabilité au cours de l'année", + optionnel: false, }, { id: 'depensesEtudeSociale', @@ -1273,6 +1319,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Montant en euros des dépenses d'étude environnementales au cours de l'année", + optionnel: false, }, { id: 'depensesEtudessautres', @@ -1280,6 +1327,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Montant en euros des dépenses d'études autres au cours de l'année", + optionnel: false, }, ], }, @@ -1294,6 +1342,7 @@ export const ActivitesTypes: { dateDebut: toCaminoDate('2019-01-01'), description: 'Montant en euros des investissements consentis au cours de l\'année listés à l’<a href="https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000021850940&cidTexte=LEGITEXT000006069569" target="_blank" title="Page de l’article - site externe" rel="noopener noreferrer">article 318 C de l’annexe II du code général des impôts</a>. Afin de bénéficier des déductions fiscales afférentes, les justificatifs attestant de la réalisation effective des investissements sont susceptibles de vous être demandés par l’administration.', + optionnel: false, }, ], }, @@ -1307,6 +1356,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Montant en euros des dépenses de communication et frais d'organisation de réunions publiques au cours de l'année", + optionnel: false, }, ], }, @@ -1320,6 +1370,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Montant en euros des autres dépenses au cours de l'année", + optionnel: false, }, { id: 'texte', @@ -1349,12 +1400,14 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Volume total en litre de carburant détaxé consommé au cours de l'année par les travaux réalisés sur le chantier.", + optionnel: false, }, { id: 'carburantConventionnel', nom: 'Carburant conventionnel (l)', type: 'number', description: "Volume total en litre de carburant conventionnel consommé au cours de l'année par les travaux réalisés sur le chantier.", + optionnel: false, }, { id: 'pompes', @@ -1362,6 +1415,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "<b>Dans le cas d'un chantier alluvionnaire</b>, nombre d'heure de fonctionnement de pompes au cours de l'année sur le chantier (pompe à gravier, pompe de relevage…).", + optionnel: false, }, { id: 'pelles', @@ -1370,18 +1424,21 @@ export const ActivitesTypes: { dateDebut: toCaminoDate('2019-01-01'), description: "<b>Dans le cas d'un chantier alluvionnaire</b>, nombre d'heure de fonctionnement de pelles mécaniques au cours de l'année sur le chantier (aménagement, exploitation, réhabilitation).", + optionnel: false, }, { id: 'mercure', nom: 'Mercure récupéré (g)', type: 'number', description: "<b>En Guyane</b>, masse en gramme de l’ensemble des produits contaminés au mercure envoyés en traitement au cours de l'année.", + optionnel: false, }, { id: 'surfaceDeforestee', nom: 'Surface déforestée (km²)', type: 'number', description: "Surface déforestée en kilomètre carré au cours de l'année.", + optionnel: false, }, ], }, @@ -1418,6 +1475,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Nombre total de salariés de l'entreprise affectés aux activités sur le titre minier.", + optionnel: false, }, { id: 'etpDirectsTotal', @@ -1425,6 +1483,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Nombre total d'équivalents temps plein salariés de l'entreprise affectés aux activités sur le titre minier.", + optionnel: false, }, { id: 'emploisDirectsResidents', @@ -1432,6 +1491,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Nombre de salariés de l'entreprise, <b>français ou étrangers, résidant fiscalement dans le département</b>, affectés aux activités sur le titre minier.", + optionnel: false, }, { id: 'etpDirectsResidents', @@ -1440,6 +1500,7 @@ export const ActivitesTypes: { dateDebut: toCaminoDate('2019-01-01'), description: "Nombre d'équivalents temps plein salariés de l'entreprise, occupés par des <b>français ou étrangers, résidant fiscalement dans le département</b>, affectés aux activités sur le titre minier.", + optionnel: false, }, { id: 'emploisDirectsFr', @@ -1447,6 +1508,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Nombre d'employés de <b>nationalité française</b> salariés de l'entreprise affectés aux activités sur le titre minier.", + optionnel: false, }, { id: 'etpDirectsFr', @@ -1454,6 +1516,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Nombre d'équivalents temps plein salariés de l'entreprise occupés par des personnes de <b>nationalité française</b> affectés aux activités sur le titre minier.", + optionnel: false, }, ], }, @@ -1467,6 +1530,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Nombre total d'emplois salariés des sous-traitants et prestataires affectés aux activités sur le titre minier.", + optionnel: false, }, { id: 'etpIndirectsTotal', @@ -1474,6 +1538,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Nombre total d'équivalents temps plein salariés des sous-traitants et prestataires, affectés aux activités sur le titre minier.", + optionnel: false, }, { id: 'emploisIndirectsResidents', @@ -1481,6 +1546,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: 'Nombre de salariés des sous-traitants et prestataires, <b>résidant fiscalement dans le département</b>, affectés aux activités sur le titre minier.', + optionnel: false, }, { id: 'etpIndirectsResidents', @@ -1488,6 +1554,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Nombre d'équivalents temps plein des sous-traitants et prestataires, <b>résidant fiscalement dans le département</b>, affectés aux activités sur le titre minier.", + optionnel: false, }, { id: 'emploisIndirectsFr', @@ -1495,6 +1562,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Nombre d'employés de <b>nationalité française</b> salariés des sous-traitants et prestataires de l'entreprise, affectés aux activités sur le titre minier.", + optionnel: false, }, { id: 'etpIndirectsFr', @@ -1503,6 +1571,7 @@ export const ActivitesTypes: { dateDebut: toCaminoDate('2019-01-01'), description: "Nombre d'équivalents temps plein occupés par des personnes de <b>nationalité française</b> salariées des sous-traitants et prestataires de l'entreprise, affectées aux activités sur le titre minier.", + optionnel: false, }, ], }, @@ -1516,6 +1585,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Nombre de réunions publiques consacrées aux projets sur le titre minier organisées au cours de l'année", + optionnel: false, }, { id: 'priseContact', @@ -1523,6 +1593,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Nombre de rendez-vous avec les parties prenantes concernées par le titre minier organisés au cours de l'année", + optionnel: false, }, { id: 'communicationLocale', @@ -1530,6 +1601,7 @@ export const ActivitesTypes: { type: 'number', dateDebut: toCaminoDate('2019-01-01'), description: "Nombre d'actions de communication menées par le titulaire du titre à destination du public (hors publication et communication à destination des marchés) au cours de l'année", + optionnel: false, }, ], }, @@ -1564,6 +1636,7 @@ export const ActivitesTypes: { nom: 'Volume de granulats marins extrait (m3)', type: 'number', description: "Volume de granulats marins extrait, en mètre cube, au cours de l'année.", + optionnel: false, }, ], }, diff --git a/packages/common/src/static/administrationsTitresTypesEtapesTypes.ts b/packages/common/src/static/administrationsTitresTypesEtapesTypes.ts index cede2c184..0ed9d80ed 100644 --- a/packages/common/src/static/administrationsTitresTypesEtapesTypes.ts +++ b/packages/common/src/static/administrationsTitresTypesEtapesTypes.ts @@ -41,14 +41,13 @@ const AdministrationsTitresTypesEtapesTypes: { [TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX]: { [ETAPES_TYPES.avisDeLaCommissionDesAutorisationsDeRecherchesMinieres_CARM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avenantALautorisationDeRechercheMiniere]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLOfficeNationalDesForets]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, + [ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.classementSansSuite]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.decisionDeLaMissionAutoriteEnvironnementale_ExamenAuCasParCasDuProjet_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.decisionDeLOfficeNationalDesForets]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.desistementDuDemandeur]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.expertiseDREALOuDGTMServiceEau]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.expertiseDGTMServicePreventionDesRisquesEtIndustriesExtractives_DATE_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.expertiseDeLOfficeNationalDesForets]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.expertiseDREALOuDGTMServiceBiodiversite]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demandeDeComplements_RecepisseDeDeclarationLoiSurLeau_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demandeDeComplements_DecisionDeLaMissionAutoriteEnvironnementale_ExamenAuCasParCasDuProjet_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, @@ -60,9 +59,7 @@ const AdministrationsTitresTypesEtapesTypes: { [ETAPES_TYPES.enregistrementDeLaDemande]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.priseEnChargeParLOfficeNationalDesForets]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demande]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.demandeDinformations_AvisDeLOfficeNationalDesForets_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demandeDinformations]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.demandeDinformations_ExpertiseDeLOfficeNationalDesForets_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.notificationAuDemandeur_AjournementDeLaCARM_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.notificationAuDemandeur_AvisFavorableDeLaCARM_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.notificationAuDemandeur_ClassementSansSuite_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, @@ -80,7 +77,6 @@ const AdministrationsTitresTypesEtapesTypes: { [ETAPES_TYPES.recepisseDeDeclarationLoiSurLeau]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.receptionDinformation]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.receptionDinformation_RecevabiliteDeLaDemande_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.receptionDinformation_ExpertiseDeLOfficeNationalDesForets_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.saisineDeLaCommissionDesAutorisationsDeRecherchesMinieres_CARM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.signatureDeLautorisationDeRechercheMiniere]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.validationDuPaiementDesFraisDeDossierComplementaires]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, @@ -91,12 +87,11 @@ const AdministrationsTitresTypesEtapesTypes: { [TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX]: { [ETAPES_TYPES.avisDeLaCommissionDesAutorisationsDeRecherchesMinieres_CARM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avenantALautorisationDeRechercheMiniere]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLOfficeNationalDesForets]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, + [ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.classementSansSuite]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.decisionDeLaMissionAutoriteEnvironnementale_ExamenAuCasParCasDuProjet_]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false }, [ETAPES_TYPES.decisionDeLOfficeNationalDesForets]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.desistementDuDemandeur]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.expertiseDeLOfficeNationalDesForets]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demandeDeComplements_RecepisseDeDeclarationLoiSurLeau_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demandeDeComplements_DecisionDeLaMissionAutoriteEnvironnementale_ExamenAuCasParCasDuProjet_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demandeDeComplements_CompletudeDeLaDemande_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, @@ -108,10 +103,8 @@ const AdministrationsTitresTypesEtapesTypes: { [ETAPES_TYPES.enregistrementDeLaDemande]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.priseEnChargeParLOfficeNationalDesForets]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demande]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.demandeDinformations_AvisDeLOfficeNationalDesForets_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demandeDinformations]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demandeDinformations_RecevabiliteDeLaDemande_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.demandeDinformations_ExpertiseDeLOfficeNationalDesForets_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.notificationAuDemandeur_AjournementDeLaCARM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.notificationAuDemandeur_AvisFavorableDeLaCARM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.notificationAuDemandeur_ClassementSansSuite_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, @@ -128,10 +121,8 @@ const AdministrationsTitresTypesEtapesTypes: { [ETAPES_TYPES.receptionDeComplements]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.receptionDeComplements_SaisineDeLaCARM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.recepisseDeDeclarationLoiSurLeau]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.receptionDinformation_AvisDeLOfficeNationalDesForets_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.receptionDinformation]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.receptionDinformation_RecevabiliteDeLaDemande_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.receptionDinformation_ExpertiseDeLOfficeNationalDesForets_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.saisineDeLaCommissionDesAutorisationsDeRecherchesMinieres_CARM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.signatureDeLautorisationDeRechercheMiniere]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.validationDuPaiementDesFraisDeDossierComplementaires]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, @@ -142,11 +133,10 @@ const AdministrationsTitresTypesEtapesTypes: { [TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX]: { [ETAPES_TYPES.avisDeLaCommissionDesAutorisationsDeRecherchesMinieres_CARM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avenantALautorisationDeRechercheMiniere]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLOfficeNationalDesForets]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, + [ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.classementSansSuite]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.decisionDeLOfficeNationalDesForets]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.desistementDuDemandeur]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.expertiseDeLOfficeNationalDesForets]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.completudeDeLaDemande]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.recevabiliteDeLaDemande]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.depotDeLaDemande]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, @@ -266,7 +256,6 @@ const AdministrationsTitresTypesEtapesTypes: { [ETAPES_TYPES.abrogationDeLaDecision]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisDuConseilGeneralDeLeconomie_CGE_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.decisionDuJugeAdministratif]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLOfficeNationalDesForets]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisDeLaCommissionDepartementaleDesMines_CDM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.publicationDeLavisDeDecisionImplicite]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.classementSansSuite]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, @@ -322,7 +311,6 @@ const AdministrationsTitresTypesEtapesTypes: { [ETAPES_TYPES.abrogationDeLaDecision]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisDuConseilGeneralDeLeconomie_CGE_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.decisionDuJugeAdministratif]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLOfficeNationalDesForets]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisDeLaCommissionDepartementaleDesMines_CDM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.publicationDeLavisDeDecisionImplicite]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.classementSansSuite]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, @@ -378,7 +366,6 @@ const AdministrationsTitresTypesEtapesTypes: { [ETAPES_TYPES.abrogationDeLaDecision]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisDuConseilGeneralDeLeconomie_CGE_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.decisionDuJugeAdministratif]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLOfficeNationalDesForets]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisDeLaCommissionDepartementaleDesMines_CDM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.publicationDeLavisDeDecisionImplicite]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.classementSansSuite]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, @@ -434,7 +421,6 @@ const AdministrationsTitresTypesEtapesTypes: { [ETAPES_TYPES.abrogationDeLaDecision]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisDuConseilGeneralDeLeconomie_CGE_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.decisionDuJugeAdministratif]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLOfficeNationalDesForets]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisDeLaCommissionDepartementaleDesMines_CDM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.publicationDeLavisDeDecisionImplicite]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.classementSansSuite]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, @@ -463,14 +449,13 @@ const AdministrationsTitresTypesEtapesTypes: { [TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX]: { [ETAPES_TYPES.avisDeLaCommissionDesAutorisationsDeRecherchesMinieres_CARM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avenantALautorisationDeRechercheMiniere]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLOfficeNationalDesForets]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, + [ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.classementSansSuite]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.decisionDeLaMissionAutoriteEnvironnementale_ExamenAuCasParCasDuProjet_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.decisionDeLOfficeNationalDesForets]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.desistementDuDemandeur]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.expertiseDREALOuDGTMServiceEau]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.expertiseDGTMServicePreventionDesRisquesEtIndustriesExtractives_DATE_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.expertiseDeLOfficeNationalDesForets]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demandeDeComplements_RecepisseDeDeclarationLoiSurLeau_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demandeDeComplements_DecisionDeLaMissionAutoriteEnvironnementale_ExamenAuCasParCasDuProjet_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demandeDeComplements_CompletudeDeLaDemande_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, @@ -482,10 +467,8 @@ const AdministrationsTitresTypesEtapesTypes: { [ETAPES_TYPES.enregistrementDeLaDemande]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.priseEnChargeParLOfficeNationalDesForets]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demande]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.demandeDinformations_AvisDeLOfficeNationalDesForets_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demandeDinformations]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demandeDinformations_RecevabiliteDeLaDemande_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.demandeDinformations_ExpertiseDeLOfficeNationalDesForets_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.notificationAuDemandeur_AjournementDeLaCARM_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.notificationAuDemandeur_AvisFavorableDeLaCARM_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.notificationAuDemandeur_ClassementSansSuite_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, @@ -502,40 +485,26 @@ const AdministrationsTitresTypesEtapesTypes: { [ETAPES_TYPES.receptionDeComplements]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.receptionDeComplements_SaisineDeLaCARM_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.recepisseDeDeclarationLoiSurLeau]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.receptionDinformation_AvisDeLOfficeNationalDesForets_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.receptionDinformation]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.receptionDinformation_RecevabiliteDeLaDemande_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.receptionDinformation_ExpertiseDeLOfficeNationalDesForets_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.saisineDeLaCommissionDesAutorisationsDeRecherchesMinieres_CARM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.signatureDeLautorisationDeRechercheMiniere]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.validationDuPaiementDesFraisDeDossierComplementaires]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.validationDuPaiementDesFraisDeDossier]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, }, [TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX]: { - [ETAPES_TYPES.avisDeDirectionRegionaleDesAffairesCulturelles]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLaDirectionDalimentationDeLagricultureEtDeLaForet]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, + [ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.abrogationDeLaDecision]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDGTMServiceMilieuxNaturelsBiodiversiteSitesEtPaysages_MNBST_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLaDirectionDesEntreprisesDeLaConcurrenceDeLaConsommationDuTravailEtDeLemploi]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLaDirectionRegionaleDesFinancesPubliques]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLaGendarmerieNationale]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisDunMaire]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.decisionDuJugeAdministratif]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLOfficeNationalDesForets]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLetatMajorOrpaillageEtPecheIllicite_EMOPI_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisDeLaCommissionDepartementaleDesMines_CDM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLagenceRegionaleDeSante]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.decisionDuProprietaireDuSol]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLaCaisseGeneraleDeSecuriteSociale]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDGTMServiceAmenagementUrbanismeConstructionLogement_AUCL_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.confirmationDeLaccordDuProprietaireDuSol]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.classementSansSuite]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.decisionDeLaMissionAutoriteEnvironnementale_ExamenAuCasParCasDuProjet_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.desistementDuDemandeur]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.decisionDeLadministration]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.decisionImplicite]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.expertiseDeLOfficeNationalDesForets]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.informationsHistoriquesIncompletes]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demandeDeComplements_RecevabiliteDeLaDemande_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demandeDeComplements]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, @@ -545,7 +514,6 @@ const AdministrationsTitresTypesEtapesTypes: { [ETAPES_TYPES.demande]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demandeDinformations_AvisDuDREALDEALOuDGTM_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demandeDinformations]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.demandeDinformations_ExpertiseDeLOfficeNationalDesForets_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.notificationAuDemandeur]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.modificationDeLaDemande]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.modificationDeLaDemande_DecisionDeLaMissionAutoriteEnvironnementale_ExamenAuCasParCasDuProjet_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, @@ -556,29 +524,22 @@ const AdministrationsTitresTypesEtapesTypes: { [ETAPES_TYPES.receptionDeComplements]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.receptionDinformation_AvisDuDREALDEALOuDGTM_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.receptionDinformation]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.receptionDinformation_ExpertiseDeLOfficeNationalDesForets_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.publicationDeDecisionAuRecueilDesActesAdministratifs]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.saisineDeLautoriteSignataire]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.saisineDesCollectivitesLocales]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.saisineDeLaCommissionDepartementaleDesMines_CDM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.saisineDesServices]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, }, [TITRES_TYPES_IDS.CONCESSION_METAUX]: { [ETAPES_TYPES.abrogationDeLaDecision]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisDuConseilGeneralDeLeconomie_CGE_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisDuneCollectiviteLocale]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisDunPresidentDEPCI]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLIfremer]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, + [ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisDunMaire]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDuParcNaturelMarin]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.decisionDuJugeAdministratif]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisDeMiseEnConcurrenceAuJORF]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLInstitutNationalDeLorigineEtDeLaQualite]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisDuConseilDEtat]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDunServiceAdministratifLocal]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLautoriteMilitaire]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDuParcNational]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisDeLaCommissionDepartementaleDesMines_CDM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisDuPrefet]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.classementSansSuite]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, @@ -601,7 +562,6 @@ const AdministrationsTitresTypesEtapesTypes: { [ETAPES_TYPES.notificationDesCollectivitesLocales]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.noteInterneSignalee]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.notificationAuPrefet]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDuParcNaturelRegional]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.publicationDansUnJournalLocalOuNational]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.rapportDuConseilGeneralDeLeconomie_CGE_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.receptionDeComplements]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, @@ -614,7 +574,6 @@ const AdministrationsTitresTypesEtapesTypes: { [ETAPES_TYPES.saisineDuConseilDEtat]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.saisineDeLaCommissionDepartementaleDesMines_CDM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.saisineDuPrefet]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.saisineDesServices]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, }, [TITRES_TYPES_IDS.PERMIS_EXCLUSIF_DE_RECHERCHES_METAUX]: { [ETAPES_TYPES.abrogationDeLaDecision]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, @@ -624,12 +583,8 @@ const AdministrationsTitresTypesEtapesTypes: { [ETAPES_TYPES.avisDunMaire]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.decisionDuJugeAdministratif]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisDeMiseEnConcurrenceAuJORF]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLOfficeNationalDesForets]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLInstitutNationalDeLorigineEtDeLaQualite]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, + [ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDunServiceAdministratifLocal]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLautoriteMilitaire]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDuParcNational]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisDeLaCommissionDepartementaleDesMines_CDM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisDuPrefet]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.classementSansSuite]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, @@ -650,7 +605,6 @@ const AdministrationsTitresTypesEtapesTypes: { [ETAPES_TYPES.notificationDesCollectivitesLocales]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.noteInterneSignalee]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.notificationAuPrefet]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDuParcNaturelRegional]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.clotureDeLaParticipationDuPublic]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.ouvertureDeLaParticipationDuPublic]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.publicationDansUnJournalLocalOuNational]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, @@ -663,7 +617,6 @@ const AdministrationsTitresTypesEtapesTypes: { [ETAPES_TYPES.saisineDesCollectivitesLocales]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.saisineDeLaCommissionDepartementaleDesMines_CDM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.saisineDuPrefet]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.saisineDesServices]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, }, [TITRES_TYPES_IDS.PERMIS_D_EXPLOITATION_METAUX]: { [ETAPES_TYPES.abrogationDeLaDecision]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, @@ -672,11 +625,8 @@ const AdministrationsTitresTypesEtapesTypes: { [ETAPES_TYPES.avisDunMaire]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.decisionDuJugeAdministratif]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisDeMiseEnConcurrenceAuJORF]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLOfficeNationalDesForets]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, + [ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDunServiceAdministratifLocal]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLautoriteMilitaire]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDuParcNational]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisDeLaCommissionDepartementaleDesMines_CDM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisDuPrefet]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.publicationDeLavisDeDecisionImplicite]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, @@ -699,7 +649,6 @@ const AdministrationsTitresTypesEtapesTypes: { [ETAPES_TYPES.notificationDesCollectivitesLocales]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.noteInterneSignalee]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.notificationAuPrefet]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDuParcNaturelRegional]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.publicationDansUnJournalLocalOuNational]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.rapportDuConseilGeneralDeLeconomie_CGE_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.receptionDeComplements]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, @@ -710,7 +659,6 @@ const AdministrationsTitresTypesEtapesTypes: { [ETAPES_TYPES.saisineDesCollectivitesLocales]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.saisineDeLaCommissionDepartementaleDesMines_CDM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.saisineDuPrefet]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.saisineDesServices]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, }, }, [ADMINISTRATION_IDS['OFFICE NATIONAL DES FORÊTS']]: { @@ -722,43 +670,27 @@ const AdministrationsTitresTypesEtapesTypes: { [ETAPES_TYPES.completudeDeLaDemande]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.recevabiliteDeLaDemande]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false }, [ETAPES_TYPES.enregistrementDeLaDemande]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.demandeDinformations_AvisDeLOfficeNationalDesForets_]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false }, [ETAPES_TYPES.demandeDinformations]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false }, [ETAPES_TYPES.demandeDinformations_RecevabiliteDeLaDemande_]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false }, - [ETAPES_TYPES.demandeDinformations_ExpertiseDeLOfficeNationalDesForets_]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false }, [ETAPES_TYPES.modificationDeLaDemande]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false }, [ETAPES_TYPES.noteInterneSignalee]: { lectureInterdit: true, creationInterdit: false, modificationInterdit: false }, - [ETAPES_TYPES.receptionDinformation_AvisDeLOfficeNationalDesForets_]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false }, [ETAPES_TYPES.receptionDinformation]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false }, [ETAPES_TYPES.receptionDinformation_RecevabiliteDeLaDemande_]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false }, - [ETAPES_TYPES.receptionDinformation_ExpertiseDeLOfficeNationalDesForets_]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false }, [ETAPES_TYPES.saisineDeLaCommissionDesAutorisationsDeRecherchesMinieres_CARM_]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false }, }, [TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX]: { - [ETAPES_TYPES.avisDeDirectionRegionaleDesAffairesCulturelles]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLaDirectionDalimentationDeLagricultureEtDeLaForet]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, + [ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.abrogationDeLaDecision]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDGTMServiceMilieuxNaturelsBiodiversiteSitesEtPaysages_MNBST_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLaDirectionDesEntreprisesDeLaConcurrenceDeLaConsommationDuTravailEtDeLemploi]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLaDirectionRegionaleDesFinancesPubliques]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLaGendarmerieNationale]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisDunMaire]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.decisionDuJugeAdministratif]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLOfficeNationalDesForets]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false }, [ETAPES_TYPES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLetatMajorOrpaillageEtPecheIllicite_EMOPI_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avisDeLaCommissionDepartementaleDesMines_CDM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLagenceRegionaleDeSante]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.decisionDuProprietaireDuSol]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false }, - [ETAPES_TYPES.avisDeLaCaisseGeneraleDeSecuriteSociale]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDGTMServiceAmenagementUrbanismeConstructionLogement_AUCL_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.confirmationDeLaccordDuProprietaireDuSol]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false }, [ETAPES_TYPES.classementSansSuite]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.decisionDeLaMissionAutoriteEnvironnementale_ExamenAuCasParCasDuProjet_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.desistementDuDemandeur]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.decisionDeLadministration]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.decisionImplicite]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.expertiseDeLOfficeNationalDesForets]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false }, [ETAPES_TYPES.informationsHistoriquesIncompletes]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demandeDeComplements_RecevabiliteDeLaDemande_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demandeDeComplements]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, @@ -768,7 +700,6 @@ const AdministrationsTitresTypesEtapesTypes: { [ETAPES_TYPES.demande]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false }, [ETAPES_TYPES.demandeDinformations_AvisDuDREALDEALOuDGTM_]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false }, [ETAPES_TYPES.demandeDinformations]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false }, - [ETAPES_TYPES.demandeDinformations_ExpertiseDeLOfficeNationalDesForets_]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false }, [ETAPES_TYPES.notificationAuDemandeur]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.modificationDeLaDemande]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.modificationDeLaDemande_DecisionDeLaMissionAutoriteEnvironnementale_ExamenAuCasParCasDuProjet_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, @@ -779,33 +710,30 @@ const AdministrationsTitresTypesEtapesTypes: { [ETAPES_TYPES.receptionDeComplements]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.receptionDinformation_AvisDuDREALDEALOuDGTM_]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false }, [ETAPES_TYPES.receptionDinformation]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false }, - [ETAPES_TYPES.receptionDinformation_ExpertiseDeLOfficeNationalDesForets_]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false }, [ETAPES_TYPES.publicationDeDecisionAuRecueilDesActesAdministratifs]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.saisineDeLautoriteSignataire]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.saisineDesCollectivitesLocales]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.saisineDeLaCommissionDepartementaleDesMines_CDM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.saisineDesServices]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, }, - [TITRES_TYPES_IDS.PERMIS_EXCLUSIF_DE_RECHERCHES_METAUX]: { [ETAPES_TYPES.avisDeLOfficeNationalDesForets]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false } }, + [TITRES_TYPES_IDS.PERMIS_EXCLUSIF_DE_RECHERCHES_METAUX]: { + [ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, + }, }, [ADMINISTRATION_IDS['PÔLE TECHNIQUE MINIER DE GUYANE']]: { [TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX]: { [ETAPES_TYPES.avisDeLaCommissionDesAutorisationsDeRecherchesMinieres_CARM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avenantALautorisationDeRechercheMiniere]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLOfficeNationalDesForets]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.classementSansSuite]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false }, [ETAPES_TYPES.decisionDeLaMissionAutoriteEnvironnementale_ExamenAuCasParCasDuProjet_]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false }, [ETAPES_TYPES.decisionDeLOfficeNationalDesForets]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.expertiseDREALOuDGTMServiceEau]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.expertiseDGTMServicePreventionDesRisquesEtIndustriesExtractives_DATE_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.expertiseDeLOfficeNationalDesForets]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, + [ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.completudeDeLaDemande]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false }, [ETAPES_TYPES.recevabiliteDeLaDemande]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.priseEnChargeParLOfficeNationalDesForets]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.demandeDinformations_AvisDeLOfficeNationalDesForets_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demandeDinformations]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demandeDinformations_RecevabiliteDeLaDemande_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.demandeDinformations_ExpertiseDeLOfficeNationalDesForets_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.notificationAuDemandeur_AjournementDeLaCARM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.notificationAuDemandeur_AvisFavorableDeLaCARM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.notificationAuDemandeur_ClassementSansSuite_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, @@ -816,10 +744,8 @@ const AdministrationsTitresTypesEtapesTypes: { [ETAPES_TYPES.modificationDeLaDemande]: { lectureInterdit: false, creationInterdit: false, modificationInterdit: false }, [ETAPES_TYPES.paiementDesFraisDeDossierComplementaires]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.recepisseDeDeclarationLoiSurLeau]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.receptionDinformation_AvisDeLOfficeNationalDesForets_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.receptionDinformation]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.receptionDinformation_RecevabiliteDeLaDemande_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.receptionDinformation_ExpertiseDeLOfficeNationalDesForets_]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.saisineDeLaCommissionDesAutorisationsDeRecherchesMinieres_CARM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.signatureDeLautorisationDeRechercheMiniere]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.validationDuPaiementDesFraisDeDossierComplementaires]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, @@ -830,12 +756,11 @@ const AdministrationsTitresTypesEtapesTypes: { [TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX]: { [ETAPES_TYPES.avisDeLaCommissionDesAutorisationsDeRecherchesMinieres_CARM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.avenantALautorisationDeRechercheMiniere]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.avisDeLOfficeNationalDesForets]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, + [ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.classementSansSuite]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.decisionDeLaMissionAutoriteEnvironnementale_ExamenAuCasParCasDuProjet_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.decisionDeLOfficeNationalDesForets]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.desistementDuDemandeur]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.expertiseDeLOfficeNationalDesForets]: { lectureInterdit: true, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demandeDeComplements_RecepisseDeDeclarationLoiSurLeau_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demandeDeComplements_DecisionDeLaMissionAutoriteEnvironnementale_ExamenAuCasParCasDuProjet_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demandeDeComplements_CompletudeDeLaDemande_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, @@ -847,10 +772,8 @@ const AdministrationsTitresTypesEtapesTypes: { [ETAPES_TYPES.enregistrementDeLaDemande]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.priseEnChargeParLOfficeNationalDesForets]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demande]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.demandeDinformations_AvisDeLOfficeNationalDesForets_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demandeDinformations]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.demandeDinformations_RecevabiliteDeLaDemande_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.demandeDinformations_ExpertiseDeLOfficeNationalDesForets_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.notificationAuDemandeur_AjournementDeLaCARM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.notificationAuDemandeur_AvisFavorableDeLaCARM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.notificationAuDemandeur_ClassementSansSuite_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, @@ -867,10 +790,8 @@ const AdministrationsTitresTypesEtapesTypes: { [ETAPES_TYPES.receptionDeComplements]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.receptionDeComplements_SaisineDeLaCARM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.recepisseDeDeclarationLoiSurLeau]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.receptionDinformation_AvisDeLOfficeNationalDesForets_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.receptionDinformation]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.receptionDinformation_RecevabiliteDeLaDemande_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, - [ETAPES_TYPES.receptionDinformation_ExpertiseDeLOfficeNationalDesForets_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.saisineDeLaCommissionDesAutorisationsDeRecherchesMinieres_CARM_]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.signatureDeLautorisationDeRechercheMiniere]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, [ETAPES_TYPES.validationDuPaiementDesFraisDeDossierComplementaires]: { lectureInterdit: false, creationInterdit: true, modificationInterdit: true }, diff --git a/packages/common/src/static/avisTypes.ts b/packages/common/src/static/avisTypes.ts new file mode 100644 index 000000000..200bb7c17 --- /dev/null +++ b/packages/common/src/static/avisTypes.ts @@ -0,0 +1,67 @@ +import { z } from 'zod' + +interface Definition<T> { + id: T + nom: string +} +// prettier-ignore +const AVIS_TYPES_IDS = ['lettreDeSaisineDesServices', 'confirmationAccordProprietaireDuSol', 'avisDirectionRegionaleDesAffairesCulturelles', 'avisDirectionAlimentationAgricultureForet', 'avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques', 'avisDirectionsRégionalesEconomieEmploiTravailSolidarités', 'avisDirectionRegionaleFinancesPubliques', 'avisGendarmerieNationale', 'avisParcNaturelMarin', 'avisIFREMER', 'avisInstitutNationalOrigineQualite', 'avisEtatMajorOrpaillagePecheIllicite', 'avisServiceAdministratifLocal', 'avisAutoriteMilitaire', 'avisParcNational', 'avisDirectionDepartementaleTerritoiresMer', 'avisAgenceRegionaleSante', 'avisCaisseGeneraleSecuriteSociale', 'autreAvis', 'avisServiceMilieuxNaturelsBiodiversiteSitesPaysages', 'avisOfficeNationalDesForets', 'expertiseOfficeNationalDesForets'] as const + +export const avisTypeIdValidator = z.enum(AVIS_TYPES_IDS) +export type AvisTypeId = z.infer<typeof avisTypeIdValidator> + +export const AvisTypes: { [key in AvisTypeId]: Definition<key> } = { + lettreDeSaisineDesServices: { id: 'lettreDeSaisineDesServices', nom: 'Lettre de saisine des services' }, + confirmationAccordProprietaireDuSol: { id: 'confirmationAccordProprietaireDuSol', nom: "Confirmation de l'accord du propriétaire du sol" }, + avisDirectionRegionaleDesAffairesCulturelles: { id: 'avisDirectionRegionaleDesAffairesCulturelles', nom: 'Avis de la Direction Régionale Des Affaires Culturelles (DRAC)' }, + avisDirectionAlimentationAgricultureForet: { id: 'avisDirectionAlimentationAgricultureForet', nom: "Avis de la Direction de l'Alimentation de l'Agriculture et de la Forêt (DRAF)" }, + avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques: { + id: 'avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques', + nom: "Avis du Conseil Départemental de l'Environnement et des Risques Sanitaires et Technologiques (CODERST)", + }, + avisServiceMilieuxNaturelsBiodiversiteSitesPaysages: { + id: 'avisServiceMilieuxNaturelsBiodiversiteSitesPaysages', + nom: 'Avis du Service Milieux Naturels Biodiversité Sites Et Paysages (MNBST) de la DGTM', + }, + avisDirectionsRégionalesEconomieEmploiTravailSolidarités: { + id: 'avisDirectionsRégionalesEconomieEmploiTravailSolidarités', + nom: 'Avis de la Direction régionale de l’économie, de l’emploi, du travail et des solidarités', + }, + avisDirectionRegionaleFinancesPubliques: { id: 'avisDirectionRegionaleFinancesPubliques', nom: 'Avis de la Direction Regionale Des Finances Publiques' }, + avisGendarmerieNationale: { id: 'avisGendarmerieNationale', nom: 'Avis de la Gendarmerie Nationale' }, + avisParcNaturelMarin: { id: 'avisParcNaturelMarin', nom: 'Avis du Parc Naturel Marin' }, + avisIFREMER: { id: 'avisIFREMER', nom: "Avis de l'IFREMER" }, + avisOfficeNationalDesForets: { id: 'avisOfficeNationalDesForets', nom: "Avis de l'Office National des Forêts" }, + expertiseOfficeNationalDesForets: { id: 'expertiseOfficeNationalDesForets', nom: "Expertise de l'Office National des Forêts" }, + avisInstitutNationalOrigineQualite: { id: 'avisInstitutNationalOrigineQualite', nom: "Avis de l'Institut National de l'origine et de la Qualité" }, + avisEtatMajorOrpaillagePecheIllicite: { id: 'avisEtatMajorOrpaillagePecheIllicite', nom: "Avis de l'État-major Orpaillage et Pêche Illicite (EMOPI)" }, + avisServiceAdministratifLocal: { id: 'avisServiceAdministratifLocal', nom: "Avis d'un Service Administratif Local" }, + avisAutoriteMilitaire: { id: 'avisAutoriteMilitaire', nom: "Avis de l'Autorité militaire" }, + avisParcNational: { id: 'avisParcNational', nom: 'Avis du Parc National' }, + avisDirectionDepartementaleTerritoiresMer: { id: 'avisDirectionDepartementaleTerritoiresMer', nom: 'Avis de la Direction Départementale des Territoires et de la Mer (DDTM)' }, + avisAgenceRegionaleSante: { id: 'avisAgenceRegionaleSante', nom: "Avis de l'Agence Régionale de Santé (ARS)" }, + avisCaisseGeneraleSecuriteSociale: { id: 'avisCaisseGeneraleSecuriteSociale', nom: 'Avis de la Caisse Générale de Sécurité Sociale' }, + autreAvis: { id: 'autreAvis', nom: 'Autre avis' }, +} + +// prettier-ignore +export const AvisStatutIds = [ + "Favorable", + "Défavorable", + "Favorable avec réserves", + "Non renseigné", +] as const + +export const avisStatutIdValidator = z.enum(AvisStatutIds) +export type AvisStatutId = z.infer<typeof avisStatutIdValidator> + +export const AVIS_VISIBILITY_IDS = ['Public', 'TitulairesEtAdministrations', 'Administrations'] as const + +export const avisVisibilityIdValidator = z.enum(AVIS_VISIBILITY_IDS) +export type AvisVisibilityId = z.infer<typeof avisVisibilityIdValidator> + +export const AvisVisibilityIds = { + Public: 'Public', + TitulairesEtAdministrations: 'TitulairesEtAdministrations', + Administrations: 'Administrations', +} as const satisfies Record<(typeof AVIS_VISIBILITY_IDS)[number], AvisVisibilityId> diff --git a/packages/common/src/static/etapesTypes.ts b/packages/common/src/static/etapesTypes.ts index 92ba40377..51f85f9e7 100644 --- a/packages/common/src/static/etapesTypes.ts +++ b/packages/common/src/static/etapesTypes.ts @@ -1,61 +1,42 @@ import { z } from 'zod' import { CaminoDate, toCaminoDate } from '../date.js' import { Definition } from '../definition.js' +import { EtapeBrouillon } from '../etape.js' // prettier-ignore -const IDS = ['abd', 'aca','aco','and','ane','anf','def','dex','dim', 'dpu', 'dup', 'dux','ihi', 'mfr','mod','mom','rca','rcb','rcd','rcm','rco','rcs','ria','rie','rif','rim','rio','rpu','sco', 'aac','aaf','abs','acd','acg','acl','aec','aep','afp','agn','aim','ama','ami','aof','aop','apd','ape','api','apl','apm','apn','apo','app','apu','apw','ari','ars','asl','ass','auc','cac','ccs','cim','cod','cps','css','dae','dec','des','ede','edm','eof','epc','epu','esb','ide','mca','mcb','mcd','mcm','mco','mcp','mcr','mcs','mdp','mec','men','meo','mia','mie','mif','mim','mio','mna','mnb','mnc','mnd','mni','mno','mns','mnv','ncl','nis','npp','pfc','pfd','pnr','ppc','ppu','pqr','rcg','rde','rpe','sas','sca','scg','scl','spe','spo','spp','ssr','vfc','vfd','wab','wac','wad','wae','wai','wal','wam','wao','wap','war','was','wat','wau','wce','wco','wda','wdc','wdd','wde','wdm','wdt','wfa','wfd','wfo','wfr','wmm','wmr','wmt','woe','wpa','wpb','wpc','wpo','wpp','wps','wrc','wrd','wre','wrl','wrt','wse','wss','wtp'] as const +const IDS = ['abd', 'aca','aco','and','ane','anf','def','dex','dim', 'dpu', 'dup', 'dux','ihi', 'mfr','mod','mom','rca','rcb','rcd','rcm','rco','rcs','rie','rif','rim','rpu','sco','acg','acl','aep','ama','apd','ape','apo','app','apu','apw','asl','cac','ccs','cim','cod','css','dae','dec','des','ede','edm','epc','epu','esb','ide','mca','mcb','mcd','mcm','mco','mcp','mcr','mcs','mdp','mec','men','meo','mie','mif','mim','mna','mnb','mnc','mnd','mni','mno','mns','mnv','ncl','nis','npp','pfc','pfd','ppc','ppu','pqr','rcg','rde','rpe','sas','sca','scg','scl','spe','spo','spp','vfc','vfd','wab','wae','wao','wap','war','wau','wce','wco','wda','wdc','wdd','wde','wdm','wfa','wfd','wfo','wfr','wmm','wmr','wmt','woe','wpa','wpb','wpc','wpo','wpp','wps','wrc','wrd','wre','wrl','wrt','wse','wtp', 'asc'] as const // prettier-ignore -const FONDAMENTALES_IDS = ['abd', 'aca','aco','and','ane','anf','def','dex','dim', 'dpu', 'dup', 'dux','ihi', 'mfr','mod','mom','rca','rcb','rcd','rcm','rco','rcs','ria','rie','rif','rim','rio','rpu','sco'] as const satisfies Readonly<EtapeTypeIdFondamentaleArray> +const FONDAMENTALES_IDS = ['abd', 'aca','aco','and','ane','anf','def','dex','dim', 'dpu', 'dup', 'dux','ihi', 'mfr','mod','mom','rca','rcb','rcd','rcm','rco','rcs','rie','rif','rim','rpu','sco'] as const satisfies Readonly<EtapeTypeIdFondamentaleArray> // prettier-ignore -const NON_FONDAMENTALES_IDS = ['aac','aaf','abs','acd','acg','acl','aec','aep','afp','agn','aim','ama','ami','aof','aop','apd','ape','api','apl','apm','apn','apo','app','apu','apw','ari','ars','asl','ass','auc','cac','ccs','cim','cod','cps','css','dae','dec','des','ede','edm','eof','epc','epu','esb','ide','mca','mcb','mcd','mcm','mco','mcp','mcr','mcs','mdp','mec','men','meo','mia','mie','mif','mim','mio','mna','mnb','mnc','mnd','mni','mno','mns','mnv','ncl','nis','npp','pfc','pfd','pnr','ppc','ppu','pqr','rcg','rde','rpe','sas','sca','scg','scl','spe','spo','spp','ssr','vfc','vfd','wab','wac','wad','wae','wai','wal','wam','wao','wap','war','was','wat','wau','wce','wco','wda','wdc','wdd','wde','wdm','wdt','wfa','wfd','wfo','wfr','wmm','wmr','wmt','woe','wpa','wpb','wpc','wpo','wpp','wps','wrc','wrd','wre','wrl','wrt','wse','wss','wtp'] as const satisfies Readonly<EtapeTypeIdNonFondamentale[]> +const NON_FONDAMENTALES_IDS = ['acg','acl','aep','ama','apd','ape','apo','app','apu','apw','asl','cac','ccs','cim','cod','css','dae','dec','des','ede','edm','epc','epu','esb','ide','mca','mcb','mcd','mcm','mco','mcp','mcr','mcs','mdp','mec','men','meo','mie','mif','mim','mna','mnb','mnc','mnd','mni','mno','mns','mnv','ncl','nis','npp','pfc','pfd','ppc','ppu','pqr','rcg','rde','rpe','sas','sca','scg','scl','spe','spo','spp','vfc','vfd','wab','wae','wao','wap','war','wau','wce','wco','wda','wdc','wdd','wde','wdm','wfa','wfd','wfo','wfr','wmm','wmr','wmt','woe','wpa','wpb','wpc','wpo','wpp','wps','wrc','wrd','wre','wrl','wrt','wse','wtp', 'asc'] as const satisfies Readonly<EtapeTypeIdNonFondamentale[]> // Ceci est un test :) ;[...FONDAMENTALES_IDS, ...NON_FONDAMENTALES_IDS] as const satisfies typeof IDS export const ETAPES_TYPES = { - avisDeDirectionRegionaleDesAffairesCulturelles: 'aac', - avisDeLaDirectionDalimentationDeLagricultureEtDeLaForet: 'aaf', abrogationDeLaDecision: 'abd', - avisDGTMServiceMilieuxNaturelsBiodiversiteSitesEtPaysages_MNBST_: 'abs', avisDeLaCommissionDesAutorisationsDeRecherchesMinieres_CARM_: 'aca', - avisDuConseilDepartementalDeLenvironnementEtDesRisquesSanitairesEtTechnologiques_Coderst_: 'acd', avisDuConseilGeneralDeLeconomie_CGE_: 'acg', avisDuneCollectiviteLocale: 'acl', avenantALautorisationDeRechercheMiniere: 'aco', - avisDeLaDirectionDesEntreprisesDeLaConcurrenceDeLaConsommationDuTravailEtDeLemploi: 'aec', avisDunPresidentDEPCI: 'aep', - avisDeLaDirectionRegionaleDesFinancesPubliques: 'afp', - avisDeLaGendarmerieNationale: 'agn', - avisDeLIfremer: 'aim', avisDunMaire: 'ama', - avisDuParcNaturelMarin: 'ami', decisionDuJugeAdministratif: 'and', avisDeMiseEnConcurrenceAuJOUE: 'ane', avisDeMiseEnConcurrenceAuJORF: 'anf', - avisDeLOfficeNationalDesForets: 'aof', - avisDeLInstitutNationalDeLorigineEtDeLaQualite: 'aop', avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement: 'apd', avisDuConseilDEtat: 'ape', - avisDeLetatMajorOrpaillageEtPecheIllicite_EMOPI_: 'api', - avisDunServiceAdministratifLocal: 'apl', - avisDeLautoriteMilitaire: 'apm', - avisDuParcNational: 'apn', avisDeLaCommissionDepartementaleDesMines_CDM_: 'apo', avisDuPrefet: 'app', publicationDeLavisDeDecisionImplicite: 'apu', avisDuPrefetMaritime: 'apw', - avisDeLaReunionInterservice: 'ari', - avisDeLagenceRegionaleDeSante: 'ars', decisionDuProprietaireDuSol: 'asl', - avisDeLaCaisseGeneraleDeSecuriteSociale: 'ass', - avisDGTMServiceAmenagementUrbanismeConstructionLogement_AUCL_: 'auc', consultationDesAdministrationsCentrales: 'cac', consultationCLEDuSAGE: 'ccs', concertationInterministerielle: 'cim', saisineDuConseilDepartementalDeLenvironnementEtDesRisquesSanitairesEtTechnologiques_Coderst_: 'cod', - confirmationDeLaccordDuProprietaireDuSol: 'cps', classementSansSuite: 'css', decisionDeLaMissionAutoriteEnvironnementale_ExamenAuCasParCasDuProjet_: 'dae', declaration: 'dec', @@ -68,7 +49,6 @@ export const ETAPES_TYPES = { decisionAdministrative: 'dux', expertiseDREALOuDGTMServiceEau: 'ede', expertiseDGTMServicePreventionDesRisquesEtIndustriesExtractives_DATE_: 'edm', - expertiseDeLOfficeNationalDesForets: 'eof', clotureDeLenquetePublique: 'epc', ouvertureDeLenquetePublique: 'epu', expertiseDREALOuDGTMServiceBiodiversite: 'esb', @@ -87,11 +67,9 @@ export const ETAPES_TYPES = { enregistrementDeLaDemande: 'men', priseEnChargeParLOfficeNationalDesForets: 'meo', demande: 'mfr', - demandeDinformations_AvisDeLOfficeNationalDesForets_: 'mia', demandeDinformations_AvisDuDREALDEALOuDGTM_: 'mie', demandeDinformations: 'mif', demandeDinformations_RecevabiliteDeLaDemande_: 'mim', - demandeDinformations_ExpertiseDeLOfficeNationalDesForets_: 'mio', notificationAuDemandeur_AjournementDeLaCARM_: 'mna', notificationAuDemandeur_AvisFavorableDeLaCARM_: 'mnb', notificationAuDemandeur_ClassementSansSuite_: 'mnc', @@ -107,7 +85,6 @@ export const ETAPES_TYPES = { notificationAuPrefet: 'npp', paiementDesFraisDeDossierComplementaires: 'pfc', paiementDesFraisDeDossier: 'pfd', - avisDuParcNaturelRegional: 'pnr', clotureDeLaParticipationDuPublic: 'ppc', ouvertureDeLaParticipationDuPublic: 'ppu', publicationDansUnJournalLocalOuNational: 'pqr', @@ -119,11 +96,9 @@ export const ETAPES_TYPES = { receptionDeComplements: 'rco', receptionDeComplements_SaisineDeLaCARM_: 'rcs', recepisseDeDeclarationLoiSurLeau: 'rde', - receptionDinformation_AvisDeLOfficeNationalDesForets_: 'ria', receptionDinformation_AvisDuDREALDEALOuDGTM_: 'rie', receptionDinformation: 'rif', receptionDinformation_RecevabiliteDeLaDemande_: 'rim', - receptionDinformation_ExpertiseDeLOfficeNationalDesForets_: 'rio', rapportDuConseilDEtat: 'rpe', publicationDeDecisionAuRecueilDesActesAdministratifs: 'rpu', saisineDeLautoriteSignataire: 'sas', @@ -134,21 +109,13 @@ export const ETAPES_TYPES = { saisineDuConseilDEtat: 'spe', saisineDeLaCommissionDepartementaleDesMines_CDM_: 'spo', saisineDuPrefet: 'spp', - saisineDesServices: 'ssr', validationDuPaiementDesFraisDeDossierComplementaires: 'vfc', validationDuPaiementDesFraisDeDossier: 'vfd', abandonDeLaDemande: 'wab', - avisDeDirectionRegionaleDesAffairesCulturellesDRAC: 'wac', - avisDeLaDirectionDepartementaleDesTerritoiresEtDeLaMerDDT_M_: 'wad', avisDeLautoriteEnvironnementale: 'wae', - avisDesAutresInstances: 'wai', - avisDunServiceAdministratifLocal_wal: 'wal', - avisDeLautoriteMilitaire_wam: 'wam', arreteDouvertureDesTravauxMiniers: 'wao', avisDuPrefetMaritime_wap: 'wap', avisDeReception: 'war', - avisDeLagenceRegionaleDeSanteARS: 'was', - avisDuConseilDepartementalDeLenvironnementEtDesRisquesSanitairesEtTechnologiques_Coderst__wat: 'wat', avisDuDemandeurSurLesPrescriptionsProposees: 'wau', clotureDeLenquetePublique_wce: 'wce', receptionDeComplements_wco: 'wco', @@ -157,7 +124,6 @@ export const ETAPES_TYPES = { depotDeLaDemande_wdd: 'wdd', demandeDeComplements_DADT_: 'wde', decisionDeLadministration_wdm: 'wdm', - avisDeLaDDT_M_: 'wdt', demandeDautorisationDouvertureDeTravauxMiniers_AOTM_: 'wfa', declarationDarretDefinitifDeTravaux_DADT_: 'wfd', declarationDouvertureDeTravauxMiniers_DOTM_: 'wfo', @@ -178,8 +144,8 @@ export const ETAPES_TYPES = { avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement_wrl: 'wrl', recolement: 'wrt', saisineDeLautoriteEnvironnementale: 'wse', - saisineDesServicesDeLEtat: 'wss', transmissionDuProjetDePrescriptionsAuDemandeur: 'wtp', + avisDesServicesEtCommissionsConsultatives: 'asc', } as const satisfies Record<string, EtapeTypeId> export const etapeTypeIdValidator = z.enum(IDS) @@ -326,16 +292,6 @@ export const EtapesTypes = { public_lecture: false, entreprises_lecture: true, }, - mia: { - id: 'mia', - nom: "demande d'informations (avis de l'Office national des forêts)", - description: 'après une aof', - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: true, - }, rim: { id: 'rim', nom: "réception d'information (recevabilité de la demande)", @@ -346,16 +302,6 @@ export const EtapesTypes = { public_lecture: false, entreprises_lecture: true, }, - mio: { - id: 'mio', - nom: "demande d'informations (expertise de l'Office national des forêts)", - description: 'après une eof', - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: true, - }, dec: { id: 'dec', nom: 'déclaration', @@ -416,16 +362,6 @@ export const EtapesTypes = { public_lecture: true, entreprises_lecture: true, }, - auc: { - id: 'auc', - nom: 'avis DGTM service aménagement, urbanisme, construction, logement (AUCL)', - description: 'Avis de l’AUCL sur la notice d’impact pour les titres miniers et les autorisations d’exploitation. ', - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, scg: { id: 'scg', nom: "saisine du conseil général de l'économie (CGE)", @@ -437,26 +373,6 @@ export const EtapesTypes = { public_lecture: false, entreprises_lecture: false, }, - aac: { - id: 'aac', - nom: 'avis de direction régionale des affaires culturelles', - description: 'Avis sur la situation archéologique du site en question.', - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, - afp: { - id: 'afp', - nom: 'avis de la direction régionale des finances publiques', - description: 'Avis délivré sur la régularité fiscale de l’entreprise.', - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, aep: { id: 'aep', nom: "avis d'un président d'EPCI", @@ -477,26 +393,6 @@ export const EtapesTypes = { public_lecture: false, entreprises_lecture: true, }, - ria: { - id: 'ria', - nom: "réception d'information (avis de l'Office national des forêts)", - description: 'après une aof', - fondamentale: true, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: true, - }, - aim: { - id: 'aim', - nom: "avis de l'Ifremer", - description: 'Avis de l’institut français de recherche pour l’exploitation en mer (IFREMER) dans le cadre d’autorisation en mer.', - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, epc: { id: 'epc', nom: "clôture de l'enquête publique", @@ -507,16 +403,6 @@ export const EtapesTypes = { public_lecture: true, entreprises_lecture: true, }, - aop: { - id: 'aop', - nom: "avis de l'Institut national de l'origine et de la qualité", - description: '', - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, sas: { id: 'sas', nom: "saisine de l'autorité signataire", @@ -537,46 +423,6 @@ export const EtapesTypes = { public_lecture: true, entreprises_lecture: true, }, - ari: { - id: 'ari', - nom: 'avis de la réunion interservice', - description: '', - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, - ars: { - id: 'ars', - nom: "avis de l'agence régionale de santé", - description: "Avis concernant leur respect de la réglementation sanitaire dans le cadre de l'instruction d'un titre minier ou d'une demande relative à la police des mines.", - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, - aaf: { - id: 'aaf', - nom: "avis de la direction d'alimentation de l'agriculture et de la forêt", - description: 'Avis pour un titre minier.', - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, - rio: { - id: 'rio', - nom: "réception d'information (expertise de l'Office national des forêts)", - description: 'après une eof', - fondamentale: true, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: true, - }, wda: { id: 'wda', nom: 'Donné acte de la déclaration (DOTM)', @@ -638,16 +484,6 @@ export const EtapesTypes = { public_lecture: true, entreprises_lecture: true, }, - agn: { - id: 'agn', - nom: 'avis de la gendarmerie nationale', - description: "Avis sur l'instruction d'un titre minier ou d'une demande relative à la police des mines ", - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, apo: { id: 'apo', nom: 'avis de la commission départementale des mines (CDM)', @@ -678,36 +514,6 @@ export const EtapesTypes = { public_lecture: false, entreprises_lecture: false, }, - aof: { - id: 'aof', - nom: "avis de l'Office national des forêts", - description: 'Avis délivré par l’ONF dans le cadre de l’instruction d’un titre minier.\n', - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, - cps: { - id: 'cps', - nom: "confirmation de l'accord du propriétaire du sol", - description: '', - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: true, - }, - apm: { - id: 'apm', - nom: "avis de l'autorité militaire", - description: "Avis de l’autorité militaire, délivré dans le cadre de l’instruction d’un titre minier ou d'une demande relative à la police des mines.", - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, sca: { id: 'sca', nom: 'saisine de la commission des autorisations de recherches minières (CARM)', @@ -718,26 +524,6 @@ export const EtapesTypes = { public_lecture: true, entreprises_lecture: true, }, - apl: { - id: 'apl', - nom: "avis d'un service administratif local", - description: '', - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, - apn: { - id: 'apn', - nom: 'avis du parc national', - description: "Avis du parc national dans le cadre de l’instruction d’un titre ou d'une demande relative à la police des mines.", - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, meo: { id: 'meo', nom: "prise en charge par l'Office national des forêts", @@ -768,16 +554,6 @@ export const EtapesTypes = { public_lecture: false, entreprises_lecture: true, }, - pnr: { - id: 'pnr', - nom: 'avis du parc naturel régional', - description: "Avis du parc naturel régional dans le cadre de l’instruction d’un titre ou d'une demande relative à la police des mines.", - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, apw: { id: 'apw', nom: 'avis du préfet maritime', @@ -949,16 +725,6 @@ export const EtapesTypes = { public_lecture: true, entreprises_lecture: true, }, - acd: { - id: 'acd', - nom: "avis du conseil départemental de l'environnement et des risques sanitaires et technologiques (Coderst)", - description: '', - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: true, - entreprises_lecture: true, - }, wdm: { id: 'wdm', nom: "décision de l'administration", @@ -989,17 +755,6 @@ export const EtapesTypes = { public_lecture: false, entreprises_lecture: false, }, - ssr: { - id: 'ssr', - nom: 'saisine des services', - description: - 'Demande de consultation dans le cadre d’un titre minier des chefs de service civils et de l’autorité militaire. Les intéressés ont un mois pour répondre. Au-delà de ce délai, le silence vaut accord.\n', - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, abd: { id: 'abd', nom: 'abrogation de la décision', @@ -1148,56 +903,6 @@ export const EtapesTypes = { public_lecture: false, entreprises_lecture: false, }, - ami: { - id: 'ami', - nom: 'avis du parc naturel marin', - description: 'Avis du parc naturel marin dans le cadre d’autorisation en mer.', - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, - abs: { - id: 'abs', - nom: 'avis DGTM service milieux naturels, biodiversité, sites et paysages (MNBST)', - description: "Avis du MNBST sur la notice d’impact pour les titres miniers et les autorisations d'exploitation.", - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, - ass: { - id: 'ass', - nom: 'avis de la caisse générale de sécurité sociale', - description: "Avis émis par le service de la sécurité sociale sur la situation sociale de l'entreprise.", - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, - aec: { - id: 'aec', - nom: "avis de la direction des entreprises, de la concurrence, de la consommation, du travail et de l'emploi", - description: 'Avis facultatif sur la situation économique de l’entreprise.', - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, - api: { - id: 'api', - nom: "avis de l'état major orpaillage et pêche illicite (EMOPI)", - description: 'Avis pour tous les titres miniers en Guyane.', - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, cim: { id: 'cim', nom: 'concertation interministérielle', @@ -1433,16 +1138,6 @@ export const EtapesTypes = { public_lecture: false, entreprises_lecture: true, }, - eof: { - id: 'eof', - nom: "expertise de l'Office national des forêts", - description: 'Expertise effectuée par l’ONF dans le cadre d’une demande d’autorisation de recherches minières (ARM).', - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, acg: { id: 'acg', nom: "avis du conseil général de l'économie (CGE)", @@ -1537,16 +1232,6 @@ export const EtapesTypes = { public_lecture: false, entreprises_lecture: false, }, - wdt: { - id: 'wdt', - nom: 'avis de la DDT(M)', - description: 'avis de la Direction Départementale des Territoires et de la Mer', - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, wfa: { id: 'wfa', nom: "Demande d'autorisation d'ouverture de travaux miniers (AOTM)", @@ -1647,66 +1332,6 @@ export const EtapesTypes = { public_lecture: false, entreprises_lecture: false, }, - wss: { - id: 'wss', - nom: "saisine des services de l'Etat", - description: '', - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, - wal: { - id: 'wal', - nom: "avis d'un service administratif local", - description: '', - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, - wad: { - id: 'wad', - nom: 'avis de la direction départementale des territoires et de la mer - DDT(M)', - description: '', - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, - wam: { - id: 'wam', - nom: "avis de l'autorité militaire", - description: '', - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, - was: { - id: 'was', - nom: "avis de l'agence régionale de santé - ARS", - description: '', - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, - wac: { - id: 'wac', - nom: 'avis de direction régionale des affaires culturelles - DRAC', - description: '', - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, wap: { id: 'wap', nom: 'avis du préfet maritime', @@ -1717,16 +1342,6 @@ export const EtapesTypes = { public_lecture: false, entreprises_lecture: false, }, - wai: { - id: 'wai', - nom: 'avis des autres instances', - description: '', - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, wps: { id: 'wps', nom: 'Arrêté préfectoral de sursis à statuer', @@ -1787,16 +1402,6 @@ export const EtapesTypes = { public_lecture: false, entreprises_lecture: false, }, - wat: { - id: 'wat', - nom: "avis du conseil départemental de l'environnement et des risques sanitaires et technologiques (Coderst)", - description: '', - fondamentale: false, - unique: false, - date_fin: null, - public_lecture: false, - entreprises_lecture: false, - }, wau: { id: 'wau', nom: 'Avis du demandeur sur les prescriptions proposées', @@ -1867,6 +1472,16 @@ export const EtapesTypes = { public_lecture: true, entreprises_lecture: true, }, + asc: { + id: 'asc', + nom: 'Avis des services et commissions consultatives', + description: '', + fondamentale: false, + unique: false, + date_fin: null, + public_lecture: false, + entreprises_lecture: false, + }, } as const satisfies { [key in EtapeTypeId]: EtapeType<key> } type IsFondamentale<T> = T extends EtapeTypeId ? ((typeof EtapesTypes)[T] extends { fondamentale: true } ? T : never) : never @@ -1899,7 +1514,7 @@ const ETAPES_DECISIONS_IDS = [ ETAPES_TYPES.avenantALautorisationDeRechercheMiniere, ] as const satisfies Readonly<EtapeTypeId[]> -const ETAPES_BROUILLONS_IDS = [ETAPES_TYPES.demande] as const satisfies Readonly<EtapeTypeId[]> +const ETAPES_BROUILLONS_IDS = [ETAPES_TYPES.demande, ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives] as const satisfies Readonly<EtapeTypeId[]> -export const isEtapeDecision = (etapeTypeId: EtapeTypeId): boolean => ETAPES_DECISIONS_IDS.includes(etapeTypeId) -export const canBeBrouillon = (etapeTypeId: EtapeTypeId): boolean => ETAPES_BROUILLONS_IDS.includes(etapeTypeId) +export const isEtapeDecision = (etapeTypeId: EtapeTypeId): EtapeBrouillon => ETAPES_DECISIONS_IDS.includes(etapeTypeId) as EtapeBrouillon +export const canBeBrouillon = (etapeTypeId: EtapeTypeId): EtapeBrouillon => ETAPES_BROUILLONS_IDS.includes(etapeTypeId) as EtapeBrouillon diff --git a/packages/common/src/static/etapesTypesEtapesStatuts.ts b/packages/common/src/static/etapesTypesEtapesStatuts.ts index f3bf4a5ca..6e0a17f33 100644 --- a/packages/common/src/static/etapesTypesEtapesStatuts.ts +++ b/packages/common/src/static/etapesTypesEtapesStatuts.ts @@ -7,36 +7,18 @@ export interface EtapeTypeEtapeStatut<T extends EtapeTypeId, R extends EtapeStat } export const EtapesTypesEtapesStatuts = { - avisDeDirectionRegionaleDesAffairesCulturelles: { - FAVORABLE: { etapeTypeId: 'aac', etapeStatutId: 'fav' }, - FAVORABLE_AVEC_RESERVE: { etapeTypeId: 'aac', etapeStatutId: 'fre' }, - DEFAVORABLE: { etapeTypeId: 'aac', etapeStatutId: 'def' }, - DEFAVORABLE_AVEC_RESERVES: { etapeTypeId: 'aac', etapeStatutId: 'dre' }, - }, - avisDeLaDirectionDalimentationDeLagricultureEtDeLaForet: { - FAVORABLE: { etapeTypeId: 'aaf', etapeStatutId: 'fav' }, - FAVORABLE_AVEC_RESERVE: { etapeTypeId: 'aaf', etapeStatutId: 'fre' }, - DEFAVORABLE: { etapeTypeId: 'aaf', etapeStatutId: 'def' }, - DEFAVORABLE_AVEC_RESERVES: { etapeTypeId: 'aaf', etapeStatutId: 'dre' }, + avisDesServicesEtCommissionsConsultatives: { + FAIT: { etapeTypeId: 'asc', etapeStatutId: 'fai' }, }, + abrogationDeLaDecision: { FAIT: { etapeTypeId: 'abd', etapeStatutId: 'fai' } }, - avisDGTMServiceMilieuxNaturelsBiodiversiteSitesEtPaysages_MNBST_: { - FAVORABLE: { etapeTypeId: 'abs', etapeStatutId: 'fav' }, - FAVORABLE_AVEC_RESERVE: { etapeTypeId: 'abs', etapeStatutId: 'fre' }, - DEFAVORABLE: { etapeTypeId: 'abs', etapeStatutId: 'def' }, - DEFAVORABLE_AVEC_RESERVES: { etapeTypeId: 'abs', etapeStatutId: 'dre' }, - }, + avisDeLaCommissionDesAutorisationsDeRecherchesMinieres_CARM_: { FAVORABLE: { etapeTypeId: 'aca', etapeStatutId: 'fav' }, DEFAVORABLE: { etapeTypeId: 'aca', etapeStatutId: 'def' }, AJOURNE: { etapeTypeId: 'aca', etapeStatutId: 'ajo' }, }, - avisDuConseilDepartementalDeLenvironnementEtDesRisquesSanitairesEtTechnologiques_Coderst_: { - FAVORABLE: { etapeTypeId: 'acd', etapeStatutId: 'fav' }, - FAVORABLE_AVEC_RESERVE: { etapeTypeId: 'acd', etapeStatutId: 'fre' }, - DEFAVORABLE: { etapeTypeId: 'acd', etapeStatutId: 'def' }, - DEFAVORABLE_AVEC_RESERVES: { etapeTypeId: 'acd', etapeStatutId: 'dre' }, - }, + avisDuConseilGeneralDeLeconomie_CGE_: { FAVORABLE: { etapeTypeId: 'acg', etapeStatutId: 'fav' }, DEFAVORABLE: { etapeTypeId: 'acg', etapeStatutId: 'def' }, @@ -48,48 +30,21 @@ export const EtapesTypesEtapesStatuts = { DEFAVORABLE: { etapeTypeId: 'acl', etapeStatutId: 'def' }, }, avenantALautorisationDeRechercheMiniere: { FAIT: { etapeTypeId: 'aco', etapeStatutId: 'fai' } }, - avisDeLaDirectionDesEntreprisesDeLaConcurrenceDeLaConsommationDuTravailEtDeLemploi: { - FAVORABLE: { etapeTypeId: 'aec', etapeStatutId: 'fav' }, - FAVORABLE_AVEC_RESERVE: { etapeTypeId: 'aec', etapeStatutId: 'fre' }, - DEFAVORABLE: { etapeTypeId: 'aec', etapeStatutId: 'def' }, - DEFAVORABLE_AVEC_RESERVES: { etapeTypeId: 'aec', etapeStatutId: 'dre' }, - }, + avisDunPresidentDEPCI: { FAVORABLE: { etapeTypeId: 'aep', etapeStatutId: 'fav' }, DEFAVORABLE: { etapeTypeId: 'aep', etapeStatutId: 'def' }, FAVORABLE_AVEC_RESERVE: { etapeTypeId: 'aep', etapeStatutId: 'fre' }, DEFAVORABLE_AVEC_RESERVES: { etapeTypeId: 'aep', etapeStatutId: 'dre' }, }, - avisDeLaDirectionRegionaleDesFinancesPubliques: { - FAVORABLE: { etapeTypeId: 'afp', etapeStatutId: 'fav' }, - FAVORABLE_AVEC_RESERVE: { etapeTypeId: 'afp', etapeStatutId: 'fre' }, - DEFAVORABLE: { etapeTypeId: 'afp', etapeStatutId: 'def' }, - DEFAVORABLE_AVEC_RESERVES: { etapeTypeId: 'afp', etapeStatutId: 'dre' }, - }, - avisDeLaGendarmerieNationale: { - FAVORABLE: { etapeTypeId: 'agn', etapeStatutId: 'fav' }, - FAVORABLE_AVEC_RESERVE: { etapeTypeId: 'agn', etapeStatutId: 'fre' }, - DEFAVORABLE: { etapeTypeId: 'agn', etapeStatutId: 'def' }, - DEFAVORABLE_AVEC_RESERVES: { etapeTypeId: 'agn', etapeStatutId: 'dre' }, - }, - avisDeLIfremer: { - FAVORABLE: { etapeTypeId: 'aim', etapeStatutId: 'fav' }, - FAVORABLE_AVEC_RESERVE: { etapeTypeId: 'aim', etapeStatutId: 'fre' }, - DEFAVORABLE: { etapeTypeId: 'aim', etapeStatutId: 'def' }, - DEFAVORABLE_AVEC_RESERVES: { etapeTypeId: 'aim', etapeStatutId: 'dre' }, - }, + avisDunMaire: { FAVORABLE: { etapeTypeId: 'ama', etapeStatutId: 'fav' }, DEFAVORABLE: { etapeTypeId: 'ama', etapeStatutId: 'def' }, FAVORABLE_AVEC_RESERVE: { etapeTypeId: 'ama', etapeStatutId: 'fre' }, DEFAVORABLE_AVEC_RESERVES: { etapeTypeId: 'ama', etapeStatutId: 'dre' }, }, - avisDuParcNaturelMarin: { - FAVORABLE: { etapeTypeId: 'ami', etapeStatutId: 'fav' }, - FAVORABLE_AVEC_RESERVE: { etapeTypeId: 'ami', etapeStatutId: 'fre' }, - DEFAVORABLE: { etapeTypeId: 'ami', etapeStatutId: 'def' }, - DEFAVORABLE_AVEC_RESERVES: { etapeTypeId: 'ami', etapeStatutId: 'dre' }, - }, + decisionDuJugeAdministratif: { FAIT: { etapeTypeId: 'and', etapeStatutId: 'fai' }, ACCEPTE: { etapeTypeId: 'and', etapeStatutId: 'acc' }, @@ -107,16 +62,7 @@ export const EtapesTypesEtapesStatuts = { TERMINE: { etapeTypeId: 'anf', etapeStatutId: 'ter' }, FAIT: { etapeTypeId: 'anf', etapeStatutId: 'fai' }, }, - avisDeLOfficeNationalDesForets: { - FAVORABLE: { etapeTypeId: 'aof', etapeStatutId: 'fav' }, - FAVORABLE_AVEC_RESERVE: { etapeTypeId: 'aof', etapeStatutId: 'fre' }, - DEFAVORABLE: { etapeTypeId: 'aof', etapeStatutId: 'def' }, - DEFAVORABLE_AVEC_RESERVES: { etapeTypeId: 'aof', etapeStatutId: 'dre' }, - }, - avisDeLInstitutNationalDeLorigineEtDeLaQualite: { - FAVORABLE: { etapeTypeId: 'aop', etapeStatutId: 'fav' }, - DEFAVORABLE: { etapeTypeId: 'aop', etapeStatutId: 'def' }, - }, + avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement: { FAVORABLE: { etapeTypeId: 'apd', etapeStatutId: 'fav' }, DEFAVORABLE: { etapeTypeId: 'apd', etapeStatutId: 'def' }, @@ -129,28 +75,7 @@ export const EtapesTypesEtapesStatuts = { FAVORABLE_AVEC_RESERVE: { etapeTypeId: 'ape', etapeStatutId: 'fre' }, DEFAVORABLE_AVEC_RESERVES: { etapeTypeId: 'ape', etapeStatutId: 'dre' }, }, - avisDeLetatMajorOrpaillageEtPecheIllicite_EMOPI_: { - FAVORABLE: { etapeTypeId: 'api', etapeStatutId: 'fav' }, - FAVORABLE_AVEC_RESERVE: { etapeTypeId: 'api', etapeStatutId: 'fre' }, - DEFAVORABLE: { etapeTypeId: 'api', etapeStatutId: 'def' }, - DEFAVORABLE_AVEC_RESERVES: { etapeTypeId: 'api', etapeStatutId: 'dre' }, - }, - avisDunServiceAdministratifLocal: { - FAVORABLE: { etapeTypeId: 'apl', etapeStatutId: 'fav' }, - DEFAVORABLE: { etapeTypeId: 'apl', etapeStatutId: 'def' }, - FAVORABLE_AVEC_RESERVE: { etapeTypeId: 'apl', etapeStatutId: 'fre' }, - DEFAVORABLE_AVEC_RESERVES: { etapeTypeId: 'apl', etapeStatutId: 'dre' }, - }, - avisDeLautoriteMilitaire: { - FAVORABLE: { etapeTypeId: 'apm', etapeStatutId: 'fav' }, - DEFAVORABLE: { etapeTypeId: 'apm', etapeStatutId: 'def' }, - FAVORABLE_AVEC_RESERVE: { etapeTypeId: 'apm', etapeStatutId: 'fre' }, - DEFAVORABLE_AVEC_RESERVES: { etapeTypeId: 'apm', etapeStatutId: 'dre' }, - }, - avisDuParcNational: { - FAVORABLE: { etapeTypeId: 'apn', etapeStatutId: 'fav' }, - DEFAVORABLE: { etapeTypeId: 'apn', etapeStatutId: 'def' }, - }, + avisDeLaCommissionDepartementaleDesMines_CDM_: { AJOURNE: { etapeTypeId: 'apo', etapeStatutId: 'ajo' }, FAVORABLE: { etapeTypeId: 'apo', etapeStatutId: 'fav' }, @@ -175,40 +100,17 @@ export const EtapesTypesEtapesStatuts = { FAVORABLE_AVEC_RESERVE: { etapeTypeId: 'apw', etapeStatutId: 'fre' }, DEFAVORABLE_AVEC_RESERVES: { etapeTypeId: 'apw', etapeStatutId: 'dre' }, }, - avisDeLaReunionInterservice: { - FAVORABLE: { etapeTypeId: 'ari', etapeStatutId: 'fav' }, - DEFAVORABLE: { etapeTypeId: 'ari', etapeStatutId: 'def' }, - }, - avisDeLagenceRegionaleDeSante: { - FAVORABLE: { etapeTypeId: 'ars', etapeStatutId: 'fav' }, - FAVORABLE_AVEC_RESERVE: { etapeTypeId: 'ars', etapeStatutId: 'fre' }, - DEFAVORABLE: { etapeTypeId: 'ars', etapeStatutId: 'def' }, - DEFAVORABLE_AVEC_RESERVES: { etapeTypeId: 'ars', etapeStatutId: 'dre' }, - }, + decisionDuProprietaireDuSol: { FAVORABLE: { etapeTypeId: 'asl', etapeStatutId: 'fav' }, FAVORABLE_AVEC_RESERVE: { etapeTypeId: 'asl', etapeStatutId: 'fre' }, DEFAVORABLE: { etapeTypeId: 'asl', etapeStatutId: 'def' }, }, - avisDeLaCaisseGeneraleDeSecuriteSociale: { - FAVORABLE: { etapeTypeId: 'ass', etapeStatutId: 'fav' }, - FAVORABLE_AVEC_RESERVE: { etapeTypeId: 'ass', etapeStatutId: 'fre' }, - DEFAVORABLE: { etapeTypeId: 'ass', etapeStatutId: 'def' }, - DEFAVORABLE_AVEC_RESERVES: { etapeTypeId: 'ass', etapeStatutId: 'dre' }, - }, - avisDGTMServiceAmenagementUrbanismeConstructionLogement_AUCL_: { - FAVORABLE: { etapeTypeId: 'auc', etapeStatutId: 'fav' }, - FAVORABLE_AVEC_RESERVE: { etapeTypeId: 'auc', etapeStatutId: 'fre' }, - DEFAVORABLE: { etapeTypeId: 'auc', etapeStatutId: 'def' }, - DEFAVORABLE_AVEC_RESERVES: { etapeTypeId: 'auc', etapeStatutId: 'dre' }, - }, + consultationDesAdministrationsCentrales: { FAIT: { etapeTypeId: 'cac', etapeStatutId: 'fai' } }, concertationInterministerielle: { FAIT: { etapeTypeId: 'cim', etapeStatutId: 'fai' } }, saisineDuConseilDepartementalDeLenvironnementEtDesRisquesSanitairesEtTechnologiques_Coderst_: { FAIT: { etapeTypeId: 'cod', etapeStatutId: 'fai' } }, - confirmationDeLaccordDuProprietaireDuSol: { - FAVORABLE: { etapeTypeId: 'cps', etapeStatutId: 'fav' }, - DEFAVORABLE: { etapeTypeId: 'cps', etapeStatutId: 'def' }, - }, + classementSansSuite: { FAIT: { etapeTypeId: 'css', etapeStatutId: 'fai' } }, decisionDeLaMissionAutoriteEnvironnementale_ExamenAuCasParCasDuProjet_: { EXEMPTE: { etapeTypeId: 'dae', etapeStatutId: 'exe' }, @@ -242,7 +144,6 @@ export const EtapesTypesEtapesStatuts = { FAVORABLE: { etapeTypeId: 'edm', etapeStatutId: 'fav' }, DEFAVORABLE: { etapeTypeId: 'edm', etapeStatutId: 'def' }, }, - expertiseDeLOfficeNationalDesForets: { FAIT: { etapeTypeId: 'eof', etapeStatutId: 'fai' } }, clotureDeLenquetePublique: { TERMINE: { etapeTypeId: 'epc', etapeStatutId: 'ter' } }, ouvertureDeLenquetePublique: { PROGRAMME: { etapeTypeId: 'epu', etapeStatutId: 'pro' }, @@ -272,11 +173,9 @@ export const EtapesTypesEtapesStatuts = { demande: { FAIT: { etapeTypeId: 'mfr', etapeStatutId: 'fai' }, }, - demandeDinformations_AvisDeLOfficeNationalDesForets_: { FAIT: { etapeTypeId: 'mia', etapeStatutId: 'fai' } }, demandeDinformations_AvisDuDREALDEALOuDGTM_: { FAIT: { etapeTypeId: 'mie', etapeStatutId: 'fai' } }, demandeDinformations: { FAIT: { etapeTypeId: 'mif', etapeStatutId: 'fai' } }, demandeDinformations_RecevabiliteDeLaDemande_: { FAIT: { etapeTypeId: 'mim', etapeStatutId: 'fai' } }, - demandeDinformations_ExpertiseDeLOfficeNationalDesForets_: { FAIT: { etapeTypeId: 'mio', etapeStatutId: 'fai' } }, notificationAuDemandeur_AjournementDeLaCARM_: { FAIT: { etapeTypeId: 'mna', etapeStatutId: 'fai' } }, notificationAuDemandeur_AvisFavorableDeLaCARM_: { FAIT: { etapeTypeId: 'mnb', etapeStatutId: 'fai' } }, notificationAuDemandeur_ClassementSansSuite_: { FAIT: { etapeTypeId: 'mnc', etapeStatutId: 'fai' } }, @@ -292,10 +191,6 @@ export const EtapesTypesEtapesStatuts = { notificationAuPrefet: { FAIT: { etapeTypeId: 'npp', etapeStatutId: 'fai' } }, paiementDesFraisDeDossierComplementaires: { FAIT: { etapeTypeId: 'pfc', etapeStatutId: 'fai' } }, paiementDesFraisDeDossier: { FAIT: { etapeTypeId: 'pfd', etapeStatutId: 'fai' } }, - avisDuParcNaturelRegional: { - FAVORABLE: { etapeTypeId: 'pnr', etapeStatutId: 'fav' }, - DEFAVORABLE: { etapeTypeId: 'pnr', etapeStatutId: 'def' }, - }, clotureDeLaParticipationDuPublic: { TERMINE: { etapeTypeId: 'ppc', etapeStatutId: 'ter' } }, ouvertureDeLaParticipationDuPublic: { PROGRAMME: { etapeTypeId: 'ppu', etapeStatutId: 'pro' }, @@ -316,11 +211,9 @@ export const EtapesTypesEtapesStatuts = { FAVORABLE: { etapeTypeId: 'rde', etapeStatutId: 'fav' }, DEFAVORABLE: { etapeTypeId: 'rde', etapeStatutId: 'def' }, }, - receptionDinformation_AvisDeLOfficeNationalDesForets_: { FAIT: { etapeTypeId: 'ria', etapeStatutId: 'fai' } }, receptionDinformation_AvisDuDREALDEALOuDGTM_: { FAIT: { etapeTypeId: 'rie', etapeStatutId: 'fai' } }, receptionDinformation: { FAIT: { etapeTypeId: 'rif', etapeStatutId: 'fai' } }, receptionDinformation_RecevabiliteDeLaDemande_: { FAIT: { etapeTypeId: 'rim', etapeStatutId: 'fai' } }, - receptionDinformation_ExpertiseDeLOfficeNationalDesForets_: { FAIT: { etapeTypeId: 'rio', etapeStatutId: 'fai' } }, rapportDuConseilDEtat: { FAVORABLE: { etapeTypeId: 'rpe', etapeStatutId: 'fav' }, DEFAVORABLE: { etapeTypeId: 'rpe', etapeStatutId: 'def' }, @@ -334,48 +227,19 @@ export const EtapesTypesEtapesStatuts = { saisineDuConseilDEtat: { FAIT: { etapeTypeId: 'spe', etapeStatutId: 'fai' } }, saisineDeLaCommissionDepartementaleDesMines_CDM_: { FAIT: { etapeTypeId: 'spo', etapeStatutId: 'fai' } }, saisineDuPrefet: { FAIT: { etapeTypeId: 'spp', etapeStatutId: 'fai' } }, - saisineDesServices: { FAIT: { etapeTypeId: 'ssr', etapeStatutId: 'fai' } }, validationDuPaiementDesFraisDeDossierComplementaires: { FAIT: { etapeTypeId: 'vfc', etapeStatutId: 'fai' } }, validationDuPaiementDesFraisDeDossier: { FAIT: { etapeTypeId: 'vfd', etapeStatutId: 'fai' } }, abandonDeLaDemande: { FAIT: { etapeTypeId: 'wab', etapeStatutId: 'fai' } }, - avisDeDirectionRegionaleDesAffairesCulturellesDRAC: { - FAVORABLE: { etapeTypeId: 'wac', etapeStatutId: 'fav' }, - DEFAVORABLE: { etapeTypeId: 'wac', etapeStatutId: 'def' }, - }, - avisDeLaDirectionDepartementaleDesTerritoiresEtDeLaMerDDT_M_: { - FAVORABLE: { etapeTypeId: 'wad', etapeStatutId: 'fav' }, - DEFAVORABLE: { etapeTypeId: 'wad', etapeStatutId: 'def' }, - }, avisDeLautoriteEnvironnementale: { FAVORABLE: { etapeTypeId: 'wae', etapeStatutId: 'fav' }, DEFAVORABLE: { etapeTypeId: 'wae', etapeStatutId: 'def' }, }, - avisDesAutresInstances: { - FAVORABLE: { etapeTypeId: 'wai', etapeStatutId: 'fav' }, - DEFAVORABLE: { etapeTypeId: 'wai', etapeStatutId: 'def' }, - }, - avisDunServiceAdministratifLocal_wal: { - FAVORABLE: { etapeTypeId: 'wal', etapeStatutId: 'fav' }, - DEFAVORABLE: { etapeTypeId: 'wal', etapeStatutId: 'def' }, - }, - avisDeLautoriteMilitaire_wam: { - FAVORABLE: { etapeTypeId: 'wam', etapeStatutId: 'fav' }, - DEFAVORABLE: { etapeTypeId: 'wam', etapeStatutId: 'def' }, - }, arreteDouvertureDesTravauxMiniers: { FAIT: { etapeTypeId: 'wao', etapeStatutId: 'fai' } }, avisDuPrefetMaritime_wap: { FAVORABLE: { etapeTypeId: 'wap', etapeStatutId: 'fav' }, DEFAVORABLE: { etapeTypeId: 'wap', etapeStatutId: 'def' }, }, avisDeReception: { FAIT: { etapeTypeId: 'war', etapeStatutId: 'fai' } }, - avisDeLagenceRegionaleDeSanteARS: { - FAVORABLE: { etapeTypeId: 'was', etapeStatutId: 'fav' }, - DEFAVORABLE: { etapeTypeId: 'was', etapeStatutId: 'def' }, - }, - avisDuConseilDepartementalDeLenvironnementEtDesRisquesSanitairesEtTechnologiques_Coderst__wat: { - FAVORABLE: { etapeTypeId: 'wat', etapeStatutId: 'fav' }, - DEFAVORABLE: { etapeTypeId: 'wat', etapeStatutId: 'def' }, - }, avisDuDemandeurSurLesPrescriptionsProposees: { FAVORABLE: { etapeTypeId: 'wau', etapeStatutId: 'fav' }, DEFAVORABLE: { etapeTypeId: 'wau', etapeStatutId: 'def' }, @@ -424,10 +288,8 @@ export const EtapesTypesEtapesStatuts = { DEFAVORABLE: { etapeTypeId: 'wrt', etapeStatutId: 'def' }, }, saisineDeLautoriteEnvironnementale: { FAIT: { etapeTypeId: 'wse', etapeStatutId: 'fai' } }, - saisineDesServicesDeLEtat: { FAIT: { etapeTypeId: 'wss', etapeStatutId: 'fai' } }, transmissionDuProjetDePrescriptionsAuDemandeur: { FAIT: { etapeTypeId: 'wtp', etapeStatutId: 'fai' } }, receptionDeComplements_wco: { FAIT: { etapeTypeId: 'wco', etapeStatutId: 'fai' } }, - avisDeLaDDT_M_: { FAIT: { etapeTypeId: 'wdt', etapeStatutId: 'fai' } }, consultationCLEDuSAGE: { FAVORABLE: { etapeTypeId: 'ccs', etapeStatutId: 'fav' }, DEFAVORABLE: { etapeTypeId: 'ccs', etapeStatutId: 'def' }, diff --git a/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/documents.ts b/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/documents.ts index 4da6add9b..de5d4fa28 100644 --- a/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/documents.ts +++ b/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/documents.ts @@ -7,11 +7,6 @@ import { TDEType } from './index.js' const EtapesTypesDocumentsTypes = { [ETAPES_TYPES.avisDunPresidentDEPCI]: [DOCUMENTS_TYPES_IDS.avis], - [ETAPES_TYPES.avisDuParcNaturelMarin]: [DOCUMENTS_TYPES_IDS.avis], - [ETAPES_TYPES.avisDGTMServiceMilieuxNaturelsBiodiversiteSitesEtPaysages_MNBST_]: [DOCUMENTS_TYPES_IDS.avisDesServicesCivilsEtMilitaires], - [ETAPES_TYPES.avisDeLaDirectionDesEntreprisesDeLaConcurrenceDeLaConsommationDuTravailEtDeLemploi]: [DOCUMENTS_TYPES_IDS.avisDesServicesCivilsEtMilitaires], - [ETAPES_TYPES.avisDeDirectionRegionaleDesAffairesCulturelles]: [DOCUMENTS_TYPES_IDS.avisDesServicesCivilsEtMilitaires, DOCUMENTS_TYPES_IDS.avis], - [ETAPES_TYPES.avisDeLaDirectionDalimentationDeLagricultureEtDeLaForet]: [DOCUMENTS_TYPES_IDS.avisDesServicesCivilsEtMilitaires], [ETAPES_TYPES.abrogationDeLaDecision]: [DOCUMENTS_TYPES_IDS.arrete], [ETAPES_TYPES.avisDeLaCommissionDesAutorisationsDeRecherchesMinieres_CARM_]: [DOCUMENTS_TYPES_IDS.avis, DOCUMENTS_TYPES_IDS.ficheDePresentation, DOCUMENTS_TYPES_IDS.lettre], [ETAPES_TYPES.avisDuConseilGeneralDeLeconomie_CGE_]: [ @@ -28,36 +23,20 @@ const EtapesTypesDocumentsTypes = { DOCUMENTS_TYPES_IDS.decision, DOCUMENTS_TYPES_IDS.notificationDeDecision, ], - [ETAPES_TYPES.avisDeLaDirectionRegionaleDesFinancesPubliques]: [DOCUMENTS_TYPES_IDS.avisDesServicesCivilsEtMilitaires, DOCUMENTS_TYPES_IDS.avis], - [ETAPES_TYPES.avisDeLaGendarmerieNationale]: [DOCUMENTS_TYPES_IDS.avisDesServicesCivilsEtMilitaires], - [ETAPES_TYPES.avisDeLIfremer]: [DOCUMENTS_TYPES_IDS.avis], [ETAPES_TYPES.avisDunMaire]: [DOCUMENTS_TYPES_IDS.avis], [ETAPES_TYPES.decisionDuJugeAdministratif]: [DOCUMENTS_TYPES_IDS.decision], [ETAPES_TYPES.avisDeMiseEnConcurrenceAuJORF]: [DOCUMENTS_TYPES_IDS.avisDeMiseEnConcurrence, DOCUMENTS_TYPES_IDS.avis], - [ETAPES_TYPES.avisDeLOfficeNationalDesForets]: [ - DOCUMENTS_TYPES_IDS.avisDesServicesCivilsEtMilitaires, - DOCUMENTS_TYPES_IDS.avis, - DOCUMENTS_TYPES_IDS.contrat, - DOCUMENTS_TYPES_IDS.lettre, - DOCUMENTS_TYPES_IDS.motif, - ], [ETAPES_TYPES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement]: [ DOCUMENTS_TYPES_IDS.avisDuDirecteurRegionalChargeDesMines, DOCUMENTS_TYPES_IDS.rapportDeLAdministrationCentraleChargeDesMines, DOCUMENTS_TYPES_IDS.rapportDeLaDirectionRegionaleChargeeDesMines, ], [ETAPES_TYPES.avisDuConseilDEtat]: [DOCUMENTS_TYPES_IDS.avis], - [ETAPES_TYPES.avisDeLetatMajorOrpaillageEtPecheIllicite_EMOPI_]: [DOCUMENTS_TYPES_IDS.avisDesServicesCivilsEtMilitaires], - [ETAPES_TYPES.avisDunServiceAdministratifLocal]: [DOCUMENTS_TYPES_IDS.avisDesServicesCivilsEtMilitaires, DOCUMENTS_TYPES_IDS.avis, DOCUMENTS_TYPES_IDS.lettre], - [ETAPES_TYPES.avisDeLautoriteMilitaire]: [DOCUMENTS_TYPES_IDS.avisDesServicesCivilsEtMilitaires, DOCUMENTS_TYPES_IDS.avis], [ETAPES_TYPES.avisDeLaCommissionDepartementaleDesMines_CDM_]: [DOCUMENTS_TYPES_IDS.avisDeLaCommissionDepartementaleDesMines, DOCUMENTS_TYPES_IDS.rapportDeLaDirectionRegionaleChargeeDesMines], [ETAPES_TYPES.avisDuPrefet]: [DOCUMENTS_TYPES_IDS.avisDuPrefet, DOCUMENTS_TYPES_IDS.lettre, DOCUMENTS_TYPES_IDS.rapportDeLaDirectionRegionaleChargeeDesMines], [ETAPES_TYPES.publicationDeLavisDeDecisionImplicite]: [DOCUMENTS_TYPES_IDS.avis, DOCUMENTS_TYPES_IDS.notes], [ETAPES_TYPES.avisDuPrefetMaritime]: [DOCUMENTS_TYPES_IDS.avis], - [ETAPES_TYPES.avisDeLagenceRegionaleDeSante]: [DOCUMENTS_TYPES_IDS.avisDesServicesCivilsEtMilitaires, DOCUMENTS_TYPES_IDS.avis], [ETAPES_TYPES.decisionDuProprietaireDuSol]: [DOCUMENTS_TYPES_IDS.decision, DOCUMENTS_TYPES_IDS.lettre], - [ETAPES_TYPES.avisDeLaCaisseGeneraleDeSecuriteSociale]: [DOCUMENTS_TYPES_IDS.avisDesServicesCivilsEtMilitaires], - [ETAPES_TYPES.avisDGTMServiceAmenagementUrbanismeConstructionLogement_AUCL_]: [DOCUMENTS_TYPES_IDS.avisDesServicesCivilsEtMilitaires], [ETAPES_TYPES.consultationDesAdministrationsCentrales]: [DOCUMENTS_TYPES_IDS.avis, DOCUMENTS_TYPES_IDS.lettreDeSaisineDesServicesDeLAdministrationCentrale], [ETAPES_TYPES.classementSansSuite]: [DOCUMENTS_TYPES_IDS.arrete, DOCUMENTS_TYPES_IDS.lettre, DOCUMENTS_TYPES_IDS.notes, DOCUMENTS_TYPES_IDS.rapportDeLaDirectionRegionaleChargeeDesMines], [ETAPES_TYPES.decisionDeLaMissionAutoriteEnvironnementale_ExamenAuCasParCasDuProjet_]: [ @@ -102,7 +81,6 @@ const EtapesTypesDocumentsTypes = { [ETAPES_TYPES.publicationDeDecisionAdministrativeAuJORF]: [DOCUMENTS_TYPES_IDS.arrete, DOCUMENTS_TYPES_IDS.publicationAuJorf], [ETAPES_TYPES.decisionAdministrative]: [DOCUMENTS_TYPES_IDS.arrete], [ETAPES_TYPES.expertiseDGTMServicePreventionDesRisquesEtIndustriesExtractives_DATE_]: [DOCUMENTS_TYPES_IDS.avis, DOCUMENTS_TYPES_IDS.rapportDeLaDirectionRegionaleChargeeDesMines], - [ETAPES_TYPES.expertiseDeLOfficeNationalDesForets]: [DOCUMENTS_TYPES_IDS.lettre, DOCUMENTS_TYPES_IDS.motif, DOCUMENTS_TYPES_IDS.notes], [ETAPES_TYPES.clotureDeLenquetePublique]: [DOCUMENTS_TYPES_IDS.notes, DOCUMENTS_TYPES_IDS.rapportDuCommissaireEnqueteur], [ETAPES_TYPES.ouvertureDeLenquetePublique]: [ DOCUMENTS_TYPES_IDS.avisDEnquetePublique, @@ -172,7 +150,6 @@ const EtapesTypesDocumentsTypes = { [ETAPES_TYPES.noteInterneSignalee]: [DOCUMENTS_TYPES_IDS.arreteMinisteriel], [ETAPES_TYPES.paiementDesFraisDeDossierComplementaires]: [DOCUMENTS_TYPES_IDS.facture], [ETAPES_TYPES.paiementDesFraisDeDossier]: [DOCUMENTS_TYPES_IDS.facture, DOCUMENTS_TYPES_IDS.justificatifDePaiement, DOCUMENTS_TYPES_IDS.notes], - [ETAPES_TYPES.avisDuParcNaturelRegional]: [DOCUMENTS_TYPES_IDS.avis], [ETAPES_TYPES.clotureDeLaParticipationDuPublic]: [DOCUMENTS_TYPES_IDS.notes, DOCUMENTS_TYPES_IDS.rapportDuCommissaireEnqueteur], [ETAPES_TYPES.ouvertureDeLaParticipationDuPublic]: [ DOCUMENTS_TYPES_IDS.complementsAuDossierDeDemande, @@ -225,21 +202,13 @@ const EtapesTypesDocumentsTypes = { [ETAPES_TYPES.signatureDeLautorisationDeRechercheMiniere]: [DOCUMENTS_TYPES_IDS.contrat, DOCUMENTS_TYPES_IDS.convention, DOCUMENTS_TYPES_IDS.lettre], [ETAPES_TYPES.saisineDuConseilDEtat]: [DOCUMENTS_TYPES_IDS.lettreDeSaisineDuConseilDEtat], [ETAPES_TYPES.saisineDuPrefet]: [DOCUMENTS_TYPES_IDS.lettre, DOCUMENTS_TYPES_IDS.lettreDeSaisineDuPrefet], - [ETAPES_TYPES.saisineDesServices]: [DOCUMENTS_TYPES_IDS.avisDesServicesCivilsEtMilitaires, DOCUMENTS_TYPES_IDS.lettreDeSaisineDesServicesCivilsEtMilitaires, DOCUMENTS_TYPES_IDS.lettre], [ETAPES_TYPES.validationDuPaiementDesFraisDeDossierComplementaires]: [DOCUMENTS_TYPES_IDS.facture], [ETAPES_TYPES.validationDuPaiementDesFraisDeDossier]: [DOCUMENTS_TYPES_IDS.facture, DOCUMENTS_TYPES_IDS.justificatifDePaiement], [ETAPES_TYPES.abandonDeLaDemande]: [DOCUMENTS_TYPES_IDS.courrier], - [ETAPES_TYPES.avisDeDirectionRegionaleDesAffairesCulturellesDRAC]: [DOCUMENTS_TYPES_IDS.avis], - [ETAPES_TYPES.avisDeLaDirectionDepartementaleDesTerritoiresEtDeLaMerDDT_M_]: [DOCUMENTS_TYPES_IDS.avis], [ETAPES_TYPES.avisDeLautoriteEnvironnementale]: [DOCUMENTS_TYPES_IDS.avis], - [ETAPES_TYPES.avisDesAutresInstances]: [DOCUMENTS_TYPES_IDS.avis], - [ETAPES_TYPES.avisDunServiceAdministratifLocal_wal]: [DOCUMENTS_TYPES_IDS.avis, DOCUMENTS_TYPES_IDS.courrier], - [ETAPES_TYPES.avisDeLautoriteMilitaire_wam]: [DOCUMENTS_TYPES_IDS.avis], [ETAPES_TYPES.arreteDouvertureDesTravauxMiniers]: [DOCUMENTS_TYPES_IDS.arretePrefectoral], [ETAPES_TYPES.avisDuPrefetMaritime_wap]: [DOCUMENTS_TYPES_IDS.avis], [ETAPES_TYPES.avisDeReception]: [DOCUMENTS_TYPES_IDS.courrierDeNotificationDeLaRecevabilite, DOCUMENTS_TYPES_IDS.lettreDeSaisineDuPrefet], - [ETAPES_TYPES.avisDeLagenceRegionaleDeSanteARS]: [DOCUMENTS_TYPES_IDS.avis], - [ETAPES_TYPES.avisDuConseilDepartementalDeLenvironnementEtDesRisquesSanitairesEtTechnologiques_Coderst__wat]: [DOCUMENTS_TYPES_IDS.avis], [ETAPES_TYPES.avisDuDemandeurSurLesPrescriptionsProposees]: [DOCUMENTS_TYPES_IDS.avis, DOCUMENTS_TYPES_IDS.courrier], [ETAPES_TYPES.clotureDeLenquetePublique_wce]: [DOCUMENTS_TYPES_IDS.rapportDuCommissaireEnqueteur], [ETAPES_TYPES.donneActeDeLaDeclaration_DOTM_]: [DOCUMENTS_TYPES_IDS.projetDePrescriptions], @@ -275,7 +244,6 @@ const EtapesTypesDocumentsTypes = { [ETAPES_TYPES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement_wrl]: [DOCUMENTS_TYPES_IDS.rapport], [ETAPES_TYPES.recolement]: [DOCUMENTS_TYPES_IDS.pvDeRecolement], [ETAPES_TYPES.saisineDeLautoriteEnvironnementale]: [DOCUMENTS_TYPES_IDS.courrierDeSaisineDuPrefet, DOCUMENTS_TYPES_IDS.lettreDeSaisineDuPrefet], - [ETAPES_TYPES.saisineDesServicesDeLEtat]: [DOCUMENTS_TYPES_IDS.courrierDeSaisineDuPrefet], [ETAPES_TYPES.transmissionDuProjetDePrescriptionsAuDemandeur]: [DOCUMENTS_TYPES_IDS.arretePrefectoral], } as const diff --git a/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/index.test.ts b/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/index.test.ts index 1d2af4b0a..7523dc941 100644 --- a/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/index.test.ts +++ b/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/index.test.ts @@ -31,14 +31,9 @@ test('getEtapesTDE', () => { "mnc", "ede", "rde", - "mio", - "rio", - "eof", + "asc", "mcs", "rcs", - "mia", - "ria", - "aof", "sca", "aca", "mna", diff --git a/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/index.ts b/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/index.ts index 965d568c8..13a8da19f 100644 --- a/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/index.ts +++ b/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/index.ts @@ -13,20 +13,13 @@ const travaux = { ETAPES_TYPES.avisDeReception, ETAPES_TYPES.saisineDeLautoriteEnvironnementale, ETAPES_TYPES.avisDeLautoriteEnvironnementale, - ETAPES_TYPES.saisineDesServicesDeLEtat, - ETAPES_TYPES.avisDunServiceAdministratifLocal_wal, - ETAPES_TYPES.avisDeLaDirectionDepartementaleDesTerritoiresEtDeLaMerDDT_M_, - ETAPES_TYPES.avisDeLautoriteMilitaire_wam, - ETAPES_TYPES.avisDeLagenceRegionaleDeSanteARS, - ETAPES_TYPES.avisDeDirectionRegionaleDesAffairesCulturellesDRAC, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.avisDuPrefetMaritime_wap, - ETAPES_TYPES.avisDesAutresInstances, ETAPES_TYPES.memoireEnReponseDeLexploitant_ParRapportALavisDeLAE_, ETAPES_TYPES.ouvertureDeLenquetePublique_woe, ETAPES_TYPES.clotureDeLenquetePublique_wce, ETAPES_TYPES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement_wrl, ETAPES_TYPES.transmissionDuProjetDePrescriptionsAuDemandeur, - ETAPES_TYPES.avisDuConseilDepartementalDeLenvironnementEtDesRisquesSanitairesEtTechnologiques_Coderst__wat, ETAPES_TYPES.avisDuDemandeurSurLesPrescriptionsProposees, ETAPES_TYPES.publicationDeDecisionAuRecueilDesActesAdministratifs_wpa, ETAPES_TYPES.abandonDeLaDemande, @@ -40,14 +33,8 @@ const travaux = { ETAPES_TYPES.receptionDeComplements_wrc, ETAPES_TYPES.recevabilite, ETAPES_TYPES.avisDeReception, - ETAPES_TYPES.saisineDesServicesDeLEtat, - ETAPES_TYPES.avisDunServiceAdministratifLocal_wal, - ETAPES_TYPES.avisDeLaDirectionDepartementaleDesTerritoiresEtDeLaMerDDT_M_, - ETAPES_TYPES.avisDeLautoriteMilitaire_wam, - ETAPES_TYPES.avisDeLagenceRegionaleDeSanteARS, - ETAPES_TYPES.avisDeDirectionRegionaleDesAffairesCulturellesDRAC, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.avisDuPrefetMaritime_wap, - ETAPES_TYPES.avisDesAutresInstances, ETAPES_TYPES.rapportDeLaDreal, ETAPES_TYPES.transmissionDuProjetDePrescriptionsAuDemandeur, ETAPES_TYPES.avisDuDemandeurSurLesPrescriptionsProposees, @@ -61,14 +48,8 @@ const travaux = { ETAPES_TYPES.receptionDeComplements_wrc, ETAPES_TYPES.recevabilite, ETAPES_TYPES.avisDeReception, - ETAPES_TYPES.saisineDesServicesDeLEtat, - ETAPES_TYPES.avisDunServiceAdministratifLocal_wal, - ETAPES_TYPES.avisDeLaDirectionDepartementaleDesTerritoiresEtDeLaMerDDT_M_, - ETAPES_TYPES.avisDeLautoriteMilitaire_wam, - ETAPES_TYPES.avisDeLagenceRegionaleDeSanteARS, - ETAPES_TYPES.avisDeDirectionRegionaleDesAffairesCulturellesDRAC, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.avisDuPrefetMaritime_wap, - ETAPES_TYPES.avisDesAutresInstances, ETAPES_TYPES.arretePrefectoralDeSursisAStatuer, ETAPES_TYPES.transmissionDuProjetDePrescriptionsAuDemandeur, ETAPES_TYPES.avisDuDemandeurSurLesPrescriptionsProposees, @@ -85,7 +66,7 @@ const travaux = { const permisExclusifDeRecherchesMetauxEtGranulatsMarinsProlongationsEtapes = [ ETAPES_TYPES.demande, - ETAPES_TYPES.saisineDesServices, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.depotDeLaDemande, ETAPES_TYPES.saisineDuPrefet, ETAPES_TYPES.desistementDuDemandeur, @@ -103,10 +84,6 @@ const permisExclusifDeRecherchesMetauxEtGranulatsMarinsProlongationsEtapes = [ ETAPES_TYPES.avisDuConseilGeneralDeLeconomie_CGE_, ETAPES_TYPES.avisDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisDuPrefet, - ETAPES_TYPES.avisDeLagenceRegionaleDeSante, - ETAPES_TYPES.avisDeDirectionRegionaleDesAffairesCulturelles, - ETAPES_TYPES.avisDeLautoriteMilitaire, - ETAPES_TYPES.avisDunServiceAdministratifLocal, ETAPES_TYPES.decisionImplicite, ETAPES_TYPES.saisineDeLautoriteSignataire, ETAPES_TYPES.decisionDeLadministration, @@ -135,13 +112,8 @@ const permisExploitationMetauxEtGranulatsMarinsProlongationsEtapes = [ ETAPES_TYPES.recevabiliteDeLaDemande, ETAPES_TYPES.publicationDeLavisDeDecisionImplicite, ETAPES_TYPES.decisionImplicite, - ETAPES_TYPES.saisineDesServices, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.saisineDesCollectivitesLocales, - ETAPES_TYPES.avisDunServiceAdministratifLocal, - ETAPES_TYPES.avisDeLautoriteMilitaire, - ETAPES_TYPES.avisDeLOfficeNationalDesForets, - ETAPES_TYPES.avisDuParcNational, - ETAPES_TYPES.avisDuParcNaturelRegional, ETAPES_TYPES.avisDunMaire, ETAPES_TYPES.avisDuneCollectiviteLocale, ETAPES_TYPES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement, @@ -178,7 +150,7 @@ const permisExclusifRechercheGeothermieOctroiEtProlongationsEtapes = [ ETAPES_TYPES.modificationDeLaDemande, ETAPES_TYPES.saisineDuPrefet, ETAPES_TYPES.saisineDesCollectivitesLocales, - ETAPES_TYPES.saisineDesServices, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.saisineDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.saisineDeLautoriteSignataire, ETAPES_TYPES.ouvertureDeLaParticipationDuPublic, @@ -186,12 +158,6 @@ const permisExclusifRechercheGeothermieOctroiEtProlongationsEtapes = [ ETAPES_TYPES.avisDunMaire, ETAPES_TYPES.avisDunPresidentDEPCI, ETAPES_TYPES.avisDuneCollectiviteLocale, - ETAPES_TYPES.avisDunServiceAdministratifLocal, - ETAPES_TYPES.avisDeLautoriteMilitaire, - ETAPES_TYPES.avisDuParcNaturelRegional, - ETAPES_TYPES.avisDuParcNational, - ETAPES_TYPES.avisDeLOfficeNationalDesForets, - ETAPES_TYPES.avisDeLInstitutNationalDeLorigineEtDeLaQualite, ETAPES_TYPES.decisionImplicite, ETAPES_TYPES.avisDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisDuPrefet, @@ -496,12 +462,7 @@ const TDE = { ETAPES_TYPES.demandeDeComplements_RecevabiliteDeLaDemande_, ETAPES_TYPES.receptionDeComplements_RecevabiliteDeLaDemande_, ETAPES_TYPES.recevabiliteDeLaDemande, - ETAPES_TYPES.demandeDinformations_ExpertiseDeLOfficeNationalDesForets_, - ETAPES_TYPES.receptionDinformation_ExpertiseDeLOfficeNationalDesForets_, - ETAPES_TYPES.expertiseDeLOfficeNationalDesForets, - ETAPES_TYPES.demandeDinformations_AvisDeLOfficeNationalDesForets_, - ETAPES_TYPES.receptionDinformation_AvisDeLOfficeNationalDesForets_, - ETAPES_TYPES.avisDeLOfficeNationalDesForets, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.classementSansSuite, ETAPES_TYPES.decisionDeLOfficeNationalDesForets, ETAPES_TYPES.avenantALautorisationDeRechercheMiniere, @@ -517,12 +478,7 @@ const TDE = { ETAPES_TYPES.demandeDeComplements_RecevabiliteDeLaDemande_, ETAPES_TYPES.receptionDeComplements_RecevabiliteDeLaDemande_, ETAPES_TYPES.recevabiliteDeLaDemande, - ETAPES_TYPES.demandeDinformations_ExpertiseDeLOfficeNationalDesForets_, - ETAPES_TYPES.receptionDinformation_ExpertiseDeLOfficeNationalDesForets_, - ETAPES_TYPES.expertiseDeLOfficeNationalDesForets, - ETAPES_TYPES.demandeDinformations_AvisDeLOfficeNationalDesForets_, - ETAPES_TYPES.receptionDinformation_AvisDeLOfficeNationalDesForets_, - ETAPES_TYPES.avisDeLOfficeNationalDesForets, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.classementSansSuite, ETAPES_TYPES.avenantALautorisationDeRechercheMiniere, ETAPES_TYPES.notificationAuDemandeur_AvisDefavorable_, @@ -531,12 +487,9 @@ const TDE = { ], [DEMARCHES_TYPES_IDS.Retrait]: [ ETAPES_TYPES.initiationDeLaDemarcheDeRetrait, - ETAPES_TYPES.demandeDinformations_ExpertiseDeLOfficeNationalDesForets_, ETAPES_TYPES.notificationAuDemandeur_InitiationDeLaDemarcheDeRetrait_, ETAPES_TYPES.receptionDinformation, - ETAPES_TYPES.receptionDinformation_ExpertiseDeLOfficeNationalDesForets_, - ETAPES_TYPES.expertiseDeLOfficeNationalDesForets, - ETAPES_TYPES.avisDeLOfficeNationalDesForets, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.avenantALautorisationDeRechercheMiniere, ETAPES_TYPES.notificationAuDemandeur_SignatureDeLavenantALautorisationDeRechercheMiniere_, ETAPES_TYPES.classementSansSuite, @@ -569,14 +522,9 @@ const TDE = { ETAPES_TYPES.notificationAuDemandeur_ClassementSansSuite_, ETAPES_TYPES.expertiseDREALOuDGTMServiceEau, ETAPES_TYPES.recepisseDeDeclarationLoiSurLeau, - ETAPES_TYPES.demandeDinformations_ExpertiseDeLOfficeNationalDesForets_, - ETAPES_TYPES.receptionDinformation_ExpertiseDeLOfficeNationalDesForets_, - ETAPES_TYPES.expertiseDeLOfficeNationalDesForets, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.demandeDeComplements_SaisineDeLaCARM_, ETAPES_TYPES.receptionDeComplements_SaisineDeLaCARM_, - ETAPES_TYPES.demandeDinformations_AvisDeLOfficeNationalDesForets_, - ETAPES_TYPES.receptionDinformation_AvisDeLOfficeNationalDesForets_, - ETAPES_TYPES.avisDeLOfficeNationalDesForets, ETAPES_TYPES.saisineDeLaCommissionDesAutorisationsDeRecherchesMinieres_CARM_, ETAPES_TYPES.avisDeLaCommissionDesAutorisationsDeRecherchesMinieres_CARM_, ETAPES_TYPES.notificationAuDemandeur_AjournementDeLaCARM_, @@ -623,19 +571,7 @@ const TDE = { ETAPES_TYPES.receptionDinformation_AvisDuDREALDEALOuDGTM_, ETAPES_TYPES.saisineDesCollectivitesLocales, ETAPES_TYPES.avisDunMaire, - ETAPES_TYPES.saisineDesServices, - ETAPES_TYPES.confirmationDeLaccordDuProprietaireDuSol, - ETAPES_TYPES.avisDGTMServiceMilieuxNaturelsBiodiversiteSitesEtPaysages_MNBST_, - ETAPES_TYPES.avisDGTMServiceAmenagementUrbanismeConstructionLogement_AUCL_, - ETAPES_TYPES.avisDeLaDirectionDesEntreprisesDeLaConcurrenceDeLaConsommationDuTravailEtDeLemploi, - ETAPES_TYPES.avisDeLaDirectionDalimentationDeLagricultureEtDeLaForet, - ETAPES_TYPES.avisDeDirectionRegionaleDesAffairesCulturelles, - ETAPES_TYPES.avisDeLagenceRegionaleDeSante, - ETAPES_TYPES.avisDeLaDirectionRegionaleDesFinancesPubliques, - ETAPES_TYPES.avisDeLaCaisseGeneraleDeSecuriteSociale, - ETAPES_TYPES.avisDeLOfficeNationalDesForets, - ETAPES_TYPES.avisDeLaGendarmerieNationale, - ETAPES_TYPES.avisDeLetatMajorOrpaillageEtPecheIllicite_EMOPI_, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement, ETAPES_TYPES.saisineDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisDeLaCommissionDepartementaleDesMines_CDM_, @@ -740,18 +676,11 @@ const TDE = { ETAPES_TYPES.avisDeDemandeConcurrente, ETAPES_TYPES.ouvertureDeLenquetePublique, ETAPES_TYPES.clotureDeLenquetePublique, - ETAPES_TYPES.saisineDesServices, - ETAPES_TYPES.expertiseDeLOfficeNationalDesForets, - ETAPES_TYPES.avisDeLOfficeNationalDesForets, - ETAPES_TYPES.avisDeLInstitutNationalDeLorigineEtDeLaQualite, - ETAPES_TYPES.avisDunServiceAdministratifLocal, - ETAPES_TYPES.avisDeLautoriteMilitaire, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.saisineDesCollectivitesLocales, ETAPES_TYPES.avisDunMaire, ETAPES_TYPES.avisDunPresidentDEPCI, ETAPES_TYPES.avisDuneCollectiviteLocale, - ETAPES_TYPES.avisDuParcNational, - ETAPES_TYPES.avisDuParcNaturelRegional, ETAPES_TYPES.saisineDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement, @@ -855,18 +784,11 @@ const TDE = { ETAPES_TYPES.avisDeDemandeConcurrente, ETAPES_TYPES.ouvertureDeLenquetePublique, ETAPES_TYPES.clotureDeLenquetePublique, - ETAPES_TYPES.saisineDesServices, - ETAPES_TYPES.expertiseDeLOfficeNationalDesForets, - ETAPES_TYPES.avisDeLOfficeNationalDesForets, - ETAPES_TYPES.avisDeLInstitutNationalDeLorigineEtDeLaQualite, - ETAPES_TYPES.avisDunServiceAdministratifLocal, - ETAPES_TYPES.avisDeLautoriteMilitaire, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.saisineDesCollectivitesLocales, ETAPES_TYPES.avisDunMaire, ETAPES_TYPES.avisDunPresidentDEPCI, ETAPES_TYPES.avisDuneCollectiviteLocale, - ETAPES_TYPES.avisDuParcNational, - ETAPES_TYPES.avisDuParcNaturelRegional, ETAPES_TYPES.saisineDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement, @@ -979,18 +901,11 @@ const TDE = { ETAPES_TYPES.avisDeDemandeConcurrente, ETAPES_TYPES.ouvertureDeLenquetePublique, ETAPES_TYPES.clotureDeLenquetePublique, - ETAPES_TYPES.saisineDesServices, - ETAPES_TYPES.expertiseDeLOfficeNationalDesForets, - ETAPES_TYPES.avisDeLOfficeNationalDesForets, - ETAPES_TYPES.avisDeLInstitutNationalDeLorigineEtDeLaQualite, - ETAPES_TYPES.avisDunServiceAdministratifLocal, - ETAPES_TYPES.avisDeLautoriteMilitaire, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.saisineDesCollectivitesLocales, ETAPES_TYPES.avisDunMaire, ETAPES_TYPES.avisDunPresidentDEPCI, ETAPES_TYPES.avisDuneCollectiviteLocale, - ETAPES_TYPES.avisDuParcNational, - ETAPES_TYPES.avisDuParcNaturelRegional, ETAPES_TYPES.saisineDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement, @@ -1072,9 +987,7 @@ const TDE = { ETAPES_TYPES.ouvertureDeLenquetePublique, ETAPES_TYPES.clotureDeLaParticipationDuPublic, ETAPES_TYPES.clotureDeLenquetePublique, - ETAPES_TYPES.saisineDesServices, ETAPES_TYPES.saisineDesCollectivitesLocales, - ETAPES_TYPES.avisDuParcNaturelRegional, ETAPES_TYPES.avisDuPrefetMaritime, ETAPES_TYPES.saisineDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisDeLaCommissionDepartementaleDesMines_CDM_, @@ -1094,13 +1007,7 @@ const TDE = { ETAPES_TYPES.classementSansSuite, ETAPES_TYPES.noteInterneSignalee, ETAPES_TYPES.informationsHistoriquesIncompletes, - ETAPES_TYPES.avisDunServiceAdministratifLocal, - ETAPES_TYPES.avisDeLautoriteMilitaire, - ETAPES_TYPES.avisDuParcNational, - ETAPES_TYPES.avisDuParcNaturelMarin, - ETAPES_TYPES.avisDeLOfficeNationalDesForets, - ETAPES_TYPES.avisDeLIfremer, - ETAPES_TYPES.avisDeLInstitutNationalDeLorigineEtDeLaQualite, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.avisDunMaire, ETAPES_TYPES.avisDunPresidentDEPCI, ETAPES_TYPES.avisDuneCollectiviteLocale, @@ -1122,18 +1029,12 @@ const TDE = { ETAPES_TYPES.demandeDinformations, ETAPES_TYPES.receptionDinformation, ETAPES_TYPES.publicationDeLavisDeDecisionImplicite, - ETAPES_TYPES.saisineDesServices, - ETAPES_TYPES.avisDeLInstitutNationalDeLorigineEtDeLaQualite, - ETAPES_TYPES.avisDunServiceAdministratifLocal, - ETAPES_TYPES.avisDeLautoriteMilitaire, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.saisineDesCollectivitesLocales, ETAPES_TYPES.avisDunMaire, ETAPES_TYPES.avisDunPresidentDEPCI, ETAPES_TYPES.avisDuneCollectiviteLocale, ETAPES_TYPES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement, - ETAPES_TYPES.avisDeLOfficeNationalDesForets, - ETAPES_TYPES.avisDuParcNational, - ETAPES_TYPES.avisDuParcNaturelRegional, ETAPES_TYPES.saisineDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisDuPrefet, @@ -1250,18 +1151,11 @@ const TDE = { ETAPES_TYPES.avisDeDemandeConcurrente, ETAPES_TYPES.ouvertureDeLenquetePublique, ETAPES_TYPES.clotureDeLenquetePublique, - ETAPES_TYPES.saisineDesServices, - ETAPES_TYPES.avisDeLInstitutNationalDeLorigineEtDeLaQualite, - ETAPES_TYPES.avisDunServiceAdministratifLocal, - ETAPES_TYPES.avisDeLautoriteMilitaire, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.saisineDesCollectivitesLocales, ETAPES_TYPES.avisDunMaire, ETAPES_TYPES.avisDunPresidentDEPCI, ETAPES_TYPES.avisDuneCollectiviteLocale, - ETAPES_TYPES.avisDuParcNational, - ETAPES_TYPES.avisDuParcNaturelRegional, - ETAPES_TYPES.avisDeLIfremer, - ETAPES_TYPES.avisDuParcNaturelMarin, ETAPES_TYPES.saisineDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement, @@ -1293,7 +1187,7 @@ const TDE = { ETAPES_TYPES.recevabiliteDeLaDemande, ETAPES_TYPES.demandeDeComplements, ETAPES_TYPES.receptionDeComplements, - ETAPES_TYPES.saisineDesServices, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.demandeDinformations, ETAPES_TYPES.receptionDinformation, ETAPES_TYPES.saisineDuConseilGeneralDeLeconomie_CGE_, @@ -1350,18 +1244,11 @@ const TDE = { ETAPES_TYPES.avisDeDemandeConcurrente, ETAPES_TYPES.ouvertureDeLenquetePublique, ETAPES_TYPES.clotureDeLenquetePublique, - ETAPES_TYPES.saisineDesServices, - ETAPES_TYPES.expertiseDeLOfficeNationalDesForets, - ETAPES_TYPES.avisDeLOfficeNationalDesForets, - ETAPES_TYPES.avisDeLInstitutNationalDeLorigineEtDeLaQualite, - ETAPES_TYPES.avisDunServiceAdministratifLocal, - ETAPES_TYPES.avisDeLautoriteMilitaire, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.saisineDesCollectivitesLocales, ETAPES_TYPES.avisDunMaire, ETAPES_TYPES.avisDunPresidentDEPCI, ETAPES_TYPES.avisDuneCollectiviteLocale, - ETAPES_TYPES.avisDuParcNational, - ETAPES_TYPES.avisDuParcNaturelRegional, ETAPES_TYPES.saisineDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement, @@ -1457,18 +1344,11 @@ const TDE = { ETAPES_TYPES.avisDeDemandeConcurrente, ETAPES_TYPES.ouvertureDeLenquetePublique, ETAPES_TYPES.clotureDeLenquetePublique, - ETAPES_TYPES.saisineDesServices, - ETAPES_TYPES.expertiseDeLOfficeNationalDesForets, - ETAPES_TYPES.avisDeLOfficeNationalDesForets, - ETAPES_TYPES.avisDeLInstitutNationalDeLorigineEtDeLaQualite, - ETAPES_TYPES.avisDunServiceAdministratifLocal, - ETAPES_TYPES.avisDeLautoriteMilitaire, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.saisineDesCollectivitesLocales, ETAPES_TYPES.avisDunMaire, ETAPES_TYPES.avisDunPresidentDEPCI, ETAPES_TYPES.avisDuneCollectiviteLocale, - ETAPES_TYPES.avisDuParcNational, - ETAPES_TYPES.avisDuParcNaturelRegional, ETAPES_TYPES.saisineDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement, @@ -1567,14 +1447,8 @@ const TDE = { ETAPES_TYPES.decisionImplicite, ETAPES_TYPES.ouvertureDeLenquetePublique, ETAPES_TYPES.clotureDeLenquetePublique, - ETAPES_TYPES.saisineDesServices, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.saisineDesCollectivitesLocales, - ETAPES_TYPES.avisDunServiceAdministratifLocal, - ETAPES_TYPES.avisDeLautoriteMilitaire, - ETAPES_TYPES.avisDeLIfremer, - ETAPES_TYPES.avisDuParcNaturelMarin, - ETAPES_TYPES.avisDuParcNational, - ETAPES_TYPES.avisDeLInstitutNationalDeLorigineEtDeLaQualite, ETAPES_TYPES.avisDunMaire, ETAPES_TYPES.avisDunPresidentDEPCI, ETAPES_TYPES.avisDuneCollectiviteLocale, @@ -1621,14 +1495,8 @@ const TDE = { ETAPES_TYPES.clotureDeLaParticipationDuPublic, ETAPES_TYPES.clotureDeLenquetePublique, ETAPES_TYPES.ouvertureDeLenquetePublique, - ETAPES_TYPES.saisineDesServices, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.saisineDesCollectivitesLocales, - ETAPES_TYPES.avisDunServiceAdministratifLocal, - ETAPES_TYPES.avisDeLautoriteMilitaire, - ETAPES_TYPES.avisDeLIfremer, - ETAPES_TYPES.avisDuParcNaturelMarin, - ETAPES_TYPES.avisDuParcNational, - ETAPES_TYPES.avisDeLInstitutNationalDeLorigineEtDeLaQualite, ETAPES_TYPES.avisDunMaire, ETAPES_TYPES.avisDunPresidentDEPCI, ETAPES_TYPES.avisDuneCollectiviteLocale, @@ -1842,18 +1710,12 @@ const TDE = { ETAPES_TYPES.avisDeDemandeConcurrente, ETAPES_TYPES.ouvertureDeLaParticipationDuPublic, ETAPES_TYPES.clotureDeLaParticipationDuPublic, - ETAPES_TYPES.saisineDesServices, - ETAPES_TYPES.avisDeLOfficeNationalDesForets, - ETAPES_TYPES.avisDeLInstitutNationalDeLorigineEtDeLaQualite, - ETAPES_TYPES.avisDunServiceAdministratifLocal, - ETAPES_TYPES.avisDeLautoriteMilitaire, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.saisineDesCollectivitesLocales, ETAPES_TYPES.avisDunMaire, ETAPES_TYPES.avisDunPresidentDEPCI, ETAPES_TYPES.avisDuneCollectiviteLocale, ETAPES_TYPES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement, - ETAPES_TYPES.avisDuParcNational, - ETAPES_TYPES.avisDuParcNaturelRegional, ETAPES_TYPES.saisineDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisDuPrefet, @@ -2307,21 +2169,12 @@ const TDE = { ETAPES_TYPES.expertiseDGTMServicePreventionDesRisquesEtIndustriesExtractives_DATE_, ETAPES_TYPES.ouvertureDeLaParticipationDuPublic, ETAPES_TYPES.clotureDeLaParticipationDuPublic, - ETAPES_TYPES.saisineDesServices, - ETAPES_TYPES.avisDeLOfficeNationalDesForets, - ETAPES_TYPES.avisDeLInstitutNationalDeLorigineEtDeLaQualite, - ETAPES_TYPES.avisDeLaDirectionRegionaleDesFinancesPubliques, - ETAPES_TYPES.avisDeLagenceRegionaleDeSante, - ETAPES_TYPES.avisDeDirectionRegionaleDesAffairesCulturelles, - ETAPES_TYPES.avisDunServiceAdministratifLocal, - ETAPES_TYPES.avisDeLautoriteMilitaire, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.saisineDesCollectivitesLocales, ETAPES_TYPES.avisDunMaire, ETAPES_TYPES.avisDunPresidentDEPCI, ETAPES_TYPES.avisDuneCollectiviteLocale, ETAPES_TYPES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement, - ETAPES_TYPES.avisDuParcNational, - ETAPES_TYPES.avisDuParcNaturelRegional, ETAPES_TYPES.saisineDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisDuPrefet, @@ -2405,15 +2258,9 @@ const TDE = { ETAPES_TYPES.avisDeDemandeConcurrente, ETAPES_TYPES.ouvertureDeLaParticipationDuPublic, ETAPES_TYPES.clotureDeLaParticipationDuPublic, - ETAPES_TYPES.saisineDesServices, - ETAPES_TYPES.avisDeLOfficeNationalDesForets, - ETAPES_TYPES.avisDeLInstitutNationalDeLorigineEtDeLaQualite, - ETAPES_TYPES.avisDunServiceAdministratifLocal, - ETAPES_TYPES.avisDeLautoriteMilitaire, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.saisineDesCollectivitesLocales, ETAPES_TYPES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement, - ETAPES_TYPES.avisDuParcNational, - ETAPES_TYPES.avisDuParcNaturelRegional, ETAPES_TYPES.saisineDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisDuPrefet, @@ -2565,18 +2412,12 @@ const TDE = { ETAPES_TYPES.avisDeDemandeConcurrente, ETAPES_TYPES.ouvertureDeLaParticipationDuPublic, ETAPES_TYPES.clotureDeLaParticipationDuPublic, - ETAPES_TYPES.saisineDesServices, - ETAPES_TYPES.avisDeLOfficeNationalDesForets, - ETAPES_TYPES.avisDeLInstitutNationalDeLorigineEtDeLaQualite, - ETAPES_TYPES.avisDunServiceAdministratifLocal, - ETAPES_TYPES.avisDeLautoriteMilitaire, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.saisineDesCollectivitesLocales, ETAPES_TYPES.avisDunMaire, ETAPES_TYPES.avisDunPresidentDEPCI, ETAPES_TYPES.avisDuneCollectiviteLocale, ETAPES_TYPES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement, - ETAPES_TYPES.avisDuParcNational, - ETAPES_TYPES.avisDuParcNaturelRegional, ETAPES_TYPES.saisineDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisDuPrefet, @@ -2683,18 +2524,12 @@ const TDE = { ETAPES_TYPES.avisDeDemandeConcurrente, ETAPES_TYPES.ouvertureDeLaParticipationDuPublic, ETAPES_TYPES.clotureDeLaParticipationDuPublic, - ETAPES_TYPES.saisineDesServices, - ETAPES_TYPES.avisDeLOfficeNationalDesForets, - ETAPES_TYPES.avisDeLInstitutNationalDeLorigineEtDeLaQualite, - ETAPES_TYPES.avisDunServiceAdministratifLocal, - ETAPES_TYPES.avisDeLautoriteMilitaire, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.saisineDesCollectivitesLocales, ETAPES_TYPES.avisDunMaire, ETAPES_TYPES.avisDunPresidentDEPCI, ETAPES_TYPES.avisDuneCollectiviteLocale, ETAPES_TYPES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement, - ETAPES_TYPES.avisDuParcNational, - ETAPES_TYPES.avisDuParcNaturelRegional, ETAPES_TYPES.saisineDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisDeLaCommissionDepartementaleDesMines_CDM_, ETAPES_TYPES.avisDuPrefet, @@ -3107,13 +2942,8 @@ const TDE = { ETAPES_TYPES.avisDeDemandeConcurrente, ETAPES_TYPES.ouvertureDeLenquetePublique, ETAPES_TYPES.clotureDeLenquetePublique, - ETAPES_TYPES.saisineDesServices, + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, ETAPES_TYPES.saisineDesCollectivitesLocales, - ETAPES_TYPES.avisDunServiceAdministratifLocal, - ETAPES_TYPES.avisDeLautoriteMilitaire, - ETAPES_TYPES.avisDeLOfficeNationalDesForets, - ETAPES_TYPES.avisDuParcNational, - ETAPES_TYPES.avisDuParcNaturelRegional, ETAPES_TYPES.avisDunMaire, ETAPES_TYPES.avisDuneCollectiviteLocale, ETAPES_TYPES.avisEtRapportDuDirecteurRegionalChargeDeLenvironnementDeLamenagementEtDuLogement, diff --git a/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.test.ts b/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.test.ts index 2a939232d..5fb56f74a 100644 --- a/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.test.ts +++ b/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.test.ts @@ -9,7 +9,7 @@ test('getSections erreurs', () => { }) test('getSections pas de surcharge mais pas de sections', () => { - expect(getSections('apm', 'amo', 'abs')).toMatchInlineSnapshot('[]') + expect(getSections('apm', 'amo', 'asc')).toMatchInlineSnapshot('[]') }) test('getSections surcharge', () => { @@ -152,7 +152,7 @@ describe('getSectionsWithValue', () => { { id: 'section', elements: [ - { id: 'element1', type: 'checkboxes', options: [{ id: 'option1', nom: 'nomOption1' }] }, + { id: 'element1', type: 'checkboxes', options: [{ id: 'option1', nom: 'nomOption1' }], optionnel: false }, { id: 'element2', type: 'checkboxes', @@ -160,8 +160,9 @@ describe('getSectionsWithValue', () => { { id: '1', nom: 'one' }, { id: '2', nom: 'two' }, ], + optionnel: false, }, - { id: 'element3', type: 'checkboxes', options: [{ id: '1', nom: 'one' }] }, + { id: 'element3', type: 'checkboxes', options: [{ id: '1', nom: 'one' }], optionnel: false }, ], }, ], @@ -173,6 +174,7 @@ describe('getSectionsWithValue', () => { "elements": [ { "id": "element1", + "optionnel": false, "options": [ { "id": "option1", @@ -184,6 +186,7 @@ describe('getSectionsWithValue', () => { }, { "id": "element2", + "optionnel": false, "options": [ { "id": "1", @@ -201,6 +204,7 @@ describe('getSectionsWithValue', () => { }, { "id": "element3", + "optionnel": false, "options": [ { "id": "1", @@ -218,37 +222,52 @@ describe('getSectionsWithValue', () => { }) test('les substances fiscales sont converties dans leur unité d’affichage', () => { - expect( - getSectionsWithValue( - [ - { - id: 'substancesFiscales', - elements: [ - { id: 'auru', type: 'number', uniteId: 'mgr' }, - { id: 'arge', type: 'integer' }, - { id: 'arse', type: 'integer' }, - ], - }, - ], - { substancesFiscales: { auru: 12.3, arge: null } } - ) - ).toMatchInlineSnapshot(` + const withHeritage = getSectionsWithValue( + [ + { + id: 'substancesFiscales', + elements: [ + { id: 'auru', type: 'number', uniteId: 'mgr', optionnel: false }, + { id: 'arge', type: 'integer', optionnel: false }, + { id: 'arse', type: 'integer', optionnel: false }, + ], + }, + ], + { substancesFiscales: { auru: { value: 12.3 }, arge: { value: null } } } + ) + const withoutHeritage = getSectionsWithValue( + [ + { + id: 'substancesFiscales', + elements: [ + { id: 'auru', type: 'number', uniteId: 'mgr', optionnel: false }, + { id: 'arge', type: 'integer', optionnel: false }, + { id: 'arse', type: 'integer', optionnel: false }, + ], + }, + ], + { substancesFiscales: { auru: 12.3, arge: null } } + ) + expect(withoutHeritage).toMatchInlineSnapshot(` [ { "elements": [ { "id": "auru", + "optionnel": false, "type": "number", "uniteId": "mgr", "value": 12300, }, { "id": "arge", + "optionnel": false, "type": "integer", "value": null, }, { "id": "arse", + "optionnel": false, "type": "integer", "value": null, }, @@ -257,6 +276,7 @@ describe('getSectionsWithValue', () => { }, ] `) + expect(withHeritage).toStrictEqual(withoutHeritage) }) test('les options des liste déroulantes sont calculées si elles sont basées sur des métas', () => { @@ -266,8 +286,8 @@ describe('getSectionsWithValue', () => { { id: 'section', elements: [ - { id: 'unites', type: 'select', valeursMetasNom: 'unites' }, - { id: 'devises', type: 'select', valeursMetasNom: 'devises' }, + { id: 'unites', type: 'select', valeursMetasNom: 'unites', optionnel: false }, + { id: 'devises', type: 'select', valeursMetasNom: 'devises', optionnel: false }, ], }, ], @@ -279,6 +299,7 @@ describe('getSectionsWithValue', () => { "elements": [ { "id": "unites", + "optionnel": false, "options": [ { "id": "deg", @@ -405,6 +426,7 @@ describe('getSectionsWithValue', () => { }, { "id": "devises", + "optionnel": false, "options": [ { "id": "EUR", diff --git a/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.ts b/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.ts index 8c50530f5..3741059c8 100644 --- a/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.ts +++ b/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.ts @@ -1,4 +1,4 @@ -import { caminoDateValidator, toCaminoDate } from '../../date.js' +import { caminoDateValidator } from '../../date.js' import { DEMARCHES_TYPES_IDS, DemarcheTypeId } from '../demarchesTypes.js' import { TITRES_TYPES_IDS, TitreTypeId } from '../titresTypes.js' import { ETAPES_TYPES, EtapeTypeId } from '../etapesTypes.js' @@ -266,7 +266,7 @@ const caracteristiquesARM: Section[] = [ id: 'arm', nom: 'Caractéristiques ARM', elements: [ - { id: 'mecanise', nom: 'Prospection mécanisée', type: 'radio', description: '' }, + { id: 'mecanise', nom: 'Prospection mécanisée', type: 'radio', description: '', optionnel: false }, { id: 'franchissements', nom: "Franchissements de cours d'eau", type: 'integer', optionnel: true, description: "Nombre de franchissements de cours d'eau" }, ], }, @@ -276,7 +276,7 @@ const TDESections = { [TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX]: { [DEMARCHES_TYPES_IDS.Octroi]: { [ETAPES_TYPES.receptionDeComplements_DecisionDeLaMissionAutoriteEnvironnementale_ExamenAuCasParCasDuProjet__]: [ - { id: 'arm', nom: 'Caractéristiques ARM', elements: [{ id: 'mecanise', nom: 'Prospection mécanisée', type: 'radio', description: '' }] }, + { id: 'arm', nom: 'Caractéristiques ARM', elements: [{ id: 'mecanise', nom: 'Prospection mécanisée', type: 'radio', description: '', optionnel: false }] }, ], [ETAPES_TYPES.recepisseDeDeclarationLoiSurLeau]: [ { @@ -311,6 +311,7 @@ const TDESections = { type: 'checkbox', description: "L'entreprise porteuse de la demande est identifiées (extrait Kbis de moins d’un an, déclaration INSEE du statut d’Auto Entrepreneur, justificatif de création de société en cours, (présence code SIRET et APE).", + optionnel: false, }, { id: 'representantLegal', @@ -318,6 +319,7 @@ const TDESections = { type: 'checkbox', description: "Le réprésentant légal de l'entité porteuse de la demande est identifié (Identité, coordonnées, justificatif d'identité - CNI / passeport / carte de résident en cours de validité).", + optionnel: false, }, { id: 'motifsIdentification', nom: 'Motifs identification demandeur', type: 'textarea', optionnel: true, description: '' }, ], @@ -326,14 +328,15 @@ const TDESections = { id: 'armCaracteristiques', nom: "Caractéristiques de l'autorisation de recherche", elements: [ - { id: 'nomSecteur', nom: 'Nom de secteur', type: 'checkbox', description: "Le nom de secteur est cohérent avec l'appellation courante de l'ARM." }, - { id: 'duree', nom: 'Durée', type: 'checkbox', description: "L'autorisation est demandée pour une durée maximum de 4 mois à compter de la date de l'autorisation." }, + { id: 'nomSecteur', nom: 'Nom de secteur', type: 'checkbox', description: "Le nom de secteur est cohérent avec l'appellation courante de l'ARM.", optionnel: false }, + { id: 'duree', nom: 'Durée', type: 'checkbox', description: "L'autorisation est demandée pour une durée maximum de 4 mois à compter de la date de l'autorisation.", optionnel: false }, { id: 'descriptionProjet', nom: 'Description du projet de recherches minières ', type: 'checkbox', description: 'Le projet de recherches minières est décrit : le programme de prospection, les méthodes de travail projetées, les moyens techniques mobilisés, les moyens humains employés.', + optionnel: false, }, { id: 'surfaceDemandee', @@ -341,12 +344,14 @@ const TDESections = { type: 'checkbox', description: "Les surfaces demandées n'excéde pas 3 km², sous la forme de 1 à 3 carrés ou rectangles d'une superficie de 1 km² chacun, tous situés sur le même bassin versant. Les carrés mesurent 1 km de côté et les rectangles 0,5 km de largeur et 2 km de longueur. L'espacement de leurs centres n'est pas supérieur à 4 km.", + optionnel: false, }, { id: 'surfaceMaximumDetenue', nom: 'Surfaces maximum détenues', type: 'checkbox', description: "L'opérateur ne détient pas d'autorisation de recherches sur une surface supérieure à 3 km².", + optionnel: false, }, { id: 'localisationPerimetres', @@ -354,12 +359,14 @@ const TDESections = { type: 'checkbox', description: 'Les périmètres est transmis dans un fichier numérique réutilisable (au format ".geojson"). Le système de coordonnées légal en vigueur est le RGFG95 (ESPG: 2972) avec une précision métrique.', + optionnel: false, }, { id: 'cheminements', nom: 'Cheminements prévisionnels à emprunter', type: 'checkbox', description: "Ces tracés sont élaborés uniquement à partir du réseau carrossable, jusqu'à et à l'intérieur de l'ARM.", + optionnel: false, }, { id: 'localisationCheminements', @@ -367,13 +374,15 @@ const TDESections = { type: 'checkbox', description: 'L\'ensemble de ces tracés est transmis dans un fichier numérique réutilisable (au format ".geojson"). Le système de coordonnées légal en vigueur est le RGFG95 (ESPG: 2972) avec une précision métrique.', + optionnel: false, }, - { id: 'carte500000', nom: 'Carte synthétique 1/500 000', type: 'checkbox', description: 'Le document cartographique inclut les périmètres demandés' }, + { id: 'carte500000', nom: 'Carte synthétique 1/500 000', type: 'checkbox', description: 'Le document cartographique inclut les périmètres demandés', optionnel: false }, { id: 'carte50000', nom: 'Carte synthétique 1/50 000', type: 'checkbox', description: 'Le document cartographique inclut les périmètres demandés, le tracé des cheminements prévisionnels à emprunter, la position des points de franchissement.', + optionnel: false, }, { id: 'motifsDemande', nom: 'Motifs caractéristiques de la demande', type: 'textarea', optionnel: true, description: '' }, ], @@ -382,23 +391,31 @@ const TDESections = { id: 'armMecanisee', nom: 'Informations sur la prospection mécanisée', elements: [ - { id: 'recepisseLSE', nom: "Dossier loi sur l'eau", type: 'checkbox', description: "Le dossier de déclaration loi sur l'eau est présent." }, + { id: 'recepisseLSE', nom: "Dossier loi sur l'eau", type: 'checkbox', description: "Le dossier de déclaration loi sur l'eau est présent.", optionnel: false }, { id: 'recepisseCasParCas', nom: "Décision d'examen au cas par cas", type: 'checkbox', description: "L'étape de décision dans le cadre de l'examen au cas par cas est présente et favorable.", + optionnel: false, }, - { id: 'franchissementsCoursDeau', nom: "Franchissements de cours d'eau", type: 'checkbox', description: "Les franchissements de cours d'eau sont indiqués." }, + { id: 'franchissementsCoursDeau', nom: "Franchissements de cours d'eau", type: 'checkbox', description: "Les franchissements de cours d'eau sont indiqués.", optionnel: false }, { id: 'localisationPointsFranchissementsCoursDeau', nom: "Localisation des points de franchissement de cours d'eau", type: 'checkbox', description: 'L\'ensemble de ces point est transmis dans un fichier numérique réutilisable (au format ".geojson"). Le système de coordonnées légal en vigueur est le RGFG95 (ESPG: 2972) avec une précision métrique.', + optionnel: false, + }, + { id: 'descriptionMateriel', nom: 'Description du matériel', type: 'checkbox', description: 'Le matériel utilisé et son origine (acquisition, location) sont décrits.', optionnel: false }, + { + id: 'tonnageMaximum', + nom: 'Tonnage maximum autorisé', + type: 'checkbox', + description: 'Le tonnage maximum des pelles mécaniques autorisées fixé à 21 tonnes est respecté.', + optionnel: false, }, - { id: 'descriptionMateriel', nom: 'Description du matériel', type: 'checkbox', description: 'Le matériel utilisé et son origine (acquisition, location) sont décrits.' }, - { id: 'tonnageMaximum', nom: 'Tonnage maximum autorisé', type: 'checkbox', description: 'Le tonnage maximum des pelles mécaniques autorisées fixé à 21 tonnes est respecté.' }, { id: 'motifsMateriel', nom: 'Motifs caractéristiques matériel', type: 'textarea', optionnel: true, description: '' }, ], }, @@ -412,12 +429,14 @@ const TDESections = { type: 'checkbox', description: "La justification des capacités techniques s'appuie sur la présentation de l'activité professionnelle actuelle et les références professionnelles en matière minière du demandeur (curriculum vitae, ou à défaut, les formations suivies). S'il s'agit d'une personne morale les références professionnelles des cadres chargés du suivi et de la conduite des travaux sont présentées.", + optionnel: false, }, { id: 'responsableTravaux', nom: 'Responsable des travaux', type: 'checkbox', description: "Le responsable des travaux est identifié (Identité, coordonnées, justificatif d'identité - CNI / passeport / carte de résident en cours de validité).", + optionnel: false, }, { id: 'motifsCapaciteTechniques', nom: 'Motifs capacité techniques', type: 'textarea', optionnel: true, description: '' }, ], @@ -431,6 +450,7 @@ const TDESections = { nom: 'Plan de financement', type: 'checkbox', description: 'Le plan inclut le montant de la dépense totale envisagée en euros pour conduire la prospection et le plan prévisionnel de financement associé.', + optionnel: false, }, { id: 'justificationCapacitesFinancieres', @@ -438,6 +458,7 @@ const TDESections = { type: 'checkbox', description: "La démonstration des capacités financières à exercer une activité d'exploration comporte la justification des ressources financières disponibles correspondant au plan de financement.", + optionnel: false, }, { id: 'justificatifSituationFiscale', @@ -445,6 +466,7 @@ const TDESections = { type: 'checkbox', description: "La justification de situation fiscale régulière est présentée (attestation ou justificatif des services fiscaux, déclaration unique DGFIP, moratoire accordé par la même autorité) excepté pour les sociétés créées dans l'année.", + optionnel: false, }, { id: 'motifsCapaciteFinancieres', nom: 'Motifs capacités financières', type: 'textarea', optionnel: true, description: '' }, ], @@ -466,44 +488,8 @@ const TDESections = { [ETAPES_TYPES.receptionDeComplements_RecevabiliteDeLaDemande_]: caracteristiquesARM, [ETAPES_TYPES.receptionDeComplements_CompletudeDeLaDemande_]: caracteristiquesARM, [ETAPES_TYPES.receptionDinformation_RecevabiliteDeLaDemande_]: caracteristiquesARM, - [ETAPES_TYPES.expertiseDeLOfficeNationalDesForets]: [ - { - id: 'onf', - nom: 'Office National des Forêts', - elements: [ - { id: 'motifs', nom: 'Motifs', type: 'textarea', optionnel: true, description: "Élément d'expertise" }, - { id: 'expert', nom: 'Expert', type: 'text', optionnel: true, description: "Agent ONF qui a réalisé l'expertise" }, - { id: 'agent', nom: 'Agent', type: 'text', optionnel: true, description: 'Chargé de mission foncier du Service Aménagement du Territoire' }, - { - id: 'dateDebut', - nom: 'Date de début', - type: 'date', - dateFin: toCaminoDate('2018-02-07'), - dateDebut: toCaminoDate('2003-07-24'), - optionnel: true, - description: 'Date de début de l’expertise', - }, - ], - }, - ], - [ETAPES_TYPES.avisDeLOfficeNationalDesForets]: [ - { - id: 'onf', - nom: 'Office National des Forêts', - elements: [ - { id: 'motifs', nom: 'Motifs', type: 'textarea', optionnel: true, description: "Élément d'expertise" }, - { - id: 'signataire', - nom: 'Signataire', - type: 'text', - optionnel: true, - description: 'Directeur ONF ou responsable du service Service Aménagement du Territoire qui apparaitra sur les documents externe pour signature', - }, - ], - }, - ], [ETAPES_TYPES.signatureDeLautorisationDeRechercheMiniere]: [ - { id: 'arm', nom: 'Caractéristiques ARM', elements: [{ id: 'mecanise', nom: 'Prospection mécanisée', type: 'radio' }] }, + { id: 'arm', nom: 'Caractéristiques ARM', elements: [{ id: 'mecanise', nom: 'Prospection mécanisée', type: 'radio', optionnel: false }] }, { id: 'suivi', nom: 'Suivi de la démarche', @@ -940,19 +926,20 @@ const basicElementValidator = z.object({ description: z.string().optional(), dateDebut: caminoDateValidator.optional(), dateFin: caminoDateValidator.optional(), - optionnel: z.boolean().optional(), + // TODO 2024-06-20: virer le optional quand on a viré la colonne sections dans la table activités + optionnel: z.boolean().optional().default(false), }) export const dateElementValidator = basicElementValidator.extend({ type: z.literal('date') }) export const textElementValidator = basicElementValidator.extend({ type: z.enum(['text', 'textarea']) }) export const urlElementValidator = basicElementValidator.extend({ type: z.literal('url') }) export const numberElementValidator = basicElementValidator.extend({ type: z.enum(['number', 'integer']), uniteId: uniteIdValidator.optional() }) -export const radioElementValidator = basicElementValidator.extend({ type: z.literal('radio'), optionnel: z.literal(false).optional() }) -export const checkboxElementValidator = basicElementValidator.extend({ type: z.literal('checkbox'), optionnel: z.literal(false).optional() }) +export const radioElementValidator = basicElementValidator.extend({ type: z.literal('radio') }) +export const checkboxElementValidator = basicElementValidator.extend({ type: z.literal('checkbox'), optionnel: z.literal(false).optional().default(false) }) export const checkboxesElementValidator = basicElementValidator.extend({ type: z.literal('checkboxes'), options: z.array(z.object({ id: z.string(), nom: z.string() })), - optionnel: z.boolean().optional(), + optionnel: z.literal(false).optional().default(false), }) const isSelectElementWithMetas = (element: DeepReadonly<SelectElement>): element is SelectElementWithMetas => 'valeursMetasNom' in element diff --git a/packages/common/src/titres.test.ts b/packages/common/src/titres.test.ts index 349e60576..b62f24549 100644 --- a/packages/common/src/titres.test.ts +++ b/packages/common/src/titres.test.ts @@ -2,12 +2,13 @@ import { describe, expect, test } from 'vitest' import { TitrePropTitreEtapeFindDemarcheEtape, getMostRecentValuePropFromEtapeFondamentaleValide } from './titres' import { toCaminoDate } from './date' import { entrepriseIdValidator } from './entreprise' +import { ETAPE_IS_BROUILLON, ETAPE_IS_NOT_BROUILLON } from './etape' describe('getMostRecentValuePropFromEtapeFondamentaleValide', () => { test("retourne le titulaire de la demande même si elle est en brouillon, si elle est l'unique étape", () => { const asl: TitrePropTitreEtapeFindDemarcheEtape = { etape_type_id: 'asl', etape_statut_id: 'fai', - is_brouillon: false, + is_brouillon: ETAPE_IS_NOT_BROUILLON, ordre: 1, } const mfr: TitrePropTitreEtapeFindDemarcheEtape = { @@ -22,7 +23,7 @@ describe('getMostRecentValuePropFromEtapeFondamentaleValide', () => { perimetre: null, }, etape_statut_id: 'fai', - is_brouillon: true, + is_brouillon: ETAPE_IS_BROUILLON, ordre: 1, } @@ -48,7 +49,7 @@ describe('getMostRecentValuePropFromEtapeFondamentaleValide', () => { perimetre: null, }, etape_statut_id: 'acc', - is_brouillon: false, + is_brouillon: ETAPE_IS_NOT_BROUILLON, ordre: 2, } @@ -64,7 +65,7 @@ describe('getMostRecentValuePropFromEtapeFondamentaleValide', () => { perimetre: null, }, etape_statut_id: 'acc', - is_brouillon: false, + is_brouillon: ETAPE_IS_NOT_BROUILLON, ordre: 1, } diff --git a/packages/common/src/titres.ts b/packages/common/src/titres.ts index bd99ae6bf..8ebca5643 100644 --- a/packages/common/src/titres.ts +++ b/packages/common/src/titres.ts @@ -12,6 +12,7 @@ import { TitreId, titreIdValidator, titreSlugValidator } from './validators/titr import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from './typescript-tools.js' import { EntrepriseId, entrepriseIdValidator } from './entreprise.js' import { isFondamentalesStatutOk } from './static/etapesStatuts.js' +import { ETAPE_IS_NOT_BROUILLON } from './etape.js' const commonTitreValidator = z.object({ id: titreIdValidator, @@ -123,7 +124,7 @@ export type TitrePropTitreEtapeFindDemarche<F extends Pick<DemarcheEtape, 'etape } export const getMostRecentValuePropFromEtapeFondamentaleValide = < - P extends 'titulaireIds' | 'amodiataireIds' | 'perimetre' | 'substances', + P extends 'titulaireIds' | 'amodiataireIds' | 'perimetre' | 'substances' | 'duree', F extends Pick<DemarcheEtapeFondamentale, 'etape_statut_id' | 'etape_type_id' | 'ordre' | 'fondamentale' | 'is_brouillon'>, NF extends Pick<DemarcheEtapeNonFondamentale, 'etape_statut_id' | 'etape_type_id' | 'ordre' | 'is_brouillon'>, >( @@ -135,7 +136,7 @@ export const getMostRecentValuePropFromEtapeFondamentaleValide = < for (const titreDemarche of titreDemarchesDesc) { const titreEtapeDesc = [...titreDemarche.etapes].sort((a, b) => b.ordre - a.ordre).filter((etape): etape is F => 'fondamentale' in etape) for (const titreEtape of titreEtapeDesc) { - if (isFondamentalesStatutOk(titreEtape.etape_statut_id) && (!titreEtape.is_brouillon || titreEtapeDesc.length === 1)) { + if (isFondamentalesStatutOk(titreEtape.etape_statut_id) && (titreEtape.is_brouillon === ETAPE_IS_NOT_BROUILLON || titreEtapeDesc.length === 1)) { const value = titreEtape.fondamentale[propId] if ((Array.isArray(value) && isNotNullNorUndefinedNorEmpty(value)) || (!Array.isArray(value) && isNotNullNorUndefined(value))) { return value diff --git a/packages/common/src/typescript-tools.ts b/packages/common/src/typescript-tools.ts index 4e715dca8..dc8d27a1b 100644 --- a/packages/common/src/typescript-tools.ts +++ b/packages/common/src/typescript-tools.ts @@ -23,6 +23,7 @@ export function isNotNullNorUndefinedNorEmpty(value: string | DeepReadonly<any[] } export function isNullOrUndefinedOrEmpty<U>(value: DeepReadonly<U[]> | null | undefined): value is null | undefined +export function isNullOrUndefinedOrEmpty<U>(value: U[] | null | undefined): value is null | undefined export function isNullOrUndefinedOrEmpty(value: string | null | undefined): value is null | undefined export function isNullOrUndefinedOrEmpty(value: string | DeepReadonly<any[]> | null | undefined) { if (value === null || value === undefined) { diff --git a/packages/ui/package.json b/packages/ui/package.json index 0a7c0dd64..71b03ed91 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -37,8 +37,8 @@ "@types/geojson": "^7946.0.14", "@types/leaflet": "^1.9.12", "@types/leaflet.markercluster": "^1.5.4", - "@typescript-eslint/eslint-plugin": "^7.7.1", - "@typescript-eslint/parser": "^7.7.1", + "@typescript-eslint/eslint-plugin": "^7.12.0", + "@typescript-eslint/parser": "^7.12.0", "@uppy/core": "^3.10.1", "@uppy/tus": "^3.5.4", "@vitejs/plugin-vue-jsx": "^3.1.0", @@ -104,8 +104,13 @@ "P": "readonly", "dsfr": "readonly" }, - "extends": ["standard", "prettier"], - "ignorePatterns": ["!.storybook"], + "extends": [ + "standard", + "prettier" + ], + "ignorePatterns": [ + "!.storybook" + ], "rules": { "camelcase": 0, "no-unused-vars": 0, @@ -117,8 +122,14 @@ "parserOptions": { "project": true }, - "files": ["*.tsx", "*.ts", "*.js"], - "extends": ["plugin:@typescript-eslint/recommended"], + "files": [ + "*.tsx", + "*.ts", + "*.js" + ], + "extends": [ + "plugin:@typescript-eslint/recommended" + ], "rules": { "camelcase": 0, "newline-before-return": 0, @@ -149,17 +160,23 @@ "paths": [ { "name": "vue", - "importNames": ["capitalize"], + "importNames": [ + "capitalize" + ], "message": "Please use capitalize from camino-common/src/strings" }, { "name": "vue-router", - "importNames": ["Router"], + "importNames": [ + "Router" + ], "message": "Please use CaminoRouter" }, { "name": "vue-router", - "importNames": ["RouteLocationNormalized"], + "importNames": [ + "RouteLocationNormalized" + ], "message": "Please use CaminoRouteLocation" } ] @@ -189,7 +206,9 @@ } } }, - "browserslist": ["supports es6-module"], + "browserslist": [ + "supports es6-module" + ], "dependencies": { "zod": "^3.23.4" } diff --git a/packages/ui/src/components/_common/document-type-typeahead.stories.tsx b/packages/ui/src/components/_common/document-type-typeahead.stories.tsx deleted file mode 100644 index 468d5b84b..000000000 --- a/packages/ui/src/components/_common/document-type-typeahead.stories.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { Meta, StoryFn } from '@storybook/vue3' -import { action } from '@storybook/addon-actions' -import { DocumentTypeTypeahead } from './document-type-typeahead' - -const meta: Meta = { - title: 'Components/Common/DocumentTypeTypeahead', - // @ts-ignore @storybook/vue3 n'aime pas les composants tsx - component: DocumentTypeTypeahead, -} -export default meta - -const documentTypeIdSelected = action('documentTypeIdSelected') - -export const Default: StoryFn = () => <DocumentTypeTypeahead documentTypeIds={['car', 'doe']} documentTypeIdSelected={documentTypeIdSelected} alwaysOpen={true} /> -export const WithDocumentTypeAlreadySelected: StoryFn = () => <DocumentTypeTypeahead documentTypeIds={['car', 'doe']} initialValue="car" documentTypeIdSelected={documentTypeIdSelected} /> diff --git a/packages/ui/src/components/_common/document-type-typeahead.stories_snapshots_Default.html b/packages/ui/src/components/_common/document-type-typeahead.stories_snapshots_Default.html deleted file mode 100644 index ae4fe651d..000000000 --- a/packages/ui/src/components/_common/document-type-typeahead.stories_snapshots_Default.html +++ /dev/null @@ -1,7 +0,0 @@ -<div id="typeahead_271_wrapper" class="_typeahead_8eddf1"> - <div class="flex"><input id="typeahead_271" type="text" name="typeahead_271" class="fr-input" placeholder="" autocomplete="off"></div> - <div class="_typeahead-list_8eddf1"> - <div class="_typeahead-list-item_8eddf1 _typeahead-list-item-active_8eddf1"><span>Documents cartographiques</span></div> - <div class="_typeahead-list-item_8eddf1 "><span>Dossier "Loi sur l'eau"</span></div> - </div> -</div> \ No newline at end of file diff --git a/packages/ui/src/components/_common/document-type-typeahead.tsx b/packages/ui/src/components/_common/document-type-typeahead.tsx deleted file mode 100644 index 62a999b63..000000000 --- a/packages/ui/src/components/_common/document-type-typeahead.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { Ref, computed, defineComponent, ref } from 'vue' -import { TypeAheadSingle } from '../_ui/typeahead-single' -import { DeepReadonly, isNotNullNorUndefined } from 'camino-common/src/typescript-tools' -import { DocumentTypeId, DocumentsTypes } from 'camino-common/src/static/documentsTypes' - -type Props = { - alwaysOpen?: boolean - documentTypeIds: DeepReadonly<DocumentTypeId[]> - initialValue?: DocumentTypeId - documentTypeIdSelected: (documentTypeId: DocumentTypeId | null) => void -} - -type DocumentLabel = { id: DocumentTypeId; nom: string } - -export const DocumentTypeTypeahead = defineComponent<Props>(props => { - const documentTypeSelected = ref<DocumentLabel | null>(props.initialValue ? DocumentsTypes[props.initialValue] : null) as Ref<DocumentLabel | null> - const documentTypeUpdate = async (documentType: DocumentLabel | undefined) => { - documentTypeSelected.value = documentType ?? null - props.documentTypeIdSelected(isNotNullNorUndefined(documentType) ? documentType.id : null) - } - - const sortedByUs = computed<DeepReadonly<DocumentLabel[]>>(() => [...props.documentTypeIds].map(dtId => DocumentsTypes[dtId]).sort((a, b) => a.nom.localeCompare(b.nom))) - - const documentTypeFiltered = ref<DeepReadonly<DocumentLabel[]>>(sortedByUs.value) as Ref<DeepReadonly<DocumentLabel[]>> - const documentTypeOnInput = (search: string) => { - const formatedSearch = search.trim().toLowerCase() - - if (formatedSearch.length === 0) { - documentTypeFiltered.value = sortedByUs.value - } else { - documentTypeFiltered.value = sortedByUs.value.filter(documentType => documentType.nom.toLowerCase().includes(formatedSearch.toLowerCase())) - } - } - - return () => ( - <TypeAheadSingle - overrideItem={documentTypeSelected.value} - props={{ - alwaysOpen: props.alwaysOpen, - items: documentTypeFiltered.value, - itemChipLabel: item => item.nom, - itemKey: 'id', - placeholder: '', - minInputLength: 0, - onSelectItem: documentTypeUpdate, - onInput: documentTypeOnInput, - }} - /> - ) -}) - -// @ts-ignore waiting for https://github.com/vuejs/core/issues/7833 -DocumentTypeTypeahead.props = ['documentTypeIdSelected', 'documentTypeIds', 'alwaysOpen', 'initialValue'] diff --git a/packages/ui/src/components/_common/etape-statut.stories.tsx b/packages/ui/src/components/_common/etape-statut.stories.tsx index 935a45846..a5af65567 100644 --- a/packages/ui/src/components/_common/etape-statut.stories.tsx +++ b/packages/ui/src/components/_common/etape-statut.stories.tsx @@ -1,6 +1,7 @@ import { Meta, StoryFn } from '@storybook/vue3' -import { EtapeStatut } from './etape-statut' +import { AvisStatut, EtapeStatut } from './etape-statut' import { EtapesStatuts } from 'camino-common/src/static/etapesStatuts' +import { AvisStatutIds } from 'camino-common/src/static/avisTypes' const meta: Meta = { title: 'Components/Common/EtapeStatut', @@ -24,5 +25,19 @@ export const All: StoryFn = () => ( </tr> ))} </table> + <table> + <tr> + <th>Statut des avis</th> + <th>Rendu</th> + </tr> + {AvisStatutIds.map(statutId => ( + <tr> + <td>{statutId}</td> + <td> + <AvisStatut avisStatutId={statutId} /> + </td> + </tr> + ))} + </table> </div> ) diff --git a/packages/ui/src/components/_common/etape-statut.stories_snapshots_All.html b/packages/ui/src/components/_common/etape-statut.stories_snapshots_All.html index 0e0e4c753..639491f2d 100644 --- a/packages/ui/src/components/_common/etape-statut.stories_snapshots_All.html +++ b/packages/ui/src/components/_common/etape-statut.stories_snapshots_All.html @@ -107,4 +107,34 @@ </td> </tr> </table> + <table> + <tr> + <th>Statut des avis</th> + <th>Rendu</th> + </tr> + <tr> + <td>Favorable</td> + <td> + <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-badge--green-bourgeon" title="Favorable" aria-label="Favorable">Favorable</p> + </td> + </tr> + <tr> + <td>Défavorable</td> + <td> + <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-badge--purple-glycine" title="Défavorable" aria-label="Défavorable">Défavorable</p> + </td> + </tr> + <tr> + <td>Favorable avec réserves</td> + <td> + <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-badge--green-bourgeon" title="Favorable avec réserves" aria-label="Favorable avec réserves">Favorable avec réserves</p> + </td> + </tr> + <tr> + <td>Non renseigné</td> + <td> + <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-badge--beige-gris-galet" title="Non renseigné" aria-label="Non renseigné">Non renseigné</p> + </td> + </tr> + </table> </div> \ No newline at end of file diff --git a/packages/ui/src/components/_common/etape-statut.tsx b/packages/ui/src/components/_common/etape-statut.tsx index 02913c521..4b42f62c9 100644 --- a/packages/ui/src/components/_common/etape-statut.tsx +++ b/packages/ui/src/components/_common/etape-statut.tsx @@ -2,6 +2,7 @@ import { FunctionalComponent, HTMLAttributes } from 'vue' import { Badge } from '../_ui/badge' import { CouleurIllustrative } from 'camino-common/src/static/couleurs' import { EtapeStatutId, EtapesStatuts, ETAPES_STATUTS } from 'camino-common/src/static/etapesStatuts' +import { AvisStatutId } from 'camino-common/src/static/avisTypes' type Props = { etapeStatutId: EtapeStatutId @@ -32,3 +33,15 @@ export const EtapeStatut: FunctionalComponent<Props> = (props: Props) => { return <Badge ariaLabel={EtapesStatuts[props.etapeStatutId].nom} badgeColor={couleur} /> } + +const avisStatutToEtapeStatut = { + Favorable: ETAPES_STATUTS.FAVORABLE, + Défavorable: ETAPES_STATUTS.DEFAVORABLE, + 'Favorable avec réserves': ETAPES_STATUTS.FAVORABLE_AVEC_RESERVE, + 'Non renseigné': ETAPES_STATUTS.NON_APPLICABLE, +} as const satisfies Record<AvisStatutId, EtapeStatutId> + +export const AvisStatut: FunctionalComponent<{ avisStatutId: AvisStatutId }> = props => { + const couleur = couleurParStatut[avisStatutToEtapeStatut[props.avisStatutId]] + return <Badge ariaLabel={props.avisStatutId} badgeColor={couleur} /> +} diff --git a/packages/ui/src/components/_common/new-section-element.stories.tsx b/packages/ui/src/components/_common/new-section-element.stories.tsx index 03f6a5042..64e6cf074 100644 --- a/packages/ui/src/components/_common/new-section-element.stories.tsx +++ b/packages/ui/src/components/_common/new-section-element.stories.tsx @@ -16,6 +16,7 @@ export const Text: StoryFn = () => ( nom: "nom de l'élément", description: 'description', value: 'Valeur', + optionnel: false, }} /> ) @@ -28,6 +29,7 @@ export const GranulatsMarins: StoryFn = () => ( nom: 'Granulats Marins', description: 'description', value: 200, + optionnel: false, }} /> ) @@ -40,6 +42,7 @@ export const JORF: StoryFn = () => ( nom: 'JORF', description: 'description', value: 'JORFTEXT000000592092', + optionnel: false, }} /> ) @@ -52,6 +55,7 @@ export const Url: StoryFn = () => ( nom: "nom de l'élément", description: 'description', value: 'https://google.fr', + optionnel: false, }} /> ) @@ -64,6 +68,7 @@ export const Date: StoryFn = () => ( nom: 'Une date', description: 'description', value: toCaminoDate('2022-01-01'), + optionnel: false, }} /> ) @@ -81,6 +86,7 @@ export const Checkboxes: StoryFn = () => ( { id: 'option3', nom: 'Option 3' }, { id: 'option4', nom: 'Option 4' }, ], + optionnel: false, }} /> ) @@ -98,6 +104,7 @@ export const Select: StoryFn = () => ( { id: 'option3', nom: 'Option 3' }, { id: 'option4', nom: 'Option 4' }, ], + optionnel: false, }} /> ) @@ -109,6 +116,7 @@ export const Number: StoryFn = () => ( type: 'number', nom: 'Un nombre', value: 2, + optionnel: false, }} /> ) @@ -121,6 +129,7 @@ export const Radio: StoryFn = () => ( type: 'radio', nom: 'Un radio bouton', value: true, + optionnel: false, }} /> <SectionElement @@ -129,6 +138,7 @@ export const Radio: StoryFn = () => ( type: 'radio', nom: 'Un autre radio bouton', value: false, + optionnel: false, }} /> </div> diff --git a/packages/ui/src/components/_common/new-section.stories.tsx b/packages/ui/src/components/_common/new-section.stories.tsx index 5697573e4..108573f75 100644 --- a/packages/ui/src/components/_common/new-section.stories.tsx +++ b/packages/ui/src/components/_common/new-section.stories.tsx @@ -16,13 +16,14 @@ export const Default: StoryFn = () => ( nom: 'Caractéristiques ARM', id: 'arm', elements: [ - { id: 'mecanisation', type: 'radio', nom: 'Mécanisation', value: true }, + { id: 'mecanisation', type: 'radio', nom: 'Mécanisation', value: true, optionnel: false }, { id: 'franchissements', nom: "Franchissements de cours d'eau", type: 'integer', value: 3, description: "Nombre de franchissements de cours d'eau", + optionnel: false, }, ], }} @@ -42,6 +43,7 @@ export const WithoutContent: StoryFn = () => ( type: 'radio', nom: 'Mécanisation', value: null, + optionnel: false, }, { id: 'franchissements', @@ -49,6 +51,7 @@ export const WithoutContent: StoryFn = () => ( type: 'integer', description: "Nombre de franchissements de cours d'eau", value: null, + optionnel: false, }, ], }} diff --git a/packages/ui/src/components/_common/new-sections-edit.stories.tsx b/packages/ui/src/components/_common/new-sections-edit.stories.tsx index bcb2762ad..8bbde1c43 100644 --- a/packages/ui/src/components/_common/new-sections-edit.stories.tsx +++ b/packages/ui/src/components/_common/new-sections-edit.stories.tsx @@ -33,6 +33,7 @@ export const Default: StoryFn = () => ( dateDebut: toCaminoDate('2018-01-01'), type: 'number', value: null, + optionnel: false, }, { id: 'mercure', @@ -40,6 +41,7 @@ export const Default: StoryFn = () => ( description: 'Masse en gramme de l’ensemble des produits contaminés envoyés en traitement au cours du trimestre.', type: 'number', value: null, + optionnel: false, }, { id: 'carburantDetaxe', @@ -48,6 +50,7 @@ export const Default: StoryFn = () => ( dateDebut: toCaminoDate('2018-01-01'), type: 'number', value: null, + optionnel: false, }, { id: 'carburantConventionnel', @@ -55,6 +58,7 @@ export const Default: StoryFn = () => ( description: 'Volume total en litre de carburant conventionnel consommé au cours du trimestre par les travaux réalisés sur le chantier.', type: 'number', value: null, + optionnel: false, }, { id: 'pompes', @@ -62,6 +66,7 @@ export const Default: StoryFn = () => ( description: 'Des pompes étaient-elles présentes sur le chantier', type: 'radio', value: null, + optionnel: false, }, { id: 'pelles', @@ -70,8 +75,9 @@ export const Default: StoryFn = () => ( dateDebut: toCaminoDate('2018-01-01'), type: 'number', value: null, + optionnel: false, }, - { id: 'effectifs', nom: 'Effectifs', description: 'Nombre moyen de salariés sur le chantier au cours du trimestre.', type: 'number', value: null }, + { id: 'effectifs', nom: 'Effectifs', description: 'Nombre moyen de salariés sur le chantier au cours du trimestre.', type: 'number', optionnel: false, value: null }, { id: 'environnement', nom: 'Dépenses relatives à la protection de l’environnement (euros)', @@ -151,6 +157,7 @@ export const TousLesElementsVidesOptionnels: StoryFn = () => ( description: 'Description pour radio', type: 'radio', value: null, + optionnel: false, }, { id: 'checkbox', @@ -158,6 +165,7 @@ export const TousLesElementsVidesOptionnels: StoryFn = () => ( description: 'Description pour checkbox', type: 'checkbox', value: null, + optionnel: false, }, { id: 'checkboxes', @@ -169,6 +177,7 @@ export const TousLesElementsVidesOptionnels: StoryFn = () => ( { id: '2', nom: 'checkbox2' }, ], value: [], + optionnel: false, }, { id: 'select', @@ -200,6 +209,7 @@ export const TousLesElementsRequis: StoryFn = () => ( description: 'Description pour integer', type: 'integer', value: null, + optionnel: false, }, { id: 'number', @@ -207,6 +217,7 @@ export const TousLesElementsRequis: StoryFn = () => ( description: 'Description pour number', type: 'number', value: null, + optionnel: false, }, { id: 'date', @@ -214,6 +225,7 @@ export const TousLesElementsRequis: StoryFn = () => ( description: 'Description pour date', type: 'date', value: null, + optionnel: false, }, { id: 'textarea', @@ -221,6 +233,7 @@ export const TousLesElementsRequis: StoryFn = () => ( description: 'Description pour textarea', type: 'textarea', value: null, + optionnel: false, }, { id: 'text', @@ -228,6 +241,7 @@ export const TousLesElementsRequis: StoryFn = () => ( description: 'Description pour text', type: 'text', value: null, + optionnel: false, }, { id: 'url', @@ -235,6 +249,7 @@ export const TousLesElementsRequis: StoryFn = () => ( description: 'Description pour url', type: 'url', value: null, + optionnel: false, }, { id: 'radio', @@ -242,6 +257,7 @@ export const TousLesElementsRequis: StoryFn = () => ( description: 'Description pour radio', type: 'radio', value: null, + optionnel: false, }, { id: 'checkbox', @@ -249,6 +265,7 @@ export const TousLesElementsRequis: StoryFn = () => ( description: 'Description pour checkbox', type: 'checkbox', value: null, + optionnel: false, }, { id: 'checkboxes', @@ -260,6 +277,7 @@ export const TousLesElementsRequis: StoryFn = () => ( { id: '2', nom: 'checkbox2' }, ], value: [], + optionnel: false, }, { id: 'select', @@ -291,6 +309,7 @@ export const TousLesElementsRemplis: StoryFn = () => ( description: 'Description pour integer', type: 'integer', value: 12, + optionnel: false, }, { id: 'number', @@ -298,6 +317,7 @@ export const TousLesElementsRemplis: StoryFn = () => ( description: 'Description pour number', type: 'number', value: 8.2, + optionnel: false, }, { id: 'date', @@ -305,6 +325,7 @@ export const TousLesElementsRemplis: StoryFn = () => ( description: 'Description pour date', type: 'date', value: toCaminoDate('2023-09-01'), + optionnel: false, }, { id: 'textarea', @@ -312,6 +333,7 @@ export const TousLesElementsRemplis: StoryFn = () => ( description: 'Description pour textarea', type: 'textarea', value: 'ceci est un textarea', + optionnel: false, }, { id: 'text', @@ -319,6 +341,7 @@ export const TousLesElementsRemplis: StoryFn = () => ( description: 'Description pour text', type: 'text', value: 'ceci est un text', + optionnel: false, }, { id: 'url', @@ -326,6 +349,7 @@ export const TousLesElementsRemplis: StoryFn = () => ( description: 'Description pour url', type: 'url', value: 'https://google.fr', + optionnel: false, }, { id: 'radio', @@ -333,6 +357,7 @@ export const TousLesElementsRemplis: StoryFn = () => ( description: 'Description pour radio', type: 'radio', value: true, + optionnel: false, }, { id: 'checkbox', @@ -340,6 +365,7 @@ export const TousLesElementsRemplis: StoryFn = () => ( description: 'Description pour checkbox', type: 'checkbox', value: true, + optionnel: false, }, { id: 'checkboxes', @@ -352,6 +378,7 @@ export const TousLesElementsRemplis: StoryFn = () => ( { id: '3', nom: 'checkbox3' }, ], value: ['1', '2'], + optionnel: false, }, { id: 'select', @@ -360,6 +387,7 @@ export const TousLesElementsRemplis: StoryFn = () => ( type: 'select', options: UNITES as NonEmptyArray<Unite>, value: 'deg', + optionnel: false, }, ], }, @@ -381,6 +409,7 @@ export const VolumeGranulatsExtrait: StoryFn = () => ( type: 'number', description: "Volume de granulats marins extrait, en mètre cube, au cours de l'année.", value: 12, + optionnel: false, }, ], }, @@ -403,6 +432,7 @@ export const Date: StoryFn = () => ( type: 'date', description: 'Et quelle belle date', value: null, + optionnel: false, }, ], }, @@ -430,6 +460,7 @@ export const Checkboxes: StoryFn = () => ( { id: '3', nom: 'plop 3' }, ], value: [], + optionnel: false, }, ], }, @@ -468,6 +499,7 @@ export const ToutesLesActivites: StoryFn = () => ( type: 'number', description: `<b>${unite.symbole} (${unite.nom})</b> ${sf.description}`, uniteId: sf.uniteId, + optionnel: false, } return element diff --git a/packages/ui/src/components/_ui/typeahead-single.tsx b/packages/ui/src/components/_ui/typeahead-single.tsx index cd87ee323..745e341bc 100644 --- a/packages/ui/src/components/_ui/typeahead-single.tsx +++ b/packages/ui/src/components/_ui/typeahead-single.tsx @@ -5,31 +5,31 @@ import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } fr import type { JSX } from 'vue/jsx-runtime' type TypeAheadRecord = Record<string | symbol | number, any> -type Props<T extends TypeAheadRecord, K extends keyof DeepReadonly<T>> = { +type Props<T extends DeepReadonly<TypeAheadRecord>, K extends keyof DeepReadonly<T>> = { overrideItem: (Pick<T, K> & Partial<Omit<T, K>>) | null disabled?: boolean props: { id?: string - itemKey: K + itemKey: NoInfer<K> placeholder: string - items: DeepReadonly<T[]> + items: T[] minInputLength: number alwaysOpen?: boolean - itemChipLabel: (key: DeepReadonly<T>) => string - displayItemInList?: (item: DeepReadonly<T>) => JSX.Element - onSelectItem: (item: DeepReadonly<T> | undefined) => void + itemChipLabel: (key: NoInfer<T>) => string + displayItemInList?: (item: NoInfer<T>) => JSX.Element + onSelectItem: (item: NoInfer<T> | undefined) => void onInput?: (item: string) => void } } -export const TypeAheadSingle = defineComponent(<T extends TypeAheadRecord, K extends keyof DeepReadonly<T>>(props: Props<T, K>) => { +export const TypeAheadSingle = defineComponent(<T extends DeepReadonly<TypeAheadRecord>, K extends keyof DeepReadonly<T>>(props: Props<T, K>) => { const id = props.props.id ?? `typeahead_${(random() * 1000).toFixed()}` const wrapperId = computed(() => `${id}_wrapper`) - const getItem = (item: (Pick<T, K> & Partial<Omit<T, K>>) | null): DeepReadonly<T> | null => + const getItem = (item: (Pick<T, K> & Partial<Omit<T, K>>) | null): T | null => props.props.items.find(i => { return i[props.props.itemKey] === item?.[props.props.itemKey] }) ?? null - const selectedItem = ref<DeepReadonly<T> | null>(getItem(props.overrideItem)) as Ref<DeepReadonly<T> | null> + const selectedItem = ref<T | null>(getItem(props.overrideItem)) as Ref<T | null> const initItem = getItem(props.overrideItem) const input = ref<string>(initItem !== null ? props.props.itemChipLabel(initItem) : '') @@ -104,7 +104,7 @@ export const TypeAheadSingle = defineComponent(<T extends TypeAheadRecord, K ext const currentSelection = computed(() => { return isListVisible.value && currentSelectionIndex.value < notSelectedItems.value.length ? notSelectedItems.value[currentSelectionIndex.value] : undefined }) - const selectItem = (item: DeepReadonly<T>) => { + const selectItem = (item: T) => { input.value = props.props.itemChipLabel(item) currentSelectionIndex.value = 0 diff --git a/packages/ui/src/components/_ui/typeahead-smart-single.tsx b/packages/ui/src/components/_ui/typeahead-smart-single.tsx new file mode 100644 index 000000000..fdf321eec --- /dev/null +++ b/packages/ui/src/components/_ui/typeahead-smart-single.tsx @@ -0,0 +1,52 @@ +import { Ref, computed, defineComponent, ref } from 'vue' +import { TypeAheadSingle } from './typeahead-single' +import { DeepReadonly, isNotNullNorUndefined } from 'camino-common/src/typescript-tools' + +type Props<T extends string> = { + alwaysOpen?: boolean + possibleValues: DeepReadonly<TypeaheadValue<T>>[] + initialValue?: DeepReadonly<NoInfer<T>> + valueIdSelected: (valueId: DeepReadonly<NoInfer<T>> | null) => void +} + +type TypeaheadValue<T> = { id: T; nom: string } + +export const TypeaheadSmartSingle = defineComponent(<T extends string>(props: Props<T>) => { + const valueTypeSelected = ref<DeepReadonly<TypeaheadValue<T>> | null>(props.possibleValues.find(({ id }) => props.initialValue === id) ?? null) as Ref<DeepReadonly<TypeaheadValue<T>> | null> + const onValueUpdate = async (value: DeepReadonly<TypeaheadValue<T>> | undefined) => { + valueTypeSelected.value = value ?? null + props.valueIdSelected(isNotNullNorUndefined(value) ? value.id : null) + } + + const sortedByUs = computed<DeepReadonly<TypeaheadValue<T>>[]>(() => [...props.possibleValues].sort((a, b) => a.nom.localeCompare(b.nom))) + + const valuesFiltered = ref<DeepReadonly<TypeaheadValue<T>>[]>(sortedByUs.value) as Ref<DeepReadonly<TypeaheadValue<T>>[]> + const onInput = (search: string) => { + const formatedSearch = search.trim().toLowerCase() + + if (formatedSearch.length === 0) { + valuesFiltered.value = sortedByUs.value + } else { + valuesFiltered.value = sortedByUs.value.filter(value => value.nom.toLowerCase().includes(formatedSearch.toLowerCase())) + } + } + + return () => ( + <TypeAheadSingle + overrideItem={valueTypeSelected.value} + props={{ + alwaysOpen: props.alwaysOpen, + items: valuesFiltered.value, + itemChipLabel: item => item.nom, + itemKey: 'id', + placeholder: '', + minInputLength: 0, + onSelectItem: onValueUpdate, + onInput, + }} + /> + ) +}) + +// @ts-ignore waiting for https://github.com/vuejs/core/issues/7833 +TypeaheadSmartSingle.props = ['valueIdSelected', 'possibleValues', 'alwaysOpen', 'initialValue'] diff --git a/packages/ui/src/components/_ui/typeahead.stories.tsx b/packages/ui/src/components/_ui/typeahead.stories.tsx index 05e702d26..24c59e9d0 100644 --- a/packages/ui/src/components/_ui/typeahead.stories.tsx +++ b/packages/ui/src/components/_ui/typeahead.stories.tsx @@ -2,6 +2,7 @@ import { Meta, StoryFn } from '@storybook/vue3' import { action } from '@storybook/addon-actions' import { TypeAheadSingle } from './typeahead-single' import { TypeAheadMultiple } from './typeahead-multiple' +import { TypeaheadSmartSingle } from './typeahead-smart-single' const meta: Meta = { title: 'Components/UI/TypeAhead', @@ -71,6 +72,27 @@ export const SingleWithInitialItem: StoryFn = () => ( /> ) +export const SmartSingle: StoryFn = () => ( + <TypeaheadSmartSingle + possibleValues={[ + { id: 'id1', nom: 'Nom' }, + { id: 'id2', nom: 'Autre nom' }, + ]} + valueIdSelected={selectItems} + /> +) + +export const SmartSingleWithInitialValue: StoryFn = () => ( + <TypeaheadSmartSingle + possibleValues={[ + { id: 'car', nom: 'Document car' }, + { id: 'doe', nom: 'documentDoe' }, + ]} + initialValue="car" + valueIdSelected={selectItems} + /> +) + export const Multiple: StoryFn = () => ( <TypeAheadMultiple props={{ diff --git a/packages/ui/src/components/_common/document-type-typeahead.stories_snapshots_WithDocumentTypeAlreadySelected.html b/packages/ui/src/components/_ui/typeahead.stories_snapshots_SmartSingle.html similarity index 100% rename from packages/ui/src/components/_common/document-type-typeahead.stories_snapshots_WithDocumentTypeAlreadySelected.html rename to packages/ui/src/components/_ui/typeahead.stories_snapshots_SmartSingle.html diff --git a/packages/ui/src/components/_ui/typeahead.stories_snapshots_SmartSingleWithInitialValue.html b/packages/ui/src/components/_ui/typeahead.stories_snapshots_SmartSingleWithInitialValue.html new file mode 100644 index 000000000..d5cf5f1d2 --- /dev/null +++ b/packages/ui/src/components/_ui/typeahead.stories_snapshots_SmartSingleWithInitialValue.html @@ -0,0 +1,4 @@ +<div id="typeahead_271_wrapper" class="_typeahead_8eddf1"> + <div class="flex"><input id="typeahead_271" type="text" name="typeahead_271" class="fr-input" placeholder="" autocomplete="off"></div> + <!----> +</div> \ No newline at end of file diff --git a/packages/ui/src/components/activite-edition.stories.tsx b/packages/ui/src/components/activite-edition.stories.tsx index 144ec854b..c43a118df 100644 --- a/packages/ui/src/components/activite-edition.stories.tsx +++ b/packages/ui/src/components/activite-edition.stories.tsx @@ -40,6 +40,7 @@ const activite: Activite = { dateDebut: toCaminoDate('2018-01-01'), type: 'number', value: null, + optionnel: false, }, { id: 'mercure', @@ -47,6 +48,7 @@ const activite: Activite = { description: 'Masse en gramme de l’ensemble des produits contaminés envoyés en traitement au cours du trimestre.', type: 'number', value: null, + optionnel: false, }, { id: 'carburantDetaxe', @@ -55,6 +57,7 @@ const activite: Activite = { dateDebut: toCaminoDate('2018-01-01'), type: 'number', value: null, + optionnel: false, }, { id: 'carburantConventionnel', @@ -62,6 +65,7 @@ const activite: Activite = { description: 'Volume total en litre de carburant conventionnel consommé au cours du trimestre par les travaux réalisés sur le chantier.', type: 'number', value: null, + optionnel: false, }, { id: 'pompes', @@ -69,6 +73,7 @@ const activite: Activite = { description: 'Des pompes étaient-elles présentes sur le chantier', type: 'radio', value: null, + optionnel: false, }, { id: 'pelles', @@ -77,8 +82,9 @@ const activite: Activite = { dateDebut: toCaminoDate('2018-01-01'), type: 'number', value: 4, + optionnel: false, }, - { id: 'effectifs', nom: 'Effectifs', description: 'Nombre moyen de salariés sur le chantier au cours du trimestre.', type: 'number', value: null }, + { id: 'effectifs', nom: 'Effectifs', description: 'Nombre moyen de salariés sur le chantier au cours du trimestre.', type: 'number', optionnel: false, value: null }, { id: 'environnement', nom: 'Dépenses relatives à la protection de l’environnement (euros)', @@ -87,6 +93,7 @@ const activite: Activite = { dateDebut: toCaminoDate('2018-01-01'), type: 'number', value: null, + optionnel: false, }, ], }, @@ -107,6 +114,7 @@ const activite: Activite = { { id: 'arretDefinitif', nom: 'arrêt définitif (après réhabilitation)' }, ], value: [], + optionnel: false, }, { id: '5', @@ -121,6 +129,7 @@ const activite: Activite = { { id: 'arretDefinitif', nom: 'arrêt définitif (après réhabilitation)' }, ], value: [], + optionnel: false, }, { id: '6', @@ -135,6 +144,7 @@ const activite: Activite = { { id: 'arretDefinitif', nom: 'arrêt définitif (après réhabilitation)' }, ], value: [], + optionnel: false, }, ], }, @@ -219,6 +229,7 @@ export const FullDeposable: StoryFn = () => ( dateDebut: toCaminoDate('2018-01-01'), type: 'number', value: 0, + optionnel: false, }, { id: 'mercure', @@ -226,6 +237,7 @@ export const FullDeposable: StoryFn = () => ( description: 'Masse en gramme de l’ensemble des produits contaminés envoyés en traitement au cours du trimestre.', type: 'number', value: 120, + optionnel: false, }, { id: 'carburantDetaxe', @@ -234,6 +246,7 @@ export const FullDeposable: StoryFn = () => ( dateDebut: toCaminoDate('2018-01-01'), type: 'number', value: 8000, + optionnel: false, }, ], }, diff --git a/packages/ui/src/components/activite.stories.tsx b/packages/ui/src/components/activite.stories.tsx index ff3cb8d74..fd7cab091 100644 --- a/packages/ui/src/components/activite.stories.tsx +++ b/packages/ui/src/components/activite.stories.tsx @@ -27,7 +27,7 @@ const activite: Activite = { deposable: false, annee: toCaminoAnnee(2022), periode_id: 1, - sections_with_value: [{ id: 'Id', nom: 'Nom de section', elements: [{ type: 'radio', id: 'radio', value: true, nom: 'Un radio button' }] }], + sections_with_value: [{ id: 'Id', nom: 'Nom de section', elements: [{ type: 'radio', id: 'radio', value: true, nom: 'Un radio button', optionnel: false }] }], activite_documents: [{ activite_document_type_id: 'ree', description: 'description', id: activiteDocumentIdValidator.parse('id1') }], titre: { nom: 'Nom du titre', diff --git a/packages/ui/src/components/administration/permissions.stories_snapshots_Default.html b/packages/ui/src/components/administration/permissions.stories_snapshots_Default.html index db32b4263..aa06f23d9 100644 --- a/packages/ui/src/components/administration/permissions.stories_snapshots_Default.html +++ b/packages/ui/src/components/administration/permissions.stories_snapshots_Default.html @@ -572,23 +572,7 @@ <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> </td> <td class=""><span class="">Permis exclusif de recherches</span></td> - <td class=""><span class="">Avis de l'Office national des forêts</span></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - </tr> - <tr> - <td class=""> - <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> - </td> - <td class=""><span class="">Autorisation d'exploitation</span></td> - <td class=""><span class="">Saisine des services</span></td> + <td class=""><span class="">Avis des services et commissions consultatives</span></td> <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> <use href="#icon-checkbox-blank"></use> </svg></td> @@ -663,22 +647,6 @@ <use href="#icon-checkbox"></use> </svg></td> </tr> - <tr> - <td class=""> - <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> - </td> - <td class=""><span class="">Autorisation d'exploitation</span></td> - <td class=""><span class="">Réception d'information (expertise de l'Office national des forêts)</span></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - </tr> <tr> <td class=""> <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> @@ -839,22 +807,6 @@ <use href="#icon-checkbox"></use> </svg></td> </tr> - <tr> - <td class=""> - <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> - </td> - <td class=""><span class="">Autorisation d'exploitation</span></td> - <td class=""><span class="">Demande d'informations (expertise de l'Office national des forêts)</span></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - </tr> <tr> <td class=""> <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> @@ -999,22 +951,6 @@ <use href="#icon-checkbox"></use> </svg></td> </tr> - <tr> - <td class=""> - <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> - </td> - <td class=""><span class="">Autorisation d'exploitation</span></td> - <td class=""><span class="">Expertise de l'Office national des forêts</span></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - </tr> <tr> <td class=""> <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> @@ -1095,54 +1031,6 @@ <use href="#icon-checkbox"></use> </svg></td> </tr> - <tr> - <td class=""> - <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> - </td> - <td class=""><span class="">Autorisation d'exploitation</span></td> - <td class=""><span class="">Confirmation de l'accord du propriétaire du sol</span></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - </tr> - <tr> - <td class=""> - <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> - </td> - <td class=""><span class="">Autorisation d'exploitation</span></td> - <td class=""><span class="">Avis DGTM service aménagement, urbanisme, construction, logement (AUCL)</span></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> - </svg></td> - </tr> - <tr> - <td class=""> - <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> - </td> - <td class=""><span class="">Autorisation d'exploitation</span></td> - <td class=""><span class="">Avis de la caisse générale de sécurité sociale</span></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> - </svg></td> - </tr> <tr> <td class=""> <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> @@ -1159,22 +1047,6 @@ <use href="#icon-checkbox-blank"></use> </svg></td> </tr> - <tr> - <td class=""> - <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> - </td> - <td class=""><span class="">Autorisation d'exploitation</span></td> - <td class=""><span class="">Avis de l'agence régionale de santé</span></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> - </svg></td> - </tr> <tr> <td class=""> <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> @@ -1191,22 +1063,6 @@ <use href="#icon-checkbox"></use> </svg></td> </tr> - <tr> - <td class=""> - <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> - </td> - <td class=""><span class="">Autorisation d'exploitation</span></td> - <td class=""><span class="">Avis de l'état major orpaillage et pêche illicite (EMOPI)</span></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> - </svg></td> - </tr> <tr> <td class=""> <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> @@ -1223,22 +1079,6 @@ <use href="#icon-checkbox"></use> </svg></td> </tr> - <tr> - <td class=""> - <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> - </td> - <td class=""><span class="">Autorisation d'exploitation</span></td> - <td class=""><span class="">Avis de l'Office national des forêts</span></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - </tr> <tr> <td class=""> <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> @@ -1271,70 +1111,6 @@ <use href="#icon-checkbox"></use> </svg></td> </tr> - <tr> - <td class=""> - <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> - </td> - <td class=""><span class="">Autorisation d'exploitation</span></td> - <td class=""><span class="">Avis de la gendarmerie nationale</span></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> - </svg></td> - </tr> - <tr> - <td class=""> - <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> - </td> - <td class=""><span class="">Autorisation d'exploitation</span></td> - <td class=""><span class="">Avis de la direction régionale des finances publiques</span></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> - </svg></td> - </tr> - <tr> - <td class=""> - <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> - </td> - <td class=""><span class="">Autorisation d'exploitation</span></td> - <td class=""><span class="">Avis de la direction des entreprises, de la concurrence, de la consommation, du travail et de l'emploi</span></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> - </svg></td> - </tr> - <tr> - <td class=""> - <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> - </td> - <td class=""><span class="">Autorisation d'exploitation</span></td> - <td class=""><span class="">Avis DGTM service milieux naturels, biodiversité, sites et paysages (MNBST)</span></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> - </svg></td> - </tr> <tr> <td class=""> <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> @@ -1356,25 +1132,9 @@ <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> </td> <td class=""><span class="">Autorisation d'exploitation</span></td> - <td class=""><span class="">Avis de la direction d'alimentation de l'agriculture et de la forêt</span></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> - </svg></td> + <td class=""><span class="">Avis des services et commissions consultatives</span></td> <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> - </svg></td> - </tr> - <tr> - <td class=""> - <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> - </td> - <td class=""><span class="">Autorisation d'exploitation</span></td> - <td class=""><span class="">Avis de direction régionale des affaires culturelles</span></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox"></use> + <use href="#icon-checkbox-blank"></use> </svg></td> <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> <use href="#icon-checkbox"></use> @@ -1399,22 +1159,6 @@ <use href="#icon-checkbox-blank"></use> </svg></td> </tr> - <tr> - <td class=""> - <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> - </td> - <td class=""><span class="">Autorisation de recherches</span></td> - <td class=""><span class="">Réception d'information (expertise de l'Office national des forêts)</span></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - </tr> <tr> <td class=""> <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> @@ -1447,22 +1191,6 @@ <use href="#icon-checkbox-blank"></use> </svg></td> </tr> - <tr> - <td class=""> - <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> - </td> - <td class=""><span class="">Autorisation de recherches</span></td> - <td class=""><span class="">Réception d'information (avis de l'Office national des forêts)</span></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - </tr> <tr> <td class=""> <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> @@ -1495,22 +1223,6 @@ <use href="#icon-checkbox-blank"></use> </svg></td> </tr> - <tr> - <td class=""> - <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> - </td> - <td class=""><span class="">Autorisation de recherches</span></td> - <td class=""><span class="">Demande d'informations (expertise de l'Office national des forêts)</span></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - </tr> <tr> <td class=""> <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> @@ -1543,22 +1255,6 @@ <use href="#icon-checkbox-blank"></use> </svg></td> </tr> - <tr> - <td class=""> - <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> - </td> - <td class=""><span class="">Autorisation de recherches</span></td> - <td class=""><span class="">Demande d'informations (avis de l'Office national des forêts)</span></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - <td class=""><svg style="display: block;" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#666" class=""> - <use href="#icon-checkbox-blank"></use> - </svg></td> - </tr> <tr> <td class=""> <p class="fr-tag fr-tag--md mono" title="Domaine minéraux et métaux" aria-label="Domaine minéraux et métaux" style="min-width: 2rem; color: black;">M</p> diff --git a/packages/ui/src/components/demarche/demarche-etape.stories.tsx b/packages/ui/src/components/demarche/demarche-etape.stories.tsx index 3d6dbd1bc..ab8637fdc 100644 --- a/packages/ui/src/components/demarche/demarche-etape.stories.tsx +++ b/packages/ui/src/components/demarche/demarche-etape.stories.tsx @@ -6,11 +6,11 @@ import { Entreprise, EtapeEntrepriseDocument, entrepriseDocumentIdValidator, ent import { titreSlugValidator } from 'camino-common/src/validators/titres' import { action } from '@storybook/addon-actions' import { testBlankUser } from 'camino-common/src/tests-utils' -import { EtapeDocument, etapeDocumentIdValidator, etapeIdValidator, etapeSlugValidator } from 'camino-common/src/etape' +import { ETAPE_IS_BROUILLON, ETAPE_IS_NOT_BROUILLON, EtapeDocument, etapeDocumentIdValidator, etapeIdValidator, etapeSlugValidator } from 'camino-common/src/etape' import { DOCUMENTS_TYPES_IDS } from 'camino-common/src/static/documentsTypes' import { ApiClient } from '@/api/api-client' import { FeatureMultiPolygon } from 'camino-common/src/perimetre' -import { km2Validator } from 'camino-common/src/number' +import { ZERO_KM2, km2Validator } from 'camino-common/src/number' import { CaminoRouter } from '@/typings/vue-router' const meta: Meta = { @@ -185,6 +185,7 @@ export const NoSnapshotDemande: StoryFn = () => ( titulaireIds: [entrepriseIdValidator.parse('titulaire1'), entrepriseIdValidator.parse('titulaire2')], administrationsLocales: [], sdom_zones: [], + communes: [], etapes: [], }} user={{ ...testBlankUser, role: 'super' }} @@ -197,7 +198,7 @@ export const NoSnapshotDemande: StoryFn = () => ( slug: etapeSlugValidator.parse('etape-slug'), etape_type_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeTypeId, etape_statut_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeStatutId, - is_brouillon: false, + is_brouillon: ETAPE_IS_NOT_BROUILLON, date, fondamentale: { @@ -292,9 +293,10 @@ export const NoSnapshotDemande: StoryFn = () => ( secteurs_maritimes: [], }, }, - sections_with_values: [{ id: 'arm', elements: [{ id: 'mecanise', type: 'radio', value: true, nom: 'Mécanisation' }], nom: 'Arm' }], + sections_with_values: [{ id: 'arm', elements: [{ id: 'mecanise', type: 'radio', value: true, nom: 'Mécanisation', optionnel: false }], nom: 'Arm' }], etape_documents: [], entreprises_documents: [], + avis_documents: [], }} /> ) @@ -307,6 +309,7 @@ export const DemandeMultipleEntreprisesDocuments: StoryFn = () => ( titulaireIds: [entrepriseIdValidator.parse('titulaire1'), entrepriseIdValidator.parse('titulaire2')], administrationsLocales: [], sdom_zones: [], + communes: [], etapes: [], }} user={{ ...testBlankUser, role: 'super' }} @@ -318,7 +321,7 @@ export const DemandeMultipleEntreprisesDocuments: StoryFn = () => ( slug: etapeSlugValidator.parse('etape-slug'), etape_type_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeTypeId, etape_statut_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeStatutId, - is_brouillon: false, + is_brouillon: ETAPE_IS_NOT_BROUILLON, date, notes: 'Super note', fondamentale: { @@ -331,7 +334,7 @@ export const DemandeMultipleEntreprisesDocuments: StoryFn = () => ( perimetre: null, }, sections_with_values: [ - { id: 'arm', elements: [{ id: 'mecanise', type: 'radio', value: true, nom: 'Mécanisation' }], nom: 'Arm' }, + { id: 'arm', elements: [{ id: 'mecanise', type: 'radio', value: true, nom: 'Mécanisation', optionnel: false }], nom: 'Arm' }, { id: 'odlep', elements: [ @@ -364,6 +367,7 @@ export const DemandeMultipleEntreprisesDocuments: StoryFn = () => ( description: 'Une description', }, ], + avis_documents: [], }} /> ) @@ -371,7 +375,7 @@ export const DemandeMultipleEntreprisesDocuments: StoryFn = () => ( export const DemandeNoMap: StoryFn = () => ( <DemarcheEtape titre={{ titreStatutId: 'val', typeId: 'arm', nom: 'nom du titre', slug: titreSlug }} - demarche={{ demarche_type_id: 'oct', titulaireIds: [entrepriseIdValidator.parse('titulaire1')], administrationsLocales: [], sdom_zones: [], etapes: [] }} + demarche={{ demarche_type_id: 'oct', titulaireIds: [entrepriseIdValidator.parse('titulaire1')], administrationsLocales: [], sdom_zones: [], etapes: [], communes: [] }} user={{ ...testBlankUser, role: 'super' }} router={routerPushMock} apiClient={apiClient} @@ -382,7 +386,7 @@ export const DemandeNoMap: StoryFn = () => ( slug: etapeSlugValidator.parse('etape-slug'), etape_type_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeTypeId, etape_statut_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeStatutId, - is_brouillon: false, + is_brouillon: ETAPE_IS_NOT_BROUILLON, date, fondamentale: { date_debut: toCaminoDate('2023-10-25'), @@ -394,7 +398,7 @@ export const DemandeNoMap: StoryFn = () => ( perimetre: null, }, sections_with_values: [ - { id: 'arm', elements: [{ id: 'mecanise', type: 'radio', value: true, nom: 'Mécanisation' }], nom: 'Arm' }, + { id: 'arm', elements: [{ id: 'mecanise', type: 'radio', value: true, nom: 'Mécanisation', optionnel: false }], nom: 'Arm' }, { id: 'odlep', elements: [ @@ -411,6 +415,7 @@ export const DemandeNoMap: StoryFn = () => ( ], etape_documents: documents, entreprises_documents: entrepriseDocuments, + avis_documents: [], }} /> ) @@ -418,7 +423,7 @@ export const DemandeNoMap: StoryFn = () => ( export const DemandeNonDeposable: StoryFn = () => ( <DemarcheEtape titre={{ titreStatutId: 'val', typeId: 'arm', nom: 'nom du titre', slug: titreSlug }} - demarche={{ demarche_type_id: 'oct', titulaireIds: [], administrationsLocales: [], sdom_zones: [], etapes: [] }} + demarche={{ demarche_type_id: 'oct', titulaireIds: [], administrationsLocales: [], sdom_zones: [], etapes: [], communes: [] }} user={{ ...testBlankUser, role: 'super' }} router={routerPushMock} apiClient={apiClient} @@ -429,7 +434,7 @@ export const DemandeNonDeposable: StoryFn = () => ( notes: null, etape_type_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeTypeId, etape_statut_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeStatutId, - is_brouillon: true, + is_brouillon: ETAPE_IS_BROUILLON, date, fondamentale: { @@ -441,9 +446,10 @@ export const DemandeNonDeposable: StoryFn = () => ( amodiataireIds: [entrepriseIdValidator.parse('amodiataire1')], perimetre: null, }, - sections_with_values: [{ id: 'arm', elements: [{ id: 'mecanise', type: 'radio', value: true, nom: 'Mécanisation' }], nom: 'Arm' }], + sections_with_values: [{ id: 'arm', elements: [{ id: 'mecanise', type: 'radio', value: true, nom: 'Mécanisation', optionnel: false }], nom: 'Arm' }], etape_documents: [], entreprises_documents: [], + avis_documents: [], }} /> ) @@ -451,7 +457,7 @@ export const DemandeNonDeposable: StoryFn = () => ( export const DemandeNonSupprimable: StoryFn = () => ( <DemarcheEtape titre={{ titreStatutId: 'val', typeId: 'arm', nom: 'nom du titre', slug: titreSlug }} - demarche={{ demarche_type_id: 'oct', titulaireIds: [entrepriseIdValidator.parse('titulaire1')], administrationsLocales: [], sdom_zones: [], etapes: [] }} + demarche={{ demarche_type_id: 'oct', titulaireIds: [entrepriseIdValidator.parse('titulaire1')], administrationsLocales: [], sdom_zones: [], communes: [], etapes: [] }} user={{ ...testBlankUser, role: 'entreprise', @@ -471,7 +477,7 @@ export const DemandeNonSupprimable: StoryFn = () => ( notes: null, etape_type_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeTypeId, etape_statut_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeStatutId, - is_brouillon: true, + is_brouillon: ETAPE_IS_BROUILLON, date, fondamentale: { date_debut: toCaminoDate('2023-10-25'), @@ -482,9 +488,10 @@ export const DemandeNonSupprimable: StoryFn = () => ( amodiataireIds: [entrepriseIdValidator.parse('amodiataire1')], perimetre: null, }, - sections_with_values: [{ id: 'arm', elements: [{ id: 'mecanise', type: 'radio', value: true, nom: 'Mécanisation' }], nom: 'Arm' }], + sections_with_values: [{ id: 'arm', elements: [{ id: 'mecanise', type: 'radio', value: true, nom: 'Mécanisation', optionnel: false }], nom: 'Arm' }], etape_documents: [], entreprises_documents: [], + avis_documents: [], }} /> ) @@ -528,7 +535,7 @@ const demandeArmMecaniseNonDeposable: FeatureMultiPolygon = { export const DemandeArmMecaniseNonDeposable: StoryFn = () => ( <DemarcheEtape titre={{ titreStatutId: 'val', typeId: 'arm', nom: 'nom du titre', slug: titreSlug }} - demarche={{ demarche_type_id: 'oct', titulaireIds: [entrepriseIdValidator.parse('titulaire1')], administrationsLocales: [], sdom_zones: [], etapes: [] }} + demarche={{ demarche_type_id: 'oct', titulaireIds: [entrepriseIdValidator.parse('titulaire1')], administrationsLocales: [], sdom_zones: [], etapes: [], communes: [] }} user={{ ...testBlankUser, role: 'super' }} router={routerPushMock} apiClient={apiClient} @@ -540,7 +547,7 @@ export const DemandeArmMecaniseNonDeposable: StoryFn = () => ( notes: null, etape_type_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeTypeId, etape_statut_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeStatutId, - is_brouillon: true, + is_brouillon: ETAPE_IS_BROUILLON, date, fondamentale: { @@ -565,9 +572,10 @@ export const DemandeArmMecaniseNonDeposable: StoryFn = () => ( secteurs_maritimes: [], }, }, - sections_with_values: [{ id: 'arm', elements: [{ id: 'mecanise', type: 'radio', value: true, nom: 'Mécanisation' }], nom: 'Arm' }], + sections_with_values: [{ id: 'arm', elements: [{ id: 'mecanise', type: 'radio', value: true, nom: 'Mécanisation', optionnel: false }], nom: 'Arm' }], etape_documents: documentsDemande, entreprises_documents: entrepriseDocumentsDemande, + avis_documents: [], }} /> ) @@ -611,7 +619,7 @@ const demandeArmMecaniseDeposable: FeatureMultiPolygon = { export const DemandeArmMecaniseDeposable: StoryFn = () => ( <DemarcheEtape titre={{ titreStatutId: 'val', typeId: 'arm', nom: 'nom du titre', slug: titreSlug }} - demarche={{ demarche_type_id: 'oct', titulaireIds: [entrepriseIdValidator.parse('titulaire1')], administrationsLocales: [], sdom_zones: [], etapes: [] }} + demarche={{ demarche_type_id: 'oct', titulaireIds: [entrepriseIdValidator.parse('titulaire1')], administrationsLocales: [], sdom_zones: [], etapes: [], communes: [] }} user={{ ...testBlankUser, role: 'super' }} router={routerPushMock} apiClient={apiClient} @@ -623,7 +631,7 @@ export const DemandeArmMecaniseDeposable: StoryFn = () => ( notes: null, etape_type_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeTypeId, etape_statut_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeStatutId, - is_brouillon: true, + is_brouillon: ETAPE_IS_BROUILLON, date, fondamentale: { @@ -648,13 +656,14 @@ export const DemandeArmMecaniseDeposable: StoryFn = () => ( secteurs_maritimes: [], }, }, - sections_with_values: [{ id: 'arm', elements: [{ id: 'mecanise', type: 'radio', value: true, nom: 'Mécanisation' }], nom: 'Arm' }], + sections_with_values: [{ id: 'arm', elements: [{ id: 'mecanise', type: 'radio', value: true, nom: 'Mécanisation', optionnel: false }], nom: 'Arm' }], etape_documents: [ ...documentsDemande, { id: etapeDocumentIdValidator.parse('idDoe'), etape_document_type_id: 'doe', public_lecture: true, entreprises_lecture: true, description: null }, { id: etapeDocumentIdValidator.parse('idDep'), etape_document_type_id: 'dep', public_lecture: true, entreprises_lecture: true, description: null }, ], entreprises_documents: entrepriseDocumentsDemande, + avis_documents: [], }} /> ) @@ -698,7 +707,7 @@ const demandeArmNonMecaniseDeposable: FeatureMultiPolygon = { export const DemandeArmNonMecaniseDeposable: StoryFn = () => ( <DemarcheEtape titre={{ titreStatutId: 'val', typeId: 'arm', nom: 'nom du titre', slug: titreSlug }} - demarche={{ demarche_type_id: 'oct', titulaireIds: [entrepriseIdValidator.parse('titulaire1')], administrationsLocales: [], sdom_zones: [], etapes: [] }} + demarche={{ demarche_type_id: 'oct', titulaireIds: [entrepriseIdValidator.parse('titulaire1')], administrationsLocales: [], sdom_zones: [], etapes: [], communes: [] }} user={{ ...testBlankUser, role: 'super' }} router={routerPushMock} apiClient={apiClient} @@ -710,7 +719,7 @@ export const DemandeArmNonMecaniseDeposable: StoryFn = () => ( notes: null, etape_type_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeTypeId, etape_statut_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeStatutId, - is_brouillon: true, + is_brouillon: ETAPE_IS_BROUILLON, date, fondamentale: { @@ -735,9 +744,10 @@ export const DemandeArmNonMecaniseDeposable: StoryFn = () => ( secteurs_maritimes: [], }, }, - sections_with_values: [{ id: 'arm', elements: [{ id: 'mecanise', type: 'radio', value: false, nom: 'Mécanisation' }], nom: 'Arm' }], + sections_with_values: [{ id: 'arm', elements: [{ id: 'mecanise', type: 'radio', value: false, nom: 'Mécanisation', optionnel: false }], nom: 'Arm' }], etape_documents: documentsDemande, entreprises_documents: entrepriseDocumentsDemande, + avis_documents: [], }} /> ) @@ -745,7 +755,7 @@ export const DemandeArmNonMecaniseDeposable: StoryFn = () => ( export const Depot: StoryFn = () => ( <DemarcheEtape titre={{ titreStatutId: 'val', typeId: 'arm', nom: 'nom du titre', slug: titreSlug }} - demarche={{ demarche_type_id: 'oct', titulaireIds: [entrepriseIdValidator.parse('titulaire1')], administrationsLocales: [], sdom_zones: [], etapes: [] }} + demarche={{ demarche_type_id: 'oct', titulaireIds: [entrepriseIdValidator.parse('titulaire1')], administrationsLocales: [], sdom_zones: [], etapes: [], communes: [] }} router={routerPushMock} user={{ ...testBlankUser, role: 'super' }} etape={{ @@ -754,11 +764,12 @@ export const Depot: StoryFn = () => ( notes: null, etape_type_id: EtapesTypesEtapesStatuts.depotDeLaDemande.FAIT.etapeTypeId, etape_statut_id: EtapesTypesEtapesStatuts.depotDeLaDemande.FAIT.etapeStatutId, - is_brouillon: false, + is_brouillon: ETAPE_IS_NOT_BROUILLON, date, sections_with_values: [], etape_documents: documents, entreprises_documents: entrepriseDocuments, + avis_documents: [], }} apiClient={apiClient} entreprises={entreprises} @@ -768,21 +779,22 @@ export const Depot: StoryFn = () => ( export const AvisDefavorable: StoryFn = () => ( <DemarcheEtape titre={{ titreStatutId: 'val', typeId: 'arm', nom: 'nom du titre', slug: titreSlug }} - demarche={{ demarche_type_id: 'oct', titulaireIds: [], administrationsLocales: [], sdom_zones: [], etapes: [] }} + demarche={{ demarche_type_id: 'oct', titulaireIds: [], administrationsLocales: [], sdom_zones: [], etapes: [], communes: [] }} user={{ ...testBlankUser, role: 'super' }} router={routerPushMock} etape={{ id: etapeIdValidator.parse('etapeId'), slug: etapeSlugValidator.parse('etape-slug'), notes: null, - etape_type_id: EtapesTypesEtapesStatuts.avisDGTMServiceAmenagementUrbanismeConstructionLogement_AUCL_.DEFAVORABLE.etapeTypeId, - etape_statut_id: EtapesTypesEtapesStatuts.avisDGTMServiceAmenagementUrbanismeConstructionLogement_AUCL_.DEFAVORABLE.etapeStatutId, - is_brouillon: false, + etape_type_id: EtapesTypesEtapesStatuts.avisDuConseilGeneralDeLeconomie_CGE_.DEFAVORABLE.etapeTypeId, + etape_statut_id: EtapesTypesEtapesStatuts.avisDuConseilGeneralDeLeconomie_CGE_.DEFAVORABLE.etapeStatutId, + is_brouillon: ETAPE_IS_NOT_BROUILLON, date, sections_with_values: [], etape_documents: [], entreprises_documents: [], + avis_documents: [], }} apiClient={apiClient} entreprises={entreprises} @@ -810,7 +822,7 @@ const demandeAvecSeulementPerimetre: FeatureMultiPolygon = { export const DemandeAvecSeulementPerimetre: StoryFn = () => ( <DemarcheEtape titre={{ titreStatutId: 'val', typeId: 'arm', nom: 'nom du titre', slug: titreSlug }} - demarche={{ demarche_type_id: 'oct', titulaireIds: [], administrationsLocales: [], sdom_zones: [], etapes: [] }} + demarche={{ demarche_type_id: 'oct', titulaireIds: [], administrationsLocales: [], sdom_zones: [], etapes: [], communes: [] }} user={{ ...testBlankUser, role: 'super' }} router={routerPushMock} apiClient={apiClient} @@ -822,7 +834,7 @@ export const DemandeAvecSeulementPerimetre: StoryFn = () => ( notes: null, etape_type_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeTypeId, etape_statut_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeStatutId, - is_brouillon: true, + is_brouillon: ETAPE_IS_BROUILLON, date, fondamentale: { @@ -840,7 +852,7 @@ export const DemandeAvecSeulementPerimetre: StoryFn = () => ( geojson_origine_points: null, geojson4326_forages: null, geojson_origine_forages: null, - surface: km2Validator.parse(0), + surface: ZERO_KM2, communes: [], sdom_zones: [], forets: [], @@ -850,6 +862,7 @@ export const DemandeAvecSeulementPerimetre: StoryFn = () => ( sections_with_values: [], etape_documents: [], entreprises_documents: [], + avis_documents: [], }} /> ) @@ -875,7 +888,7 @@ const demandeAvecGrosseNote: FeatureMultiPolygon = { export const DemandeAvecGrosseNote: StoryFn = () => ( <DemarcheEtape titre={{ titreStatutId: 'val', typeId: 'arm', nom: 'nom du titre', slug: titreSlug }} - demarche={{ demarche_type_id: 'oct', titulaireIds: [], administrationsLocales: [], sdom_zones: [], etapes: [] }} + demarche={{ demarche_type_id: 'oct', titulaireIds: [], administrationsLocales: [], sdom_zones: [], etapes: [], communes: [] }} user={{ ...testBlankUser, role: 'super' }} router={routerPushMock} apiClient={apiClient} @@ -887,7 +900,7 @@ export const DemandeAvecGrosseNote: StoryFn = () => ( notes: 'Ceci est une énorme note sur plusieurs lignes.\n Une seconde ligne.\n Incertitudes: \n * date \n * substances \n * titulaireIds', etape_type_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeTypeId, etape_statut_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeStatutId, - is_brouillon: true, + is_brouillon: ETAPE_IS_BROUILLON, date, fondamentale: { @@ -905,7 +918,7 @@ export const DemandeAvecGrosseNote: StoryFn = () => ( geojson_origine_points: null, geojson4326_forages: null, geojson_origine_forages: null, - surface: km2Validator.parse(0), + surface: ZERO_KM2, communes: [], sdom_zones: [], forets: [], @@ -915,6 +928,7 @@ export const DemandeAvecGrosseNote: StoryFn = () => ( sections_with_values: [], etape_documents: [], entreprises_documents: [], + avis_documents: [], }} /> ) @@ -933,9 +947,10 @@ export const AxmDeposableAvecDaeEtAsl: StoryFn = () => ( id: etapeIdValidator.parse('idDae'), entreprises_documents: [], etape_documents: [], + avis_documents: [], etape_statut_id: 'exe', etape_type_id: 'dae', - is_brouillon: false, + is_brouillon: ETAPE_IS_NOT_BROUILLON, notes: null, sections_with_values: [], ordre: 1, @@ -946,15 +961,17 @@ export const AxmDeposableAvecDaeEtAsl: StoryFn = () => ( id: etapeIdValidator.parse('idAsl'), entreprises_documents: [], etape_documents: [], + avis_documents: [], etape_statut_id: 'exe', etape_type_id: 'asl', - is_brouillon: false, + is_brouillon: ETAPE_IS_NOT_BROUILLON, notes: null, sections_with_values: [], ordre: 2, slug: etapeSlugValidator.parse('slug-asl'), }, ], + communes: [], }} user={{ ...testBlankUser, role: 'entreprise', entreprises: [{ id: entrepriseIdValidator.parse('titulaire1'), nom: 'nom entreprise' }] }} router={routerPushMock} @@ -967,7 +984,7 @@ export const AxmDeposableAvecDaeEtAsl: StoryFn = () => ( notes: '', etape_type_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeTypeId, etape_statut_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeStatutId, - is_brouillon: true, + is_brouillon: ETAPE_IS_BROUILLON, date, fondamentale: { @@ -985,7 +1002,7 @@ export const AxmDeposableAvecDaeEtAsl: StoryFn = () => ( geojson_origine_points: null, geojson4326_forages: null, geojson_origine_forages: null, - surface: km2Validator.parse(0), + surface: ZERO_KM2, communes: [], sdom_zones: [], forets: [], @@ -1041,6 +1058,7 @@ export const AxmDeposableAvecDaeEtAsl: StoryFn = () => ( id: entrepriseDocumentIdValidator.parse('iddeb'), }, ], + avis_documents: [], }} /> ) @@ -1048,7 +1066,7 @@ export const AxmDeposableAvecDaeEtAsl: StoryFn = () => ( export const DemandeAvecForage: StoryFn = () => ( <DemarcheEtape titre={{ titreStatutId: 'val', typeId: 'pxg', nom: 'nom du titre', slug: titreSlug }} - demarche={{ demarche_type_id: 'oct', titulaireIds: [], administrationsLocales: [], sdom_zones: [], etapes: [] }} + demarche={{ demarche_type_id: 'oct', titulaireIds: [], administrationsLocales: [], sdom_zones: [], etapes: [], communes: [] }} user={{ ...testBlankUser, role: 'super' }} router={routerPushMock} entreprises={entreprises} @@ -1060,7 +1078,7 @@ export const DemandeAvecForage: StoryFn = () => ( notes: '', etape_type_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeTypeId, etape_statut_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeStatutId, - is_brouillon: true, + is_brouillon: ETAPE_IS_BROUILLON, date, fondamentale: { @@ -1078,7 +1096,7 @@ export const DemandeAvecForage: StoryFn = () => ( geojson_origine_points: null, geojson4326_forages: null, geojson_origine_forages: null, - surface: km2Validator.parse(0), + surface: ZERO_KM2, communes: [], sdom_zones: [], forets: [], @@ -1091,13 +1109,14 @@ export const DemandeAvecForage: StoryFn = () => ( id: 'pxg', nom: "Propriétés du permis d'exploitation", elements: [ - { id: 'debit', nom: 'Débit volumique maximal de pompage', type: 'number', value: 3, uniteId: 'm3h' }, - { id: 'volume', nom: 'Volume maximum de pompage', type: 'number', value: 8, uniteId: 'm3x' }, + { id: 'debit', nom: 'Débit volumique maximal de pompage', type: 'number', value: 3, uniteId: 'm3h', optionnel: false }, + { id: 'volume', nom: 'Volume maximum de pompage', type: 'number', value: 8, uniteId: 'm3x', optionnel: false }, ], }, ], etape_documents: [], entreprises_documents: [], + avis_documents: [], }} /> ) diff --git a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_AvisDefavorable.html b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_AvisDefavorable.html index 3ab3e530b..1eb55ff4b 100644 --- a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_AvisDefavorable.html +++ b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_AvisDefavorable.html @@ -2,7 +2,7 @@ <div class="_sticky_964a6e fr-pt-1w"> <div style="display: flex; justify-content: space-between; align-items: center;"> <div style="display: flex;"> - <div class="fr-text--lg fr-mb-0" style="font-weight: 500;">Avis DGTM service aménagement, urbanisme, construction, logement (AUCL)</div> + <div class="fr-text--lg fr-mb-0" style="font-weight: 500;">Avis du conseil général de l'économie (CGE)</div> <!----> </div> <div style="display: flex;"> @@ -20,4 +20,5 @@ <!----> <!----> <!----> + <!----> </div> \ No newline at end of file diff --git a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_AxmDeposableAvecDaeEtAsl.html b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_AxmDeposableAvecDaeEtAsl.html index ed83872f3..efb55b882 100644 --- a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_AxmDeposableAvecDaeEtAsl.html +++ b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_AxmDeposableAvecDaeEtAsl.html @@ -5,7 +5,7 @@ <div class="fr-text--lg fr-mb-0" style="font-weight: 500;">Demande</div> <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-ml-1w fr-badge--new fr-badge--no-icon fr-ml-1w" title="Brouillon de l'étape demande" aria-label="Brouillon de l'étape demande">Brouillon</p> </div> - <div style="display: flex;"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1v" title="Déposer la demande" aria-label="Déposer la demande" type="button">Déposer</button><a href="/mocked-href" title="Modifier l’étape" class="fr-mr-1v fr-btn fr-btn--secondary fr-icon-pencil-line" aria-label="Modifier l’étape">Modifier l’étape</a> + <div style="display: flex;"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1v" disabled="" title="Déposer l'étape" aria-label="Déposer l'étape" type="button">Déposer</button><a href="/mocked-href" title="Modifier l’étape" class="fr-mr-1v fr-btn fr-btn--secondary fr-icon-pencil-line" aria-label="Modifier l’étape">Modifier l’étape</a> <!----> <div style="display: flex;"> <!----><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-file-download-line" title="Télécharger l’ensemble des documents de l'étape "demande" dans un fichier .zip" aria-label="Télécharger l’ensemble des documents de l'étape "demande" dans un fichier .zip" type="button"> @@ -288,4 +288,5 @@ </div> <!----> <!----> + <!----> </div> \ No newline at end of file diff --git a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeArmMecaniseDeposable.html b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeArmMecaniseDeposable.html index 67ea0a619..3d3a1964b 100644 --- a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeArmMecaniseDeposable.html +++ b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeArmMecaniseDeposable.html @@ -5,7 +5,7 @@ <div class="fr-text--lg fr-mb-0" style="font-weight: 500;">Demande</div> <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-ml-1w fr-badge--new fr-badge--no-icon fr-ml-1w" title="Brouillon de l'étape demande" aria-label="Brouillon de l'étape demande">Brouillon</p> </div> - <div style="display: flex;"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1v" title="Déposer la demande" aria-label="Déposer la demande" type="button">Déposer</button><a href="/mocked-href" title="Modifier l’étape" class="fr-mr-1v fr-btn fr-btn--secondary fr-icon-pencil-line" aria-label="Modifier l’étape">Modifier l’étape</a><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-delete-bin-line fr-mr-1v" title="Supprimer l’étape" aria-label="Supprimer l’étape" type="button"> + <div style="display: flex;"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1v" disabled="" title="Déposer l'étape" aria-label="Déposer l'étape" type="button">Déposer</button><a href="/mocked-href" title="Modifier l’étape" class="fr-mr-1v fr-btn fr-btn--secondary fr-icon-pencil-line" aria-label="Modifier l’étape">Modifier l’étape</a><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-delete-bin-line fr-mr-1v" title="Supprimer l’étape" aria-label="Supprimer l’étape" type="button"> <!----> </button> <div style="display: flex;"> @@ -309,4 +309,5 @@ </div> <!----> <!----> + <!----> </div> \ No newline at end of file diff --git a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeArmMecaniseNonDeposable.html b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeArmMecaniseNonDeposable.html index 8ceb73926..67aa76833 100644 --- a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeArmMecaniseNonDeposable.html +++ b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeArmMecaniseNonDeposable.html @@ -5,7 +5,7 @@ <div class="fr-text--lg fr-mb-0" style="font-weight: 500;">Demande</div> <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-ml-1w fr-badge--new fr-badge--no-icon fr-ml-1w" title="Brouillon de l'étape demande" aria-label="Brouillon de l'étape demande">Brouillon</p> </div> - <div style="display: flex;"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1v" disabled="" title="Déposer la demande" aria-label="Déposer la demande" type="button">Déposer</button><a href="/mocked-href" title="Modifier l’étape" class="fr-mr-1v fr-btn fr-btn--secondary fr-icon-pencil-line" aria-label="Modifier l’étape">Modifier l’étape</a><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-delete-bin-line fr-mr-1v" title="Supprimer l’étape" aria-label="Supprimer l’étape" type="button"> + <div style="display: flex;"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1v" disabled="" title="Déposer l'étape" aria-label="Déposer l'étape" type="button">Déposer</button><a href="/mocked-href" title="Modifier l’étape" class="fr-mr-1v fr-btn fr-btn--secondary fr-icon-pencil-line" aria-label="Modifier l’étape">Modifier l’étape</a><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-delete-bin-line fr-mr-1v" title="Supprimer l’étape" aria-label="Supprimer l’étape" type="button"> <!----> </button> <div style="display: flex;"> @@ -295,4 +295,5 @@ </div> <!----> <!----> + <!----> </div> \ No newline at end of file diff --git a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeArmNonMecaniseDeposable.html b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeArmNonMecaniseDeposable.html index 84d1b520f..2bd06492e 100644 --- a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeArmNonMecaniseDeposable.html +++ b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeArmNonMecaniseDeposable.html @@ -5,7 +5,7 @@ <div class="fr-text--lg fr-mb-0" style="font-weight: 500;">Demande</div> <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-ml-1w fr-badge--new fr-badge--no-icon fr-ml-1w" title="Brouillon de l'étape demande" aria-label="Brouillon de l'étape demande">Brouillon</p> </div> - <div style="display: flex;"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1v" title="Déposer la demande" aria-label="Déposer la demande" type="button">Déposer</button><a href="/mocked-href" title="Modifier l’étape" class="fr-mr-1v fr-btn fr-btn--secondary fr-icon-pencil-line" aria-label="Modifier l’étape">Modifier l’étape</a><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-delete-bin-line fr-mr-1v" title="Supprimer l’étape" aria-label="Supprimer l’étape" type="button"> + <div style="display: flex;"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1v" disabled="" title="Déposer l'étape" aria-label="Déposer l'étape" type="button">Déposer</button><a href="/mocked-href" title="Modifier l’étape" class="fr-mr-1v fr-btn fr-btn--secondary fr-icon-pencil-line" aria-label="Modifier l’étape">Modifier l’étape</a><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-delete-bin-line fr-mr-1v" title="Supprimer l’étape" aria-label="Supprimer l’étape" type="button"> <!----> </button> <div style="display: flex;"> @@ -295,4 +295,5 @@ </div> <!----> <!----> + <!----> </div> \ No newline at end of file diff --git a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeAvecForage.html b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeAvecForage.html index b1d591b15..e49a20305 100644 --- a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeAvecForage.html +++ b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeAvecForage.html @@ -5,7 +5,7 @@ <div class="fr-text--lg fr-mb-0" style="font-weight: 500;">Demande</div> <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-ml-1w fr-badge--new fr-badge--no-icon fr-ml-1w" title="Brouillon de l'étape demande" aria-label="Brouillon de l'étape demande">Brouillon</p> </div> - <div style="display: flex;"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1v" title="Déposer la demande" aria-label="Déposer la demande" type="button">Déposer</button><a href="/mocked-href" title="Modifier l’étape" class="fr-mr-1v fr-btn fr-btn--secondary fr-icon-pencil-line" aria-label="Modifier l’étape">Modifier l’étape</a><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-delete-bin-line fr-mr-1v" title="Supprimer l’étape" aria-label="Supprimer l’étape" type="button"> + <div style="display: flex;"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1v" disabled="" title="Déposer l'étape" aria-label="Déposer l'étape" type="button">Déposer</button><a href="/mocked-href" title="Modifier l’étape" class="fr-mr-1v fr-btn fr-btn--secondary fr-icon-pencil-line" aria-label="Modifier l’étape">Modifier l’étape</a><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-delete-bin-line fr-mr-1v" title="Supprimer l’étape" aria-label="Supprimer l’étape" type="button"> <!----> </button> <!----> @@ -134,4 +134,5 @@ <!----> <!----> <!----> + <!----> </div> \ No newline at end of file diff --git a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeAvecGrosseNote.html b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeAvecGrosseNote.html index b9c5b39c4..d482596ec 100644 --- a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeAvecGrosseNote.html +++ b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeAvecGrosseNote.html @@ -5,7 +5,7 @@ <div class="fr-text--lg fr-mb-0" style="font-weight: 500;">Demande</div> <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-ml-1w fr-badge--new fr-badge--no-icon fr-ml-1w" title="Brouillon de l'étape demande" aria-label="Brouillon de l'étape demande">Brouillon</p> </div> - <div style="display: flex;"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1v" disabled="" title="Déposer la demande" aria-label="Déposer la demande" type="button">Déposer</button><a href="/mocked-href" title="Modifier l’étape" class="fr-mr-1v fr-btn fr-btn--secondary fr-icon-pencil-line" aria-label="Modifier l’étape">Modifier l’étape</a><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-delete-bin-line fr-mr-1v" title="Supprimer l’étape" aria-label="Supprimer l’étape" type="button"> + <div style="display: flex;"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1v" disabled="" title="Déposer l'étape" aria-label="Déposer l'étape" type="button">Déposer</button><a href="/mocked-href" title="Modifier l’étape" class="fr-mr-1v fr-btn fr-btn--secondary fr-icon-pencil-line" aria-label="Modifier l’étape">Modifier l’étape</a><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-delete-bin-line fr-mr-1v" title="Supprimer l’étape" aria-label="Supprimer l’étape" type="button"> <!----> </button> <!----> @@ -127,4 +127,5 @@ <!----> <!----> <!----> + <!----> </div> \ No newline at end of file diff --git a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeAvecSeulementPerimetre.html b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeAvecSeulementPerimetre.html index 10e0d6efa..0cf64ef59 100644 --- a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeAvecSeulementPerimetre.html +++ b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeAvecSeulementPerimetre.html @@ -5,7 +5,7 @@ <div class="fr-text--lg fr-mb-0" style="font-weight: 500;">Demande</div> <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-ml-1w fr-badge--new fr-badge--no-icon fr-ml-1w" title="Brouillon de l'étape demande" aria-label="Brouillon de l'étape demande">Brouillon</p> </div> - <div style="display: flex;"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1v" disabled="" title="Déposer la demande" aria-label="Déposer la demande" type="button">Déposer</button><a href="/mocked-href" title="Modifier l’étape" class="fr-mr-1v fr-btn fr-btn--secondary fr-icon-pencil-line" aria-label="Modifier l’étape">Modifier l’étape</a><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-delete-bin-line fr-mr-1v" title="Supprimer l’étape" aria-label="Supprimer l’étape" type="button"> + <div style="display: flex;"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1v" disabled="" title="Déposer l'étape" aria-label="Déposer l'étape" type="button">Déposer</button><a href="/mocked-href" title="Modifier l’étape" class="fr-mr-1v fr-btn fr-btn--secondary fr-icon-pencil-line" aria-label="Modifier l’étape">Modifier l’étape</a><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-delete-bin-line fr-mr-1v" title="Supprimer l’étape" aria-label="Supprimer l’étape" type="button"> <!----> </button> <!----> @@ -106,4 +106,5 @@ <!----> <!----> <!----> + <!----> </div> \ No newline at end of file diff --git a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeMultipleEntreprisesDocuments.html b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeMultipleEntreprisesDocuments.html index be4652b4e..da3eaaeda 100644 --- a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeMultipleEntreprisesDocuments.html +++ b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeMultipleEntreprisesDocuments.html @@ -134,4 +134,5 @@ </div> <!----> <!----> + <!----> </div> \ No newline at end of file diff --git a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeNoMap.html b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeNoMap.html index 9cda4698c..635b0a8e1 100644 --- a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeNoMap.html +++ b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeNoMap.html @@ -119,4 +119,5 @@ </div> <!----> <!----> + <!----> </div> \ No newline at end of file diff --git a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeNonDeposable.html b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeNonDeposable.html index 7ea4b78fc..823c04196 100644 --- a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeNonDeposable.html +++ b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeNonDeposable.html @@ -5,7 +5,7 @@ <div class="fr-text--lg fr-mb-0" style="font-weight: 500;">Demande</div> <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-ml-1w fr-badge--new fr-badge--no-icon fr-ml-1w" title="Brouillon de l'étape demande" aria-label="Brouillon de l'étape demande">Brouillon</p> </div> - <div style="display: flex;"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1v" disabled="" title="Déposer la demande" aria-label="Déposer la demande" type="button">Déposer</button><a href="/mocked-href" title="Modifier l’étape" class="fr-mr-1v fr-btn fr-btn--secondary fr-icon-pencil-line" aria-label="Modifier l’étape">Modifier l’étape</a><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-delete-bin-line fr-mr-1v" title="Supprimer l’étape" aria-label="Supprimer l’étape" type="button"> + <div style="display: flex;"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1v" disabled="" title="Déposer l'étape" aria-label="Déposer l'étape" type="button">Déposer</button><a href="/mocked-href" title="Modifier l’étape" class="fr-mr-1v fr-btn fr-btn--secondary fr-icon-pencil-line" aria-label="Modifier l’étape">Modifier l’étape</a><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-delete-bin-line fr-mr-1v" title="Supprimer l’étape" aria-label="Supprimer l’étape" type="button"> <!----> </button> <!----> @@ -64,4 +64,5 @@ <!----> <!----> <!----> + <!----> </div> \ No newline at end of file diff --git a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeNonSupprimable.html b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeNonSupprimable.html index 26333c9bf..0a4c7ae6a 100644 --- a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeNonSupprimable.html +++ b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeNonSupprimable.html @@ -5,7 +5,7 @@ <div class="fr-text--lg fr-mb-0" style="font-weight: 500;">Demande</div> <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-ml-1w fr-badge--new fr-badge--no-icon fr-ml-1w" title="Brouillon de l'étape demande" aria-label="Brouillon de l'étape demande">Brouillon</p> </div> - <div style="display: flex;"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1v" disabled="" title="Déposer la demande" aria-label="Déposer la demande" type="button">Déposer</button><a href="/mocked-href" title="Modifier l’étape" class="fr-mr-1v fr-btn fr-btn--secondary fr-icon-pencil-line" aria-label="Modifier l’étape">Modifier l’étape</a> + <div style="display: flex;"><button class="fr-btn fr-btn--primary fr-btn--md fr-mr-1v" disabled="" title="Déposer l'étape" aria-label="Déposer l'étape" type="button">Déposer</button><a href="/mocked-href" title="Modifier l’étape" class="fr-mr-1v fr-btn fr-btn--secondary fr-icon-pencil-line" aria-label="Modifier l’étape">Modifier l’étape</a> <!----> <!----> </div> @@ -63,4 +63,5 @@ <!----> <!----> <!----> + <!----> </div> \ No newline at end of file diff --git a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_Depot.html b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_Depot.html index 472fc71ec..82b51ce22 100644 --- a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_Depot.html +++ b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_Depot.html @@ -70,4 +70,5 @@ </div> <!----> <!----> + <!----> </div> \ No newline at end of file diff --git a/packages/ui/src/components/demarche/demarche-etape.tsx b/packages/ui/src/components/demarche/demarche-etape.tsx index 9605fa7be..d46c5cdda 100644 --- a/packages/ui/src/components/demarche/demarche-etape.tsx +++ b/packages/ui/src/components/demarche/demarche-etape.tsx @@ -21,7 +21,7 @@ import { User } from 'camino-common/src/roles' import styles from './demarche-etape.module.css' import { DsfrButton, DsfrButtonIcon, DsfrLink } from '../_ui/dsfr-button' import { PureDownloads } from '../_common/downloads' -import { canDeleteEtape, canEditEtape, isEtapeDeposable } from 'camino-common/src/permissions/titres-etapes' +import { canDeleteEtape, canDeposeEtape, canEditEtape } from 'camino-common/src/permissions/titres-etapes' import { AdministrationId } from 'camino-common/src/static/administrations' import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes' import { TitreStatutId } from 'camino-common/src/static/titresStatuts' @@ -30,12 +30,16 @@ import { RemoveEtapePopup } from './remove-etape-popup' import { SDOMZoneId } from 'camino-common/src/static/sdom' import { DeposeEtapePopup } from './depose-etape-popup' import { ApiClient } from '@/api/api-client' -import { TitreGetDemarche } from 'camino-common/src/titres' +import { TitreGetDemarche, getMostRecentValuePropFromEtapeFondamentaleValide } from 'camino-common/src/titres' import { GetEtapeDocumentsByEtapeId, documentTypeIdComplementaireObligatoireASL, documentTypeIdComplementaireObligatoireDAE, etapeDocumentIdValidator, needAslAndDae } from 'camino-common/src/etape' import { Unites } from 'camino-common/src/static/unites' import { EntrepriseId, Entreprise } from 'camino-common/src/entreprise' import { Badge } from '../_ui/badge' import { CaminoRouter } from '@/typings/vue-router' +import { CommuneId } from 'camino-common/src/static/communes' +import { EtapeAvisTable } from '../etape/etape-avis' +import { FlattenEtape } from 'camino-common/src/etape-form' +import { getSections } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections' // Il ne faut pas utiliser de literal dans le 'in' il n'y aura jamais d'erreur typescript const fondamentalePropsName = 'fondamentale' @@ -46,6 +50,7 @@ type Props = { administrationsLocales: AdministrationId[] demarche_type_id: DemarcheTypeId sdom_zones: SDOMZoneId[] + communes: CommuneId[] etapes: TitreGetDemarche['etapes'] } titre: { @@ -161,28 +166,75 @@ export const DemarcheEtape = defineComponent<Props>(props => { return null }) - const isDeposable = computed<boolean>(() => - fondamentalePropsName in props.etape - ? isEtapeDeposable( - props.user, - { typeId: props.titre.typeId, titreStatutId: props.titre.titreStatutId, titulaires: props.demarche.titulaireIds, administrationsLocales: props.demarche.administrationsLocales }, - props.demarche.demarche_type_id, - { - typeId: props.etape.etape_type_id, - isBrouillon: props.etape.is_brouillon, - sectionsWithValue: props.etape.sections_with_values, - substances: props.etape.fondamentale.substances, - duree: props.etape.fondamentale.duree, - geojson4326Perimetre: props.etape.fondamentale.perimetre?.geojson4326_perimetre ?? null, + const isDeposable = computed<boolean>(() => { + const titulaireIds = getMostRecentValuePropFromEtapeFondamentaleValide('titulaireIds', [{ ...props.demarche, ordre: 0 }]) + const amodiataireIds = getMostRecentValuePropFromEtapeFondamentaleValide('amodiataireIds', [{ ...props.demarche, ordre: 0 }]) + const perimetre = getMostRecentValuePropFromEtapeFondamentaleValide('perimetre', [{ ...props.demarche, ordre: 0 }]) + const substances = getMostRecentValuePropFromEtapeFondamentaleValide('substances', [{ ...props.demarche, ordre: 0 }]) + const duree = getMostRecentValuePropFromEtapeFondamentaleValide('duree', [{ ...props.demarche, ordre: 0 }]) + + const sections = getSections(props.titre.typeId, props.demarche.demarche_type_id, props.etape.etape_type_id) + const sortedEtapes = [...props.demarche.etapes].sort((a, b) => b.ordre - a.ordre) + const contenu: FlattenEtape['contenu'] = {} + + sections.forEach(section => { + contenu[section.id] = {} + section.elements.forEach(element => { + let elementValue = null + for (const etape of sortedEtapes) { + const sectionWithValue = etape.sections_with_values.find(s => s.id === section.id) + const elementWithValue = sectionWithValue?.elements.find(e => e.id === element.id) + + if (isNotNullNorUndefined(elementWithValue)) { + elementValue = elementWithValue.value + break + } + } + + contenu[section.id][element.id] = { value: elementValue, heritee: false, etapeHeritee: null } + }) + }) + return canDeposeEtape( + props.user, + { typeId: props.titre.typeId, titreStatutId: props.titre.titreStatutId, titulaires: props.demarche.titulaireIds, administrationsLocales: props.demarche.administrationsLocales }, + props.demarche.demarche_type_id, + { + amodiataires: { value: amodiataireIds ?? [], heritee: false, etapeHeritee: null }, + titulaires: { value: titulaireIds ?? [], heritee: false, etapeHeritee: null }, + contenu, + date: props.etape.date, + typeId: props.etape.etape_type_id, + duree: { value: duree, heritee: false, etapeHeritee: null }, + perimetre: { + value: { + geojson4326Forages: perimetre?.geojson4326_forages ?? null, + geojson4326Perimetre: perimetre?.geojson4326_perimetre ?? null, + geojson4326Points: perimetre?.geojson4326_points ?? null, + geojsonOrigineForages: perimetre?.geojson_origine_forages ?? null, + geojsonOrigineGeoSystemeId: perimetre?.geojson_origine_geo_systeme_id ?? null, + geojsonOriginePoints: perimetre?.geojson_origine_points ?? null, + geojsonOriginePerimetre: perimetre?.geojson_origine_perimetre ?? null, + surface: perimetre?.surface ?? null, }, - props.etape.etape_documents, - props.etape.entreprises_documents, - props.demarche.sdom_zones, - daeDocument.value, - aslDocument.value - ) - : false - ) + heritee: false, + etapeHeritee: null, + }, + substances: { value: substances ?? [], heritee: false, etapeHeritee: null }, + + isBrouillon: props.etape.is_brouillon, + statutId: props.etape.etape_statut_id, + }, + props.etape.etape_documents, + props.etape.entreprises_documents, + props.demarche.sdom_zones, + props.demarche.communes, + daeDocument.value, + aslDocument.value, + props.etape.avis_documents + ) + }) + + const isBrouillon = computed<boolean>(() => props.etape.is_brouillon) return () => ( <div class="fr-pb-2w fr-pl-2w fr-pr-2w fr-tile--shadow" style={{ border: '1px solid var(--grey-900-175)' }}> @@ -192,16 +244,13 @@ export const DemarcheEtape = defineComponent<Props>(props => { <div class="fr-text--lg fr-mb-0" style={{ color: 'var(--text-title-blue-france)', fontWeight: '500' }}> {capitalize(EtapesTypes[props.etape.etape_type_id].nom)} </div> - {props.etape.is_brouillon ? <Badge class="fr-ml-1w" systemLevel="new" ariaLabel={`Brouillon de l'étape ${EtapesTypes[props.etape.etape_type_id].nom}`} label="Brouillon" /> : null} + {isBrouillon.value ? <Badge class="fr-ml-1w" systemLevel="new" ariaLabel={`Brouillon de l'étape ${EtapesTypes[props.etape.etape_type_id].nom}`} label="Brouillon" /> : null} </div> <div style={{ display: 'flex' }}> {canEditOrDeleteEtape.value ? ( <> - {/* TODO 2024-05-16: retirer la condition 'est une demande' pour ne conserver que 'est un brouillon' */} - {props.etape.etape_type_id === ETAPES_TYPES.demande && props.etape.is_brouillon ? ( - <DsfrButton class="fr-mr-1v" buttonType="primary" label="Déposer" title="Déposer la demande" onClick={deposePopupOpen} disabled={!isDeposable.value} /> - ) : null} + {isBrouillon.value ? <DsfrButton class="fr-mr-1v" buttonType="primary" label="Déposer" title="Déposer l'étape" onClick={deposePopupOpen} disabled={!isDeposable.value} /> : null} <DsfrLink icon={'fr-icon-pencil-line'} disabled={false} @@ -321,6 +370,7 @@ export const DemarcheEtape = defineComponent<Props>(props => { <EtapeDocuments etapeDocuments={props.etape.etape_documents} entrepriseDocuments={props.etape.entreprises_documents} user={props.user} entreprises={props.entreprises} /> + <EtapeAvisTable etapeAvis={props.etape.avis_documents} user={props.user} /> {removePopupVisible.value ? ( <RemoveEtapePopup close={closeRemovePopup} diff --git a/packages/ui/src/components/etape-edition.stories.tsx b/packages/ui/src/components/etape-edition.stories.tsx index 1153e3f05..e88a85b24 100644 --- a/packages/ui/src/components/etape-edition.stories.tsx +++ b/packages/ui/src/components/etape-edition.stories.tsx @@ -3,15 +3,13 @@ import { action } from '@storybook/addon-actions' import { Props, PureEtapeEdition } from './etape-edition' import { EntrepriseDocumentId, EntrepriseId, EtapeEntrepriseDocument, entrepriseDocumentIdValidator, entrepriseIdValidator, toEntrepriseDocumentId } from 'camino-common/src/entreprise' import { DemarcheId, demarcheIdOrSlugValidator, demarcheIdValidator, demarcheSlugValidator } from 'camino-common/src/demarche' -import { EtapeId, etapeDocumentIdValidator, etapeIdOrSlugValidator, etapeIdValidator, etapeSlugValidator } from 'camino-common/src/etape' +import { ETAPE_IS_BROUILLON, ETAPE_IS_NOT_BROUILLON, EtapeId, etapeDocumentIdValidator, etapeIdOrSlugValidator, etapeIdValidator, etapeSlugValidator } from 'camino-common/src/etape' import { titreIdValidator, titreSlugValidator } from 'camino-common/src/validators/titres' import { FeatureMultiPolygon, PerimetreInformations } from 'camino-common/src/perimetre' import { CaminoDate, caminoDateValidator, toCaminoDate } from 'camino-common/src/date' import { testBlankUser } from 'camino-common/src/tests-utils' import { UiEntrepriseDocumentInput } from './entreprise/entreprise-api-client' import { demarcheTypeIdValidator } from 'camino-common/src/static/demarchesTypes' -import { DeepReadonly } from 'vue' -import { CoreEtapeCreationOrModification } from './etape/etape-api-client' import { FlattenEtape } from 'camino-common/src/etape-form' import { tempDocumentNameValidator, TempDocumentName } from 'camino-common/src/document' @@ -38,7 +36,7 @@ const creerEntrepriseDocumentAction = action('creerEntrepriseDocument') const goToDemarcheAction = action('goToDemarche') const etapeCreerAction = action('etapeCreer') const etapeModifierAction = action('etapeModifier') - +const getEtapeAvisByEtapeIdAction = action('getEtapeAvisByEtapeId') const entreprises = [ { id: entrepriseIdValidator.parse('fr-899600233'), nom: '10 A', legal_siren: '899600233' }, { id: entrepriseIdValidator.parse('fr-529770646'), nom: '2GRE', legal_siren: '529770646' }, @@ -55,6 +53,7 @@ const entreprises = [ const perimetreInformations: PerimetreInformations = { sdomZoneIds: ['1'], superposition_alertes: [{ nom: 'Titre Tutu', slug: titreSlugValidator.parse('slug-tutu'), titre_statut_id: 'mod' }], + communes: [], } const perimetre: FeatureMultiPolygon = { @@ -77,6 +76,10 @@ const perimetre: FeatureMultiPolygon = { } const apiClient: Props['apiClient'] = { + getEtapeAvisByEtapeId(etapeId) { + getEtapeAvisByEtapeIdAction(etapeId) + return Promise.resolve([]) + }, deposeEtape(etapeId) { deposeEtapeAction(etapeId) @@ -172,36 +175,35 @@ const apiClient: Props['apiClient'] = { getEtapeHeritagePotentiel(etape, titreDemarcheId) { getEtapeHeritagePotentielAction(etape, titreDemarcheId) return Promise.resolve({ - ...etape, - duree: { - value: etape.duree.value, - heritee: false, - etapeHeritee: { - date: toCaminoDate('2022-01-01'), - etapeTypeId: 'mfr', - value: 12, + heritageProps: { + duree: { + actif: false, + etape: { + date: toCaminoDate('2022-01-01'), + typeId: 'mfr', + duree: 12, + }, }, - }, - substances: { - value: ['arge'], - heritee: true, - etapeHeritee: { - date: toCaminoDate('2022-01-01'), - etapeTypeId: 'mfr', + substances: { value: ['arge'], + actif: true, + etape: { + date: toCaminoDate('2022-01-01'), + typeId: 'mfr', + substances: ['arge'], + }, }, - }, - dateDebut: { value: etape.dateDebut.value, heritee: false, etapeHeritee: null }, - titulaires: { value: etape.titulaires.value, heritee: false, etapeHeritee: null }, - amodiataires: { value: etape.amodiataires.value, heritee: false, etapeHeritee: null }, - perimetre: { value: etape.perimetre.value, heritee: false, etapeHeritee: null }, - dateFin: { - value: etape.dateFin.value, - heritee: false, - etapeHeritee: { - date: toCaminoDate('2022-01-01'), - etapeTypeId: 'mfr', - value: toCaminoDate('2022-01-01'), + dateDebut: { actif: false, etape: null }, + titulaires: { actif: false, etape: null }, + amodiataires: { actif: false, etape: null }, + perimetre: { actif: false, etape: null }, + dateFin: { + actif: false, + etape: { + date: toCaminoDate('2022-01-01'), + typeId: 'mfr', + dateFin: toCaminoDate('2022-01-01'), + }, }, }, heritageContenu: { arm: { mecanise: { actif: false }, franchissements: { actif: false } } }, @@ -256,7 +258,7 @@ const apiClient: Props['apiClient'] = { slug: etapeSlugValidator.parse('etape-slug'), typeId: 'mfr', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, titreDemarcheId: demarcheId, date: caminoDateValidator.parse('2023-02-01'), dateDebut: { value: null, heritee: false, etapeHeritee: null }, @@ -360,7 +362,7 @@ export const AffichageAide: StoryFn = () => ( slug: etapeSlugValidator.parse('etape-slug'), typeId: 'mfr', statutId: 'fai', - isBrouillon: true, + isBrouillon: ETAPE_IS_BROUILLON, titreDemarcheId: demarcheId, date: caminoDateValidator.parse('2023-02-01'), dateDebut: { value: null, heritee: false, etapeHeritee: null }, @@ -417,17 +419,17 @@ export const DemandeArmComplete: StoryFn = () => ( getEtapeHeritagePotentielAction(etape, titreDemarcheId) return Promise.resolve({ - ...etape, - dateDebut: { value: etape.dateDebut.value, heritee: false, etapeHeritee: null }, - dateFin: { value: etape.dateFin.value, heritee: false, etapeHeritee: null }, - duree: { value: etape.duree.value, heritee: false, etapeHeritee: null }, - substances: { value: etape.substances.value, heritee: false, etapeHeritee: null }, - titulaires: { value: etape.titulaires.value, heritee: false, etapeHeritee: null }, - amodiataires: { value: etape.amodiataires.value, heritee: false, etapeHeritee: null }, - perimetre: { - value: etape.perimetre.value, - heritee: false, - etapeHeritee: null, + heritageProps: { + dateDebut: { actif: false, etape: null }, + dateFin: { actif: false, etape: null }, + duree: { actif: false, etape: null }, + substances: { actif: false, etape: null }, + titulaires: { actif: false, etape: null }, + amodiataires: { actif: false, etape: null }, + perimetre: { + actif: false, + etape: null, + }, }, heritageContenu: { arm: { mecanise: { actif: false }, franchissements: { actif: false } } }, }) @@ -550,7 +552,7 @@ export const DemandeArmComplete: StoryFn = () => ( slug: etapeSlugValidator.parse('etape-slug'), typeId: 'mfr', statutId: 'fai', - isBrouillon: true, + isBrouillon: ETAPE_IS_BROUILLON, titreDemarcheId: demarcheId, date: caminoDateValidator.parse('2023-02-01'), dateDebut: { value: null, heritee: false, etapeHeritee: null }, @@ -678,7 +680,7 @@ export const ModificationDemandeHeritee: StoryFn = () => ( entreprises={entreprises} apiClient={{ ...apiClient, - getEtapeHeritagePotentiel(etape: DeepReadonly<CoreEtapeCreationOrModification>, titreDemarcheId: DemarcheId) { + getEtapeHeritagePotentiel(etape, titreDemarcheId) { getEtapeHeritagePotentielAction(etape, titreDemarcheId) return Promise.reject(new Error("Cet appel ne doit être fait que lors de la création de l'étape ou pour la modification de la date")) @@ -692,7 +694,7 @@ export const ModificationDemandeHeritee: StoryFn = () => ( slug: etapeSlugValidator.parse('etape-slug'), typeId: 'mod', statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, titreDemarcheId: demarcheIdValidator.parse('demarche-id'), date: caminoDateValidator.parse('2023-02-01'), contenu: { @@ -771,54 +773,39 @@ export const AxmEnZoneDuSdom: StoryFn = () => ( entreprises={entreprises} apiClient={{ ...apiClient, - getEtapeHeritagePotentiel(etape: DeepReadonly<CoreEtapeCreationOrModification>, titreDemarcheId: DemarcheId) { + getEtapeHeritagePotentiel(etape, titreDemarcheId) { getEtapeHeritagePotentielAction(etape, titreDemarcheId) return Promise.resolve({ - ...etape, - dateDebut: { - value: null, - heritee: false, - etapeHeritee: null, - }, - dateFin: { - value: null, - heritee: false, - etapeHeritee: null, - }, - duree: { - value: 6, - heritee: false, - etapeHeritee: null, - }, - substances: { - value: [], - heritee: false, - etapeHeritee: null, - }, - titulaires: { - value: [], - heritee: false, - etapeHeritee: null, - }, - amodiataires: { - value: [], - heritee: false, - etapeHeritee: null, - }, - perimetre: { - value: { - geojson4326Forages: null, - geojson4326Perimetre: null, - geojson4326Points: null, - geojsonOrigineForages: null, - geojsonOrigineGeoSystemeId: null, - geojsonOriginePerimetre: null, - geojsonOriginePoints: null, - surface: null, + heritageProps: { + dateDebut: { + actif: false, + etape: null, + }, + dateFin: { + actif: false, + etape: null, + }, + duree: { + actif: false, + etape: null, + }, + substances: { + actif: false, + etape: null, + }, + titulaires: { + actif: false, + etape: null, + }, + amodiataires: { + actif: false, + etape: null, + }, + perimetre: { + actif: false, + etape: null, }, - heritee: false, - etapeHeritee: null, }, heritageContenu: {}, }) @@ -832,7 +819,7 @@ export const AxmEnZoneDuSdom: StoryFn = () => ( slug: etapeSlugValidator.parse('etape-slug'), typeId: 'mfr', statutId: 'fai', - isBrouillon: true, + isBrouillon: ETAPE_IS_BROUILLON, titreDemarcheId: demarcheIdValidator.parse('demarche-id'), date: caminoDateValidator.parse('2023-02-01'), dateDebut: { diff --git a/packages/ui/src/components/etape-edition.stories_snapshots_AffichageAide.html b/packages/ui/src/components/etape-edition.stories_snapshots_AffichageAide.html index a0ef03da1..759274b4c 100644 --- a/packages/ui/src/components/etape-edition.stories_snapshots_AffichageAide.html +++ b/packages/ui/src/components/etape-edition.stories_snapshots_AffichageAide.html @@ -190,10 +190,10 @@ <!----> </div> </div> + <!----> <div> <div> - <h2 class="fr-pt-6w">Documents d’entreprise - <!----> + <h2 class="fr-pt-6w">Documents d’entreprise<p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--sm fr-ml-2w fr-badge--error fr-badge--no-icon fr-ml-2w" title="Incomplet" aria-label="Incomplet">Incomplet</p> </h2> <!----> </div> diff --git a/packages/ui/src/components/etape-edition.stories_snapshots_AxmEnZoneDuSdom.html b/packages/ui/src/components/etape-edition.stories_snapshots_AxmEnZoneDuSdom.html index 9333bd3d9..3500f1852 100644 --- a/packages/ui/src/components/etape-edition.stories_snapshots_AxmEnZoneDuSdom.html +++ b/packages/ui/src/components/etape-edition.stories_snapshots_AxmEnZoneDuSdom.html @@ -207,10 +207,10 @@ <!----> </div> </div> + <!----> <div> <div> - <h2 class="fr-pt-6w">Documents d’entreprise - <!----> + <h2 class="fr-pt-6w">Documents d’entreprise<p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--sm fr-ml-2w fr-badge--error fr-badge--no-icon fr-ml-2w" title="Incomplet" aria-label="Incomplet">Incomplet</p> </h2> <!----> </div> diff --git a/packages/ui/src/components/etape-edition.stories_snapshots_DemandeArmComplete.html b/packages/ui/src/components/etape-edition.stories_snapshots_DemandeArmComplete.html index 393910a10..25c65e6b4 100644 --- a/packages/ui/src/components/etape-edition.stories_snapshots_DemandeArmComplete.html +++ b/packages/ui/src/components/etape-edition.stories_snapshots_DemandeArmComplete.html @@ -367,6 +367,7 @@ <!----> </div> </div> + <!----> <div> <div> <h2 class="fr-pt-6w">Documents d’entreprise diff --git a/packages/ui/src/components/etape-edition.stories_snapshots_Modification.html b/packages/ui/src/components/etape-edition.stories_snapshots_Modification.html index 2cf57d12a..cfcf5d61c 100644 --- a/packages/ui/src/components/etape-edition.stories_snapshots_Modification.html +++ b/packages/ui/src/components/etape-edition.stories_snapshots_Modification.html @@ -190,10 +190,10 @@ <!----> </div> </div> + <!----> <div> <div> - <h2 class="fr-pt-6w">Documents d’entreprise - <!----> + <h2 class="fr-pt-6w">Documents d’entreprise<p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--sm fr-ml-2w fr-badge--error fr-badge--no-icon fr-ml-2w" title="Incomplet" aria-label="Incomplet">Incomplet</p> </h2> <!----> </div> diff --git a/packages/ui/src/components/etape-edition.stories_snapshots_ModificationDemandeHeritee.html b/packages/ui/src/components/etape-edition.stories_snapshots_ModificationDemandeHeritee.html index 15920db64..bcff8243d 100644 --- a/packages/ui/src/components/etape-edition.stories_snapshots_ModificationDemandeHeritee.html +++ b/packages/ui/src/components/etape-edition.stories_snapshots_ModificationDemandeHeritee.html @@ -326,6 +326,7 @@ <!----> </div> </div> + <!----> <div> <div> <h2 class="fr-pt-6w">Documents d’entreprise diff --git a/packages/ui/src/components/etape-edition.tsx b/packages/ui/src/components/etape-edition.tsx index f7fd0701d..533c98313 100644 --- a/packages/ui/src/components/etape-edition.tsx +++ b/packages/ui/src/components/etape-edition.tsx @@ -4,7 +4,7 @@ import { ApiClient, apiClient } from '../api/api-client' import { DemarcheId, DemarcheIdOrSlug, demarcheIdOrSlugValidator } from 'camino-common/src/demarche' import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' import { Alert } from './_ui/alert' -import { EtapeIdOrSlug, etapeIdOrSlugValidator } from 'camino-common/src/etape' +import { ETAPE_IS_NOT_BROUILLON, EtapeIdOrSlug, etapeIdOrSlugValidator } from 'camino-common/src/etape' import { entreprisesKey, userKey } from '../moi' import { User, isAdministrationAdmin, isAdministrationEditeur, isSuper } from 'camino-common/src/roles' import { Entreprise } from 'camino-common/src/entreprise' @@ -76,6 +76,7 @@ export type Props = { | 'etapeCreer' | 'etapeModifier' | 'deposeEtape' + | 'getEtapeAvisByEtapeId' > } @@ -107,7 +108,7 @@ export const PureEtapeEdition = defineComponent<Props>(props => { date: null, typeId: null, statutId: null, - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, notes: null, substances: { value: [], heritee: true, etapeHeritee: null }, titulaires: { value: [], heritee: true, etapeHeritee: null }, diff --git a/packages/ui/src/components/etape/add-etape-avis-popup.stories.tsx b/packages/ui/src/components/etape/add-etape-avis-popup.stories.tsx new file mode 100644 index 000000000..5972a9c4b --- /dev/null +++ b/packages/ui/src/components/etape/add-etape-avis-popup.stories.tsx @@ -0,0 +1,68 @@ +import { Meta, StoryFn } from '@storybook/vue3' +import { action } from '@storybook/addon-actions' +import { tempDocumentNameValidator } from 'camino-common/src/document' +import { ApiClient } from '@/api/api-client' +import { AddEtapeAvisPopup } from './add-etape-avis-popup' +import { toCaminoDate } from 'camino-common/src/date' +import { etapeAvisIdValidator } from 'camino-common/src/etape' +import { AvisTypeId, AvisTypes, AvisVisibilityIds, avisTypeIdValidator } from 'camino-common/src/static/avisTypes' +import { NonEmptyArray, getKeys } from 'camino-common/src/typescript-tools' +import { testBlankUser } from 'camino-common/src/tests-utils' + +const meta: Meta = { + title: 'Components/Etape/AddAvisPopup', + // @ts-ignore + component: AddEtapeAvisPopup, +} +export default meta + +const close = action('close') +const uploadTempDocumentAction = action('uploadTempDocument') + +const apiClient: Pick<ApiClient, 'uploadTempDocument'> = { + uploadTempDocument: (...params) => { + uploadTempDocumentAction(params) + + return Promise.resolve(tempDocumentNameValidator.parse(new Date().toISOString())) + }, +} +const avisTypeIds: NonEmptyArray<AvisTypeId> = getKeys(AvisTypes, (value): value is AvisTypeId => { + return avisTypeIdValidator.safeParse(value).success +}) as NonEmptyArray<AvisTypeId> +export const SansDocumentInitial: StoryFn = () => <AddEtapeAvisPopup close={close} user={{ ...testBlankUser, role: 'super' }} apiClient={apiClient} initialAvis={null} avisTypeIds={avisTypeIds} /> + +export const DocumentInitialTemporaire: StoryFn = () => ( + <AddEtapeAvisPopup + close={close} + initialAvis={{ + description: 'description', + avis_type_id: 'lettreDeSaisineDesServices', + temp_document_name: tempDocumentNameValidator.parse('value'), + date: toCaminoDate('2023-01-02'), + avis_statut_id: 'Favorable', + has_file: false, + avis_visibility_id: AvisVisibilityIds.Administrations, + }} + apiClient={apiClient} + avisTypeIds={avisTypeIds} + user={{ ...testBlankUser, role: 'super' }} + /> +) + +export const DocumentInitialDejaSauvegarde: StoryFn = () => ( + <AddEtapeAvisPopup + close={close} + initialAvis={{ + description: 'description', + avis_type_id: 'lettreDeSaisineDesServices', + id: etapeAvisIdValidator.parse('documentId'), + date: toCaminoDate('2023-01-02'), + avis_statut_id: 'Favorable', + has_file: false, + avis_visibility_id: AvisVisibilityIds.TitulairesEtAdministrations, + }} + apiClient={apiClient} + avisTypeIds={avisTypeIds} + user={{ ...testBlankUser, role: 'super' }} + /> +) diff --git a/packages/ui/src/components/etape/add-etape-avis-popup.stories_snapshots_DocumentInitialDejaSauvegarde.html b/packages/ui/src/components/etape/add-etape-avis-popup.stories_snapshots_DocumentInitialDejaSauvegarde.html new file mode 100644 index 000000000..0bb625db1 --- /dev/null +++ b/packages/ui/src/components/etape/add-etape-avis-popup.stories_snapshots_DocumentInitialDejaSauvegarde.html @@ -0,0 +1,93 @@ +<!--teleport start--> +<div> + <dialog id="monId" class="fr-modal fr-modal--opened" open="" aria-modal="true" role="dialog" aria-labelledby="monId-title" style="z-index: 1000001;"> + <div class="fr-container fr-container--fluid fr-container-md"> + <div class="fr-grid-row fr-grid-row--center"> + <div class="fr-col-12 fr-col-md-8 fr-col-lg-6"> + <div class="fr-modal__body"> + <div class="fr-modal__header"><button class="fr-btn--close fr-btn" aria-controls="monId" title="Fermer">Fermer</button></div> + <div class="fr-modal__content"> + <h1 id="monId-title" class="fr-modal__title"><span class="fr-icon-arrow-right-line fr-icon--lg" aria-hidden="true"></span>Ajout d'un document</h1> + <div class="fr-container"> + <form> + <fieldset class="fr-fieldset" id="text"> + <div class="fr-fieldset__element"> + <div class="fr-select-group"><label class="fr-label" for="type">Type d'avis</label> + <div id="typeahead_271_wrapper" class="_typeahead_8eddf1"> + <div class="flex"><input id="typeahead_271" type="text" name="typeahead_271" class="fr-input" placeholder="" autocomplete="off"></div> + <!----> + </div> + </div> + </div> + </fieldset> + <fieldset class="fr-fieldset" id="text"> + <div class="fr-fieldset__element"> + <div class="fr-upload-group"><label class="fr-label" for="file-upload">Ajouter un fichier<span class="fr-hint-text">Taille maximale : 100 Mo. Format<!----> supporté<!----> : pdf.</span></label><input class="fr-upload" type="file" id="file-upload" name="file-upload" accept=".pdf"></div> + </div> + <div class="fr-fieldset__element"> + <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">Date * + <!----> + </label><input class="fr-input" name="input_670" id="input_670" required="" type="date"> + <!----> + </div> + </div> + <div class="fr-fieldset__element"> + <div class="fr-select-group"><label class="fr-label" for="select_74">Statut * + <!----> + </label><select class="fr-select" id="select_74" aria-label="Statut" name="select_74"> + <option value="Favorable">Favorable</option> + <option value="Défavorable">Défavorable</option> + <option value="Favorable avec réserves">Favorable avec réserves</option> + <option value="Non renseigné">Non renseigné</option> + <option disabled="" hidden="" value="">Selectionnez une option</option> + </select></div> + </div> + <div class="fr-fieldset__element"> + <fieldset class="fr-fieldset" id="radio_878" aria-labelledby="radio_878-legend" style="flex-direction: column; align-items: flex-start;"> + <legend class="fr-fieldset__legend--regular fr-fieldset__legend" id="radio_878-legend">Visibilité * + <!----> + </legend> + <div class="fr-fieldset__element"> + <div class="fr-radio-group"><input type="radio" id="radio_878-0" name="radio_878"><label class="fr-label" for="radio_878-0">Public + <!----> + </label></div> + </div> + <div class="fr-fieldset__element"> + <div class="fr-radio-group"><input type="radio" id="radio_878-1" name="radio_878"><label class="fr-label" for="radio_878-1">Visible par les administrations et les entreprises titulaires + <!----> + </label></div> + </div> + <div class="fr-fieldset__element"> + <div class="fr-radio-group"><input type="radio" id="radio_878-2" name="radio_878"><label class="fr-label" for="radio_878-2">Visible par les administrations + <!----> + </label></div> + </div> + </fieldset> + </div> + <div class="fr-fieldset__element"> + <div class="fr-input-group"><label class="fr-label" for="textarea_967">Description + <!----> + <!----> + </label><textarea class="fr-input" name="textarea_967" id="textarea_967"></textarea></div> + </div> + </fieldset> + </form> + <!----> + </div> + </div> + <div class="fr-modal__footer"> + <div style="display: flex; width: 100%; justify-content: end; align-items: center; gap: 1rem;"> + <!----> + <ul class="fr-btns-group fr-btns-group--right fr-btns-group--inline-reverse fr-btns-group--inline-lg fr-btns-group--icon-left" style="width: auto;"> + <li><button class="fr-btn fr-icon-check-line fr-btn--icon-left disabled" disabled="">Enregistrer</button></li> + <li><button class="fr-btn fr-icon-arrow-go-back-fill fr-btn--icon-left fr-btn--secondary" aria-controls="monId">Annuler</button></li> + </ul> + </div> + </div> + </div> + </div> + </div> + </div> + </dialog> +</div> +<!--teleport end--> \ No newline at end of file diff --git a/packages/ui/src/components/etape/add-etape-avis-popup.stories_snapshots_DocumentInitialTemporaire.html b/packages/ui/src/components/etape/add-etape-avis-popup.stories_snapshots_DocumentInitialTemporaire.html new file mode 100644 index 000000000..0bb625db1 --- /dev/null +++ b/packages/ui/src/components/etape/add-etape-avis-popup.stories_snapshots_DocumentInitialTemporaire.html @@ -0,0 +1,93 @@ +<!--teleport start--> +<div> + <dialog id="monId" class="fr-modal fr-modal--opened" open="" aria-modal="true" role="dialog" aria-labelledby="monId-title" style="z-index: 1000001;"> + <div class="fr-container fr-container--fluid fr-container-md"> + <div class="fr-grid-row fr-grid-row--center"> + <div class="fr-col-12 fr-col-md-8 fr-col-lg-6"> + <div class="fr-modal__body"> + <div class="fr-modal__header"><button class="fr-btn--close fr-btn" aria-controls="monId" title="Fermer">Fermer</button></div> + <div class="fr-modal__content"> + <h1 id="monId-title" class="fr-modal__title"><span class="fr-icon-arrow-right-line fr-icon--lg" aria-hidden="true"></span>Ajout d'un document</h1> + <div class="fr-container"> + <form> + <fieldset class="fr-fieldset" id="text"> + <div class="fr-fieldset__element"> + <div class="fr-select-group"><label class="fr-label" for="type">Type d'avis</label> + <div id="typeahead_271_wrapper" class="_typeahead_8eddf1"> + <div class="flex"><input id="typeahead_271" type="text" name="typeahead_271" class="fr-input" placeholder="" autocomplete="off"></div> + <!----> + </div> + </div> + </div> + </fieldset> + <fieldset class="fr-fieldset" id="text"> + <div class="fr-fieldset__element"> + <div class="fr-upload-group"><label class="fr-label" for="file-upload">Ajouter un fichier<span class="fr-hint-text">Taille maximale : 100 Mo. Format<!----> supporté<!----> : pdf.</span></label><input class="fr-upload" type="file" id="file-upload" name="file-upload" accept=".pdf"></div> + </div> + <div class="fr-fieldset__element"> + <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">Date * + <!----> + </label><input class="fr-input" name="input_670" id="input_670" required="" type="date"> + <!----> + </div> + </div> + <div class="fr-fieldset__element"> + <div class="fr-select-group"><label class="fr-label" for="select_74">Statut * + <!----> + </label><select class="fr-select" id="select_74" aria-label="Statut" name="select_74"> + <option value="Favorable">Favorable</option> + <option value="Défavorable">Défavorable</option> + <option value="Favorable avec réserves">Favorable avec réserves</option> + <option value="Non renseigné">Non renseigné</option> + <option disabled="" hidden="" value="">Selectionnez une option</option> + </select></div> + </div> + <div class="fr-fieldset__element"> + <fieldset class="fr-fieldset" id="radio_878" aria-labelledby="radio_878-legend" style="flex-direction: column; align-items: flex-start;"> + <legend class="fr-fieldset__legend--regular fr-fieldset__legend" id="radio_878-legend">Visibilité * + <!----> + </legend> + <div class="fr-fieldset__element"> + <div class="fr-radio-group"><input type="radio" id="radio_878-0" name="radio_878"><label class="fr-label" for="radio_878-0">Public + <!----> + </label></div> + </div> + <div class="fr-fieldset__element"> + <div class="fr-radio-group"><input type="radio" id="radio_878-1" name="radio_878"><label class="fr-label" for="radio_878-1">Visible par les administrations et les entreprises titulaires + <!----> + </label></div> + </div> + <div class="fr-fieldset__element"> + <div class="fr-radio-group"><input type="radio" id="radio_878-2" name="radio_878"><label class="fr-label" for="radio_878-2">Visible par les administrations + <!----> + </label></div> + </div> + </fieldset> + </div> + <div class="fr-fieldset__element"> + <div class="fr-input-group"><label class="fr-label" for="textarea_967">Description + <!----> + <!----> + </label><textarea class="fr-input" name="textarea_967" id="textarea_967"></textarea></div> + </div> + </fieldset> + </form> + <!----> + </div> + </div> + <div class="fr-modal__footer"> + <div style="display: flex; width: 100%; justify-content: end; align-items: center; gap: 1rem;"> + <!----> + <ul class="fr-btns-group fr-btns-group--right fr-btns-group--inline-reverse fr-btns-group--inline-lg fr-btns-group--icon-left" style="width: auto;"> + <li><button class="fr-btn fr-icon-check-line fr-btn--icon-left disabled" disabled="">Enregistrer</button></li> + <li><button class="fr-btn fr-icon-arrow-go-back-fill fr-btn--icon-left fr-btn--secondary" aria-controls="monId">Annuler</button></li> + </ul> + </div> + </div> + </div> + </div> + </div> + </div> + </dialog> +</div> +<!--teleport end--> \ No newline at end of file diff --git a/packages/ui/src/components/etape/add-etape-avis-popup.stories_snapshots_SansDocumentInitial.html b/packages/ui/src/components/etape/add-etape-avis-popup.stories_snapshots_SansDocumentInitial.html new file mode 100644 index 000000000..0bb625db1 --- /dev/null +++ b/packages/ui/src/components/etape/add-etape-avis-popup.stories_snapshots_SansDocumentInitial.html @@ -0,0 +1,93 @@ +<!--teleport start--> +<div> + <dialog id="monId" class="fr-modal fr-modal--opened" open="" aria-modal="true" role="dialog" aria-labelledby="monId-title" style="z-index: 1000001;"> + <div class="fr-container fr-container--fluid fr-container-md"> + <div class="fr-grid-row fr-grid-row--center"> + <div class="fr-col-12 fr-col-md-8 fr-col-lg-6"> + <div class="fr-modal__body"> + <div class="fr-modal__header"><button class="fr-btn--close fr-btn" aria-controls="monId" title="Fermer">Fermer</button></div> + <div class="fr-modal__content"> + <h1 id="monId-title" class="fr-modal__title"><span class="fr-icon-arrow-right-line fr-icon--lg" aria-hidden="true"></span>Ajout d'un document</h1> + <div class="fr-container"> + <form> + <fieldset class="fr-fieldset" id="text"> + <div class="fr-fieldset__element"> + <div class="fr-select-group"><label class="fr-label" for="type">Type d'avis</label> + <div id="typeahead_271_wrapper" class="_typeahead_8eddf1"> + <div class="flex"><input id="typeahead_271" type="text" name="typeahead_271" class="fr-input" placeholder="" autocomplete="off"></div> + <!----> + </div> + </div> + </div> + </fieldset> + <fieldset class="fr-fieldset" id="text"> + <div class="fr-fieldset__element"> + <div class="fr-upload-group"><label class="fr-label" for="file-upload">Ajouter un fichier<span class="fr-hint-text">Taille maximale : 100 Mo. Format<!----> supporté<!----> : pdf.</span></label><input class="fr-upload" type="file" id="file-upload" name="file-upload" accept=".pdf"></div> + </div> + <div class="fr-fieldset__element"> + <div class="fr-input-group" style="margin-bottom: 0px;"><label class="fr-label" for="input_670">Date * + <!----> + </label><input class="fr-input" name="input_670" id="input_670" required="" type="date"> + <!----> + </div> + </div> + <div class="fr-fieldset__element"> + <div class="fr-select-group"><label class="fr-label" for="select_74">Statut * + <!----> + </label><select class="fr-select" id="select_74" aria-label="Statut" name="select_74"> + <option value="Favorable">Favorable</option> + <option value="Défavorable">Défavorable</option> + <option value="Favorable avec réserves">Favorable avec réserves</option> + <option value="Non renseigné">Non renseigné</option> + <option disabled="" hidden="" value="">Selectionnez une option</option> + </select></div> + </div> + <div class="fr-fieldset__element"> + <fieldset class="fr-fieldset" id="radio_878" aria-labelledby="radio_878-legend" style="flex-direction: column; align-items: flex-start;"> + <legend class="fr-fieldset__legend--regular fr-fieldset__legend" id="radio_878-legend">Visibilité * + <!----> + </legend> + <div class="fr-fieldset__element"> + <div class="fr-radio-group"><input type="radio" id="radio_878-0" name="radio_878"><label class="fr-label" for="radio_878-0">Public + <!----> + </label></div> + </div> + <div class="fr-fieldset__element"> + <div class="fr-radio-group"><input type="radio" id="radio_878-1" name="radio_878"><label class="fr-label" for="radio_878-1">Visible par les administrations et les entreprises titulaires + <!----> + </label></div> + </div> + <div class="fr-fieldset__element"> + <div class="fr-radio-group"><input type="radio" id="radio_878-2" name="radio_878"><label class="fr-label" for="radio_878-2">Visible par les administrations + <!----> + </label></div> + </div> + </fieldset> + </div> + <div class="fr-fieldset__element"> + <div class="fr-input-group"><label class="fr-label" for="textarea_967">Description + <!----> + <!----> + </label><textarea class="fr-input" name="textarea_967" id="textarea_967"></textarea></div> + </div> + </fieldset> + </form> + <!----> + </div> + </div> + <div class="fr-modal__footer"> + <div style="display: flex; width: 100%; justify-content: end; align-items: center; gap: 1rem;"> + <!----> + <ul class="fr-btns-group fr-btns-group--right fr-btns-group--inline-reverse fr-btns-group--inline-lg fr-btns-group--icon-left" style="width: auto;"> + <li><button class="fr-btn fr-icon-check-line fr-btn--icon-left disabled" disabled="">Enregistrer</button></li> + <li><button class="fr-btn fr-icon-arrow-go-back-fill fr-btn--icon-left fr-btn--secondary" aria-controls="monId">Annuler</button></li> + </ul> + </div> + </div> + </div> + </div> + </div> + </div> + </dialog> +</div> +<!--teleport end--> \ No newline at end of file diff --git a/packages/ui/src/components/etape/add-etape-avis-popup.tsx b/packages/ui/src/components/etape/add-etape-avis-popup.tsx new file mode 100644 index 000000000..5d7e0e144 --- /dev/null +++ b/packages/ui/src/components/etape/add-etape-avis-popup.tsx @@ -0,0 +1,141 @@ +import { computed, defineComponent, ref } from 'vue' +import { FunctionalPopup } from '../_ui/functional-popup' +import { AVIS_VISIBILITY_IDS, AvisStatutIds, AvisTypeId, AvisTypes, AvisVisibilityId, AvisVisibilityIds } from 'camino-common/src/static/avisTypes' +import { InputFile } from '../_ui/dsfr-input-file' +import { ApiClient } from '@/api/api-client' +import { TempDocumentName } from 'camino-common/src/document' +import { NonEmptyArray, Nullable, isNotNullNorUndefined, map } from 'camino-common/src/typescript-tools' +import { DsfrInput } from '../_ui/dsfr-input' +import { EtapeAvisModification, TempEtapeAvis, etapeAvisModificationValidator, tempEtapeAvisValidator } from 'camino-common/src/etape' +import { useState } from '../../utils/vue-tsx-utils' +import { DsfrSelect } from '../_ui/dsfr-select' +import { TypeaheadSmartSingle } from '../_ui/typeahead-smart-single' +import { DsfrInputRadio } from '../_ui/dsfr-input-radio' +import { User, isEntrepriseOrBureauDEtude } from 'camino-common/src/roles' +import { getAvisVisibilityLabel } from './etape-avis' +import { DsfrTextarea } from '../_ui/dsfr-textarea' + +interface Props { + close: (document: EtapeAvisModification | null) => void + avisTypeIds: NonEmptyArray<AvisTypeId> + initialAvis: EtapeAvisModification | null + apiClient: Pick<ApiClient, 'uploadTempDocument'> + user: User +} + +export const AddEtapeAvisPopup = defineComponent<Props>(props => { + const etapeAvisTypeId = ref<AvisTypeId | null>(props.avisTypeIds.length === 1 ? props.avisTypeIds[0] : null) + const etapeAvisFile = ref<File | null>(null) + const avisDescription = ref<string>(props.initialAvis?.description ?? '') + const [avisDate, setAvisDate] = useState(props.initialAvis?.date ?? null) + const [avisStatutId, setAvisStatutId] = useState(props.initialAvis?.avis_statut_id ?? null) + const [avisVisibilityId, setAvisVisibilityId] = useState(props.initialAvis?.avis_visibility_id ?? null) + + const tempAvisName = ref<TempDocumentName | undefined>(isNotNullNorUndefined(props.initialAvis) && 'temp_document_name' in props.initialAvis ? props.initialAvis.temp_document_name : undefined) + + const visibilityChoices = computed<{ itemId: AvisVisibilityId; legend: { main: string } }[]>(() => { + return AVIS_VISIBILITY_IDS.filter(visibility => { + if (isEntrepriseOrBureauDEtude(props.user) && visibility === AvisVisibilityIds.Administrations) { + return false + } + + return true + }).map(visibility => ({ itemId: visibility, legend: { main: getAvisVisibilityLabel(visibility) } })) + }) + const descriptionChange = (value: string) => { + avisDescription.value = value + } + + const updateAvisTypeId = (avisTypeId: AvisTypeId | null) => { + etapeAvisTypeId.value = avisTypeId + } + + const visibilityChange = (value: AvisVisibilityId) => { + setAvisVisibilityId(value) + } + const content = () => ( + <form> + {props.avisTypeIds.length === 1 ? null : ( + <fieldset class="fr-fieldset" id="text"> + <div class="fr-fieldset__element"> + <div class="fr-select-group"> + <label class="fr-label" for="type"> + Type d'avis + </label> + <TypeaheadSmartSingle initialValue={props.initialAvis?.avis_type_id} possibleValues={props.avisTypeIds.map(id => AvisTypes[id])} valueIdSelected={updateAvisTypeId} /> + </div> + </div> + </fieldset> + )} + + <fieldset class="fr-fieldset" id="text"> + <div class="fr-fieldset__element"> + <InputFile + accept={['pdf']} + uploadFile={file => { + etapeAvisFile.value = file + }} + /> + </div> + + <div class="fr-fieldset__element"> + <DsfrInput legend={{ main: 'Date' }} required={true} type={{ type: 'date' }} initialValue={avisDate.value} valueChanged={setAvisDate} /> + </div> + + <div class="fr-fieldset__element"> + <DsfrSelect legend={{ main: 'Statut' }} required={true} items={map(AvisStatutIds, avis => ({ id: avis, label: avis }))} initialValue={avisStatutId.value} valueChanged={setAvisStatutId} /> + </div> + + <div class="fr-fieldset__element"> + <DsfrInputRadio legend={{ main: 'Visibilité' }} required={true} elements={visibilityChoices.value} initialValue={avisVisibilityId.value} valueChanged={visibilityChange} /> + </div> + <div class="fr-fieldset__element"> + <DsfrTextarea legend={{ main: 'Description' }} initialValue={avisDescription.value} valueChanged={descriptionChange} /> + </div> + </fieldset> + </form> + ) + + const tempAvis = computed<Nullable<Omit<TempEtapeAvis, 'temp_document_name'>>>(() => ({ + avis_type_id: etapeAvisTypeId.value, + description: avisDescription.value, + date: avisDate.value, + avis_statut_id: avisStatutId.value, + avis_visibility_id: avisVisibilityId.value, + has_file: false, + })) + + const canSave = computed<boolean>(() => { + return tempEtapeAvisValidator.omit({ temp_document_name: true }).safeParse(tempAvis.value).success + }) + + return () => ( + <FunctionalPopup + title={props.avisTypeIds.length === 1 ? `${isNotNullNorUndefined(props.initialAvis) ? 'Éditer' : 'Ajouter'} ${AvisTypes[props.avisTypeIds[0]].nom}` : "Ajout d'un document"} + content={content} + close={() => { + props.close(null) + }} + validate={{ + action: async () => { + if (etapeAvisFile.value !== null) { + tempAvisName.value = await props.apiClient.uploadTempDocument(etapeAvisFile.value) + } + const value = { ...props.initialAvis, ...tempAvis.value, temp_document_name: tempAvisName.value } + + const parsed = etapeAvisModificationValidator.safeParse(value) + + if (parsed.success) { + props.close(parsed.data) + } else { + console.error(parsed.error) + } + }, + }} + canValidate={canSave.value} + /> + ) +}) + +// @ts-ignore waiting for https://github.com/vuejs/core/issues/7833 +AddEtapeAvisPopup.props = ['close', 'apiClient', 'avisTypeIds', 'initialAvis', 'user'] diff --git a/packages/ui/src/components/etape/add-etape-document-popup.tsx b/packages/ui/src/components/etape/add-etape-document-popup.tsx index b4de69433..1f72152fa 100644 --- a/packages/ui/src/components/etape/add-etape-document-popup.tsx +++ b/packages/ui/src/components/etape/add-etape-document-popup.tsx @@ -10,7 +10,7 @@ import { EtapeDocumentModification, TempEtapeDocument, etapeDocumentModification import { DsfrInputRadio } from '../_ui/dsfr-input-radio' import { VisibilityLabel } from './etape-documents' import { isEntrepriseOrBureauDEtude, User } from 'camino-common/src/roles' -import { DocumentTypeTypeahead } from '../_common/document-type-typeahead' +import { TypeaheadSmartSingle } from '../_ui/typeahead-smart-single' interface Props { close: (document: EtapeDocumentModification | null) => void @@ -58,6 +58,7 @@ export const AddEtapeDocumentPopup = defineComponent<Props>(props => { const updateDocumentTypeId = (documentTypeId: DocumentTypeId | null) => { etapeDocumentTypeId.value = documentTypeId } + const content = () => ( <form> {props.documentTypeIds.length === 1 ? null : ( @@ -67,7 +68,7 @@ export const AddEtapeDocumentPopup = defineComponent<Props>(props => { <label class="fr-label" for="type"> Type de document </label> - <DocumentTypeTypeahead documentTypeIds={props.documentTypeIds} documentTypeIdSelected={updateDocumentTypeId} /> + <TypeaheadSmartSingle possibleValues={props.documentTypeIds.map(id => DocumentsTypes[id])} valueIdSelected={updateDocumentTypeId} /> </div> </div> </fieldset> diff --git a/packages/ui/src/components/etape/autocomplete-entreprise-single.tsx b/packages/ui/src/components/etape/autocomplete-entreprise-single.tsx index 70a5f5eb8..daa41c9b8 100644 --- a/packages/ui/src/components/etape/autocomplete-entreprise-single.tsx +++ b/packages/ui/src/components/etape/autocomplete-entreprise-single.tsx @@ -6,7 +6,7 @@ import { TypeAheadSingle } from '../_ui/typeahead-single' interface Props { initialValue?: DeepReadonly<EntrepriseId | null> - items: DeepReadonly<Entreprise[]> + items: DeepReadonly<Entreprise>[] onUpdate: (entreprise: DeepReadonly<EntrepriseId | null>) => void id?: string } @@ -35,7 +35,7 @@ export const AutocompleteEntrepriseSingle = defineComponent<Props>(props => { setCurrentEntrepriseId(entreprise?.id ?? null) } - const filteredItems = computed<Readonly<Entreprise[]>>(() => { + const filteredItems = computed<DeepReadonly<Entreprise>[]>(() => { if (currentSearch.value.length === 0) { return props.items } diff --git a/packages/ui/src/components/etape/date-type-edit.tsx b/packages/ui/src/components/etape/date-type-edit.tsx index 7b2ac0d84..8daa8ea3d 100644 --- a/packages/ui/src/components/etape/date-type-edit.tsx +++ b/packages/ui/src/components/etape/date-type-edit.tsx @@ -9,7 +9,6 @@ import { DemarcheId } from 'camino-common/src/demarche' import { ApiClient } from '../../api/api-client' import { EtapeStatutId } from 'camino-common/src/static/etapesStatuts' import { DsfrInput } from '../_ui/dsfr-input' -import { User, isAdministrationAdmin, isAdministrationEditeur, isSuper } from 'camino-common/src/roles' export type EtapeDateTypeEdit = DeepReadonly<{ statutId: EtapeStatutId | null @@ -25,17 +24,6 @@ export interface Props { completeUpdate: (etape: Props['etape']) => void } -export const dateTypeStepIsVisible = (user: User): boolean => { - return isSuper(user) || isAdministrationAdmin(user) || isAdministrationEditeur(user) -} -export const dateTypeStepIsComplete = (etape: EtapeDateTypeEdit, user: User): boolean => { - if (!dateTypeStepIsVisible(user)) { - return true - } - - return isNotNullNorUndefined(etape.date) && isNotNullNorUndefined(etape.typeId) && isNotNullNorUndefined(etape.statutId) -} - export const DateTypeEdit = defineComponent<Props>(props => { const [date, setDate] = useState(props.etape.date) const [typeStatut, setTypeStatut] = useState({ etapeTypeId: props.etape.typeId, etapeStatutId: props.etape.statutId }) diff --git a/packages/ui/src/components/etape/etape-api-client.ts b/packages/ui/src/components/etape/etape-api-client.ts index 7b9b0b9e4..0e0340a9e 100644 --- a/packages/ui/src/components/etape/etape-api-client.ts +++ b/packages/ui/src/components/etape/etape-api-client.ts @@ -1,28 +1,17 @@ import { apiGraphQLFetch } from '@/api/_client' -import { deleteWithJson, getWithJson, putWithJson } from '@/api/client-rest' +import { deleteWithJson, getWithJson, postWithJson, putWithJson } from '@/api/client-rest' import { CaminoDate, caminoDateValidator } from 'camino-common/src/date' import { DemarcheId } from 'camino-common/src/demarche' import { entrepriseIdValidator } from 'camino-common/src/entreprise' -import { EtapeId, EtapeIdOrSlug, EtapeTypeEtapeStatutWithMainStep, GetEtapeDocumentsByEtapeId } from 'camino-common/src/etape' -import { - FlattenEtape, - GraphqlEtapeCreation, - GraphqlEtapeModification, - flattenEtapeValidator, - graphqlEtapeCreationValidator, - graphqlEtapeModificationValidator, - graphqlEtapeValidator, -} from 'camino-common/src/etape-form' +import { EtapeId, EtapeIdOrSlug, EtapeTypeEtapeStatutWithMainStep, GetEtapeAvisByEtapeId, GetEtapeDocumentsByEtapeId } from 'camino-common/src/etape' +import { FlattenEtape, RestEtapeCreation, RestEtapeModification, restEtapeCreationValidator, restEtapeModificationValidator } from 'camino-common/src/etape-form' import { km2Validator } from 'camino-common/src/number' import { featureCollectionForagesValidator, featureCollectionPointsValidator, featureMultiPolygonValidator } from 'camino-common/src/perimetre' -import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes' import { etapeTypeIdValidator } from 'camino-common/src/static/etapesTypes' import { geoSystemeIdValidator } from 'camino-common/src/static/geoSystemes' import { substanceLegaleIdValidator } from 'camino-common/src/static/substancesLegales' -import { TitreTypeId } from 'camino-common/src/static/titresTypes' -import { getSections } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections' import { GetDemarcheByIdOrSlugValidator } from 'camino-common/src/titres' -import { DeepReadonly, Nullable, isNotNullNorUndefined } from 'camino-common/src/typescript-tools' +import { DeepReadonly, Nullable } from 'camino-common/src/typescript-tools' import { nullToDefault } from 'camino-common/src/zod-tools' import gql from 'graphql-tag' import { DistributiveOmit } from 'maplibre-gl' @@ -86,6 +75,7 @@ const heritageValidator = z.object({ heritageProps: heritagePropsValidator, heritageContenu: heritageContenuValidator, }) +export type GetEtapeHeritagePotentiel = z.infer<typeof heritageValidator> export type CoreEtapeCreationOrModification = Pick<Nullable<FlattenEtape>, 'id' | 'slug'> & DistributiveOmit<FlattenEtape, 'id' | 'slug'> export interface EtapeApiClient { @@ -93,285 +83,32 @@ export interface EtapeApiClient { deleteEtape: (titreEtapeId: EtapeId) => Promise<void> deposeEtape: (titreEtapeId: EtapeId) => Promise<void> getEtapeDocumentsByEtapeId: (etapeId: EtapeId) => Promise<GetEtapeDocumentsByEtapeId> - getEtapeHeritagePotentiel: ( - etape: DeepReadonly<CoreEtapeCreationOrModification>, - titreDemarcheId: DemarcheId, - titreTypeId: TitreTypeId, - demarcheTypeId: DemarcheTypeId - ) => Promise<DeepReadonly<CoreEtapeCreationOrModification>> + getEtapeHeritagePotentiel: (etape: DeepReadonly<Pick<CoreEtapeCreationOrModification, 'id' | 'date' | 'typeId'>>, titreDemarcheId: DemarcheId) => Promise<DeepReadonly<GetEtapeHeritagePotentiel>> + getEtapeAvisByEtapeId: (etapeId: EtapeId) => Promise<GetEtapeAvisByEtapeId> getEtape: (etapeIdOrSlug: EtapeIdOrSlug) => Promise<DeepReadonly<{ etape: FlattenEtape; demarche: GetDemarcheByIdOrSlugValidator }>> - etapeCreer: (etape: DeepReadonly<GraphqlEtapeCreation>) => Promise<EtapeId> - etapeModifier: (etape: DeepReadonly<GraphqlEtapeModification>) => Promise<EtapeId> + etapeCreer: (etape: DeepReadonly<RestEtapeCreation>) => Promise<EtapeId> + etapeModifier: (etape: DeepReadonly<RestEtapeModification>) => Promise<EtapeId> } export const etapeApiClient: EtapeApiClient = { getEtapesTypesEtapesStatuts: async (demarcheId, etapeId, date) => getWithJson('/rest/etapesTypes/:demarcheId/:date', { demarcheId, date }, etapeId ? { etapeId } : {}), - deleteEtape: async etapeId => { - await deleteWithJson('/rest/etapes/:etapeId', { etapeId }) + deleteEtape: async etapeIdOrSlug => { + await deleteWithJson('/rest/etapes/:etapeIdOrSlug', { etapeIdOrSlug }) }, deposeEtape: async etapeId => { await putWithJson('/rest/etapes/:etapeId/depot', { etapeId }, undefined) }, getEtapeDocumentsByEtapeId: async etapeId => getWithJson('/rest/etapes/:etapeId/etapeDocuments', { etapeId }), + getEtapeAvisByEtapeId: async etapeId => getWithJson('/rest/etapes/:etapeId/etapeAvis', { etapeId }), getEtape: async etapeIdOrSlug => { - const data = await apiGraphQLFetch(gql` - query Etape($id: ID!) { - etape(id: $id) { - id - slug - titreDemarcheId - demarche { - description - slug - typeId - titre { - id - slug - nom - typeId - } - } - date - dateDebut - dateFin - duree - surface - typeId - statutId - isBrouillon - titulaireIds - amodiataireIds - geojson4326Perimetre - geojson4326Points - geojsonOriginePoints - geojsonOriginePerimetre - geojsonOrigineGeoSystemeId - geojson4326Forages - geojsonOrigineForages - substances - contenu - notes - - heritageProps { - dateDebut { - etape { - date - typeId - dateDebut - } - actif - } - dateFin { - etape { - date - typeId - dateFin - } - actif - } - duree { - etape { - date - typeId - duree - } - actif - } - perimetre { - etape { - date - typeId - geojson4326Perimetre - geojson4326Points - geojsonOriginePoints - geojsonOriginePerimetre - geojsonOrigineGeoSystemeId - geojson4326Forages - geojsonOrigineForages - surface - } - actif - } - substances { - etape { - date - typeId - substances - } - actif - } - titulaires { - etape { - date - typeId - titulaireIds - } - actif - } - amodiataires { - etape { - date - typeId - amodiataireIds - } - actif - } - } - - heritageContenu - } - } - `)({ id: etapeIdOrSlug }) - // TODO 2024-06-02 ce code est à remonter dans l'api - const result = graphqlEtapeValidator.safeParse(data) - if (result.success) { - const graphqlEtape = result.data - - const sections = getSections(graphqlEtape.demarche.titre.typeId, graphqlEtape.demarche.typeId, graphqlEtape.typeId) - - const flattenEtape: FlattenEtape = { - ...graphqlEtape, - duree: { - value: graphqlEtape.heritageProps.duree.actif ? graphqlEtape.heritageProps.duree.etape?.duree ?? null : graphqlEtape.duree, - heritee: graphqlEtape.heritageProps.duree.actif, - etapeHeritee: isNotNullNorUndefined(graphqlEtape.heritageProps.duree.etape) - ? { - etapeTypeId: graphqlEtape.heritageProps.duree.etape.typeId, - date: graphqlEtape.heritageProps.duree.etape.date, - value: graphqlEtape.heritageProps.duree.etape.duree, - } - : null, - }, - perimetre: { - value: graphqlEtape.heritageProps.perimetre.actif - ? isNotNullNorUndefined(graphqlEtape.heritageProps.perimetre.etape) - ? { ...graphqlEtape.heritageProps.perimetre.etape } - : null - : { ...graphqlEtape }, - - heritee: graphqlEtape.heritageProps.perimetre.actif, - etapeHeritee: isNotNullNorUndefined(graphqlEtape.heritageProps.perimetre.etape) - ? { - etapeTypeId: graphqlEtape.heritageProps.perimetre.etape.typeId, - date: graphqlEtape.heritageProps.perimetre.etape.date, - value: { ...graphqlEtape.heritageProps.perimetre.etape }, - } - : null, - }, - dateDebut: { - value: graphqlEtape.heritageProps.dateDebut.actif ? graphqlEtape.heritageProps.dateDebut.etape?.dateDebut ?? null : graphqlEtape.dateDebut, - heritee: graphqlEtape.heritageProps.dateDebut.actif, - etapeHeritee: isNotNullNorUndefined(graphqlEtape.heritageProps.dateDebut.etape) - ? { - etapeTypeId: graphqlEtape.heritageProps.dateDebut.etape.typeId, - date: graphqlEtape.heritageProps.dateDebut.etape.date, - value: graphqlEtape.heritageProps.dateDebut.etape.dateDebut, - } - : null, - }, - dateFin: { - value: graphqlEtape.heritageProps.dateFin.actif ? graphqlEtape.heritageProps.dateFin.etape?.dateFin ?? null : graphqlEtape.dateFin, - heritee: graphqlEtape.heritageProps.dateFin.actif, - etapeHeritee: isNotNullNorUndefined(graphqlEtape.heritageProps.dateFin.etape) - ? { - etapeTypeId: graphqlEtape.heritageProps.dateFin.etape.typeId, - date: graphqlEtape.heritageProps.dateFin.etape.date, - value: graphqlEtape.heritageProps.dateFin.etape.dateFin, - } - : null, - }, - substances: { - value: graphqlEtape.heritageProps.substances.actif - ? isNotNullNorUndefined(graphqlEtape.heritageProps.substances.etape) - ? graphqlEtape.heritageProps.substances.etape.substances - : [] - : graphqlEtape.substances, - - heritee: graphqlEtape.heritageProps.substances.actif, - etapeHeritee: isNotNullNorUndefined(graphqlEtape.heritageProps.substances.etape) - ? { - etapeTypeId: graphqlEtape.heritageProps.substances.etape.typeId, - date: graphqlEtape.heritageProps.substances.etape.date, - value: graphqlEtape.heritageProps.substances.etape.substances, - } - : null, - }, - amodiataires: { - value: graphqlEtape.heritageProps.amodiataires.actif - ? isNotNullNorUndefined(graphqlEtape.heritageProps.amodiataires.etape) - ? graphqlEtape.heritageProps.amodiataires.etape.amodiataireIds - : [] - : graphqlEtape.amodiataireIds, - - heritee: graphqlEtape.heritageProps.amodiataires.actif, - etapeHeritee: isNotNullNorUndefined(graphqlEtape.heritageProps.amodiataires.etape) - ? { - etapeTypeId: graphqlEtape.heritageProps.amodiataires.etape.typeId, - date: graphqlEtape.heritageProps.amodiataires.etape.date, - value: graphqlEtape.heritageProps.amodiataires.etape.amodiataireIds, - } - : null, - }, - titulaires: { - value: graphqlEtape.heritageProps.titulaires.actif - ? isNotNullNorUndefined(graphqlEtape.heritageProps.titulaires.etape) - ? graphqlEtape.heritageProps.titulaires.etape.titulaireIds - : [] - : graphqlEtape.titulaireIds, - - heritee: graphqlEtape.heritageProps.titulaires.actif, - etapeHeritee: isNotNullNorUndefined(graphqlEtape.heritageProps.titulaires.etape) - ? { - etapeTypeId: graphqlEtape.heritageProps.titulaires.etape.typeId, - date: graphqlEtape.heritageProps.titulaires.etape.date, - value: graphqlEtape.heritageProps.titulaires.etape.titulaireIds, - } - : null, - }, - - contenu: sections.reduce<FlattenEtape['contenu']>((accSection, section) => { - accSection[section.id] = section.elements.reduce<FlattenEtape['contenu'][string]>((accElement, element) => { - const elementHeritage = graphqlEtape.heritageContenu[section.id]?.[element.id] ?? { actif: false, etape: null } - accElement[element.id] = { - value: elementHeritage.actif ? elementHeritage.etape?.contenu[section.id]?.[element.id] ?? null : graphqlEtape.contenu[section.id]?.[element.id] ?? null, - heritee: elementHeritage.actif, - etapeHeritee: isNotNullNorUndefined(elementHeritage.etape) - ? { - etapeTypeId: elementHeritage.etape.typeId, - date: elementHeritage.etape.date, - value: elementHeritage.etape.contenu[section.id]?.[element.id] ?? null, - } - : null, - } - - return accElement - }, {}) - - return accSection - }, {}), - } - - const demarche: GetDemarcheByIdOrSlugValidator = { - demarche_description: graphqlEtape.demarche.description, - demarche_id: graphqlEtape.titreDemarcheId, - demarche_slug: graphqlEtape.demarche.slug, - demarche_type_id: graphqlEtape.demarche.typeId, - titre_id: graphqlEtape.demarche.titre.id, - titre_nom: graphqlEtape.demarche.titre.nom, - titre_slug: graphqlEtape.demarche.titre.slug, - titre_type_id: graphqlEtape.demarche.titre.typeId, - } - - // On flatten ici pour enlever les champs supplémentaires qu'il y'a par exemple dans perimetre - return { etape: flattenEtapeValidator.parse(flattenEtape), demarche } - } - console.warn(result.error.message) - throw result.error + const etape = await getWithJson('/rest/etapes/:etapeIdOrSlug', { etapeIdOrSlug }) + const demarche = await getWithJson('/rest/demarches/:demarcheIdOrSlug', { demarcheIdOrSlug: etape.titreDemarcheId }) + return { etape, demarche } }, - getEtapeHeritagePotentiel: async (etape, titreDemarcheId, titreTypeId, demarcheTypeId) => { + getEtapeHeritagePotentiel: async (etape, titreDemarcheId) => { const data = await apiGraphQLFetch(gql` query EtapeHeritage($titreDemarcheId: ID!, $date: String!, $typeId: ID!, $etapeId: ID) { etapeHeritage(titreDemarcheId: $titreDemarcheId, date: $date, typeId: $typeId, etapeId: $etapeId) { @@ -453,144 +190,16 @@ export const etapeApiClient: EtapeApiClient = { // TODO 2024-06-02 on a du code métier dans notre api, on fusionne étape avec l'héritage const heritageData: DeepReadonly<z.infer<typeof heritageValidator>> = heritageValidator.parse(data) - const sections = getSections(titreTypeId, demarcheTypeId, etape.typeId) - const flattenEtape: DeepReadonly<CoreEtapeCreationOrModification> = { - ...etape, - contenu: sections.reduce<DeepReadonly<FlattenEtape['contenu']>>((accSection, section) => { - const newSection = section.elements.reduce<DeepReadonly<FlattenEtape['contenu'][string]>>((accElement, element) => { - const elementHeritage = heritageData.heritageContenu[section.id]?.[element.id] ?? { actif: false, etape: null } - const currentHeritage: DeepReadonly<FlattenEtape['contenu'][string][string]> = etape.contenu[section.id]?.[element.id] ?? { value: null, heritee: true, etapeHeritee: null } - return { - ...accElement, - [element.id]: { - value: currentHeritage.heritee ? elementHeritage.etape?.contenu?.[section.id]?.[element.id] ?? null : currentHeritage.value, - heritee: currentHeritage.heritee && isNotNullNorUndefined(elementHeritage.etape), - etapeHeritee: isNotNullNorUndefined(elementHeritage.etape) - ? { - etapeTypeId: elementHeritage.etape.typeId, - date: elementHeritage.etape.date, - value: elementHeritage.etape.contenu[section.id]?.[element.id] ?? null, - } - : null, - }, - } - }, {}) - - return { - ...accSection, - [section.id]: newSection, - } - }, {}), - duree: { - value: etape.duree.heritee ? heritageData.heritageProps.duree.etape?.duree ?? null : etape.duree.value, - heritee: etape.duree.heritee && isNotNullNorUndefined(heritageData.heritageProps.duree.etape), - etapeHeritee: isNotNullNorUndefined(heritageData.heritageProps.duree.etape) - ? { - etapeTypeId: heritageData.heritageProps.duree.etape.typeId, - date: heritageData.heritageProps.duree.etape.date, - value: heritageData.heritageProps.duree.etape.duree, - } - : null, - }, - perimetre: { - value: etape.perimetre.heritee ? (isNotNullNorUndefined(heritageData.heritageProps.perimetre.etape) ? { ...heritageData.heritageProps.perimetre.etape } : null) : etape.perimetre.value, - - heritee: etape.perimetre.heritee && isNotNullNorUndefined(heritageData.heritageProps.perimetre.etape), - etapeHeritee: isNotNullNorUndefined(heritageData.heritageProps.perimetre.etape) - ? { - etapeTypeId: heritageData.heritageProps.perimetre.etape.typeId, - date: heritageData.heritageProps.perimetre.etape.date, - value: { ...heritageData.heritageProps.perimetre.etape }, - } - : null, - }, - dateDebut: { - value: etape.dateDebut.heritee ? heritageData.heritageProps.dateDebut.etape?.dateDebut ?? null : etape.dateDebut.value, - heritee: etape.dateDebut.heritee && isNotNullNorUndefined(heritageData.heritageProps.dateDebut.etape), - etapeHeritee: isNotNullNorUndefined(heritageData.heritageProps.dateDebut.etape) - ? { - etapeTypeId: heritageData.heritageProps.dateDebut.etape.typeId, - date: heritageData.heritageProps.dateDebut.etape.date, - value: heritageData.heritageProps.dateDebut.etape.dateDebut, - } - : null, - }, - dateFin: { - value: etape.dateFin.heritee ? heritageData.heritageProps.dateFin.etape?.dateFin ?? null : etape.dateFin.value, - heritee: etape.dateFin.heritee && isNotNullNorUndefined(heritageData.heritageProps.dateFin.etape), - etapeHeritee: isNotNullNorUndefined(heritageData.heritageProps.dateFin.etape) - ? { - etapeTypeId: heritageData.heritageProps.dateFin.etape.typeId, - date: heritageData.heritageProps.dateFin.etape.date, - value: heritageData.heritageProps.dateFin.etape.dateFin, - } - : null, - }, - substances: { - value: etape.substances.heritee ? (isNotNullNorUndefined(heritageData.heritageProps.substances.etape) ? heritageData.heritageProps.substances.etape.substances : []) : etape.substances.value, - - heritee: etape.substances.heritee && isNotNullNorUndefined(heritageData.heritageProps.substances.etape), - etapeHeritee: isNotNullNorUndefined(heritageData.heritageProps.substances.etape) - ? { - etapeTypeId: heritageData.heritageProps.substances.etape.typeId, - date: heritageData.heritageProps.substances.etape.date, - value: heritageData.heritageProps.substances.etape.substances, - } - : null, - }, - amodiataires: { - value: etape.amodiataires.heritee - ? isNotNullNorUndefined(heritageData.heritageProps.amodiataires.etape) - ? heritageData.heritageProps.amodiataires.etape.amodiataireIds - : [] - : etape.amodiataires.value, - - heritee: etape.amodiataires.heritee && isNotNullNorUndefined(heritageData.heritageProps.amodiataires.etape), - etapeHeritee: isNotNullNorUndefined(heritageData.heritageProps.amodiataires.etape) - ? { - etapeTypeId: heritageData.heritageProps.amodiataires.etape.typeId, - date: heritageData.heritageProps.amodiataires.etape.date, - value: heritageData.heritageProps.amodiataires.etape.amodiataireIds, - } - : null, - }, - titulaires: { - value: etape.titulaires.heritee ? (isNotNullNorUndefined(heritageData.heritageProps.titulaires.etape) ? heritageData.heritageProps.titulaires.etape.titulaireIds : []) : etape.titulaires.value, - - heritee: etape.titulaires.heritee && isNotNullNorUndefined(heritageData.heritageProps.titulaires.etape), - etapeHeritee: isNotNullNorUndefined(heritageData.heritageProps.titulaires.etape) - ? { - etapeTypeId: heritageData.heritageProps.titulaires.etape.typeId, - date: heritageData.heritageProps.titulaires.etape.date, - value: heritageData.heritageProps.titulaires.etape.titulaireIds, - } - : null, - }, - } - return flattenEtape + return heritageData }, etapeCreer: async etape => { - const result = await apiGraphQLFetch(gql` - mutation EtapeCreer($etape: InputEtapeCreation!) { - etapeCreer(etape: $etape) { - id - } - } - `)({ etape: graphqlEtapeCreationValidator.parse(etape) }) - - return result.id + return postWithJson('/rest/etapes', {}, restEtapeCreationValidator.parse(etape)) }, etapeModifier: async etape => { - const result = await apiGraphQLFetch(gql` - mutation EtapeModifier($etape: InputEtapeModification!) { - etapeModifier(etape: $etape) { - id - } - } - `)({ etape: graphqlEtapeModificationValidator.parse(etape) }) + await putWithJson('/rest/etapes', {}, restEtapeModificationValidator.parse(etape)) - return result.id + return etape.id }, } diff --git a/packages/ui/src/components/etape/etape-avis-edit.stories.tsx b/packages/ui/src/components/etape/etape-avis-edit.stories.tsx new file mode 100644 index 000000000..18992f457 --- /dev/null +++ b/packages/ui/src/components/etape/etape-avis-edit.stories.tsx @@ -0,0 +1,104 @@ +import { Meta, StoryFn } from '@storybook/vue3' +import { EtapeAvisEdit } from './etape-avis-edit' +import { EtapeAvis, etapeAvisIdValidator, etapeIdValidator } from 'camino-common/src/etape' +import { ApiClient } from '../../api/api-client' +import { action } from '@storybook/addon-actions' +import { tempDocumentNameValidator } from 'camino-common/src/document' +import { caminoDateValidator } from 'camino-common/src/date' +import { AvisVisibilityIds } from 'camino-common/src/static/avisTypes' +import { testBlankUser } from 'camino-common/src/tests-utils' +import { communeIdValidator } from 'camino-common/src/static/communes' + +const meta: Meta = { + title: 'Components/Etape/EtapeAvisEdit', + // @ts-ignore + component: EtapeAvisEdit, + decorators: [() => ({ template: '<div class="dsfr"><story/></div>' })], +} +export default meta + +const avis: EtapeAvis[] = [ + { + id: etapeAvisIdValidator.parse('id'), + avis_type_id: 'confirmationAccordProprietaireDuSol', + description: 'Une description', + date: caminoDateValidator.parse('2023-02-01'), + avis_statut_id: 'Favorable', + has_file: false, + avis_visibility_id: AvisVisibilityIds.Administrations, + }, + { + id: etapeAvisIdValidator.parse('id-car'), + avis_type_id: 'lettreDeSaisineDesServices', + description: 'Une description', + date: caminoDateValidator.parse('2023-02-01'), + avis_statut_id: 'Non renseigné', + has_file: false, + avis_visibility_id: AvisVisibilityIds.Public, + }, +] + +const uploadTempDocumentAction = action('uploadTempDocument') +const getEtapeAvisByEtapeIdAction = action('getEtapeAvisByEtapeId') + +const apiClient: Pick<ApiClient, 'uploadTempDocument' | 'getEtapeAvisByEtapeId'> = { + getEtapeAvisByEtapeId: etapeId => { + getEtapeAvisByEtapeIdAction(etapeId) + + return Promise.resolve(avis) + }, + uploadTempDocument: document => { + uploadTempDocumentAction(document) + + return Promise.resolve(tempDocumentNameValidator.parse(new Date().toISOString())) + }, +} + +const completeUpdateAction = action('completeUpdate') + +export const Empty: StoryFn = () => ( + <EtapeAvisEdit + apiClient={{ ...apiClient, getEtapeAvisByEtapeId: () => Promise.resolve([]) }} + etapeId={etapeIdValidator.parse('etapeId')} + communeIds={[]} + tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mfr' }} + onChange={completeUpdateAction} + user={{ ...testBlankUser, role: 'super' }} + /> +) +export const Rempli: StoryFn = () => ( + <EtapeAvisEdit + apiClient={apiClient} + etapeId={etapeIdValidator.parse('etapeId')} + communeIds={[]} + tde={{ titreTypeId: 'axm', demarcheTypeId: 'oct', etapeTypeId: 'asc' }} + onChange={completeUpdateAction} + user={{ ...testBlankUser, role: 'super' }} + /> +) +export const AvisEnGuyane: StoryFn = () => ( + <EtapeAvisEdit + apiClient={{ + ...apiClient, + getEtapeAvisByEtapeId: async () => { + return Promise.resolve([ + ...avis, + { + id: etapeAvisIdValidator.parse('id-guyane'), + avis_type_id: 'avisDirectionAlimentationAgricultureForet', + description: 'Visible que en Guyane', + date: caminoDateValidator.parse('2023-02-01'), + avis_statut_id: 'Non renseigné', + has_file: false, + avis_visibility_id: AvisVisibilityIds.Public, + }, + ]) + }, + }} + etapeId={etapeIdValidator.parse('etapeId')} + communeIds={[communeIdValidator.parse('97302')]} + tde={{ titreTypeId: 'axm', demarcheTypeId: 'oct', etapeTypeId: 'asc' }} + onChange={completeUpdateAction} + user={{ ...testBlankUser, role: 'super' }} + /> +) diff --git a/packages/ui/src/components/etape/etape-avis-edit.stories_snapshots_AvisEnGuyane.html b/packages/ui/src/components/etape/etape-avis-edit.stories_snapshots_AvisEnGuyane.html new file mode 100644 index 000000000..7b256e254 --- /dev/null +++ b/packages/ui/src/components/etape/etape-avis-edit.stories_snapshots_AvisEnGuyane.html @@ -0,0 +1,97 @@ +<div class="dsfr"> + <div class="fr-table fr-mb-0"> + <table style="display: table;"> + <caption>Avis obligatoires</caption> + <thead> + <tr> + <th scope="col">Nom</th> + <th scope="col">Date</th> + <th scope="col">Description</th> + <th scope="col">Statut</th> + <th scope="col">Visibilité</th> + <th scope="col" style="display: flex; justify-content: end;">Action</th> + </tr> + </thead> + <tbody> + <tr> + <td>Lettre de saisine des services</td> + <td>01-02-2023</td> + <td style="white-space: pre-line;">Une description</td> + <td> + <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-badge--beige-gris-galet" title="Non renseigné" aria-label="Non renseigné">Non renseigné</p> + </td> + <td>Public</td> + <td> + <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier l’avis de Lettre de saisine des services" aria-label="Modifier l’avis de Lettre de saisine des services" type="button"> + <!----> + </button><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer l’avis de Lettre de saisine des services" aria-label="Supprimer l’avis de Lettre de saisine des services" type="button"> + <!----> + </button></div> + </td> + </tr> + <tr> + <td class="fr-label--disabled">Avis de l'Office National des Forêts</td> + <td>-</td> + <td>-</td> + <td>-</td> + <td>-</td> + <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Avis de l'Office National des Forêts" aria-label="Ajouter un document Avis de l'Office National des Forêts" type="button"> + <!----> + </button></td> + </tr> + </tbody> + </table> + </div> + <div style="display: flex; flex-direction: column;" class="fr-mt-3w"> + <div class="fr-table fr-mb-0"> + <table style="display: table;"> + <caption>Avis complémentaires</caption> + <thead> + <tr> + <th scope="col">Nom</th> + <th scope="col">Date</th> + <th scope="col">Description</th> + <th scope="col">Statut</th> + <th scope="col">Visibilité</th> + <th scope="col" style="display: flex; justify-content: end;">Action</th> + </tr> + </thead> + <tbody> + <tr> + <td>Confirmation de l'accord du propriétaire du sol</td> + <td>01-02-2023</td> + <td style="white-space: pre-line;">Une description</td> + <td> + <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-badge--green-bourgeon" title="Favorable" aria-label="Favorable">Favorable</p> + </td> + <td>Visible par les administrations</td> + <td> + <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier l’avis de Confirmation de l'accord du propriétaire du sol" aria-label="Modifier l’avis de Confirmation de l'accord du propriétaire du sol" type="button"> + <!----> + </button><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer l’avis de Confirmation de l'accord du propriétaire du sol" aria-label="Supprimer l’avis de Confirmation de l'accord du propriétaire du sol" type="button"> + <!----> + </button></div> + </td> + </tr> + <tr> + <td>Avis de la Direction de l'Alimentation de l'Agriculture et de la Forêt (DRAF)</td> + <td>01-02-2023</td> + <td style="white-space: pre-line;">Visible que en Guyane</td> + <td> + <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-badge--beige-gris-galet" title="Non renseigné" aria-label="Non renseigné">Non renseigné</p> + </td> + <td>Public</td> + <td> + <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier l’avis de Avis de la Direction de l'Alimentation de l'Agriculture et de la Forêt (DRAF)" aria-label="Modifier l’avis de Avis de la Direction de l'Alimentation de l'Agriculture et de la Forêt (DRAF)" type="button"> + <!----> + </button><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer l’avis de Avis de la Direction de l'Alimentation de l'Agriculture et de la Forêt (DRAF)" aria-label="Supprimer l’avis de Avis de la Direction de l'Alimentation de l'Agriculture et de la Forêt (DRAF)" type="button"> + <!----> + </button></div> + </td> + </tr> + </tbody> + </table> + </div><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-add-line fr-btn--icon-right fr-mt-1w" title="Ajouter un avis complémentaire" aria-label="Ajouter un avis complémentaire" type="button" style="align-self: end;">Ajouter</button> + </div> + <!----> +</div> \ No newline at end of file diff --git a/packages/ui/src/components/etape/etape-avis-edit.stories_snapshots_Empty.html b/packages/ui/src/components/etape/etape-avis-edit.stories_snapshots_Empty.html new file mode 100644 index 000000000..846d5d23a --- /dev/null +++ b/packages/ui/src/components/etape/etape-avis-edit.stories_snapshots_Empty.html @@ -0,0 +1,4 @@ +<div class="dsfr"> + <!----> + <!----> +</div> \ No newline at end of file diff --git a/packages/ui/src/components/etape/etape-avis-edit.stories_snapshots_Rempli.html b/packages/ui/src/components/etape/etape-avis-edit.stories_snapshots_Rempli.html new file mode 100644 index 000000000..0064ba169 --- /dev/null +++ b/packages/ui/src/components/etape/etape-avis-edit.stories_snapshots_Rempli.html @@ -0,0 +1,81 @@ +<div class="dsfr"> + <div class="fr-table fr-mb-0"> + <table style="display: table;"> + <caption>Avis obligatoires</caption> + <thead> + <tr> + <th scope="col">Nom</th> + <th scope="col">Date</th> + <th scope="col">Description</th> + <th scope="col">Statut</th> + <th scope="col">Visibilité</th> + <th scope="col" style="display: flex; justify-content: end;">Action</th> + </tr> + </thead> + <tbody> + <tr> + <td>Lettre de saisine des services</td> + <td>01-02-2023</td> + <td style="white-space: pre-line;">Une description</td> + <td> + <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-badge--beige-gris-galet" title="Non renseigné" aria-label="Non renseigné">Non renseigné</p> + </td> + <td>Public</td> + <td> + <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier l’avis de Lettre de saisine des services" aria-label="Modifier l’avis de Lettre de saisine des services" type="button"> + <!----> + </button><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer l’avis de Lettre de saisine des services" aria-label="Supprimer l’avis de Lettre de saisine des services" type="button"> + <!----> + </button></div> + </td> + </tr> + <tr> + <td class="fr-label--disabled">Avis de l'Office National des Forêts</td> + <td>-</td> + <td>-</td> + <td>-</td> + <td>-</td> + <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Avis de l'Office National des Forêts" aria-label="Ajouter un document Avis de l'Office National des Forêts" type="button"> + <!----> + </button></td> + </tr> + </tbody> + </table> + </div> + <div style="display: flex; flex-direction: column;" class="fr-mt-3w"> + <div class="fr-table fr-mb-0"> + <table style="display: table;"> + <caption>Avis complémentaires</caption> + <thead> + <tr> + <th scope="col">Nom</th> + <th scope="col">Date</th> + <th scope="col">Description</th> + <th scope="col">Statut</th> + <th scope="col">Visibilité</th> + <th scope="col" style="display: flex; justify-content: end;">Action</th> + </tr> + </thead> + <tbody> + <tr> + <td>Confirmation de l'accord du propriétaire du sol</td> + <td>01-02-2023</td> + <td style="white-space: pre-line;">Une description</td> + <td> + <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-badge--green-bourgeon" title="Favorable" aria-label="Favorable">Favorable</p> + </td> + <td>Visible par les administrations</td> + <td> + <div style="display: flex; justify-content: end; align-items: center;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-edit-line" title="Modifier l’avis de Confirmation de l'accord du propriétaire du sol" aria-label="Modifier l’avis de Confirmation de l'accord du propriétaire du sol" type="button"> + <!----> + </button><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-delete-bin-line fr-ml-1w" title="Supprimer l’avis de Confirmation de l'accord du propriétaire du sol" aria-label="Supprimer l’avis de Confirmation de l'accord du propriétaire du sol" type="button"> + <!----> + </button></div> + </td> + </tr> + </tbody> + </table> + </div><button class="fr-btn fr-btn--secondary fr-btn--md fr-icon-add-line fr-btn--icon-right fr-mt-1w" title="Ajouter un avis complémentaire" aria-label="Ajouter un avis complémentaire" type="button" style="align-self: end;">Ajouter</button> + </div> + <!----> +</div> \ No newline at end of file diff --git a/packages/ui/src/components/etape/etape-avis-edit.tsx b/packages/ui/src/components/etape/etape-avis-edit.tsx new file mode 100644 index 000000000..d68a44ff1 --- /dev/null +++ b/packages/ui/src/components/etape/etape-avis-edit.tsx @@ -0,0 +1,251 @@ +import { EtapeAvis, EtapeAvisModification, EtapeId, TempEtapeAvis } from 'camino-common/src/etape' +import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes' +import { EtapeTypeId } from 'camino-common/src/static/etapesTypes' +import { TitreTypeId } from 'camino-common/src/static/titresTypes' +import { ApiClient } from '../../api/api-client' +import { DeepReadonly, FunctionalComponent, computed, defineComponent, onMounted, ref, watch } from 'vue' +import { isNonEmptyArray, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined, NonEmptyArray } from 'camino-common/src/typescript-tools' +import { LoadingElement } from '../_ui/functional-loader' +import { AsyncData } from '../../api/client-rest' +import { DsfrButtonIcon } from '../_ui/dsfr-button' +import { AddEtapeAvisPopup } from './add-etape-avis-popup' +import { getAvisTypes } from 'camino-common/src/permissions/etape-form' +import { dateFormat } from 'camino-common/src/date' +import { AvisStatut } from '../_common/etape-statut' +import { AvisTypeId, AvisTypes } from 'camino-common/src/static/avisTypes' +import { CommuneId } from 'camino-common/src/static/communes' +import { getAvisVisibilityLabel } from './etape-avis' +import { User } from 'camino-common/src/roles' + +interface Props { + tde: { + titreTypeId: TitreTypeId + demarcheTypeId: DemarcheTypeId + etapeTypeId: EtapeTypeId + } + onChange: (etapeAvis: (EtapeAvis | TempEtapeAvis)[]) => void + etapeId: EtapeId | null + communeIds: DeepReadonly<CommuneId[]> + apiClient: Pick<ApiClient, 'uploadTempDocument' | 'getEtapeAvisByEtapeId'> + user: User +} + +type WithIndex = { index: number } + +type EtapeAvisModificationWithIndex = EtapeAvisModification & WithIndex +export const EtapeAvisEdit = defineComponent<Props>(props => { + const etapeAvis = ref<AsyncData<EtapeAvis[]>>({ status: 'LOADING' }) + + onMounted(async () => { + if (isNotNullNorUndefined(props.etapeId)) { + etapeAvis.value = { status: 'LOADING' } + try { + const result = await props.apiClient.getEtapeAvisByEtapeId(props.etapeId) + + etapeAvis.value = { status: 'LOADED', value: result } + } catch (e: any) { + console.error('error', e) + etapeAvis.value = { + status: 'ERROR', + message: e.message ?? "Une erreur s'est produite", + } + } + } else { + etapeAvis.value = { status: 'LOADED', value: [] } + } + if (etapeAvis.value.status === 'LOADED') { + props.onChange(etapeAvis.value.value) + } + }) + + return () => <LoadingElement data={etapeAvis.value} renderItem={avis => <EtapeAvisLoaded avis={avis} {...props} />} /> +}) + +type EtapeAvisLoadedProps = { avis: EtapeAvis[] } & Props +const EtapeAvisLoaded = defineComponent<EtapeAvisLoadedProps>(props => { + const etapeAvis = ref<EtapeAvisModificationWithIndex[]>(props.avis.map((avis, index) => ({ ...avis, index }))) + + watch( + () => etapeAvis.value, + () => { + props.onChange(etapeAvis.value) + }, + { deep: true } + ) + + const addOrEditPopupOpen = ref<{ open: true; avisTypeIds: NonEmptyArray<AvisTypeId>; etapeAvis?: (EtapeAvis | TempEtapeAvis) & WithIndex } | { open: false }>({ open: false }) + + const avisTypes = computed(() => { + return getAvisTypes(props.tde.etapeTypeId, props.tde.titreTypeId, props.communeIds) + }) + + const completeRequiredAvis = computed<PropsTable['avis']>(() => { + const avis: PropsTable['avis'] = etapeAvis.value.filter(({ avis_type_id }) => avisTypes.value.some(dt => dt.id === avis_type_id && !dt.optionnel)) + + return avis + }) + const emptyRequiredAvis = computed<AvisTypeId[]>(() => { + const avis = avisTypes.value.filter(({ optionnel, id }) => !optionnel && !completeRequiredAvis.value.some(({ avis_type_id }) => avis_type_id === id)).map(({ id }) => id) + + return avis + }) + const additionnalAvisTypeIds = computed<AvisTypeId[]>(() => { + return avisTypes.value.filter(dt => dt.optionnel).map(({ id }) => id) + }) + + const additionnalAvis = computed<PropsTable['avis']>(() => { + return etapeAvis.value.filter(({ avis_type_id }) => avisTypes.value.some(dt => dt.id === avis_type_id && dt.optionnel)) + }) + const openAddPopupAdditionnalAvis = () => { + if (isNonEmptyArray(additionnalAvisTypeIds.value)) { + addOrEditPopupOpen.value = { open: true, avisTypeIds: additionnalAvisTypeIds.value } + } + } + const closeAddPopup = (newAvis: EtapeAvisModification | null) => { + if (newAvis !== null && addOrEditPopupOpen.value.open) { + const index = addOrEditPopupOpen.value.etapeAvis?.index + if (isNullOrUndefined(index)) { + etapeAvis.value.push({ ...newAvis, index: etapeAvis.value.length }) + } else { + etapeAvis.value[index] = { ...newAvis, index } + } + } + + addOrEditPopupOpen.value = { open: false } + } + + const addAvis = (avisTypeId: AvisTypeId) => { + addOrEditPopupOpen.value = { open: true, avisTypeIds: [avisTypeId] } + } + const editAvis = (avisIndex: number) => { + const avis = etapeAvis.value[avisIndex] + addOrEditPopupOpen.value = { open: true, avisTypeIds: [avis.avis_type_id], etapeAvis: avis } + } + const removeAvis = (avisIndex: number) => { + etapeAvis.value.splice(avisIndex, 1) + etapeAvis.value.forEach((a, index) => { + a.index = index + }) + } + + const getNom = (avisTypeId: AvisTypeId) => { + return AvisTypes[avisTypeId].nom + } + + return () => ( + <> + {isNotNullNorUndefinedNorEmpty(emptyRequiredAvis.value) || isNotNullNorUndefinedNorEmpty(completeRequiredAvis.value) ? ( + <EtapeAvisTable getNom={getNom} add={addAvis} edit={editAvis} delete={removeAvis} caption="Avis obligatoires" emptyRequiredAvis={emptyRequiredAvis.value} avis={completeRequiredAvis.value} /> + ) : null} + + {isNonEmptyArray(additionnalAvisTypeIds.value) ? ( + <> + <div style={{ display: 'flex', flexDirection: 'column' }} class="fr-mt-3w"> + <EtapeAvisTable getNom={getNom} add={addAvis} edit={editAvis} delete={removeAvis} caption="Avis complémentaires" emptyRequiredAvis={[]} avis={additionnalAvis.value} /> + <DsfrButtonIcon + style={{ alignSelf: 'end' }} + class="fr-mt-1w" + icon="fr-icon-add-line" + buttonType="secondary" + title="Ajouter un avis complémentaire" + label="Ajouter" + onClick={openAddPopupAdditionnalAvis} + /> + </div> + {addOrEditPopupOpen.value.open ? ( + <AddEtapeAvisPopup + avisTypeIds={addOrEditPopupOpen.value.avisTypeIds} + user={props.user} + apiClient={props.apiClient} + close={closeAddPopup} + initialAvis={addOrEditPopupOpen.value.etapeAvis || null} + /> + ) : null} + </> + ) : null} + </> + ) +}) + +type PropsTable = { + caption: string + avis: ((EtapeAvis | TempEtapeAvis) & { index: number })[] + emptyRequiredAvis: AvisTypeId[] + getNom: (avisTypeId: AvisTypeId) => string + add: (avisTypeId: AvisTypeId) => void + edit: (avisIndex: number) => void + delete: (avisIndex: number) => void +} +const EtapeAvisTable: FunctionalComponent<PropsTable> = (props: PropsTable) => { + const deleteAvis = (index: number) => () => { + props.delete(index) + } + const editAvis = (index: number) => () => { + props.edit(index) + } + + const orderedAvis = [...props.avis].sort((a, b) => b.date.localeCompare(a.date)) + + return ( + <div class="fr-table fr-mb-0"> + <table style={{ display: 'table' }}> + <caption>{props.caption}</caption> + <thead> + <tr> + <th scope="col">Nom</th> + <th scope="col">Date</th> + <th scope="col">Description</th> + <th scope="col">Statut</th> + <th scope="col">Visibilité</th> + <th scope="col" style={{ display: 'flex', justifyContent: 'end' }}> + Action + </th> + </tr> + </thead> + <tbody> + {orderedAvis.map(avis => ( + <tr> + <td>{props.getNom(avis.avis_type_id)}</td> + <td>{dateFormat(avis.date)}</td> + <td style={{ whiteSpace: 'pre-line' }}>{avis.description}</td> + <td> + <AvisStatut avisStatutId={avis.avis_statut_id} /> + </td> + <td>{getAvisVisibilityLabel(avis.avis_visibility_id)}</td> + <td> + <div style={{ display: 'flex', justifyContent: 'end', alignItems: 'center' }}> + <DsfrButtonIcon icon="fr-icon-edit-line" title={`Modifier l’avis de ${props.getNom(avis.avis_type_id)}`} onClick={editAvis(avis.index)} buttonType="secondary" buttonSize="sm" /> + <DsfrButtonIcon + icon="fr-icon-delete-bin-line" + class="fr-ml-1w" + title={`Supprimer l’avis de ${props.getNom(avis.avis_type_id)}`} + onClick={deleteAvis(avis.index)} + buttonType="secondary" + buttonSize="sm" + /> + </div> + </td> + </tr> + ))} + {props.emptyRequiredAvis.map(avisTypeId => ( + <tr> + <td class="fr-label--disabled">{props.getNom(avisTypeId)}</td> + <td>-</td> + <td>-</td> + <td>-</td> + <td>-</td> + <td style={{ display: 'flex', justifyContent: 'end' }}> + <DsfrButtonIcon icon="fr-icon-add-line" title={`Ajouter un document ${props.getNom(avisTypeId)}`} onClick={() => props.add(avisTypeId)} buttonType="secondary" buttonSize="sm" /> + </td> + </tr> + ))} + </tbody> + </table> + </div> + ) +} + +// @ts-ignore waiting for https://github.com/vuejs/core/issues/7833 +EtapeAvisEdit.props = ['tde', 'onChange', 'etapeId', 'apiClient', 'communeIds', 'user'] +// @ts-ignore waiting for https://github.com/vuejs/core/issues/7833 +EtapeAvisLoaded.props = ['tde', 'onChange', 'etapeId', 'apiClient', 'avis', 'communeIds', 'user'] diff --git a/packages/ui/src/components/etape/etape-avis.stories.tsx b/packages/ui/src/components/etape/etape-avis.stories.tsx new file mode 100644 index 000000000..b1b4726ed --- /dev/null +++ b/packages/ui/src/components/etape/etape-avis.stories.tsx @@ -0,0 +1,55 @@ +import { Meta, StoryFn } from '@storybook/vue3' +import { entrepriseIdValidator } from 'camino-common/src/entreprise' +import { testBlankUser } from 'camino-common/src/tests-utils' +import { caminoDateValidator } from 'camino-common/src/date' +import { EtapeAvisTable } from './etape-avis' +import { EtapeAvis, etapeAvisIdValidator } from 'camino-common/src/etape' +import { AvisVisibilityIds } from 'camino-common/src/static/avisTypes' + +const meta: Meta = { + title: 'Components/Etape/EtapeAvis', + component: EtapeAvisTable, +} +export default meta + +const avis: EtapeAvis[] = [ + { + id: etapeAvisIdValidator.parse('id'), + avis_type_id: 'avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques', + avis_statut_id: 'Favorable', + avis_visibility_id: AvisVisibilityIds.TitulairesEtAdministrations, + date: caminoDateValidator.parse('2023-01-01'), + has_file: true, + description: 'Une description', + }, + { + id: etapeAvisIdValidator.parse('id2'), + avis_type_id: 'avisIFREMER', + avis_statut_id: 'Défavorable', + avis_visibility_id: AvisVisibilityIds.Administrations, + date: caminoDateValidator.parse('2023-01-01'), + has_file: false, + description: 'Une description', + }, + { + id: etapeAvisIdValidator.parse('id2'), + avis_type_id: 'avisParcNational', + avis_statut_id: 'Favorable avec réserves', + avis_visibility_id: AvisVisibilityIds.Public, + date: caminoDateValidator.parse('2023-01-01'), + has_file: false, + description: '', + }, +] + +export const Empty: StoryFn = () => ( + <div> + <EtapeAvisTable etapeAvis={[]} user={null} /> + </div> +) +export const NotConnected: StoryFn = () => <EtapeAvisTable etapeAvis={avis} user={null} /> +export const UserSuper: StoryFn = () => <EtapeAvisTable etapeAvis={avis} user={{ ...testBlankUser, role: 'super' }} /> +export const UserAdministration: StoryFn = () => <EtapeAvisTable etapeAvis={avis} user={{ ...testBlankUser, role: 'admin', administrationId: 'aut-mrae-guyane-01' }} /> +export const UserEntreprise: StoryFn = () => ( + <EtapeAvisTable etapeAvis={avis} user={{ ...testBlankUser, role: 'entreprise', entreprises: [{ id: entrepriseIdValidator.parse('entrepriseId'), nom: 'nom' }] }} /> +) diff --git a/packages/ui/src/components/etape/etape-avis.stories_snapshots_Empty.html b/packages/ui/src/components/etape/etape-avis.stories_snapshots_Empty.html new file mode 100644 index 000000000..03e443957 --- /dev/null +++ b/packages/ui/src/components/etape/etape-avis.stories_snapshots_Empty.html @@ -0,0 +1,3 @@ +<div> + <!----> +</div> \ No newline at end of file diff --git a/packages/ui/src/components/etape/etape-avis.stories_snapshots_NotConnected.html b/packages/ui/src/components/etape/etape-avis.stories_snapshots_NotConnected.html new file mode 100644 index 000000000..73deca555 --- /dev/null +++ b/packages/ui/src/components/etape/etape-avis.stories_snapshots_NotConnected.html @@ -0,0 +1,45 @@ +<div style="overflow-x: auto;"> + <div class=" fr-table fr-m-0"> + <table style="display: table;" class="fr-table--no-caption fr-m-0"> + <caption>Avis</caption> + <thead> + <tr> + <th scope="col">Nom</th> + <th scope="col">Date</th> + <th scope="col">Description</th> + <th scope="col">Statut</th> + <!----> + </tr> + </thead> + <tbody> + <tr> + <td><a href="/apiUrl/download/avisDocument/id" title="Télécharger l'avis Avis du Conseil Départemental de l'Environnement et des Risques Sanitaires et Technologiques (CODERST) - nouvelle fenêtre" target="_blank">Avis du Conseil Départemental de l'Environnement et des Risques Sanitaires et Technologiques (CODERST)</a></td> + <td>01-01-2023</td> + <td style="white-space: pre-line;">Une description</td> + <td> + <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-badge--green-bourgeon" title="Favorable" aria-label="Favorable">Favorable</p> + </td> + <!----> + </tr> + <tr> + <td>Avis de l'IFREMER</td> + <td>01-01-2023</td> + <td style="white-space: pre-line;">Une description</td> + <td> + <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-badge--purple-glycine" title="Défavorable" aria-label="Défavorable">Défavorable</p> + </td> + <!----> + </tr> + <tr> + <td>Avis du Parc National</td> + <td>01-01-2023</td> + <td style="white-space: pre-line;"></td> + <td> + <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-badge--green-bourgeon" title="Favorable avec réserves" aria-label="Favorable avec réserves">Favorable avec réserves</p> + </td> + <!----> + </tr> + </tbody> + </table> + </div> +</div> \ No newline at end of file diff --git a/packages/ui/src/components/etape/etape-avis.stories_snapshots_UserAdministration.html b/packages/ui/src/components/etape/etape-avis.stories_snapshots_UserAdministration.html new file mode 100644 index 000000000..5b93ec8ae --- /dev/null +++ b/packages/ui/src/components/etape/etape-avis.stories_snapshots_UserAdministration.html @@ -0,0 +1,45 @@ +<div style="overflow-x: auto;"> + <div class=" fr-table fr-m-0"> + <table style="display: table;" class="fr-table--no-caption fr-m-0"> + <caption>Avis</caption> + <thead> + <tr> + <th scope="col">Nom</th> + <th scope="col">Date</th> + <th scope="col">Description</th> + <th scope="col">Statut</th> + <th scope="col">Visibilité</th> + </tr> + </thead> + <tbody> + <tr> + <td><a href="/apiUrl/download/avisDocument/id" title="Télécharger l'avis Avis du Conseil Départemental de l'Environnement et des Risques Sanitaires et Technologiques (CODERST) - nouvelle fenêtre" target="_blank">Avis du Conseil Départemental de l'Environnement et des Risques Sanitaires et Technologiques (CODERST)</a></td> + <td>01-01-2023</td> + <td style="white-space: pre-line;">Une description</td> + <td> + <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-badge--green-bourgeon" title="Favorable" aria-label="Favorable">Favorable</p> + </td> + <td>Visible par les administrations et les entreprises titulaires</td> + </tr> + <tr> + <td>Avis de l'IFREMER</td> + <td>01-01-2023</td> + <td style="white-space: pre-line;">Une description</td> + <td> + <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-badge--purple-glycine" title="Défavorable" aria-label="Défavorable">Défavorable</p> + </td> + <td>Visible par les administrations</td> + </tr> + <tr> + <td>Avis du Parc National</td> + <td>01-01-2023</td> + <td style="white-space: pre-line;"></td> + <td> + <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-badge--green-bourgeon" title="Favorable avec réserves" aria-label="Favorable avec réserves">Favorable avec réserves</p> + </td> + <td>Public</td> + </tr> + </tbody> + </table> + </div> +</div> \ No newline at end of file diff --git a/packages/ui/src/components/etape/etape-avis.stories_snapshots_UserEntreprise.html b/packages/ui/src/components/etape/etape-avis.stories_snapshots_UserEntreprise.html new file mode 100644 index 000000000..73deca555 --- /dev/null +++ b/packages/ui/src/components/etape/etape-avis.stories_snapshots_UserEntreprise.html @@ -0,0 +1,45 @@ +<div style="overflow-x: auto;"> + <div class=" fr-table fr-m-0"> + <table style="display: table;" class="fr-table--no-caption fr-m-0"> + <caption>Avis</caption> + <thead> + <tr> + <th scope="col">Nom</th> + <th scope="col">Date</th> + <th scope="col">Description</th> + <th scope="col">Statut</th> + <!----> + </tr> + </thead> + <tbody> + <tr> + <td><a href="/apiUrl/download/avisDocument/id" title="Télécharger l'avis Avis du Conseil Départemental de l'Environnement et des Risques Sanitaires et Technologiques (CODERST) - nouvelle fenêtre" target="_blank">Avis du Conseil Départemental de l'Environnement et des Risques Sanitaires et Technologiques (CODERST)</a></td> + <td>01-01-2023</td> + <td style="white-space: pre-line;">Une description</td> + <td> + <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-badge--green-bourgeon" title="Favorable" aria-label="Favorable">Favorable</p> + </td> + <!----> + </tr> + <tr> + <td>Avis de l'IFREMER</td> + <td>01-01-2023</td> + <td style="white-space: pre-line;">Une description</td> + <td> + <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-badge--purple-glycine" title="Défavorable" aria-label="Défavorable">Défavorable</p> + </td> + <!----> + </tr> + <tr> + <td>Avis du Parc National</td> + <td>01-01-2023</td> + <td style="white-space: pre-line;"></td> + <td> + <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-badge--green-bourgeon" title="Favorable avec réserves" aria-label="Favorable avec réserves">Favorable avec réserves</p> + </td> + <!----> + </tr> + </tbody> + </table> + </div> +</div> \ No newline at end of file diff --git a/packages/ui/src/components/etape/etape-avis.stories_snapshots_UserSuper.html b/packages/ui/src/components/etape/etape-avis.stories_snapshots_UserSuper.html new file mode 100644 index 000000000..5b93ec8ae --- /dev/null +++ b/packages/ui/src/components/etape/etape-avis.stories_snapshots_UserSuper.html @@ -0,0 +1,45 @@ +<div style="overflow-x: auto;"> + <div class=" fr-table fr-m-0"> + <table style="display: table;" class="fr-table--no-caption fr-m-0"> + <caption>Avis</caption> + <thead> + <tr> + <th scope="col">Nom</th> + <th scope="col">Date</th> + <th scope="col">Description</th> + <th scope="col">Statut</th> + <th scope="col">Visibilité</th> + </tr> + </thead> + <tbody> + <tr> + <td><a href="/apiUrl/download/avisDocument/id" title="Télécharger l'avis Avis du Conseil Départemental de l'Environnement et des Risques Sanitaires et Technologiques (CODERST) - nouvelle fenêtre" target="_blank">Avis du Conseil Départemental de l'Environnement et des Risques Sanitaires et Technologiques (CODERST)</a></td> + <td>01-01-2023</td> + <td style="white-space: pre-line;">Une description</td> + <td> + <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-badge--green-bourgeon" title="Favorable" aria-label="Favorable">Favorable</p> + </td> + <td>Visible par les administrations et les entreprises titulaires</td> + </tr> + <tr> + <td>Avis de l'IFREMER</td> + <td>01-01-2023</td> + <td style="white-space: pre-line;">Une description</td> + <td> + <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-badge--purple-glycine" title="Défavorable" aria-label="Défavorable">Défavorable</p> + </td> + <td>Visible par les administrations</td> + </tr> + <tr> + <td>Avis du Parc National</td> + <td>01-01-2023</td> + <td style="white-space: pre-line;"></td> + <td> + <p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--md fr-badge--green-bourgeon" title="Favorable avec réserves" aria-label="Favorable avec réserves">Favorable avec réserves</p> + </td> + <td>Public</td> + </tr> + </tbody> + </table> + </div> +</div> \ No newline at end of file diff --git a/packages/ui/src/components/etape/etape-avis.tsx b/packages/ui/src/components/etape/etape-avis.tsx new file mode 100644 index 000000000..f8fb00480 --- /dev/null +++ b/packages/ui/src/components/etape/etape-avis.tsx @@ -0,0 +1,77 @@ +import { FunctionalComponent } from 'vue' +import { EtapeAvisId, EtapeAvis } from 'camino-common/src/etape' +import { User, isAdministration, isSuper } from 'camino-common/src/roles' +import { getDownloadRestRoute } from '../../api/client-rest' +import { isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools' +import { AvisTypeId, AvisTypes, AvisVisibilityId } from 'camino-common/src/static/avisTypes' +import { AvisStatut } from '../_common/etape-statut' +import { dateFormat } from 'camino-common/src/date' +import { VisibilityLabel } from './etape-documents' + +interface Props { + etapeAvis: EtapeAvis[] + user: User +} + +export const getAvisVisibilityLabel = (avisVisibility: AvisVisibilityId): string => { + const value = { + Public: VisibilityLabel.public, + Administrations: VisibilityLabel.administrations, + TitulairesEtAdministrations: VisibilityLabel.entreprises, + } as const satisfies { [key in AvisVisibilityId]: string } + + return value[avisVisibility] +} + +export const EtapeAvisTable: FunctionalComponent<Props> = props => { + if (isNullOrUndefinedOrEmpty(props.etapeAvis)) { + return null + } + + const orderedAvis = [...props.etapeAvis].sort((a, b) => b.date.localeCompare(a.date)) + + return ( + <div style={{ overflowX: 'auto' }}> + <div class=" fr-table fr-m-0"> + <table style={{ display: 'table' }} class="fr-table--no-caption fr-m-0"> + <caption>Avis</caption> + <thead> + <tr> + <th scope="col">Nom</th> + <th scope="col">Date</th> + <th scope="col">Description</th> + <th scope="col">Statut</th> + {isSuper(props.user) || isAdministration(props.user) ? <th scope="col">Visibilité</th> : null} + </tr> + </thead> + <tbody> + {orderedAvis.map(item => ( + <tr> + <td>{item.has_file ? <EtapeAvisLink avisId={item.id} avisTypeId={item.avis_type_id} /> : AvisTypes[item.avis_type_id].nom}</td> + <td>{dateFormat(item.date)}</td> + <td style={{ whiteSpace: 'pre-line' }}>{item.description}</td> + <td> + <AvisStatut avisStatutId={item.avis_statut_id} /> + </td> + {isSuper(props.user) || isAdministration(props.user) ? <td>{getAvisVisibilityLabel(item.avis_visibility_id)}</td> : null} + </tr> + ))} + </tbody> + </table> + </div> + </div> + ) +} + +type EtapeAvisLinkProps = { avisId: EtapeAvisId; avisTypeId: AvisTypeId } +const EtapeAvisLink: FunctionalComponent<EtapeAvisLinkProps> = props => { + return ( + <a + href={getDownloadRestRoute('/download/avisDocument/:etapeAvisId', { etapeAvisId: props.avisId })} + title={`Télécharger l'avis ${AvisTypes[props.avisTypeId].nom} - nouvelle fenêtre`} + target="_blank" + > + {AvisTypes[props.avisTypeId].nom} + </a> + ) +} diff --git a/packages/ui/src/components/etape/etape-documents-edit.stories.tsx b/packages/ui/src/components/etape/etape-documents-edit.stories.tsx index fd43dadfd..4fb3dbde5 100644 --- a/packages/ui/src/components/etape/etape-documents-edit.stories.tsx +++ b/packages/ui/src/components/etape/etape-documents-edit.stories.tsx @@ -1,6 +1,6 @@ import { Meta, StoryFn, StoryObj } from '@storybook/vue3' import { EtapeDocumentsEdit } from './etape-documents-edit' -import { EtapeDocument, GetEtapeDocumentsByEtapeId, etapeDocumentIdValidator, etapeIdValidator } from 'camino-common/src/etape' +import { ETAPE_IS_BROUILLON, ETAPE_IS_NOT_BROUILLON, EtapeDocument, GetEtapeDocumentsByEtapeId, etapeDocumentIdValidator, etapeIdValidator } from 'camino-common/src/etape' import { ApiClient } from '../../api/api-client' import { action } from '@storybook/addon-actions' import { tempDocumentNameValidator } from 'camino-common/src/document' @@ -65,7 +65,7 @@ export const Empty: StoryFn = () => ( etapeId={etapeIdValidator.parse('etapeId')} sdomZoneIds={[]} tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mfr' }} - isBrouillon={false} + isBrouillon={ETAPE_IS_NOT_BROUILLON} completeUpdate={completeUpdateAction} user={{ ...testBlankUser, role: 'super' }} /> @@ -77,7 +77,7 @@ export const Rempli: StoryFn = () => ( etapeId={etapeIdValidator.parse('etapeId')} sdomZoneIds={[]} tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mfr' }} - isBrouillon={false} + isBrouillon={ETAPE_IS_NOT_BROUILLON} completeUpdate={completeUpdateAction} user={{ ...testBlankUser, role: 'super' }} /> @@ -134,7 +134,7 @@ export const Complet: StoryFn = () => ( etapeId={etapeIdValidator.parse('etapeId')} sdomZoneIds={[]} tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mfr' }} - isBrouillon={false} + isBrouillon={ETAPE_IS_NOT_BROUILLON} completeUpdate={completeUpdateAction} user={{ ...testBlankUser, role: 'super' }} /> @@ -147,7 +147,7 @@ export const ArmMecanise: StoryFn = () => ( etapeId={etapeIdValidator.parse('etapeId')} sdomZoneIds={[]} tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mfr' }} - isBrouillon={false} + isBrouillon={ETAPE_IS_NOT_BROUILLON} completeUpdate={completeUpdateAction} user={{ ...testBlankUser, role: 'super' }} /> @@ -166,7 +166,7 @@ export const ArmMecaniseDynamicNoSnapshot: StoryObj<{ mecanise: boolean }> = { etapeId={etapeIdValidator.parse('etapeId')} sdomZoneIds={[]} tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mfr' }} - isBrouillon={false} + isBrouillon={ETAPE_IS_NOT_BROUILLON} completeUpdate={completeUpdateAction} user={{ ...testBlankUser, role: 'super' }} /> @@ -185,7 +185,7 @@ export const EnConstruction: StoryFn = () => ( etapeId={etapeIdValidator.parse('etapeId')} sdomZoneIds={[]} tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mfr' }} - isBrouillon={true} + isBrouillon={ETAPE_IS_BROUILLON} completeUpdate={completeUpdateAction} user={{ ...testBlankUser, role: 'super' }} /> @@ -197,7 +197,7 @@ export const OctroiAxmUtilisateurSuper: StoryFn = () => ( etapeId={etapeIdValidator.parse('etapeId')} sdomZoneIds={[]} tde={{ titreTypeId: 'axm', demarcheTypeId: 'oct', etapeTypeId: 'mfr' }} - isBrouillon={true} + isBrouillon={ETAPE_IS_BROUILLON} completeUpdate={completeUpdateAction} user={{ ...testBlankUser, role: 'super' }} /> @@ -210,7 +210,7 @@ export const OctroiAxmUtilisateurEntreprise: StoryFn = () => ( etapeId={etapeIdValidator.parse('etapeId')} sdomZoneIds={[]} tde={{ titreTypeId: 'axm', demarcheTypeId: 'oct', etapeTypeId: 'mfr' }} - isBrouillon={true} + isBrouillon={ETAPE_IS_BROUILLON} completeUpdate={completeUpdateAction} user={{ ...testBlankUser, role: 'entreprise', entreprises: [{ id: entrepriseIdValidator.parse('idEntreprise1'), nom: 'entreprise 1' }] }} /> @@ -287,7 +287,7 @@ export const OctroiAxmUtilisateurEntrepriseComplet: StoryFn = () => ( etapeId={etapeIdValidator.parse('etapeId')} sdomZoneIds={[]} tde={{ titreTypeId: 'axm', demarcheTypeId: 'oct', etapeTypeId: 'mfr' }} - isBrouillon={true} + isBrouillon={ETAPE_IS_BROUILLON} completeUpdate={completeUpdateAction} user={{ ...testBlankUser, role: 'entreprise', entreprises: [{ id: entrepriseIdValidator.parse('idEntreprise1'), nom: 'entreprise 1' }] }} /> @@ -300,7 +300,7 @@ export const SdomZone: StoryFn = () => ( etapeId={etapeIdValidator.parse('etapeId')} sdomZoneIds={['1', '2']} tde={{ titreTypeId: 'axm', demarcheTypeId: 'oct', etapeTypeId: 'mfr' }} - isBrouillon={false} + isBrouillon={ETAPE_IS_NOT_BROUILLON} completeUpdate={completeUpdateAction} user={{ ...testBlankUser, role: 'super' }} /> @@ -313,7 +313,7 @@ export const PasDeDocumentsObligatoires: StoryFn = () => ( etapeId={etapeIdValidator.parse('etapeId')} sdomZoneIds={['1', '2']} tde={{ titreTypeId: 'prm', demarcheTypeId: 'pro', etapeTypeId: 'mfr' }} - isBrouillon={false} + isBrouillon={ETAPE_IS_NOT_BROUILLON} completeUpdate={completeUpdateAction} user={{ ...testBlankUser, role: 'super' }} /> @@ -326,7 +326,7 @@ export const Loading: StoryFn = () => ( etapeId={etapeIdValidator.parse('etapeId')} sdomZoneIds={[]} tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mfr' }} - isBrouillon={false} + isBrouillon={ETAPE_IS_NOT_BROUILLON} completeUpdate={completeUpdateAction} user={{ ...testBlankUser, role: 'super' }} /> @@ -338,7 +338,7 @@ export const WithError: StoryFn = () => ( etapeId={etapeIdValidator.parse('etapeId')} sdomZoneIds={[]} tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mfr' }} - isBrouillon={false} + isBrouillon={ETAPE_IS_NOT_BROUILLON} completeUpdate={completeUpdateAction} user={{ ...testBlankUser, role: 'super' }} /> diff --git a/packages/ui/src/components/etape/etape-documents-edit.tsx b/packages/ui/src/components/etape/etape-documents-edit.tsx index 8c4c40188..8c1e8920d 100644 --- a/packages/ui/src/components/etape/etape-documents-edit.tsx +++ b/packages/ui/src/components/etape/etape-documents-edit.tsx @@ -1,6 +1,7 @@ import { DocumentComplementaireAslEtapeDocumentModification, DocumentComplementaireDaeEtapeDocumentModification, + EtapeBrouillon, EtapeDocument, EtapeDocumentModification, EtapeId, @@ -37,7 +38,7 @@ interface Props { demarcheTypeId: DemarcheTypeId etapeTypeId: EtapeTypeId } - isBrouillon: boolean + isBrouillon: EtapeBrouillon sdomZoneIds: DeepReadonly<SDOMZoneId[]> completeUpdate: ( etapeDocuments: (EtapeDocument | TempEtapeDocument)[], @@ -219,6 +220,10 @@ const EtapeDocumentsLoaded = defineComponent<EtapeDocumentsLoadedProps>(props => } const removeDocument = (documentIndex: number) => { etapeDocuments.value.splice(documentIndex, 1) + // On recalcule les index + etapeDocuments.value.forEach((a, index) => { + a.index = index + }) } const getNom = (documentTypeId: DocumentTypeId) => { @@ -291,7 +296,7 @@ const EtapeDocumentsLoaded = defineComponent<EtapeDocumentsLoadedProps>(props => type PropsTable = { caption: string documents: ((EtapeDocument | TempEtapeDocument) & { index: number | 'asl' | 'dae' })[] - isBrouillon: boolean + isBrouillon: EtapeBrouillon emptyRequiredDocuments: DocumentTypeId[] getNom: (documentTypeId: DocumentTypeId) => string add: (documentTypeId: DocumentTypeId) => void diff --git a/packages/ui/src/components/etape/etape-edit-form.stories.tsx b/packages/ui/src/components/etape/etape-edit-form.stories.tsx index e566b62d8..4979018b3 100644 --- a/packages/ui/src/components/etape/etape-edit-form.stories.tsx +++ b/packages/ui/src/components/etape/etape-edit-form.stories.tsx @@ -1,6 +1,6 @@ import { EtapeEditForm, Props } from './etape-edit-form' import { Meta, StoryFn } from '@storybook/vue3' -import { EtapeId, etapeIdValidator, etapeSlugValidator } from 'camino-common/src/etape' +import { ETAPE_IS_NOT_BROUILLON, EtapeId, etapeIdValidator, etapeSlugValidator } from 'camino-common/src/etape' import { Entreprise, EntrepriseDocumentId, EntrepriseId, EtapeEntrepriseDocument, entrepriseDocumentIdValidator, entrepriseIdValidator, newEntrepriseId } from 'camino-common/src/entreprise' import { CaminoDate, toCaminoDate } from 'camino-common/src/date' import { testBlankUser } from 'camino-common/src/tests-utils' @@ -45,7 +45,7 @@ const etape: Props['etape'] = { slug: etapeSlugValidator.parse('slug'), titreDemarcheId: demarcheIdValidator.parse('demarcheId'), statutId: 'fai', - isBrouillon: false, + isBrouillon: ETAPE_IS_NOT_BROUILLON, typeId: 'mfr', contenu: { arm: { mecanise: { value: null, heritee: false, etapeHeritee: null }, franchissements: { value: null, heritee: false, etapeHeritee: null } } }, date: toCaminoDate('2022-02-02'), @@ -116,8 +116,13 @@ const getGeojsonByGeoSystemeIdAction = action('getGeojsonByGeoSystemeId') const getEtapeDocumentsByEtapeIdAction = action('getEtapeDocumentsByEtapeId') const getEtapeEntrepriseDocumentsAction = action('getEtapeEntrepriseDocuments') const creerEntrepriseDocumentAction = action('creerEntrepriseDocument') +const getEtapeAvisByEtapeIdAction = action('getEtapeAvisByEtapeId') const etapeEditFormApiClient: Props['apiClient'] = { + getEtapeAvisByEtapeId(etapeId) { + getEtapeAvisByEtapeIdAction(etapeId) + return Promise.resolve([]) + }, deposeEtape(etapeId) { deposeEtapeAction(etapeId) @@ -147,44 +152,37 @@ const etapeEditFormApiClient: Props['apiClient'] = { getEtapeHeritagePotentiel(etape, titreDemarcheId) { getEtapeHeritagePotentielAction(etape, titreDemarcheId) return Promise.resolve({ - ...etape, - duree: { - value: etape.duree.value, - heritee: false, - etapeHeritee: { - date: toCaminoDate('2022-01-01'), - etapeTypeId: 'mfr', - value: 12, + heritageProps: { + duree: { + actif: false, + etape: { date: toCaminoDate('2022-01-01'), typeId: 'mfr', duree: 12 }, }, - }, - substances: { - value: ['arge'], - heritee: true, - etapeHeritee: { - date: toCaminoDate('2022-01-01'), - etapeTypeId: 'mfr', - value: ['arge'], + substances: { + actif: true, + etape: { + date: toCaminoDate('2022-01-01'), + typeId: 'mfr', + substances: ['arge'], + }, }, - }, - dateDebut: { value: etape.dateDebut.value, heritee: false, etapeHeritee: null }, - titulaires: { value: etape.titulaires.value, heritee: false, etapeHeritee: null }, - amodiataires: { - value: [entreprises[0].id, entreprises[1].id, entreprises[2].id], - heritee: true, - etapeHeritee: { - date: toCaminoDate('2022-01-01'), - etapeTypeId: 'mfr', - value: [entreprises[0].id, entreprises[1].id, entreprises[2].id], + dateDebut: { actif: false, etape: null }, + titulaires: { actif: false, etape: null }, + amodiataires: { + actif: true, + etape: { + date: toCaminoDate('2022-01-01'), + typeId: 'mfr', + amodiataireIds: [entreprises[0].id, entreprises[1].id, entreprises[2].id], + }, }, - }, - perimetre: { value: etape.perimetre.value, heritee: false, etapeHeritee: null }, - dateFin: { - value: etape.dateFin.value, - heritee: false, - etapeHeritee: { - date: toCaminoDate('2022-01-01'), - etapeTypeId: 'mfr', - value: toCaminoDate('2022-01-01'), + perimetre: { actif: false, etape: null }, + dateFin: { + actif: false, + etape: { + date: toCaminoDate('2022-01-01'), + typeId: 'mfr', + dateFin: toCaminoDate('2022-01-01'), + }, }, }, heritageContenu: { arm: { mecanise: { actif: false }, franchissements: { actif: false } } }, @@ -235,7 +233,7 @@ const etapeEditFormApiClient: Props['apiClient'] = { export const Default: StoryFn = () => ( <EtapeEditForm initTab="points" - perimetre={{ sdomZoneIds: [], superposition_alertes: [] }} + perimetre={{ sdomZoneIds: [], superposition_alertes: [], communes: [] }} apiClient={etapeEditFormApiClient} demarcheId={demarcheIdValidator.parse('demarcheId')} demarcheTypeId="oct" @@ -263,7 +261,7 @@ export const EtapeModification: StoryFn = () => ( demarcheTypeId="oct" titreSlug={titreSlugValidator.parse('titre-slug')} titreTypeId="cxw" - perimetre={{ sdomZoneIds: [], superposition_alertes: [] }} + perimetre={{ sdomZoneIds: [], superposition_alertes: [], communes: [] }} etape={{ ...etape, contenu: { cxx: { volume: { value: null, heritee: false, etapeHeritee: null }, volumeUniteId: { value: null, heritee: false, etapeHeritee: null } } }, diff --git a/packages/ui/src/components/etape/etape-edit-form.stories_snapshots_Default.html b/packages/ui/src/components/etape/etape-edit-form.stories_snapshots_Default.html index 0ac222d77..582eb278a 100644 --- a/packages/ui/src/components/etape/etape-edit-form.stories_snapshots_Default.html +++ b/packages/ui/src/components/etape/etape-edit-form.stories_snapshots_Default.html @@ -237,6 +237,7 @@ <!----> </div> </div> + <!----> <div> <div> <h2 class="fr-pt-6w">Documents d’entreprise<p style="z-index: unset; margin-bottom: 0px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;" class="fr-badge fr-badge--sm fr-ml-2w fr-badge--error fr-badge--no-icon fr-ml-2w" title="Incomplet" aria-label="Incomplet">Incomplet</p> diff --git a/packages/ui/src/components/etape/etape-edit-form.stories_snapshots_EtapeModification.html b/packages/ui/src/components/etape/etape-edit-form.stories_snapshots_EtapeModification.html index 28a004961..a399f5c89 100644 --- a/packages/ui/src/components/etape/etape-edit-form.stories_snapshots_EtapeModification.html +++ b/packages/ui/src/components/etape/etape-edit-form.stories_snapshots_EtapeModification.html @@ -318,6 +318,7 @@ <!----> </div> </div> + <!----> <div> <div> <h2 class="fr-pt-6w">Documents d’entreprise diff --git a/packages/ui/src/components/etape/etape-edit-form.tsx b/packages/ui/src/components/etape/etape-edit-form.tsx index ea73ac480..53eb4b823 100644 --- a/packages/ui/src/components/etape/etape-edit-form.tsx +++ b/packages/ui/src/components/etape/etape-edit-form.tsx @@ -6,7 +6,16 @@ import { EntrepriseDocumentsEdit } from './entreprises-documents-edit' import { EtapeDocumentsEdit } from './etape-documents-edit' import { ApiClient } from '../../api/api-client' import { User } from 'camino-common/src/roles' -import { DocumentComplementaireAslEtapeDocumentModification, DocumentComplementaireDaeEtapeDocumentModification, EtapeDocument, EtapeId, TempEtapeDocument } from 'camino-common/src/etape' +import { + DocumentComplementaireAslEtapeDocumentModification, + DocumentComplementaireDaeEtapeDocumentModification, + ETAPE_IS_NOT_BROUILLON, + EtapeAvis, + EtapeDocument, + EtapeId, + TempEtapeAvis, + TempEtapeDocument, +} from 'camino-common/src/etape' import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes' import { TitreTypeId } from 'camino-common/src/static/titresTypes' import { TitreSlug } from 'camino-common/src/validators/titres' @@ -15,7 +24,7 @@ import { Nullable, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from ' import { Entreprise } from 'camino-common/src/entreprise' import { DemarcheId } from 'camino-common/src/demarche' import { useState } from '@/utils/vue-tsx-utils' -import { DateTypeEdit, EtapeDateTypeEdit, dateTypeStepIsComplete, dateTypeStepIsVisible } from './date-type-edit' +import { DateTypeEdit, EtapeDateTypeEdit } from './date-type-edit' import { FeatureCollectionForages, FeatureCollectionPoints, GeojsonInformations, PerimetreInformations } from 'camino-common/src/perimetre' import { SectionsEdit, SectionsEditEtape } from './sections-edit' import { DsfrTextarea } from '../_ui/dsfr-textarea' @@ -31,17 +40,24 @@ import { perimetreStepIsVisible, sectionsStepIsComplete, sectionsStepIsVisible, + etapeAvisStepIsVisible, + etapeAvisStepIsComplete, + dateTypeStepIsComplete, + dateTypeStepIsVisible, } from 'camino-common/src/permissions/etape-form' import { EtapeAlerte, PureFormSaveBtn } from './pure-form-save-btn' import { TitresStatuts } from 'camino-common/src/static/titresStatuts' import { DeposeEtapePopup } from '../demarche/depose-etape-popup' +import { EtapeAvisEdit } from './etape-avis-edit' import { EtapeTypeId, canBeBrouillon } from 'camino-common/src/static/etapesTypes' -import { CoreEtapeCreationOrModification } from './etape-api-client' -import { FlattenEtape, GraphqlEtapeCreation } from 'camino-common/src/etape-form' +import { CoreEtapeCreationOrModification, GetEtapeHeritagePotentiel } from './etape-api-client' +import { FlattenEtape, RestEtapeCreation } from 'camino-common/src/etape-form' import { AsyncData } from '@/api/client-rest' import { CaminoDate } from 'camino-common/src/date' import { EtapeStatutId } from 'camino-common/src/static/etapesStatuts' import { LoadingElement } from '../_ui/functional-loader' +import { isEtapeDeposable } from 'camino-common/src/permissions/titres-etapes' +import { getSections } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections' export type Props = { etape: DeepReadonly<Pick<Nullable<FlattenEtape>, 'id' | 'date' | 'typeId' | 'statutId' | 'slug'> & Omit<FlattenEtape, 'date' | 'typeId' | 'statutId' | 'id' | 'slug'>> @@ -70,6 +86,7 @@ export type Props = { | 'etapeCreer' | 'etapeModifier' | 'deposeEtape' + | 'getEtapeAvisByEtapeId' > } @@ -78,17 +95,141 @@ type EtapeEditFormDocuments = DeepReadonly<{ entrepriseDocuments: SelectedEntrepriseDocument[] daeDocument: DocumentComplementaireDaeEtapeDocumentModification | null aslDocument: DocumentComplementaireAslEtapeDocumentModification | null + etapeAvis: (EtapeAvis | TempEtapeAvis)[] }> +const mergeFlattenEtapeWithNewHeritage = ( + etape: DeepReadonly<CoreEtapeCreationOrModification>, + titreTypeId: TitreTypeId, + demarcheTypeId: DemarcheTypeId, + heritageData: DeepReadonly<GetEtapeHeritagePotentiel> +): DeepReadonly<CoreEtapeCreationOrModification> => { + const sections = getSections(titreTypeId, demarcheTypeId, etape.typeId) + const flattenEtape: DeepReadonly<CoreEtapeCreationOrModification> = { + ...etape, + contenu: sections.reduce<DeepReadonly<FlattenEtape['contenu']>>((accSection, section) => { + const newSection = section.elements.reduce<DeepReadonly<FlattenEtape['contenu'][string]>>((accElement, element) => { + const elementHeritage = heritageData.heritageContenu[section.id]?.[element.id] ?? { actif: false, etape: null } + const currentHeritage: DeepReadonly<FlattenEtape['contenu'][string][string]> = etape.contenu[section.id]?.[element.id] ?? { value: null, heritee: true, etapeHeritee: null } + return { + ...accElement, + [element.id]: { + value: currentHeritage.heritee ? elementHeritage.etape?.contenu?.[section.id]?.[element.id] ?? null : currentHeritage.value, + heritee: currentHeritage.heritee && isNotNullNorUndefined(elementHeritage.etape), + etapeHeritee: isNotNullNorUndefined(elementHeritage.etape) + ? { + etapeTypeId: elementHeritage.etape.typeId, + date: elementHeritage.etape.date, + value: elementHeritage.etape.contenu[section.id]?.[element.id] ?? null, + } + : null, + }, + } + }, {}) + + return { + ...accSection, + [section.id]: newSection, + } + }, {}), + duree: { + value: etape.duree.heritee ? heritageData.heritageProps.duree.etape?.duree ?? null : etape.duree.value, + heritee: etape.duree.heritee && isNotNullNorUndefined(heritageData.heritageProps.duree.etape), + etapeHeritee: isNotNullNorUndefined(heritageData.heritageProps.duree.etape) + ? { + etapeTypeId: heritageData.heritageProps.duree.etape.typeId, + date: heritageData.heritageProps.duree.etape.date, + value: heritageData.heritageProps.duree.etape.duree, + } + : null, + }, + perimetre: { + value: etape.perimetre.heritee ? (isNotNullNorUndefined(heritageData.heritageProps.perimetre.etape) ? { ...heritageData.heritageProps.perimetre.etape } : null) : etape.perimetre.value, + + heritee: etape.perimetre.heritee && isNotNullNorUndefined(heritageData.heritageProps.perimetre.etape), + etapeHeritee: isNotNullNorUndefined(heritageData.heritageProps.perimetre.etape) + ? { + etapeTypeId: heritageData.heritageProps.perimetre.etape.typeId, + date: heritageData.heritageProps.perimetre.etape.date, + value: { ...heritageData.heritageProps.perimetre.etape }, + } + : null, + }, + dateDebut: { + value: etape.dateDebut.heritee ? heritageData.heritageProps.dateDebut.etape?.dateDebut ?? null : etape.dateDebut.value, + heritee: etape.dateDebut.heritee && isNotNullNorUndefined(heritageData.heritageProps.dateDebut.etape), + etapeHeritee: isNotNullNorUndefined(heritageData.heritageProps.dateDebut.etape) + ? { + etapeTypeId: heritageData.heritageProps.dateDebut.etape.typeId, + date: heritageData.heritageProps.dateDebut.etape.date, + value: heritageData.heritageProps.dateDebut.etape.dateDebut, + } + : null, + }, + dateFin: { + value: etape.dateFin.heritee ? heritageData.heritageProps.dateFin.etape?.dateFin ?? null : etape.dateFin.value, + heritee: etape.dateFin.heritee && isNotNullNorUndefined(heritageData.heritageProps.dateFin.etape), + etapeHeritee: isNotNullNorUndefined(heritageData.heritageProps.dateFin.etape) + ? { + etapeTypeId: heritageData.heritageProps.dateFin.etape.typeId, + date: heritageData.heritageProps.dateFin.etape.date, + value: heritageData.heritageProps.dateFin.etape.dateFin, + } + : null, + }, + substances: { + value: etape.substances.heritee ? (isNotNullNorUndefined(heritageData.heritageProps.substances.etape) ? heritageData.heritageProps.substances.etape.substances : []) : etape.substances.value, + + heritee: etape.substances.heritee && isNotNullNorUndefined(heritageData.heritageProps.substances.etape), + etapeHeritee: isNotNullNorUndefined(heritageData.heritageProps.substances.etape) + ? { + etapeTypeId: heritageData.heritageProps.substances.etape.typeId, + date: heritageData.heritageProps.substances.etape.date, + value: heritageData.heritageProps.substances.etape.substances, + } + : null, + }, + amodiataires: { + value: etape.amodiataires.heritee + ? isNotNullNorUndefined(heritageData.heritageProps.amodiataires.etape) + ? heritageData.heritageProps.amodiataires.etape.amodiataireIds + : [] + : etape.amodiataires.value, + + heritee: etape.amodiataires.heritee && isNotNullNorUndefined(heritageData.heritageProps.amodiataires.etape), + etapeHeritee: isNotNullNorUndefined(heritageData.heritageProps.amodiataires.etape) + ? { + etapeTypeId: heritageData.heritageProps.amodiataires.etape.typeId, + date: heritageData.heritageProps.amodiataires.etape.date, + value: heritageData.heritageProps.amodiataires.etape.amodiataireIds, + } + : null, + }, + titulaires: { + value: etape.titulaires.heritee ? (isNotNullNorUndefined(heritageData.heritageProps.titulaires.etape) ? heritageData.heritageProps.titulaires.etape.titulaireIds : []) : etape.titulaires.value, + + heritee: etape.titulaires.heritee && isNotNullNorUndefined(heritageData.heritageProps.titulaires.etape), + etapeHeritee: isNotNullNorUndefined(heritageData.heritageProps.titulaires.etape) + ? { + etapeTypeId: heritageData.heritageProps.titulaires.etape.typeId, + date: heritageData.heritageProps.titulaires.etape.date, + value: heritageData.heritageProps.titulaires.etape.titulaireIds, + } + : null, + }, + } + return flattenEtape +} export const EtapeEditForm = defineComponent<Props>(props => { const [etape, setEtape] = useState<AsyncData<CoreEtapeCreationOrModification | null>>({ status: 'LOADED', value: null }) - const [perimetreInfos, setPerimetreInfos] = useState<DeepReadonly<PerimetreInformations>>(props.perimetre) + const [perimetreInfos, setPerimetreInfos] = useState<DeepReadonly<Omit<PerimetreInformations, 'communes'>>>(props.perimetre) const [documents, setDocuments] = useState<EtapeEditFormDocuments>({ etapeDocuments: [], entrepriseDocuments: [], daeDocument: null, aslDocument: null, + etapeAvis: [], }) onMounted(async () => { if (isNotNullNorUndefined(props.etape.date) && isNotNullNorUndefined(props.etape.typeId) && isNotNullNorUndefined(props.etape.statutId)) { @@ -100,19 +241,15 @@ export const EtapeEditForm = defineComponent<Props>(props => { const currentEtape = etape.value.status === 'LOADED' && isNotNullNorUndefined(etape.value.value) ? etape.value.value : props.etape setEtape({ status: 'LOADING' }) try { - const value = await props.apiClient.getEtapeHeritagePotentiel( - { - ...currentEtape, - date, - typeId, - statutId, - isBrouillon: isNotNullNorUndefined(currentEtape.id) ? currentEtape.isBrouillon : canBeBrouillon(typeId), - }, - props.demarcheId, - props.titreTypeId, - props.demarcheTypeId - ) - setEtape({ status: 'LOADED', value }) + const etape = { + ...currentEtape, + date, + typeId, + statutId, + isBrouillon: isNotNullNorUndefined(currentEtape.id) ? currentEtape.isBrouillon : canBeBrouillon(typeId), + } + const value = await props.apiClient.getEtapeHeritagePotentiel(etape, props.demarcheId) + setEtape({ status: 'LOADED', value: mergeFlattenEtapeWithNewHeritage(etape, props.titreTypeId, props.demarcheTypeId, value) }) } catch (e: any) { console.error('error', e) setEtape({ @@ -159,29 +296,45 @@ export const EtapeEditForm = defineComponent<Props>(props => { const canSave = computed<boolean>(() => { if (etape.value.status === 'LOADED' && isNotNullNorUndefined(etape.value.value)) { - return (dateTypeStepIsComplete(etape.value.value, props.user) && etape.value.value.isBrouillon) || canDepose.value + if (etape.value.value.isBrouillon === ETAPE_IS_NOT_BROUILLON) { + return ( + dateTypeStepIsComplete(etape.value.value, props.user).valid && + fondamentaleStepIsComplete(etape.value.value, props.demarcheTypeId, props.titreTypeId).valid && + sectionsStepIsComplete(etape.value.value, props.demarcheTypeId, props.titreTypeId).valid && + perimetreStepIsComplete(etape.value.value).valid && + etapeDocumentsStepIsComplete( + etape.value.value, + props.demarcheTypeId, + props.titreTypeId, + documents.value.etapeDocuments, + props.perimetre.sdomZoneIds, + documents.value.daeDocument, + documents.value.aslDocument, + props.user + ).valid && + entrepriseDocumentsStepIsComplete(etape.value.value, props.demarcheTypeId, props.titreTypeId, documents.value.entrepriseDocuments).valid && + etapeAvisStepIsComplete(etape.value.value, documents.value.etapeAvis, props.titreTypeId, props.perimetre.communes).valid + ) + } + return dateTypeStepIsComplete(etape.value.value, props.user).valid && etape.value.value.isBrouillon } return false }) const canDepose = computed<boolean>(() => { if (etape.value.status === 'LOADED' && isNotNullNorUndefined(etape.value.value)) { - return ( - dateTypeStepIsComplete(etape.value.value, props.user) && - fondamentaleStepIsComplete(etape.value.value, props.demarcheTypeId, props.titreTypeId) && - sectionsStepIsComplete(etape.value.value, props.demarcheTypeId, props.titreTypeId) && - perimetreStepIsComplete(etape.value.value) && - etapeDocumentsStepIsComplete( - etape.value.value, - props.demarcheTypeId, - props.titreTypeId, - documents.value.etapeDocuments, - props.perimetre.sdomZoneIds, - documents.value.daeDocument, - documents.value.aslDocument, - props.user - ) && - entrepriseDocumentsStepIsComplete(etape.value.value, props.demarcheTypeId, props.titreTypeId, documents.value.entrepriseDocuments) + return isEtapeDeposable( + props.user, + props.titreTypeId, + props.demarcheTypeId, + etape.value.value, + documents.value.etapeDocuments, + documents.value.entrepriseDocuments.map(({ documentTypeId, entrepriseId }) => ({ entreprise_document_type_id: documentTypeId, entreprise_id: entrepriseId })), + props.perimetre.sdomZoneIds, + props.perimetre.communes, + documents.value.daeDocument, + documents.value.aslDocument, + documents.value.etapeAvis ) } @@ -214,10 +367,10 @@ export const EtapeEditForm = defineComponent<Props>(props => { titulaires: { actif: etapeValue.titulaires.heritee }, amodiataires: { actif: etapeValue.amodiataires.heritee }, }, - contenu: Object.keys(etapeValue.contenu).reduce<DeepReadonly<GraphqlEtapeCreation['contenu']>>((sectionsAcc, section) => { + contenu: Object.keys(etapeValue.contenu).reduce<DeepReadonly<RestEtapeCreation['contenu']>>((sectionsAcc, section) => { sectionsAcc = { ...sectionsAcc, - [section]: Object.keys(etapeValue.contenu[section]).reduce<DeepReadonly<GraphqlEtapeCreation['contenu'][string]>>((elementsAcc, element) => { + [section]: Object.keys(etapeValue.contenu[section]).reduce<DeepReadonly<RestEtapeCreation['contenu'][string]>>((elementsAcc, element) => { elementsAcc = { ...elementsAcc, [element]: etapeValue.contenu[section][element].value } return elementsAcc @@ -226,10 +379,10 @@ export const EtapeEditForm = defineComponent<Props>(props => { return sectionsAcc }, {}), - heritageContenu: Object.keys(etapeValue.contenu).reduce<DeepReadonly<GraphqlEtapeCreation['heritageContenu']>>((sectionsAcc, section) => { + heritageContenu: Object.keys(etapeValue.contenu).reduce<DeepReadonly<RestEtapeCreation['heritageContenu']>>((sectionsAcc, section) => { return { ...sectionsAcc, - [section]: Object.keys(etapeValue.contenu[section]).reduce<DeepReadonly<GraphqlEtapeCreation['heritageContenu'][string]>>((elementsAcc, element) => { + [section]: Object.keys(etapeValue.contenu[section]).reduce<DeepReadonly<RestEtapeCreation['heritageContenu'][string]>>((elementsAcc, element) => { return { ...elementsAcc, [element]: { actif: etapeValue.contenu[section][element].heritee } } }, {}), } @@ -285,17 +438,18 @@ export const EtapeEditForm = defineComponent<Props>(props => { {dateTypeStepIsVisible(props.user) ? ( <Bloc step={{ name: 'Informations principales', help: null }} - complete={dateTypeStepIsComplete( - etape.value.status === 'LOADED' && etape.value.value !== null - ? etape.value.value - : { - date: null, - id: null, - statutId: null, - typeId: null, - }, - props.user - )} + complete={ + dateTypeStepIsComplete( + etape.value.status === 'LOADED' && etape.value.value !== null + ? etape.value.value + : { + date: null, + statutId: null, + typeId: null, + }, + props.user + ).valid + } > <DateTypeEdit etape={props.etape} apiClient={props.apiClient} completeUpdate={dateTypeCompleteUpdate} demarcheId={props.demarcheId} /> </Bloc> @@ -313,7 +467,7 @@ export const EtapeEditForm = defineComponent<Props>(props => { alertes={alertes.value} canSave={canSave.value} canDepose={canDepose.value} - showDepose={etapeLoaded.typeId === 'mfr' && etapeLoaded.isBrouillon} + showDepose={etapeLoaded.isBrouillon} save={saveAndReroute} depose={depose} /> @@ -344,7 +498,7 @@ const EtapeEditFormInternal = defineComponent< etape: DeepReadonly<CoreEtapeCreationOrModification> documents: EtapeEditFormDocuments setEtape: (etape: DeepReadonly<CoreEtapeCreationOrModification>, documents: EtapeEditFormDocuments) => void - alertesUpdate: (alertes: PerimetreInformations) => void + alertesUpdate: (alertes: Omit<PerimetreInformations, 'communes'>) => void } & Omit<Props, 'etape'> >(props => { const documentsCompleteUpdate = ( @@ -360,6 +514,13 @@ const EtapeEditFormInternal = defineComponent< }) } + const avisCompleteUpdate = (etapeAvis: (EtapeAvis | TempEtapeAvis)[]) => { + props.setEtape(props.etape, { + ...props.documents, + etapeAvis, + }) + } + const entrepriseDocumentsCompleteUpdate = (entrepriseDocuments: DeepReadonly<SelectedEntrepriseDocument[]>) => { props.setEtape(props.etape, { ...props.documents, entrepriseDocuments }) } @@ -431,7 +592,7 @@ const EtapeEditFormInternal = defineComponent< return () => ( <div> {fondamentaleStepIsVisible(props.etape.typeId) ? ( - <Bloc step={{ name: 'Propriétés', help: null }} complete={fondamentaleStepIsComplete(props.etape, props.demarcheTypeId, props.titreTypeId)}> + <Bloc step={{ name: 'Propriétés', help: null }} complete={fondamentaleStepIsComplete(props.etape, props.demarcheTypeId, props.titreTypeId).valid}> <FondamentalesEdit etape={props.etape} demarcheTypeId={props.demarcheTypeId} @@ -449,14 +610,14 @@ const EtapeEditFormInternal = defineComponent< name: 'Propriétés spécifiques', help: isHelpVisible.value ? 'Ce bloc permet de savoir si la prospection est mécanisée ou non et s’il y a des franchissements de cours d’eau (si oui, combien ?)' : null, }} - complete={sectionsStepIsComplete(props.etape, props.demarcheTypeId, props.titreTypeId)} + complete={sectionsStepIsComplete(props.etape, props.demarcheTypeId, props.titreTypeId).valid} > <SectionsEdit etape={props.etape} titreTypeId={props.titreTypeId} demarcheTypeId={props.demarcheTypeId} completeUpdate={sectionCompleteUpdate} /> </Bloc> ) : null} {perimetreStepIsVisible(props.etape) ? ( - <Bloc step={{ name: 'Périmètre', help: null }} complete={perimetreStepIsComplete(props.etape)}> + <Bloc step={{ name: 'Périmètre', help: null }} complete={perimetreStepIsComplete(props.etape).valid}> <PerimetreEdit etape={props.etape} titreTypeId={props.titreTypeId} @@ -474,16 +635,18 @@ const EtapeEditFormInternal = defineComponent< {etapeDocumentsStepIsVisible(props.etape, props.demarcheTypeId, props.titreTypeId) ? ( <Bloc step={{ name: 'Liste des documents', help: null }} - complete={etapeDocumentsStepIsComplete( - props.etape, - props.demarcheTypeId, - props.titreTypeId, - props.documents.etapeDocuments, - props.perimetre.sdomZoneIds, - props.documents.daeDocument, - props.documents.aslDocument, - props.user - )} + complete={ + etapeDocumentsStepIsComplete( + props.etape, + props.demarcheTypeId, + props.titreTypeId, + props.documents.etapeDocuments, + props.perimetre.sdomZoneIds, + props.documents.daeDocument, + props.documents.aslDocument, + props.user + ).valid + } > <EtapeDocumentsEdit apiClient={props.apiClient} @@ -498,6 +661,19 @@ const EtapeEditFormInternal = defineComponent< </Bloc> ) : null} + {etapeAvisStepIsVisible(props.etape, props.titreTypeId, props.perimetre.communes) ? ( + <Bloc step={{ name: 'Liste des avis', help: null }} complete={etapeAvisStepIsComplete(props.etape, props.documents.etapeAvis, props.titreTypeId, props.perimetre.communes).valid}> + <EtapeAvisEdit + apiClient={props.apiClient} + tde={{ titreTypeId: props.titreTypeId, demarcheTypeId: props.demarcheTypeId, etapeTypeId: props.etape.typeId }} + etapeId={props.etape.id} + communeIds={props.perimetre.communes} + onChange={avisCompleteUpdate} + user={props.user} + /> + </Bloc> + ) : null} + {entrepriseDocumentsStepIsVisible(props.etape, props.demarcheTypeId, props.titreTypeId) ? ( <Bloc step={{ @@ -507,7 +683,7 @@ const EtapeEditFormInternal = defineComponent< ? "Les documents d’entreprise sont des documents propres à l'entreprise, et pourront être réutilisés pour la création d'un autre dossier et mis à jour si nécessaire. Ces documents d’entreprise sont consultables dans la fiche entreprise de votre société. Cette section permet de protéger et de centraliser les informations d'ordre privé relatives à la société et à son personnel." : null, }} - complete={entrepriseDocumentsStepIsComplete(props.etape, props.demarcheTypeId, props.titreTypeId, props.documents.entrepriseDocuments)} + complete={entrepriseDocumentsStepIsComplete(props.etape, props.demarcheTypeId, props.titreTypeId, props.documents.entrepriseDocuments).valid} > <EntrepriseDocumentsEdit entreprises={titulairesAndAmodiataires.value} diff --git a/packages/ui/src/components/etape/fondamentales-edit.stories.tsx b/packages/ui/src/components/etape/fondamentales-edit.stories.tsx index 583159dd4..2962175e8 100644 --- a/packages/ui/src/components/etape/fondamentales-edit.stories.tsx +++ b/packages/ui/src/components/etape/fondamentales-edit.stories.tsx @@ -1,6 +1,6 @@ import { FondamentalesEdit } from './fondamentales-edit' import { Meta, StoryFn } from '@storybook/vue3' -import { etapeIdValidator, etapeSlugValidator } from 'camino-common/src/etape' +import { ETAPE_IS_BROUILLON, etapeIdValidator, etapeSlugValidator } from 'camino-common/src/etape' import { newEntrepriseId } from 'camino-common/src/entreprise' import { toCaminoDate } from 'camino-common/src/date' import { testBlankUser } from 'camino-common/src/tests-utils' @@ -20,7 +20,7 @@ const etape: FlattenEtape = { slug: etapeSlugValidator.parse('slug'), titreDemarcheId: demarcheIdValidator.parse('demarcheId'), statutId: 'fai', - isBrouillon: true, + isBrouillon: ETAPE_IS_BROUILLON, typeId: 'mfr', contenu: {}, date: toCaminoDate('2022-02-02'), diff --git a/packages/ui/src/components/etape/fondamentales-edit.tsx b/packages/ui/src/components/etape/fondamentales-edit.tsx index ac9be1502..38c0a4167 100644 --- a/packages/ui/src/components/etape/fondamentales-edit.tsx +++ b/packages/ui/src/components/etape/fondamentales-edit.tsx @@ -4,7 +4,7 @@ import { HeritageEdit } from './heritage-edit' import { AutocompleteEntreprises } from './autocomplete-entreprises' import { CaminoDate } from 'camino-common/src/date' import { SubstancesEdit } from './substances-edit' -import { dureeOptionalCheck as titreEtapesDureeOptionalCheck, canEditAmodiataires, canEditTitulaires, canEditDuree, canEditDates } from 'camino-common/src/permissions/titres-etapes' +import { isDureeOptional as titreEtapesDureeOptionalCheck, canEditAmodiataires, canEditTitulaires, canEditDuree, canEditDates } from 'camino-common/src/permissions/titres-etapes' import { DomaineId } from 'camino-common/src/static/domaines' import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes' diff --git a/packages/ui/src/components/etape/sections-edit.tsx b/packages/ui/src/components/etape/sections-edit.tsx index 2c9cc4d95..9f1767b83 100644 --- a/packages/ui/src/components/etape/sections-edit.tsx +++ b/packages/ui/src/components/etape/sections-edit.tsx @@ -7,7 +7,6 @@ import { useState } from '../../utils/vue-tsx-utils' import { SectionWithValue } from 'camino-common/src/sections' import { SectionElementWithValueEdit } from './section-element-with-value-edit' import { FlattenEtape } from 'camino-common/src/etape-form' -import { Contenu } from 'camino-common/src/permissions/sections' export type SectionsEditEtape = DeepReadonly<Pick<FlattenEtape, 'typeId' | 'contenu'>> type Props = { @@ -34,19 +33,7 @@ export const SectionsEdit = defineComponent<Props>(props => { }) const sectionsWithValue = computed<DeepReadonly<SectionWithValue[]>>(() => { if (isNotNullNorUndefined(editedEtape.value.contenu)) { - const contenu = Object.keys(editedEtape.value.contenu).reduce<DeepReadonly<Contenu>>((accSections, section) => { - const elements = Object.keys(editedEtape.value.contenu[section]).reduce<DeepReadonly<{ [secondKey in string]?: unknown }>>((accElements, element) => { - const contenuValue = editedEtape.value.contenu[section][element].value - if (isNotNullNorUndefined(contenuValue)) { - return { ...accElements, [element]: contenuValue } - } - return accElements - }, {}) - - return { ...accSections, [section]: elements } - }, {}) - - return getSectionsWithValue(sections.value, contenu) + return getSectionsWithValue(sections.value, editedEtape.value.contenu) } return [] }) diff --git a/packages/ui/src/components/titre.stories.tsx b/packages/ui/src/components/titre.stories.tsx index 940489514..f49f36889 100644 --- a/packages/ui/src/components/titre.stories.tsx +++ b/packages/ui/src/components/titre.stories.tsx @@ -9,13 +9,14 @@ import { TitresStatutIds } from 'camino-common/src/static/titresStatuts' import { TITRES_TYPES_IDS } from 'camino-common/src/static/titresTypes' import { LinkableTitre } from './titre/titres-link-form-api-client' import { demarcheIdValidator, demarcheSlugValidator } from 'camino-common/src/demarche' -import { etapeIdValidator, etapeSlugValidator } from 'camino-common/src/etape' +import { ETAPE_IS_NOT_BROUILLON, etapeIdValidator, etapeSlugValidator } from 'camino-common/src/etape' import { EtapesTypesEtapesStatuts } from 'camino-common/src/static/etapesTypesEtapesStatuts' import { Entreprise, entrepriseIdValidator } from 'camino-common/src/entreprise' import { titreIdValidator, titreSlugValidator, TitreIdOrSlug } from 'camino-common/src/validators/titres' -import { km2Validator } from 'camino-common/src/number' +import { ZERO_KM2 } from 'camino-common/src/number' import { CaminoRouter } from '@/typings/vue-router' +// FIXME ajoute test avec des avis const meta: Meta = { title: 'Components/Titre', // @ts-ignore @storybook/vue3 n'aime pas les composants tsx @@ -159,7 +160,7 @@ const titre = { slug: etapeSlugValidator.parse('etape-slug'), etape_type_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeTypeId, etape_statut_id: EtapesTypesEtapesStatuts.demande.FAIT.etapeStatutId, - is_brouillon: false, + is_brouillon: ETAPE_IS_NOT_BROUILLON, date, ordre: 1, fondamentale: { @@ -211,7 +212,7 @@ const titre = { geojson_origine_geo_systeme_id: '4326', geojson4326_forages: null, geojson_origine_forages: null, - surface: km2Validator.parse(0), + surface: ZERO_KM2, communes: [], sdom_zones: [], forets: [], @@ -221,6 +222,7 @@ const titre = { sections_with_values: [], etape_documents: [], entreprises_documents: [], + avis_documents: [], }, ], }, @@ -381,7 +383,7 @@ const chantePieApiClient: PropsApiClient = { getTitreAction(titreIdOrSlug) // prettier-ignore - const chantepieData = titreGetValidator.parse({"id":"Ju80kBYMoDstD5J6H8wqWRdo","nom":"Chantepie","slug":"m-cx-chantepie-1988","titre_type_id":"cxm","titre_statut_id":"val","titre_doublon":null,"references":[{"nom":"2013-0224-MI","referenceTypeId":"deb"}],"titre_last_modified_date":"2023-10-12","demarches":[{"id":"PpD4be1fwbWJ7TZCdwvZj0vQ","slug":"m-cx-chantepie-1988-oct01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":600,"substances":["auru","arge","cuiv","ferx","plom","souf","zinc","scoc"],"titulaireIds":["fr-632022711"],"amodiataireIds":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-0.105658320330431,48.1489209342693],[-0.115003633563279,48.1398379979624],[-0.0996023094257926,48.1209828190687],[-0.0852402595925762,48.1212930049111],[-0.0616864580218711,48.1486971325525],[-0.105658320330431,48.1489209342693]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.105658320330431,48.1489209342693]},"properties":{"nom":"A","description":"Intersection de l'axe de la route départementale n° 103, joignant Rouez et Crissé et de la droite joignant l'intersection de l'axe de la rivière La Vègre avec la limite des communes de Sillé-le-Guillaume et de Rouez, d'une part, au sommet B défini ci-après"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0616864580218711,48.1486971325525]},"properties":{"nom":"B","description":"Intersection de l'axe de la route départementale n° 304 allant de Sillé-le-Guillaume à Conlie et de l'axe de la route départementale n° 167 allant à Rouez"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0852402595925762,48.1212930049111]},"properties":{"nom":"C","description":"Intersection de la droite joignant l'axe du clocher de Sillé-le-Guillaume et l'axe du clocher de Tennie, et de la droite joignant l'axe du clocher de Parennes et l'axe du clocher de Conlie"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0996023094257926,48.1209828190687]},"properties":{"nom":"D","description":"Intersection de la droite joignant l'axe du clocher de Parennes et l'axe du clocher de Conlie et de la droite joignant l'axe du clocher de Rouez et l'axe du clocher de Bernay"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.115003633563279,48.1398379979624]},"properties":{"nom":"E","description":"Axe du clocher de Rouez"}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[418280,1052710],[421550,1052580],[419700,1049590],[418630,1049590],[417552,1051723],[418280,1052710]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[418280,1052710]},"properties":{"nom":"A","description":"Intersection de l’axe de la route départementale n° 103, joignant Rouez et Crissé et de la droite joignant l’intersection de l’axe de la rivière La Vègre avec la limite des communes de Sillé-le-Guillaume et de Rouez, d’une part, au sommet B défini ci-après"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[421550,1052580]},"properties":{"nom":"B","description":"Intersection de l’axe de la route départementale n° 304 allant de Sillé-le-Guillaume à Conlie et de l’axe de la route départementale n° 167 allant à Rouez"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[419700,1049590]},"properties":{"nom":"C","description":"Intersection de la droite joignant l’axe du clocher de Sillé-le-Guillaume et l’axe du clocher de Tennie, et de la droite joignant l’axe du clocher de Parennes et l’axe du clocher de Conlie"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[418630,1049590]},"properties":{"nom":"D","description":"Intersection de la droite joignant l’axe du clocher de Parennes et l’axe du clocher de Conlie et de la droite joignant l’axe du clocher de Rouez et l’axe du clocher de Bernay"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[417552,1051723]},"properties":{"nom":"E","description":"Axe du clocher de Rouez"}}]},"geojson_origine_geo_systeme_id":"27571","geojson4326_forages":null,"geojson_origine_forages":null,"surface":8,"communes":[{"id":"72256","nom":"Rouez"},{"id":"72351","nom":"Tennie"}],"secteurs_maritimes":[],"sdom_zones":[],"forets":[]}},"etape_statut_id":"acc","is_brouillon":false,"date":"1988-09-01","id":"OxqtxQwW0B3AUIHFR7k32Ycl","ordre":2,"notes":null,"slug":"m-cx-chantepie-1988-oct01-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000000681488"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"INDE8800659D"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":600,"substances":["auru","arge","cuiv","ferx","plom","souf","zinc","scoc"],"titulaireIds":["fr-632022711"],"amodiataireIds":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-0.105658320330431,48.1489209342693],[-0.115003633563279,48.1398379979624],[-0.0996023094257926,48.1209828190687],[-0.0852402595925762,48.1212930049111],[-0.0616864580218711,48.1486971325525],[-0.105658320330431,48.1489209342693]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.105658320330431,48.1489209342693]},"properties":{"nom":"A","description":"Intersection de l'axe de la route départementale n° 103, joignant Rouez et Crissé et de la droite joignant l'intersection de l'axe de la rivière La Vègre avec la limite des communes de Sillé-le-Guillaume et de Rouez, d'une part, au sommet B défini ci-après"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0616864580218711,48.1486971325525]},"properties":{"nom":"B","description":"Intersection de l'axe de la route départementale n° 304 allant de Sillé-le-Guillaume à Conlie et de l'axe de la route départementale n° 167 allant à Rouez"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0852402595925762,48.1212930049111]},"properties":{"nom":"C","description":"Intersection de la droite joignant l'axe du clocher de Sillé-le-Guillaume et l'axe du clocher de Tennie, et de la droite joignant l'axe du clocher de Parennes et l'axe du clocher de Conlie"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0996023094257926,48.1209828190687]},"properties":{"nom":"D","description":"Intersection de la droite joignant l'axe du clocher de Parennes et l'axe du clocher de Conlie et de la droite joignant l'axe du clocher de Rouez et l'axe du clocher de Bernay"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.115003633563279,48.1398379979624]},"properties":{"nom":"E","description":"Axe du clocher de Rouez"}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[418280,1052710],[421550,1052580],[419700,1049590],[418630,1049590],[417552,1051723],[418280,1052710]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[418280,1052710]},"properties":{"nom":"A","description":"Intersection de l’axe de la route départementale n° 103, joignant Rouez et Crissé et de la droite joignant l’intersection de l’axe de la rivière La Vègre avec la limite des communes de Sillé-le-Guillaume et de Rouez, d’une part, au sommet B défini ci-après"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[421550,1052580]},"properties":{"nom":"B","description":"Intersection de l’axe de la route départementale n° 304 allant de Sillé-le-Guillaume à Conlie et de l’axe de la route départementale n° 167 allant à Rouez"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[419700,1049590]},"properties":{"nom":"C","description":"Intersection de la droite joignant l’axe du clocher de Sillé-le-Guillaume et l’axe du clocher de Tennie, et de la droite joignant l’axe du clocher de Parennes et l’axe du clocher de Conlie"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[418630,1049590]},"properties":{"nom":"D","description":"Intersection de la droite joignant l’axe du clocher de Parennes et l’axe du clocher de Conlie et de la droite joignant l’axe du clocher de Rouez et l’axe du clocher de Bernay"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[417552,1051723]},"properties":{"nom":"E","description":"Axe du clocher de Rouez"}}]},"geojson_origine_geo_systeme_id":"27571","geojson4326_forages":null,"geojson_origine_forages":null,"surface":8,"communes":[{"id":"72256","nom":"Rouez"},{"id":"72351","nom":"Tennie"}],"secteurs_maritimes":[],"sdom_zones":[],"forets":[]}},"etape_statut_id":"acc","is_brouillon":false,"date":"1988-08-24","id":"XkNmBmjc6YYY6OEncdCAldnU","ordre":1,"notes":null,"slug":"m-cx-chantepie-1988-oct01-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"oct","demarche_statut_id":"acc","demarche_date_debut":"1988-09-01","demarche_date_fin":"2038-09-01","ordre":1},{"id":"mkPvJYXFO2InPppXamCRo2Cv","slug":"m-cx-chantepie-1988-mut01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaireIds":["fr-409160132"],"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2000-06-06","id":"lc3diJKRphb029ufvF73FlSn","ordre":2,"notes":null,"slug":"m-cx-chantepie-1988-mut01-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000000765254"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOI0000251A"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaireIds":["fr-409160132"],"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2000-05-25","id":"2n1RaQcCxZMVta2Qfv1pUIRS","ordre":1,"notes":null,"slug":"m-cx-chantepie-1988-mut01-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"mut","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":2}],"nb_activites_to_do":null}) + const chantepieData = titreGetValidator.parse({"id":"Ju80kBYMoDstD5J6H8wqWRdo","nom":"Chantepie","slug":"m-cx-chantepie-1988","titre_type_id":"cxm","titre_statut_id":"val","titre_doublon":null,"references":[{"nom":"2013-0224-MI","referenceTypeId":"deb"}],"titre_last_modified_date":"2023-10-12","demarches":[{"id":"PpD4be1fwbWJ7TZCdwvZj0vQ","slug":"m-cx-chantepie-1988-oct01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":600,"substances":["auru","arge","cuiv","ferx","plom","souf","zinc","scoc"],"titulaireIds":["fr-632022711"],"amodiataireIds":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-0.105658320330431,48.1489209342693],[-0.115003633563279,48.1398379979624],[-0.0996023094257926,48.1209828190687],[-0.0852402595925762,48.1212930049111],[-0.0616864580218711,48.1486971325525],[-0.105658320330431,48.1489209342693]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.105658320330431,48.1489209342693]},"properties":{"nom":"A","description":"Intersection de l'axe de la route départementale n° 103, joignant Rouez et Crissé et de la droite joignant l'intersection de l'axe de la rivière La Vègre avec la limite des communes de Sillé-le-Guillaume et de Rouez, d'une part, au sommet B défini ci-après"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0616864580218711,48.1486971325525]},"properties":{"nom":"B","description":"Intersection de l'axe de la route départementale n° 304 allant de Sillé-le-Guillaume à Conlie et de l'axe de la route départementale n° 167 allant à Rouez"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0852402595925762,48.1212930049111]},"properties":{"nom":"C","description":"Intersection de la droite joignant l'axe du clocher de Sillé-le-Guillaume et l'axe du clocher de Tennie, et de la droite joignant l'axe du clocher de Parennes et l'axe du clocher de Conlie"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0996023094257926,48.1209828190687]},"properties":{"nom":"D","description":"Intersection de la droite joignant l'axe du clocher de Parennes et l'axe du clocher de Conlie et de la droite joignant l'axe du clocher de Rouez et l'axe du clocher de Bernay"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.115003633563279,48.1398379979624]},"properties":{"nom":"E","description":"Axe du clocher de Rouez"}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[418280,1052710],[421550,1052580],[419700,1049590],[418630,1049590],[417552,1051723],[418280,1052710]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[418280,1052710]},"properties":{"nom":"A","description":"Intersection de l’axe de la route départementale n° 103, joignant Rouez et Crissé et de la droite joignant l’intersection de l’axe de la rivière La Vègre avec la limite des communes de Sillé-le-Guillaume et de Rouez, d’une part, au sommet B défini ci-après"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[421550,1052580]},"properties":{"nom":"B","description":"Intersection de l’axe de la route départementale n° 304 allant de Sillé-le-Guillaume à Conlie et de l’axe de la route départementale n° 167 allant à Rouez"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[419700,1049590]},"properties":{"nom":"C","description":"Intersection de la droite joignant l’axe du clocher de Sillé-le-Guillaume et l’axe du clocher de Tennie, et de la droite joignant l’axe du clocher de Parennes et l’axe du clocher de Conlie"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[418630,1049590]},"properties":{"nom":"D","description":"Intersection de la droite joignant l’axe du clocher de Parennes et l’axe du clocher de Conlie et de la droite joignant l’axe du clocher de Rouez et l’axe du clocher de Bernay"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[417552,1051723]},"properties":{"nom":"E","description":"Axe du clocher de Rouez"}}]},"geojson_origine_geo_systeme_id":"27571","geojson4326_forages":null,"geojson_origine_forages":null,"surface":8,"communes":[{"id":"72256","nom":"Rouez"},{"id":"72351","nom":"Tennie"}],"secteurs_maritimes":[],"sdom_zones":[],"forets":[]}},"etape_statut_id":"acc","is_brouillon":false,"date":"1988-09-01","id":"OxqtxQwW0B3AUIHFR7k32Ycl","ordre":2,"notes":null,"slug":"m-cx-chantepie-1988-oct01-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000000681488"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"INDE8800659D"}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":600,"substances":["auru","arge","cuiv","ferx","plom","souf","zinc","scoc"],"titulaireIds":["fr-632022711"],"amodiataireIds":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-0.105658320330431,48.1489209342693],[-0.115003633563279,48.1398379979624],[-0.0996023094257926,48.1209828190687],[-0.0852402595925762,48.1212930049111],[-0.0616864580218711,48.1486971325525],[-0.105658320330431,48.1489209342693]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.105658320330431,48.1489209342693]},"properties":{"nom":"A","description":"Intersection de l'axe de la route départementale n° 103, joignant Rouez et Crissé et de la droite joignant l'intersection de l'axe de la rivière La Vègre avec la limite des communes de Sillé-le-Guillaume et de Rouez, d'une part, au sommet B défini ci-après"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0616864580218711,48.1486971325525]},"properties":{"nom":"B","description":"Intersection de l'axe de la route départementale n° 304 allant de Sillé-le-Guillaume à Conlie et de l'axe de la route départementale n° 167 allant à Rouez"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0852402595925762,48.1212930049111]},"properties":{"nom":"C","description":"Intersection de la droite joignant l'axe du clocher de Sillé-le-Guillaume et l'axe du clocher de Tennie, et de la droite joignant l'axe du clocher de Parennes et l'axe du clocher de Conlie"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.0996023094257926,48.1209828190687]},"properties":{"nom":"D","description":"Intersection de la droite joignant l'axe du clocher de Parennes et l'axe du clocher de Conlie et de la droite joignant l'axe du clocher de Rouez et l'axe du clocher de Bernay"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.115003633563279,48.1398379979624]},"properties":{"nom":"E","description":"Axe du clocher de Rouez"}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[418280,1052710],[421550,1052580],[419700,1049590],[418630,1049590],[417552,1051723],[418280,1052710]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[418280,1052710]},"properties":{"nom":"A","description":"Intersection de l’axe de la route départementale n° 103, joignant Rouez et Crissé et de la droite joignant l’intersection de l’axe de la rivière La Vègre avec la limite des communes de Sillé-le-Guillaume et de Rouez, d’une part, au sommet B défini ci-après"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[421550,1052580]},"properties":{"nom":"B","description":"Intersection de l’axe de la route départementale n° 304 allant de Sillé-le-Guillaume à Conlie et de l’axe de la route départementale n° 167 allant à Rouez"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[419700,1049590]},"properties":{"nom":"C","description":"Intersection de la droite joignant l’axe du clocher de Sillé-le-Guillaume et l’axe du clocher de Tennie, et de la droite joignant l’axe du clocher de Parennes et l’axe du clocher de Conlie"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[418630,1049590]},"properties":{"nom":"D","description":"Intersection de la droite joignant l’axe du clocher de Parennes et l’axe du clocher de Conlie et de la droite joignant l’axe du clocher de Rouez et l’axe du clocher de Bernay"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[417552,1051723]},"properties":{"nom":"E","description":"Axe du clocher de Rouez"}}]},"geojson_origine_geo_systeme_id":"27571","geojson4326_forages":null,"geojson_origine_forages":null,"surface":8,"communes":[{"id":"72256","nom":"Rouez"},{"id":"72351","nom":"Tennie"}],"secteurs_maritimes":[],"sdom_zones":[],"forets":[]}},"etape_statut_id":"acc","is_brouillon":false,"date":"1988-08-24","id":"XkNmBmjc6YYY6OEncdCAldnU","ordre":1,"notes":null,"slug":"m-cx-chantepie-1988-oct01-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]}],"demarche_type_id":"oct","demarche_statut_id":"acc","demarche_date_debut":"1988-09-01","demarche_date_fin":"2038-09-01","ordre":1},{"id":"mkPvJYXFO2InPppXamCRo2Cv","slug":"m-cx-chantepie-1988-mut01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaireIds":["fr-409160132"],"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2000-06-06","id":"lc3diJKRphb029ufvF73FlSn","ordre":2,"notes":null,"slug":"m-cx-chantepie-1988-mut01-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000000765254"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOI0000251A"}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaireIds":["fr-409160132"],"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2000-05-25","id":"2n1RaQcCxZMVta2Qfv1pUIRS","ordre":1,"notes":null,"slug":"m-cx-chantepie-1988-mut01-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]}],"demarche_type_id":"mut","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":2}],"nb_activites_to_do":null}) chantepieData.nom = 'Chantepie avec un titre assez long' chantepieData.nb_activites_to_do = 2 @@ -434,7 +436,7 @@ const criqueAdolpheApiClient: PropsApiClient = { getTitreAction(titreIdOrSlug) // prettier-ignore - const criqueAdolpheData = titreGetValidator.parse({"id":"tbFvGIDboAzxTb54GQyghTyc","nom":"Crique Adolphe","slug":"m-ar-crique-adolphe-2023","titre_type_id":"arm","titre_statut_id":"ech","titre_doublon":null,"references":[{"nom":"2022-032","referenceTypeId":"ptm"},{"nom":"AR 2022-027","referenceTypeId":"onf"}],"titre_last_modified_date":"2023-10-20","demarches":[{"id":"yAvBOMdHDsyES7phbS5hRKLA","slug":"m-ar-crique-adolphe-2023-oct01","description":null,"etapes":[{"etape_type_id":"sco","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"fai","is_brouillon":false,"date":"2023-09-19","id":"5649942721fd9f3478381ae9","ordre":16,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-sco01","sections_with_values":[{"id":"suivi","nom":"Suivi de la démarche","elements":[{"id":"signataire","nom":"Signataire ONF","description":"Prénom et nom du représentant légal du titulaire de l'ONF","optionnel":true,"type":"text","value":null},{"id":"titulaire","nom":"Signataire titulaire","description":"Prénom et nom du représentant légal du titulaire de l'autorisation","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"aca","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"fav","is_brouillon":false,"date":"2023-01-11","id":"oXXG5ToIYbw8MvdYPX7sMMAP","ordre":12,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-aca01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"sca","etape_statut_id":"fai","is_brouillon":false,"date":"2023-01-11","id":"WLXKWB9Fv17gm2gTJYIXnTyX","ordre":11,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-sca01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"rde","etape_statut_id":"fav","is_brouillon":false,"date":"2022-12-29","id":"y0SCXGJ1OBYSthcWyojyOLZX","ordre":9,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-rde01","sections_with_values":[{"id":"deal","nom":"DEAL","elements":[{"id":"numero-dossier-deal-eau","nom":"Numéro de dossier","description":"Numéro de dossier DEAL Service eau","optionnel":true,"type":"text","value":""},{"id":"numero-recepisse","nom":"Numéro de récépissé","description":"Numéro de récépissé émis par la DEAL Service eau","optionnel":true,"type":"text","value":"R03-2022-12-29-00005"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mcr","etape_statut_id":"fav","is_brouillon":false,"date":"2022-12-05","id":"0vdB4jaJbpIpyUnIZkKPsmCm","ordre":7,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-mcr01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mdp","etape_statut_id":"fai","is_brouillon":false,"date":"2022-11-08","id":"pF4UG6UrCOJmKjtgmtpwthTQ","ordre":4,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-mdp01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mfr","fondamentale":{"date_debut":null,"date_fin":null,"duree":4,"substances":["auru"],"titulaireIds":["fr-794312231"],"amodiataireIds":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.58181013905019,3.8309654861273],[-53.58178306390299,3.8219278216269807],[-53.572785590706495,3.82195493825841],[-53.57281257175149,3.8309926670647294],[-53.58181013905019,3.8309654861273]]],[[[-53.60031408473134,3.8224780986447566],[-53.59891645305842,3.8181831495446303],[-53.58181205656814,3.82379854768971],[-53.58320964990986,3.828093576227541],[-53.60031408473134,3.8224780986447566]]],[[[-53.583861926103765,3.8502114455117433],[-53.592379712320195,3.834289122043602],[-53.588417035915334,3.8321501920354253],[-53.57989914401643,3.8480725119510217],[-53.583861926103765,3.8502114455117433]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.58181013905019,3.8309654861273]},"properties":{"nom":"S1","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.57281257175149,3.8309926670647294]},"properties":{"nom":"S2","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.572785590706495,3.82195493825841]},"properties":{"nom":"S3","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.58178306390299,3.8219278216269807]},"properties":{"nom":"S4","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.60031408473134,3.8224780986447566]},"properties":{"nom":"S5","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.58320964990986,3.828093576227541]},"properties":{"nom":"S6","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.58181205656814,3.82379854768971]},"properties":{"nom":"S7","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.59891645305842,3.8181831495446303]},"properties":{"nom":"S8","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.583861926103765,3.8502114455117433]},"properties":{"nom":"S9","description":"ARM3.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.57989914401643,3.8480725119510217]},"properties":{"nom":"S10","description":"ARM3.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.588417035915334,3.8321501920354253]},"properties":{"nom":"S11","description":"ARM3.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.592379712320195,3.834289122043602]},"properties":{"nom":"S12","description":"ARM3.3"}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[213250,423875],[214250,423875],[214250,422875],[213250,422875],[213250,423875]]],[[[211190.6,422942.1],[213093.5,423557.7],[213247.4,423082],[211344.5,422466.4],[211190.6,422942.1]]],[[[213028.4,426005.2],[213468.1,425767.2],[212516.1,424008.3],[212076.4,424246.3],[213028.4,426005.2]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[213250,423875]},"properties":{"nom":"S1","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[214250,423875]},"properties":{"nom":"S2","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[214250,422875]},"properties":{"nom":"S3","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[213250,422875]},"properties":{"nom":"S4","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[211190.6,422942.1]},"properties":{"nom":"S5","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[213093.5,423557.7]},"properties":{"nom":"S6","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[213247.4,423082]},"properties":{"nom":"S7","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[211344.5,422466.4]},"properties":{"nom":"S8","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[213028.4,426005.2]},"properties":{"nom":"S9","description":"ARM3.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[213468.1,425767.2]},"properties":{"nom":"S10","description":"ARM3.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[212516.1,424008.3]},"properties":{"nom":"S11","description":"ARM3.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[212076.4,424246.3]},"properties":{"nom":"S12","description":"ARM3.3"}}]},"geojson_origine_geo_systeme_id":"2972","geojson4326_forages":null,"geojson_origine_forages":null,"surface":3,"communes":[{"id":"97353","nom":"Maripasoula"}],"secteurs_maritimes":[],"sdom_zones":[],"forets":[]}},"etape_statut_id":"fai","is_brouillon":false,"date":"2022-11-08","id":"pwqOEAsAmaWi0o24QiVeVZ40","ordre":3,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-mfr01","sections_with_values":[{"id":"arm","nom":"Caractéristiques ARM","elements":[{"id":"mecanise","nom":"Prospection mécanisée","description":"","type":"radio","value":true},{"id":"franchissements","nom":"Franchissements de cours d'eau","description":"Nombre de franchissements de cours d'eau","optionnel":true,"type":"integer","value":12}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dae","etape_statut_id":"exe","is_brouillon":false,"date":"2022-09-26","id":"KA7tyvIdlqQmmVOuVjEl0Hdt","ordre":1,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-dae01","sections_with_values":[{"id":"mea","nom":"Mission autorité environnementale","elements":[{"id":"arrete","nom":"Arrêté préfectoral","description":"Numéro de l'arrêté préfectoral portant décision dans le cadre de l’examen au cas par cas du projet d’autorisation de recherche minière","optionnel":true,"type":"text","value":"R03-2022-09-26-00002"}]}],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"oct","demarche_statut_id":"acc","demarche_date_debut":"2023-09-19","demarche_date_fin":"2024-01-19","ordre":1}],"nb_activites_to_do":null}) + const criqueAdolpheData = titreGetValidator.parse({"id":"tbFvGIDboAzxTb54GQyghTyc","nom":"Crique Adolphe","slug":"m-ar-crique-adolphe-2023","titre_type_id":"arm","titre_statut_id":"ech","titre_doublon":null,"references":[{"nom":"2022-032","referenceTypeId":"ptm"},{"nom":"AR 2022-027","referenceTypeId":"onf"}],"titre_last_modified_date":"2023-10-20","demarches":[{"id":"yAvBOMdHDsyES7phbS5hRKLA","slug":"m-ar-crique-adolphe-2023-oct01","description":null,"etapes":[{"etape_type_id":"sco","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"fai","is_brouillon":false,"date":"2023-09-19","id":"5649942721fd9f3478381ae9","ordre":16,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-sco01","sections_with_values":[{"id":"suivi","nom":"Suivi de la démarche","elements":[{"id":"signataire","nom":"Signataire ONF","description":"Prénom et nom du représentant légal du titulaire de l'ONF","optionnel":true,"type":"text","value":null},{"id":"titulaire","nom":"Signataire titulaire","description":"Prénom et nom du représentant légal du titulaire de l'autorisation","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"sca","etape_statut_id":"fai","is_brouillon":false,"date":"2023-01-11","id":"WLXKWB9Fv17gm2gTJYIXnTyX","ordre":11,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-sca01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"aca","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"fav","is_brouillon":false,"date":"2023-01-11","id":"oXXG5ToIYbw8MvdYPX7sMMAP","ordre":12,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-aca01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"rde","etape_statut_id":"fav","is_brouillon":false,"date":"2022-12-29","id":"y0SCXGJ1OBYSthcWyojyOLZX","ordre":9,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-rde01","sections_with_values":[{"id":"deal","nom":"DEAL","elements":[{"id":"numero-dossier-deal-eau","nom":"Numéro de dossier","description":"Numéro de dossier DEAL Service eau","optionnel":true,"type":"text","value":""},{"id":"numero-recepisse","nom":"Numéro de récépissé","description":"Numéro de récépissé émis par la DEAL Service eau","optionnel":true,"type":"text","value":"R03-2022-12-29-00005"}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"mcr","etape_statut_id":"fav","is_brouillon":false,"date":"2022-12-05","id":"0vdB4jaJbpIpyUnIZkKPsmCm","ordre":7,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-mcr01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"mfr","fondamentale":{"date_debut":null,"date_fin":null,"duree":4,"substances":["auru"],"titulaireIds":["fr-794312231"],"amodiataireIds":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.58181013905019,3.8309654861273],[-53.58178306390299,3.8219278216269807],[-53.572785590706495,3.82195493825841],[-53.57281257175149,3.8309926670647294],[-53.58181013905019,3.8309654861273]]],[[[-53.60031408473134,3.8224780986447566],[-53.59891645305842,3.8181831495446303],[-53.58181205656814,3.82379854768971],[-53.58320964990986,3.828093576227541],[-53.60031408473134,3.8224780986447566]]],[[[-53.583861926103765,3.8502114455117433],[-53.592379712320195,3.834289122043602],[-53.588417035915334,3.8321501920354253],[-53.57989914401643,3.8480725119510217],[-53.583861926103765,3.8502114455117433]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.58181013905019,3.8309654861273]},"properties":{"nom":"S1","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.57281257175149,3.8309926670647294]},"properties":{"nom":"S2","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.572785590706495,3.82195493825841]},"properties":{"nom":"S3","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.58178306390299,3.8219278216269807]},"properties":{"nom":"S4","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.60031408473134,3.8224780986447566]},"properties":{"nom":"S5","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.58320964990986,3.828093576227541]},"properties":{"nom":"S6","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.58181205656814,3.82379854768971]},"properties":{"nom":"S7","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.59891645305842,3.8181831495446303]},"properties":{"nom":"S8","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.583861926103765,3.8502114455117433]},"properties":{"nom":"S9","description":"ARM3.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.57989914401643,3.8480725119510217]},"properties":{"nom":"S10","description":"ARM3.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.588417035915334,3.8321501920354253]},"properties":{"nom":"S11","description":"ARM3.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.592379712320195,3.834289122043602]},"properties":{"nom":"S12","description":"ARM3.3"}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[213250,423875],[214250,423875],[214250,422875],[213250,422875],[213250,423875]]],[[[211190.6,422942.1],[213093.5,423557.7],[213247.4,423082],[211344.5,422466.4],[211190.6,422942.1]]],[[[213028.4,426005.2],[213468.1,425767.2],[212516.1,424008.3],[212076.4,424246.3],[213028.4,426005.2]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[213250,423875]},"properties":{"nom":"S1","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[214250,423875]},"properties":{"nom":"S2","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[214250,422875]},"properties":{"nom":"S3","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[213250,422875]},"properties":{"nom":"S4","description":"ARM1.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[211190.6,422942.1]},"properties":{"nom":"S5","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[213093.5,423557.7]},"properties":{"nom":"S6","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[213247.4,423082]},"properties":{"nom":"S7","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[211344.5,422466.4]},"properties":{"nom":"S8","description":"ARM2.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[213028.4,426005.2]},"properties":{"nom":"S9","description":"ARM3.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[213468.1,425767.2]},"properties":{"nom":"S10","description":"ARM3.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[212516.1,424008.3]},"properties":{"nom":"S11","description":"ARM3.3"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[212076.4,424246.3]},"properties":{"nom":"S12","description":"ARM3.3"}}]},"geojson_origine_geo_systeme_id":"2972","geojson4326_forages":null,"geojson_origine_forages":null,"surface":3,"communes":[{"id":"97353","nom":"Maripasoula"}],"secteurs_maritimes":[],"sdom_zones":[],"forets":[]}},"etape_statut_id":"fai","is_brouillon":false,"date":"2022-11-08","id":"pwqOEAsAmaWi0o24QiVeVZ40","ordre":3,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-mfr01","sections_with_values":[{"id":"arm","nom":"Caractéristiques ARM","elements":[{"id":"mecanise","nom":"Prospection mécanisée","description":"","type":"radio","value":true},{"id":"franchissements","nom":"Franchissements de cours d'eau","description":"Nombre de franchissements de cours d'eau","optionnel":true,"type":"integer","value":12}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"mdp","etape_statut_id":"fai","is_brouillon":false,"date":"2022-11-08","id":"pF4UG6UrCOJmKjtgmtpwthTQ","ordre":4,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-mdp01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"dae","etape_statut_id":"exe","is_brouillon":false,"date":"2022-09-26","id":"KA7tyvIdlqQmmVOuVjEl0Hdt","ordre":1,"notes":null,"slug":"m-ar-crique-adolphe-2023-oct01-dae01","sections_with_values":[{"id":"mea","nom":"Mission autorité environnementale","elements":[{"id":"arrete","nom":"Arrêté préfectoral","description":"Numéro de l'arrêté préfectoral portant décision dans le cadre de l’examen au cas par cas du projet d’autorisation de recherche minière","optionnel":true,"type":"text","value":"R03-2022-09-26-00002"}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]}],"demarche_type_id":"oct","demarche_statut_id":"acc","demarche_date_debut":"2023-09-19","demarche_date_fin":"2024-01-19","ordre":1}],"nb_activites_to_do":null}) criqueAdolpheData.nb_activites_to_do = 0 return Promise.resolve(criqueAdolpheData) @@ -460,7 +462,7 @@ const abattisKoticaApiClient: PropsApiClient = { getTitreAction(titreIdOrSlug) // prettier-ignore - const abattisData = titreGetValidator.parse({"id":"ooyCY2eGMXLunjmwPbBYyQcf","nom":"Abattis Kotika","slug":"m-ar-abattis-kotika-2006","titre_type_id":"arm","titre_statut_id":"ech","titre_doublon":null,"references":[{"nom":"AR2006060","referenceTypeId":"onf"},{"nom":"2006-061","referenceTypeId":"ptm"}],"titre_last_modified_date":null,"demarches":[{"id":"SjKhYLXdqcla1BaN3nmgQhPs","slug":"m-ar-abattis-kotika-2006-oct01","description":null,"etapes":[{"etape_type_id":"def","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2006-11-28","id":"Pw734o5mdB2K2AWaOKQ85Ydz","ordre":5,"notes":null,"slug":"m-ar-abattis-kotika-2006-oct01-def01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"sco","fondamentale":{"date_debut":null,"date_fin":"2007-03-27","duree":4,"substances":["auru"],"titulaireIds":["fr-480857036"],"amodiataireIds":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-54.256565011133,3.95310428827045],[-54.2571944444789,3.94846823388004],[-54.2392714613677,3.9464520807474],[-54.2387665564076,3.95076254570704],[-54.256565011133,3.95310428827045]]],[[[-54.251541223062,3.94479622927321],[-54.251001625524,3.94017377611083],[-54.2330489949186,3.94209562569541],[-54.2335613570663,3.94667311503072],[-54.251541223062,3.94479622927321]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.256565011133,3.95310428827045]},"properties":{"nom":"1","description":"a"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2387665564076,3.95076254570704]},"properties":{"nom":"2","description":"b"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2392714613677,3.9464520807474]},"properties":{"nom":"3","description":"c"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2571944444789,3.94846823388004]},"properties":{"nom":"4","description":"d"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.251541223062,3.94479622927321]},"properties":{"nom":"1","description":"e"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2335613570663,3.94667311503072]},"properties":{"nom":"2","description":"f"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2330489949186,3.94209562569541]},"properties":{"nom":"3","description":"g"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.251001625524,3.94017377611083]},"properties":{"nom":"4","description":"h"}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[138288,437653],[140266,437386],[140208,436909],[138216,437140],[138288,437653]]],[[[138843,436731],[140843,436931],[140898,436424],[138901,436219],[138843,436731]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[138288,437653]},"properties":{"nom":"1","description":"a"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[140266,437386]},"properties":{"nom":"2","description":"b"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[140208,436909]},"properties":{"nom":"3","description":"c"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[138216,437140]},"properties":{"nom":"4","description":"d"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[138843,436731]},"properties":{"nom":"1","description":"e"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[140843,436931]},"properties":{"nom":"2","description":"f"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[140898,436424]},"properties":{"nom":"3","description":"g"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[138901,436219]},"properties":{"nom":"4","description":"h"}}]},"geojson_origine_geo_systeme_id":"2972","geojson4326_forages":null,"geojson_origine_forages":null,"surface":2,"communes":[{"id":"97362","nom":"Papaichton"}],"secteurs_maritimes":[],"sdom_zones":["0_potentielle","2"],"forets":[]}},"etape_statut_id":"fai","is_brouillon":false,"date":"2006-11-28","id":"1iF8kbcg0oGaEMAJxgUZYk8W","ordre":6,"notes":null,"slug":"m-ar-abattis-kotika-2006-oct01-sco01","sections_with_values":[{"id":"arm","nom":"Caractéristiques ARM","elements":[{"id":"mecanise","nom":"Prospection mécanisée","type":"radio","value":null}]},{"id":"suivi","nom":"Suivi de la démarche","elements":[{"id":"signataire","nom":"Signataire ONF","description":"Prénom et nom du représentant légal du titulaire de l'ONF","optionnel":true,"type":"text","value":"Michel Borderes"},{"id":"titulaire","nom":"Signataire titulaire","description":"Prénom et nom du représentant légal du titulaire de l'autorisation","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"men","etape_statut_id":"fai","is_brouillon":false,"date":"2006-10-16","id":"TMWQQo20x3j7BJ8Sboaq1B20","ordre":2,"notes":null,"slug":"m-ar-abattis-kotika-2006-oct01-men01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"oct","demarche_statut_id":"acc","demarche_date_debut":"2006-11-28","demarche_date_fin":"2007-03-27","ordre":1}],"nb_activites_to_do":null}) + const abattisData = titreGetValidator.parse({"id":"ooyCY2eGMXLunjmwPbBYyQcf","nom":"Abattis Kotika","slug":"m-ar-abattis-kotika-2006","titre_type_id":"arm","titre_statut_id":"ech","titre_doublon":null,"references":[{"nom":"AR2006060","referenceTypeId":"onf"},{"nom":"2006-061","referenceTypeId":"ptm"}],"titre_last_modified_date":null,"demarches":[{"id":"SjKhYLXdqcla1BaN3nmgQhPs","slug":"m-ar-abattis-kotika-2006-oct01","description":null,"etapes":[{"etape_type_id":"def","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2006-11-28","id":"Pw734o5mdB2K2AWaOKQ85Ydz","ordre":5,"notes":null,"slug":"m-ar-abattis-kotika-2006-oct01-def01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"sco","fondamentale":{"date_debut":null,"date_fin":"2007-03-27","duree":4,"substances":["auru"],"titulaireIds":["fr-480857036"],"amodiataireIds":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-54.256565011133,3.95310428827045],[-54.2571944444789,3.94846823388004],[-54.2392714613677,3.9464520807474],[-54.2387665564076,3.95076254570704],[-54.256565011133,3.95310428827045]]],[[[-54.251541223062,3.94479622927321],[-54.251001625524,3.94017377611083],[-54.2330489949186,3.94209562569541],[-54.2335613570663,3.94667311503072],[-54.251541223062,3.94479622927321]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.256565011133,3.95310428827045]},"properties":{"nom":"1","description":"a"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2387665564076,3.95076254570704]},"properties":{"nom":"2","description":"b"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2392714613677,3.9464520807474]},"properties":{"nom":"3","description":"c"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2571944444789,3.94846823388004]},"properties":{"nom":"4","description":"d"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.251541223062,3.94479622927321]},"properties":{"nom":"1","description":"e"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2335613570663,3.94667311503072]},"properties":{"nom":"2","description":"f"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.2330489949186,3.94209562569541]},"properties":{"nom":"3","description":"g"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-54.251001625524,3.94017377611083]},"properties":{"nom":"4","description":"h"}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[138288,437653],[140266,437386],[140208,436909],[138216,437140],[138288,437653]]],[[[138843,436731],[140843,436931],[140898,436424],[138901,436219],[138843,436731]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[138288,437653]},"properties":{"nom":"1","description":"a"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[140266,437386]},"properties":{"nom":"2","description":"b"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[140208,436909]},"properties":{"nom":"3","description":"c"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[138216,437140]},"properties":{"nom":"4","description":"d"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[138843,436731]},"properties":{"nom":"1","description":"e"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[140843,436931]},"properties":{"nom":"2","description":"f"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[140898,436424]},"properties":{"nom":"3","description":"g"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[138901,436219]},"properties":{"nom":"4","description":"h"}}]},"geojson_origine_geo_systeme_id":"2972","geojson4326_forages":null,"geojson_origine_forages":null,"surface":2,"communes":[{"id":"97362","nom":"Papaichton"}],"secteurs_maritimes":[],"sdom_zones":["0_potentielle","2"],"forets":[]}},"etape_statut_id":"fai","is_brouillon":false,"date":"2006-11-28","id":"1iF8kbcg0oGaEMAJxgUZYk8W","ordre":6,"notes":null,"slug":"m-ar-abattis-kotika-2006-oct01-sco01","sections_with_values":[{"id":"arm","nom":"Caractéristiques ARM","elements":[{"id":"mecanise","nom":"Prospection mécanisée","type":"radio","value":null}]},{"id":"suivi","nom":"Suivi de la démarche","elements":[{"id":"signataire","nom":"Signataire ONF","description":"Prénom et nom du représentant légal du titulaire de l'ONF","optionnel":true,"type":"text","value":"Michel Borderes"},{"id":"titulaire","nom":"Signataire titulaire","description":"Prénom et nom du représentant légal du titulaire de l'autorisation","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"men","etape_statut_id":"fai","is_brouillon":false,"date":"2006-10-16","id":"TMWQQo20x3j7BJ8Sboaq1B20","ordre":2,"notes":null,"slug":"m-ar-abattis-kotika-2006-oct01-men01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]}],"demarche_type_id":"oct","demarche_statut_id":"acc","demarche_date_debut":"2006-11-28","demarche_date_fin":"2007-03-27","ordre":1}],"nb_activites_to_do":null}) abattisData.nb_activites_to_do = 0 return Promise.resolve(abattisData) @@ -486,15 +488,15 @@ const bonEspoirApiClient: PropsApiClient = { getTitreAction(titreIdOrSlug) // prettier-ignore - const bonEspoirData = titreGetValidator.parse({"id":"sJorD6pQomXTN7oRpyGwLijB","nom":"Bon Espoir","slug":"m-pr-bon-espoir-2001","titre_type_id":"prm","titre_statut_id":"ech","titre_doublon":null,"references":[{"nom":"21/2001","referenceTypeId":"dea"},{"nom":"2013-0033-MI","referenceTypeId":"deb"}],"titre_last_modified_date":"2023-11-30","demarches":[{"id":"ry8fHgRWiKEOE1x1ZANmajh8","slug":"m-pr-bon-espoir-2001-oct01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":"2001-11-01","date_fin":null,"duree":60,"substances":["auru","scoc"],"titulaireIds":null,"amodiataireIds":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.9579321010744,5.07776938770113],[-53.9575232150351,4.98735333700249],[-53.8673626701318,4.98775355007457],[-53.8672265271601,4.95631734759459],[-53.7770631139658,4.95670276466037],[-53.7769878916108,4.93868722476635],[-53.5698730075868,4.93952315477954],[-53.5702069576163,5.02537608911083],[-53.759383911755,5.02460196044417],[-53.7596128864516,5.07864912381548],[-53.9579321010744,5.07776938770113]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9579321010744,5.07776938770113]},"properties":{"nom":"1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7596128864516,5.07864912381548]},"properties":{"nom":"2","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.759383911755,5.02460196044417]},"properties":{"nom":"3","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.5702069576163,5.02537608911083]},"properties":{"nom":"4","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.5698730075868,4.93952315477954]},"properties":{"nom":"5","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7769878916108,4.93868722476635]},"properties":{"nom":"6","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7770631139658,4.95670276466037]},"properties":{"nom":"7","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8672265271601,4.95631734759459]},"properties":{"nom":"8","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8673626701318,4.98775355007457]},"properties":{"nom":"9","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9575232150351,4.98735333700249]},"properties":{"nom":"10","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.957932101,5.077769388],[-53.957523215,4.987353337],[-53.86736267,4.98775355],[-53.867226527,4.956317348],[-53.777063114,4.956702765],[-53.776987892,4.938687225],[-53.569873008,4.939523155],[-53.570206958,5.025376089],[-53.759383912,5.02460196],[-53.759612886,5.078649124],[-53.957932101,5.077769388]]]]}},"geojson_origine_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9579321010744,5.07776938770113]},"properties":{"nom":"1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7596128864516,5.07864912381548]},"properties":{"nom":"2","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.759383911755,5.02460196044417]},"properties":{"nom":"3","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.5702069576163,5.02537608911083]},"properties":{"nom":"4","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.5698730075868,4.93952315477954]},"properties":{"nom":"5","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7769878916108,4.93868722476635]},"properties":{"nom":"6","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7770631139658,4.95670276466037]},"properties":{"nom":"7","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8672265271601,4.95631734759459]},"properties":{"nom":"8","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8673626701318,4.98775355007457]},"properties":{"nom":"9","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9575232150351,4.98735333700249]},"properties":{"nom":"10","description":null}}]},"geojson_origine_geo_systeme_id":"4326","geojson4326_forages":null,"geojson_origine_forages":null,"surface":465.5,"communes":[{"id":"97306","nom":"Mana"},{"id":"97311","nom":"Saint-Laurent-du-Maroni"}],"secteurs_maritimes":[],"sdom_zones":["0","2"],"forets":["LDD","MDF","PAUL"]}},"etape_statut_id":"acc","is_brouillon":false,"date":"2001-10-26","id":"CRVhvEIQAc319vUd8BfZoH5W","ordre":2,"notes":null,"slug":"m-pr-bon-espoir-2001-oct01-dpu01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":3201430},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":"EUR"}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000000774145"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOI0100462D"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2001-10-24","id":"Ce4K8goEZzjqXRJLL051jcpD","ordre":1,"notes":"Décret du 24 octobre 2001 accordant un permis de recherches A en Guyane","slug":"m-pr-bon-espoir-2001-oct01-dex01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"oct","demarche_statut_id":"acc","demarche_date_debut":"2001-11-01","demarche_date_fin":"2006-11-01","ordre":1},{"id":"PnFewl8P4Zt5Vm49zXqyn7Ml","slug":"m-pr-bon-espoir-2001-pr101","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["auru"],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2010-03-02","id":"qtn2a3DNPx258VZgSjqXGKf6","ordre":4,"notes":null,"slug":"m-pr-bon-espoir-2001-pr101-dpu02","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":560000},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":"EUR"}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000021889053"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"DEVO1003938A"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2010-02-17","id":"tjOMgkb83wksMc6DFuqrecbu","ordre":3,"notes":null,"slug":"m-pr-bon-espoir-2001-pr101-dex02","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"2010-02-17-arr-a26ea089","description":"Arrêté du 17 février 2010 modifiant l'arrêté du 6 mai 2009 prolongeant la validité du permis exclusif de recherches de mines d'or dit « Permis de Bon Espoir » et réduisant sa surface (Guyane)","etape_document_type_id":"arr","public_lecture":true,"entreprises_lecture":true}]},{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":"2011-10-31","duree":null,"substances":["auru"],"titulaireIds":null,"amodiataireIds":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.9577777777778,5.07666666666667],[-53.9575,5.0325],[-53.8944444444444,5.00055555555556],[-53.8208333333333,4.97972222222222],[-53.7138888888889,4.96388888888889],[-53.7322222222222,5.02361111111111],[-53.8763888888889,5.02277777777778],[-53.9577777777778,5.07666666666667]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9577777777778,5.07666666666667]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8763888888889,5.02277777777778]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7322222222222,5.02361111111111]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7138888888889,4.96388888888889]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8208333333333,4.97972222222222]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8944444444444,5.00055555555556]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9575,5.0325]},"properties":{"nom":"G","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.957777778,5.076666667],[-53.9575,5.0325],[-53.894444444,5.000555556],[-53.820833333,4.979722222],[-53.713888889,4.963888889],[-53.732222222,5.023611111],[-53.876388889,5.022777778],[-53.957777778,5.076666667]]]]}},"geojson_origine_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9577777777778,5.07666666666667]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8763888888889,5.02277777777778]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7322222222222,5.02361111111111]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7138888888889,4.96388888888889]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8208333333333,4.97972222222222]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8944444444444,5.00055555555556]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9575,5.0325]},"properties":{"nom":"G","description":null}}]},"geojson_origine_geo_systeme_id":"4326","geojson4326_forages":null,"geojson_origine_forages":null,"surface":122.275,"communes":[{"id":"97306","nom":"Mana"},{"id":"97311","nom":"Saint-Laurent-du-Maroni"}],"secteurs_maritimes":[],"sdom_zones":["0","2"],"forets":["LDD","PAUL"]}},"etape_statut_id":"acc","is_brouillon":false,"date":"2009-05-16","id":"07cbyPCYcOtKYkw4kOqg2Sed","ordre":2,"notes":null,"slug":"m-pr-bon-espoir-2001-pr101-dpu01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":837000},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":"EUR"}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000020616467"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"DEVO0909004A"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2009-05-06","id":"orsPMmIfX4kSgVus0HTrBxAo","ordre":1,"notes":null,"slug":"m-pr-bon-espoir-2001-pr101-dex01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"2009-05-06-arr-54f88e41","description":"Arrêté du 6 mai 2009 prolongeant la validité du permis exclusif de recherches de mines d'or dit « Permis Bon Espoir » et réduisant sa superficie (Guyane)","etape_document_type_id":"arr","public_lecture":true,"entreprises_lecture":true}]}],"demarche_type_id":"pr1","demarche_statut_id":"acc","demarche_date_debut":"2006-11-01","demarche_date_fin":"2011-10-31","ordre":2},{"id":"EMFAv33wlGqMcjd6DwKzQBvr","slug":"m-pr-bon-espoir-2001-pr201","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":"2016-10-31","duree":60,"substances":["auru","scoc"],"titulaireIds":["fr-401802863"],"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2015-08-15","id":"Qp5DRYEN3Nc9n4CIwEYW7evs","ordre":9,"notes":null,"slug":"m-pr-bon-espoir-2001-pr201-dpu01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":1250000},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":"EUR"}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000031053068"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"EINL1518062A"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":60,"substances":["auru","scoc"],"titulaireIds":["fr-401802863"],"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2015-08-03","id":"ABvgimvovFWeEhoMOrKi4wAy","ordre":8,"notes":null,"slug":"m-pr-bon-espoir-2001-pr201-dex01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"2015-08-03-arm-8bf71a65","description":"Arrêté du 3 août 2015 prolongeant la durée de validité du permis exclusif de recherches de mines d'or et de substances connexes dit « Permis de Bon Espoir » attribué à la société Armina Ressources Minières dans le département de Guyane","etape_document_type_id":"arm","public_lecture":true,"entreprises_lecture":true}]},{"etape_type_id":"mdp","etape_statut_id":"fai","is_brouillon":false,"date":"2011-06-30","id":"nLXaR7H78V43GB47ypDoqvKz","ordre":2,"notes":null,"slug":"m-pr-bon-espoir-2001-pr201-mdp01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mfr","fondamentale":{"date_debut":null,"date_fin":null,"duree":60,"substances":["auru","arge","cuiv"],"titulaireIds":["fr-401802863"],"amodiataireIds":null,"perimetre":null},"etape_statut_id":"fai","is_brouillon":false,"date":"2011-06-29","id":"iV47juaOeL4EAUsOqiWN6gOO","ordre":1,"notes":null,"slug":"m-pr-bon-espoir-2001-pr201-mfr01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]}],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"pr2","demarche_statut_id":"acc","demarche_date_debut":"2011-10-31","demarche_date_fin":"2016-10-31","ordre":3}],"nb_activites_to_do":null}) + const bonEspoirData = titreGetValidator.parse({"id":"sJorD6pQomXTN7oRpyGwLijB","nom":"Bon Espoir","slug":"m-pr-bon-espoir-2001","titre_type_id":"prm","titre_statut_id":"ech","titre_doublon":null,"references":[{"nom":"21/2001","referenceTypeId":"dea"},{"nom":"2013-0033-MI","referenceTypeId":"deb"}],"titre_last_modified_date":"2023-11-30","demarches":[{"id":"ry8fHgRWiKEOE1x1ZANmajh8","slug":"m-pr-bon-espoir-2001-oct01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":"2001-11-01","date_fin":null,"duree":60,"substances":["auru","scoc"],"titulaireIds":null,"amodiataireIds":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.9579321010744,5.07776938770113],[-53.9575232150351,4.98735333700249],[-53.8673626701318,4.98775355007457],[-53.8672265271601,4.95631734759459],[-53.7770631139658,4.95670276466037],[-53.7769878916108,4.93868722476635],[-53.5698730075868,4.93952315477954],[-53.5702069576163,5.02537608911083],[-53.759383911755,5.02460196044417],[-53.7596128864516,5.07864912381548],[-53.9579321010744,5.07776938770113]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9579321010744,5.07776938770113]},"properties":{"nom":"1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7596128864516,5.07864912381548]},"properties":{"nom":"2","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.759383911755,5.02460196044417]},"properties":{"nom":"3","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.5702069576163,5.02537608911083]},"properties":{"nom":"4","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.5698730075868,4.93952315477954]},"properties":{"nom":"5","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7769878916108,4.93868722476635]},"properties":{"nom":"6","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7770631139658,4.95670276466037]},"properties":{"nom":"7","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8672265271601,4.95631734759459]},"properties":{"nom":"8","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8673626701318,4.98775355007457]},"properties":{"nom":"9","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9575232150351,4.98735333700249]},"properties":{"nom":"10","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.957932101,5.077769388],[-53.957523215,4.987353337],[-53.86736267,4.98775355],[-53.867226527,4.956317348],[-53.777063114,4.956702765],[-53.776987892,4.938687225],[-53.569873008,4.939523155],[-53.570206958,5.025376089],[-53.759383912,5.02460196],[-53.759612886,5.078649124],[-53.957932101,5.077769388]]]]}},"geojson_origine_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9579321010744,5.07776938770113]},"properties":{"nom":"1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7596128864516,5.07864912381548]},"properties":{"nom":"2","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.759383911755,5.02460196044417]},"properties":{"nom":"3","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.5702069576163,5.02537608911083]},"properties":{"nom":"4","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.5698730075868,4.93952315477954]},"properties":{"nom":"5","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7769878916108,4.93868722476635]},"properties":{"nom":"6","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7770631139658,4.95670276466037]},"properties":{"nom":"7","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8672265271601,4.95631734759459]},"properties":{"nom":"8","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8673626701318,4.98775355007457]},"properties":{"nom":"9","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9575232150351,4.98735333700249]},"properties":{"nom":"10","description":null}}]},"geojson_origine_geo_systeme_id":"4326","geojson4326_forages":null,"geojson_origine_forages":null,"surface":465.5,"communes":[{"id":"97311","nom":"Saint-Laurent-du-Maroni"},{"id":"97306","nom":"Mana"}],"secteurs_maritimes":[],"sdom_zones":["0","2"],"forets":["LDD","MDF","PAUL"]}},"etape_statut_id":"acc","is_brouillon":false,"date":"2001-10-26","id":"CRVhvEIQAc319vUd8BfZoH5W","ordre":2,"notes":null,"slug":"m-pr-bon-espoir-2001-oct01-dpu01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":3201430},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":"EUR"}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000000774145"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOI0100462D"}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2001-10-24","id":"Ce4K8goEZzjqXRJLL051jcpD","ordre":1,"notes":"Décret du 24 octobre 2001 accordant un permis de recherches A en Guyane","slug":"m-pr-bon-espoir-2001-oct01-dex01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]}],"demarche_type_id":"oct","demarche_statut_id":"acc","demarche_date_debut":"2001-11-01","demarche_date_fin":"2006-11-01","ordre":1},{"id":"PnFewl8P4Zt5Vm49zXqyn7Ml","slug":"m-pr-bon-espoir-2001-pr101","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["auru"],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2010-03-02","id":"qtn2a3DNPx258VZgSjqXGKf6","ordre":4,"notes":null,"slug":"m-pr-bon-espoir-2001-pr101-dpu02","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":560000},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":"EUR"}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000021889053"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"DEVO1003938A"}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2010-02-17","id":"tjOMgkb83wksMc6DFuqrecbu","ordre":3,"notes":null,"slug":"m-pr-bon-espoir-2001-pr101-dex02","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"2010-02-17-arr-a26ea089","description":"Arrêté du 17 février 2010 modifiant l'arrêté du 6 mai 2009 prolongeant la validité du permis exclusif de recherches de mines d'or dit « Permis de Bon Espoir » et réduisant sa surface (Guyane)","etape_document_type_id":"arr","public_lecture":true,"entreprises_lecture":true}],"avis_documents":[]},{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":"2011-10-31","duree":null,"substances":["auru"],"titulaireIds":null,"amodiataireIds":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.9577777777778,5.07666666666667],[-53.9575,5.0325],[-53.8944444444444,5.00055555555556],[-53.8208333333333,4.97972222222222],[-53.7138888888889,4.96388888888889],[-53.7322222222222,5.02361111111111],[-53.8763888888889,5.02277777777778],[-53.9577777777778,5.07666666666667]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9577777777778,5.07666666666667]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8763888888889,5.02277777777778]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7322222222222,5.02361111111111]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7138888888889,4.96388888888889]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8208333333333,4.97972222222222]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8944444444444,5.00055555555556]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9575,5.0325]},"properties":{"nom":"G","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.957777778,5.076666667],[-53.9575,5.0325],[-53.894444444,5.000555556],[-53.820833333,4.979722222],[-53.713888889,4.963888889],[-53.732222222,5.023611111],[-53.876388889,5.022777778],[-53.957777778,5.076666667]]]]}},"geojson_origine_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9577777777778,5.07666666666667]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8763888888889,5.02277777777778]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7322222222222,5.02361111111111]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.7138888888889,4.96388888888889]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8208333333333,4.97972222222222]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.8944444444444,5.00055555555556]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.9575,5.0325]},"properties":{"nom":"G","description":null}}]},"geojson_origine_geo_systeme_id":"4326","geojson4326_forages":null,"geojson_origine_forages":null,"surface":122.275,"communes":[{"id":"97311","nom":"Saint-Laurent-du-Maroni"},{"id":"97306","nom":"Mana"}],"secteurs_maritimes":[],"sdom_zones":["0","2"],"forets":["LDD","PAUL"]}},"etape_statut_id":"acc","is_brouillon":false,"date":"2009-05-16","id":"07cbyPCYcOtKYkw4kOqg2Sed","ordre":2,"notes":null,"slug":"m-pr-bon-espoir-2001-pr101-dpu01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":837000},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":"EUR"}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000020616467"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"DEVO0909004A"}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2009-05-06","id":"orsPMmIfX4kSgVus0HTrBxAo","ordre":1,"notes":null,"slug":"m-pr-bon-espoir-2001-pr101-dex01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"2009-05-06-arr-54f88e41","description":"Arrêté du 6 mai 2009 prolongeant la validité du permis exclusif de recherches de mines d'or dit « Permis Bon Espoir » et réduisant sa superficie (Guyane)","etape_document_type_id":"arr","public_lecture":true,"entreprises_lecture":true}],"avis_documents":[]}],"demarche_type_id":"pr1","demarche_statut_id":"acc","demarche_date_debut":"2006-11-01","demarche_date_fin":"2011-10-31","ordre":2},{"id":"EMFAv33wlGqMcjd6DwKzQBvr","slug":"m-pr-bon-espoir-2001-pr201","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":"2016-10-31","duree":60,"substances":["auru","scoc"],"titulaireIds":["fr-401802863"],"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2015-08-15","id":"Qp5DRYEN3Nc9n4CIwEYW7evs","ordre":9,"notes":null,"slug":"m-pr-bon-espoir-2001-pr201-dpu01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":1250000},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":"EUR"}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000031053068"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"EINL1518062A"}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":60,"substances":["auru","scoc"],"titulaireIds":["fr-401802863"],"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2015-08-03","id":"ABvgimvovFWeEhoMOrKi4wAy","ordre":8,"notes":null,"slug":"m-pr-bon-espoir-2001-pr201-dex01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"2015-08-03-arm-8bf71a65","description":"Arrêté du 3 août 2015 prolongeant la durée de validité du permis exclusif de recherches de mines d'or et de substances connexes dit « Permis de Bon Espoir » attribué à la société Armina Ressources Minières dans le département de Guyane","etape_document_type_id":"arm","public_lecture":true,"entreprises_lecture":true}],"avis_documents":[]},{"etape_type_id":"mdp","etape_statut_id":"fai","is_brouillon":false,"date":"2011-06-30","id":"nLXaR7H78V43GB47ypDoqvKz","ordre":2,"notes":null,"slug":"m-pr-bon-espoir-2001-pr201-mdp01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"mfr","fondamentale":{"date_debut":null,"date_fin":null,"duree":60,"substances":["auru","arge","cuiv"],"titulaireIds":["fr-401802863"],"amodiataireIds":null,"perimetre":null},"etape_statut_id":"fai","is_brouillon":false,"date":"2011-06-29","id":"iV47juaOeL4EAUsOqiWN6gOO","ordre":1,"notes":null,"slug":"m-pr-bon-espoir-2001-pr201-mfr01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]}],"demarche_type_id":"pr2","demarche_statut_id":"acc","demarche_date_debut":"2011-10-31","demarche_date_fin":"2016-10-31","ordre":3}],"nb_activites_to_do":null}) bonEspoirData.nb_activites_to_do = 0 // prettier-ignore - bonEspoirData.demarches.push(demarcheGetValidator.parse({ "id": "idtravaux", "ordre": 4, "slug": "m-pr-bon-espoir-2001-dam01", "description": null, "etapes": [{"etape_type_id": "wpo", "is_brouillon":false, "ordre": 4,notes: null, "etape_statut_id": "acc","date": "2012-07-23", "id": "idEtapeTravaux1","slug": "m-pr-bon-espoir-2001-dam01-wpo01","sections_with_values": [],"entreprises_documents": [],"etape_documents": [{"id": "2012-07-23-apd-607c3aa8","description": "N°2012-SPR-DRMSS-1","etape_document_type_id": "apd","public_lecture": false,"entreprises_lecture": false }]}, {"etape_type_id": "wpp",is_brouillon: false, "ordre": 3,notes: null,"etape_statut_id": "fai","date": "2011-05-04","id": "idEtapeTravaux2","slug": "m-pr-bon-espoir-2001-dam01-wpp01","sections_with_values": [],"entreprises_documents": [],"etape_documents": [{"id": "id_Document","description": "","etape_document_type_id": "apu","public_lecture": false,"entreprises_lecture": false }]}, {"etape_type_id": "wfd",is_brouillon: false, "ordre": 2,notes: null, "etape_statut_id": "fai","date": "2010-10-01","id": "idEtapeTravaux3","slug": "m-pr-bon-espoir-2001-dam01-wfd01","sections_with_values": [],"entreprises_documents": [],"etape_documents": []}, {"etape_type_id": "wre",is_brouillon: false,"ordre": 1,notes: null,"etape_statut_id": "fav","date": "2010-10-01","id": "idEtapeTravaux4","slug": "m-pr-bon-espoir-2001-dam01-wre01","sections_with_values": [],"entreprises_documents": [],"etape_documents": []}],"demarche_type_id": "dam","demarche_statut_id": "fpm","demarche_date_debut": null,"demarche_date_fin": null + bonEspoirData.demarches.push(demarcheGetValidator.parse({ "id": "idtravaux", "ordre": 4, "slug": "m-pr-bon-espoir-2001-dam01", "description": null, "etapes": [{"etape_type_id": "wpo", "is_brouillon":false, "ordre": 4,notes: null, "etape_statut_id": "acc","date": "2012-07-23", "id": "idEtapeTravaux1","slug": "m-pr-bon-espoir-2001-dam01-wpo01","sections_with_values": [],"entreprises_documents": [],"avis_documents":[],"etape_documents": [{"id": "2012-07-23-apd-607c3aa8","description": "N°2012-SPR-DRMSS-1","etape_document_type_id": "apd","public_lecture": false,"entreprises_lecture": false }]}, {"etape_type_id": "wpp",is_brouillon: ETAPE_IS_NOT_BROUILLON, "ordre": 3,notes: null,"etape_statut_id": "fai","date": "2011-05-04","id": "idEtapeTravaux2","slug": "m-pr-bon-espoir-2001-dam01-wpp01","sections_with_values": [],"entreprises_documents": [],"avis_documents":[],"etape_documents": [{"id": "id_Document","description": "","etape_document_type_id": "apu","public_lecture": false,"entreprises_lecture": false }]}, {"etape_type_id": "wfd",is_brouillon: ETAPE_IS_NOT_BROUILLON, "ordre": 2,notes: null, "etape_statut_id": "fai","date": "2010-10-01","id": "idEtapeTravaux3","slug": "m-pr-bon-espoir-2001-dam01-wfd01","sections_with_values": [],"entreprises_documents": [],"etape_documents": [],"avis_documents":[]}, {"etape_type_id": "wre",is_brouillon: ETAPE_IS_NOT_BROUILLON,"ordre": 1,notes: null,"etape_statut_id": "fav","date": "2010-10-01","id": "idEtapeTravaux4","slug": "m-pr-bon-espoir-2001-dam01-wre01","sections_with_values": [],"entreprises_documents": [],"etape_documents": [],"avis_documents":[]}],"demarche_type_id": "dam","demarche_statut_id": "fpm","demarche_date_debut": null,"demarche_date_fin": null })) // prettier-ignore - bonEspoirData.demarches.push(demarcheGetValidator.parse({"id":"KxHulLhT5XtziPhZDWpFuyA9", "ordre": 5, "slug":"m-pr-bon-espoir-2001-vct01","description":null,"etapes":[{"etape_type_id":"mcr",is_brouillon: false,"etape_statut_id":"fav","date":"2017-08-07","id":"OOKaEetpmAhDX17hcLEFWTZ1","ordre":4,notes: null,"slug":"m-pr-bon-espoir-2001-vct01-mcr01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mdp",is_brouillon: false,"etape_statut_id":"fai","date":"2016-11-07","id":"fNt0G9CmdMc6iIG9x239wZ5E","ordre":2,notes: null,"slug":"m-pr-bon-espoir-2001-vct01-mdp01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mfr",is_brouillon: false,"fondamentale":{"date_debut":null,"date_fin":null,"duree":180,"substances":["auru","scoc"],"titulaireIds":["fr-401802863"],"amodiataireIds":null,"perimetre":{"geojson4326_points": null,"geojson4326_forages":null,"geojson_origine_forages":null,"geojson_origine_points": null, "geojson4326_perimetre":{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-53.95781742722346,5.076877972864504],[-53.95761604147164,5.032517695391918],[-53.894654620091046,5.000735152488521],[-53.82094960753945,4.97999409410299],[-53.71414492282594,4.963998224562106],[-53.73241245985785,5.023653513799631],[-53.87657715038456,5.023033474690702],[-53.95781742722346,5.076877972864504]]]]},"properties":null}, "geojson_origine_perimetre":{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-53.95781742722346,5.076877972864504],[-53.95761604147164,5.032517695391918],[-53.894654620091046,5.000735152488521],[-53.82094960753945,4.97999409410299],[-53.71414492282594,4.963998224562106],[-53.73241245985785,5.023653513799631],[-53.87657715038456,5.023033474690702],[-53.95781742722346,5.076877972864504]]]]},"properties":null},"geojson_origine_geo_systeme_id":"4326","surface":122.275,"communes":[{"id":"97311","nom":"Saint-Laurent-du-Maroni"},{"id":"97306","nom":"Mana"}],"secteurs_maritimes":[],"sdom_zones":["0","2"],"forets":["LDD","PAUL"]}},"etape_statut_id":"fai","date":"2016-10-28","id":"VqBn5DzAtcMQWFY0CIiO6X1A","ordre":1,notes: null,"slug":"m-pr-bon-espoir-2001-vct01-mfr01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]}],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"vct","demarche_statut_id":"ins","demarche_date_debut":"2016-10-31","demarche_date_fin":null})) + bonEspoirData.demarches.push(demarcheGetValidator.parse({"id":"KxHulLhT5XtziPhZDWpFuyA9", "ordre": 5, "slug":"m-pr-bon-espoir-2001-vct01","description":null,"etapes":[{"etape_type_id":"mcr",is_brouillon: ETAPE_IS_NOT_BROUILLON,"etape_statut_id":"fav","date":"2017-08-07","id":"OOKaEetpmAhDX17hcLEFWTZ1","ordre":4,notes: null,"slug":"m-pr-bon-espoir-2001-vct01-mcr01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"mdp",is_brouillon: ETAPE_IS_NOT_BROUILLON,"etape_statut_id":"fai","date":"2016-11-07","id":"fNt0G9CmdMc6iIG9x239wZ5E","ordre":2,notes: null,"slug":"m-pr-bon-espoir-2001-vct01-mdp01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"mfr",is_brouillon: ETAPE_IS_NOT_BROUILLON,"fondamentale":{"date_debut":null,"date_fin":null,"duree":180,"substances":["auru","scoc"],"titulaireIds":["fr-401802863"],"amodiataireIds":null,"perimetre":{"geojson4326_points": null,"geojson4326_forages":null,"geojson_origine_forages":null,"geojson_origine_points": null, "geojson4326_perimetre":{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-53.95781742722346,5.076877972864504],[-53.95761604147164,5.032517695391918],[-53.894654620091046,5.000735152488521],[-53.82094960753945,4.97999409410299],[-53.71414492282594,4.963998224562106],[-53.73241245985785,5.023653513799631],[-53.87657715038456,5.023033474690702],[-53.95781742722346,5.076877972864504]]]]},"properties":null}, "geojson_origine_perimetre":{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-53.95781742722346,5.076877972864504],[-53.95761604147164,5.032517695391918],[-53.894654620091046,5.000735152488521],[-53.82094960753945,4.97999409410299],[-53.71414492282594,4.963998224562106],[-53.73241245985785,5.023653513799631],[-53.87657715038456,5.023033474690702],[-53.95781742722346,5.076877972864504]]]]},"properties":null},"geojson_origine_geo_systeme_id":"4326","surface":122.275,"communes":[{"id":"97311","nom":"Saint-Laurent-du-Maroni"},{"id":"97306","nom":"Mana"}],"secteurs_maritimes":[],"sdom_zones":["0","2"],"forets":["LDD","PAUL"]}},"etape_statut_id":"fai","date":"2016-10-28","id":"VqBn5DzAtcMQWFY0CIiO6X1A","ordre":1,notes: null,"slug":"m-pr-bon-espoir-2001-vct01-mfr01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]}],"entreprises_documents":[],"etape_documents":[], "avis_documents":[]}],"demarche_type_id":"vct","demarche_statut_id":"ins","demarche_date_debut":"2016-10-31","demarche_date_fin":null})) return Promise.resolve(bonEspoirData) }, @@ -545,7 +547,7 @@ const basseManaApiClient: PropsApiClient = { getTitreAction(titreIdOrSlug) // prettier-ignore - const basseManaData = titreGetValidator.parse({"id":"ORKjSbwrb87xE53MsYClV8OF","nom":"Basse Mana","slug":"m-pr-basse-mana-2018","titre_type_id":"prm","titre_statut_id":"sup","titre_doublon":null,"references":[{"nom":"22/2018","referenceTypeId":"dea"},{"nom":"2016-0010-MI","referenceTypeId":"deb"}],"titre_last_modified_date":"2023-12-19","demarches":[{"id":"GnIerujOWqlS3U06Xcbc1Dr0","slug":"m-pr-basse-mana-2018-oct01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":36,"substances":["tant","niob","lith","bery","etai","wolf","tita","auru"],"titulaireIds":["fr-790856850"],"amodiataireIds":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.699125239725,5.29137675727333],[-53.735659753333,5.24333287037071],[-53.6847736578144,5.232646225266],[-53.664223513371,5.23752353831223],[-53.6554344678131,5.25034817283726],[-53.6402449164671,5.25044876137938],[-53.6331053301638,5.26979119871868],[-53.6650166925488,5.27353207619541],[-53.699125239725,5.29137675727333]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.699125239725,5.29137675727333]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6650166925488,5.27353207619541]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6331053301638,5.26979119871868]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6402449164671,5.25044876137938]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6554344678131,5.25034817283726]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.664223513371,5.23752353831223]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6847736578144,5.232646225266]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.735659753333,5.24333287037071]},"properties":{"nom":"H","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[200814,585525],[204589,583534],[208127,583105],[207326,580968],[205641,580964],[204660,579549],[202378,579019],[196738,580226],[200814,585525]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[200814,585525]},"properties":{"nom":"A"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[204589,583534]},"properties":{"nom":"B"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[208127,583105]},"properties":{"nom":"C"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[207326,580968]},"properties":{"nom":"D"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[205641,580964]},"properties":{"nom":"E"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[204660,579549]},"properties":{"nom":"F"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[202378,579019]},"properties":{"nom":"G"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[196738,580226]},"properties":{"nom":"H"}}]},"geojson_origine_geo_systeme_id":"2972","geojson4326_forages":null,"geojson_origine_forages":null,"surface":48,"communes":[{"id":"97306","nom":"Mana"}],"secteurs_maritimes":[],"sdom_zones":["2"],"forets":["BSM"]}},"etape_statut_id":"acc","is_brouillon":false,"date":"2018-09-11","id":"ooH6ZbECJPcDPFsE0McnKvUm","ordre":9,"notes":null,"slug":"m-pr-basse-mana-2018-oct01-dpu01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":150000},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":"EUR"}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000037382008"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOL1816264A"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":36,"substances":["tant","niob","lith","bery","etai","wolf","tita","auru"],"titulaireIds":["fr-790856850"],"amodiataireIds":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.699125239725,5.29137675727333],[-53.735659753333,5.24333287037071],[-53.6847736578144,5.232646225266],[-53.664223513371,5.23752353831223],[-53.6554344678131,5.25034817283726],[-53.6402449164671,5.25044876137938],[-53.6331053301638,5.26979119871868],[-53.6650166925488,5.27353207619541],[-53.699125239725,5.29137675727333]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.699125239725,5.29137675727333]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6650166925488,5.27353207619541]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6331053301638,5.26979119871868]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6402449164671,5.25044876137938]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6554344678131,5.25034817283726]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.664223513371,5.23752353831223]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6847736578144,5.232646225266]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.735659753333,5.24333287037071]},"properties":{"nom":"H","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[200814,585525],[204589,583534],[208127,583105],[207326,580968],[205641,580964],[204660,579549],[202378,579019],[196738,580226],[200814,585525]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[200814,585525]},"properties":{"nom":"A"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[204589,583534]},"properties":{"nom":"B"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[208127,583105]},"properties":{"nom":"C"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[207326,580968]},"properties":{"nom":"D"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[205641,580964]},"properties":{"nom":"E"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[204660,579549]},"properties":{"nom":"F"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[202378,579019]},"properties":{"nom":"G"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[196738,580226]},"properties":{"nom":"H"}}]},"geojson_origine_geo_systeme_id":"2972","geojson4326_forages":null,"geojson_origine_forages":null,"surface":48,"communes":[{"id":"97306","nom":"Mana"}],"secteurs_maritimes":[],"sdom_zones":["2"],"forets":["BSM"]}},"etape_statut_id":"acc","is_brouillon":false,"date":"2018-08-31","id":"KJtV68vswF5ewUyF2jTuLGhS","ordre":8,"notes":null,"slug":"m-pr-basse-mana-2018-oct01-dex01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":150000},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":"EUR"}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":"JORFTEXT000037382008"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOL1816264A"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mdp","etape_statut_id":"fai","is_brouillon":false,"date":"2016-08-28","id":"qVJM9zS6hWyIr3My5OoubQA3","ordre":2,"notes":null,"slug":"m-pr-basse-mana-2018-oct01-mdp01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mfr","fondamentale":{"date_debut":null,"date_fin":null,"duree":36,"substances":["tant","niob","scoc"],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"fai","is_brouillon":false,"date":"2016-06-19","id":"abABihashClZP0lL3NUPELNV","ordre":1,"notes":null,"slug":"m-pr-basse-mana-2018-oct01-mfr01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]}],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"oct","demarche_statut_id":"acc","demarche_date_debut":"2018-09-11","demarche_date_fin":"2021-09-11","ordre":1},{"id":"mZAUVvPyznbzpj3e3grjFmlJ","slug":"m-pr-basse-mana-2018-pr101","description":null,"etapes":[{"etape_type_id":"rpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"fai","is_brouillon":false,"date":"2023-11-17","id":"f76c17ab21ca966988390d92","ordre":11,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-rpu01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2023-11-15","id":"71f6497117b21325d53d8e56","ordre":10,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"Texte 3 sur 160"}]}],"entreprises_documents":[],"etape_documents":[{"id":"2023-11-15-pub-4d420801","description":"","etape_document_type_id":"pub","public_lecture":true,"entreprises_lecture":true}]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":30,"substances":null,"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2023-11-07","id":"590f6dd2f808eeadf51b820e","ordre":9,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"ppc","etape_statut_id":"ter","is_brouillon":false,"date":"2023-04-14","id":"da4a6c74690a6d1ef01ddde2","ordre":6,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-ppc01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"ppu","etape_statut_id":"fai","is_brouillon":false,"date":"2023-03-27","id":"M1mK0vhAHH5CTaUwq4cJzK49","ordre":5,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-ppu01","sections_with_values":[{"id":"opdp","elements":[{"id":"lien","nom":"Lien public externe","description":"","optionnel":true,"type":"url","value":null}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mfr","fondamentale":{"date_debut":null,"date_fin":null,"duree":60,"substances":["tant","niob","lith","bery","etai","wolf","tita","auru"],"titulaireIds":["fr-790856850"],"amodiataireIds":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.699150462397206,5.291394409468797],[-53.73568497160258,5.2433505257409125],[-53.684798879087204,5.232663883719148],[-53.664248736219285,5.2375411971227654],[-53.65545969176547,5.250365830767107],[-53.64027014144058,5.250466419912988],[-53.633130556393525,5.269808855679936],[-53.66511918689031,5.291623119512839],[-53.699150462397206,5.291394409468797]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.699150462397206,5.291394409468797]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66511918689031,5.291623119512839]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.633130556393525,5.269808855679936]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.64027014144058,5.250466419912988]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.65545969176547,5.250365830767107]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.664248736219285,5.2375411971227654]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.684798879087204,5.232663883719148]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.73568497160258,5.2433505257409125]},"properties":{"nom":"H","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[200814,585525],[204589,585534],[208127,583105],[207326,580968],[205641,580964],[204660,579549],[202378,579019],[196738,580226],[200814,585525]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[200814,585525]},"properties":{"nom":"A"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[204589,585534]},"properties":{"nom":"B"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[208127,583105]},"properties":{"nom":"C"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[207326,580968]},"properties":{"nom":"D"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[205641,580964]},"properties":{"nom":"E"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[204660,579549]},"properties":{"nom":"F"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[202378,579019]},"properties":{"nom":"G"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[196738,580226]},"properties":{"nom":"H"}}]},"geojson_origine_geo_systeme_id":"2972","geojson4326_forages":null,"geojson_origine_forages":null,"surface":null,"communes":[{"id":"97306","nom":"Mana"}],"secteurs_maritimes":[],"sdom_zones":["2"],"forets":["BSM"]}},"etape_statut_id":"fai","is_brouillon":false,"date":"2021-04-30","id":"NKW0jIKc5cPBIp2dwu2VceCG","ordre":1,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-mfr01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mdp","etape_statut_id":"fai","is_brouillon":false,"date":"2021-04-30","id":"wFb34sxGyHoRNOByPffQZyAF","ordre":2,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-mdp01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"pr1","demarche_statut_id":"acc","demarche_date_debut":"2021-09-11","demarche_date_fin":"2024-03-11","ordre":2},{"id":"5df48d3536a38dd1dab542d7","slug":"m-pr-basse-mana-2018-pr201","description":"","etapes":[{"etape_type_id":"mdp","etape_statut_id":"fai","is_brouillon":false,"date":"2023-10-30","id":"37a1752da216067fc73328f9","ordre":2,"notes":null,"slug":"m-pr-basse-mana-2018-pr201-mdp01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mfr","fondamentale":{"date_debut":null,"date_fin":null,"duree":60,"substances":["tant","niob","lith","bery","etai","wolf","tita","auru"],"titulaireIds":null,"amodiataireIds":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.695977302723314,5.258026897118486],[-53.69166175320614,5.243894120712839],[-53.691207934852734,5.238962048893827],[-53.66947244758239,5.236434510036549],[-53.66426676493007,5.2375411203489115],[-53.655468706369525,5.250365792413383],[-53.64027010339901,5.25045738302719],[-53.63422022259896,5.267391338838475],[-53.64933956522329,5.274005464773927],[-53.66943759690406,5.2748050575845875],[-53.66988205803166,5.281761503749559],[-53.671594626284566,5.281690874443703],[-53.67432345044184,5.276844434310086],[-53.67742349010169,5.274481516415551],[-53.68523182828244,5.270616251350751],[-53.695977302723314,5.258026897118486]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.695977302723314,5.258026897118486]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.68523182828244,5.270616251350751]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.67742349010169,5.274481516415551]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.67432345044184,5.276844434310086]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.671594626284566,5.281690874443703]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66988205803166,5.281761503749559]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66943759690406,5.2748050575845875]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.64933956522329,5.274005464773927]},"properties":{"nom":"H","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.63422022259896,5.267391338838475]},"properties":{"nom":"I","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.64027010339901,5.25045738302719]},"properties":{"nom":"J","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.655468706369525,5.250365792413383]},"properties":{"nom":"K","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66426676493007,5.2375411203489115]},"properties":{"nom":"L","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66947244758239,5.236434510036549]},"properties":{"nom":"M","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.691207934852734,5.238962048893827]},"properties":{"nom":"N","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.69166175320614,5.243894120712839]},"properties":{"nom":"O","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[201150,581831],[202348,583219],[203216,583643],[203561,583903],[203866,584438],[204056,584445],[204102,583675],[206331,583577],[208005,582838],[207326,580967],[205640,580964],[204658,579549],[204080,579429],[201670,579719],[201622,580265],[201150,581831]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[201150,581831]},"properties":{"nom":"A"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[202348,583219]},"properties":{"nom":"B"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[203216,583643]},"properties":{"nom":"C"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[203561,583903]},"properties":{"nom":"D"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[203866,584438]},"properties":{"nom":"E"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[204056,584445]},"properties":{"nom":"F"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[204102,583675]},"properties":{"nom":"G"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[206331,583577]},"properties":{"nom":"H"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[208005,582838]},"properties":{"nom":"I"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[207326,580967]},"properties":{"nom":"J"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[205640,580964]},"properties":{"nom":"K"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[204658,579549]},"properties":{"nom":"L"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[204080,579429]},"properties":{"nom":"M"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[201670,579719]},"properties":{"nom":"N"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[201622,580265]},"properties":{"nom":"O"}}]},"geojson_origine_geo_systeme_id":"2972","geojson4326_forages":null,"geojson_origine_forages":null,"surface":20.69,"communes":[{"id":"97306","nom":"Mana"}],"secteurs_maritimes":[],"sdom_zones":["2"],"forets":["BSM"]}},"etape_statut_id":"fai","is_brouillon":false,"date":"2023-10-30","id":"47a22a6ca44891d40e2f4149","ordre":1,"notes":null,"slug":"m-pr-basse-mana-2018-pr201-mfr01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]}],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"pr2","demarche_statut_id":"dep","demarche_date_debut":"2024-03-11","demarche_date_fin":null,"ordre":3}],"nb_activites_to_do":null}) + const basseManaData = titreGetValidator.parse({"id":"ORKjSbwrb87xE53MsYClV8OF","nom":"Basse Mana","slug":"m-pr-basse-mana-2018","titre_type_id":"prm","titre_statut_id":"sup","titre_doublon":null,"references":[{"nom":"22/2018","referenceTypeId":"dea"},{"nom":"2016-0010-MI","referenceTypeId":"deb"}],"titre_last_modified_date":"2023-12-19","demarches":[{"id":"GnIerujOWqlS3U06Xcbc1Dr0","slug":"m-pr-basse-mana-2018-oct01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":36,"substances":["tant","niob","lith","bery","etai","wolf","tita","auru"],"titulaireIds":["fr-790856850"],"amodiataireIds":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.699125239725,5.29137675727333],[-53.735659753333,5.24333287037071],[-53.6847736578144,5.232646225266],[-53.664223513371,5.23752353831223],[-53.6554344678131,5.25034817283726],[-53.6402449164671,5.25044876137938],[-53.6331053301638,5.26979119871868],[-53.6650166925488,5.27353207619541],[-53.699125239725,5.29137675727333]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.699125239725,5.29137675727333]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6650166925488,5.27353207619541]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6331053301638,5.26979119871868]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6402449164671,5.25044876137938]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6554344678131,5.25034817283726]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.664223513371,5.23752353831223]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6847736578144,5.232646225266]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.735659753333,5.24333287037071]},"properties":{"nom":"H","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[200814,585525],[204589,583534],[208127,583105],[207326,580968],[205641,580964],[204660,579549],[202378,579019],[196738,580226],[200814,585525]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[200814,585525]},"properties":{"nom":"A"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[204589,583534]},"properties":{"nom":"B"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[208127,583105]},"properties":{"nom":"C"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[207326,580968]},"properties":{"nom":"D"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[205641,580964]},"properties":{"nom":"E"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[204660,579549]},"properties":{"nom":"F"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[202378,579019]},"properties":{"nom":"G"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[196738,580226]},"properties":{"nom":"H"}}]},"geojson_origine_geo_systeme_id":"2972","geojson4326_forages":null,"geojson_origine_forages":null,"surface":48,"communes":[{"id":"97306","nom":"Mana"}],"secteurs_maritimes":[],"sdom_zones":["2"],"forets":["BSM"]}},"etape_statut_id":"acc","is_brouillon":false,"date":"2018-09-11","id":"ooH6ZbECJPcDPFsE0McnKvUm","ordre":9,"notes":null,"slug":"m-pr-basse-mana-2018-oct01-dpu01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":150000},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":"EUR"}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000037382008"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOL1816264A"}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":36,"substances":["tant","niob","lith","bery","etai","wolf","tita","auru"],"titulaireIds":["fr-790856850"],"amodiataireIds":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.699125239725,5.29137675727333],[-53.735659753333,5.24333287037071],[-53.6847736578144,5.232646225266],[-53.664223513371,5.23752353831223],[-53.6554344678131,5.25034817283726],[-53.6402449164671,5.25044876137938],[-53.6331053301638,5.26979119871868],[-53.6650166925488,5.27353207619541],[-53.699125239725,5.29137675727333]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.699125239725,5.29137675727333]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6650166925488,5.27353207619541]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6331053301638,5.26979119871868]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6402449164671,5.25044876137938]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6554344678131,5.25034817283726]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.664223513371,5.23752353831223]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.6847736578144,5.232646225266]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.735659753333,5.24333287037071]},"properties":{"nom":"H","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[200814,585525],[204589,583534],[208127,583105],[207326,580968],[205641,580964],[204660,579549],[202378,579019],[196738,580226],[200814,585525]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[200814,585525]},"properties":{"nom":"A"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[204589,583534]},"properties":{"nom":"B"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[208127,583105]},"properties":{"nom":"C"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[207326,580968]},"properties":{"nom":"D"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[205641,580964]},"properties":{"nom":"E"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[204660,579549]},"properties":{"nom":"F"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[202378,579019]},"properties":{"nom":"G"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[196738,580226]},"properties":{"nom":"H"}}]},"geojson_origine_geo_systeme_id":"2972","geojson4326_forages":null,"geojson_origine_forages":null,"surface":48,"communes":[{"id":"97306","nom":"Mana"}],"secteurs_maritimes":[],"sdom_zones":["2"],"forets":["BSM"]}},"etape_statut_id":"acc","is_brouillon":false,"date":"2018-08-31","id":"KJtV68vswF5ewUyF2jTuLGhS","ordre":8,"notes":null,"slug":"m-pr-basse-mana-2018-oct01-dex01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":150000},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":"EUR"}]},{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":"JORFTEXT000037382008"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOL1816264A"}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"mdp","etape_statut_id":"fai","is_brouillon":false,"date":"2016-08-28","id":"qVJM9zS6hWyIr3My5OoubQA3","ordre":2,"notes":null,"slug":"m-pr-basse-mana-2018-oct01-mdp01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"mfr","fondamentale":{"date_debut":null,"date_fin":null,"duree":36,"substances":["tant","niob","scoc"],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"fai","is_brouillon":false,"date":"2016-06-19","id":"abABihashClZP0lL3NUPELNV","ordre":1,"notes":null,"slug":"m-pr-basse-mana-2018-oct01-mfr01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]}],"demarche_type_id":"oct","demarche_statut_id":"acc","demarche_date_debut":"2018-09-11","demarche_date_fin":"2021-09-11","ordre":1},{"id":"mZAUVvPyznbzpj3e3grjFmlJ","slug":"m-pr-basse-mana-2018-pr101","description":null,"etapes":[{"etape_type_id":"rpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"fai","is_brouillon":false,"date":"2023-11-17","id":"f76c17ab21ca966988390d92","ordre":11,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-rpu01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2023-11-15","id":"71f6497117b21325d53d8e56","ordre":10,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"Texte 3 sur 160"}]}],"entreprises_documents":[],"etape_documents":[{"id":"2023-11-15-pub-4d420801","description":"","etape_document_type_id":"pub","public_lecture":true,"entreprises_lecture":true}],"avis_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":30,"substances":null,"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2023-11-07","id":"590f6dd2f808eeadf51b820e","ordre":9,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"ppc","etape_statut_id":"ter","is_brouillon":false,"date":"2023-04-14","id":"da4a6c74690a6d1ef01ddde2","ordre":6,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-ppc01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"ppu","etape_statut_id":"fai","is_brouillon":false,"date":"2023-03-27","id":"M1mK0vhAHH5CTaUwq4cJzK49","ordre":5,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-ppu01","sections_with_values":[{"id":"opdp","elements":[{"id":"lien","nom":"Lien public externe","description":"","optionnel":true,"type":"url","value":null}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"mdp","etape_statut_id":"fai","is_brouillon":false,"date":"2021-04-30","id":"wFb34sxGyHoRNOByPffQZyAF","ordre":2,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-mdp01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"mfr","fondamentale":{"date_debut":null,"date_fin":null,"duree":60,"substances":["tant","niob","lith","bery","etai","wolf","tita","auru"],"titulaireIds":["fr-790856850"],"amodiataireIds":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.699150462397206,5.291394409468797],[-53.73568497160258,5.2433505257409125],[-53.684798879087204,5.232663883719148],[-53.664248736219285,5.2375411971227654],[-53.65545969176547,5.250365830767107],[-53.64027014144058,5.250466419912988],[-53.633130556393525,5.269808855679936],[-53.66511918689031,5.291623119512839],[-53.699150462397206,5.291394409468797]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.699150462397206,5.291394409468797]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66511918689031,5.291623119512839]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.633130556393525,5.269808855679936]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.64027014144058,5.250466419912988]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.65545969176547,5.250365830767107]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.664248736219285,5.2375411971227654]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.684798879087204,5.232663883719148]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.73568497160258,5.2433505257409125]},"properties":{"nom":"H","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[200814,585525],[204589,585534],[208127,583105],[207326,580968],[205641,580964],[204660,579549],[202378,579019],[196738,580226],[200814,585525]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[200814,585525]},"properties":{"nom":"A"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[204589,585534]},"properties":{"nom":"B"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[208127,583105]},"properties":{"nom":"C"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[207326,580968]},"properties":{"nom":"D"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[205641,580964]},"properties":{"nom":"E"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[204660,579549]},"properties":{"nom":"F"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[202378,579019]},"properties":{"nom":"G"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[196738,580226]},"properties":{"nom":"H"}}]},"geojson_origine_geo_systeme_id":"2972","geojson4326_forages":null,"geojson_origine_forages":null,"surface":null,"communes":[{"id":"97306","nom":"Mana"}],"secteurs_maritimes":[],"sdom_zones":["2"],"forets":["BSM"]}},"etape_statut_id":"fai","is_brouillon":false,"date":"2021-04-30","id":"NKW0jIKc5cPBIp2dwu2VceCG","ordre":1,"notes":null,"slug":"m-pr-basse-mana-2018-pr101-mfr01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]}],"demarche_type_id":"pr1","demarche_statut_id":"acc","demarche_date_debut":"2021-09-11","demarche_date_fin":"2024-03-11","ordre":2},{"id":"5df48d3536a38dd1dab542d7","slug":"m-pr-basse-mana-2018-pr201","description":"","etapes":[{"etape_type_id":"mdp","etape_statut_id":"fai","is_brouillon":false,"date":"2023-10-30","id":"37a1752da216067fc73328f9","ordre":2,"notes":null,"slug":"m-pr-basse-mana-2018-pr201-mdp01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"mfr","fondamentale":{"date_debut":null,"date_fin":null,"duree":60,"substances":["tant","niob","lith","bery","etai","wolf","tita","auru"],"titulaireIds":null,"amodiataireIds":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.695977302723314,5.258026897118486],[-53.69166175320614,5.243894120712839],[-53.691207934852734,5.238962048893827],[-53.66947244758239,5.236434510036549],[-53.66426676493007,5.2375411203489115],[-53.655468706369525,5.250365792413383],[-53.64027010339901,5.25045738302719],[-53.63422022259896,5.267391338838475],[-53.64933956522329,5.274005464773927],[-53.66943759690406,5.2748050575845875],[-53.66988205803166,5.281761503749559],[-53.671594626284566,5.281690874443703],[-53.67432345044184,5.276844434310086],[-53.67742349010169,5.274481516415551],[-53.68523182828244,5.270616251350751],[-53.695977302723314,5.258026897118486]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.695977302723314,5.258026897118486]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.68523182828244,5.270616251350751]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.67742349010169,5.274481516415551]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.67432345044184,5.276844434310086]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.671594626284566,5.281690874443703]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66988205803166,5.281761503749559]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66943759690406,5.2748050575845875]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.64933956522329,5.274005464773927]},"properties":{"nom":"H","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.63422022259896,5.267391338838475]},"properties":{"nom":"I","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.64027010339901,5.25045738302719]},"properties":{"nom":"J","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.655468706369525,5.250365792413383]},"properties":{"nom":"K","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66426676493007,5.2375411203489115]},"properties":{"nom":"L","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.66947244758239,5.236434510036549]},"properties":{"nom":"M","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.691207934852734,5.238962048893827]},"properties":{"nom":"N","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-53.69166175320614,5.243894120712839]},"properties":{"nom":"O","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[201150,581831],[202348,583219],[203216,583643],[203561,583903],[203866,584438],[204056,584445],[204102,583675],[206331,583577],[208005,582838],[207326,580967],[205640,580964],[204658,579549],[204080,579429],[201670,579719],[201622,580265],[201150,581831]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[201150,581831]},"properties":{"nom":"A"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[202348,583219]},"properties":{"nom":"B"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[203216,583643]},"properties":{"nom":"C"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[203561,583903]},"properties":{"nom":"D"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[203866,584438]},"properties":{"nom":"E"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[204056,584445]},"properties":{"nom":"F"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[204102,583675]},"properties":{"nom":"G"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[206331,583577]},"properties":{"nom":"H"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[208005,582838]},"properties":{"nom":"I"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[207326,580967]},"properties":{"nom":"J"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[205640,580964]},"properties":{"nom":"K"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[204658,579549]},"properties":{"nom":"L"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[204080,579429]},"properties":{"nom":"M"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[201670,579719]},"properties":{"nom":"N"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[201622,580265]},"properties":{"nom":"O"}}]},"geojson_origine_geo_systeme_id":"2972","geojson4326_forages":null,"geojson_origine_forages":null,"surface":20.69,"communes":[{"id":"97306","nom":"Mana"}],"secteurs_maritimes":[],"sdom_zones":["2"],"forets":["BSM"]}},"etape_statut_id":"fai","is_brouillon":false,"date":"2023-10-30","id":"47a22a6ca44891d40e2f4149","ordre":1,"notes":null,"slug":"m-pr-basse-mana-2018-pr201-mfr01","sections_with_values":[{"id":"prx","nom":"Propriétés du permis exclusif de recherches","elements":[{"id":"engagement","nom":"Engagement","optionnel":true,"type":"number","value":null},{"id":"engagementDeviseId","nom":"Devise de l'engagement","description":"","optionnel":true,"type":"select","options":[{"id":"EUR","nom":"Euros"},{"id":"FRF","nom":"Francs"},{"id":"XPF","nom":"Francs Pacifique"}],"value":null}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]}],"demarche_type_id":"pr2","demarche_statut_id":"dep","demarche_date_debut":"2024-03-11","demarche_date_fin":null,"ordre":3}],"nb_activites_to_do":null}) return Promise.resolve(basseManaData) }, @@ -683,7 +685,7 @@ const lenoncourtApiClient: PropsApiClient = { getTitreAction(titreIdOrSlug) // prettier-ignore - const lenoncourtData = titreGetValidator.parse({"id":"s7RvqvCAgKs4DxkQBYV93cVx","nom":"Lenoncourt","slug":"m-cx-lenoncourt-1968","titre_type_id":"cxm","titre_statut_id":"val","titre_doublon":null,"references":[{"nom":"2013-0275-MI","referenceTypeId":"deb"},{"nom":"54TM0153","referenceTypeId":"rnt"}],"titre_last_modified_date":"2024-03-21","demarches":[{"id":"ozYnUjy40eru81jUnXz5snv2","slug":"m-cx-lenoncourt-1968-oct01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["nacl"],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"1968-01-24","id":"SG2zAN9QaKBN1hZKqKEgQGpI","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-oct01-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"1968-01-24-dec-89a94bb2","description":"Décret du 13 janvier 1968 instituant la concession de mines de sels de sodium de Lenoncourt (Meurthe-et-Moselle) au profit de la société Les Soudières réunies - La Madeleine-Varangéville","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"1968-01-13","id":"LM2Zk3PwAjrduc4EqmucOjeB","ordre":1,"notes":"Décret du 13 janvier 1968 instituant la concession de mines de sels de sodium de Lenoncourt (Meurthe-et-Moselle) au profit de la société Les Soudières réunies - La Madeleine-Varangéville","slug":"m-cx-lenoncourt-1968-oct01-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"oct","demarche_statut_id":"acc","demarche_date_debut":"1968-01-24","demarche_date_fin":"2024-03-01","ordre":1},{"id":"wM0cpipWSef9lDAHDurJxxhk","slug":"m-cx-lenoncourt-1968-mut01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["selg","selh"],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"1970-11-19","id":"XScxzwDKFxmYtDnkJ7X7qZBi","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-mut01-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"1970-11-19-dec-8a77b142","description":"Décret du 16 novembre 1970 autorisant la mutation de propriété de cinq concessions de mines de sel gemme et de sources salées au profit de la société Produits chimiques Pechlney-Saint-Gobaln.","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaireIds":["fr-606320471"],"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"1970-11-16","id":"ejAqTpzBj82jgF0ShiwMRQmW","ordre":1,"notes":"Décret du 16 novembre 1970 autorisant la mutation de propriété de cinq concessions de mines de sel gemme et de sources salées au profit de la société Produits chimiques Pechlney-Saint-Gobaln.","slug":"m-cx-lenoncourt-1968-mut01-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"mut","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":2},{"id":"1UC2b0ORsm2ezCh6whHzbOKR","slug":"m-cx-lenoncourt-1968-mut02","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["selg","selh"],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"1975-11-27","id":"TjimKkEETzF0yGBG2m085on9","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-mut02-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"1975-11-27-dec-b50a06f5","description":"Décret du 24 novembre 1975 autorisant la mutation de cinq concessions de mines de sel gemme et de sources salées au profit de la Compagnie industrielle et minière","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaireIds":["fr-712025048"],"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"1975-11-24","id":"aYO0zwBFBOZP7VN11JaJDhzI","ordre":1,"notes":"Décret du 24 novembre 1975 autorisant la mutation de cinq concessions de mines de sel gemme et de sources salées au profit de la Compagnie industrielle et minière","slug":"m-cx-lenoncourt-1968-mut02-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"mut","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":3},{"id":"H5eANAZPKhY9eFQtCyLYjCvp","slug":"m-cx-lenoncourt-1968-exp01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["nacl"],"titulaireIds":["fr-712025048"],"amodiataireIds":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[6.275644095814427,48.6854960696669],[6.255874124806144,48.675237870291575],[6.295319143383101,48.66801114312286],[6.316241924966296,48.676189123934925],[6.315656943097024,48.680413137182065],[6.307671761547864,48.69027442550079],[6.302487495007789,48.68919858322589],[6.296317613859298,48.68917495187758],[6.290997693817669,48.68780534512822],[6.285653764289864,48.68913324659737],[6.281744418990354,48.68911774206666],[6.275644095814427,48.6854960696669]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[6.275644095814427,48.6854960696669]},"properties":{"nom":"A","description":"Point situé sur la ligne joignant les clochers de Saulxures-lès-Nancy et de Buissoncourt, à son intersection avec la limite des communes de Saulxures-lès-Nancy et de Lenoncourt, soit à environ 2040 mètres à l'Est-Sud-Est du clocher de Saulxures-lès-Nancy"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.281744418990354,48.68911774206666]},"properties":{"nom":"B1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.285653764289864,48.68913324659737]},"properties":{"nom":"C1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.290997693817669,48.68780534512822]},"properties":{"nom":"D1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.296317613859298,48.68917495187758]},"properties":{"nom":"E1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.302487495007789,48.68919858322589]},"properties":{"nom":"F1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.307671761547864,48.69027442550079]},"properties":{"nom":"G1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.315656943097024,48.680413137182065]},"properties":{"nom":"B","description":"Point situé sur la ligne joignant les clochers de Saulxures-lès-Nancy et de Buissoncourt, à son intersection avec la limite Ouest de la concession de Cercueil-Buissoncourt, soit à environ 2 150 mètres au Nord-Nord-Ouest du clocher de Buissoncourt"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.316241924966296,48.676189123934925]},"properties":{"nom":"C","description":"Borne commune aux concessions d'Art-sur-Meurthe et de Cercueil-Buissoncourt"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.295319143383101,48.66801114312286]},"properties":{"nom":"D","description":"Sommet A de la concession d'Art-sur-Meurthe:"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.255874124806144,48.675237870291575]},"properties":{"nom":"E","description":"Sommet M de la concession d'Art-sur•Meurthe:"}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[889907.42,1117010.26],[890334.9,1117435.93],[890622.24,1117452.72],[891022.89,1117325.88],[891406.04,1117498.53],[891859.53,1117525.03],[892234.39,1117664.59],[892879.34,1116600.52],[892947.15,1116133.73],[891456.2,1115144.46],[888513.03,1115795.21],[889907.42,1117010.26]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[889907.42,1117010.26]},"properties":{"nom":"A","description":"Point situé sur la ligne joignant les clochers de Saulxures-lès-Nancy et de Buissoncourt, à son intersection avec la limite des communes de Saulxures-lès-Nancy et de Lenoncourt, soit à environ 2040 mètres à l’Est-Sud-Est du clocher de Saulxures-lès-Nancy"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[890334.9,1117435.93]},"properties":{"nom":"B1"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[890622.24,1117452.72]},"properties":{"nom":"C1"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[891022.89,1117325.88]},"properties":{"nom":"D1"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[891406.04,1117498.53]},"properties":{"nom":"E1"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[891859.53,1117525.03]},"properties":{"nom":"F1"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[892234.39,1117664.59]},"properties":{"nom":"G1"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[892879.34,1116600.52]},"properties":{"nom":"B","description":"Point situé sur la ligne joignant les clochers de Saulxures-lès-Nancy et de Buissoncourt, à son intersection avec la limite Ouest de la concession de Cercueil-Buissoncourt, soit à environ 2 150 mètres au Nord-Nord-Ouest du clocher de Buissoncourt"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[892947.15,1116133.73]},"properties":{"nom":"C","description":"Borne commune aux concessions d’Art-sur-Meurthe et de Cercueil-Buissoncourt"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[891456.2,1115144.46]},"properties":{"nom":"D","description":"Sommet A de la concession d’Art-sur-Meurthe:"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[888513.03,1115795.21]},"properties":{"nom":"E","description":"Sommet M de la concession d’Art-sur•Meurthe:"}}]},"geojson_origine_geo_systeme_id":"27571","geojson4326_forages":null,"geojson_origine_forages":null,"surface":6.75,"communes":[{"id":"54495","nom":"Saulxures-lès-Nancy"},{"id":"54311","nom":"Lenoncourt"},{"id":"54110","nom":"Cerville"},{"id":"54025","nom":"Art-sur-Meurthe"}],"secteurs_maritimes":[],"sdom_zones":[],"forets":[]}},"etape_statut_id":"acc","is_brouillon":false,"date":"1981-09-13","id":"C6UHWZDSFnLbwuaeksXG1SEj","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-exp01-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"N"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"1981-09-13-dec-8bf8fa4c","description":"Décret du 9 septembre 1981 portant extension de superficie de la concession des mines de sels de sodium de Lenoncourt (Meurthe-et-Moselle) et modifiant les conditions auxquelles est soumise ladite concession","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"1981-09-09","id":"xHxKuYk5goClAaZr1hxGaCyr","ordre":1,"notes":"Décret du 9 septembre 1981 portant extension de superficie de la concession des mines de sels de sodium de Lenoncourt (Meurthe-et-Moselle) et modifiant les conditions auxquelles est soumise ladite concession","slug":"m-cx-lenoncourt-1968-exp01-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"exp","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":4},{"id":"W9IX7VanFA5iYxYAGulcA0CY","slug":"m-cx-lenoncourt-1968-mut03","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["nacl"],"titulaireIds":["fr-442993283"],"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2000-10-06","id":"wuYTEAQ5UUAUZxiowQIthgkg","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-mut03-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000000208330"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOI0000456A"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2000-09-26","id":"f2iSnn7XPrOXDIrbmYFKUiz1","ordre":1,"notes":"Arrêté du 26 septembre 2000 autorisant la mutation de concessions de mines","slug":"m-cx-lenoncourt-1968-mut03-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"mut","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":6},{"id":"md9yLbhZSOqdcOANAAyUPTur","slug":"m-cx-lenoncourt-1968-mut04","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["nacl"],"titulaireIds":["fr-642014526"],"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2003-01-08","id":"yuMPprDNtN6mZzdmlVTDd25I","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-mut04-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000000228627"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"INDI0200856A"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2002-12-24","id":"jZRW7aZo5DmTABnQCe35wVrh","ordre":1,"notes":"Arrêté du 24 décembre 2002 autorisant la mutation de concessions de mines","slug":"m-cx-lenoncourt-1968-mut04-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"mut","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":7},{"id":"3W0rdHS1VqDSIQjZ1mLD8b9L","slug":"m-cx-lenoncourt-1968-mut05","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["nacl"],"titulaireIds":["fr-442993283"],"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2004-02-28","id":"isgwwZGJwv7UDuJvtxAaj3T4","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-mut05-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000000434866"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"INDI0402498A"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2004-02-13","id":"Full4Vnptm6czWaJ4b6kZR6W","ordre":1,"notes":"Arrêté du 13 février 2004 autorisant la mutation d’une concession de mines de sels de sodium","slug":"m-cx-lenoncourt-1968-mut05-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"mut","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":8},{"id":"fA9NJsMZ78XyG402LUdm2Szi","slug":"m-cx-lenoncourt-1968-pro01","description":"prolongation et extension de périmètre","etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2024-03-01","id":"a0af6a2e56cd046cd72c71cf","ordre":20,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000049219226"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOL2320431D"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2024-02-29","id":"aa23dc021366330e04383eba","ordre":19,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"2024-02-29-dec-12df6369","description":"","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true},{"id":"2024-02-29-dec-4bb7fd91","description":"","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}]},{"etape_type_id":"epc","etape_statut_id":"ter","is_brouillon":false,"date":"2021-06-02","id":"3JEmzfDaS6MZdQGthz69jydI","ordre":12,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-epc01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"ama","etape_statut_id":"def","is_brouillon":false,"date":"2021-06-01","id":"ryW6mbg2cC906CimQRgdVhvd","ordre":11,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-ama01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"epu","etape_statut_id":"fai","is_brouillon":false,"date":"2021-04-20","id":"d1PRxUd0F9JHQSziUQ3skOem","ordre":9,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-epu01","sections_with_values":[{"id":"odlep","elements":[{"id":"lien","nom":"Lien public externe","description":"","optionnel":true,"type":"url","value":null}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mcr","etape_statut_id":"fav","is_brouillon":false,"date":"2021-01-27","id":"pHf3m1Hygp8kz8d7G0j2TKgZ","ordre":4,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-mcr01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mdp","etape_statut_id":"fai","is_brouillon":false,"date":"2020-08-04","id":"mQnOvtSGpc1T83bSvOOorVOa","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-mdp01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"mfr","fondamentale":{"date_debut":null,"date_fin":null,"duree":300,"substances":["nacl"],"titulaireIds":["fr-442993283"],"amodiataireIds":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[6.255869021711159,48.675202067410254],[6.263459497281365,48.6611397799328],[6.274477936823362,48.661530617274785],[6.29531036181682,48.66798716858568],[6.3162302722649795,48.67616624512283],[6.31565519531486,48.68038643555574],[6.307660371971501,48.69025022534333],[6.302480013569365,48.68917854238857],[6.2963188041374485,48.68915103738882],[6.290983811108587,48.68777705995633],[6.285642745098623,48.68911271820202],[6.281739260684181,48.68909422269382],[6.275638319504659,48.68547207905551],[6.255869021711159,48.675202067410254]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[6.255869021711159,48.675202067410254]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.275638319504659,48.68547207905551]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.281739260684181,48.68909422269382]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.285642745098623,48.68911271820202]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.290983811108587,48.68777705995633]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2963188041374485,48.68915103738882]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.302480013569365,48.68917854238857]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.307660371971501,48.69025022534333]},"properties":{"nom":"H","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.31565519531486,48.68038643555574]},"properties":{"nom":"I","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3162302722649795,48.67616624512283]},"properties":{"nom":"J","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.29531036181682,48.66798716858568]},"properties":{"nom":"K","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.274477936823362,48.661530617274785]},"properties":{"nom":"L","description":"Nouveau sommet « d’extension » défini par NOVACARB"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.263459497281365,48.6611397799328]},"properties":{"nom":"M","description":"Nouveau sommet « d’extension » défini par NOVACARB"}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[939659,6846613],[941066,6847814],[941498,6848235],[941785,6848249],[942184,6848117],[942570,6848286],[943023,6848308],[943399,6848443],[944033,6847372],[944095,6846905],[942594,6845932],[941091,6845151],[940282,6845074],[939659,6846613]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[939659,6846613]},"properties":{"nom":"A"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[941066,6847814]},"properties":{"nom":"B"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[941498,6848235]},"properties":{"nom":"C"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[941785,6848249]},"properties":{"nom":"D"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[942184,6848117]},"properties":{"nom":"E"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[942570,6848286]},"properties":{"nom":"F"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[943023,6848308]},"properties":{"nom":"G"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[943399,6848443]},"properties":{"nom":"H"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[944033,6847372]},"properties":{"nom":"I"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[944095,6846905]},"properties":{"nom":"J"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[942594,6845932]},"properties":{"nom":"K"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[941091,6845151]},"properties":{"nom":"L","description":"Nouveau sommet « d’extension » défini par NOVACARB"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[940282,6845074]},"properties":{"nom":"M","description":"Nouveau sommet « d’extension » défini par NOVACARB"}}]},"geojson_origine_geo_systeme_id":"2154","geojson4326_forages":null,"geojson_origine_forages":null,"surface":9.05,"communes":[{"id":"54495","nom":"Saulxures-lès-Nancy"},{"id":"54311","nom":"Lenoncourt"},{"id":"54110","nom":"Cerville"},{"id":"54025","nom":"Art-sur-Meurthe"}],"secteurs_maritimes":[],"sdom_zones":[],"forets":[]}},"etape_statut_id":"fai","is_brouillon":false,"date":"2020-07-06","id":"mh70cpBA8jOZWCEDJKupM4Rs","ordre":1,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-mfr01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[]}],"demarche_type_id":"pro","demarche_statut_id":"acc","demarche_date_debut":"2024-03-01","demarche_date_fin":"2049-03-01","ordre":11},{"id":"b7586ad241a658ae1eb42b08","slug":"m-cx-lenoncourt-1968-exp02","description":"","etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2024-03-01","id":"e48a19b86d090feadc67a893","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-exp02-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000049219226"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOL2320431D"}]}],"entreprises_documents":[],"etape_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["nacl"],"titulaireIds":["fr-442993283"],"amodiataireIds":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[6.2559,48.6752],[6.2756,48.6855],[6.2817,48.6891],[6.2856,48.6891],[6.291,48.6878],[6.2963,48.6892],[6.3025,48.6892],[6.3076,48.689],[6.3157,48.6804],[6.3162,48.6762],[6.2953,48.668],[6.2794,48.6631],[6.2614,48.6649],[6.2559,48.6752]]]]}},"geojson4326_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2559,48.6752]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2756,48.6855]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2817,48.6891]},"properties":{"nom":"B1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2856,48.6891]},"properties":{"nom":"C1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.291,48.6878]},"properties":{"nom":"D1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2963,48.6892]},"properties":{"nom":"E1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3025,48.6892]},"properties":{"nom":"F1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3076,48.689]},"properties":{"nom":"G1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3157,48.6804]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3162,48.6762]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2953,48.668]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2794,48.6631]},"properties":{"nom":"Da","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2614,48.6649]},"properties":{"nom":"Db","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2559,48.6752]},"properties":{"nom":"E","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[6.2559,48.6752],[6.2756,48.6855],[6.2817,48.6891],[6.2856,48.6891],[6.291,48.6878],[6.2963,48.6892],[6.3025,48.6892],[6.3076,48.689],[6.3157,48.6804],[6.3162,48.6762],[6.2953,48.668],[6.2794,48.6631],[6.2614,48.6649],[6.2559,48.6752]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2559,48.6752]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2756,48.6855]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2817,48.6891]},"properties":{"nom":"B1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2856,48.6891]},"properties":{"nom":"C1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.291,48.6878]},"properties":{"nom":"D1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2963,48.6892]},"properties":{"nom":"E1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3025,48.6892]},"properties":{"nom":"F1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3076,48.689]},"properties":{"nom":"G1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3157,48.6804]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3162,48.6762]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2953,48.668]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2794,48.6631]},"properties":{"nom":"Da","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2614,48.6649]},"properties":{"nom":"Db","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2559,48.6752]},"properties":{"nom":"E","description":null}}]},"geojson_origine_geo_systeme_id":"4326","geojson4326_forages":null,"geojson_origine_forages":null,"surface":8.65,"communes":[{"id":"54495","nom":"Saulxures-lès-Nancy"},{"id":"54311","nom":"Lenoncourt"},{"id":"54110","nom":"Cerville"},{"id":"54025","nom":"Art-sur-Meurthe"}],"secteurs_maritimes":[],"sdom_zones":[],"forets":[]}},"etape_statut_id":"acc","is_brouillon":false,"date":"2024-02-29","id":"c15f4ceaa62a6298a2f8e117","ordre":1,"notes":null,"slug":"m-cx-lenoncourt-1968-exp02-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"2024-02-29-dec-d9f1e868","description":"","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true},{"id":"2024-02-29-dec-32312304","description":"","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}]}],"demarche_type_id":"exp","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":12}],"nb_activites_to_do":null}) + const lenoncourtData = titreGetValidator.parse({"id":"s7RvqvCAgKs4DxkQBYV93cVx","nom":"Lenoncourt","slug":"m-cx-lenoncourt-1968","titre_type_id":"cxm","titre_statut_id":"val","titre_doublon":null,"references":[{"nom":"2013-0275-MI","referenceTypeId":"deb"},{"nom":"54TM0153","referenceTypeId":"rnt"}],"titre_last_modified_date":"2024-03-21","demarches":[{"id":"ozYnUjy40eru81jUnXz5snv2","slug":"m-cx-lenoncourt-1968-oct01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["nacl"],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"1968-01-24","id":"SG2zAN9QaKBN1hZKqKEgQGpI","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-oct01-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"1968-01-24-dec-89a94bb2","description":"Décret du 13 janvier 1968 instituant la concession de mines de sels de sodium de Lenoncourt (Meurthe-et-Moselle) au profit de la société Les Soudières réunies - La Madeleine-Varangéville","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}],"avis_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"1968-01-13","id":"LM2Zk3PwAjrduc4EqmucOjeB","ordre":1,"notes":"Décret du 13 janvier 1968 instituant la concession de mines de sels de sodium de Lenoncourt (Meurthe-et-Moselle) au profit de la société Les Soudières réunies - La Madeleine-Varangéville","slug":"m-cx-lenoncourt-1968-oct01-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]}],"demarche_type_id":"oct","demarche_statut_id":"acc","demarche_date_debut":"1968-01-24","demarche_date_fin":"2024-03-01","ordre":1},{"id":"wM0cpipWSef9lDAHDurJxxhk","slug":"m-cx-lenoncourt-1968-mut01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["selg","selh"],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"1970-11-19","id":"XScxzwDKFxmYtDnkJ7X7qZBi","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-mut01-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"1970-11-19-dec-8a77b142","description":"Décret du 16 novembre 1970 autorisant la mutation de propriété de cinq concessions de mines de sel gemme et de sources salées au profit de la société Produits chimiques Pechlney-Saint-Gobaln.","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}],"avis_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaireIds":["fr-606320471"],"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"1970-11-16","id":"ejAqTpzBj82jgF0ShiwMRQmW","ordre":1,"notes":"Décret du 16 novembre 1970 autorisant la mutation de propriété de cinq concessions de mines de sel gemme et de sources salées au profit de la société Produits chimiques Pechlney-Saint-Gobaln.","slug":"m-cx-lenoncourt-1968-mut01-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]}],"demarche_type_id":"mut","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":2},{"id":"1UC2b0ORsm2ezCh6whHzbOKR","slug":"m-cx-lenoncourt-1968-mut02","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["selg","selh"],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"1975-11-27","id":"TjimKkEETzF0yGBG2m085on9","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-mut02-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"1975-11-27-dec-b50a06f5","description":"Décret du 24 novembre 1975 autorisant la mutation de cinq concessions de mines de sel gemme et de sources salées au profit de la Compagnie industrielle et minière","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}],"avis_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaireIds":["fr-712025048"],"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"1975-11-24","id":"aYO0zwBFBOZP7VN11JaJDhzI","ordre":1,"notes":"Décret du 24 novembre 1975 autorisant la mutation de cinq concessions de mines de sel gemme et de sources salées au profit de la Compagnie industrielle et minière","slug":"m-cx-lenoncourt-1968-mut02-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]}],"demarche_type_id":"mut","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":3},{"id":"H5eANAZPKhY9eFQtCyLYjCvp","slug":"m-cx-lenoncourt-1968-exp01","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["nacl"],"titulaireIds":["fr-712025048"],"amodiataireIds":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[6.275644095814427,48.6854960696669],[6.255874124806144,48.675237870291575],[6.295319143383101,48.66801114312286],[6.316241924966296,48.676189123934925],[6.315656943097024,48.680413137182065],[6.307671761547864,48.69027442550079],[6.302487495007789,48.68919858322589],[6.296317613859298,48.68917495187758],[6.290997693817669,48.68780534512822],[6.285653764289864,48.68913324659737],[6.281744418990354,48.68911774206666],[6.275644095814427,48.6854960696669]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[6.275644095814427,48.6854960696669]},"properties":{"nom":"A","description":"Point situé sur la ligne joignant les clochers de Saulxures-lès-Nancy et de Buissoncourt, à son intersection avec la limite des communes de Saulxures-lès-Nancy et de Lenoncourt, soit à environ 2040 mètres à l'Est-Sud-Est du clocher de Saulxures-lès-Nancy"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.281744418990354,48.68911774206666]},"properties":{"nom":"B1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.285653764289864,48.68913324659737]},"properties":{"nom":"C1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.290997693817669,48.68780534512822]},"properties":{"nom":"D1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.296317613859298,48.68917495187758]},"properties":{"nom":"E1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.302487495007789,48.68919858322589]},"properties":{"nom":"F1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.307671761547864,48.69027442550079]},"properties":{"nom":"G1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.315656943097024,48.680413137182065]},"properties":{"nom":"B","description":"Point situé sur la ligne joignant les clochers de Saulxures-lès-Nancy et de Buissoncourt, à son intersection avec la limite Ouest de la concession de Cercueil-Buissoncourt, soit à environ 2 150 mètres au Nord-Nord-Ouest du clocher de Buissoncourt"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.316241924966296,48.676189123934925]},"properties":{"nom":"C","description":"Borne commune aux concessions d'Art-sur-Meurthe et de Cercueil-Buissoncourt"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.295319143383101,48.66801114312286]},"properties":{"nom":"D","description":"Sommet A de la concession d'Art-sur-Meurthe:"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.255874124806144,48.675237870291575]},"properties":{"nom":"E","description":"Sommet M de la concession d'Art-sur•Meurthe:"}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[889907.42,1117010.26],[890334.9,1117435.93],[890622.24,1117452.72],[891022.89,1117325.88],[891406.04,1117498.53],[891859.53,1117525.03],[892234.39,1117664.59],[892879.34,1116600.52],[892947.15,1116133.73],[891456.2,1115144.46],[888513.03,1115795.21],[889907.42,1117010.26]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[889907.42,1117010.26]},"properties":{"nom":"A","description":"Point situé sur la ligne joignant les clochers de Saulxures-lès-Nancy et de Buissoncourt, à son intersection avec la limite des communes de Saulxures-lès-Nancy et de Lenoncourt, soit à environ 2040 mètres à l’Est-Sud-Est du clocher de Saulxures-lès-Nancy"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[890334.9,1117435.93]},"properties":{"nom":"B1"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[890622.24,1117452.72]},"properties":{"nom":"C1"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[891022.89,1117325.88]},"properties":{"nom":"D1"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[891406.04,1117498.53]},"properties":{"nom":"E1"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[891859.53,1117525.03]},"properties":{"nom":"F1"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[892234.39,1117664.59]},"properties":{"nom":"G1"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[892879.34,1116600.52]},"properties":{"nom":"B","description":"Point situé sur la ligne joignant les clochers de Saulxures-lès-Nancy et de Buissoncourt, à son intersection avec la limite Ouest de la concession de Cercueil-Buissoncourt, soit à environ 2 150 mètres au Nord-Nord-Ouest du clocher de Buissoncourt"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[892947.15,1116133.73]},"properties":{"nom":"C","description":"Borne commune aux concessions d’Art-sur-Meurthe et de Cercueil-Buissoncourt"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[891456.2,1115144.46]},"properties":{"nom":"D","description":"Sommet A de la concession d’Art-sur-Meurthe:"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[888513.03,1115795.21]},"properties":{"nom":"E","description":"Sommet M de la concession d’Art-sur•Meurthe:"}}]},"geojson_origine_geo_systeme_id":"27571","geojson4326_forages":null,"geojson_origine_forages":null,"surface":6.75,"communes":[{"id":"54495","nom":"Saulxures-lès-Nancy"},{"id":"54311","nom":"Lenoncourt"},{"id":"54110","nom":"Cerville"},{"id":"54025","nom":"Art-sur-Meurthe"}],"secteurs_maritimes":[],"sdom_zones":[],"forets":[]}},"etape_statut_id":"acc","is_brouillon":false,"date":"1981-09-13","id":"C6UHWZDSFnLbwuaeksXG1SEj","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-exp01-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"N"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"1981-09-13-dec-8bf8fa4c","description":"Décret du 9 septembre 1981 portant extension de superficie de la concession des mines de sels de sodium de Lenoncourt (Meurthe-et-Moselle) et modifiant les conditions auxquelles est soumise ladite concession","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}],"avis_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"1981-09-09","id":"xHxKuYk5goClAaZr1hxGaCyr","ordre":1,"notes":"Décret du 9 septembre 1981 portant extension de superficie de la concession des mines de sels de sodium de Lenoncourt (Meurthe-et-Moselle) et modifiant les conditions auxquelles est soumise ladite concession","slug":"m-cx-lenoncourt-1968-exp01-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]}],"demarche_type_id":"exp","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":4},{"id":"W9IX7VanFA5iYxYAGulcA0CY","slug":"m-cx-lenoncourt-1968-mut03","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["nacl"],"titulaireIds":["fr-442993283"],"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2000-10-06","id":"wuYTEAQ5UUAUZxiowQIthgkg","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-mut03-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000000208330"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOI0000456A"}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2000-09-26","id":"f2iSnn7XPrOXDIrbmYFKUiz1","ordre":1,"notes":"Arrêté du 26 septembre 2000 autorisant la mutation de concessions de mines","slug":"m-cx-lenoncourt-1968-mut03-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]}],"demarche_type_id":"mut","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":6},{"id":"md9yLbhZSOqdcOANAAyUPTur","slug":"m-cx-lenoncourt-1968-mut04","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["nacl"],"titulaireIds":["fr-642014526"],"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2003-01-08","id":"yuMPprDNtN6mZzdmlVTDd25I","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-mut04-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000000228627"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"INDI0200856A"}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2002-12-24","id":"jZRW7aZo5DmTABnQCe35wVrh","ordre":1,"notes":"Arrêté du 24 décembre 2002 autorisant la mutation de concessions de mines","slug":"m-cx-lenoncourt-1968-mut04-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]}],"demarche_type_id":"mut","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":7},{"id":"3W0rdHS1VqDSIQjZ1mLD8b9L","slug":"m-cx-lenoncourt-1968-mut05","description":null,"etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["nacl"],"titulaireIds":["fr-442993283"],"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2004-02-28","id":"isgwwZGJwv7UDuJvtxAaj3T4","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-mut05-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000000434866"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"INDI0402498A"}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":[],"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2004-02-13","id":"Full4Vnptm6czWaJ4b6kZR6W","ordre":1,"notes":"Arrêté du 13 février 2004 autorisant la mutation d’une concession de mines de sels de sodium","slug":"m-cx-lenoncourt-1968-mut05-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]}],"demarche_type_id":"mut","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":8},{"id":"fA9NJsMZ78XyG402LUdm2Szi","slug":"m-cx-lenoncourt-1968-pro01","description":"prolongation et extension de périmètre","etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2024-03-01","id":"a0af6a2e56cd046cd72c71cf","ordre":20,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000049219226"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOL2320431D"}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2024-02-29","id":"aa23dc021366330e04383eba","ordre":19,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"2024-02-29-dec-12df6369","description":"","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true},{"id":"2024-02-29-dec-4bb7fd91","description":"","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}],"avis_documents":[]},{"etape_type_id":"epc","etape_statut_id":"ter","is_brouillon":false,"date":"2021-06-02","id":"3JEmzfDaS6MZdQGthz69jydI","ordre":12,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-epc01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"ama","etape_statut_id":"def","is_brouillon":false,"date":"2021-06-01","id":"ryW6mbg2cC906CimQRgdVhvd","ordre":11,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-ama01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"epu","etape_statut_id":"fai","is_brouillon":false,"date":"2021-04-20","id":"d1PRxUd0F9JHQSziUQ3skOem","ordre":9,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-epu01","sections_with_values":[{"id":"odlep","elements":[{"id":"lien","nom":"Lien public externe","description":"","optionnel":true,"type":"url","value":null}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"mcr","etape_statut_id":"fav","is_brouillon":false,"date":"2021-01-27","id":"pHf3m1Hygp8kz8d7G0j2TKgZ","ordre":4,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-mcr01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"mdp","etape_statut_id":"fai","is_brouillon":false,"date":"2020-08-04","id":"mQnOvtSGpc1T83bSvOOorVOa","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-mdp01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"mfr","fondamentale":{"date_debut":null,"date_fin":null,"duree":300,"substances":["nacl"],"titulaireIds":["fr-442993283"],"amodiataireIds":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[6.255869021711159,48.675202067410254],[6.263459497281365,48.6611397799328],[6.274477936823362,48.661530617274785],[6.29531036181682,48.66798716858568],[6.3162302722649795,48.67616624512283],[6.31565519531486,48.68038643555574],[6.307660371971501,48.69025022534333],[6.302480013569365,48.68917854238857],[6.2963188041374485,48.68915103738882],[6.290983811108587,48.68777705995633],[6.285642745098623,48.68911271820202],[6.281739260684181,48.68909422269382],[6.275638319504659,48.68547207905551],[6.255869021711159,48.675202067410254]]]]}},"geojson4326_points":{"type":"FeatureCollection","properties":{},"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[6.255869021711159,48.675202067410254]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.275638319504659,48.68547207905551]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.281739260684181,48.68909422269382]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.285642745098623,48.68911271820202]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.290983811108587,48.68777705995633]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2963188041374485,48.68915103738882]},"properties":{"nom":"F","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.302480013569365,48.68917854238857]},"properties":{"nom":"G","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.307660371971501,48.69025022534333]},"properties":{"nom":"H","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.31565519531486,48.68038643555574]},"properties":{"nom":"I","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3162302722649795,48.67616624512283]},"properties":{"nom":"J","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.29531036181682,48.66798716858568]},"properties":{"nom":"K","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.274477936823362,48.661530617274785]},"properties":{"nom":"L","description":"Nouveau sommet « d’extension » défini par NOVACARB"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.263459497281365,48.6611397799328]},"properties":{"nom":"M","description":"Nouveau sommet « d’extension » défini par NOVACARB"}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[939659,6846613],[941066,6847814],[941498,6848235],[941785,6848249],[942184,6848117],[942570,6848286],[943023,6848308],[943399,6848443],[944033,6847372],[944095,6846905],[942594,6845932],[941091,6845151],[940282,6845074],[939659,6846613]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[939659,6846613]},"properties":{"nom":"A"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[941066,6847814]},"properties":{"nom":"B"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[941498,6848235]},"properties":{"nom":"C"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[941785,6848249]},"properties":{"nom":"D"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[942184,6848117]},"properties":{"nom":"E"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[942570,6848286]},"properties":{"nom":"F"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[943023,6848308]},"properties":{"nom":"G"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[943399,6848443]},"properties":{"nom":"H"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[944033,6847372]},"properties":{"nom":"I"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[944095,6846905]},"properties":{"nom":"J"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[942594,6845932]},"properties":{"nom":"K"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[941091,6845151]},"properties":{"nom":"L","description":"Nouveau sommet « d’extension » défini par NOVACARB"}},{"type":"Feature","geometry":{"type":"Point","coordinates":[940282,6845074]},"properties":{"nom":"M","description":"Nouveau sommet « d’extension » défini par NOVACARB"}}]},"geojson_origine_geo_systeme_id":"2154","geojson4326_forages":null,"geojson_origine_forages":null,"surface":9.05,"communes":[{"id":"54495","nom":"Saulxures-lès-Nancy"},{"id":"54311","nom":"Lenoncourt"},{"id":"54110","nom":"Cerville"},{"id":"54025","nom":"Art-sur-Meurthe"}],"secteurs_maritimes":[],"sdom_zones":[],"forets":[]}},"etape_statut_id":"fai","is_brouillon":false,"date":"2020-07-06","id":"mh70cpBA8jOZWCEDJKupM4Rs","ordre":1,"notes":null,"slug":"m-cx-lenoncourt-1968-pro01-mfr01","sections_with_values":[],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]}],"demarche_type_id":"pro","demarche_statut_id":"acc","demarche_date_debut":"2024-03-01","demarche_date_fin":"2049-03-01","ordre":11},{"id":"b7586ad241a658ae1eb42b08","slug":"m-cx-lenoncourt-1968-exp02","description":"","etapes":[{"etape_type_id":"dpu","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":null,"titulaireIds":null,"amodiataireIds":null,"perimetre":null},"etape_statut_id":"acc","is_brouillon":false,"date":"2024-03-01","id":"e48a19b86d090feadc67a893","ordre":2,"notes":null,"slug":"m-cx-lenoncourt-1968-exp02-dpu01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":false,"type":"text","value":"JORFTEXT000049219226"},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":"ECOL2320431D"}]}],"entreprises_documents":[],"etape_documents":[],"avis_documents":[]},{"etape_type_id":"dex","fondamentale":{"date_debut":null,"date_fin":null,"duree":null,"substances":["nacl"],"titulaireIds":["fr-442993283"],"amodiataireIds":null,"perimetre":{"geojson4326_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[6.2559,48.6752],[6.2756,48.6855],[6.2817,48.6891],[6.2856,48.6891],[6.291,48.6878],[6.2963,48.6892],[6.3025,48.6892],[6.3076,48.689],[6.3157,48.6804],[6.3162,48.6762],[6.2953,48.668],[6.2794,48.6631],[6.2614,48.6649],[6.2559,48.6752]]]]}},"geojson4326_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2559,48.6752]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2756,48.6855]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2817,48.6891]},"properties":{"nom":"B1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2856,48.6891]},"properties":{"nom":"C1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.291,48.6878]},"properties":{"nom":"D1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2963,48.6892]},"properties":{"nom":"E1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3025,48.6892]},"properties":{"nom":"F1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3076,48.689]},"properties":{"nom":"G1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3157,48.6804]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3162,48.6762]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2953,48.668]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2794,48.6631]},"properties":{"nom":"Da","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2614,48.6649]},"properties":{"nom":"Db","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2559,48.6752]},"properties":{"nom":"E","description":null}}]},"geojson_origine_perimetre":{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[6.2559,48.6752],[6.2756,48.6855],[6.2817,48.6891],[6.2856,48.6891],[6.291,48.6878],[6.2963,48.6892],[6.3025,48.6892],[6.3076,48.689],[6.3157,48.6804],[6.3162,48.6762],[6.2953,48.668],[6.2794,48.6631],[6.2614,48.6649],[6.2559,48.6752]]]]}},"geojson_origine_points":{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2559,48.6752]},"properties":{"nom":"E","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2756,48.6855]},"properties":{"nom":"A","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2817,48.6891]},"properties":{"nom":"B1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2856,48.6891]},"properties":{"nom":"C1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.291,48.6878]},"properties":{"nom":"D1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2963,48.6892]},"properties":{"nom":"E1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3025,48.6892]},"properties":{"nom":"F1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3076,48.689]},"properties":{"nom":"G1","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3157,48.6804]},"properties":{"nom":"B","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3162,48.6762]},"properties":{"nom":"C","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2953,48.668]},"properties":{"nom":"D","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2794,48.6631]},"properties":{"nom":"Da","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2614,48.6649]},"properties":{"nom":"Db","description":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2559,48.6752]},"properties":{"nom":"E","description":null}}]},"geojson_origine_geo_systeme_id":"4326","geojson4326_forages":null,"geojson_origine_forages":null,"surface":8.65,"communes":[{"id":"54495","nom":"Saulxures-lès-Nancy"},{"id":"54311","nom":"Lenoncourt"},{"id":"54110","nom":"Cerville"},{"id":"54025","nom":"Art-sur-Meurthe"}],"secteurs_maritimes":[],"sdom_zones":[],"forets":[]}},"etape_statut_id":"acc","is_brouillon":false,"date":"2024-02-29","id":"c15f4ceaa62a6298a2f8e117","ordre":1,"notes":null,"slug":"m-cx-lenoncourt-1968-exp02-dex01","sections_with_values":[{"id":"publication","nom":"Références Légifrance","elements":[{"id":"jorf","nom":"Numéro JORF","description":"","optionnel":true,"type":"text","value":null},{"id":"nor","nom":"Numéro NOR","description":"","optionnel":true,"type":"text","value":null}]}],"entreprises_documents":[],"etape_documents":[{"id":"2024-02-29-dec-d9f1e868","description":"","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true},{"id":"2024-02-29-dec-32312304","description":"","etape_document_type_id":"dec","public_lecture":true,"entreprises_lecture":true}],"avis_documents":[]}],"demarche_type_id":"exp","demarche_statut_id":"acc","demarche_date_debut":null,"demarche_date_fin":null,"ordre":12}],"nb_activites_to_do":null}) return Promise.resolve(lenoncourtData) }, diff --git a/packages/ui/src/components/titre.stories_snapshots_AbattisKoticaOctroi.html b/packages/ui/src/components/titre.stories_snapshots_AbattisKoticaOctroi.html index 035a6e559..ab1861c40 100644 --- a/packages/ui/src/components/titre.stories_snapshots_AbattisKoticaOctroi.html +++ b/packages/ui/src/components/titre.stories_snapshots_AbattisKoticaOctroi.html @@ -376,6 +376,7 @@ <!----> <!----> <!----> + <!----> </div> </div> <div class="fr-pb-2w"> @@ -399,6 +400,7 @@ <!----> <!----> <!----> + <!----> </div> </div> <div class="fr-pb-2w"> @@ -422,6 +424,7 @@ <!----> <!----> <!----> + <!----> </div> </div> </div> diff --git a/packages/ui/src/components/titre.stories_snapshots_BasseManaMod.html b/packages/ui/src/components/titre.stories_snapshots_BasseManaMod.html index 192dec5cc..b648b061a 100644 --- a/packages/ui/src/components/titre.stories_snapshots_BasseManaMod.html +++ b/packages/ui/src/components/titre.stories_snapshots_BasseManaMod.html @@ -253,6 +253,7 @@ <!----> <!----> <!----> + <!----> </div> </div> <div class="fr-pb-2w"> @@ -312,6 +313,7 @@ </div> <!----> <!----> + <!----> </div> </div> <div class="fr-pb-2w"> @@ -348,6 +350,7 @@ <!----> <!----> <!----> + <!----> </div> </div> <div class="fr-pb-2w"> @@ -371,6 +374,7 @@ <!----> <!----> <!----> + <!----> </div> </div> <div class="fr-pb-2w"> @@ -394,6 +398,7 @@ <!----> <!----> <!----> + <!----> </div> </div> <div class="fr-pb-2w"> @@ -417,6 +422,7 @@ <!----> <!----> <!----> + <!----> </div> </div> <div class="fr-pb-2w"> @@ -563,6 +569,7 @@ <!----> <!----> <!----> + <!----> </div> </div> </div> diff --git a/packages/ui/src/components/titre.stories_snapshots_BonEspoirOctroi.html b/packages/ui/src/components/titre.stories_snapshots_BonEspoirOctroi.html index a2a0cb0f1..1a78199c2 100644 --- a/packages/ui/src/components/titre.stories_snapshots_BonEspoirOctroi.html +++ b/packages/ui/src/components/titre.stories_snapshots_BonEspoirOctroi.html @@ -139,7 +139,7 @@ </div> <div style="grid-column: unset;"> <div class="fr-text--sm fr-mb-0">Communes</div> - <div class="fr-text--md fr-mb-0" style="font-weight: 500;">Mana, Saint-Laurent-du-Maroni</div> + <div class="fr-text--md fr-mb-0" style="font-weight: 500;">Saint-Laurent-du-Maroni, Mana</div> </div> </div> </div> @@ -497,6 +497,7 @@ <!----> <!----> <!----> + <!----> </div> </div> <div class="fr-pb-2w"> @@ -533,6 +534,7 @@ <!----> <!----> <!----> + <!----> </div> </div> </div> diff --git a/packages/ui/src/components/titre.stories_snapshots_BonEspoirProlongation2.html b/packages/ui/src/components/titre.stories_snapshots_BonEspoirProlongation2.html index 3cb94276b..26231f737 100644 --- a/packages/ui/src/components/titre.stories_snapshots_BonEspoirProlongation2.html +++ b/packages/ui/src/components/titre.stories_snapshots_BonEspoirProlongation2.html @@ -146,7 +146,7 @@ </div> <div style="grid-column: unset;"> <div class="fr-text--sm fr-mb-0">Communes</div> - <div class="fr-text--md fr-mb-0" style="font-weight: 500;">Mana, Saint-Laurent-du-Maroni</div> + <div class="fr-text--md fr-mb-0" style="font-weight: 500;">Saint-Laurent-du-Maroni, Mana</div> </div> </div> </div> @@ -349,6 +349,7 @@ <!----> <!----> <!----> + <!----> </div> </div> <div class="fr-pb-2w"> @@ -418,6 +419,7 @@ </div> <!----> <!----> + <!----> </div> </div> <div class="fr-pb-2w"> @@ -441,6 +443,7 @@ <!----> <!----> <!----> + <!----> </div> </div> <div class="fr-pb-2w"> @@ -490,6 +493,7 @@ <!----> <!----> <!----> + <!----> </div> </div> </div> diff --git a/packages/ui/src/components/titre.stories_snapshots_BonEspoirTravaux.html b/packages/ui/src/components/titre.stories_snapshots_BonEspoirTravaux.html index eddcc4693..ccca2e27b 100644 --- a/packages/ui/src/components/titre.stories_snapshots_BonEspoirTravaux.html +++ b/packages/ui/src/components/titre.stories_snapshots_BonEspoirTravaux.html @@ -161,6 +161,7 @@ </div> <!----> <!----> + <!----> </div> </div> <div class="fr-pb-2w"> @@ -204,6 +205,7 @@ </div> <!----> <!----> + <!----> </div> </div> <div class="fr-pb-2w"> @@ -227,6 +229,7 @@ <!----> <!----> <!----> + <!----> </div> </div> <div class="fr-pb-2w"> @@ -250,6 +253,7 @@ <!----> <!----> <!----> + <!----> </div> </div> </div> diff --git a/packages/ui/src/components/titre.stories_snapshots_ChantepieMutation.html b/packages/ui/src/components/titre.stories_snapshots_ChantepieMutation.html index 6b86a06ca..24ce10dde 100644 --- a/packages/ui/src/components/titre.stories_snapshots_ChantepieMutation.html +++ b/packages/ui/src/components/titre.stories_snapshots_ChantepieMutation.html @@ -251,6 +251,7 @@ <!----> <!----> <!----> + <!----> </div> </div> <div class="fr-pb-2w"> @@ -293,6 +294,7 @@ <!----> <!----> <!----> + <!----> </div> </div> </div> diff --git a/packages/ui/src/components/titre.stories_snapshots_ChantepieOctroi.html b/packages/ui/src/components/titre.stories_snapshots_ChantepieOctroi.html index 694ae0611..e946586d9 100644 --- a/packages/ui/src/components/titre.stories_snapshots_ChantepieOctroi.html +++ b/packages/ui/src/components/titre.stories_snapshots_ChantepieOctroi.html @@ -342,6 +342,7 @@ <!----> <!----> <!----> + <!----> </div> </div> <div class="fr-pb-2w"> @@ -475,6 +476,7 @@ <!----> <!----> <!----> + <!----> </div> </div> </div> diff --git a/packages/ui/src/components/titre.stories_snapshots_ChantepieOctroiAsEntreprise.html b/packages/ui/src/components/titre.stories_snapshots_ChantepieOctroiAsEntreprise.html index 9aa4b8cb1..af677a672 100644 --- a/packages/ui/src/components/titre.stories_snapshots_ChantepieOctroiAsEntreprise.html +++ b/packages/ui/src/components/titre.stories_snapshots_ChantepieOctroiAsEntreprise.html @@ -341,6 +341,7 @@ <!----> <!----> <!----> + <!----> </div> </div> <div class="fr-pb-2w"> @@ -472,6 +473,7 @@ <!----> <!----> <!----> + <!----> </div> </div> </div> diff --git a/packages/ui/src/components/titre.stories_snapshots_CriqueAdolpheOctroi.html b/packages/ui/src/components/titre.stories_snapshots_CriqueAdolpheOctroi.html index 950b6f813..d5328030f 100644 --- a/packages/ui/src/components/titre.stories_snapshots_CriqueAdolpheOctroi.html +++ b/packages/ui/src/components/titre.stories_snapshots_CriqueAdolpheOctroi.html @@ -269,6 +269,7 @@ <!----> <!----> <!----> + <!----> </div> </div> <div class="fr-pb-2w"> @@ -294,6 +295,7 @@ <!----> <!----> <!----> + <!----> </div> </div> <div class="fr-pb-2w"> @@ -319,6 +321,7 @@ <!----> <!----> <!----> + <!----> </div> </div> <div class="fr-pb-2w"> @@ -356,6 +359,7 @@ <!----> <!----> <!----> + <!----> </div> </div> <div class="fr-pb-2w"> @@ -381,6 +385,7 @@ <!----> <!----> <!----> + <!----> </div> </div> <div class="fr-pb-2w"> @@ -406,6 +411,7 @@ <!----> <!----> <!----> + <!----> </div> </div> <div class="fr-pb-2w"> @@ -594,6 +600,7 @@ <!----> <!----> <!----> + <!----> </div> </div> <div class="fr-pb-2w"> @@ -631,6 +638,7 @@ <!----> <!----> <!----> + <!----> </div> </div> </div> diff --git a/packages/ui/src/components/titre.stories_snapshots_Full.html b/packages/ui/src/components/titre.stories_snapshots_Full.html index 9241212dc..8a4869e38 100644 --- a/packages/ui/src/components/titre.stories_snapshots_Full.html +++ b/packages/ui/src/components/titre.stories_snapshots_Full.html @@ -319,6 +319,7 @@ <!----> <!----> <!----> + <!----> </div> </div> </div> diff --git a/packages/ui/src/components/titre.stories_snapshots_Lenoncourt.html b/packages/ui/src/components/titre.stories_snapshots_Lenoncourt.html index 976aaa00e..2bd9f6a81 100644 --- a/packages/ui/src/components/titre.stories_snapshots_Lenoncourt.html +++ b/packages/ui/src/components/titre.stories_snapshots_Lenoncourt.html @@ -344,6 +344,7 @@ <!----> <!----> <!----> + <!----> </div> </div> <div class="fr-pb-2w"> @@ -586,6 +587,7 @@ </div> <!----> <!----> + <!----> </div> </div> </div> diff --git a/packages/ui/src/components/titre.stories_snapshots_TitreAvecUneSeuleDemarcheEnConstruction.html b/packages/ui/src/components/titre.stories_snapshots_TitreAvecUneSeuleDemarcheEnConstruction.html index 78d8547f0..ebb17c257 100644 --- a/packages/ui/src/components/titre.stories_snapshots_TitreAvecUneSeuleDemarcheEnConstruction.html +++ b/packages/ui/src/components/titre.stories_snapshots_TitreAvecUneSeuleDemarcheEnConstruction.html @@ -295,6 +295,7 @@ <!----> <!----> <!----> + <!----> </div> </div> </div> diff --git a/packages/ui/src/components/titre/phase.ts b/packages/ui/src/components/titre/phase.ts index 318df6c32..c2506e779 100644 --- a/packages/ui/src/components/titre/phase.ts +++ b/packages/ui/src/components/titre/phase.ts @@ -7,6 +7,7 @@ import { isEtapeDecision } from 'camino-common/src/static/etapesTypes' import { isNotNullNorUndefined, isNullOrUndefined, isNullOrUndefinedOrEmpty, OmitDistributive } from 'camino-common/src/typescript-tools' import { DemarcheSlug } from 'camino-common/src/demarche' import { isTravaux } from 'camino-common/src/static/demarchesTypes' +import { ETAPE_IS_BROUILLON } from 'camino-common/src/etape' type TitreTimelineEvents = TitreGetDemarche & { first_etape_date: CaminoDate | null } type PhaseWithDateDebut = OmitDistributive<TitreGetDemarche, 'demarche_date_debut'> & { demarche_date_debut: CaminoDate; events: TitreTimelineEvents[] } @@ -38,7 +39,8 @@ export const phaseWithAlterations = (demarches: TitreGetDemarche[], currentDate: if (!isPhase(demarche) && [DemarchesStatutsIds.Accepte, DemarchesStatutsIds.Termine].includes(demarche.demarche_statut_id)) { let demarcheDate = demarche.demarche_date_debut if (isNullOrUndefined(demarcheDate)) { - demarcheDate = [...demarche.etapes].sort((a, b) => b.ordre - a.ordre).find(etape => isEtapeDecision(etape.etape_type_id) && isEtapeStatusOk(etape.etape_statut_id))?.date ?? null + demarcheDate = + [...demarche.etapes].sort((a, b) => b.ordre - a.ordre).find(etape => isEtapeDecision(etape.etape_type_id) === ETAPE_IS_BROUILLON && isEtapeStatusOk(etape.etape_statut_id))?.date ?? null } if (isNotNullNorUndefined(demarcheDate) && demarcheDate >= phase.demarche_date_debut && (isNullOrUndefined(phase.demarche_date_fin) || demarcheDate < phase.demarche_date_fin)) { diff --git a/packages/ui/src/components/titre/titre-demarche.tsx b/packages/ui/src/components/titre/titre-demarche.tsx index 2cb1a1158..27ec9f4d2 100644 --- a/packages/ui/src/components/titre/titre-demarche.tsx +++ b/packages/ui/src/components/titre/titre-demarche.tsx @@ -136,6 +136,14 @@ export const TitreDemarche = defineComponent<Props>(props => { ) }) + const orderedEtapes = computed(() => { + return isNotNullNorUndefined(demarche.value) + ? [...demarche.value.etapes].sort((a, b) => { + return b.ordre - a.ordre + }) + : [] + }) + return () => ( <> {demarche.value !== null ? ( @@ -212,32 +220,31 @@ export const TitreDemarche = defineComponent<Props>(props => { ) : null} </div> <div class="fr-mt-3w"> - {[...demarche.value.etapes] - .sort((a, b) => b.ordre - a.ordre) - .map(etape => ( - <> - {demarche.value !== null ? ( - <div class="fr-pb-2w"> - <DemarcheEtape - etape={etape} - router={props.router} - user={props.user} - entreprises={props.entreprises} - titre={{ typeId: props.titre.titre_type_id, titreStatutId: props.titre.titre_statut_id, slug: props.titre.slug, nom: props.titre.nom }} - demarche={{ - administrationsLocales: getAdministrationsLocales(perimetre.value?.communes.map(({ id }) => id) ?? [], perimetre.value?.secteurs_maritimes ?? []), - demarche_type_id: demarche.value.demarche_type_id, - titulaireIds: titulaires.value ?? [], - sdom_zones: perimetre.value?.sdom_zones ?? [], - etapes: demarche.value.etapes, - }} - apiClient={props.apiClient} - initTab={props.initTab} - /> - </div> - ) : null} - </> - ))} + {orderedEtapes.value.map(etape => ( + <> + {demarche.value !== null ? ( + <div class="fr-pb-2w"> + <DemarcheEtape + etape={etape} + router={props.router} + user={props.user} + entreprises={props.entreprises} + titre={{ typeId: props.titre.titre_type_id, titreStatutId: props.titre.titre_statut_id, slug: props.titre.slug, nom: props.titre.nom }} + demarche={{ + administrationsLocales: getAdministrationsLocales(perimetre.value?.communes.map(({ id }) => id) ?? [], perimetre.value?.secteurs_maritimes ?? []), + demarche_type_id: demarche.value.demarche_type_id, + titulaireIds: titulaires.value ?? [], + sdom_zones: perimetre.value?.sdom_zones ?? [], + communes: perimetre.value?.communes?.map(({ id }) => id) ?? [], + etapes: demarche.value.etapes, + }} + apiClient={props.apiClient} + initTab={props.initTab} + /> + </div> + ) : null} + </> + ))} </div> </div> {addDemarchePopup.value ? ( diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json index 954b29a6e..ba6a640db 100644 --- a/packages/ui/tsconfig.json +++ b/packages/ui/tsconfig.json @@ -11,7 +11,7 @@ "skipLibCheck": true, "jsx": "preserve", "jsxImportSource": "vue", - "noErrorTruncation": true, + "noErrorTruncation": false, "lib": [ "esnext", "dom", -- GitLab