From 4f100c69fc1160c1c2e5af8af2817fff7bb27206 Mon Sep 17 00:00:00 2001 From: vmaubert Date: Mon, 31 Jan 2022 14:04:09 +0100 Subject: [PATCH] =?UTF-8?q?feat(per):=20met=20les=20PER=20en=20survie=20pr?= =?UTF-8?q?ovisoire=20si=20une=20prolongation=20a=20=C3=A9t=C3=A9=20d?= =?UTF-8?q?=C3=A9pos=C3=A9e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../processes/titres-statut-ids-update.ts | 6 ++- .../__mocks__/titre-statut-id-find-titres.ts | 35 +++++++++++- src/business/rules/titre-etape-prop-find.ts | 6 ++- .../rules/titre-statut-id-find.test.ts | 53 +++++++++++-------- src/business/rules/titre-statut-id-find.ts | 32 ++++++++++- src/business/utils/titre-valide-check.ts | 6 ++- 6 files changed, 111 insertions(+), 27 deletions(-) diff --git a/src/business/processes/titres-statut-ids-update.ts b/src/business/processes/titres-statut-ids-update.ts index 2bb52241d..c3816bfad 100644 --- a/src/business/processes/titres-statut-ids-update.ts +++ b/src/business/processes/titres-statut-ids-update.ts @@ -28,7 +28,11 @@ const titresStatutIdsUpdate = async (titresIds?: string[]) => { const aujourdhui = dateFormat(new Date(), 'yyyy-mm-dd') titres.forEach(titre => { - const statutId = titreStatutIdFind(aujourdhui, titre.demarches) + const statutId = titreStatutIdFind( + aujourdhui, + titre.demarches, + titre.typeId + ) if (statutId !== titre.statutId) { queue.add(async () => { diff --git a/src/business/rules/__mocks__/titre-statut-id-find-titres.ts b/src/business/rules/__mocks__/titre-statut-id-find-titres.ts index 81c1b4d48..3fc2502a1 100644 --- a/src/business/rules/__mocks__/titre-statut-id-find-titres.ts +++ b/src/business/rules/__mocks__/titre-statut-id-find-titres.ts @@ -124,6 +124,38 @@ const titreDemarchesInstruction = [ } ] as ITitreDemarche[] +const titrePERDemarchesProlongation = [ + { + id: 'm-pr-saint-pierre-2014-pro01', + titreId: 'm-pr-saint-pierre-2014', + type: { id: 'pr1' }, + typeId: 'pr1', + statutId: 'dep', + ordre: 1, + etapes: [{ date: '2020-01-01', typeId: 'mfr', statutId: 'fai' }] + }, + { + id: 'm-pr-saint-pierre-2014-oct01', + titreId: 'm-pr-saint-pierre-2014', + type: { id: 'oct' }, + typeId: 'oct', + statutId: 'acc', + ordre: 1, + etapes: [ + { + id: 'm-pr-saint-pierre-2014-oct01-dex01', + titreDemarcheId: 'm-pr-saint-pierre-2014-oct01', + typeId: 'dex', + statutId: 'acc', + ordre: 1, + date: '1014-04-01', + dateDebut: null, + dateFin: '2020-04-01' + } + ] + } +] as ITitreDemarche[] + export { titreDemarchesIndefini, titreDemarchesValide, @@ -133,5 +165,6 @@ export { titreDemarchesOctroiRejete, titreDemarchesOctroiClasse, titreDemarchesOctroiRetire, - titreDemarchesInstruction + titreDemarchesInstruction, + titrePERDemarchesProlongation } diff --git a/src/business/rules/titre-etape-prop-find.ts b/src/business/rules/titre-etape-prop-find.ts index 0329a2248..03a211fe1 100644 --- a/src/business/rules/titre-etape-prop-find.ts +++ b/src/business/rules/titre-etape-prop-find.ts @@ -28,7 +28,11 @@ const titreEtapePropFind = ( ) // calcule le statut du titre - const titreStatutId = titreStatutIdFind(date, titreDemarchesFiltered) + const titreStatutId = titreStatutIdFind( + date, + titreDemarchesFiltered, + titreTypeId + ) // cherche la première occurrence de la propriété // dans une démarche et une étape valides diff --git a/src/business/rules/titre-statut-id-find.test.ts b/src/business/rules/titre-statut-id-find.test.ts index 459b028bd..bfdff42cd 100644 --- a/src/business/rules/titre-statut-id-find.test.ts +++ b/src/business/rules/titre-statut-id-find.test.ts @@ -9,61 +9,72 @@ import { titreDemarchesOctroiRejete, titreDemarchesOctroiClasse, titreDemarchesOctroiRetire, - titreDemarchesInstruction + titreDemarchesInstruction, + titrePERDemarchesProlongation } from './__mocks__/titre-statut-id-find-titres' describe("statut d'un titre", () => { const aujourdhui = '2020-12-01' test("le statut d'un titre sans démarche est “ind”", () => { - expect(titreStatutIdFind(aujourdhui, undefined)).toEqual('ind') + expect(titreStatutIdFind(aujourdhui, undefined, '')).toEqual('ind') }) test("le statut d'un titre avec des démarches dont le statut est “ind” est également “ind”", () => { - expect(titreStatutIdFind(aujourdhui, titreDemarchesIndefini)).toEqual('ind') + expect(titreStatutIdFind(aujourdhui, titreDemarchesIndefini, '')).toEqual( + 'ind' + ) }) test("le statut d'un titre dont la date de fin est dans le futur est “val”", () => { - expect(titreStatutIdFind(aujourdhui, titreDemarchesValide)).toEqual('val') + expect(titreStatutIdFind(aujourdhui, titreDemarchesValide, '')).toEqual( + 'val' + ) }) test("le statut d'un titre dont la date de fin est dans le passé est “ech”", () => { - expect(titreStatutIdFind(aujourdhui, titreDemarchesEchu)).toEqual('ech') + expect(titreStatutIdFind(aujourdhui, titreDemarchesEchu, '')).toEqual('ech') }) test("le statut d'un titre dont l'unique démarche est un octroi en instruction est “dmi”", () => { expect( - titreStatutIdFind(aujourdhui, titreDemarchesOctroiInstruction) + titreStatutIdFind(aujourdhui, titreDemarchesOctroiInstruction, '') ).toEqual('dmi') }) test("le statut d'un titre dont l'unique démarche est un octroi déposé est “dmi”", () => { - expect(titreStatutIdFind(aujourdhui, titreDemarchesOctroiDepose)).toEqual( - 'dmi' - ) + expect( + titreStatutIdFind(aujourdhui, titreDemarchesOctroiDepose, '') + ).toEqual('dmi') }) test("le statut d'un titre dont l'unique démarche est un octroi rejeté est “dmc”", () => { - expect(titreStatutIdFind(aujourdhui, titreDemarchesOctroiRejete)).toEqual( - 'dmc' - ) + expect( + titreStatutIdFind(aujourdhui, titreDemarchesOctroiRejete, '') + ).toEqual('dmc') }) test("le statut d'un titre dont l'unique démarche est un octroi classé sans suite est “dmc”", () => { - expect(titreStatutIdFind(aujourdhui, titreDemarchesOctroiClasse)).toEqual( - 'dmc' - ) + expect( + titreStatutIdFind(aujourdhui, titreDemarchesOctroiClasse, '') + ).toEqual('dmc') }) test("le statut d'un titre dont l'unique démarche est un octroi retiré est “dmc”", () => { - expect(titreStatutIdFind(aujourdhui, titreDemarchesOctroiRetire)).toEqual( - 'dmc' - ) + expect( + titreStatutIdFind(aujourdhui, titreDemarchesOctroiRetire, '') + ).toEqual('dmc') }) test("le statut d'un titre avec une démarche en instruction est “mod”", () => { - expect(titreStatutIdFind(aujourdhui, titreDemarchesInstruction)).toEqual( - 'mod' - ) + expect( + titreStatutIdFind(aujourdhui, titreDemarchesInstruction, '') + ).toEqual('mod') + }) + + test("le statut d'un titre PER M ou W avec une prolongation déposée est “mod”", () => { + expect( + titreStatutIdFind(aujourdhui, titrePERDemarchesProlongation, 'prm') + ).toEqual('mod') }) }) diff --git a/src/business/rules/titre-statut-id-find.ts b/src/business/rules/titre-statut-id-find.ts index ba0b7e365..1b5528b79 100644 --- a/src/business/rules/titre-statut-id-find.ts +++ b/src/business/rules/titre-statut-id-find.ts @@ -1,10 +1,11 @@ -import { ITitreDemarche } from '../../types' +import { DemarchesStatutsTypes, ITitreDemarche } from '../../types' import { titreDateFinFind } from './titre-date-fin-find' const titreStatutIdFind = ( aujourdhui: string, - demarches?: ITitreDemarche[] | null + demarches: ITitreDemarche[] | null | undefined, + titreTypeId: string ) => { const titreDemarches = demarches ? demarches.filter(d => !d.type!.travaux) @@ -49,6 +50,33 @@ const titreStatutIdFind = ( return 'val' } + // si le titre est un PER M ou W + // et qu'une démarche de prolongation est déposée et a été déposée avant l'échéance de l'octroi + // -> le statut du titre est modification en instance (survie provisoire) + if (['prm', 'prw'].includes(titreTypeId)) { + const octroi = titreDemarches.find(d => d.typeId === 'oct') + + const dateFinOctroi = octroi ? titreDateFinFind([octroi]) : null + if ( + dateFinOctroi && + titreDemarches.some(d => { + if (!['pr1', 'pr2'].includes(d.typeId)) { + return false + } + + if (d.statutId !== DemarchesStatutsTypes.Depose) { + return false + } + + const demandeProlongation = d.etapes?.find(e => e.typeId === 'mfr') + + return demandeProlongation && demandeProlongation.date < dateFinOctroi + }) + ) { + return 'mod' + } + } + // sinon le statut du titre est échu return 'ech' } diff --git a/src/business/utils/titre-valide-check.ts b/src/business/utils/titre-valide-check.ts index bcca2beb8..104bc6bff 100644 --- a/src/business/utils/titre-valide-check.ts +++ b/src/business/utils/titre-valide-check.ts @@ -34,7 +34,11 @@ const titreValideCheck = ( ) // si le titre a le statut "modification en instance" au moment de dateDebut - const titreStatutId = titreStatutIdFind(dateDebut, newTitreDemarches) + const titreStatutId = titreStatutIdFind( + dateDebut, + newTitreDemarches, + titreTypeId + ) if (titreStatutId === 'mod') return true