Skip to content

Commit

Permalink
fix: mise a jour du modele de donnees pour les ml + mécanique process…
Browse files Browse the repository at this point in the history
… ingestion
  • Loading branch information
Pomarom committed Dec 17, 2024
1 parent d3cfc7a commit 9689305
Show file tree
Hide file tree
Showing 7 changed files with 73 additions and 62 deletions.
21 changes: 11 additions & 10 deletions server/src/common/actions/effectifs.actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import type { ICertification } from "api-alternance-sdk";
import Boom from "boom";
import { cloneDeep, isObject, merge, mergeWith, reduce, set, uniqBy } from "lodash-es";
import { ObjectId, type WithoutId } from "mongodb";
import { IOpcos, IOrganisation, IRncp, IUsersMigration } from "shared/models";
import { IEffecifMissionLocale, IOpcos, IOrganisation, IRncp, IUsersMigration } from "shared/models";
import { IEffectif } from "shared/models/data/effectifs.model";
import { IEffectifDECA } from "shared/models/data/effectifsDECA.model";
import { IOrganisme } from "shared/models/data/organismes.model";
Expand Down Expand Up @@ -468,8 +468,14 @@ export const updateEffectifComputedFromRNCP = async (rncp: IRncp, opco: IOpcos)
};

export const buildEffectifForMissionLocale = (
effectif: IEffectif & { organisation: IOrganisation } & { cfa_users: IUsersMigration }
) => {
effectif: IEffectif & { organisation: IOrganisation } & { cfa_users: Array<IUsersMigration> }
): IEffecifMissionLocale => {
const users = effectif.cfa_users.map(({ nom, prenom, email, telephone }) => ({
nom,
prenom,
email,
telephone,
}));
const result = {
_id: effectif._id,
apprenant: {
Expand All @@ -484,15 +490,10 @@ export const buildEffectifForMissionLocale = (
statut: effectif._computed?.statut,
formation: effectif.formation,
organisme: effectif._computed?.organisme,
user: {
nom: effectif.cfa_users?.nom,
fonction: effectif.cfa_users?.prenom,
email: effectif.cfa_users?.email,
telephone: effectif.cfa_users?.telephone,
},
users,
organisme_id: effectif.organisme_id,
annee_scolaire: effectif.annee_scolaire,
source: effectif.source,
};
return result;
return result as IEffecifMissionLocale;
};
19 changes: 7 additions & 12 deletions server/src/common/actions/effectifs/effectifs.actions.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { ObjectId } from "mongodb";
import { IEffectif, IOrganisation, IUsersMigration } from "shared/models";
import { IEffecifMissionLocale, IEffectif, IOrganisation, IUsersMigration } from "shared/models";
import { getAnneesScolaireListFromDate } from "shared/utils";

import { organismeLookup } from "@/common/actions/helpers/filters";
Expand Down Expand Up @@ -172,12 +172,6 @@ export const getPaginatedEffectifsByMissionLocaleId = async (
as: "cfa_users",
},
},
{
$unwind: {
path: "$cfa_users",
preserveNullAndEmptyArrays: true,
},
},
{
$facet: {
pagination: [{ $count: "total" }, { $addFields: { page, limit } }],
Expand All @@ -189,16 +183,17 @@ export const getPaginatedEffectifsByMissionLocaleId = async (

const result = (await effectifsDb().aggregate(aggregation).next()) as {
pagination: any;
data: Array<IEffectif & { organisation: IOrganisation } & { cfa_users: IUsersMigration }>;
data: Array<IEffectif & { organisation: IOrganisation } & { cfa_users: Array<IUsersMigration> }>;
};

if (!result) {
return { pagination: { total: 0, page, limit }, data: [] };
}
const { pagination, data } = result;

if (result.pagination) {
result.pagination.lastPage = Math.ceil(result.pagination.total / limit);
if (pagination) {
pagination.lastPage = Math.ceil(result.pagination.total / limit);
}
result.data = result.data.map((effectif) => buildEffectifForMissionLocale(effectif));
return result;
const effectifs: Array<IEffecifMissionLocale> = data.map((effectif) => buildEffectifForMissionLocale(effectif));
return { pagination, data: effectifs };
};
73 changes: 36 additions & 37 deletions shared/models/data/effectifs.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,40 @@ export const zEffectifComputedStatut = z.object({
),
});

export const zEffectifComputedOrganisme = z.object({
region: zAdresse.shape.region.nullish(),
departement: zAdresse.shape.departement.nullish(),
academie: zAdresse.shape.academie.nullish(),
reseaux: z.array(zodEnumFromObjKeys(TETE_DE_RESEAUX_BY_ID)).describe("Réseaux du CFA, s'ils existent").nullish(),
bassinEmploi: z.string({}).nullish(),

// 2 champs utiles seulement pour les indicateurs v1
// à supprimer avec les prochains dashboards indicateurs/effectifs pour utiliser organisme_id
uai: z
.string({
description: "Code UAI de l'établissement",
})
.regex(UAI_REGEX)
.nullish(),
siret: z
.string({
description: "N° SIRET de l'établissement",
})
.regex(SIRET_REGEX)
.nullish(),
fiable: z
.boolean({
description: `organismes.fiabilisation_statut == "FIABLE" && ferme != false`,
})
.nullish(),
});

export const zEffectifAnneeScolaire = z
.string({
description: `Année scolaire sur laquelle l'apprenant est enregistré (ex: "2020-2021")`,
})
.regex(YEAR_RANGE_REGEX);

export const zEffectif = z.object({
_id: zObjectId.describe("Identifiant MongoDB de l'effectif"),
organisme_id: zObjectId.describe("Organisme id (lieu de formation de l'apprenant pour la v3)"),
Expand All @@ -118,11 +152,7 @@ export const zEffectif = z.object({
description: "Identifiant de l'organisme id source transmettant",
})
.nullish(),
annee_scolaire: z
.string({
description: `Année scolaire sur laquelle l'apprenant est enregistré (ex: "2020-2021")`,
})
.regex(YEAR_RANGE_REGEX),
annee_scolaire: zEffectifAnneeScolaire,
apprenant: zApprenant,
formation: zFormationEffectif.nullish(),
contrats: z
Expand Down Expand Up @@ -187,38 +217,7 @@ export const zEffectif = z.object({
_computed: z
.object(
{
organisme: z
.object({
region: zAdresse.shape.region.nullish(),
departement: zAdresse.shape.departement.nullish(),
academie: zAdresse.shape.academie.nullish(),
reseaux: z
.array(zodEnumFromObjKeys(TETE_DE_RESEAUX_BY_ID))
.describe("Réseaux du CFA, s'ils existent")
.nullish(),
bassinEmploi: z.string({}).nullish(),

// 2 champs utiles seulement pour les indicateurs v1
// à supprimer avec les prochains dashboards indicateurs/effectifs pour utiliser organisme_id
uai: z
.string({
description: "Code UAI de l'établissement",
})
.regex(UAI_REGEX)
.nullish(),
siret: z
.string({
description: "N° SIRET de l'établissement",
})
.regex(SIRET_REGEX)
.nullish(),
fiable: z
.boolean({
description: `organismes.fiabilisation_statut == "FIABLE" && ferme != false`,
})
.nullish(),
})
.nullish(),
organisme: zEffectifComputedOrganisme.nullish(),
formation: z
.object({
codes_rome: z.array(z.string()).nullish(),
Expand Down
2 changes: 1 addition & 1 deletion shared/models/data/usersMigration.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ const indexes: [IndexSpecification, CreateIndexesOptions][] = [
[{ organisation_id: 1 }, {}],
];

const zUsersMigration = z.object({
export const zUsersMigration = z.object({
_id: zObjectId,
email: z.string().describe("Email utilisateur"),
password: z.string().describe("Le mot de passe hashé"),
Expand Down
1 change: 1 addition & 0 deletions shared/models/routes/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export * from "./OrganismeSupportInfo";
export * from "./mission-locale";
18 changes: 16 additions & 2 deletions shared/models/routes/mission-locale/MissionLocaleEffectif.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
import { z } from "zod";
import { zObjectId } from "zod-mongodb-schema";

import { zEffectif, zEffectifComputedStatut } from "../../data";
import { SourceApprenantEnum } from "shared/constants/effectifs";

import {
zEffectifAnneeScolaire,
zEffectifComputedOrganisme,
zEffectifComputedStatut,
zUsersMigration,
} from "../../data";
import { zApprenant } from "../../data/effectifs/apprenant.part";
import { zFormationEffectif } from "../../data/effectifs/formation.part";

const zEffectifMissionLocale = z.object({
export const zEffectifMissionLocale = z.object({
_id: zObjectId,
apprenant: zApprenant.pick({
nom: true,
Expand All @@ -18,4 +25,11 @@ const zEffectifMissionLocale = z.object({
}),
statut: zEffectifComputedStatut,
formation: zFormationEffectif,
organisme: zEffectifComputedOrganisme,
users: z.array(zUsersMigration.pick({ nom: true, prenom: true, email: true, telephone: true })),
organisme_id: zObjectId,
annee_scolaire: zEffectifAnneeScolaire,
source: SourceApprenantEnum,
});

export type IEffecifMissionLocale = z.infer<typeof zEffectifMissionLocale>;
1 change: 1 addition & 0 deletions shared/models/routes/mission-locale/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from "./MissionLocaleEffectif";

0 comments on commit 9689305

Please sign in to comment.