diff --git a/server/src/db/migrations/20241025115945-clean-organismes.ts b/server/src/db/migrations/20241025115945-clean-organismes.ts new file mode 100644 index 000000000..efbb60619 --- /dev/null +++ b/server/src/db/migrations/20241025115945-clean-organismes.ts @@ -0,0 +1,21 @@ +import { Db, type ObjectId } from "mongodb"; + +import { organismesDb, usersMigrationDb } from "@/common/model/collections"; + +const countOrganismeUsers = async (organismeId: ObjectId) => { + return await usersMigrationDb().countDocuments({ organismes: organismeId }); +}; + +export const up = async (db: Db) => { + const organismes = organismesDb().find({ effectifs_count: 0 }); + for await (const organisme of organismes) { + const usersCount = await countOrganismeUsers(organisme._id); + if (usersCount === 0) { + await db.collection("migration-20241025115945-clean-organismes").insertOne({ + op: "delete-organisme", + organisme, + }); + await organismesDb().deleteOne({ _id: organisme._id }); + } + } +}; diff --git a/server/src/jobs/fiabilisation/uai-siret/build.ts b/server/src/jobs/fiabilisation/uai-siret/build.ts index 07c43a044..ee6544106 100644 --- a/server/src/jobs/fiabilisation/uai-siret/build.ts +++ b/server/src/jobs/fiabilisation/uai-siret/build.ts @@ -1,17 +1,8 @@ import { PromisePool } from "@supercharge/promise-pool"; -import { - getAnneesScolaireListFromDate, - STATUT_FIABILISATION_COUPLES_UAI_SIRET, - STATUT_PRESENCE_REFERENTIEL, -} from "shared"; +import { STATUT_FIABILISATION_COUPLES_UAI_SIRET } from "shared"; import logger from "@/common/logger"; -import { - effectifsDb, - effectifsQueueDb, - fiabilisationUaiSiretDb, - organismesReferentielDb, -} from "@/common/model/collections"; +import { fiabilisationUaiSiretDb, organismesDb, organismesReferentielDb } from "@/common/model/collections"; import { getPercentage } from "@/common/utils/miscUtils"; import { addFiabilisationsManuelles } from "./build.manual"; @@ -26,9 +17,6 @@ import { checkUaiMultiplesRelationsAndLieux, } from "./build.rules"; -// Filtres année scolaire pour récupération des couples UAI-SIRET -const filters = { annee_scolaire: { $in: getAnneesScolaireListFromDate(new Date()) } }; - /** * Fonction de construction de la collection des couples de fiabilisation UAI SIRET */ @@ -36,20 +24,14 @@ export const buildFiabilisationUaiSiret = async () => { await fiabilisationUaiSiretDb().deleteMany({}); logger.info("> Execution du script de fiabilisation sur tous les couples UAI-SIRET..."); - const [organismesFromReferentiel, allCouplesUaiSiretTdbInReferentiel, uniqueCouplesUaiSiretToCheck] = - await Promise.all([ - organismesReferentielDb().find().toArray(), - getAllCouplesUaiSiretTdbInReferentiel(), - getAllUniqueCouplesUaiSiretToFiabilise(), - ]); + const [organismesFromReferentiel, allCouplesUaiSiretTdb] = await Promise.all([ + organismesReferentielDb().find().toArray(), + getAllUniqueCouplesUaiSiretTdb(), + ]); // Traitement // sur tous les couples identifiés - await PromisePool.for(uniqueCouplesUaiSiretToCheck).process(async (coupleUaiSiretTdb) => { - await buildFiabilisationCoupleForTdbCouple( - coupleUaiSiretTdb, - allCouplesUaiSiretTdbInReferentiel, - organismesFromReferentiel - ); + await PromisePool.for(allCouplesUaiSiretTdb).process(async (coupleUaiSiretTdb) => { + await buildFiabilisationCoupleForTdbCouple(coupleUaiSiretTdb, allCouplesUaiSiretTdb, organismesFromReferentiel); }); // Ajout de fiabilisation manuelles @@ -75,13 +57,13 @@ export const buildFiabilisationUaiSiret = async () => { type: STATUT_FIABILISATION_COUPLES_UAI_SIRET.NON_FIABILISABLE_INEXISTANT, }); - let percentageCouplesFiables = getPercentage(nbCouplesFiablesFound, uniqueCouplesUaiSiretToCheck.length); + let percentageCouplesFiables = getPercentage(nbCouplesFiablesFound, allCouplesUaiSiretTdb.length); let nbCouplesNonFiabilisables = nbCouplesNonFiabilisablesUaiNonValidee + nbCouplesNonFiabilisablesUaiValidee + nbCouplesNonFiabilisablesPbCollecte + nbCouplesNonFiabilisablesInexistants; - let percentageCouplesNonFiabilisables = getPercentage(nbCouplesNonFiabilisables, uniqueCouplesUaiSiretToCheck.length); + let percentageCouplesNonFiabilisables = getPercentage(nbCouplesNonFiabilisables, allCouplesUaiSiretTdb.length); logger.info(` -> ${nbCouplesFiablesFound} couples déjà fiables (${percentageCouplesFiables}%)`); logger.info(` -> ${nbCouplesAFiabiliser} nouveaux couples à fiabiliser`); @@ -168,95 +150,9 @@ export const buildFiabilisationCoupleForTdbCouple = async ( if (await checkCoupleNonFiabilisable(coupleUaiSiretTdbToCheck)) return; }; -/** - * Fonction de récupération de la liste des couples UAI SIRET uniques à fiabiliser - * Cette liste est construire à partir de tous les couples UAI SIRET lié à des effectifs du TDB + tous les couples - * liés à des données valides et sans erreurs dans la file d'attente - * @returns - */ -const getAllUniqueCouplesUaiSiretToFiabilise = async () => { - const [allCouplesUaiSiretTdb, allCouplesUaiSiretTdbInQueue] = await Promise.all([ - getAllCouplesUaiSiretTdb(), - getAllCouplesUaiSiretTdbInQueue(), - ]); - - logger.info(" >>", allCouplesUaiSiretTdb.length, "couples UAI/SIRET trouvés en db"); - logger.info(" >>", allCouplesUaiSiretTdbInQueue.length, "couples UAI/SIRET trouvés dans la file d'attente"); - - // On récupère la liste dédoublonnée des couples depuis les 2 sous ensembles tdb + queue - const couplesUaiSiret = [...allCouplesUaiSiretTdb, ...allCouplesUaiSiretTdbInQueue]; - const uniqueCouplesUaiSiretToCheck = couplesUaiSiret.filter( - (obj, index) => couplesUaiSiret.findIndex((item) => item.uai === obj.uai && item.siret === obj.siret) === index - ); +const getAllUniqueCouplesUaiSiretTdb = async () => { + const uniqueCouplesUaiSiretToCheck = await organismesDb().find({}).toArray(); logger.info(">", uniqueCouplesUaiSiretToCheck.length, "couples UAI/SIRET uniques à traiter"); return uniqueCouplesUaiSiretToCheck; }; - -/** - * Fonction de récupération de tous les couples UAI/SIRET depuis les effectifs en faisant un lookup effectifs - organismes - * @returns - */ -const getAllCouplesUaiSiretTdb = async () => { - return await effectifsDb() - .aggregate([ - { $match: filters }, - { - $lookup: { - from: "organismes", - localField: "organisme_id", - foreignField: "_id", - as: "organismes_info", - }, - }, - { $unwind: "$organismes_info" }, - { $project: { organisme_uai: "$organismes_info.uai", organisme_siret: "$organismes_info.siret" } }, - { $group: { _id: { uai: "$organisme_uai", siret: "$organisme_siret" } } }, - { $project: { _id: 0, uai: "$_id.uai", siret: "$_id.siret" } }, - ]) - .toArray(); -}; - -const getAllCouplesUaiSiretTdbInReferentiel = async () => { - return await effectifsDb() - .aggregate([ - { $match: filters }, - { - $lookup: { - from: "organismes", - localField: "organisme_id", - foreignField: "_id", - as: "organismes_info", - pipeline: [ - { - $match: { - est_dans_le_referentiel: { - $in: [STATUT_PRESENCE_REFERENTIEL.PRESENT, STATUT_PRESENCE_REFERENTIEL.PRESENT_UAI_MULTIPLES_TDB], - }, - }, - }, - ], - }, - }, - { $unwind: "$organismes_info" }, - { $project: { organisme_uai: "$organismes_info.uai", organisme_siret: "$organismes_info.siret" } }, - { $group: { _id: { uai: "$organisme_uai", siret: "$organisme_siret" } } }, - { $project: { _id: 0, uai: "$_id.uai", siret: "$_id.siret" } }, - ]) - .toArray(); -}; - -/** - * Fonction de récupération de tous les couples UAI/SIRET depuis la file d'attente effectifsQueue sans erreurs de validation - * @returns - */ -const getAllCouplesUaiSiretTdbInQueue = async () => { - // - return await effectifsQueueDb() - .aggregate([ - { $match: { ...filters } }, - { $group: { _id: { uai: "$uai_etablissement", siret: "$siret_etablissement" } } }, - { $project: { _id: 0, uai: "$_id.uai", siret: "$_id.siret" } }, - ]) - .toArray(); -};