From d12e17f5c64a31234e82f6ef5d4d46a05eed309e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20D=C3=A9tr=C3=A9?= Date: Wed, 18 Dec 2024 10:32:05 +0100 Subject: [PATCH] fix: remarques PR --- .../getCorrections/deps/getCorrections.dep.ts | 44 +++++----- server/src/modules/data/index.ts | 2 +- .../dependencies/getFormations.dep.ts | 29 +++---- .../getFormationsDepartement.dep.ts | 22 ++--- .../getFormationsDepartementBase.dep.ts | 8 +- .../getTopFlopFormationsDepartement.dep.ts | 22 ++--- .../dependencies/getFormationsRegion.dep.ts | 22 ++--- .../getFormationsRegionBase.dep.ts | 8 +- .../getTopFlopFormationsRegion.dep.ts | 22 ++--- .../getDemandesRestitutionIntentions.query.ts | 37 ++++---- .../getFormationEtablissementsQuery.dep.ts | 34 +++----- .../deps/getFormationsQuery.dep.ts | 37 +++----- ...tions.routes.ts => getFormations.route.ts} | 0 .../getFormationsPilotageIntentions.dep.ts | 29 +++---- .../usecases/getDemande/getDemande.query.ts | 58 ++++++------- .../importActionPrioritaire.deps.ts | 16 +--- .../importActionPrioritaire.usecase.ts | 5 +- .../getIntention/getIntention.query.ts | 86 +++++++++---------- .../utils/formatFormationSpecifique.ts | 23 +++++ .../utils/isFormationActionPrioritaire.ts | 52 ++++------- .../HeaderSection/FiltersSection.tsx | 6 +- .../components/FormationTooltipContent.tsx | 25 +++--- ui/components/BadgesFormationSpecifique.tsx | 2 - 23 files changed, 259 insertions(+), 330 deletions(-) rename server/src/modules/data/usecases/getFormations/{getFormations.routes.ts => getFormations.route.ts} (100%) create mode 100644 server/src/modules/utils/formatFormationSpecifique.ts diff --git a/server/src/modules/corrections/usecases/getCorrections/deps/getCorrections.dep.ts b/server/src/modules/corrections/usecases/getCorrections/deps/getCorrections.dep.ts index 0b747045b..34bad7f0f 100644 --- a/server/src/modules/corrections/usecases/getCorrections/deps/getCorrections.dep.ts +++ b/server/src/modules/corrections/usecases/getCorrections/deps/getCorrections.dep.ts @@ -13,8 +13,9 @@ import { selectTauxDevenirFavorable } from "@/modules/data/utils/tauxDevenirFavo import { selectTauxInsertion6mois } from "@/modules/data/utils/tauxInsertion6mois"; import { selectTauxPoursuite } from "@/modules/data/utils/tauxPoursuite"; import { selectTauxPressionParFormationEtParRegionDemande } from "@/modules/data/utils/tauxPression"; +import { formatFormationSpecifique } from "@/modules/utils/formatFormationSpecifique"; import { isDemandeNotDeleted, isDemandeSelectable } from "@/modules/utils/isDemandeSelectable"; -import { isFormationActionPrioritaireDemande } from "@/modules/utils/isFormationActionPrioritaire"; +import { isFormationActionPrioritaire } from "@/modules/utils/isFormationActionPrioritaire"; import { getNormalizedSearchArray } from "@/modules/utils/normalizeSearch"; import { cleanNull } from "@/utils/noNull"; @@ -155,7 +156,11 @@ export const getCorrectionsQuery = async ({ "correction.updatedAt", "correction.commentaire", selectPositionQuadrant(eb).as("positionQuadrant"), - isFormationActionPrioritaireDemande(eb).as(TypeFormationSpecifiqueEnum["Action prioritaire"]), + isFormationActionPrioritaire({ + cfdRef: "demande.cfd", + codeDispositifRef: "demande.codeDispositif", + codeRegionRef: "demande.codeRegion", + }).as(TypeFormationSpecifiqueEnum["Action prioritaire"]), eb.ref("formationView.isTransitionDemographique").as(TypeFormationSpecifiqueEnum["Transition démographique"]), eb.ref("formationView.isTransitionEcologique").as(TypeFormationSpecifiqueEnum["Transition écologique"]), eb.ref("formationView.isTransitionNumerique").as(TypeFormationSpecifiqueEnum["Transition numérique"]), @@ -304,29 +309,24 @@ export const getCorrectionsQuery = async ({ .where(isDemandeNotDeleted) .offset(offset) .limit(limit) - .execute(); + .execute() + .then(cleanNull); - const campagnes = await getKbdClient().selectFrom("campagne").selectAll().orderBy("annee desc").execute(); + const campagnes = await getKbdClient() + .selectFrom("campagne") + .selectAll() + .orderBy("annee desc") + .execute() + .then(cleanNull); return { - corrections: corrections.map((correction) => - cleanNull({ - ...correction, - createdAt: correction.createdAt?.toISOString(), - updatedAt: correction.updatedAt?.toISOString(), - formationSpecifique: { - [TypeFormationSpecifiqueEnum["Action prioritaire"]]: - !!correction[TypeFormationSpecifiqueEnum["Action prioritaire"]], - [TypeFormationSpecifiqueEnum["Transition démographique"]]: - !!correction[TypeFormationSpecifiqueEnum["Transition démographique"]], - [TypeFormationSpecifiqueEnum["Transition écologique"]]: - !!correction[TypeFormationSpecifiqueEnum["Transition écologique"]], - [TypeFormationSpecifiqueEnum["Transition numérique"]]: - !!correction[TypeFormationSpecifiqueEnum["Transition numérique"]], - }, - }) - ), - campagnes: campagnes.map(cleanNull), + corrections: corrections.map((correction) => ({ + ...correction, + createdAt: correction.createdAt?.toISOString(), + updatedAt: correction.updatedAt?.toISOString(), + formationSpecifique: formatFormationSpecifique(correction), + })), + campagnes, count: corrections[0]?.count || 0, }; }; diff --git a/server/src/modules/data/index.ts b/server/src/modules/data/index.ts index 7f72ad5e5..288086343 100644 --- a/server/src/modules/data/index.ts +++ b/server/src/modules/data/index.ts @@ -15,7 +15,7 @@ import { getFormationRoute } from "./usecases/getFormation/getFormation.route"; import { getFormationCarteEtablissementsRoute } from "./usecases/getFormationCarteEtablissements/getFormationCarteEtablissements.route"; import { getFormationEtablissementsRoutes } from "./usecases/getFormationEtablissements/getFormationEtablissements.routes"; import { getFormationIndicateursRoute } from "./usecases/getFormationIndicateurs/getFormationIndicateurs.route"; -import { getFormationsRoute } from "./usecases/getFormations/getFormations.routes"; +import { getFormationsRoute } from "./usecases/getFormations/getFormations.route"; import { getFormationsPilotageIntentionsRoute } from "./usecases/getFormationsPilotageIntentions/getFormationsPilotageIntentions.route"; import { getHeaderEtablissementRoute } from "./usecases/getHeaderEtablissement/getHeaderEtablissement.route"; import { getPilotageReformeStatsRoute } from "./usecases/getPilotageReformeStats/getPilotageReformeStats.route"; diff --git a/server/src/modules/data/usecases/getAnalyseDetailleeEtablissement/dependencies/getFormations.dep.ts b/server/src/modules/data/usecases/getAnalyseDetailleeEtablissement/dependencies/getFormations.dep.ts index f499f400b..df07ec323 100644 --- a/server/src/modules/data/usecases/getAnalyseDetailleeEtablissement/dependencies/getFormations.dep.ts +++ b/server/src/modules/data/usecases/getAnalyseDetailleeEtablissement/dependencies/getFormations.dep.ts @@ -2,7 +2,8 @@ import { sql } from "kysely"; import { TypeFormationSpecifiqueEnum } from "shared/enum/formationSpecifiqueEnum"; import type { Voie } from "shared/enum/voieEnum"; -import { isFormationActionPrioritaireDataEtablissement } from "@/modules/utils/isFormationActionPrioritaire"; +import { formatFormationSpecifique } from "@/modules/utils/formatFormationSpecifique"; +import { isFormationActionPrioritaire } from "@/modules/utils/isFormationActionPrioritaire"; import { cleanNull } from "@/utils/noNull"; import { getBase } from "./base.dep"; @@ -26,7 +27,11 @@ export const getFormations = async ({ uai }: { uai: string }) => "formationView.typeFamille", "dispositif.libelleDispositif", "niveauDiplome.libelleNiveauDiplome", - isFormationActionPrioritaireDataEtablissement(eb).as(TypeFormationSpecifiqueEnum["Action prioritaire"]), + isFormationActionPrioritaire({ + cfdRef: "formationEtablissement.cfd", + codeDispositifRef: "formationEtablissement.codeDispositif", + codeRegionRef: "dataEtablissement.codeRegion", + }).as(TypeFormationSpecifiqueEnum["Action prioritaire"]), eb.ref("formationView.isTransitionDemographique").as(TypeFormationSpecifiqueEnum["Transition démographique"]), eb.ref("formationView.isTransitionEcologique").as(TypeFormationSpecifiqueEnum["Transition écologique"]), eb.ref("formationView.isTransitionNumerique").as(TypeFormationSpecifiqueEnum["Transition numérique"]), @@ -34,20 +39,10 @@ export const getFormations = async ({ uai }: { uai: string }) => .$narrowType<{ voie: Voie }>() .orderBy(["libelleNiveauDiplome asc", "libelleFormation asc", "libelleDispositif"]) .execute() + .then(cleanNull) .then((formations) => - formations.map((formation) => - cleanNull({ - ...formation, - formationSpecifique: { - [TypeFormationSpecifiqueEnum["Action prioritaire"]]: - !!formation[TypeFormationSpecifiqueEnum["Action prioritaire"]], - [TypeFormationSpecifiqueEnum["Transition démographique"]]: - !!formation[TypeFormationSpecifiqueEnum["Transition démographique"]], - [TypeFormationSpecifiqueEnum["Transition écologique"]]: - !!formation[TypeFormationSpecifiqueEnum["Transition écologique"]], - [TypeFormationSpecifiqueEnum["Transition numérique"]]: - !!formation[TypeFormationSpecifiqueEnum["Transition numérique"]], - }, - }) - ) + formations.map((formation) => ({ + ...formation, + formationSpecifique: formatFormationSpecifique(formation), + })) ); diff --git a/server/src/modules/data/usecases/getDataForPanoramaDepartement/dependencies/getFormationsDepartement.dep.ts b/server/src/modules/data/usecases/getDataForPanoramaDepartement/dependencies/getFormationsDepartement.dep.ts index 3fe9fa17e..bce848cae 100644 --- a/server/src/modules/data/usecases/getDataForPanoramaDepartement/dependencies/getFormationsDepartement.dep.ts +++ b/server/src/modules/data/usecases/getDataForPanoramaDepartement/dependencies/getFormationsDepartement.dep.ts @@ -1,8 +1,8 @@ import { CURRENT_IJ_MILLESIME } from "shared"; -import { TypeFormationSpecifiqueEnum } from "shared/enum/formationSpecifiqueEnum"; import type { Filters } from "shared/routes/schemas/get.panorama.stats.departement.schema"; import { withInsertionReg } from "@/modules/data/utils/tauxInsertion6mois"; +import { formatFormationSpecifique } from "@/modules/utils/formatFormationSpecifique"; import { cleanNull } from "@/utils/noNull"; import { getFormationsDepartementBase } from "./getFormationsDepartementBase.dep"; @@ -22,20 +22,10 @@ export const getFormationsDepartement = async (filters: Filters) => null ) .execute() + .then(cleanNull) .then((formations) => - formations.map((formation) => - cleanNull({ - ...formation, - formationSpecifique: { - [TypeFormationSpecifiqueEnum["Action prioritaire"]]: - !!formation[TypeFormationSpecifiqueEnum["Action prioritaire"]], - [TypeFormationSpecifiqueEnum["Transition démographique"]]: - !!formation[TypeFormationSpecifiqueEnum["Transition démographique"]], - [TypeFormationSpecifiqueEnum["Transition écologique"]]: - !!formation[TypeFormationSpecifiqueEnum["Transition écologique"]], - [TypeFormationSpecifiqueEnum["Transition numérique"]]: - !!formation[TypeFormationSpecifiqueEnum["Transition numérique"]], - }, - }) - ) + formations.map((formation) => ({ + ...formation, + formationSpecifique: formatFormationSpecifique(formation), + })) ); diff --git a/server/src/modules/data/usecases/getDataForPanoramaDepartement/dependencies/getFormationsDepartementBase.dep.ts b/server/src/modules/data/usecases/getDataForPanoramaDepartement/dependencies/getFormationsDepartementBase.dep.ts index a64dfd0ce..c77d27980 100644 --- a/server/src/modules/data/usecases/getDataForPanoramaDepartement/dependencies/getFormationsDepartementBase.dep.ts +++ b/server/src/modules/data/usecases/getDataForPanoramaDepartement/dependencies/getFormationsDepartementBase.dep.ts @@ -15,7 +15,7 @@ import { withInsertionReg } from "@/modules/data/utils/tauxInsertion6mois"; import { withPoursuiteReg } from "@/modules/data/utils/tauxPoursuite"; import { selectTauxPressionAgg } from "@/modules/data/utils/tauxPression"; import { selectTauxRemplissageAgg } from "@/modules/data/utils/tauxRemplissage"; -import { isFormationActionPrioritaireEtablissement } from "@/modules/utils/isFormationActionPrioritaire"; +import { isFormationActionPrioritaire } from "@/modules/utils/isFormationActionPrioritaire"; export const getFormationsDepartementBase = ({ codeDepartement, @@ -137,8 +137,12 @@ export const getFormationsDepartementBase = ({ codeDispositifRef: "formationEtablissement.codeDispositif", codeRegionRef: "etablissement.codeRegion", }).as("tauxDevenirFavorable"), + isFormationActionPrioritaire({ + cfdRef: "formationEtablissement.cfd", + codeDispositifRef: "formationEtablissement.codeDispositif", + codeRegionRef: "etablissement.codeRegion", + }).as(TypeFormationSpecifiqueEnum["Action prioritaire"]), "positionFormationRegionaleQuadrant.positionQuadrant", - isFormationActionPrioritaireEtablissement(eb).as(TypeFormationSpecifiqueEnum["Action prioritaire"]), eb.ref("formationView.isTransitionDemographique").as(TypeFormationSpecifiqueEnum["Transition démographique"]), eb.ref("formationView.isTransitionEcologique").as(TypeFormationSpecifiqueEnum["Transition écologique"]), eb.ref("formationView.isTransitionNumerique").as(TypeFormationSpecifiqueEnum["Transition numérique"]), diff --git a/server/src/modules/data/usecases/getDataForPanoramaDepartement/dependencies/getTopFlopFormationsDepartement.dep.ts b/server/src/modules/data/usecases/getDataForPanoramaDepartement/dependencies/getTopFlopFormationsDepartement.dep.ts index 60758457f..bec3449a4 100644 --- a/server/src/modules/data/usecases/getDataForPanoramaDepartement/dependencies/getTopFlopFormationsDepartement.dep.ts +++ b/server/src/modules/data/usecases/getDataForPanoramaDepartement/dependencies/getTopFlopFormationsDepartement.dep.ts @@ -1,8 +1,8 @@ import { CURRENT_IJ_MILLESIME } from "shared"; -import { TypeFormationSpecifiqueEnum } from "shared/enum/formationSpecifiqueEnum"; import type { Filters } from "shared/routes/schemas/get.panorama.stats.departement.schema"; import { withTauxDevenirFavorableReg } from "@/modules/data/utils/tauxDevenirFavorable"; +import { formatFormationSpecifique } from "@/modules/utils/formatFormationSpecifique"; import { cleanNull } from "@/utils/noNull"; import { getFormationsDepartementBase } from "./getFormationsDepartementBase.dep"; @@ -22,20 +22,10 @@ export const getTopFlopFormationsDepartement = async (filters: Filters) => null ) .execute() + .then(cleanNull) .then((formations) => - formations.map((formation) => - cleanNull({ - ...formation, - formationSpecifique: { - [TypeFormationSpecifiqueEnum["Action prioritaire"]]: - !!formation[TypeFormationSpecifiqueEnum["Action prioritaire"]], - [TypeFormationSpecifiqueEnum["Transition démographique"]]: - !!formation[TypeFormationSpecifiqueEnum["Transition démographique"]], - [TypeFormationSpecifiqueEnum["Transition écologique"]]: - !!formation[TypeFormationSpecifiqueEnum["Transition écologique"]], - [TypeFormationSpecifiqueEnum["Transition numérique"]]: - !!formation[TypeFormationSpecifiqueEnum["Transition numérique"]], - }, - }) - ) + formations.map((formation) => ({ + ...formation, + formationSpecifique: formatFormationSpecifique(formation), + })) ); diff --git a/server/src/modules/data/usecases/getDataForPanoramaRegion/dependencies/getFormationsRegion.dep.ts b/server/src/modules/data/usecases/getDataForPanoramaRegion/dependencies/getFormationsRegion.dep.ts index 2149a8b3b..6b38e3855 100644 --- a/server/src/modules/data/usecases/getDataForPanoramaRegion/dependencies/getFormationsRegion.dep.ts +++ b/server/src/modules/data/usecases/getDataForPanoramaRegion/dependencies/getFormationsRegion.dep.ts @@ -1,8 +1,8 @@ import { CURRENT_IJ_MILLESIME } from "shared"; -import { TypeFormationSpecifiqueEnum } from "shared/enum/formationSpecifiqueEnum"; import type { Filters } from "shared/routes/schemas/get.panorama.stats.region.schema"; import { withInsertionReg } from "@/modules/data/utils/tauxInsertion6mois"; +import { formatFormationSpecifique } from "@/modules/utils/formatFormationSpecifique"; import { cleanNull } from "@/utils/noNull"; import { getFormationsRegionBase } from "./getFormationsRegionBase.dep"; @@ -22,20 +22,10 @@ export const getFormationsRegion = async (filters: Filters) => null ) .execute() + .then(cleanNull) .then((formations) => - formations.map((formation) => - cleanNull({ - ...formation, - formationSpecifique: { - [TypeFormationSpecifiqueEnum["Action prioritaire"]]: - !!formation[TypeFormationSpecifiqueEnum["Action prioritaire"]], - [TypeFormationSpecifiqueEnum["Transition démographique"]]: - !!formation[TypeFormationSpecifiqueEnum["Transition démographique"]], - [TypeFormationSpecifiqueEnum["Transition écologique"]]: - !!formation[TypeFormationSpecifiqueEnum["Transition écologique"]], - [TypeFormationSpecifiqueEnum["Transition numérique"]]: - !!formation[TypeFormationSpecifiqueEnum["Transition numérique"]], - }, - }) - ) + formations.map((formation) => ({ + ...formation, + formationSpecifique: formatFormationSpecifique(formation), + })) ); diff --git a/server/src/modules/data/usecases/getDataForPanoramaRegion/dependencies/getFormationsRegionBase.dep.ts b/server/src/modules/data/usecases/getDataForPanoramaRegion/dependencies/getFormationsRegionBase.dep.ts index 8c798a83d..428999053 100644 --- a/server/src/modules/data/usecases/getDataForPanoramaRegion/dependencies/getFormationsRegionBase.dep.ts +++ b/server/src/modules/data/usecases/getDataForPanoramaRegion/dependencies/getFormationsRegionBase.dep.ts @@ -15,7 +15,7 @@ import { withInsertionReg } from "@/modules/data/utils/tauxInsertion6mois"; import { withPoursuiteReg } from "@/modules/data/utils/tauxPoursuite"; import { selectTauxPressionAgg } from "@/modules/data/utils/tauxPression"; import { selectTauxRemplissageAgg } from "@/modules/data/utils/tauxRemplissage"; -import { isFormationActionPrioritaireEtablissement } from "@/modules/utils/isFormationActionPrioritaire"; +import { isFormationActionPrioritaire } from "@/modules/utils/isFormationActionPrioritaire"; export const getFormationsRegionBase = ({ codeRegion, @@ -135,7 +135,11 @@ export const getFormationsRegionBase = ({ codeRegionRef: "etablissement.codeRegion", }).as("tauxDevenirFavorable"), "positionFormationRegionaleQuadrant.positionQuadrant", - isFormationActionPrioritaireEtablissement(eb).as(TypeFormationSpecifiqueEnum["Action prioritaire"]), + isFormationActionPrioritaire({ + cfdRef: "formationEtablissement.cfd", + codeDispositifRef: "formationEtablissement.codeDispositif", + codeRegionRef: "etablissement.codeRegion", + }).as(TypeFormationSpecifiqueEnum["Action prioritaire"]), eb.ref("formationView.isTransitionDemographique").as(TypeFormationSpecifiqueEnum["Transition démographique"]), eb.ref("formationView.isTransitionEcologique").as(TypeFormationSpecifiqueEnum["Transition écologique"]), eb.ref("formationView.isTransitionNumerique").as(TypeFormationSpecifiqueEnum["Transition numérique"]), diff --git a/server/src/modules/data/usecases/getDataForPanoramaRegion/dependencies/getTopFlopFormationsRegion.dep.ts b/server/src/modules/data/usecases/getDataForPanoramaRegion/dependencies/getTopFlopFormationsRegion.dep.ts index eff3da532..2c9e380c6 100644 --- a/server/src/modules/data/usecases/getDataForPanoramaRegion/dependencies/getTopFlopFormationsRegion.dep.ts +++ b/server/src/modules/data/usecases/getDataForPanoramaRegion/dependencies/getTopFlopFormationsRegion.dep.ts @@ -1,8 +1,8 @@ import { CURRENT_IJ_MILLESIME } from "shared"; -import { TypeFormationSpecifiqueEnum } from "shared/enum/formationSpecifiqueEnum"; import type { Filters } from "shared/routes/schemas/get.panorama.stats.region.schema"; import { withTauxDevenirFavorableReg } from "@/modules/data/utils/tauxDevenirFavorable"; +import { formatFormationSpecifique } from "@/modules/utils/formatFormationSpecifique"; import { cleanNull } from "@/utils/noNull"; import { getFormationsRegionBase } from "./getFormationsRegionBase.dep"; @@ -22,20 +22,10 @@ export const getTopFlopFormationsRegion = async (filters: Filters) => null ) .execute() + .then(cleanNull) .then((formations) => - formations.map((formation) => - cleanNull({ - ...formation, - formationSpecifique: { - [TypeFormationSpecifiqueEnum["Action prioritaire"]]: - !!formation[TypeFormationSpecifiqueEnum["Action prioritaire"]], - [TypeFormationSpecifiqueEnum["Transition démographique"]]: - !!formation[TypeFormationSpecifiqueEnum["Transition démographique"]], - [TypeFormationSpecifiqueEnum["Transition écologique"]]: - !!formation[TypeFormationSpecifiqueEnum["Transition écologique"]], - [TypeFormationSpecifiqueEnum["Transition numérique"]]: - !!formation[TypeFormationSpecifiqueEnum["Transition numérique"]], - }, - }) - ) + formations.map((formation) => ({ + ...formation, + formationSpecifique: formatFormationSpecifique(formation), + })) ); diff --git a/server/src/modules/data/usecases/getDemandesRestitutionIntentions/deps/getDemandesRestitutionIntentions.query.ts b/server/src/modules/data/usecases/getDemandesRestitutionIntentions/deps/getDemandesRestitutionIntentions.query.ts index 104ee1b1b..ffc10b31b 100644 --- a/server/src/modules/data/usecases/getDemandesRestitutionIntentions/deps/getDemandesRestitutionIntentions.query.ts +++ b/server/src/modules/data/usecases/getDemandesRestitutionIntentions/deps/getDemandesRestitutionIntentions.query.ts @@ -20,8 +20,9 @@ import { countDifferenceCapaciteScolaire, countDifferenceCapaciteScolaireColoree, } from "@/modules/utils/countCapacite"; +import { formatFormationSpecifique } from "@/modules/utils/formatFormationSpecifique"; import { isDemandeNotDeleted } from "@/modules/utils/isDemandeSelectable"; -import { isFormationActionPrioritaireDemande } from "@/modules/utils/isFormationActionPrioritaire"; +import { isFormationActionPrioritaire } from "@/modules/utils/isFormationActionPrioritaire"; import { isRestitutionIntentionVisible } from "@/modules/utils/isRestitutionIntentionVisible"; import { getNormalizedSearchArray } from "@/modules/utils/normalizeSearch"; import { cleanNull } from "@/utils/noNull"; @@ -126,7 +127,11 @@ export const getDemandesRestitutionIntentionsQuery = async ({ rentreeScolaire: CURRENT_RENTREE, }).as("nbEtablissement"), selectPositionQuadrant(eb).as("positionQuadrant"), - isFormationActionPrioritaireDemande(eb).as(TypeFormationSpecifiqueEnum["Action prioritaire"]), + isFormationActionPrioritaire({ + cfdRef: "formationEtablissement.cfd", + codeDispositifRef: "formationEtablissement.codeDispositif", + codeRegionRef: "etablissement.codeRegion", + }).as(TypeFormationSpecifiqueEnum["Action prioritaire"]), eb.ref("formationView.isTransitionDemographique").as(TypeFormationSpecifiqueEnum["Transition démographique"]), eb.ref("formationView.isTransitionEcologique").as(TypeFormationSpecifiqueEnum["Transition écologique"]), eb.ref("formationView.isTransitionNumerique").as(TypeFormationSpecifiqueEnum["Transition numérique"]), @@ -275,27 +280,17 @@ export const getDemandesRestitutionIntentionsQuery = async ({ .where(isRestitutionIntentionVisible({ user })) .offset(offset) .limit(limit) - .execute(); + .execute() + .then(cleanNull); return { - demandes: demandes.map((demande) => - cleanNull({ - ...demande, - statut: castDemandeStatutWithoutSupprimee(demande.statut), - createdAt: demande.createdAt?.toISOString(), - updatedAt: demande.updatedAt?.toISOString(), - formationSpecifique: { - [TypeFormationSpecifiqueEnum["Action prioritaire"]]: - !!demande[TypeFormationSpecifiqueEnum["Action prioritaire"]], - [TypeFormationSpecifiqueEnum["Transition démographique"]]: - !!demande[TypeFormationSpecifiqueEnum["Transition démographique"]], - [TypeFormationSpecifiqueEnum["Transition écologique"]]: - !!demande[TypeFormationSpecifiqueEnum["Transition écologique"]], - [TypeFormationSpecifiqueEnum["Transition numérique"]]: - !!demande[TypeFormationSpecifiqueEnum["Transition numérique"]], - }, - }) - ), + demandes: demandes.map((demande) => ({ + ...demande, + statut: castDemandeStatutWithoutSupprimee(demande.statut), + createdAt: demande.createdAt?.toISOString(), + updatedAt: demande.updatedAt?.toISOString(), + formationSpecifique: formatFormationSpecifique(demande), + })), count: parseInt(demandes[0]?.count) || 0, }; }; diff --git a/server/src/modules/data/usecases/getFormationEtablissements/deps/getFormationEtablissementsQuery.dep.ts b/server/src/modules/data/usecases/getFormationEtablissements/deps/getFormationEtablissementsQuery.dep.ts index 2aca567e0..03b28f31c 100644 --- a/server/src/modules/data/usecases/getFormationEtablissements/deps/getFormationEtablissementsQuery.dep.ts +++ b/server/src/modules/data/usecases/getFormationEtablissements/deps/getFormationEtablissementsQuery.dep.ts @@ -20,7 +20,8 @@ import { selectTauxInsertion6mois, withInsertionReg } from "@/modules/data/utils import { selectTauxPoursuite, withPoursuiteReg } from "@/modules/data/utils/tauxPoursuite"; import { selectTauxPression } from "@/modules/data/utils/tauxPression"; import { selectTauxRemplissage } from "@/modules/data/utils/tauxRemplissage"; -import { isFormationActionPrioritaireEtablissement } from "@/modules/utils/isFormationActionPrioritaire"; +import { formatFormationSpecifique } from "@/modules/utils/formatFormationSpecifique"; +import { isFormationActionPrioritaire } from "@/modules/utils/isFormationActionPrioritaire"; import { getNormalizedSearchArray } from "@/modules/utils/normalizeSearch"; import { cleanNull } from "@/utils/noNull"; @@ -164,7 +165,11 @@ export const getFormationEtablissementsQuery = async ({ .where("formationHistorique.ancienCFD", "in", (eb) => eb.selectFrom("formationEtablissement").select("cfd")) .limit(1) .as("isFormationRenovee"), - isFormationActionPrioritaireEtablissement(eb).as("isFormationActionPrioritaire"), + isFormationActionPrioritaire({ + cfdRef: "formationEtablissement.cfd", + codeDispositifRef: "formationEtablissement.codeDispositif", + codeRegionRef: "etablissement.codeRegion", + }).as(TypeFormationSpecifiqueEnum["Action prioritaire"]), sql` case when ${eb.ref("formationView.dateFermeture")} is not null then to_char(${eb.ref("formationView.dateFermeture")}, 'dd/mm/yyyy') @@ -190,7 +195,6 @@ export const getFormationEtablissementsQuery = async ({ ) .end() .as("positionQuadrant"), - isFormationActionPrioritaireEtablissement(eb).as(TypeFormationSpecifiqueEnum["Action prioritaire"]), eb.ref("formationView.isTransitionDemographique").as(TypeFormationSpecifiqueEnum["Transition démographique"]), eb.ref("formationView.isTransitionEcologique").as(TypeFormationSpecifiqueEnum["Transition écologique"]), eb.ref("formationView.isTransitionNumerique").as(TypeFormationSpecifiqueEnum["Transition numérique"]), @@ -394,25 +398,15 @@ export const getFormationEtablissementsQuery = async ({ .orderBy("libelleNiveauDiplome", "asc") .offset(offset) .limit(limit) - .execute(); + .execute() + .then(cleanNull); return { count: result[0]?.count ?? 0, - etablissements: result.map((etablissement) => - cleanNull({ - ...etablissement, - isFormationRenovee: !!etablissement.isFormationRenovee, - formationSpecifique: { - [TypeFormationSpecifiqueEnum["Action prioritaire"]]: - !!etablissement[TypeFormationSpecifiqueEnum["Action prioritaire"]], - [TypeFormationSpecifiqueEnum["Transition démographique"]]: - !!etablissement[TypeFormationSpecifiqueEnum["Transition démographique"]], - [TypeFormationSpecifiqueEnum["Transition écologique"]]: - !!etablissement[TypeFormationSpecifiqueEnum["Transition écologique"]], - [TypeFormationSpecifiqueEnum["Transition numérique"]]: - !!etablissement[TypeFormationSpecifiqueEnum["Transition numérique"]], - }, - }) - ), + etablissements: result.map((etablissement) => ({ + ...etablissement, + isFormationRenovee: !!etablissement.isFormationRenovee, + formationSpecifique: formatFormationSpecifique(etablissement), + })), }; }; diff --git a/server/src/modules/data/usecases/getFormations/deps/getFormationsQuery.dep.ts b/server/src/modules/data/usecases/getFormations/deps/getFormationsQuery.dep.ts index b9788aab9..eda0ec533 100644 --- a/server/src/modules/data/usecases/getFormations/deps/getFormationsQuery.dep.ts +++ b/server/src/modules/data/usecases/getFormations/deps/getFormationsQuery.dep.ts @@ -19,7 +19,8 @@ import { withInsertionReg } from "@/modules/data/utils/tauxInsertion6mois"; import { withPoursuiteReg } from "@/modules/data/utils/tauxPoursuite"; import { selectTauxPressionAgg } from "@/modules/data/utils/tauxPression"; import { selectTauxRemplissageAgg } from "@/modules/data/utils/tauxRemplissage"; -import { isFormationActionPrioritaireEtablissement } from "@/modules/utils/isFormationActionPrioritaire"; +import { formatFormationSpecifique } from "@/modules/utils/formatFormationSpecifique"; +import { isFormationActionPrioritaire } from "@/modules/utils/isFormationActionPrioritaire"; import { getNormalizedSearchArray } from "@/modules/utils/normalizeSearch"; import { cleanNull } from "@/utils/noNull"; @@ -110,7 +111,6 @@ export const getFormationsQuery = async ({ ) .end() .as("positionQuadrant"), - isFormationActionPrioritaireEtablissement(eb).as(TypeFormationSpecifiqueEnum["Action prioritaire"]), ]) .$call((eb) => { if (!positionQuadrant) return eb; @@ -209,6 +209,11 @@ export const getFormationsQuery = async ({ else null end `.as("dateFermeture"), + isFormationActionPrioritaire({ + cfdRef: "formationEtablissement.cfd", + codeDispositifRef: "formationEtablissement.codeDispositif", + codeRegionRef: "etablissement.codeRegion", + }).as(TypeFormationSpecifiqueEnum["Action prioritaire"]), eb.ref("formationView.isTransitionDemographique").as(TypeFormationSpecifiqueEnum["Transition démographique"]), eb.ref("formationView.isTransitionEcologique").as(TypeFormationSpecifiqueEnum["Transition écologique"]), eb.ref("formationView.isTransitionNumerique").as(TypeFormationSpecifiqueEnum["Transition numérique"]), @@ -356,7 +361,6 @@ export const getFormationsQuery = async ({ } return q; }) - .$narrowType<{ isFormationActionPrioritaire: boolean }>() .orderBy("libelleFormation", "asc") .orderBy("libelleNiveauDiplome", "asc") .orderBy("libelleDispositif", "asc") @@ -364,28 +368,15 @@ export const getFormationsQuery = async ({ .orderBy("nbEtablissement", "asc") .offset(offset) .limit(limit) - .execute(); + .execute() + .then(cleanNull); return { count: result[0]?.count ?? 0, - formations: result.map((formation) => - cleanNull({ - ...formation, - isFormationRenovee: !!formation.isFormationRenovee, - formationSpecifique: { - // rustine pour que le typage soit correct - [TypeFormationSpecifiqueEnum["Action prioritaire"]]: - TypeFormationSpecifiqueEnum["Action prioritaire"] in formation - ? !!formation[TypeFormationSpecifiqueEnum["Action prioritaire"]] - : false, - [TypeFormationSpecifiqueEnum["Transition démographique"]]: - !!formation[TypeFormationSpecifiqueEnum["Transition démographique"]], - [TypeFormationSpecifiqueEnum["Transition écologique"]]: - !!formation[TypeFormationSpecifiqueEnum["Transition écologique"]], - [TypeFormationSpecifiqueEnum["Transition numérique"]]: - !!formation[TypeFormationSpecifiqueEnum["Transition numérique"]], - }, - }) - ), + formations: result.map((formation) => ({ + ...formation, + isFormationRenovee: !!formation.isFormationRenovee, + formationSpecifique: formatFormationSpecifique(formation), + })), }; }; diff --git a/server/src/modules/data/usecases/getFormations/getFormations.routes.ts b/server/src/modules/data/usecases/getFormations/getFormations.route.ts similarity index 100% rename from server/src/modules/data/usecases/getFormations/getFormations.routes.ts rename to server/src/modules/data/usecases/getFormations/getFormations.route.ts diff --git a/server/src/modules/data/usecases/getFormationsPilotageIntentions/deps/getFormationsPilotageIntentions.dep.ts b/server/src/modules/data/usecases/getFormationsPilotageIntentions/deps/getFormationsPilotageIntentions.dep.ts index 011fc3d46..4aa3c711d 100644 --- a/server/src/modules/data/usecases/getFormationsPilotageIntentions/deps/getFormationsPilotageIntentions.dep.ts +++ b/server/src/modules/data/usecases/getFormationsPilotageIntentions/deps/getFormationsPilotageIntentions.dep.ts @@ -24,9 +24,10 @@ import { countPlacesOuvertes, countPlacesTransformeesParCampagne, } from "@/modules/utils/countCapacite"; +import { formatFormationSpecifique } from "@/modules/utils/formatFormationSpecifique"; import { isDemandeProjetOrValidee } from "@/modules/utils/isDemandeProjetOrValidee"; import { isDemandeNotDeletedOrRefused } from "@/modules/utils/isDemandeSelectable"; -import { isFormationActionPrioritaireDemande } from "@/modules/utils/isFormationActionPrioritaire"; +import { isFormationActionPrioritaire } from "@/modules/utils/isFormationActionPrioritaire"; import { cleanNull } from "@/utils/noNull"; import { getEffectifsParCampagneCodeNiveauDiplomeCodeRegionQuery } from "./getEffectifsParCampagneCodeNiveauDiplomeCodeRegion.dep"; @@ -182,7 +183,11 @@ export const getFormationsPilotageIntentionsQuery = ({ codeDispositifRef: "demande.codeDispositif", codeRegionRef: "dataEtablissement.codeRegion", }).as("continuum"), - isFormationActionPrioritaireDemande(eb).as(TypeFormationSpecifiqueEnum["Action prioritaire"]), + isFormationActionPrioritaire({ + cfdRef: "formationEtablissement.cfd", + codeDispositifRef: "formationEtablissement.codeDispositif", + codeRegionRef: "etablissement.codeRegion", + }).as(TypeFormationSpecifiqueEnum["Action prioritaire"]), eb.ref("formationView.isTransitionDemographique").as(TypeFormationSpecifiqueEnum["Transition démographique"]), eb.ref("formationView.isTransitionEcologique").as(TypeFormationSpecifiqueEnum["Transition écologique"]), eb.ref("formationView.isTransitionNumerique").as(TypeFormationSpecifiqueEnum["Transition numérique"]), @@ -286,21 +291,11 @@ export const getFormationsPilotageIntentionsQuery = ({ ]) .orderBy("tauxDevenirFavorable", "desc") .execute() + .then(cleanNull) .then((formations) => - formations.map((formation) => - cleanNull({ - ...formation, - formationSpecifique: { - [TypeFormationSpecifiqueEnum["Action prioritaire"]]: - !!formation[TypeFormationSpecifiqueEnum["Action prioritaire"]], - [TypeFormationSpecifiqueEnum["Transition démographique"]]: - !!formation[TypeFormationSpecifiqueEnum["Transition démographique"]], - [TypeFormationSpecifiqueEnum["Transition écologique"]]: - !!formation[TypeFormationSpecifiqueEnum["Transition écologique"]], - [TypeFormationSpecifiqueEnum["Transition numérique"]]: - !!formation[TypeFormationSpecifiqueEnum["Transition numérique"]], - }, - }) - ) + formations.map((formation) => ({ + ...formation, + formationSpecifique: formatFormationSpecifique(formation), + })) ); }; diff --git a/server/src/modules/demandes/usecases/getDemande/getDemande.query.ts b/server/src/modules/demandes/usecases/getDemande/getDemande.query.ts index aebc5be32..1ace16c50 100644 --- a/server/src/modules/demandes/usecases/getDemande/getDemande.query.ts +++ b/server/src/modules/demandes/usecases/getDemande/getDemande.query.ts @@ -9,8 +9,9 @@ import { getKbdClient } from "@/db/db"; import type { RequestUser } from "@/modules/core/model/User"; import { castDemandeStatutWithoutSupprimee } from "@/modules/utils/castDemandeStatut"; import { countDifferenceCapaciteApprentissage, countDifferenceCapaciteScolaire } from "@/modules/utils/countCapacite"; +import { formatFormationSpecifique } from "@/modules/utils/formatFormationSpecifique"; import { isDemandeNotDeleted, isDemandeSelectable } from "@/modules/utils/isDemandeSelectable"; -import { isFormationActionPrioritaireDemande } from "@/modules/utils/isFormationActionPrioritaire"; +import { isFormationActionPrioritaire } from "@/modules/utils/isFormationActionPrioritaire"; import { cleanNull } from "@/utils/noNull"; export interface Filters extends z.infer { @@ -138,7 +139,11 @@ export const getDemandeQuery = async ({ numero, user }: Filters) => { ).as("updatedBy"), countDifferenceCapaciteScolaire(eb).as("differenceCapaciteScolaire"), countDifferenceCapaciteApprentissage(eb).as("differenceCapaciteApprentissage"), - isFormationActionPrioritaireDemande(eb).as(TypeFormationSpecifiqueEnum["Action prioritaire"]), + isFormationActionPrioritaire({ + cfdRef: "demande.cfd", + codeDispositifRef: "demande.codeDispositif", + codeRegionRef: "demande.codeRegion", + }).as(TypeFormationSpecifiqueEnum["Action prioritaire"]), eb.ref("formationView.isTransitionDemographique").as(TypeFormationSpecifiqueEnum["Transition démographique"]), eb.ref("formationView.isTransitionEcologique").as(TypeFormationSpecifiqueEnum["Transition écologique"]), eb.ref("formationView.isTransitionNumerique").as(TypeFormationSpecifiqueEnum["Transition numérique"]), @@ -149,6 +154,7 @@ export const getDemandeQuery = async ({ numero, user }: Filters) => { .orderBy("createdAt", "asc") .limit(1) .executeTakeFirstOrThrow() + .then(cleanNull) .catch(() => { throw Boom.notFound(`Aucune demande trouvée pour le numéro ${numero}`, { errors: { @@ -162,34 +168,22 @@ export const getDemandeQuery = async ({ numero, user }: Filters) => { demande.metadata.formation?.dispositifs.find((item) => item.codeDispositif === demande?.codeDispositif) ?.codeDispositif; - return ( - demande && - cleanNull({ - ...demande, - metadata: cleanNull({ - ...demande.metadata, - formation: cleanNull(demande.metadata.formation), - etablissement: cleanNull(demande.metadata.etablissement), - formationCompensation: cleanNull(demande.metadata.formationCompensation), - etablissementCompensation: cleanNull(demande.metadata.etablissementCompensation), - }), - statut: castDemandeStatutWithoutSupprimee(demande.statut), - createdAt: demande.createdAt?.toISOString(), - updatedAt: demande.updatedAt?.toISOString(), - campagne: cleanNull({ - ...demande.campagne, - }), - codeDispositif, - formationSpecifique: { - [TypeFormationSpecifiqueEnum["Action prioritaire"]]: - !!demande[TypeFormationSpecifiqueEnum["Action prioritaire"]], - [TypeFormationSpecifiqueEnum["Transition démographique"]]: - !!demande[TypeFormationSpecifiqueEnum["Transition démographique"]], - [TypeFormationSpecifiqueEnum["Transition écologique"]]: - !!demande[TypeFormationSpecifiqueEnum["Transition écologique"]], - [TypeFormationSpecifiqueEnum["Transition numérique"]]: - !!demande[TypeFormationSpecifiqueEnum["Transition numérique"]], - }, - }) - ); + return { + ...demande, + metadata: { + ...demande.metadata, + formation: demande.metadata.formation, + etablissement: demande.metadata.etablissement, + formationCompensation: demande.metadata.formationCompensation, + etablissementCompensation: demande.metadata.etablissementCompensation, + }, + statut: castDemandeStatutWithoutSupprimee(demande.statut), + createdAt: demande.createdAt?.toISOString(), + updatedAt: demande.updatedAt?.toISOString(), + campagne: { + ...demande.campagne, + }, + codeDispositif, + formationSpecifique: formatFormationSpecifique(demande), + }; }; diff --git a/server/src/modules/import/usecases/importActionPrioritaire/importActionPrioritaire.deps.ts b/server/src/modules/import/usecases/importActionPrioritaire/importActionPrioritaire.deps.ts index 26879d3b0..4a51020c8 100644 --- a/server/src/modules/import/usecases/importActionPrioritaire/importActionPrioritaire.deps.ts +++ b/server/src/modules/import/usecases/importActionPrioritaire/importActionPrioritaire.deps.ts @@ -3,17 +3,9 @@ import type { Insertable } from "kysely"; import type { DB } from "@/db/db"; import { getKbdClient } from "@/db/db"; -const findActionPrioritaire = async ({ offset = 0, limit }: { offset?: number; limit?: number }) => - getKbdClient() - .selectFrom("actionPrioritaire") - .select(["cfd", "codeRegion", "codeDispositif"]) - .distinct() - .offset(offset) - .$call((q) => { - if (!limit) return q; - return q.limit(limit); - }) - .execute(); +export const deleteActionPrioritaire = async () => { + return getKbdClient().deleteFrom("actionPrioritaire").execute(); +}; const createActionsPrioritaires = async (actionsPrioritaires: Insertable) => getKbdClient() @@ -24,5 +16,5 @@ const createActionsPrioritaires = async (actionsPrioritaires: Insertable async () => { - console.log(`Import des actions prioritaires`); + console.log(`Suppression des actions prioritaires...`); + await deleteActionPrioritaire(); + console.log(`Import des actions prioritaires\n`); let countActionsPrioritaires = 0; await streamIt( async (countActionsPrioritaires) => diff --git a/server/src/modules/intentions/usecases/getIntention/getIntention.query.ts b/server/src/modules/intentions/usecases/getIntention/getIntention.query.ts index 7c89b3efc..1faba9eb9 100644 --- a/server/src/modules/intentions/usecases/getIntention/getIntention.query.ts +++ b/server/src/modules/intentions/usecases/getIntention/getIntention.query.ts @@ -15,9 +15,10 @@ import { countDifferenceCapaciteApprentissageIntention, countDifferenceCapaciteScolaireIntention, } from "@/modules/utils/countCapacite"; +import { formatFormationSpecifique } from "@/modules/utils/formatFormationSpecifique"; import { isAvisVisible } from "@/modules/utils/isAvisVisible"; import { isIntentionNotDeleted, isIntentionSelectable } from "@/modules/utils/isDemandeSelectable"; -import { isFormationActionPrioritaireIntention } from "@/modules/utils/isFormationActionPrioritaire"; +import { isFormationActionPrioritaire } from "@/modules/utils/isFormationActionPrioritaire"; import { cleanNull } from "@/utils/noNull"; export interface Filters extends z.infer { @@ -113,7 +114,11 @@ export const getIntentionQuery = async ({ numero, user }: Filters) => { "dataEtablissement.libelleEtablissement", "departement.libelleDepartement", "departement.codeDepartement", - isFormationActionPrioritaireIntention(eb).as(TypeFormationSpecifiqueEnum["Action prioritaire"]), + isFormationActionPrioritaire({ + cfdRef: "intention.cfd", + codeDispositifRef: "intention.codeDispositif", + codeRegionRef: "intention.codeRegion", + }).as(TypeFormationSpecifiqueEnum["Action prioritaire"]), eb.ref("formationView.isTransitionDemographique").as(TypeFormationSpecifiqueEnum["Transition démographique"]), eb.ref("formationView.isTransitionEcologique").as(TypeFormationSpecifiqueEnum["Transition écologique"]), eb.ref("formationView.isTransitionNumerique").as(TypeFormationSpecifiqueEnum["Transition numérique"]), @@ -124,6 +129,7 @@ export const getIntentionQuery = async ({ numero, user }: Filters) => { .where("intention.numero", "=", numero) .limit(1) .executeTakeFirstOrThrow() + .then(cleanNull) .catch(() => { throw Boom.notFound(`Aucune intention trouvée pour le numéro ${numero}`, { errors: { @@ -150,7 +156,8 @@ export const getIntentionQuery = async ({ numero, user }: Filters) => { "user.role as userRole", sql`CONCAT(${eb.ref("user.firstname")},' ',${eb.ref("user.lastname")})`.as("userFullName"), ]) - .execute(); + .execute() + .then(cleanNull); const avis = await getKbdClient() .selectFrom("avis") @@ -169,47 +176,36 @@ export const getIntentionQuery = async ({ numero, user }: Filters) => { ), ]) .where(isAvisVisible({ user })) - .execute(); + .execute() + .then(cleanNull); - return ( - intention && - cleanNull({ - ...intention, - metadata: cleanNull({ - ...intention.metadata, - formation: cleanNull(intention.metadata.formation), - etablissement: cleanNull(intention.metadata.etablissement), - }), - createdAt: intention.createdAt?.toISOString(), - updatedAt: intention.updatedAt?.toISOString(), - campagne: cleanNull({ - ...intention.campagne, - }), - statut: castDemandeStatutWithoutSupprimee(intention.statut), - changementsStatut: changementsStatut.map((changementStatut) => ({ - ...changementStatut, - statut: castDemandeStatutWithoutSupprimee(changementStatut.statut), - statutPrecedent: castDemandeStatutWithoutSupprimee(changementStatut.statutPrecedent), - updatedAt: changementStatut.updatedAt?.toISOString(), - })), - avis: avis.map((avis) => ({ - ...avis, - createdAt: avis.createdAt?.toISOString(), - updatedAt: avis.updatedAt?.toISOString(), - updatedByFullName: avis.updatedByFullName.trim() ?? null, - statutAvis: castAvisStatut(avis.statutAvis), - typeAvis: castAvisType(avis.typeAvis), - })), - formationSpecifique: { - [TypeFormationSpecifiqueEnum["Action prioritaire"]]: - !!intention[TypeFormationSpecifiqueEnum["Action prioritaire"]], - [TypeFormationSpecifiqueEnum["Transition démographique"]]: - !!intention[TypeFormationSpecifiqueEnum["Transition démographique"]], - [TypeFormationSpecifiqueEnum["Transition écologique"]]: - !!intention[TypeFormationSpecifiqueEnum["Transition écologique"]], - [TypeFormationSpecifiqueEnum["Transition numérique"]]: - !!intention[TypeFormationSpecifiqueEnum["Transition numérique"]], - }, - }) - ); + return { + ...intention, + metadata: { + ...intention.metadata, + formation: intention.metadata.formation, + etablissement: intention.metadata.etablissement, + }, + createdAt: intention.createdAt?.toISOString(), + updatedAt: intention.updatedAt?.toISOString(), + campagne: { + ...intention.campagne, + }, + statut: castDemandeStatutWithoutSupprimee(intention.statut), + changementsStatut: changementsStatut.map((changementStatut) => ({ + ...changementStatut, + statut: castDemandeStatutWithoutSupprimee(changementStatut.statut), + statutPrecedent: castDemandeStatutWithoutSupprimee(changementStatut.statutPrecedent), + updatedAt: changementStatut.updatedAt?.toISOString(), + })), + avis: avis.map((avis) => ({ + ...avis, + createdAt: avis.createdAt?.toISOString(), + updatedAt: avis.updatedAt?.toISOString(), + updatedByFullName: avis.updatedByFullName.trim() ?? null, + statutAvis: castAvisStatut(avis.statutAvis), + typeAvis: castAvisType(avis.typeAvis), + })), + formationSpecifique: formatFormationSpecifique(intention), + }; }; diff --git a/server/src/modules/utils/formatFormationSpecifique.ts b/server/src/modules/utils/formatFormationSpecifique.ts new file mode 100644 index 000000000..d8959de9f --- /dev/null +++ b/server/src/modules/utils/formatFormationSpecifique.ts @@ -0,0 +1,23 @@ +import type { TypeFormationSpecifiqueType } from "shared/enum/formationSpecifiqueEnum"; +import { TypeFormationSpecifiqueEnum } from "shared/enum/formationSpecifiqueEnum"; + +export const formatFormationSpecifique = ( + formation: Record +) => ({ + [TypeFormationSpecifiqueEnum["Action prioritaire"]]: + TypeFormationSpecifiqueEnum["Action prioritaire"] in formation + ? !!formation[TypeFormationSpecifiqueEnum["Action prioritaire"]] + : false, + [TypeFormationSpecifiqueEnum["Transition démographique"]]: + TypeFormationSpecifiqueEnum["Transition démographique"] in formation + ? !!formation[TypeFormationSpecifiqueEnum["Transition démographique"]] + : false, + [TypeFormationSpecifiqueEnum["Transition écologique"]]: + TypeFormationSpecifiqueEnum["Transition écologique"] in formation + ? !!formation[TypeFormationSpecifiqueEnum["Transition écologique"]] + : false, + [TypeFormationSpecifiqueEnum["Transition numérique"]]: + TypeFormationSpecifiqueEnum["Transition numérique"] in formation + ? !!formation[TypeFormationSpecifiqueEnum["Transition numérique"]] + : false, +}); diff --git a/server/src/modules/utils/isFormationActionPrioritaire.ts b/server/src/modules/utils/isFormationActionPrioritaire.ts index b40f25e96..6a0c7dd22 100644 --- a/server/src/modules/utils/isFormationActionPrioritaire.ts +++ b/server/src/modules/utils/isFormationActionPrioritaire.ts @@ -1,43 +1,23 @@ import type { ExpressionBuilder } from "kysely"; +import { expressionBuilder } from "kysely"; import type { DB } from "@/db/schema"; -export const isFormationActionPrioritaireDemande = (eb: ExpressionBuilder) => - eb +export function isFormationActionPrioritaire>({ + cfdRef, + codeDispositifRef, + codeRegionRef, +}: { + cfdRef: Parameters[0]; + codeDispositifRef: Parameters[0]; + codeRegionRef: Parameters[0]; +}) { + const eb = expressionBuilder(); + return eb .selectFrom("actionPrioritaire") .select("actionPrioritaire.cfd") - .whereRef("actionPrioritaire.cfd", "=", "demande.cfd") - .whereRef("actionPrioritaire.codeDispositif", "=", "demande.codeDispositif") - .whereRef("actionPrioritaire.codeRegion", "=", "demande.codeRegion") - .limit(1); - -export const isFormationActionPrioritaireIntention = (eb: ExpressionBuilder) => - eb - .selectFrom("actionPrioritaire") - .select("actionPrioritaire.cfd") - .whereRef("actionPrioritaire.cfd", "=", "intention.cfd") - .whereRef("actionPrioritaire.codeDispositif", "=", "intention.codeDispositif") - .whereRef("actionPrioritaire.codeRegion", "=", "intention.codeRegion") - .limit(1); - -export const isFormationActionPrioritaireEtablissement = ( - eb: ExpressionBuilder -) => - eb - .selectFrom("actionPrioritaire") - .select("actionPrioritaire.cfd") - .whereRef("actionPrioritaire.cfd", "=", "formationEtablissement.cfd") - .whereRef("actionPrioritaire.codeDispositif", "=", "formationEtablissement.codeDispositif") - .whereRef("actionPrioritaire.codeRegion", "=", "etablissement.codeRegion") - .limit(1); - -export const isFormationActionPrioritaireDataEtablissement = ( - eb: ExpressionBuilder -) => - eb - .selectFrom("actionPrioritaire") - .select("actionPrioritaire.cfd") - .whereRef("actionPrioritaire.cfd", "=", "formationEtablissement.cfd") - .whereRef("actionPrioritaire.codeDispositif", "=", "formationEtablissement.codeDispositif") - .whereRef("actionPrioritaire.codeRegion", "=", "dataEtablissement.codeRegion") + .whereRef("actionPrioritaire.cfd", "=", cfdRef) + .whereRef("actionPrioritaire.codeDispositif", "=", codeDispositifRef) + .whereRef("actionPrioritaire.codeRegion", "=", codeRegionRef) .limit(1); +} diff --git a/ui/app/(wrapped)/console/etablissements/HeaderSection/FiltersSection.tsx b/ui/app/(wrapped)/console/etablissements/HeaderSection/FiltersSection.tsx index b8abe4297..a1ce1bc9d 100644 --- a/ui/app/(wrapped)/console/etablissements/HeaderSection/FiltersSection.tsx +++ b/ui/app/(wrapped)/console/etablissements/HeaderSection/FiltersSection.tsx @@ -38,7 +38,7 @@ const REQUETES_SUGGEREES: RequetesSuggerees = [ }, nom: TypeFormationSpecifiqueEnum["Transition écologique"], couleur: "success.950", - active: true, + active: feature.formationsSpecifiqueConsole, conditions: [], }, { @@ -47,7 +47,7 @@ const REQUETES_SUGGEREES: RequetesSuggerees = [ }, nom: TypeFormationSpecifiqueEnum["Transition démographique"], couleur: "grey.1000_active", - active: true, + active: feature.formationsSpecifiqueConsole, conditions: [], }, { @@ -56,7 +56,7 @@ const REQUETES_SUGGEREES: RequetesSuggerees = [ }, nom: TypeFormationSpecifiqueEnum["Transition numérique"], couleur: "bluefrance.925", - active: true, + active: feature.formationsSpecifiqueConsole, conditions: [], }, { diff --git a/ui/app/(wrapped)/panorama/components/FormationTooltipContent.tsx b/ui/app/(wrapped)/panorama/components/FormationTooltipContent.tsx index 80c7264ab..aa51480f1 100644 --- a/ui/app/(wrapped)/panorama/components/FormationTooltipContent.tsx +++ b/ui/app/(wrapped)/panorama/components/FormationTooltipContent.tsx @@ -17,6 +17,13 @@ type Formation = PanoramaFormation | PanoramaTopFlop; export const FormationTooltipContent = ({ formation }: { formation: Formation }) => { const { openGlossaire } = useGlossaireContext(); + // Si la feature formationsSpecifiqueConsole est activée et que cette formation est concernée, on affiche les tags + // Sinon si la feature n'est pas activée, on affiche les tags si la formation est une action prioritaire + const shouldDisplayFormationSpecifique = + (feature.formationsSpecifiqueConsole && Object.values(formation.formationSpecifique).some((v) => v)) || + (!feature.formationsSpecifiqueConsole && + formation.formationSpecifique[TypeFormationSpecifiqueEnum["Action prioritaire"]]); + return ( @@ -66,16 +73,14 @@ export const FormationTooltipContent = ({ formation }: { formation: Formation }) Taux de devenir favorable régional - {(feature.formationsSpecifiqueConsole && Object.values(formation.formationSpecifique).some((v) => v)) || - (!feature.formationsSpecifiqueConsole && - formation.formationSpecifique[TypeFormationSpecifiqueEnum["Action prioritaire"]] && ( - <> - - Formation spécifique - - - - ))} + {shouldDisplayFormationSpecifique && ( + <> + + Formation spécifique + + + + )} ); }; diff --git a/ui/components/BadgesFormationSpecifique.tsx b/ui/components/BadgesFormationSpecifique.tsx index a47e3119a..f1317ea3c 100644 --- a/ui/components/BadgesFormationSpecifique.tsx +++ b/ui/components/BadgesFormationSpecifique.tsx @@ -10,7 +10,6 @@ import { BadgeActionPrioritaire } from "./BadgeActionPrioritaire"; import { BadgeTransitionDemographique } from "./BadgeTransitionDemographique"; import { BadgeTransitionEcologique } from "./BadgeTransitionEcologique"; import { BadgeTransitionNumerique } from "./BadgeTransitionNumerique"; -import { TooltipIcon } from "./TooltipIcon"; const BadgeFormationSpecifique = chakra( ({ @@ -29,7 +28,6 @@ const BadgeFormationSpecifique = chakra( textTransform?: "uppercase" | "capitalize" | "lowercase"; openGlossaire: (key: GlossaireEntryKey) => void; }) => { - console.log(openGlossaire); switch (typeFormationSpecifique) { case TypeFormationSpecifiqueEnum["Action prioritaire"]: return (