diff --git a/.gitlab/ci/api.yml b/.gitlab/ci/api.yml index db0adf8388c264697ae28c81d7df5d5ee48cf7f3..028ed0ee5ddfec89e897f157fe2aea6da33c9ab9 100644 --- a/.gitlab/ci/api.yml +++ b/.gitlab/ci/api.yml @@ -21,7 +21,7 @@ api/test/integration: alias: postgres stage: test script: - - ./.gitlab/wait-for-it.sh -h ${PGHOST} -p ${PGPORT} -t 30 -- echo 'done' + - ./.gitlab/wait-for-it.sh -h ${PGHOST} -p ${PGPORT} -t 60 -- echo 'done' - make test/api-integration api/type: extends: .prepare-node-run @@ -45,7 +45,7 @@ api/check-queries: script: - set -a - source .env-example - - ./.gitlab/wait-for-it.sh -h ${PGHOST} -p ${PGPORT} -t 30 -- make db/migrate + - ./.gitlab/wait-for-it.sh -h ${PGHOST} -p ${PGPORT} -t 60 -- make db/migrate - make db/check-queries - | if [ ! -z "$(git status --porcelain)" ]; then diff --git a/packages/api/src/api/rest/etapes.ts b/packages/api/src/api/rest/etapes.ts index 59aab30db8dc04853add41eaf8728f91cf8d83ee..65e27b30656f06f32dcaa6cc91342e5e2b3ddc7c 100644 --- a/packages/api/src/api/rest/etapes.ts +++ b/packages/api/src/api/rest/etapes.ts @@ -801,6 +801,7 @@ export const updateEtape: RestNewPutCall<'/rest/etapes'> = (rootPipe): Effect.Ef isBrouillon, etape.etapeAvis, etape.typeId, + flattenEtapeAndPerimetre.flattenEtape.contenu, titreTypeId, titreDemarche.typeId, titreDemarche.id, diff --git a/packages/api/src/api/rest/titres.queries.ts b/packages/api/src/api/rest/titres.queries.ts index c5019bc62a5c408eccf58ce5ee18e19e55ce7ade..f5875858cc6a15191cb5391c5fd0e557b5183d45 100644 --- a/packages/api/src/api/rest/titres.queries.ts +++ b/packages/api/src/api/rest/titres.queries.ts @@ -49,7 +49,7 @@ import { TitreIdOrSlug, titreIdValidator, titreSlugValidator, TitreId } from 'ca import { EntrepriseId, entrepriseIdValidator } from 'camino-common/src/entreprise' import { AdministrationId } from 'camino-common/src/static/administrations' import { secteurMaritimeValidator } from 'camino-common/src/static/facades' -import { getAvisTypes } from 'camino-common/src/permissions/etape-form' +import { getAvisTypes, isArmMecanise } from 'camino-common/src/permissions/etape-form' import { callAndExit } from '../../tools/fp-tools' type SuperEtapeDemarcheTitreGet = OmitDistributive<DemarcheEtape, 'etape_documents' | 'avis_documents'> @@ -257,9 +257,10 @@ export const getTitre = async (pool: Pool, user: User, idOrSlug: TitreIdOrSlug): superDemarche.demarche_type_id, superDemarche.id, isNotNullNorUndefined(firstEtapeDate) ? firstEtapeDate : firstEtapeDateValidator.parse(superEtape.date), - perimetre?.communes.map(({ id }) => id) ?? [] + perimetre?.communes.map(({ id }) => id) ?? [], + isArmMecanise(superEtape.sections_with_values) ) - if (isNotNullNorUndefinedNorEmpty(avisTypes)) { + if (isNotNullNorUndefinedNorEmpty(Object.keys(avisTypes))) { const avisWithLargeObjectId = await getEtapeAvisLargeObjectIdsByEtapeId( superEtape.id, pool, diff --git a/packages/api/src/database/queries/titres-etapes.queries.ts b/packages/api/src/database/queries/titres-etapes.queries.ts index 034086e3fde823e357a838be42e5720befb3a1af..2a5bfc6fc7ba86cc72814536c548f7eb7f082397 100644 --- a/packages/api/src/database/queries/titres-etapes.queries.ts +++ b/packages/api/src/database/queries/titres-etapes.queries.ts @@ -62,7 +62,7 @@ import { getEtapeDataForEdition } from '../../api/rest/etapes.queries' import { etapeAvisStepIsComplete } from 'camino-common/src/permissions/etape-form' import { CommuneId } from 'camino-common/src/static/communes' import { EtapeStatutId, etapeStatutIdValidator } from 'camino-common/src/static/etapesStatuts' -import { contenuValidator, heritageContenuValidator } from 'camino-common/src/etape-form' +import { contenuValidator, FlattenedContenu, heritageContenuValidator } from 'camino-common/src/etape-form' import { DemarcheTypeId, demarcheTypeIdValidator } from 'camino-common/src/static/demarchesTypes' import { Effect, Option, pipe } from 'effect' import { CaminoError } from 'camino-common/src/zod-tools' @@ -296,6 +296,7 @@ export const updateEtapeAvis = ( isBrouillon: EtapeBrouillon, etapeAvis: EtapeAvisModification[], etapeTypeId: EtapeTypeId, + etapeContenu: FlattenedContenu, titreTypeId: TitreTypeId, demarcheTypeId: DemarcheTypeId, demarcheId: DemarcheId, @@ -304,7 +305,9 @@ export const updateEtapeAvis = ( ): Effect.Effect<Option.Option<never>, CaminoError<UpdateEtapeAvisErrors>> => { return Effect.Do.pipe( Effect.filterOrFail( - () => isBrouillon === ETAPE_IS_BROUILLON || etapeAvisStepIsComplete({ typeId: etapeTypeId }, etapeAvis, titreTypeId, demarcheTypeId, demarcheId, firstEtapeDate, communeIds).valid, + () => + isBrouillon === ETAPE_IS_BROUILLON || + etapeAvisStepIsComplete({ typeId: etapeTypeId, contenu: etapeContenu }, etapeAvis, titreTypeId, demarcheTypeId, demarcheId, firstEtapeDate, communeIds).valid, () => ({ message: avisIncomplets }) ), Effect.bind('avisInDb', () => effectDbQueryAndValidate(getAvisByEtapeIdQuery, { titre_etape_id }, pool, etapeAvisDbValidator)), @@ -420,7 +423,7 @@ const etapeAvisDbValidator = z avis_visibility_id: avisVisibilityIdValidator, }) ) -type EtapeAvisDb = z.infer<typeof etapeAvisDbValidator> +export type EtapeAvisDb = z.infer<typeof etapeAvisDbValidator> const getAvisByEtapeIdQuery = sql<Redefine<IGetAvisByEtapeIdQueryQuery, { titre_etape_id: EtapeId }, EtapeAvisDb>>` select a.id, diff --git a/packages/api/src/knex/migrations/20241211085607_migrate-dep-to-avis.ts b/packages/api/src/knex/migrations/20241211085607_migrate-dep-to-avis.ts new file mode 100644 index 0000000000000000000000000000000000000000..148ff5bc3118b1b864aaf6b06766689bc0501000 --- /dev/null +++ b/packages/api/src/knex/migrations/20241211085607_migrate-dep-to-avis.ts @@ -0,0 +1,48 @@ +/* eslint-disable sql/no-unsafe-query */ +import { CaminoDate } from 'camino-common/src/date' +import { etapeAvisIdValidator, EtapeDocumentId, EtapeId } from 'camino-common/src/etape' +import { DATE_DEBUT_PROCEDURE_SPECIFIQUE_AXM_ARM } from 'camino-common/src/machines' +import { AvisTypes, AvisVisibilityIds } from 'camino-common/src/static/avisTypes' +import { ETAPES_TYPES } from 'camino-common/src/static/etapesTypes' +import { TITRES_TYPES_IDS } from 'camino-common/src/static/titresTypes' +import { Knex } from 'knex' +import { EtapeAvisDb } from '../../database/queries/titres-etapes.queries' +import { LargeObjectId } from '../../database/largeobjects' +import { DOCUMENTS_TYPES_IDS } from 'camino-common/src/static/documentsTypes' + +export const up = async (knex: Knex): Promise<void> => { + const etapes: { rows: { id: EtapeId; date: CaminoDate }[] } = await knex.raw(`SELECT te.id, te.date FROM titres_etapes te + JOIN titres_demarches td on te.titre_demarche_id = td.id + JOIN titres t on td.titre_id = t.id + WHERE te.type_id = '${ETAPES_TYPES.demande}' + AND date >= '${DATE_DEBUT_PROCEDURE_SPECIFIQUE_AXM_ARM}' + AND te.archive is false + AND td.archive is false + AND t.type_id='${TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX}'`) + + for (const etape of etapes.rows) { + const documents: { rows: { id: EtapeDocumentId; public_lecture: boolean; entreprises_lecture: boolean; description: string; largeobject_id: LargeObjectId }[] } = await knex.raw( + `SELECT id, public_lecture, entreprises_lecture, description, largeobject_id FROM etapes_documents WHERE etape_id = :etapeId AND etape_document_type_id = '${DOCUMENTS_TYPES_IDS.decisionCasParCas}'`, + { etapeId: etape.id } + ) + for (const document of documents.rows) { + const avis: EtapeAvisDb & { etape_id: EtapeId } = { + id: etapeAvisIdValidator.parse(document.id), + etape_id: etape.id, + avis_type_id: AvisTypes.avisCasParCas.id, + avis_statut_id: 'Exempté', + avis_visibility_id: document.public_lecture ? AvisVisibilityIds.Public : document.entreprises_lecture ? AvisVisibilityIds.TitulairesEtAdministrations : AvisVisibilityIds.Administrations, + description: document.description, + date: etape.date, + largeobject_id: document.largeobject_id, + } + await knex.raw( + 'INSERT INTO etape_avis (id, avis_type_id, avis_statut_id, avis_visibility_id, etape_id, description, date, largeobject_id) VALUES(:id, :avis_type_id, :avis_statut_id, :avis_visibility_id, :etape_id, :description, :date, :largeobject_id)', + avis + ) + await knex.raw('DELETE FROM etapes_documents WHERE id = :id', { id: document.id }) + } + } +} + +export const down = (): void => {} diff --git a/packages/common/src/permissions/__snapshots__/etape-form.test.ts.snap b/packages/common/src/permissions/__snapshots__/etape-form.test.ts.snap index 08b2801f3be2b17f51447da96dba4e6385a67a5a..88105b0d42bf908f92f575fec4769357bcf99e42 100644 --- a/packages/common/src/permissions/__snapshots__/etape-form.test.ts.snap +++ b/packages/common/src/permissions/__snapshots__/etape-form.test.ts.snap @@ -1,6 +1,6 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`getDocumentsTypes 4`] = ` +exports[`getDocumentsTypes 5`] = ` [ { "id": "cam", @@ -153,7 +153,7 @@ demandeur ] `; -exports[`getDocumentsTypes 5`] = ` +exports[`getDocumentsTypes 6`] = ` [ { "id": "cam", @@ -306,7 +306,7 @@ demandeur ] `; -exports[`getDocumentsTypes 6`] = ` +exports[`getDocumentsTypes 7`] = ` [ { "id": "cam", diff --git a/packages/common/src/permissions/etape-form.test.ts b/packages/common/src/permissions/etape-form.test.ts index 250ffff6310988203191f1d6250bec2f0eb949a1..314d32a3102a1404a443d8e9723bd807878c7bf9 100644 --- a/packages/common/src/permissions/etape-form.test.ts +++ b/packages/common/src/permissions/etape-form.test.ts @@ -11,6 +11,9 @@ import { fondamentaleStepIsVisible, getAvisTypes, getDocumentsTypes, + IS_ARM_MECANISE, + IS_ARM_NON_MECANISE, + isArmMecanise, perimetreStepIsComplete, perimetreStepIsVisible, sectionsStepIsComplete, @@ -28,6 +31,8 @@ import { DEMARCHES_TYPES_IDS } from '../static/demarchesTypes' import { TITRES_TYPES_IDS } from '../static/titresTypes' import { ETAPES_TYPES } from '../static/etapesTypes' import { demarcheIdValidator } from '../demarche' +import { DOCUMENTS_TYPES_IDS } from '../static/documentsTypes' +import { ETAPES_STATUTS } from '../static/etapesStatuts' describe('dateTypeStepIsComplete', () => { test.each<User>([ @@ -39,8 +44,8 @@ describe('dateTypeStepIsComplete', () => { dateTypeStepIsComplete( { date: toCaminoDate('2024-01-01'), - typeId: 'mfr', - statutId: 'fai', + typeId: ETAPES_TYPES.demande, + statutId: ETAPES_STATUTS.FAIT, }, user ).valid @@ -51,8 +56,8 @@ describe('dateTypeStepIsComplete', () => { const result = dateTypeStepIsComplete( { date: toCaminoDate('2024-01-01'), - typeId: 'mfr', - statutId: 'fai', + typeId: ETAPES_TYPES.demande, + statutId: ETAPES_STATUTS.FAIT, }, { ...testBlankUser, @@ -66,8 +71,8 @@ describe('dateTypeStepIsComplete', () => { const result = dateTypeStepIsComplete( { date: toCaminoDate('2024-01-01'), - typeId: 'mfr', - statutId: 'fai', + typeId: ETAPES_TYPES.demande, + statutId: ETAPES_STATUTS.FAIT, }, { ...testBlankUser, @@ -96,8 +101,8 @@ describe('dateTypeStepIsComplete', () => { }) test('fondamentaleStepIsVisible', () => { - expect(fondamentaleStepIsVisible('mfr')).toBe(true) - expect(fondamentaleStepIsVisible('acg')).toBe(false) + expect(fondamentaleStepIsVisible(ETAPES_TYPES.demande)).toBe(true) + expect(fondamentaleStepIsVisible(ETAPES_TYPES.avisDuConseilGeneralDeLeconomie_CGE_)).toBe(false) }) test('fondamentaleStepIsComplete', () => { @@ -106,12 +111,12 @@ test('fondamentaleStepIsComplete', () => { { duree: { value: 0, heritee: false, etapeHeritee: null }, substances: { value: [], heritee: false, etapeHeritee: null }, - typeId: 'acg', + typeId: ETAPES_TYPES.avisDuConseilGeneralDeLeconomie_CGE_, titulaires: { value: [], heritee: false, etapeHeritee: null }, amodiataires: { value: [], heritee: false, etapeHeritee: null }, }, - 'amo', - 'prr', + DEMARCHES_TYPES_IDS.Amodiation, + TITRES_TYPES_IDS.PERMIS_EXCLUSIF_DE_RECHERCHES_RADIOACTIF, { ...testBlankUser, role: 'super' } ).valid ).toBe(true) @@ -121,12 +126,12 @@ test('fondamentaleStepIsComplete', () => { { duree: { value: 0, heritee: false, etapeHeritee: null }, substances: { value: [], heritee: false, etapeHeritee: null }, - typeId: 'dpu', + typeId: ETAPES_TYPES.publicationDeDecisionAuJORF, titulaires: { value: [], heritee: false, etapeHeritee: null }, amodiataires: { value: [], heritee: false, etapeHeritee: null }, }, - 'amo', - 'prr', + DEMARCHES_TYPES_IDS.Amodiation, + TITRES_TYPES_IDS.PERMIS_EXCLUSIF_DE_RECHERCHES_RADIOACTIF, { ...testBlankUser, role: 'super' } ) ).toMatchInlineSnapshot(` @@ -144,12 +149,12 @@ test('fondamentaleStepIsComplete', () => { { duree: { value: 0, heritee: false, etapeHeritee: null }, substances: { value: [], heritee: false, etapeHeritee: null }, - typeId: 'mfr', + typeId: ETAPES_TYPES.demande, titulaires: { value: [], heritee: false, etapeHeritee: null }, amodiataires: { value: [], heritee: false, etapeHeritee: null }, }, - 'amo', - 'prr', + DEMARCHES_TYPES_IDS.Amodiation, + TITRES_TYPES_IDS.PERMIS_EXCLUSIF_DE_RECHERCHES_RADIOACTIF, { ...testBlankUser, role: 'super' } ) ).toMatchInlineSnapshot(` @@ -168,12 +173,12 @@ test('fondamentaleStepIsComplete', () => { { duree: { value: 0, heritee: false, etapeHeritee: null }, substances: { value: ['auru'], heritee: false, etapeHeritee: null }, - typeId: 'mfr', + typeId: ETAPES_TYPES.demande, titulaires: { value: [], heritee: false, etapeHeritee: null }, amodiataires: { value: [], heritee: false, etapeHeritee: null }, }, - 'oct', - 'prr', + DEMARCHES_TYPES_IDS.Octroi, + TITRES_TYPES_IDS.PERMIS_EXCLUSIF_DE_RECHERCHES_RADIOACTIF, { ...testBlankUser, role: 'super' } ) ).toMatchInlineSnapshot(` @@ -190,12 +195,12 @@ test('fondamentaleStepIsComplete', () => { { duree: { value: 0, heritee: false, etapeHeritee: null }, substances: { value: ['auru'], heritee: false, etapeHeritee: null }, - typeId: 'mfr', + typeId: ETAPES_TYPES.demande, titulaires: { value: [entreprise1Id], heritee: false, etapeHeritee: null }, amodiataires: { value: [], heritee: false, etapeHeritee: null }, }, - 'oct', - 'prr', + DEMARCHES_TYPES_IDS.Octroi, + TITRES_TYPES_IDS.PERMIS_EXCLUSIF_DE_RECHERCHES_RADIOACTIF, { ...testBlankUser, role: 'super' } ) ).toMatchInlineSnapshot(` @@ -211,12 +216,12 @@ test('fondamentaleStepIsComplete', () => { { duree: { value: 2, heritee: false, etapeHeritee: null }, substances: { value: ['auru'], heritee: false, etapeHeritee: null }, - typeId: 'mfr', + typeId: ETAPES_TYPES.demande, titulaires: { value: [], heritee: false, etapeHeritee: null }, amodiataires: { value: [], heritee: false, etapeHeritee: null }, }, - 'oct', - 'arm', + DEMARCHES_TYPES_IDS.Octroi, + TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, { ...testBlankUser, role: 'super' } ) ).toMatchInlineSnapshot(` @@ -232,12 +237,12 @@ test('fondamentaleStepIsComplete', () => { { duree: { value: 0, heritee: false, etapeHeritee: null }, substances: { value: ['auru'], heritee: false, etapeHeritee: null }, - typeId: 'mfr', + typeId: ETAPES_TYPES.demande, titulaires: { value: [], heritee: false, etapeHeritee: null }, amodiataires: { value: [], heritee: false, etapeHeritee: null }, }, - 'oct', - 'arm', + DEMARCHES_TYPES_IDS.Octroi, + TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, { ...testBlankUser, role: 'super' } ) ).toMatchInlineSnapshot(` @@ -254,12 +259,12 @@ test('fondamentaleStepIsComplete', () => { { duree: { value: 2, heritee: false, etapeHeritee: null }, substances: { value: [], heritee: false, etapeHeritee: null }, - typeId: 'mfr', + typeId: ETAPES_TYPES.demande, titulaires: { value: [], heritee: false, etapeHeritee: null }, amodiataires: { value: [], heritee: false, etapeHeritee: null }, }, - 'oct', - 'arm', + DEMARCHES_TYPES_IDS.Octroi, + TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, { ...testBlankUser, role: 'super' } ) ).toMatchInlineSnapshot(` @@ -277,12 +282,12 @@ test('fondamentaleStepIsComplete', () => { { duree: { value: 2, heritee: false, etapeHeritee: null }, substances: { value: ['auru'], heritee: false, etapeHeritee: null }, - typeId: 'mfr', + typeId: ETAPES_TYPES.demande, titulaires: { value: [entreprise1Id], heritee: false, etapeHeritee: null }, amodiataires: { value: [], heritee: false, etapeHeritee: null }, }, - 'mut', - 'arm', + DEMARCHES_TYPES_IDS.Mutation, + TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, { ...testBlankUser, role: 'super' } ) ).toMatchInlineSnapshot(` @@ -295,12 +300,12 @@ test('fondamentaleStepIsComplete', () => { { duree: { value: 0, heritee: false, etapeHeritee: null }, substances: { value: [], heritee: false, etapeHeritee: null }, - typeId: 'mfr', + typeId: ETAPES_TYPES.demande, titulaires: { value: [], heritee: false, etapeHeritee: null }, amodiataires: { value: [], heritee: false, etapeHeritee: null }, }, - 'mut', - 'arm', + DEMARCHES_TYPES_IDS.Mutation, + TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, { ...testBlankUser, role: 'super' } ) ).toMatchInlineSnapshot(` @@ -317,12 +322,12 @@ test('fondamentaleStepIsComplete', () => { { duree: { value: 3, heritee: false, etapeHeritee: null }, substances: { value: [SUBSTANCES_FISCALES_IDS.or], heritee: false, etapeHeritee: null }, - typeId: 'mfr', + typeId: ETAPES_TYPES.demande, titulaires: { value: [entreprise1Id], heritee: false, etapeHeritee: null }, amodiataires: { value: [], heritee: false, etapeHeritee: null }, }, - 'oct', - 'arm', + DEMARCHES_TYPES_IDS.Octroi, + TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, { ...testBlankUser, role: 'entreprise', entrepriseIds: [entreprise1Id] } ) ).toMatchInlineSnapshot(` @@ -335,7 +340,7 @@ test('fondamentaleStepIsComplete', () => { { duree: { value: 2, heritee: false, etapeHeritee: null }, substances: { value: [SUBSTANCES_FISCALES_IDS.or], heritee: false, etapeHeritee: null }, - typeId: 'mfr', + typeId: ETAPES_TYPES.demande, titulaires: { value: [], heritee: false, etapeHeritee: null }, amodiataires: { value: [entreprise1Id], heritee: false, etapeHeritee: null }, }, @@ -353,7 +358,7 @@ test('fondamentaleStepIsComplete', () => { { duree: { value: 0, heritee: false, etapeHeritee: null }, substances: { value: [SUBSTANCES_FISCALES_IDS.or], heritee: false, etapeHeritee: null }, - typeId: 'mfr', + typeId: ETAPES_TYPES.demande, titulaires: { value: [], heritee: false, etapeHeritee: null }, amodiataires: { value: [], heritee: false, etapeHeritee: null }, }, @@ -372,28 +377,36 @@ test('fondamentaleStepIsComplete', () => { `) }) test('sectionsStepIsVisible', () => { - expect(sectionsStepIsVisible({ typeId: 'mfr' }, 'oct', 'arm')).toBe(true) - expect(sectionsStepIsVisible({ typeId: 'aca' }, 'oct', 'axm')).toBe(false) + expect(sectionsStepIsVisible({ typeId: ETAPES_TYPES.demande }, DEMARCHES_TYPES_IDS.Octroi, TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX)).toBe(true) + expect( + sectionsStepIsVisible({ typeId: ETAPES_TYPES.avisDeLaCommissionDesAutorisationsDeRecherchesMinieres_CARM_ }, DEMARCHES_TYPES_IDS.Octroi, TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX) + ).toBe(false) }) test('sectionsStepIsComplete', () => { - 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) + expect(sectionsStepIsComplete({ typeId: ETAPES_TYPES.demande, contenu: {} }, DEMARCHES_TYPES_IDS.Octroi, TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX).valid).toBe(false) + expect( + sectionsStepIsComplete( + { typeId: ETAPES_TYPES.demande, contenu: { arm: { mecanise: { value: true, heritee: false, etapeHeritee: null } } } }, + DEMARCHES_TYPES_IDS.Octroi, + TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX + ).valid + ).toBe(true) }) test('perimetreStepIsVisible', () => { - expect(perimetreStepIsVisible({ typeId: 'mfr' }, DEMARCHES_TYPES_IDS.Octroi)).toBe(true) - expect(perimetreStepIsVisible({ typeId: 'acg' }, DEMARCHES_TYPES_IDS.Octroi)).toBe(false) + expect(perimetreStepIsVisible({ typeId: ETAPES_TYPES.demande }, DEMARCHES_TYPES_IDS.Octroi)).toBe(true) + expect(perimetreStepIsVisible({ typeId: ETAPES_TYPES.avisDuConseilGeneralDeLeconomie_CGE_ }, DEMARCHES_TYPES_IDS.Octroi)).toBe(false) - expect(perimetreStepIsVisible({ typeId: 'mfr' }, DEMARCHES_TYPES_IDS.Mutation)).toBe(false) - expect(perimetreStepIsVisible({ typeId: 'acg' }, DEMARCHES_TYPES_IDS.Mutation)).toBe(false) + expect(perimetreStepIsVisible({ typeId: ETAPES_TYPES.demande }, DEMARCHES_TYPES_IDS.Mutation)).toBe(false) + expect(perimetreStepIsVisible({ typeId: ETAPES_TYPES.avisDuConseilGeneralDeLeconomie_CGE_ }, DEMARCHES_TYPES_IDS.Mutation)).toBe(false) }) test('perimetreStepIsComplete', () => { expect( perimetreStepIsComplete( { - typeId: 'mfr', + typeId: ETAPES_TYPES.demande, perimetre: { value: { geojson4326Perimetre: null, @@ -422,7 +435,7 @@ test('perimetreStepIsComplete', () => { expect( perimetreStepIsComplete( { - typeId: 'mfr', + typeId: ETAPES_TYPES.demande, perimetre: { value: { geojson4326Perimetre: { type: 'Feature', properties: {}, geometry: { type: 'MultiPolygon', coordinates: [] } }, @@ -444,7 +457,7 @@ test('perimetreStepIsComplete', () => { expect( perimetreStepIsComplete( { - typeId: 'acg', + typeId: ETAPES_TYPES.avisDuConseilGeneralDeLeconomie_CGE_, perimetre: { value: { geojson4326Perimetre: null, @@ -466,7 +479,7 @@ test('perimetreStepIsComplete', () => { expect( perimetreStepIsComplete( { - typeId: 'dpu', + typeId: ETAPES_TYPES.publicationDeDecisionAuJORF, perimetre: { value: { geojson4326Perimetre: null, @@ -495,7 +508,7 @@ test('perimetreStepIsComplete', () => { expect( perimetreStepIsComplete( { - typeId: 'dpu', + typeId: ETAPES_TYPES.publicationDeDecisionAuJORF, perimetre: { value: { geojson4326Perimetre: { type: 'Feature', properties: {}, geometry: { type: 'MultiPolygon', coordinates: [] } }, @@ -522,32 +535,32 @@ test('etapeDocumentsStepIsVisible', () => { const axmDocumentsComplete: Pick<EtapeDocument | TempEtapeDocument, 'etape_document_type_id'>[] = [ { - etape_document_type_id: 'car', + etape_document_type_id: DOCUMENTS_TYPES_IDS.documentsCartographiques, }, { - etape_document_type_id: 'lem', + etape_document_type_id: DOCUMENTS_TYPES_IDS.lettreDeDemande, }, { - etape_document_type_id: 'idm', + etape_document_type_id: DOCUMENTS_TYPES_IDS.identificationDeMateriel, }, { - etape_document_type_id: 'mes', + etape_document_type_id: DOCUMENTS_TYPES_IDS.mesuresPrevuesPourRehabiliterLeSite, }, { - etape_document_type_id: 'met', + etape_document_type_id: DOCUMENTS_TYPES_IDS.methodesPourLExecutionDesTravaux, }, { - etape_document_type_id: 'nip', + etape_document_type_id: DOCUMENTS_TYPES_IDS.noticeDImpact, }, { - etape_document_type_id: 'prg', + etape_document_type_id: DOCUMENTS_TYPES_IDS.programmeDesTravaux, }, { - etape_document_type_id: 'sch', + etape_document_type_id: DOCUMENTS_TYPES_IDS.schemaDePenetrationDuMassifForestier, }, ] @@ -559,7 +572,7 @@ test('etapeDocumentsStepIsComplete avec mecanisation', () => { DEMARCHES_TYPES_IDS.Octroi, TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, demarcheIdValidator.parse('demarcheId'), - [{ etape_document_type_id: 'dec' }], + [{ etape_document_type_id: DOCUMENTS_TYPES_IDS.decret }], [], firstEtapeDateValidator.parse('2022-01-01') ) @@ -582,7 +595,7 @@ test('etapeDocumentsStepIsComplete avec mecanisation', () => { DEMARCHES_TYPES_IDS.Octroi, TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, demarcheIdValidator.parse('demarcheId'), - [{ etape_document_type_id: 'dec' }], + [{ etape_document_type_id: DOCUMENTS_TYPES_IDS.decret }], [], firstEtapeDateValidator.parse('2022-01-01') ) @@ -601,11 +614,11 @@ test('etapeDocumentsStepIsComplete avec mecanisation', () => { test('etapeDocumentsStepIsComplete', () => { expect( etapeDocumentsStepIsComplete( - { typeId: 'cac', contenu: {}, isBrouillon: ETAPE_IS_NOT_BROUILLON }, - 'oct', - 'arm', + { typeId: ETAPES_TYPES.consultationDesAdministrationsCentrales, contenu: {}, isBrouillon: ETAPE_IS_NOT_BROUILLON }, + DEMARCHES_TYPES_IDS.Octroi, + TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, demarcheIdValidator.parse('demarcheId'), - [{ etape_document_type_id: 'dec' }], + [{ etape_document_type_id: DOCUMENTS_TYPES_IDS.decret }], [], firstEtapeDateValidator.parse('2022-01-01') ) @@ -620,9 +633,9 @@ test('etapeDocumentsStepIsComplete', () => { expect( etapeDocumentsStepIsComplete( - { typeId: 'mfr', contenu: {}, isBrouillon: ETAPE_IS_BROUILLON }, - 'oct', - 'axm', + { typeId: ETAPES_TYPES.demande, contenu: {}, isBrouillon: ETAPE_IS_BROUILLON }, + DEMARCHES_TYPES_IDS.Octroi, + TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX, demarcheIdValidator.parse('demarcheId'), axmDocumentsComplete, [], @@ -636,9 +649,9 @@ test('etapeDocumentsStepIsComplete', () => { expect( etapeDocumentsStepIsComplete( - { typeId: 'pqr', contenu: {}, isBrouillon: ETAPE_IS_BROUILLON }, - 'oct', - 'axm', + { typeId: ETAPES_TYPES.publicationDansUnJournalLocalOuNational, contenu: {}, isBrouillon: ETAPE_IS_BROUILLON }, + DEMARCHES_TYPES_IDS.Octroi, + TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX, demarcheIdValidator.parse('demarcheId'), [], [], @@ -652,41 +665,50 @@ test('etapeDocumentsStepIsComplete', () => { }) test('entrepriseDocumentsStepIsVisible', () => { - expect(entrepriseDocumentsStepIsVisible({ typeId: 'cac' }, 'oct', 'axm')).toBe(false) - expect(entrepriseDocumentsStepIsVisible({ typeId: 'mfr' }, 'oct', 'axm')).toBe(true) - expect(entrepriseDocumentsStepIsVisible({ typeId: 'pqr' }, 'oct', 'axm')).toBe(false) + expect(entrepriseDocumentsStepIsVisible({ typeId: ETAPES_TYPES.consultationDesAdministrationsCentrales }, DEMARCHES_TYPES_IDS.Octroi, TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX)).toBe( + false + ) + expect(entrepriseDocumentsStepIsVisible({ typeId: ETAPES_TYPES.demande }, DEMARCHES_TYPES_IDS.Octroi, TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX)).toBe(true) + expect(entrepriseDocumentsStepIsVisible({ typeId: ETAPES_TYPES.publicationDansUnJournalLocalOuNational }, DEMARCHES_TYPES_IDS.Octroi, TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX)).toBe( + false + ) }) test('entrepriseDocumentsStepIsComplete', () => { expect( entrepriseDocumentsStepIsComplete( - { typeId: 'cac', titulaires: { value: [], heritee: false, etapeHeritee: null }, amodiataires: { value: [], heritee: false, etapeHeritee: null }, contenu: {} }, - 'oct', - 'axm', + { + typeId: ETAPES_TYPES.consultationDesAdministrationsCentrales, + titulaires: { value: [], heritee: false, etapeHeritee: null }, + amodiataires: { value: [], heritee: false, etapeHeritee: null }, + contenu: {}, + }, + DEMARCHES_TYPES_IDS.Octroi, + TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX, [] ).valid ).toBe(true) expect( entrepriseDocumentsStepIsComplete( - { typeId: 'mfr', titulaires: { value: [], heritee: false, etapeHeritee: null }, amodiataires: { value: [], heritee: false, etapeHeritee: null }, contenu: {} }, - 'oct', - 'axm', + { typeId: ETAPES_TYPES.demande, titulaires: { value: [], heritee: false, etapeHeritee: null }, amodiataires: { value: [], heritee: false, etapeHeritee: null }, contenu: {} }, + DEMARCHES_TYPES_IDS.Octroi, + TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX, [] ).valid ).toBe(false) expect( entrepriseDocumentsStepIsComplete( - { typeId: 'mfr', titulaires: { value: [entreprise1Id], heritee: false, etapeHeritee: null }, amodiataires: { value: [], heritee: false, etapeHeritee: null }, contenu: {} }, - 'oct', - 'axm', + { typeId: ETAPES_TYPES.demande, titulaires: { value: [entreprise1Id], heritee: false, etapeHeritee: null }, amodiataires: { value: [], heritee: false, etapeHeritee: null }, contenu: {} }, + DEMARCHES_TYPES_IDS.Octroi, + TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX, [] ).valid ).toBe(false) expect( entrepriseDocumentsStepIsComplete( - { typeId: 'mfr', titulaires: { value: [], heritee: false, etapeHeritee: null }, amodiataires: { value: [entreprise1Id], heritee: false, etapeHeritee: null }, contenu: {} }, - 'oct', - 'axm', + { typeId: ETAPES_TYPES.demande, titulaires: { value: [], heritee: false, etapeHeritee: null }, amodiataires: { value: [entreprise1Id], heritee: false, etapeHeritee: null }, contenu: {} }, + DEMARCHES_TYPES_IDS.Octroi, + TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX, [] ).valid ).toBe(false) @@ -694,37 +716,37 @@ test('entrepriseDocumentsStepIsComplete', () => { expect( entrepriseDocumentsStepIsComplete( { - typeId: 'mfr', + typeId: ETAPES_TYPES.demande, titulaires: { value: [], heritee: false, etapeHeritee: null }, amodiataires: { value: [entreprise1Id], heritee: false, etapeHeritee: null }, contenu: { arm: { mecanise: { value: false, heritee: false, etapeHeritee: null } } }, }, - 'oct', - 'arm', + DEMARCHES_TYPES_IDS.Octroi, + TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, [ { - documentTypeId: 'atf', + documentTypeId: DOCUMENTS_TYPES_IDS.attestationFiscale, entrepriseId: entreprise1Id, }, { - documentTypeId: 'cur', + documentTypeId: DOCUMENTS_TYPES_IDS.curriculumVitae, entrepriseId: entreprise1Id, }, { - documentTypeId: 'jid', + documentTypeId: DOCUMENTS_TYPES_IDS.justificatifDIdentite, entrepriseId: entreprise1Id, }, { - documentTypeId: 'jct', + documentTypeId: DOCUMENTS_TYPES_IDS.justificatifDesCapacitesTechniques, entrepriseId: entreprise1Id, }, { - documentTypeId: 'kbi', + documentTypeId: DOCUMENTS_TYPES_IDS.kbis, entrepriseId: entreprise1Id, }, { - documentTypeId: 'jcf', + documentTypeId: DOCUMENTS_TYPES_IDS.justificatifDesCapacitesFinancieres, entrepriseId: entreprise1Id, }, ] @@ -733,7 +755,17 @@ test('entrepriseDocumentsStepIsComplete', () => { }) test('getDocumentsTypes', () => { - expect(getDocumentsTypes({ typeId: 'cac' }, 'oct', 'axm', demarcheIdValidator.parse('demarcheId'), [], false, firstEtapeDateValidator.parse('2022-01-01'))).toMatchInlineSnapshot(` + expect( + getDocumentsTypes( + { typeId: ETAPES_TYPES.consultationDesAdministrationsCentrales }, + DEMARCHES_TYPES_IDS.Octroi, + TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX, + demarcheIdValidator.parse('demarcheId'), + [], + IS_ARM_NON_MECANISE, + firstEtapeDateValidator.parse('2022-01-01') + ) + ).toMatchInlineSnapshot(` [ { "id": "lcm", @@ -748,7 +780,17 @@ test('getDocumentsTypes', () => { ] `) - expect(getDocumentsTypes({ typeId: 'mfr' }, 'oct', 'arm', demarcheIdValidator.parse('demarcheId'), [], false, firstEtapeDateValidator.parse('2022-01-01'))).toMatchInlineSnapshot(` + expect( + getDocumentsTypes( + { typeId: ETAPES_TYPES.demande }, + DEMARCHES_TYPES_IDS.Octroi, + TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, + demarcheIdValidator.parse('demarcheId'), + [], + IS_ARM_NON_MECANISE, + firstEtapeDateValidator.parse('2022-01-01') + ) + ).toMatchInlineSnapshot(` [ { "id": "cam", @@ -849,7 +891,17 @@ test('getDocumentsTypes', () => { ] `) - expect(getDocumentsTypes({ typeId: 'mfr' }, 'oct', 'arm', demarcheIdValidator.parse('demarcheId'), [], true, firstEtapeDateValidator.parse('2022-01-01'))).toMatchInlineSnapshot(` + expect( + getDocumentsTypes( + { typeId: ETAPES_TYPES.demande }, + DEMARCHES_TYPES_IDS.Octroi, + TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, + demarcheIdValidator.parse('demarcheId'), + [], + IS_ARM_MECANISE, + firstEtapeDateValidator.parse('2022-01-01') + ) + ).toMatchInlineSnapshot(` [ { "id": "cam", @@ -949,37 +1001,184 @@ test('getDocumentsTypes', () => { }, ] `) - - expect(getDocumentsTypes({ typeId: 'mfr' }, 'oct', 'axm', demarcheIdValidator.parse('demarcheId'), ['1'], false, firstEtapeDateValidator.parse('2022-01-01'))).toMatchSnapshot() - expect(getDocumentsTypes({ typeId: 'mfr' }, 'oct', 'axm', demarcheIdValidator.parse('demarcheId'), ['2'], false, firstEtapeDateValidator.parse('2022-01-01'))).toMatchSnapshot() - expect(getDocumentsTypes({ typeId: 'mfr' }, 'oct', 'axm', demarcheIdValidator.parse('demarcheId'), ['2'], false, firstEtapeDateValidator.parse('2024-12-01'))).toMatchSnapshot() + expect( + getDocumentsTypes( + { typeId: ETAPES_TYPES.demande }, + DEMARCHES_TYPES_IDS.Octroi, + TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, + demarcheIdValidator.parse('demarcheId'), + [], + IS_ARM_MECANISE, + firstEtapeDateValidator.parse('2024-10-01') + ) + ).toMatchInlineSnapshot(` + [ + { + "id": "cam", + "nom": "Contrat d'amodiation", + "optionnel": true, + }, + { + "description": undefined, + "id": "car", + "nom": "Documents cartographiques", + "optionnel": false, + }, + { + "id": "cnt", + "nom": "Contrat", + "optionnel": true, + }, + { + "id": "cod", + "nom": "Compléments au dossier de demande", + "optionnel": true, + }, + { + "description": undefined, + "id": "dep", + "nom": "Décision cas par cas", + "optionnel": true, + }, + { + "description": undefined, + "id": "doe", + "nom": "Dossier "Loi sur l'eau"", + "optionnel": false, + }, + { + "description": undefined, + "id": "dom", + "nom": "Dossier de demande", + "optionnel": false, + }, + { + "id": "dos", + "nom": "Dossier", + "optionnel": true, + }, + { + "id": "fac", + "nom": "Facture", + "optionnel": true, + }, + { + "id": "fic", + "nom": "Fiche de complétude", + "optionnel": true, + }, + { + "id": "fip", + "nom": "Fiche de présentation", + "optionnel": true, + }, + { + "description": undefined, + "id": "for", + "nom": "Formulaire de demande", + "optionnel": false, + }, + { + "description": undefined, + "id": "jpa", + "nom": "Justificatif de paiement", + "optionnel": true, + }, + { + "id": "lem", + "nom": "Lettre de demande", + "optionnel": true, + }, + { + "id": "let", + "nom": "Lettre", + "optionnel": true, + }, + { + "id": "noi", + "nom": "Notice d'incidence", + "optionnel": true, + }, + { + "id": "rec", + "nom": "Récépissé "Loi sur l'eau"", + "optionnel": true, + }, + { + "id": "aut", + "nom": "Autre document", + "optionnel": true, + }, + ] + `) + expect( + getDocumentsTypes( + { typeId: ETAPES_TYPES.demande }, + DEMARCHES_TYPES_IDS.Octroi, + TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX, + demarcheIdValidator.parse('demarcheId'), + ['1'], + IS_ARM_NON_MECANISE, + firstEtapeDateValidator.parse('2022-01-01') + ) + ).toMatchSnapshot() + expect( + getDocumentsTypes( + { typeId: ETAPES_TYPES.demande }, + DEMARCHES_TYPES_IDS.Octroi, + TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX, + demarcheIdValidator.parse('demarcheId'), + ['2'], + IS_ARM_NON_MECANISE, + firstEtapeDateValidator.parse('2022-01-01') + ) + ).toMatchSnapshot() + expect( + getDocumentsTypes( + { typeId: ETAPES_TYPES.demande }, + DEMARCHES_TYPES_IDS.Octroi, + TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX, + demarcheIdValidator.parse('demarcheId'), + ['2'], + IS_ARM_NON_MECANISE, + firstEtapeDateValidator.parse('2024-12-01') + ) + ).toMatchSnapshot() }) const demarcheId = demarcheIdValidator.parse('demarcheId') const firstEtapeDate = firstEtapeDateValidator.parse('2022-01-01') test("getAvisType avis de l'office national des forêts est optionnel pour la procédure spécifique", () => { - const avis = getAvisTypes('asc', 'arm', 'oct', demarcheId, firstEtapeDateValidator.parse('2024-11-01'), []) - expect(avis.find(unAvis => unAvis.id === 'avisOfficeNationalDesForets' && unAvis.optionnel)).toMatchInlineSnapshot(` - { - "id": "avisOfficeNationalDesForets", - "nom": "Avis de l'Office National des Forêts", - "optionnel": true, + const avis = getAvisTypes( + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, + TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, + DEMARCHES_TYPES_IDS.Octroi, + demarcheId, + firstEtapeDateValidator.parse('2024-11-01'), + [], + IS_ARM_MECANISE + ) + expect(avis.avisOfficeNationalDesForets?.optionnel).toBe(true) +}) +test("getAvisType: avis au cas par cas et avis du propriétaire du sol sont obligatoires pour les demandes d'ARM mécanisée de la procédure spécifique", () => { + expect(getAvisTypes(ETAPES_TYPES.demande, TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, DEMARCHES_TYPES_IDS.Octroi, demarcheId, firstEtapeDate, [], IS_ARM_MECANISE)).toMatchInlineSnapshot(`{}`) + expect( + getAvisTypes(ETAPES_TYPES.demande, TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, DEMARCHES_TYPES_IDS.Octroi, demarcheId, firstEtapeDateValidator.parse('2025-01-01'), [], IS_ARM_MECANISE) + ).toMatchInlineSnapshot(` + { + "avisCasParCas": { + "id": "avisCasParCas", + "nom": "Décision au cas par cas", + "optionnel": false, "statutIds": [ - "Favorable", - "Défavorable", - "Favorable avec réserves", - "Non renseigné", + "Exempté", + "Requis", ], - } - `) -}) -test('getAvisType', () => { - expect(getAvisTypes(ETAPES_TYPES.avisDesCollectivites, 'arm', 'oct', demarcheId, firstEtapeDate, [])).toMatchInlineSnapshot(` - [ - { - "id": "avisDUneCollectivite", - "nom": "Avis d'une collectivité", - "optionnel": true, + }, + "avisProprietaireDuSol": { + "id": "avisProprietaireDuSol", + "nom": "avis du propriétaire du sol", + "optionnel": false, "statutIds": [ "Favorable", "Défavorable", @@ -987,14 +1186,34 @@ test('getAvisType', () => { "Non renseigné", ], }, - ] + } `) - expect(getAvisTypes('mfr', 'arm', 'oct', demarcheId, firstEtapeDate, [])).toMatchInlineSnapshot('[]') - expect(getAvisTypes('asc', 'arm', 'oct', demarcheId, firstEtapeDate, [])).toMatchInlineSnapshot(` - [ - { - "id": "avisDirectionRegionaleDesAffairesCulturelles", - "nom": "Avis de la Direction Régionale Des Affaires Culturelles (DRAC)", +}) +test('getAvisType', () => { + expect(getAvisTypes(ETAPES_TYPES.avisDesCollectivites, TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, DEMARCHES_TYPES_IDS.Octroi, demarcheId, firstEtapeDate, [], IS_ARM_MECANISE)) + .toMatchInlineSnapshot(` + { + "avisDUneCollectivite": { + "id": "avisDUneCollectivite", + "nom": "Avis d'une collectivité", + "optionnel": true, + "statutIds": [ + "Favorable", + "Défavorable", + "Favorable avec réserves", + "Non renseigné", + ], + }, + } + `) + expect(getAvisTypes(ETAPES_TYPES.demande, TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, DEMARCHES_TYPES_IDS.Octroi, demarcheId, firstEtapeDate, [], IS_ARM_MECANISE)).toMatchInlineSnapshot(`{}`) + expect( + getAvisTypes(ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, DEMARCHES_TYPES_IDS.Octroi, demarcheId, firstEtapeDate, [], IS_ARM_MECANISE) + ).toMatchInlineSnapshot(` + { + "autreAvis": { + "id": "autreAvis", + "nom": "Autre avis", "optionnel": true, "statutIds": [ "Favorable", @@ -1003,9 +1222,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques", - "nom": "Avis du Conseil Départemental de l'Environnement et des Risques Sanitaires et Technologiques (CODERST)", + "avisAgenceRegionaleSante": { + "id": "avisAgenceRegionaleSante", + "nom": "Avis de l'Agence Régionale de Santé (ARS)", "optionnel": true, "statutIds": [ "Favorable", @@ -1014,9 +1233,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisDirectionsRégionalesEconomieEmploiTravailSolidarités", - "nom": "Avis de la Direction régionale de l'économie, de l'emploi, du travail et des solidarités", + "avisAutoriteMilitaire": { + "id": "avisAutoriteMilitaire", + "nom": "Avis de l'Autorité militaire", "optionnel": true, "statutIds": [ "Favorable", @@ -1025,9 +1244,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisDirectionRegionaleFinancesPubliques", - "nom": "Avis de la Direction Regionale Des Finances Publiques", + "avisCaisseGeneraleSecuriteSociale": { + "id": "avisCaisseGeneraleSecuriteSociale", + "nom": "Avis de la Caisse Générale de Sécurité Sociale", "optionnel": true, "statutIds": [ "Favorable", @@ -1036,9 +1255,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisGendarmerieNationale", - "nom": "Avis de la Gendarmerie Nationale", + "avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques": { + "id": "avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques", + "nom": "Avis du Conseil Départemental de l'Environnement et des Risques Sanitaires et Technologiques (CODERST)", "optionnel": true, "statutIds": [ "Favorable", @@ -1047,9 +1266,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisIFREMER", - "nom": "Avis de l'IFREMER", + "avisDirectionDepartementaleTerritoiresMer": { + "id": "avisDirectionDepartementaleTerritoiresMer", + "nom": "Avis de la Direction Départementale des Territoires et de la Mer (DDTM)", "optionnel": true, "statutIds": [ "Favorable", @@ -1058,9 +1277,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisInstitutNationalOrigineQualite", - "nom": "Avis de l'Institut National de l'origine et de la Qualité", + "avisDirectionRegionaleDesAffairesCulturelles": { + "id": "avisDirectionRegionaleDesAffairesCulturelles", + "nom": "Avis de la Direction Régionale Des Affaires Culturelles (DRAC)", "optionnel": true, "statutIds": [ "Favorable", @@ -1069,9 +1288,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisServiceAdministratifLocal", - "nom": "Avis d'un Service Administratif Local", + "avisDirectionRegionaleFinancesPubliques": { + "id": "avisDirectionRegionaleFinancesPubliques", + "nom": "Avis de la Direction Regionale Des Finances Publiques", "optionnel": true, "statutIds": [ "Favorable", @@ -1080,9 +1299,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisAutoriteMilitaire", - "nom": "Avis de l'Autorité militaire", + "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", "optionnel": true, "statutIds": [ "Favorable", @@ -1091,9 +1310,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisParcNational", - "nom": "Avis du Parc National", + "avisGendarmerieNationale": { + "id": "avisGendarmerieNationale", + "nom": "Avis de la Gendarmerie Nationale", "optionnel": true, "statutIds": [ "Favorable", @@ -1102,9 +1321,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisDirectionDepartementaleTerritoiresMer", - "nom": "Avis de la Direction Départementale des Territoires et de la Mer (DDTM)", + "avisIFREMER": { + "id": "avisIFREMER", + "nom": "Avis de l'IFREMER", "optionnel": true, "statutIds": [ "Favorable", @@ -1113,9 +1332,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisAgenceRegionaleSante", - "nom": "Avis de l'Agence Régionale de Santé (ARS)", + "avisInstitutNationalOrigineQualite": { + "id": "avisInstitutNationalOrigineQualite", + "nom": "Avis de l'Institut National de l'origine et de la Qualité", "optionnel": true, "statutIds": [ "Favorable", @@ -1124,10 +1343,10 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisCaisseGeneraleSecuriteSociale", - "nom": "Avis de la Caisse Générale de Sécurité Sociale", - "optionnel": true, + "avisOfficeNationalDesForets": { + "id": "avisOfficeNationalDesForets", + "nom": "Avis de l'Office National des Forêts", + "optionnel": false, "statutIds": [ "Favorable", "Défavorable", @@ -1135,9 +1354,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "autreAvis", - "nom": "Autre avis", + "avisParcNational": { + "id": "avisParcNational", + "nom": "Avis du Parc National", "optionnel": true, "statutIds": [ "Favorable", @@ -1146,10 +1365,10 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisOfficeNationalDesForets", - "nom": "Avis de l'Office National des Forêts", - "optionnel": false, + "avisParcNaturelMarin": { + "id": "avisParcNaturelMarin", + "nom": "Avis du Parc Naturel Marin", + "optionnel": true, "statutIds": [ "Favorable", "Défavorable", @@ -1157,9 +1376,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "expertiseOfficeNationalDesForets", - "nom": "Expertise de l'Office National des Forêts", + "avisServiceAdministratifLocal": { + "id": "avisServiceAdministratifLocal", + "nom": "Avis d'un Service Administratif Local", "optionnel": true, "statutIds": [ "Favorable", @@ -1168,9 +1387,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisParcNaturelMarin", - "nom": "Avis du Parc Naturel Marin", + "expertiseOfficeNationalDesForets": { + "id": "expertiseOfficeNationalDesForets", + "nom": "Expertise de l'Office National des Forêts", "optionnel": true, "statutIds": [ "Favorable", @@ -1179,13 +1398,23 @@ test('getAvisType', () => { "Non renseigné", ], }, - ] + } `) - expect(getAvisTypes('asc', 'arm', 'oct', demarcheId, firstEtapeDate, [communeIdValidator.parse('97302')])).toMatchInlineSnapshot(` - [ - { - "id": "avisDirectionRegionaleDesAffairesCulturelles", - "nom": "Avis de la Direction Régionale Des Affaires Culturelles (DRAC)", + expect( + getAvisTypes( + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, + TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, + DEMARCHES_TYPES_IDS.Octroi, + demarcheId, + firstEtapeDate, + [communeIdValidator.parse('97302')], + IS_ARM_MECANISE + ) + ).toMatchInlineSnapshot(` + { + "autreAvis": { + "id": "autreAvis", + "nom": "Autre avis", "optionnel": true, "statutIds": [ "Favorable", @@ -1194,9 +1423,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques", - "nom": "Avis du Conseil Départemental de l'Environnement et des Risques Sanitaires et Technologiques (CODERST)", + "avisAgenceRegionaleSante": { + "id": "avisAgenceRegionaleSante", + "nom": "Avis de l'Agence Régionale de Santé (ARS)", "optionnel": true, "statutIds": [ "Favorable", @@ -1205,9 +1434,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisDirectionsRégionalesEconomieEmploiTravailSolidarités", - "nom": "Avis de la Direction régionale de l'économie, de l'emploi, du travail et des solidarités", + "avisAutoriteMilitaire": { + "id": "avisAutoriteMilitaire", + "nom": "Avis de l'Autorité militaire", "optionnel": true, "statutIds": [ "Favorable", @@ -1216,9 +1445,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisDirectionRegionaleFinancesPubliques", - "nom": "Avis de la Direction Regionale Des Finances Publiques", + "avisCaisseGeneraleSecuriteSociale": { + "id": "avisCaisseGeneraleSecuriteSociale", + "nom": "Avis de la Caisse Générale de Sécurité Sociale", "optionnel": true, "statutIds": [ "Favorable", @@ -1227,9 +1456,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisGendarmerieNationale", - "nom": "Avis de la Gendarmerie Nationale", + "avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques": { + "id": "avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques", + "nom": "Avis du Conseil Départemental de l'Environnement et des Risques Sanitaires et Technologiques (CODERST)", "optionnel": true, "statutIds": [ "Favorable", @@ -1238,9 +1467,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisIFREMER", - "nom": "Avis de l'IFREMER", + "avisDirectionAlimentationAgricultureForet": { + "id": "avisDirectionAlimentationAgricultureForet", + "nom": "Avis de la Direction de l'Alimentation de l'Agriculture et de la Forêt (DRAF)", "optionnel": true, "statutIds": [ "Favorable", @@ -1249,9 +1478,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisInstitutNationalOrigineQualite", - "nom": "Avis de l'Institut National de l'origine et de la Qualité", + "avisDirectionDepartementaleTerritoiresMer": { + "id": "avisDirectionDepartementaleTerritoiresMer", + "nom": "Avis de la Direction Départementale des Territoires et de la Mer (DDTM)", "optionnel": true, "statutIds": [ "Favorable", @@ -1260,9 +1489,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisServiceAdministratifLocal", - "nom": "Avis d'un Service Administratif Local", + "avisDirectionRegionaleDesAffairesCulturelles": { + "id": "avisDirectionRegionaleDesAffairesCulturelles", + "nom": "Avis de la Direction Régionale Des Affaires Culturelles (DRAC)", "optionnel": true, "statutIds": [ "Favorable", @@ -1271,9 +1500,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisAutoriteMilitaire", - "nom": "Avis de l'Autorité militaire", + "avisDirectionRegionaleFinancesPubliques": { + "id": "avisDirectionRegionaleFinancesPubliques", + "nom": "Avis de la Direction Regionale Des Finances Publiques", "optionnel": true, "statutIds": [ "Favorable", @@ -1282,9 +1511,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisParcNational", - "nom": "Avis du Parc National", + "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", "optionnel": true, "statutIds": [ "Favorable", @@ -1293,9 +1522,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisDirectionDepartementaleTerritoiresMer", - "nom": "Avis de la Direction Départementale des Territoires et de la Mer (DDTM)", + "avisEtatMajorOrpaillagePecheIllicite": { + "id": "avisEtatMajorOrpaillagePecheIllicite", + "nom": "Avis de l'État-major Orpaillage et Pêche Illicite (EMOPI)", "optionnel": true, "statutIds": [ "Favorable", @@ -1304,9 +1533,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisAgenceRegionaleSante", - "nom": "Avis de l'Agence Régionale de Santé (ARS)", + "avisGendarmerieNationale": { + "id": "avisGendarmerieNationale", + "nom": "Avis de la Gendarmerie Nationale", "optionnel": true, "statutIds": [ "Favorable", @@ -1315,9 +1544,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisCaisseGeneraleSecuriteSociale", - "nom": "Avis de la Caisse Générale de Sécurité Sociale", + "avisIFREMER": { + "id": "avisIFREMER", + "nom": "Avis de l'IFREMER", "optionnel": true, "statutIds": [ "Favorable", @@ -1326,9 +1555,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "autreAvis", - "nom": "Autre avis", + "avisInstitutNationalOrigineQualite": { + "id": "avisInstitutNationalOrigineQualite", + "nom": "Avis de l'Institut National de l'origine et de la Qualité", "optionnel": true, "statutIds": [ "Favorable", @@ -1337,7 +1566,7 @@ test('getAvisType', () => { "Non renseigné", ], }, - { + "avisOfficeNationalDesForets": { "id": "avisOfficeNationalDesForets", "nom": "Avis de l'Office National des Forêts", "optionnel": false, @@ -1348,9 +1577,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "expertiseOfficeNationalDesForets", - "nom": "Expertise de l'Office National des Forêts", + "avisParcNational": { + "id": "avisParcNational", + "nom": "Avis du Parc National", "optionnel": true, "statutIds": [ "Favorable", @@ -1359,7 +1588,7 @@ test('getAvisType', () => { "Non renseigné", ], }, - { + "avisParcNaturelMarin": { "id": "avisParcNaturelMarin", "nom": "Avis du Parc Naturel Marin", "optionnel": true, @@ -1370,9 +1599,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisDirectionAlimentationAgricultureForet", - "nom": "Avis de la Direction de l'Alimentation de l'Agriculture et de la Forêt (DRAF)", + "avisServiceAdministratifLocal": { + "id": "avisServiceAdministratifLocal", + "nom": "Avis d'un Service Administratif Local", "optionnel": true, "statutIds": [ "Favorable", @@ -1381,9 +1610,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisEtatMajorOrpaillagePecheIllicite", - "nom": "Avis de l'État-major Orpaillage et Pêche Illicite (EMOPI)", + "expertiseOfficeNationalDesForets": { + "id": "expertiseOfficeNationalDesForets", + "nom": "Expertise de l'Office National des Forêts", "optionnel": true, "statutIds": [ "Favorable", @@ -1392,13 +1621,23 @@ test('getAvisType', () => { "Non renseigné", ], }, - ] + } `) - expect(getAvisTypes('asc', 'axm', 'oct', demarcheId, firstEtapeDate, [communeIdValidator.parse('97302')])).toMatchInlineSnapshot(` - [ - { - "id": "avisDirectionRegionaleDesAffairesCulturelles", - "nom": "Avis de la Direction Régionale Des Affaires Culturelles (DRAC)", + expect( + getAvisTypes( + ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, + TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX, + DEMARCHES_TYPES_IDS.Octroi, + demarcheId, + firstEtapeDate, + [communeIdValidator.parse('97302')], + IS_ARM_MECANISE + ) + ).toMatchInlineSnapshot(` + { + "autreAvis": { + "id": "autreAvis", + "nom": "Autre avis", "optionnel": true, "statutIds": [ "Favorable", @@ -1407,9 +1646,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques", - "nom": "Avis du Conseil Départemental de l'Environnement et des Risques Sanitaires et Technologiques (CODERST)", + "avisAgenceRegionaleSante": { + "id": "avisAgenceRegionaleSante", + "nom": "Avis de l'Agence Régionale de Santé (ARS)", "optionnel": true, "statutIds": [ "Favorable", @@ -1418,9 +1657,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisDirectionsRégionalesEconomieEmploiTravailSolidarités", - "nom": "Avis de la Direction régionale de l'économie, de l'emploi, du travail et des solidarités", + "avisAutoriteMilitaire": { + "id": "avisAutoriteMilitaire", + "nom": "Avis de l'Autorité militaire", "optionnel": true, "statutIds": [ "Favorable", @@ -1429,9 +1668,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisDirectionRegionaleFinancesPubliques", - "nom": "Avis de la Direction Regionale Des Finances Publiques", + "avisCaisseGeneraleSecuriteSociale": { + "id": "avisCaisseGeneraleSecuriteSociale", + "nom": "Avis de la Caisse Générale de Sécurité Sociale", "optionnel": true, "statutIds": [ "Favorable", @@ -1440,9 +1679,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisGendarmerieNationale", - "nom": "Avis de la Gendarmerie Nationale", + "avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques": { + "id": "avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques", + "nom": "Avis du Conseil Départemental de l'Environnement et des Risques Sanitaires et Technologiques (CODERST)", "optionnel": true, "statutIds": [ "Favorable", @@ -1451,9 +1690,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisIFREMER", - "nom": "Avis de l'IFREMER", + "avisDirectionAlimentationAgricultureForet": { + "id": "avisDirectionAlimentationAgricultureForet", + "nom": "Avis de la Direction de l'Alimentation de l'Agriculture et de la Forêt (DRAF)", "optionnel": true, "statutIds": [ "Favorable", @@ -1462,9 +1701,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisInstitutNationalOrigineQualite", - "nom": "Avis de l'Institut National de l'origine et de la Qualité", + "avisDirectionDepartementaleTerritoiresMer": { + "id": "avisDirectionDepartementaleTerritoiresMer", + "nom": "Avis de la Direction Départementale des Territoires et de la Mer (DDTM)", "optionnel": true, "statutIds": [ "Favorable", @@ -1473,9 +1712,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisServiceAdministratifLocal", - "nom": "Avis d'un Service Administratif Local", + "avisDirectionRegionaleDesAffairesCulturelles": { + "id": "avisDirectionRegionaleDesAffairesCulturelles", + "nom": "Avis de la Direction Régionale Des Affaires Culturelles (DRAC)", "optionnel": true, "statutIds": [ "Favorable", @@ -1484,9 +1723,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisAutoriteMilitaire", - "nom": "Avis de l'Autorité militaire", + "avisDirectionRegionaleFinancesPubliques": { + "id": "avisDirectionRegionaleFinancesPubliques", + "nom": "Avis de la Direction Regionale Des Finances Publiques", "optionnel": true, "statutIds": [ "Favorable", @@ -1495,9 +1734,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisParcNational", - "nom": "Avis du Parc National", + "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", "optionnel": true, "statutIds": [ "Favorable", @@ -1506,9 +1745,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisDirectionDepartementaleTerritoiresMer", - "nom": "Avis de la Direction Départementale des Territoires et de la Mer (DDTM)", + "avisEtatMajorOrpaillagePecheIllicite": { + "id": "avisEtatMajorOrpaillagePecheIllicite", + "nom": "Avis de l'État-major Orpaillage et Pêche Illicite (EMOPI)", "optionnel": true, "statutIds": [ "Favorable", @@ -1517,9 +1756,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisAgenceRegionaleSante", - "nom": "Avis de l'Agence Régionale de Santé (ARS)", + "avisGendarmerieNationale": { + "id": "avisGendarmerieNationale", + "nom": "Avis de la Gendarmerie Nationale", "optionnel": true, "statutIds": [ "Favorable", @@ -1528,9 +1767,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisCaisseGeneraleSecuriteSociale", - "nom": "Avis de la Caisse Générale de Sécurité Sociale", + "avisIFREMER": { + "id": "avisIFREMER", + "nom": "Avis de l'IFREMER", "optionnel": true, "statutIds": [ "Favorable", @@ -1539,9 +1778,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "autreAvis", - "nom": "Autre avis", + "avisInstitutNationalOrigineQualite": { + "id": "avisInstitutNationalOrigineQualite", + "nom": "Avis de l'Institut National de l'origine et de la Qualité", "optionnel": true, "statutIds": [ "Favorable", @@ -1550,7 +1789,7 @@ test('getAvisType', () => { "Non renseigné", ], }, - { + "avisOfficeNationalDesForets": { "id": "avisOfficeNationalDesForets", "nom": "Avis de l'Office National des Forêts", "optionnel": true, @@ -1561,9 +1800,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "expertiseOfficeNationalDesForets", - "nom": "Expertise de l'Office National des Forêts", + "avisParcNational": { + "id": "avisParcNational", + "nom": "Avis du Parc National", "optionnel": true, "statutIds": [ "Favorable", @@ -1572,7 +1811,7 @@ test('getAvisType', () => { "Non renseigné", ], }, - { + "avisParcNaturelMarin": { "id": "avisParcNaturelMarin", "nom": "Avis du Parc Naturel Marin", "optionnel": true, @@ -1583,9 +1822,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisDirectionAlimentationAgricultureForet", - "nom": "Avis de la Direction de l'Alimentation de l'Agriculture et de la Forêt (DRAF)", + "avisServiceAdministratifLocal": { + "id": "avisServiceAdministratifLocal", + "nom": "Avis d'un Service Administratif Local", "optionnel": true, "statutIds": [ "Favorable", @@ -1594,9 +1833,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "avisEtatMajorOrpaillagePecheIllicite", - "nom": "Avis de l'État-major Orpaillage et Pêche Illicite (EMOPI)", + "confirmationAccordProprietaireDuSol": { + "id": "confirmationAccordProprietaireDuSol", + "nom": "Confirmation de l'accord du propriétaire du sol", "optionnel": true, "statutIds": [ "Favorable", @@ -1605,9 +1844,9 @@ test('getAvisType', () => { "Non renseigné", ], }, - { - "id": "confirmationAccordProprietaireDuSol", - "nom": "Confirmation de l'accord du propriétaire du sol", + "expertiseOfficeNationalDesForets": { + "id": "expertiseOfficeNationalDesForets", + "nom": "Expertise de l'Office National des Forêts", "optionnel": true, "statutIds": [ "Favorable", @@ -1616,11 +1855,21 @@ test('getAvisType', () => { "Non renseigné", ], }, - ] + } `) - expect(getAvisTypes('cac', 'prw', 'oct', demarcheId, firstEtapeDate, [])).toMatchInlineSnapshot(` - [ - { + expect( + getAvisTypes( + ETAPES_TYPES.consultationDesAdministrationsCentrales, + TITRES_TYPES_IDS.PERMIS_EXCLUSIF_DE_RECHERCHES_GRANULATS_MARINS, + DEMARCHES_TYPES_IDS.Octroi, + demarcheId, + firstEtapeDate, + [], + IS_ARM_MECANISE + ) + ).toMatchInlineSnapshot(` + { + "autreAvis": { "id": "autreAvis", "nom": "Autre avis", "optionnel": true, @@ -1631,16 +1880,68 @@ test('getAvisType', () => { "Non renseigné", ], }, - ] + } `) }) test('etapeAvisStepIsVisible', () => { - expect(etapeAvisStepIsVisible({ typeId: 'mfr' }, 'arm', 'oct', demarcheId, firstEtapeDate, [])).toBe(false) - expect(etapeAvisStepIsVisible({ typeId: 'asc' }, 'arm', 'oct', demarcheId, firstEtapeDate, [])).toBe(true) + expect(etapeAvisStepIsVisible({ typeId: ETAPES_TYPES.demande, contenu: {} }, TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, DEMARCHES_TYPES_IDS.Octroi, demarcheId, firstEtapeDate, [])).toBe( + false + ) + expect( + etapeAvisStepIsVisible( + { typeId: ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, contenu: {} }, + TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, + DEMARCHES_TYPES_IDS.Octroi, + demarcheId, + firstEtapeDate, + [] + ) + ).toBe(true) }) test('etapeAvisStepIsComplete', () => { - expect(etapeAvisStepIsComplete({ typeId: ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives }, [{ avis_type_id: 'autreAvis' }], 'arm', 'oct', demarcheId, firstEtapeDate, []).valid).toBe(false) - expect(etapeAvisStepIsComplete({ typeId: ETAPES_TYPES.avisDesCollectivites }, [{ avis_type_id: 'autreAvis' }], 'arm', 'oct', demarcheId, firstEtapeDate, []).valid).toBe(true) + expect( + etapeAvisStepIsComplete( + { typeId: ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, contenu: {} }, + [{ avis_type_id: 'autreAvis' }], + TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, + DEMARCHES_TYPES_IDS.Octroi, + demarcheId, + firstEtapeDate, + [] + ).valid + ).toBe(false) + expect( + etapeAvisStepIsComplete( + { typeId: ETAPES_TYPES.avisDesCollectivites, contenu: {} }, + [{ avis_type_id: 'autreAvis' }], + TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, + DEMARCHES_TYPES_IDS.Octroi, + demarcheId, + firstEtapeDate, + [] + ).valid + ).toBe(true) +}) + +describe('isArmMecanise', () => { + test('retourne false pour un flattened contenu vide', () => { + expect(isArmMecanise({})).toBe(IS_ARM_NON_MECANISE) + }) + test('retourne false pour une ARM non mécanisée (flattened contenu)', () => { + expect(isArmMecanise({ arm: { mecanise: { value: false, heritee: false, etapeHeritee: null } } })).toBe(IS_ARM_NON_MECANISE) + }) + test('retourne true pour une ARM mécanisée (flattened contenu)', () => { + expect(isArmMecanise({ arm: { mecanise: { value: true, heritee: false, etapeHeritee: null } } })).toBe(IS_ARM_MECANISE) + }) + test('retourne false pour des sections with value vides', () => { + expect(isArmMecanise([])).toBe(IS_ARM_NON_MECANISE) + }) + test('retourne false pour une ARM non mécanisée (sections with value)', () => { + expect(isArmMecanise([{ id: 'arm', elements: [{ id: 'mecanise', type: 'checkbox', optionnel: false, value: false }] }])).toBe(IS_ARM_NON_MECANISE) + }) + test('retourne true pour une ARM mécanisée (sections with value)', () => { + expect(isArmMecanise([{ id: 'arm', elements: [{ id: 'mecanise', type: 'checkbox', optionnel: false, value: true }] }])).toBe(IS_ARM_MECANISE) + }) }) diff --git a/packages/common/src/permissions/etape-form.ts b/packages/common/src/permissions/etape-form.ts index 8909255e0d31a77546564f3518d8b4e9b312fb4f..2c17b27befcaa92d4923a7abf88d7fb43216d0bb 100644 --- a/packages/common/src/permissions/etape-form.ts +++ b/packages/common/src/permissions/etape-form.ts @@ -1,5 +1,5 @@ import { EntrepriseDocumentId, EntrepriseId } from '../entreprise' -import { FlattenEtape } from '../etape-form' +import { FlattenedContenu, FlattenEtape } from '../etape-form' import { EtapeAvis, EtapeDocument, TempEtapeAvis, TempEtapeDocument } from '../etape' import { User, isAdministrationAdmin, isAdministrationEditeur, isSuper } from '../roles' import { AvisTypeId, AvisTypes } from '../static/avisTypes' @@ -21,6 +21,8 @@ import { canEditAmodiataires, canEditDuree, canEditPerimetre, canEditTitulaires import { machineIdFind } from '../machines' import { DemarcheId } from '../demarche' import { FirstEtapeDate } from '../date' +import { z } from 'zod' +import { SectionWithValue } from '../sections' type ValidReturn = { valid: true } | { valid: false; errors: NonEmptyArray<string> } @@ -135,13 +137,19 @@ export const perimetreStepIsComplete = (etape: Pick<FlattenEtape, 'typeId' | 'pe return { valid: true } } +const isArmMecaniseValidator = z.boolean().brand('ARM_MECANISE') +type IsArmMecanise = z.infer<typeof isArmMecaniseValidator> + +export const IS_ARM_MECANISE = true as const as IsArmMecanise +export const IS_ARM_NON_MECANISE = false as const as IsArmMecanise + export const getDocumentsTypes = ( etape: Pick<FlattenEtape, 'typeId'>, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId, demarcheId: DemarcheId, sdomZoneIds: SDOMZoneId[], - isArmMecanise: boolean, + isArmMecanise: IsArmMecanise, firstEtapeDate: FirstEtapeDate ): (DocumentType | AutreDocumentType)[] => { const dts = getDocuments(titreTypeId, demarcheTypeId, etape.typeId) @@ -160,9 +168,9 @@ export const getDocumentsTypes = ( } } // si la démarche est mécanisée il faut ajouter des documents obligatoires - if (isArmMecanise) { + if (isArmMecanise === IS_ARM_MECANISE) { for (const documentType of dts) { - if ([DOCUMENTS_TYPES_IDS.dossierLoiSurLEau, DOCUMENTS_TYPES_IDS.decisionCasParCas].includes(documentType.id)) { + if ([DOCUMENTS_TYPES_IDS.dossierLoiSurLEau, machineId !== 'ProcedureSpecifique' ? DOCUMENTS_TYPES_IDS.decisionCasParCas : null].includes(documentType.id)) { documentType.optionnel = false } } @@ -186,55 +194,56 @@ export const getAvisTypes = ( demarcheTypeId: DemarcheTypeId, demarcheId: DemarcheId, firstEtapeDate: FirstEtapeDate, - communeIds: CommuneId[] -): { id: AvisTypeId; optionnel: boolean }[] => { - const avis: { id: AvisTypeId; optionnel: boolean }[] = [] - if (etapeTypeId === ETAPES_TYPES.demande && titreTypeId === TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX) { - avis.push({ ...AvisTypes.avisProprietaireDuSol, optionnel: false }, { ...AvisTypes.avisDeLaMissionAutoriteEnvironnementale, optionnel: false }) + communeIds: CommuneId[], + isArmMecanise: IsArmMecanise +): { [key in AvisTypeId]?: { id: key; optionnel: boolean } } => { + const avis: { [key in AvisTypeId]?: { id: key; optionnel: boolean } } = {} + const machineId = machineIdFind(titreTypeId, demarcheTypeId, demarcheId, firstEtapeDate) + + if (etapeTypeId === ETAPES_TYPES.demande) { + if (titreTypeId === TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX) { + avis[AvisTypes.avisProprietaireDuSol.id] = { ...AvisTypes.avisProprietaireDuSol, optionnel: false } + avis[AvisTypes.avisDeLaMissionAutoriteEnvironnementale.id] = { ...AvisTypes.avisDeLaMissionAutoriteEnvironnementale, optionnel: false } + } else if (titreTypeId === TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX && machineId === 'ProcedureSpecifique') { + avis[AvisTypes.avisCasParCas.id] = { ...AvisTypes.avisCasParCas, optionnel: isArmMecanise === IS_ARM_NON_MECANISE } + avis[AvisTypes.avisProprietaireDuSol.id] = { ...AvisTypes.avisProprietaireDuSol, optionnel: false } + } } + if (etapeTypeId === ETAPES_TYPES.avisDesCollectivites) { - avis.push({ ...AvisTypes.avisDUneCollectivite, optionnel: true }) + avis[AvisTypes.avisDUneCollectivite.id] = { ...AvisTypes.avisDUneCollectivite, optionnel: true } } else if (etapeTypeId === ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives) { - const machineId = machineIdFind(titreTypeId, demarcheTypeId, demarcheId, firstEtapeDate) - avis.push( - ...[ - { ...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 }, - // L'avis de l'onf est obligatoire que pour les ARM - { ...AvisTypes.avisOfficeNationalDesForets, optionnel: machineId === 'ProcedureSpecifique' || titreTypeId !== 'arm' }, - { ...AvisTypes.expertiseOfficeNationalDesForets, optionnel: true }, - // TODO 2024-05-14: rendre obligatoire pour les PNMs quand ces derniers seront implémentés - { ...AvisTypes.avisParcNaturelMarin, optionnel: true }, - ] - ) + avis[AvisTypes.avisDirectionRegionaleDesAffairesCulturelles.id] = { ...AvisTypes.avisDirectionRegionaleDesAffairesCulturelles, optionnel: true } + avis[AvisTypes.avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques.id] = { ...AvisTypes.avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques, optionnel: true } + avis[AvisTypes.avisDirectionsRégionalesEconomieEmploiTravailSolidarités.id] = { ...AvisTypes.avisDirectionsRégionalesEconomieEmploiTravailSolidarités, optionnel: true } + avis[AvisTypes.avisDirectionRegionaleFinancesPubliques.id] = { ...AvisTypes.avisDirectionRegionaleFinancesPubliques, optionnel: true } + avis[AvisTypes.avisGendarmerieNationale.id] = { ...AvisTypes.avisGendarmerieNationale, optionnel: true } + avis[AvisTypes.avisIFREMER.id] = { ...AvisTypes.avisIFREMER, optionnel: true } + avis[AvisTypes.avisInstitutNationalOrigineQualite.id] = { ...AvisTypes.avisInstitutNationalOrigineQualite, optionnel: true } + avis[AvisTypes.avisServiceAdministratifLocal.id] = { ...AvisTypes.avisServiceAdministratifLocal, optionnel: true } + avis[AvisTypes.avisAutoriteMilitaire.id] = { ...AvisTypes.avisAutoriteMilitaire, optionnel: true } + avis[AvisTypes.avisParcNational.id] = { ...AvisTypes.avisParcNational, optionnel: true } + avis[AvisTypes.avisDirectionDepartementaleTerritoiresMer.id] = { ...AvisTypes.avisDirectionDepartementaleTerritoiresMer, optionnel: true } + avis[AvisTypes.avisAgenceRegionaleSante.id] = { ...AvisTypes.avisAgenceRegionaleSante, optionnel: true } + avis[AvisTypes.avisCaisseGeneraleSecuriteSociale.id] = { ...AvisTypes.avisCaisseGeneraleSecuriteSociale, optionnel: true } + avis[AvisTypes.autreAvis.id] = { ...AvisTypes.autreAvis, optionnel: true } + // L'avis de l'onf est obligatoire que pour les ARM + avis[AvisTypes.avisOfficeNationalDesForets.id] = { ...AvisTypes.avisOfficeNationalDesForets, optionnel: machineId === 'ProcedureSpecifique' || titreTypeId !== 'arm' } + avis[AvisTypes.expertiseOfficeNationalDesForets.id] = { ...AvisTypes.expertiseOfficeNationalDesForets, optionnel: true } + // TODO 2024-05-14: rendre obligatoire pour les PNMs quand ces derniers seront implémentés + avis[AvisTypes.avisParcNaturelMarin.id] = { ...AvisTypes.avisParcNaturelMarin, optionnel: true } if (communeIds.some(id => toDepartementId(id) === DEPARTEMENT_IDS.Guyane)) { - avis.push( - ...[ - { ...AvisTypes.avisDirectionAlimentationAgricultureForet, optionnel: true }, - { ...AvisTypes.avisEtatMajorOrpaillagePecheIllicite, optionnel: true }, - ] - ) + avis[AvisTypes.avisDirectionAlimentationAgricultureForet.id] = { ...AvisTypes.avisDirectionAlimentationAgricultureForet, optionnel: true } + avis[AvisTypes.avisEtatMajorOrpaillagePecheIllicite.id] = { ...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 }) + avis[AvisTypes.confirmationAccordProprietaireDuSol.id] = { ...AvisTypes.confirmationAccordProprietaireDuSol, optionnel: true } } } else if (etapeTypeId === ETAPES_TYPES.consultationDesAdministrationsCentrales) { - avis.push({ ...AvisTypes.autreAvis, optionnel: true }) + avis[AvisTypes.autreAvis.id] = { ...AvisTypes.autreAvis, optionnel: true } } return avis @@ -244,6 +253,17 @@ export const etapeDocumentsStepIsVisible = (): boolean => { return true // il y'a forcément au moins le document "Autre" que l'on peut saisir, donc si on a le droit d'éditer une étape, on peut voir les documents dans la page d'édition d'une étape } +export const isArmMecanise = (contenu: FlattenedContenu | SectionWithValue[]): IsArmMecanise => { + let result: boolean = false + if (Array.isArray(contenu)) { + result = contenu.some(({ id, elements }) => id === 'arm' && elements.some(({ id: idElement, value }) => idElement === 'mecanise' && value === true)) + } else { + result = contenu['arm']?.['mecanise']?.value === true + } + + return isArmMecaniseValidator.parse(result) +} + export const etapeDocumentsStepIsComplete = ( etape: Pick<FlattenEtape, 'typeId' | 'contenu' | 'isBrouillon'>, demarcheTypeId: DemarcheTypeId, @@ -254,7 +274,7 @@ export const etapeDocumentsStepIsComplete = ( firstEtapeDate: FirstEtapeDate ): ValidReturn => { const errors: string[] = [] - const documentTypes = getDocumentsTypes({ typeId: etape.typeId }, demarcheTypeId, titreTypeId, demarcheId, sdomZoneIds, etape.contenu['arm']?.['mecanise']?.value === true, firstEtapeDate) + const documentTypes = getDocumentsTypes({ typeId: etape.typeId }, demarcheTypeId, titreTypeId, demarcheId, sdomZoneIds, isArmMecanise(etape.contenu), firstEtapeDate) errors.push( ...documentTypes @@ -270,18 +290,18 @@ export const etapeDocumentsStepIsComplete = ( } export const etapeAvisStepIsVisible = ( - etape: Pick<FlattenEtape, 'typeId'>, + etape: Pick<FlattenEtape, 'typeId' | 'contenu'>, titreTypeId: TitreTypeId, demarcheTypeId: DemarcheTypeId, demarcheId: DemarcheId, firstEtapeDate: FirstEtapeDate, communeIds: CommuneId[] ): boolean => { - return getAvisTypes(etape.typeId, titreTypeId, demarcheTypeId, demarcheId, firstEtapeDate, communeIds).length > 0 + return Object.keys(getAvisTypes(etape.typeId, titreTypeId, demarcheTypeId, demarcheId, firstEtapeDate, communeIds, isArmMecanise(etape.contenu))).length > 0 } export const etapeAvisStepIsComplete = ( - etape: Pick<FlattenEtape, 'typeId'>, + etape: Pick<FlattenEtape, 'typeId' | 'contenu'>, etapeAvis: Pick<EtapeAvis | TempEtapeAvis, 'avis_type_id'>[], titreTypeId: TitreTypeId, demarcheTypeId: DemarcheTypeId, @@ -293,8 +313,8 @@ export const etapeAvisStepIsComplete = ( return { valid: true } } - const avisTypes = getAvisTypes(etape.typeId, titreTypeId, demarcheTypeId, demarcheId, firstEtapeDate, communeIds) - if (avisTypes.some(avisType => !avisType.optionnel && etapeAvis.every(avis => avis.avis_type_id !== avisType.id))) { + const avisTypes = getAvisTypes(etape.typeId, titreTypeId, demarcheTypeId, demarcheId, firstEtapeDate, communeIds, isArmMecanise(etape.contenu)) + if (Object.values(avisTypes).some(avisType => !avisType.optionnel && etapeAvis.every(avis => avis.avis_type_id !== avisType.id))) { return { valid: false, errors: ['Il manque des avis obligatoires'] } } diff --git a/packages/common/src/static/avisTypes.ts b/packages/common/src/static/avisTypes.ts index 423ecc5c5288924d2a61b9e44c332b7ccf9af138..cd0d35f85a69b1e1f28930de2460fcf78f705c68 100644 --- a/packages/common/src/static/avisTypes.ts +++ b/packages/common/src/static/avisTypes.ts @@ -6,7 +6,7 @@ interface Definition<T> { statutIds: AvisStatutId[] } // prettier-ignore -const AVIS_TYPES_IDS_WITHOUT_AUTRE = [ "confirmationAccordProprietaireDuSol", "avisDirectionRegionaleDesAffairesCulturelles", "avisDirectionAlimentationAgricultureForet", "avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques", "avisDirectionsRégionalesEconomieEmploiTravailSolidarités", "avisDirectionRegionaleFinancesPubliques", "avisGendarmerieNationale", "avisParcNaturelMarin", "avisIFREMER", "avisInstitutNationalOrigineQualite", "avisEtatMajorOrpaillagePecheIllicite", "avisServiceAdministratifLocal", "avisAutoriteMilitaire", "avisParcNational", "avisDirectionDepartementaleTerritoiresMer", "avisAgenceRegionaleSante", "avisCaisseGeneraleSecuriteSociale", "avisServiceMilieuxNaturelsBiodiversiteSitesPaysages", "avisOfficeNationalDesForets", "expertiseOfficeNationalDesForets", "avisDUneCollectivite", "avisDeLaMissionAutoriteEnvironnementale", "avisProprietaireDuSol"] as const +const AVIS_TYPES_IDS_WITHOUT_AUTRE = [ "confirmationAccordProprietaireDuSol", "avisDirectionRegionaleDesAffairesCulturelles", "avisDirectionAlimentationAgricultureForet", "avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques", "avisDirectionsRégionalesEconomieEmploiTravailSolidarités", "avisDirectionRegionaleFinancesPubliques", "avisGendarmerieNationale", "avisParcNaturelMarin", "avisIFREMER", "avisInstitutNationalOrigineQualite", "avisEtatMajorOrpaillagePecheIllicite", "avisServiceAdministratifLocal", "avisAutoriteMilitaire", "avisParcNational", "avisDirectionDepartementaleTerritoiresMer", "avisAgenceRegionaleSante", "avisCaisseGeneraleSecuriteSociale", "avisServiceMilieuxNaturelsBiodiversiteSitesPaysages", "avisOfficeNationalDesForets", "expertiseOfficeNationalDesForets", "avisDUneCollectivite", "avisDeLaMissionAutoriteEnvironnementale", "avisProprietaireDuSol", "avisCasParCas"] as const const AVIS_TYPE_IDS_AUTRE = ['autreAvis'] as const const AVIS_TYPES_IDS = [...AVIS_TYPES_IDS_WITHOUT_AUTRE, ...AVIS_TYPE_IDS_AUTRE] as const @@ -66,6 +66,7 @@ export const AvisTypes = { avisDUneCollectivite: { id: 'avisDUneCollectivite', nom: "Avis d'une collectivité", statutIds: defaultStatutIds }, avisDeLaMissionAutoriteEnvironnementale: { id: 'avisDeLaMissionAutoriteEnvironnementale', nom: 'avis de la mission autorité environnementale', statutIds: ['Exempté', 'Requis'] }, avisProprietaireDuSol: { id: 'avisProprietaireDuSol', nom: 'avis du propriétaire du sol', statutIds: defaultStatutIds }, + avisCasParCas: { id: 'avisCasParCas', nom: 'Décision au cas par cas', statutIds: ['Exempté', 'Requis'] }, autreAvis: { id: 'autreAvis', nom: 'Autre avis', statutIds: defaultStatutIds }, } as const satisfies { [key in AvisTypeId]: Definition<key> } diff --git a/packages/common/src/static/documentsTypes.ts b/packages/common/src/static/documentsTypes.ts index 2a212684ad378c46e67e34f89a52de047709a203..065e0ef6a560448c86b8c849358a88dfe03d8db7 100644 --- a/packages/common/src/static/documentsTypes.ts +++ b/packages/common/src/static/documentsTypes.ts @@ -35,26 +35,21 @@ export type PerimetreUploadType = z.infer<typeof perimetreFileUploadTypeValidato export type FileUploadType = z.infer<typeof fileUploadTypeValidator> // prettier-ignore -const IDS_WITHOUT_AUTRE = ["aac","acc","acd","acg","acm","acr","adr","aep","aot","apd","apf","apm","apu","are","arm","arp","arr","atf","avc","ave","avi","bil","cam","car","cco","cdc","cnr","cnt","cod","con","cou","csp","cur","dcl","deb","dec","dei","dep","doe","dom","dos","erd","fac","fic","fip","for","idm","jac","jcf","jct","jeg","jid","jpa","kbi","lac","lce","lcg","lcm","ldc","lem","let","lis","lpf","mes","met","mot","nas","ndc","ndd","nip","nir","noi","not","ocd","odr","ord","prg","pro","pub","pvr","rac","rad","rce","rcr","rdr","rdt","rec","ree","ref","rfe","rgr","rie","rse","sch","sir" ] as const +const IDS_WITHOUT_AUTRE = ["aac","acd","acg","acr","adr","aep","apd","apf","apu","arm","arp","arr","atf","avc","ave","avi","bil","cam","car","cco","cdc","cnr","cnt","cod","con","cou","csp","cur","dcl","deb","dec","dei","dep","doe","dom","dos","erd","fac","fic","fip","for","idm","jac","jcf","jct","jeg","jid","jpa","kbi","lac","lce","lcg","lcm","ldc","lem","let","lis","lpf","mes","met","mot","nas","ndd","nip","nir","noi","not","odr","ord","prg","pro","pub","pvr","rac","rad","rce","rcr","rdr","rec","ree","ref","rfe","rgr","rie","rse","sch","sir" ] as const const AUTRE_IDS = ['aut'] as const const IDS = [...IDS_WITHOUT_AUTRE, ...AUTRE_IDS] as const export const DOCUMENTS_TYPES_IDS = { autreDocument: 'aut', avisDUnServiceDeLAdministrationCentrale: 'aac', - accordDuProprietaireDuSolOuDuGestionnaire: 'acc', avisDeLaCommissionDepartementaleDesMines: 'acd', avisDuConseilGeneralDeLEconomie_cge: 'acg', - avisDesServicesCivilsEtMilitaires: 'acm', accuseDeReceptionDUneDemande: 'acr', avisDuDirecteurRegionalChargeDesMines: 'adr', avisDEnquetePublique: 'aep', - arreteAutorisantLOuvertureDeTravauxMiniers: 'aot', arreteDeSecondDonneActe_ap2: 'apd', avisDuPrefet: 'apf', - arreteDePoliceDesMines: 'apm', arreteDePremierDonneActe_ap1: 'apu', - arreteDeRefus: 'are', arreteMinisteriel: 'arm', arretePrefectoral: 'arp', arrete: 'arr', @@ -108,13 +103,11 @@ export const DOCUMENTS_TYPES_IDS = { methodesPourLExecutionDesTravaux: 'met', motif: 'mot', noteALAutoriteSignataire: 'nas', - notificationDeDemandeConcurrente: 'ndc', notificationDeDecision: 'ndd', noticeDImpact: 'nip', noticeDImpactRenforcee: 'nir', noticeDIncidence: 'noi', notes: 'not', - ordreDuJourDeLaCommissionDepartementaleDesMines: 'ocd', ordonnanceDuRoi: 'odr', ordonnance: 'ord', programmeDesTravaux: 'prg', @@ -126,7 +119,6 @@ export const DOCUMENTS_TYPES_IDS = { rapportDuCommissaireEnqueteur: 'rce', rapportDeRecevabilite: 'rcr', rapportDeLaDirectionRegionaleChargeeDesMines: 'rdr', - recepisseDeDeclarationDOuvertureDesTravauxMiniers: 'rdt', recepisse_LoiSurLEau: 'rec', rapportEnvironnementalDExploration: 'ree', referencesProfessionnelles: 'ref', @@ -178,19 +170,14 @@ export type AutreDocumentTypeId = z.infer<typeof autreDocumentTypeIdValidator> export const DocumentsTypes: { [key in DocumentTypeId | AutreDocumentTypeId]: Definition<key> } = { aut: { id: 'aut', nom: 'Autre document' }, aac: { id: 'aac', nom: "Avis d'un service de l'administration centrale" }, - acc: { id: 'acc', nom: 'Accord du propriétaire du sol ou du gestionnaire' }, acd: { id: 'acd', nom: 'Avis de la commission départementale des mines' }, acg: { id: 'acg', nom: "Avis du conseil général de l'économie (CGE)" }, - acm: { id: 'acm', nom: 'Avis des services civils et militaires' }, acr: { id: 'acr', nom: "Accusé de réception d'une demande" }, adr: { id: 'adr', nom: 'Avis du directeur régional chargé des mines' }, aep: { id: 'aep', nom: "Avis d'enquête publique" }, - aot: { id: 'aot', nom: "Arrêté autorisant l'ouverture de travaux miniers" }, apd: { id: 'apd', nom: 'Arrêté de second donné acte (AP2)' }, apf: { id: 'apf', nom: 'Avis du préfet' }, - apm: { id: 'apm', nom: 'Arrêté de police des mines' }, apu: { id: 'apu', nom: 'Arrêté de premier donné acte (AP1)' }, - are: { id: 'are', nom: 'Arrêté de refus ' }, arm: { id: 'arm', nom: 'Arrêté ministériel' }, arp: { id: 'arp', nom: 'Arrêté préfectoral' }, arr: { id: 'arr', nom: 'Arrêté' }, @@ -244,13 +231,11 @@ export const DocumentsTypes: { [key in DocumentTypeId | AutreDocumentTypeId]: De met: { id: 'met', nom: "Méthodes pour l'exécution des travaux" }, mot: { id: 'mot', nom: 'Motif' }, nas: { id: 'nas', nom: "Note à l'autorité signataire" }, - ndc: { id: 'ndc', nom: 'Notification de demande concurrente' }, ndd: { id: 'ndd', nom: 'Notification de décision' }, nip: { id: 'nip', nom: "Notice d'impact" }, nir: { id: 'nir', nom: "Notice d'impact renforcée" }, noi: { id: 'noi', nom: "Notice d'incidence" }, not: { id: 'not', nom: 'Notes' }, - ocd: { id: 'ocd', nom: 'Ordre du jour de la commission départementale des mines' }, odr: { id: 'odr', nom: 'Ordonnance du Roi' }, ord: { id: 'ord', nom: 'Ordonnance' }, prg: { id: 'prg', nom: 'Programme des travaux ' }, @@ -262,7 +247,6 @@ export const DocumentsTypes: { [key in DocumentTypeId | AutreDocumentTypeId]: De rce: { id: 'rce', nom: 'Rapport du commissaire enquêteur' }, rcr: { id: 'rcr', nom: 'Rapport de recevabilité' }, rdr: { id: 'rdr', nom: 'Rapport de la direction régionale chargée des mines' }, - rdt: { id: 'rdt', nom: "Récépissé de déclaration d'ouverture des travaux miniers" }, rec: { id: 'rec', nom: 'Récépissé "Loi sur l\'eau"' }, ree: { id: 'ree', nom: "Rapport environnemental d'exploration" }, ref: { id: 'ref', nom: 'Références professionnelles ', description: 'Références professionnelles du demandeur ou celles des cadres chargés du suivi et de la conduite des travaux' }, diff --git a/packages/ui/src/components/_common/storybook.spec.ts b/packages/ui/src/components/_common/storybook.spec.ts index debfc058c6312386b2e56fcad6c472b42919811a..f2170550a4823502c830a3f068c42aaa714435ff 100644 --- a/packages/ui/src/components/_common/storybook.spec.ts +++ b/packages/ui/src/components/_common/storybook.spec.ts @@ -46,6 +46,7 @@ describe('Common Storybook Tests', async () => { .filter(env => (name ?? '').includes('NoStoryshots') || !(env.name ?? '').includes('NoSnapshot')) )('$name', async value => { setSeed(12) + let html: string | undefined = undefined try { // @ts-ignore window.dsfr = null @@ -65,6 +66,7 @@ describe('Common Storybook Tests', async () => { } global.ResizeObserver = ResizeObserver + const storyComponent = value.story() const mounted = render('type' in storyComponent && typeof storyComponent.type === 'function' ? storyComponent.type() : storyComponent, { @@ -74,9 +76,14 @@ describe('Common Storybook Tests', async () => { }) await new Promise<void>(resolve => setTimeout(() => resolve(), 1)) - await expect(mounted.html()).toMatchFileSnapshot(`./${filePath.replace(/\.[^/.]+$/, '')}_snapshots_${value.name}.html`) + html = mounted.html() } catch (e) { throw new Error(`le test ${name} du fichier ${filePath} plante ${e}`) + } finally { + if (html === undefined) { + throw new Error('le test ne génère pas de html') + } + await expect(html).toMatchFileSnapshot(`./${filePath.replace(/\.[^/.]+$/, '')}_snapshots_${value.name}.html`) } }) }) diff --git a/packages/ui/src/components/_ui/storybook.spec.ts b/packages/ui/src/components/_ui/storybook.spec.ts index e1698b62c1434d80ce7ed7b9115b845f3d87cbcd..6eeaf8f787e97f83c4db9b61d4292a4b9a451aec 100644 --- a/packages/ui/src/components/_ui/storybook.spec.ts +++ b/packages/ui/src/components/_ui/storybook.spec.ts @@ -44,9 +44,11 @@ describe('UI Storybook Tests', async () => { .filter(env => (name ?? '').includes('NoStoryshots') || !(env.name ?? '').includes('NoSnapshot')) )('$name', async value => { setSeed(12) + let html: string | undefined = undefined try { // @ts-ignore window.dsfr = null + class ResizeObserver { observe() { // do nothing @@ -62,6 +64,7 @@ describe('UI Storybook Tests', async () => { } global.ResizeObserver = ResizeObserver + const storyComponent = value.story() const mounted = render('type' in storyComponent && typeof storyComponent.type === 'function' ? storyComponent.type() : storyComponent, { @@ -71,9 +74,14 @@ describe('UI Storybook Tests', async () => { }) await new Promise<void>(resolve => setTimeout(() => resolve(), 1)) - await expect(mounted.html()).toMatchFileSnapshot(`./${filePath.replace(/\.[^/.]+$/, '')}_snapshots_${value.name}.html`) + html = mounted.html() } catch (e) { throw new Error(`le test ${name} du fichier ${filePath} plante ${e}`) + } finally { + if (html === undefined) { + throw new Error('le test ne génère pas de html') + } + await expect(html).toMatchFileSnapshot(`./${filePath.replace(/\.[^/.]+$/, '')}_snapshots_${value.name}.html`) } }) }) diff --git a/packages/ui/src/components/demarche/demarche-etape.stories.tsx b/packages/ui/src/components/demarche/demarche-etape.stories.tsx index 04cf5277a67319b6c048917310be27f95d74b843..46f2404164c001042bde6705ec0d1b8f01bcb4bb 100644 --- a/packages/ui/src/components/demarche/demarche-etape.stories.tsx +++ b/packages/ui/src/components/demarche/demarche-etape.stories.tsx @@ -162,7 +162,7 @@ const documents: EtapeDocument[] = [ }, { id: etapeDocumentIdValidator.parse('id2'), - etape_document_type_id: 'acm', + etape_document_type_id: 'acr', description: null, public_lecture: false, entreprises_lecture: true, diff --git a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_AvisDesServices.html b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_AvisDesServices.html index ad54cb54f20d1c0fcb1c864edd3b57614370c2da..256bf7fab4652d00e78c80ae422ed96a2f6238c5 100644 --- a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_AvisDesServices.html +++ b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_AvisDesServices.html @@ -35,14 +35,14 @@ </thead> <tbody> <tr> - <td><a href="/apiUrl/download/fichiers/id" title="Télécharger le document Une description - nouvelle fenêtre" target="_blank">Une description</a></td> + <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Accusé de réception d'une demande - nouvelle fenêtre" target="_blank">Accusé de réception d'une demande</a></td> <td></td> - <td>Visible par les administrations</td> + <td>Visible par les administrations et les entreprises titulaires</td> </tr> <tr> - <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Avis des services civils et militaires - nouvelle fenêtre" target="_blank">Avis des services civils et militaires</a></td> + <td><a href="/apiUrl/download/fichiers/id" title="Télécharger le document Une description - nouvelle fenêtre" target="_blank">Une description</a></td> <td></td> - <td>Visible par les administrations et les entreprises titulaires</td> + <td>Visible par les administrations</td> </tr> <tr> <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Avis du conseil général de l'économie (CGE) - nouvelle fenêtre" target="_blank">Avis du conseil général de l'économie (CGE)</a></td> 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 3f11d50745db60d8788e0717dfc83f29619b8d3d..c2857c68448c406c70c74c791a158f7b2805ba39 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 @@ -97,14 +97,14 @@ </thead> <tbody> <tr> - <td><a href="/apiUrl/download/fichiers/id" title="Télécharger le document Une description - nouvelle fenêtre" target="_blank">Une description</a></td> + <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Accusé de réception d'une demande - nouvelle fenêtre" target="_blank">Accusé de réception d'une demande</a></td> <td></td> - <td>Visible par les administrations</td> + <td>Visible par les administrations et les entreprises titulaires</td> </tr> <tr> - <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Avis des services civils et militaires - nouvelle fenêtre" target="_blank">Avis des services civils et militaires</a></td> + <td><a href="/apiUrl/download/fichiers/id" title="Télécharger le document Une description - nouvelle fenêtre" target="_blank">Une description</a></td> <td></td> - <td>Visible par les administrations et les entreprises titulaires</td> + <td>Visible par les administrations</td> </tr> <tr> <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Avis du conseil général de l'économie (CGE) - nouvelle fenêtre" target="_blank">Avis du conseil général de l'économie (CGE)</a></td> 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 ceae82b89aff01db7c4a3d766df71f41260f08d2..0c74f9a9a1d7cc35fa2a5bee3f5f75a9209a2771 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 @@ -94,14 +94,14 @@ </thead> <tbody> <tr> - <td><a href="/apiUrl/download/fichiers/id" title="Télécharger le document Une description - nouvelle fenêtre" target="_blank">Une description</a></td> + <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Accusé de réception d'une demande - nouvelle fenêtre" target="_blank">Accusé de réception d'une demande</a></td> <td></td> - <td>Visible par les administrations</td> + <td>Visible par les administrations et les entreprises titulaires</td> </tr> <tr> - <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Avis des services civils et militaires - nouvelle fenêtre" target="_blank">Avis des services civils et militaires</a></td> + <td><a href="/apiUrl/download/fichiers/id" title="Télécharger le document Une description - nouvelle fenêtre" target="_blank">Une description</a></td> <td></td> - <td>Visible par les administrations et les entreprises titulaires</td> + <td>Visible par les administrations</td> </tr> <tr> <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Avis du conseil général de l'économie (CGE) - nouvelle fenêtre" target="_blank">Avis du conseil général de l'économie (CGE)</a></td> 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 bf63a4a36a476c026fbc56487ff46e760ed1d25d..e1720de23120f3a627b480ea5adfe1f8dfb0e653 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 @@ -36,14 +36,14 @@ </thead> <tbody> <tr> - <td><a href="/apiUrl/download/fichiers/id" title="Télécharger le document Une description - nouvelle fenêtre" target="_blank">Une description</a></td> + <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Accusé de réception d'une demande - nouvelle fenêtre" target="_blank">Accusé de réception d'une demande</a></td> <td></td> - <td>Visible par les administrations</td> + <td>Visible par les administrations et les entreprises titulaires</td> </tr> <tr> - <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Avis des services civils et militaires - nouvelle fenêtre" target="_blank">Avis des services civils et militaires</a></td> + <td><a href="/apiUrl/download/fichiers/id" title="Télécharger le document Une description - nouvelle fenêtre" target="_blank">Une description</a></td> <td></td> - <td>Visible par les administrations et les entreprises titulaires</td> + <td>Visible par les administrations</td> </tr> <tr> <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Avis du conseil général de l'économie (CGE) - nouvelle fenêtre" target="_blank">Avis du conseil général de l'économie (CGE)</a></td> diff --git a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_EtapeAvecNoteAvertissement.html b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_EtapeAvecNoteAvertissement.html index 848c817f0c817c8116ebcf74bb614700d4d9a8dc..bfc18677ab11e4282bfbf8dfab1626f2b3af5466 100644 --- a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_EtapeAvecNoteAvertissement.html +++ b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_EtapeAvecNoteAvertissement.html @@ -41,14 +41,14 @@ </thead> <tbody> <tr> - <td><a href="/apiUrl/download/fichiers/id" title="Télécharger le document Une description - nouvelle fenêtre" target="_blank">Une description</a></td> + <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Accusé de réception d'une demande - nouvelle fenêtre" target="_blank">Accusé de réception d'une demande</a></td> <td></td> - <td>Visible par les administrations</td> + <td>Visible par les administrations et les entreprises titulaires</td> </tr> <tr> - <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Avis des services civils et militaires - nouvelle fenêtre" target="_blank">Avis des services civils et militaires</a></td> + <td><a href="/apiUrl/download/fichiers/id" title="Télécharger le document Une description - nouvelle fenêtre" target="_blank">Une description</a></td> <td></td> - <td>Visible par les administrations et les entreprises titulaires</td> + <td>Visible par les administrations</td> </tr> <tr> <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Avis du conseil général de l'économie (CGE) - nouvelle fenêtre" target="_blank">Avis du conseil général de l'économie (CGE)</a></td> 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 2da80c2a1bfac35434026a2409fafb44eb3b0cd0..141f5c9594ed4675074e3f3e5b99658767878da5 100644 --- a/packages/ui/src/components/etape-edition.stories_snapshots_AxmEnZoneDuSdom.html +++ b/packages/ui/src/components/etape-edition.stories_snapshots_AxmEnZoneDuSdom.html @@ -210,22 +210,22 @@ </thead> <tbody> <tr> - <td class="fr-label--disabled">avis du propriétaire du sol</td> + <td class="fr-label--disabled">Avis du propriétaire du sol</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 du propriétaire du sol" aria-label="Ajouter un document avis du propriétaire du sol" type="button"> + <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 du propriétaire du sol'" aria-label="Ajouter un document 'Avis du propriétaire du sol'" type="button"> <!----> </button></td> </tr> <tr> - <td class="fr-label--disabled">avis de la mission autorité environnementale</td> + <td class="fr-label--disabled">Avis de la mission autorité environnementale</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 la mission autorité environnementale" aria-label="Ajouter un document avis de la mission autorité environnementale" type="button"> + <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 la mission autorité environnementale'" aria-label="Ajouter un document 'Avis de la mission autorité environnementale'" type="button"> <!----> </button></td> </tr> diff --git a/packages/ui/src/components/etape/etape-avis-edit.stories.tsx b/packages/ui/src/components/etape/etape-avis-edit.stories.tsx index 390ad0d1592ce6af7f4671b385fc9483955d4b8f..0497e138b4352258c3eac6685443bd61b04aa265 100644 --- a/packages/ui/src/components/etape/etape-avis-edit.stories.tsx +++ b/packages/ui/src/components/etape/etape-avis-edit.stories.tsx @@ -65,6 +65,7 @@ export const Empty: StoryFn = () => ( tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mfr', demarcheId: demarcheIdValidator.parse('demarcheId'), firstEtapeDate: firstEtapeDateValidator.parse('2022-01-01') }} onChange={completeUpdateAction} user={{ ...testBlankUser, role: 'super' }} + contenu={{}} /> ) export const Rempli: StoryFn = () => ( @@ -75,6 +76,18 @@ export const Rempli: StoryFn = () => ( tde={{ titreTypeId: 'axm', demarcheTypeId: 'oct', etapeTypeId: 'asc', demarcheId: demarcheIdValidator.parse('demarcheId'), firstEtapeDate: firstEtapeDateValidator.parse('2022-01-01') }} onChange={completeUpdateAction} user={{ ...testBlankUser, role: 'super' }} + contenu={{}} + /> +) +export const DemandeARMProcedureSpecifique: StoryFn = () => ( + <EtapeAvisEdit + apiClient={apiClient} + etapeId={etapeIdValidator.parse('etapeId')} + communeIds={[]} + tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mfr', demarcheId: demarcheIdValidator.parse('demarcheId'), firstEtapeDate: firstEtapeDateValidator.parse('2025-01-01') }} + onChange={completeUpdateAction} + user={{ ...testBlankUser, role: 'super' }} + contenu={{ arm: { mecanise: { value: true, heritee: false, etapeHeritee: null } } }} /> ) export const AvisEnGuyane: StoryFn = () => ( @@ -101,5 +114,6 @@ export const AvisEnGuyane: StoryFn = () => ( tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'asc', demarcheId: demarcheIdValidator.parse('demarcheId'), firstEtapeDate: firstEtapeDateValidator.parse('2022-01-01') }} onChange={completeUpdateAction} user={{ ...testBlankUser, role: 'super' }} + contenu={{}} /> ) 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 index 93ec4be86d0b2f1c1e1c49927149e9e3ae234c8e..6b343135b860ba2f34791c9ca596aad667b6fae0 100644 --- 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 @@ -19,7 +19,7 @@ <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"> + <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> diff --git a/packages/ui/src/components/etape/etape-avis-edit.stories_snapshots_DemandeARMProcedureSpecifique.html b/packages/ui/src/components/etape/etape-avis-edit.stories_snapshots_DemandeARMProcedureSpecifique.html new file mode 100644 index 0000000000000000000000000000000000000000..8321200c1ec243a930a02539040786e5502890ae --- /dev/null +++ b/packages/ui/src/components/etape/etape-avis-edit.stories_snapshots_DemandeARMProcedureSpecifique.html @@ -0,0 +1,41 @@ +<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 class="fr-label--disabled">Décision au cas par cas</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 'Décision au cas par cas'" aria-label="Ajouter un document 'Décision au cas par cas'" type="button"> + <!----> + </button></td> + </tr> + <tr> + <td class="fr-label--disabled">Avis du propriétaire du sol</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 du propriétaire du sol'" aria-label="Ajouter un document 'Avis du propriétaire du sol'" type="button"> + <!----> + </button></td> + </tr> + </tbody> + </table> + </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 index 796beef8719330f6a7d40e59af95896081b00f5e..e8e4e585008828d4470ff849e99bccc1148716e7 100644 --- a/packages/ui/src/components/etape/etape-avis-edit.tsx +++ b/packages/ui/src/components/etape/etape-avis-edit.tsx @@ -9,7 +9,7 @@ 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 { getAvisTypes, isArmMecanise } from 'camino-common/src/permissions/etape-form' import { dateFormat, FirstEtapeDate } from 'camino-common/src/date' import { AvisStatut } from '../_common/etape-statut' import { AvisTypeId, AvisTypes } from 'camino-common/src/static/avisTypes' @@ -17,6 +17,8 @@ import { CommuneId } from 'camino-common/src/static/communes' import { getAvisVisibilityLabel } from './etape-avis' import { User } from 'camino-common/src/roles' import { DemarcheId } from 'camino-common/src/demarche' +import { FlattenedContenu } from 'camino-common/src/etape-form' +import { capitalize } from 'camino-common/src/strings' interface Props { tde: { @@ -28,6 +30,7 @@ interface Props { } onChange: (etapeAvis: (EtapeAvis | TempEtapeAvis)[]) => void etapeId: EtapeId | null + contenu: FlattenedContenu communeIds: CommuneId[] apiClient: Pick<ApiClient, 'uploadTempDocument' | 'getEtapeAvisByEtapeId'> user: User @@ -79,7 +82,9 @@ const EtapeAvisLoaded = defineComponent<EtapeAvisLoadedProps>(props => { 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.tde.demarcheTypeId, props.tde.demarcheId, props.tde.firstEtapeDate, props.communeIds) + return Object.values( + getAvisTypes(props.tde.etapeTypeId, props.tde.titreTypeId, props.tde.demarcheTypeId, props.tde.demarcheId, props.tde.firstEtapeDate, props.communeIds, isArmMecanise(props.contenu)) + ) }) const completeRequiredAvis = computed<PropsTable['avis']>(() => { @@ -132,7 +137,7 @@ const EtapeAvisLoaded = defineComponent<EtapeAvisLoadedProps>(props => { } const getNom = (avisTypeId: AvisTypeId) => { - return AvisTypes[avisTypeId].nom + return capitalize(AvisTypes[avisTypeId].nom) } return () => ( @@ -238,7 +243,7 @@ const EtapeAvisTable: FunctionalComponent<PropsTable> = (props: PropsTable) => { <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" /> + <DsfrButtonIcon icon="fr-icon-add-line" title={`Ajouter un document '${props.getNom(avisTypeId)}'`} onClick={() => props.add(avisTypeId)} buttonType="secondary" buttonSize="sm" /> </td> </tr> ))} @@ -249,6 +254,6 @@ const EtapeAvisTable: FunctionalComponent<PropsTable> = (props: PropsTable) => { } // @ts-ignore waiting for https://github.com/vuejs/core/issues/7833 -EtapeAvisEdit.props = ['tde', 'onChange', 'etapeId', 'apiClient', 'communeIds', 'user'] +EtapeAvisEdit.props = ['tde', 'onChange', 'etapeId', 'contenu', 'apiClient', 'communeIds', 'user'] // @ts-ignore waiting for https://github.com/vuejs/core/issues/7833 -EtapeAvisLoaded.props = ['tde', 'onChange', 'etapeId', 'apiClient', 'avis', 'communeIds', 'user'] +EtapeAvisLoaded.props = ['tde', 'onChange', 'etapeId', 'contenu', 'apiClient', 'avis', 'communeIds', 'user'] 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 fbec07a1e8aa58636236a12febb7e8e68b0b5e9b..a3a852ad792a6ea3ab9296a1a12b317808232898 100644 --- a/packages/ui/src/components/etape/etape-documents-edit.stories.tsx +++ b/packages/ui/src/components/etape/etape-documents-edit.stories.tsx @@ -152,7 +152,7 @@ export const Complet: StoryFn = () => ( export const ArmMecanise: StoryFn = () => ( <EtapeDocumentsEdit apiClient={apiClient} - contenu={{ arm: { mecanise: { value: true } } }} + contenu={{ arm: { mecanise: { value: true, heritee: false, etapeHeritee: null } } }} etapeId={etapeIdValidator.parse('etapeId')} sdomZoneIds={[]} tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mfr', demarcheId, firstEtapeDate }} @@ -171,7 +171,7 @@ export const ArmMecaniseDynamicNoSnapshot: StoryObj<{ mecanise: boolean }> = { <button onClick={() => setArgs({ mecanise: !args.mecanise })}> Change la mécanisation </button> <EtapeDocumentsEdit apiClient={apiClient} - contenu={{ arm: { mecanise: { value: args.mecanise } } }} + contenu={{ arm: { mecanise: { value: args.mecanise, heritee: false, etapeHeritee: null } } }} etapeId={etapeIdValidator.parse('etapeId')} sdomZoneIds={[]} tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mfr', demarcheId, firstEtapeDate }} @@ -190,7 +190,7 @@ export const ArmMecaniseDynamicNoSnapshot: StoryObj<{ mecanise: boolean }> = { export const EnConstruction: StoryFn = () => ( <EtapeDocumentsEdit apiClient={apiClient} - contenu={{ arm: { mecanise: { value: true } } }} + contenu={{ arm: { mecanise: { value: true, heritee: false, etapeHeritee: null } } }} etapeId={etapeIdValidator.parse('etapeId')} sdomZoneIds={[]} tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mfr', demarcheId, firstEtapeDate }} @@ -286,7 +286,7 @@ export const OctroiAxmUtilisateurEntrepriseComplet: StoryFn = () => ( export const SdomZone: StoryFn = () => ( <EtapeDocumentsEdit apiClient={apiClient} - contenu={{ arm: { mecanise: { value: true } } }} + contenu={{ arm: { mecanise: { value: true, heritee: false, etapeHeritee: null } } }} etapeId={etapeIdValidator.parse('etapeId')} sdomZoneIds={['1', '2']} tde={{ titreTypeId: 'axm', demarcheTypeId: 'oct', etapeTypeId: 'mfr', demarcheId, firstEtapeDate }} diff --git a/packages/ui/src/components/etape/etape-documents-edit.tsx b/packages/ui/src/components/etape/etape-documents-edit.tsx index 38b06b6cab2d2931a56469a9d204c700189b64d6..ddbca4605e64024aa914dc31be7f73042615f35a 100644 --- a/packages/ui/src/components/etape/etape-documents-edit.tsx +++ b/packages/ui/src/components/etape/etape-documents-edit.tsx @@ -13,9 +13,10 @@ import { DsfrButtonIcon } from '../_ui/dsfr-button' import { getVisibilityLabel, sortDocumentsColumn } from './etape-documents' import { AddEtapeDocumentPopup } from './add-etape-document-popup' import { User } from 'camino-common/src/roles' -import { getDocumentsTypes } from 'camino-common/src/permissions/etape-form' +import { getDocumentsTypes, isArmMecanise } from 'camino-common/src/permissions/etape-form' import { FirstEtapeDate } from 'camino-common/src/date' import { DemarcheId } from 'camino-common/src/demarche' +import { FlattenedContenu } from 'camino-common/src/etape-form' interface Props { tde: { @@ -30,7 +31,7 @@ interface Props { completeUpdate: (etapeDocuments: (EtapeDocument | TempEtapeDocument)[]) => void etapeId: EtapeId | null apiClient: Pick<ApiClient, 'uploadTempDocument' | 'getEtapeDocumentsByEtapeId'> - contenu: { arm?: { mecanise?: { value: boolean } } } + contenu: FlattenedContenu user: User } @@ -88,7 +89,7 @@ const EtapeDocumentsLoaded = defineComponent<EtapeDocumentsLoadedProps>(props => props.tde.titreTypeId, props.tde.demarcheId, props.sdomZoneIds, - props.contenu.arm?.mecanise?.value === true, + isArmMecanise(props.contenu), props.tde.firstEtapeDate ) }) diff --git a/packages/ui/src/components/etape/etape-edit-form.tsx b/packages/ui/src/components/etape/etape-edit-form.tsx index a571af63969d5b1ac7ea1f15371e969b61ade364..ebf139777404898098d27dff710b1db516140cdf 100644 --- a/packages/ui/src/components/etape/etape-edit-form.tsx +++ b/packages/ui/src/components/etape/etape-edit-form.tsx @@ -672,6 +672,7 @@ const EtapeEditFormInternal = defineComponent< firstEtapeDate: firstEtapeDate.value, }} etapeId={props.etape.id} + contenu={props.etape.contenu} communeIds={props.perimetre.communes} onChange={avisCompleteUpdate} user={props.user} diff --git a/packages/ui/src/storybook.spec.ts b/packages/ui/src/storybook.spec.ts index 9d7cb5b9da0427d9e0b8f8207b7112b2beda06f3..5a64c38dfe96491a306d7052c82ab995af362883 100644 --- a/packages/ui/src/storybook.spec.ts +++ b/packages/ui/src/storybook.spec.ts @@ -47,6 +47,7 @@ describe('Storybook Tests', async () => { .filter(env => (name ?? '').includes('NoStoryshots') || !(env.name ?? '').includes('NoSnapshot')) )('$name', async value => { setSeed(12) + let html: string | undefined = undefined try { // @ts-ignore window.dsfr = null @@ -76,9 +77,14 @@ describe('Storybook Tests', async () => { }) await new Promise<void>(resolve => setTimeout(() => resolve(), 1)) - await expect(mounted.html()).toMatchFileSnapshot(`./${filePath.replace(/\.[^/.]+$/, '')}_snapshots_${value.name}.html`) + html = mounted.html() } catch (e) { throw new Error(`le test ${name} du fichier ${filePath} plante ${e}`) + } finally { + if (html === undefined) { + throw new Error('le test ne génère pas de html') + } + await expect(html).toMatchFileSnapshot(`./${filePath.replace(/\.[^/.]+$/, '')}_snapshots_${value.name}.html`) } }) })