From a6c90db28e860a97b598e93b9f0f9145b690db97 Mon Sep 17 00:00:00 2001 From: Paul Gaucher Date: Fri, 15 Nov 2024 17:26:49 +0100 Subject: [PATCH 1/8] fix: suppression du controle de date sur le statut apprenti --- server/src/common/actions/effectifs.statut.actions.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/common/actions/effectifs.statut.actions.ts b/server/src/common/actions/effectifs.statut.actions.ts index f3fa12805..319dac6b0 100644 --- a/server/src/common/actions/effectifs.statut.actions.ts +++ b/server/src/common/actions/effectifs.statut.actions.ts @@ -173,11 +173,11 @@ export function determineStatutsByContrats( contracts.forEach((contract, index) => { const { dateDebut, dateRupture } = contract; - if (dateDebut <= effectiveDateFin) { + if (dateDebut) { statuts.push({ valeur: STATUT_APPRENANT.APPRENTI, date: dateDebut }); } - if (dateRupture && dateRupture <= effectiveDateFin) { + if (dateRupture && dateRupture) { const nextContract = contracts[index + 1]; if (!nextContract) { latestRuptureDate = dateRupture; From b2835302d2058175642b4ea99b2e0ca1675d4622 Mon Sep 17 00:00:00 2001 From: Paul Gaucher Date: Fri, 15 Nov 2024 17:46:15 +0100 Subject: [PATCH 2/8] =?UTF-8?q?fix:=20ajout=20du=20test=20avec=20d=C3=A9bu?= =?UTF-8?q?t=20de=20contrat=20dans=20le=20futur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../actions/effectifs.types.actions.test.ts | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/server/tests/integration/common/actions/effectifs.types.actions.test.ts b/server/tests/integration/common/actions/effectifs.types.actions.test.ts index 716e145e0..4b61eaff0 100644 --- a/server/tests/integration/common/actions/effectifs.types.actions.test.ts +++ b/server/tests/integration/common/actions/effectifs.types.actions.test.ts @@ -92,6 +92,29 @@ describe("hydrateEffectifsComputedTypes", () => { expect(updatedEffectif?._computed?.statut?.en_cours).toEqual(STATUT_APPRENANT.APPRENTI); }); + + it("doit avoir le statut apprenti même si le contrat commence dans le futur", async () => { + const customDateDeDebutDeContrat = new Date(); + customDateDeDebutDeContrat.setDate(customDateDeDebutDeContrat.getDate() + 7); + + const effectif = await createSampleEffectif({ + organisme: sampleOrganisme, + contrats: [ + { + date_debut: customDateDeDebutDeContrat, + date_fin: formation.date_fin, + }, + ], + formation, + }); + + const { insertedId } = await effectifsDb().insertOne(effectif as IEffectif); + await hydrateEffectifsComputedTypes(); + + const updatedEffectif = await effectifsDb().findOne({ _id: insertedId }); + + expect(updatedEffectif?._computed?.statut?.en_cours).toEqual(STATUT_APPRENANT.APPRENTI); + }); }); describe("apprenent en formation avec rupture de contrat", () => { From 8b10e8481a77c112c9a4a3cd57f929a1f17d334f Mon Sep 17 00:00:00 2001 From: Paul Gaucher Date: Mon, 18 Nov 2024 10:51:54 +0100 Subject: [PATCH 3/8] =?UTF-8?q?fix:=20ajout=20de=20test=20sur=20les=20rupt?= =?UTF-8?q?ures=20avant=20d=C3=A9but=20de=20contrat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../actions/effectifs.statut.actions.ts | 7 +++-- .../actions/effectifs.types.actions.test.ts | 28 +++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/server/src/common/actions/effectifs.statut.actions.ts b/server/src/common/actions/effectifs.statut.actions.ts index 319dac6b0..afd59e2b1 100644 --- a/server/src/common/actions/effectifs.statut.actions.ts +++ b/server/src/common/actions/effectifs.statut.actions.ts @@ -174,10 +174,13 @@ export function determineStatutsByContrats( const { dateDebut, dateRupture } = contract; if (dateDebut) { - statuts.push({ valeur: STATUT_APPRENANT.APPRENTI, date: dateDebut }); + if (!dateRupture || (dateRupture && dateDebut < dateRupture)) { + // Gestion des rutptures avant démarrage + statuts.push({ valeur: STATUT_APPRENANT.APPRENTI, date: dateDebut }); + } } - if (dateRupture && dateRupture) { + if (dateRupture) { const nextContract = contracts[index + 1]; if (!nextContract) { latestRuptureDate = dateRupture; diff --git a/server/tests/integration/common/actions/effectifs.types.actions.test.ts b/server/tests/integration/common/actions/effectifs.types.actions.test.ts index 4b61eaff0..058c62223 100644 --- a/server/tests/integration/common/actions/effectifs.types.actions.test.ts +++ b/server/tests/integration/common/actions/effectifs.types.actions.test.ts @@ -118,6 +118,34 @@ describe("hydrateEffectifsComputedTypes", () => { }); describe("apprenent en formation avec rupture de contrat", () => { + it("doit avoir le statut apprenti si rupture de contrat avant le début du contrat", async () => { + const ruptureDate = new Date(formation.date_entree.getTime()); + ruptureDate.setDate(formation.date_entree.getDate() - 10); + + const effectif = await createSampleEffectif({ + organisme: sampleOrganisme, + contrats: [ + { + date_debut: formation.date_entree, + date_fin: formation.date_fin, + date_rupture: ruptureDate, + }, + ], + formation, + }); + + const { insertedId } = await effectifsDb().insertOne(effectif as IEffectif); + await hydrateEffectifsComputedTypes({ evaluationDate }); + + const updatedEffectif = await effectifsDb().findOne({ _id: insertedId }); + + expect(updatedEffectif?._computed?.statut?.parcours).toEqual([ + { valeur: STATUT_APPRENANT.INSCRIT, date: formation.date_entree }, + { valeur: STATUT_APPRENANT.RUPTURANT, date: ruptureDate }, + ]); + expect(updatedEffectif?._computed?.statut?.en_cours).toEqual(STATUT_APPRENANT.RUPTURANT); + }); + it("doit avoir le statut rupturant si rupture de moins de 180 jours", async () => { const ruptureDate = new Date(evaluationDate.getTime()); ruptureDate.setDate(ruptureDate.getDate() - 179); From 07de9aa766f91009073f0be6b739e5d99be9a134 Mon Sep 17 00:00:00 2001 From: Paul Gaucher Date: Tue, 19 Nov 2024 13:56:05 +0100 Subject: [PATCH 4/8] fix: suppression du statut de rupturant si rupture avant contrat --- server/src/common/actions/effectifs.statut.actions.ts | 2 +- .../common/actions/effectifs.types.actions.test.ts | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/server/src/common/actions/effectifs.statut.actions.ts b/server/src/common/actions/effectifs.statut.actions.ts index afd59e2b1..9e306e92e 100644 --- a/server/src/common/actions/effectifs.statut.actions.ts +++ b/server/src/common/actions/effectifs.statut.actions.ts @@ -180,7 +180,7 @@ export function determineStatutsByContrats( } } - if (dateRupture) { + if (dateRupture && dateDebut < dateRupture) { const nextContract = contracts[index + 1]; if (!nextContract) { latestRuptureDate = dateRupture; diff --git a/server/tests/integration/common/actions/effectifs.types.actions.test.ts b/server/tests/integration/common/actions/effectifs.types.actions.test.ts index 058c62223..edf267139 100644 --- a/server/tests/integration/common/actions/effectifs.types.actions.test.ts +++ b/server/tests/integration/common/actions/effectifs.types.actions.test.ts @@ -118,10 +118,11 @@ describe("hydrateEffectifsComputedTypes", () => { }); describe("apprenent en formation avec rupture de contrat", () => { - it("doit avoir le statut apprenti si rupture de contrat avant le début du contrat", async () => { + it("ne doit pas avoir le statut d'apprenti si rupture de contrat avant le début du contrat", async () => { const ruptureDate = new Date(formation.date_entree.getTime()); ruptureDate.setDate(formation.date_entree.getDate() - 10); + const customEvalutationDate = new Date(formation.date_entree.getTime() + 10); const effectif = await createSampleEffectif({ organisme: sampleOrganisme, contrats: [ @@ -135,15 +136,13 @@ describe("hydrateEffectifsComputedTypes", () => { }); const { insertedId } = await effectifsDb().insertOne(effectif as IEffectif); - await hydrateEffectifsComputedTypes({ evaluationDate }); + await hydrateEffectifsComputedTypes({ evaluationDate: customEvalutationDate }); const updatedEffectif = await effectifsDb().findOne({ _id: insertedId }); expect(updatedEffectif?._computed?.statut?.parcours).toEqual([ { valeur: STATUT_APPRENANT.INSCRIT, date: formation.date_entree }, - { valeur: STATUT_APPRENANT.RUPTURANT, date: ruptureDate }, ]); - expect(updatedEffectif?._computed?.statut?.en_cours).toEqual(STATUT_APPRENANT.RUPTURANT); }); it("doit avoir le statut rupturant si rupture de moins de 180 jours", async () => { From 6f55c968b74be1f8411e4fcbbac35c2ce44efb27 Mon Sep 17 00:00:00 2001 From: Paul Gaucher Date: Tue, 19 Nov 2024 14:54:06 +0100 Subject: [PATCH 5/8] fix: ajout de la condition sur une rupture --- server/src/common/actions/effectifs.statut.actions.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/common/actions/effectifs.statut.actions.ts b/server/src/common/actions/effectifs.statut.actions.ts index 9e306e92e..c7dadc9e2 100644 --- a/server/src/common/actions/effectifs.statut.actions.ts +++ b/server/src/common/actions/effectifs.statut.actions.ts @@ -163,7 +163,7 @@ export function determineStatutsByContrats( const earliestContract = contracts[0]?.dateDebut; - if (dateEntree && earliestContract && earliestContract < dateEntree) { + if (dateEntree && earliestContract && earliestContract <= dateEntree) { statuts.push({ valeur: STATUT_APPRENANT.INSCRIT, date: earliestContract }); } else if (dateEntree) { statuts.push({ valeur: STATUT_APPRENANT.INSCRIT, date: dateEntree }); @@ -174,7 +174,7 @@ export function determineStatutsByContrats( const { dateDebut, dateRupture } = contract; if (dateDebut) { - if (!dateRupture || (dateRupture && dateDebut < dateRupture)) { + if (!dateRupture || (dateRupture && dateDebut <= dateRupture)) { // Gestion des rutptures avant démarrage statuts.push({ valeur: STATUT_APPRENANT.APPRENTI, date: dateDebut }); } From efdf2889a1df616e9b1ebc08105588e2583271ae Mon Sep 17 00:00:00 2001 From: Paul Gaucher Date: Tue, 19 Nov 2024 14:59:33 +0100 Subject: [PATCH 6/8] fix: mise a jour de la condition de rupture --- server/src/common/actions/effectifs.statut.actions.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/common/actions/effectifs.statut.actions.ts b/server/src/common/actions/effectifs.statut.actions.ts index c7dadc9e2..ea665ba96 100644 --- a/server/src/common/actions/effectifs.statut.actions.ts +++ b/server/src/common/actions/effectifs.statut.actions.ts @@ -163,7 +163,7 @@ export function determineStatutsByContrats( const earliestContract = contracts[0]?.dateDebut; - if (dateEntree && earliestContract && earliestContract <= dateEntree) { + if (dateEntree && earliestContract && earliestContract < dateEntree) { statuts.push({ valeur: STATUT_APPRENANT.INSCRIT, date: earliestContract }); } else if (dateEntree) { statuts.push({ valeur: STATUT_APPRENANT.INSCRIT, date: dateEntree }); @@ -180,7 +180,7 @@ export function determineStatutsByContrats( } } - if (dateRupture && dateDebut < dateRupture) { + if (dateRupture && dateDebut <= dateRupture) { const nextContract = contracts[index + 1]; if (!nextContract) { latestRuptureDate = dateRupture; From 37bce6ca23c1e6547bbc44317e6477e3fb979f0e Mon Sep 17 00:00:00 2001 From: Paul Gaucher Date: Thu, 16 Jan 2025 14:41:30 +0100 Subject: [PATCH 7/8] fix: ajout d'un job pour la mise a jour des statuts --- server/src/jobs/jobs.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/server/src/jobs/jobs.ts b/server/src/jobs/jobs.ts index ab857f949..04ee60a7e 100644 --- a/server/src/jobs/jobs.ts +++ b/server/src/jobs/jobs.ts @@ -179,6 +179,11 @@ export async function setupJobProcessor() { return hydrateDecaRaw(); }, }, + "hydrate:effectifs:update_all_computed_statut": { + handler: async () => { + return hydrateEffectifsComputedTypes(); + }, + }, "hydrate:effectifs:update_computed_statut": { handler: async (job, signal) => { const organismeId = (job.payload?.id as string) ? new ObjectId(job.payload?.id as string) : null; From e95cce995a97b9fe5d418fa436accfff80539836 Mon Sep 17 00:00:00 2001 From: Paul Gaucher Date: Mon, 20 Jan 2025 15:05:51 +0100 Subject: [PATCH 8/8] fix: ajout d'une migration sur les statutus computed --- .../db/migrations/20250120140331-update-computed-type.ts | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 server/src/db/migrations/20250120140331-update-computed-type.ts diff --git a/server/src/db/migrations/20250120140331-update-computed-type.ts b/server/src/db/migrations/20250120140331-update-computed-type.ts new file mode 100644 index 000000000..d7b76adc5 --- /dev/null +++ b/server/src/db/migrations/20250120140331-update-computed-type.ts @@ -0,0 +1,8 @@ +import { addJob } from "job-processor"; + +export const up = async () => { + await addJob({ + name: "hydrate:effectifs:update_all_computed_statut", + queued: true, + }); +};