Skip to content

Commit

Permalink
Fix: Transformation des inscrits sans contrat en abandon après 90 jou…
Browse files Browse the repository at this point in the history
…rs (#3486)
  • Loading branch information
nkrmr authored Jan 11, 2024
1 parent 0816c2b commit 90fad4e
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 26 deletions.
4 changes: 2 additions & 2 deletions server/src/commands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -583,11 +583,11 @@ program
* Job de suppression des inscrits sans contrats dans ce statut depuis un nb de jours donné
*/
program
.command("fiabilisation:effectifs:remove-inscritsSansContrats-depuis-nbJours")
.command("fiabilisation:effectifs:transform-inscritsSansContrats-en-abandons-depuis")
.description("Suppression des inscrits sans contrats dans ce statut depuis un nombre de jours donné")
.option("--nbJours <number>", "Nombre de jours dans le statut", (n) => parseInt(n, 10), 90)
.option("-q, --queued", "Run job asynchronously", false)
.action(createJobAction("fiabilisation:effectifs:remove-inscritsSansContrats-depuis-nbJours"));
.action(createJobAction("fiabilisation:effectifs:transform-inscritsSansContrats-en-abandons-depuis"));

/**
* Job de transformation des rupturants en abandon dans ce statut depuis un nombre de jours donné
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,9 @@ export const apprenantSchema = object(
}),
date_statut: date(),
date_reception: date(),
abandon_forced: boolean({
description: "Le statut a été forcé en abandon",
}),
},
{
required: ["valeur_statut", "date_statut"],
Expand Down
52 changes: 33 additions & 19 deletions server/src/jobs/fiabilisation/effectifs/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,25 +34,38 @@ const getAggregateNbJoursDepuisStatutStages = (nbJours) => [
const getNbAbandonsADate = async () => (await abandonsIndicator.getListAtDate(new Date(), filterStages)).length;

/**
* Méthode de suppression des effectifs inscrits sans contrats pour les années scolaires courantes
* qui sont dans ce statut depuis nbJours
* Méthode de transformation des effectifs inscrits sans contrats en abandons (dans ce statut depuis nbJours)
*/
export const removeInscritsSansContratsDepuis = async (nbJours = 90) => {
const inscritsSansContratsIdsToRemove = (
await effectifsDb()
.aggregate([
...filterStages,
...inscritsSansContratsIndicator.getAtDateAggregationPipeline(new Date()),
...getAggregateNbJoursDepuisStatutStages(nbJours),
])
.toArray()
).map((item) => item._id);

const { deletedCount } = await effectifsDb().deleteMany({ _id: { $in: inscritsSansContratsIdsToRemove } });
logger.info(`Suppression de ${deletedCount} effectifs inscrits dans ce statut depuis ${nbJours} jours !`);
export const transformSansContratsToAbandonsDepuis = async (nbJours = 90) => {
const dateAbandonToSet = addDays(new Date(), -nbJours);

const inscritsSansContratsToTransform = await effectifsDb()
.aggregate([
...filterStages,
...inscritsSansContratsIndicator.getAtDateAggregationPipeline(new Date()),
...getAggregateNbJoursDepuisStatutStages(nbJours),
])
.toArray();

let nbUpdated = 0;
await Promise.all(
inscritsSansContratsToTransform.map(async (item) => {
const effectif = await effectifsDb().findOne({ _id: item._id });
if (!effectif) {
throw new Error(`Unable to find effectif ${item._id.toString()}`);
} else {
await updateEffectifToAbandon(effectif, dateAbandonToSet);
nbUpdated++;
}
})
);

logger.info(
`Transformation de ${nbUpdated} effectifs inscrits sans contrat dans ce statut depuis ${nbJours} jours en abandons effectuée avec succès !`
);

return {
deletedCount,
nbUpdated,
};
};

Expand All @@ -63,7 +76,7 @@ export const removeInscritsSansContratsDepuis = async (nbJours = 90) => {
export const transformRupturantsToAbandonsDepuis = async (nbJours = 180) => {
logger.info(`${await getNbAbandonsADate()} abandons à date avant lancement du script`);

const dateAbandonToSet = addDays(new Date(), -180);
const dateAbandonToSet = addDays(new Date(), -nbJours);

const rupturantsToTransform = await effectifsDb()
.aggregate([
Expand All @@ -80,7 +93,7 @@ export const transformRupturantsToAbandonsDepuis = async (nbJours = 180) => {
if (!effectif) {
throw new Error(`Unable to find effectif ${item._id.toString()}`);
} else {
await updateEffectifRupturantToAbandon(effectif, dateAbandonToSet);
await updateEffectifToAbandon(effectif, dateAbandonToSet);
nbUpdated++;
}
})
Expand All @@ -101,13 +114,14 @@ export const transformRupturantsToAbandonsDepuis = async (nbJours = 180) => {
* @param {*} effectif
* @param {*} abandonDate
*/
const updateEffectifRupturantToAbandon = async (effectif, abandonDate) => {
const updateEffectifToAbandon = async (effectif, abandonDate) => {
try {
// Ajout d'une entrée manuelle "ABANDON" à la date
effectif.apprenant.historique_statut.push({
valeur_statut: CODES_STATUT_APPRENANT.abandon,
date_statut: abandonDate,
date_reception: abandonDate,
abandon_forced: true,
});

await effectifsDb().findOneAndUpdate(
Expand Down
10 changes: 5 additions & 5 deletions server/src/jobs/jobs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { findInvalidDocuments } from "./db/findInvalidDocuments";
import { recreateIndexes } from "./db/recreateIndexes";
import { validateModels } from "./db/schemaValidation";
import { sendReminderEmails } from "./emails/reminder";
import { removeInscritsSansContratsDepuis, transformRupturantsToAbandonsDepuis } from "./fiabilisation/effectifs";
import { transformSansContratsToAbandonsDepuis, transformRupturantsToAbandonsDepuis } from "./fiabilisation/effectifs";
import { hydrateRaisonSocialeEtEnseigneOFAInconnus } from "./fiabilisation/ofa-inconnus";
import { getStats } from "./fiabilisation/stats";
import { buildFiabilisationUaiSiret } from "./fiabilisation/uai-siret/build";
Expand Down Expand Up @@ -92,8 +92,8 @@ export const CronsMap = {
// # Mise a jour du nb d'effectifs
await addJob({ name: "hydrate:organismes-effectifs-count", queued: true });

// # Fiabilisation des effectifs : suppression des inscrits sans contrats depuis 90 jours & transformation des rupturants en abandon > 180 jours
await addJob({ name: "fiabilisation:effectifs:remove-inscritsSansContrats-depuis-nbJours", queued: true });
// # Fiabilisation des effectifs : transformation des inscrits sans contrats en abandon > 90 jours & transformation des rupturants en abandon > 180 jours
await addJob({ name: "fiabilisation:effectifs:transform-inscritsSansContrats-en-abandons-depuis", queued: true });
await addJob({ name: "fiabilisation:effectifs:transform-rupturants-en-abandons-depuis", queued: true });

return 0;
Expand Down Expand Up @@ -231,8 +231,8 @@ export async function runJob(job: IJobsCronTask | IJobsSimple): Promise<number>

return { buildResults, updateResults };
}
case "fiabilisation:effectifs:remove-inscritsSansContrats-depuis-nbJours":
return removeInscritsSansContratsDepuis((job.payload as any)?.nbJours);
case "fiabilisation:effectifs:transform-inscritsSansContrats-en-abandons-depuis":
return transformSansContratsToAbandonsDepuis((job.payload as any)?.nbJours);
case "fiabilisation:effectifs:transform-rupturants-en-abandons-depuis":
return transformRupturantsToAbandonsDepuis((job.payload as any)?.nbJours);
case "fiabilisation:stats":
Expand Down

0 comments on commit 90fad4e

Please sign in to comment.