2026-03-30 15:05:11 +02:00
|
|
|
// Échapper les apostrophes dans les valeurs injectées dans la clause where
|
|
|
|
|
function echapperValeur(valeur) {
|
2026-03-30 16:33:11 +02:00
|
|
|
return String(valeur).replace(/'/g, "\\'");
|
2026-03-30 15:05:11 +02:00
|
|
|
}
|
|
|
|
|
|
2026-03-21 13:47:09 +01:00
|
|
|
// Construire l'URL de requête vers l'API Parcoursup
|
|
|
|
|
export function construireURL(requete, limite = 20, decalage = 0, filtres = {}) {
|
2026-03-18 14:54:01 +01:00
|
|
|
|
2026-03-30 16:33:11 +02:00
|
|
|
var url = "https://data.enseignementsup-recherche.gouv.fr/api/explore/v2.1/catalog/datasets/fr-esr-parcoursup/records?";
|
2026-03-21 13:47:09 +01:00
|
|
|
|
2026-03-30 16:33:11 +02:00
|
|
|
url += "limit=" + limite;
|
|
|
|
|
url += "&offset=" + decalage;
|
2026-03-18 12:45:44 +01:00
|
|
|
|
2026-03-30 16:33:11 +02:00
|
|
|
var conditions = [];
|
2026-03-20 01:51:08 +01:00
|
|
|
|
2026-03-21 13:47:09 +01:00
|
|
|
if (requete && requete.trim() !== "") {
|
2026-03-30 16:33:11 +02:00
|
|
|
conditions.push("search(lib_for_voe_ins, '" + echapperValeur(requete.trim()) + "')");
|
2026-03-20 01:51:08 +01:00
|
|
|
}
|
|
|
|
|
|
2026-03-21 13:47:09 +01:00
|
|
|
if (filtres.filiere && filtres.filiere !== "") {
|
2026-03-30 16:33:11 +02:00
|
|
|
conditions.push("fili='" + echapperValeur(filtres.filiere) + "'");
|
2026-03-20 01:51:08 +01:00
|
|
|
}
|
|
|
|
|
|
2026-03-21 13:47:09 +01:00
|
|
|
if (filtres.selectivite && filtres.selectivite !== "") {
|
2026-03-30 16:33:11 +02:00
|
|
|
conditions.push("select_form='" + echapperValeur(filtres.selectivite) + "'");
|
2026-03-20 01:51:08 +01:00
|
|
|
}
|
|
|
|
|
|
2026-03-21 13:47:09 +01:00
|
|
|
if (filtres.region && filtres.region !== "") {
|
2026-03-30 16:33:11 +02:00
|
|
|
conditions.push("region_etab_aff='" + echapperValeur(filtres.region) + "'");
|
2026-03-20 01:51:08 +01:00
|
|
|
}
|
|
|
|
|
|
2026-03-21 13:47:09 +01:00
|
|
|
if (filtres.tauxMin && filtres.tauxMin > 0) {
|
2026-03-30 16:33:11 +02:00
|
|
|
conditions.push("taux_acces_ens>=" + filtres.tauxMin);
|
2026-03-20 01:51:08 +01:00
|
|
|
}
|
|
|
|
|
|
2026-03-21 13:47:09 +01:00
|
|
|
if (filtres.tauxMax && filtres.tauxMax < 100) {
|
2026-03-30 16:33:11 +02:00
|
|
|
conditions.push("taux_acces_ens<=" + filtres.tauxMax);
|
2026-03-20 01:51:08 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (conditions.length > 0) {
|
2026-03-30 16:33:11 +02:00
|
|
|
url += "&where=" + encodeURIComponent(conditions.join(" AND "));
|
2026-03-17 17:34:34 +01:00
|
|
|
}
|
2026-03-18 12:45:44 +01:00
|
|
|
|
2026-03-30 16:33:11 +02:00
|
|
|
return url;
|
2026-03-18 12:45:44 +01:00
|
|
|
}
|
|
|
|
|
|
2026-03-21 13:47:09 +01:00
|
|
|
// Charger les formations depuis l'API Parcoursup
|
|
|
|
|
export async function chargerFormations(requete, limite = 20, decalage = 0, filtres = {}) {
|
2026-03-18 12:45:44 +01:00
|
|
|
|
2026-03-30 16:33:11 +02:00
|
|
|
var url = construireURL(requete, limite, decalage, filtres);
|
|
|
|
|
var reponse = await fetch(url);
|
2026-03-21 13:47:09 +01:00
|
|
|
|
|
|
|
|
if (!reponse.ok) {
|
2026-03-30 16:33:11 +02:00
|
|
|
throw new Error("Erreur HTTP " + reponse.status);
|
2026-03-18 12:45:44 +01:00
|
|
|
}
|
|
|
|
|
|
2026-03-30 16:33:11 +02:00
|
|
|
return await reponse.json();
|
2026-03-20 01:51:08 +01:00
|
|
|
}
|
|
|
|
|
|
2026-03-21 13:47:09 +01:00
|
|
|
// Charger l'historique d'une formation sur plusieurs années
|
|
|
|
|
export async function chargerHistoriqueFormation(codUai, nomFormation) {
|
|
|
|
|
|
|
|
|
|
var jeuDeDonnees = {
|
2026-03-20 01:51:08 +01:00
|
|
|
2020: "fr-esr-parcoursup_2020",
|
|
|
|
|
2021: "fr-esr-parcoursup_2021",
|
|
|
|
|
2022: "fr-esr-parcoursup_2022",
|
|
|
|
|
2023: "fr-esr-parcoursup_2023",
|
|
|
|
|
2024: "fr-esr-parcoursup_2024",
|
|
|
|
|
2025: "fr-esr-parcoursup"
|
2026-03-30 16:33:11 +02:00
|
|
|
};
|
2026-03-20 01:51:08 +01:00
|
|
|
|
2026-03-30 16:33:11 +02:00
|
|
|
var historique = [];
|
|
|
|
|
var nomCourt = echapperValeur((nomFormation || "").substring(0, 40));
|
|
|
|
|
var codeUai = echapperValeur(codUai);
|
|
|
|
|
var annees = [2020, 2021, 2022, 2023, 2024, 2025];
|
2026-03-20 01:51:08 +01:00
|
|
|
|
2026-03-21 13:47:09 +01:00
|
|
|
for (var i = 0; i < annees.length; i++) {
|
|
|
|
|
|
2026-03-30 16:33:11 +02:00
|
|
|
var annee = annees[i];
|
|
|
|
|
var dataset = jeuDeDonnees[annee];
|
2026-03-20 01:51:08 +01:00
|
|
|
|
|
|
|
|
try {
|
2026-03-21 13:47:09 +01:00
|
|
|
|
2026-03-30 15:05:11 +02:00
|
|
|
var where =
|
2026-03-30 16:33:11 +02:00
|
|
|
"cod_uai='" + codeUai + "' AND search(lib_for_voe_ins, '" + nomCourt + "')";
|
2026-03-30 15:05:11 +02:00
|
|
|
|
2026-03-20 01:51:08 +01:00
|
|
|
var url = "https://data.enseignementsup-recherche.gouv.fr/api/explore/v2.1/catalog/datasets/"
|
|
|
|
|
+ dataset + "/records?"
|
|
|
|
|
+ "limit=5"
|
2026-03-30 15:05:11 +02:00
|
|
|
+ "&where=" + encodeURIComponent(where)
|
2026-03-30 16:33:11 +02:00
|
|
|
+ "&select=" + encodeURIComponent("cod_uai,lib_for_voe_ins,voe_tot,acc_tot,pct_sansmention,pct_ab,pct_b,pct_tb,pct_tbf,pct_bg,pct_bt,pct_bp");
|
2026-03-20 01:51:08 +01:00
|
|
|
|
2026-03-30 16:33:11 +02:00
|
|
|
var reponse = await fetch(url);
|
2026-03-20 01:51:08 +01:00
|
|
|
|
2026-03-21 13:47:09 +01:00
|
|
|
if (reponse.ok) {
|
2026-03-20 01:51:08 +01:00
|
|
|
|
2026-03-30 16:33:11 +02:00
|
|
|
var donnees = await reponse.json();
|
2026-03-20 01:51:08 +01:00
|
|
|
|
2026-03-21 13:47:09 +01:00
|
|
|
if (donnees.results && donnees.results.length > 0) {
|
|
|
|
|
|
2026-03-30 16:33:11 +02:00
|
|
|
var ligne = donnees.results[0];
|
|
|
|
|
var taux = 0;
|
2026-03-21 13:47:09 +01:00
|
|
|
|
|
|
|
|
if (ligne.voe_tot && ligne.voe_tot > 0) {
|
2026-03-30 16:33:11 +02:00
|
|
|
taux = Math.round((ligne.acc_tot / ligne.voe_tot) * 100);
|
2026-03-20 01:51:08 +01:00
|
|
|
}
|
|
|
|
|
|
2026-03-21 13:47:09 +01:00
|
|
|
historique.push({
|
|
|
|
|
annee: annee,
|
|
|
|
|
tauxAcces: taux,
|
|
|
|
|
candidats: ligne.voe_tot || 0,
|
|
|
|
|
admis: ligne.acc_tot || 0,
|
|
|
|
|
pctSansMention: ligne.pct_sansmention || 0,
|
|
|
|
|
pctAB: ligne.pct_ab || 0,
|
|
|
|
|
pctB: ligne.pct_b || 0,
|
|
|
|
|
pctTB: ligne.pct_tb || 0,
|
|
|
|
|
pctTBF: ligne.pct_tbf || 0,
|
|
|
|
|
pctGeneral: ligne.pct_bg || 0,
|
|
|
|
|
pctTechno: ligne.pct_bt || 0,
|
|
|
|
|
pctPro: ligne.pct_bp || 0
|
2026-03-30 16:33:11 +02:00
|
|
|
});
|
2026-03-20 01:51:08 +01:00
|
|
|
}
|
|
|
|
|
}
|
2026-03-21 13:47:09 +01:00
|
|
|
|
2026-03-20 01:51:08 +01:00
|
|
|
} catch (e) {
|
2026-03-30 16:33:11 +02:00
|
|
|
console.warn("Erreur pour l'année " + annee + " :", e);
|
2026-03-20 01:51:08 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-30 16:33:11 +02:00
|
|
|
return historique;
|
2026-03-30 15:05:11 +02:00
|
|
|
}
|