Skip to content

Commit

Permalink
feat: nettoyage des organismes inconnus
Browse files Browse the repository at this point in the history
  • Loading branch information
moroine committed Oct 25, 2024
1 parent 66561e3 commit 21cb236
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 116 deletions.
21 changes: 21 additions & 0 deletions server/src/db/migrations/20241025115945-clean-organismes.ts
Original file line number Diff line number Diff line change
@@ -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 });
}
}
};
128 changes: 12 additions & 116 deletions server/src/jobs/fiabilisation/uai-siret/build.ts
Original file line number Diff line number Diff line change
@@ -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";
Expand All @@ -26,30 +17,21 @@ 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
*/
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
Expand All @@ -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`);
Expand Down Expand Up @@ -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();
};

0 comments on commit 21cb236

Please sign in to comment.