diff --git a/server/src/commands.ts b/server/src/commands.ts index 03acb6546..14bfd2209 100644 --- a/server/src/commands.ts +++ b/server/src/commands.ts @@ -576,6 +576,12 @@ program .option("-q, --queued", "Run job asynchronously", false) .action(createJobAction("hydrate:update-effectifs-lieu-de-formation")); +program + .command("hydrate:update-effectifs-organisme-lieu-vers-formateur") + .description("Mise à jour des organismes des effectifs de lieu de formation vers organisme formateur") + .option("-q, --queued", "Run job asynchronously", false) + .action(createJobAction("hydrate:update-effectifs-organisme-lieu-vers-formateur")); + program.command("init:dev").description("Initialisation du projet en local").action(createJobAction("init:dev")); /** diff --git a/server/src/db/migrations/20241112160758-hydrate:update-effectifs-organisme-lieu-vers-formateur.ts b/server/src/db/migrations/20241112160758-hydrate:update-effectifs-organisme-lieu-vers-formateur.ts new file mode 100644 index 000000000..703ebe04a --- /dev/null +++ b/server/src/db/migrations/20241112160758-hydrate:update-effectifs-organisme-lieu-vers-formateur.ts @@ -0,0 +1,5 @@ +import { addJob } from "job-processor"; + +export const up = async () => { + await addJob({ name: "hydrate:update-effectifs-organisme-lieu-vers-formateur", queued: true }); +}; diff --git a/server/src/jobs/hydrate/effectifs/update-effectifs-lieu-de-formation.ts b/server/src/jobs/hydrate/effectifs/update-effectifs-lieu-de-formation.ts index fb6204a61..01ea64a21 100644 --- a/server/src/jobs/hydrate/effectifs/update-effectifs-lieu-de-formation.ts +++ b/server/src/jobs/hydrate/effectifs/update-effectifs-lieu-de-formation.ts @@ -1,5 +1,6 @@ import { captureException } from "@sentry/node"; +import { addComputedFields } from "@/common/actions/effectifs.actions"; import logger from "@/common/logger"; import { effectifsDb, organismesDb } from "@/common/model/collections"; @@ -56,3 +57,53 @@ export async function hydrateEffectifsLieuDeFormation() { captureException(err); } } + +export async function hydrateEffectifsLieuDeFormationVersOrganismeFormateur() { + let nbEffectifsMisAJour = 0; + let nbEffectifsNonMisAJour = 0; + + const organismeFormateurCache = new Map(); + + try { + const cursor = effectifsDb().find({ organisme_formateur_id: { $exists: true } }); + + while (await cursor.hasNext()) { + const effectif = await cursor.next(); + + if (effectif) { + let organismeFormateur; + + if (organismeFormateurCache.has(effectif.organisme_formateur_id)) { + organismeFormateur = organismeFormateurCache.get(effectif.organisme_formateur_id); + } else if (effectif.organisme_formateur_id) { + organismeFormateur = await organismesDb().findOne({ _id: effectif.organisme_formateur_id }); + } + + if (organismeFormateur) { + const updatedEffectif = { + organisme_id: organismeFormateur._id, + organisme_formateur_id: organismeFormateur._id, + _computed: await addComputedFields({ organisme: organismeFormateur, effectif }), + }; + + const updateResult = await effectifsDb().updateOne({ _id: effectif._id }, { $set: updatedEffectif }); + + if (updateResult.modifiedCount > 0) { + nbEffectifsMisAJour++; + } else { + nbEffectifsNonMisAJour++; + } + } else { + nbEffectifsNonMisAJour++; + } + } + } + + logger.info( + `${nbEffectifsMisAJour} effectifs mis à jour avec l'organisme formateur, ${nbEffectifsNonMisAJour} effectifs non mis à jour.` + ); + } catch (err) { + logger.error(`Échec de la mise à jour des effectifs: ${err}`); + captureException(err); + } +} diff --git a/server/src/jobs/ingestion/process-ingestion.ts b/server/src/jobs/ingestion/process-ingestion.ts index 928d99a44..52d71e723 100644 --- a/server/src/jobs/ingestion/process-ingestion.ts +++ b/server/src/jobs/ingestion/process-ingestion.ts @@ -391,7 +391,7 @@ async function transformEffectifQueueV3ToEffectif(rawEffectifQueued: IEffectifQu return { effectif: { ...effectif, - organisme_id: organismeLieu?._id, + organisme_id: organismeFormateur?._id, organisme_formateur_id: organismeFormateur?._id, organisme_responsable_id: organismeResponsable?._id, lieu_de_formation: { @@ -400,9 +400,9 @@ async function transformEffectifQueueV3ToEffectif(rawEffectifQueued: IEffectifQu adresse: effectifQueued.etablissement_lieu_de_formation_adresse, code_postal: effectifQueued.etablissement_lieu_de_formation_code_postal, }, - _computed: await addComputedFields({ organisme: organismeLieu, effectif }), + _computed: await addComputedFields({ organisme: organismeFormateur, effectif }), }, - organisme: organismeLieu, + organisme: organismeFormateur, }; }) .safeParseAsync(rawEffectifQueued); diff --git a/server/src/jobs/jobs.ts b/server/src/jobs/jobs.ts index 6ae470195..dee872819 100644 --- a/server/src/jobs/jobs.ts +++ b/server/src/jobs/jobs.ts @@ -33,7 +33,10 @@ import { } from "./hydrate/effectifs/hydrate-effectifs-computed"; import { hydrateEffectifsComputedTypes } from "./hydrate/effectifs/hydrate-effectifs-computed-types"; import { hydrateEffectifsFormationsNiveaux } from "./hydrate/effectifs/hydrate-effectifs-formations-niveaux"; -import { hydrateEffectifsLieuDeFormation } from "./hydrate/effectifs/update-effectifs-lieu-de-formation"; +import { + hydrateEffectifsLieuDeFormation, + hydrateEffectifsLieuDeFormationVersOrganismeFormateur, +} from "./hydrate/effectifs/update-effectifs-lieu-de-formation"; import { cleanEffectifsSource, hydrateEffectifsSource } from "./hydrate/effectifs/update-effectifs-source"; import { hydrateEffectifsQueueSource } from "./hydrate/effectifs-queue/update-effectifs-queue-source"; import { hydrateFormationsCatalogue } from "./hydrate/hydrate-formations-catalogue"; @@ -380,6 +383,11 @@ export async function setupJobProcessor() { return hydrateEffectifsLieuDeFormation(); }, }, + "hydrate:update-effectifs-organisme-lieu-vers-formateur": { + handler: async () => { + return hydrateEffectifsLieuDeFormationVersOrganismeFormateur(); + }, + }, "hydrate:voeux-effectifs-relations": { handler: async () => { return hydrateVoeuxEffectifsRelations(); diff --git a/server/tests/integration/jobs/ingestion/process-ingestion.test.ts b/server/tests/integration/jobs/ingestion/process-ingestion.test.ts index 4b08161dd..f1cc14c27 100644 --- a/server/tests/integration/jobs/ingestion/process-ingestion.test.ts +++ b/server/tests/integration/jobs/ingestion/process-ingestion.test.ts @@ -619,12 +619,6 @@ describe("Processus d'ingestion", () => { validation_errors: [], _computed: { organisme: { - region: "84", - departement: "01", - academie: "10", - uai: "0802004U", - siret: "77937827200016", - reseaux: [], fiable: false, }, formation: { @@ -721,12 +715,6 @@ describe("Processus d'ingestion", () => { validation_errors: [], _computed: { organisme: { - region: "84", - departement: "01", - academie: "10", - uai: "0802004U", - siret: "77937827200016", - reseaux: [], fiable: false, }, formation: { @@ -901,12 +889,6 @@ describe("Processus d'ingestion", () => { validation_errors: [], _computed: { organisme: { - region: "84", - departement: "01", - academie: "10", - uai: "0802004U", - siret: "77937827200016", - reseaux: [], fiable: false, }, formation: {