// Échapper les apostrophes dans les valeurs injectées dans la clause where function echapperValeur(valeur) { return String(valeur).replace(/'/g, "\\'"); } // Construire l'URL de requête vers l'API Parcoursup export function construireURL(requete, limite = 20, decalage = 0, filtres = {}) { var url = "https://data.enseignementsup-recherche.gouv.fr/api/explore/v2.1/catalog/datasets/fr-esr-parcoursup/records?"; url += "limit=" + limite; url += "&offset=" + decalage; var conditions = []; if (requete && requete.trim() !== "") { conditions.push("search(lib_for_voe_ins, '" + echapperValeur(requete.trim()) + "')"); } if (filtres.filiere && filtres.filiere !== "") { conditions.push("fili='" + echapperValeur(filtres.filiere) + "'"); } if (filtres.selectivite && filtres.selectivite !== "") { conditions.push("select_form='" + echapperValeur(filtres.selectivite) + "'"); } if (filtres.region && filtres.region !== "") { conditions.push("region_etab_aff='" + echapperValeur(filtres.region) + "'"); } if (filtres.tauxMin && filtres.tauxMin > 0) { conditions.push("taux_acces_ens>=" + filtres.tauxMin); } if (filtres.tauxMax && filtres.tauxMax < 100) { conditions.push("taux_acces_ens<=" + filtres.tauxMax); } if (conditions.length > 0) { url += "&where=" + encodeURIComponent(conditions.join(" AND ")); } return url; } // Charger les formations depuis l'API Parcoursup export async function chargerFormations(requete, limite = 20, decalage = 0, filtres = {}) { var url = construireURL(requete, limite, decalage, filtres); var reponse = await fetch(url); if (!reponse.ok) { throw new Error("Erreur HTTP " + reponse.status); } return await reponse.json(); } // Charger l'historique d'une formation sur plusieurs années export async function chargerHistoriqueFormation(codUai, nomFormation) { var jeuDeDonnees = { 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" }; var historique = []; var nomCourt = echapperValeur((nomFormation || "").substring(0, 40)); var codeUai = echapperValeur(codUai); var annees = [2020, 2021, 2022, 2023, 2024, 2025]; for (var i = 0; i < annees.length; i++) { var annee = annees[i]; var dataset = jeuDeDonnees[annee]; try { var where = "cod_uai='" + codeUai + "' AND search(lib_for_voe_ins, '" + nomCourt + "')"; var url = "https://data.enseignementsup-recherche.gouv.fr/api/explore/v2.1/catalog/datasets/" + dataset + "/records?" + "limit=5" + "&where=" + encodeURIComponent(where) + "&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"); var reponse = await fetch(url); if (reponse.ok) { var donnees = await reponse.json(); if (donnees.results && donnees.results.length > 0) { var ligne = donnees.results[0]; var taux = 0; if (ligne.voe_tot && ligne.voe_tot > 0) { taux = Math.round((ligne.acc_tot / ligne.voe_tot) * 100); } 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 }); } } } catch (e) { console.warn("Erreur pour l'année " + annee + " :", e); } } return historique; }