RangLimier

Cet outil permet d'apprécier les choix de postes accessibles pour un rang de classement donné sur les années post-R3C (à partir des ECNi 2017). Il ne réalise pas d'ajustements pour le nombre total d'étudiants au niveau national, dont les tendances sont à l'augmentation.
Sur un seul tableau, qu'il est possible de restreindre à certains DES et/ou certaines subdivisions, est affiché, dans chaque case, le nombre d'années où le poste aurait été accessible.

Un survol d’une cellule fait apparaître une info-bulle avec le classement auquel l’étudiant aurait pu prétendre pour chaque année. Lorsqu’il n’y a pas d’information dans l’info-bulle pour une année, c’est qu’il n’y avait aucun poste proposé la même année.

Ces informations sont données à titre indicatif et ne peuvent constituer une quelconque garantie pour les procédures de choix à venir.
Toutes les données utilisées par cet outil proviennent du site cng.sante.fr et de son application CELINE. Pour toute information officielle, veuillez vous référer à ces derniers.

$speName) : ?>

Utiliser Ctrl/Command + Clic pour (dé)sélectionner plusieurs options sur PC/Mac
Glissez ce lien dans vos favoris pour retrouver cette recherche rapidement : Recherche RangLimier
'; $html .= "
"; // On va récupérer tous les rangs limited dispo triés par idChoix //Mysql $reqRL = $db->query('SELECT idChoix, annee, rangLimite FROM dataset'); //pgsql // $reqRL = $db->query('SELECT dataset."idChoix", annee, dataset."rangLimite" FROM dataset'); $rangLimites = $reqRL->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC); $inputClassement = (int) $_GET["classement"]; ////////////////////////////////// // Calcul et affichage des données ////////////////////////////////// // v2.A Conversion du filtre spé/ville de l'utilisateur // On croise l'array source de données avec les id sélectionnés via le GET (ce qui sécurise les données en plus) // array_intersect_key(array_source, clés_à_garder) // Si pas de filtre sélectionné, bah on prend toutes les spé/villes disponibles $cityDataset = ($isTriVilleValid === TRUE) ? array_intersect_key($citySourceDataset, array_flip($_GET["v"])) : $citySourceDataset; $specialityDatasetAbrev = ($isTriSpeValid === TRUE) ? array_intersect_key($specialitySourceDatasetAbrev, array_flip($_GET["s"])) : $specialitySourceDatasetAbrev; $specialityDataset = ($isTriSpeValid === TRUE) ? array_intersect_key($specialitySourceDataset, array_flip($_GET['s'])) : $specialitySourceDataset; // v2. Calcul des rangs potentiels pour chaque année simulée // Requete sélectionnant le nombre de personnes ayant choisi avant le classement X $sql = "SELECT idChoix, COUNT(*) as nb_perso_avant FROM anciens_choix WHERE classement < :classement AND annee = :annee GROUP BY idChoix"; // pgSQL /* $sql = 'SELECT anciens_choix."idChoix", COUNT(*) as nb_perso_avant FROM anciens_choix WHERE classement < :classement AND annee = :annee GROUP BY anciens_choix."idChoix"'; */ $reqAnciensChoixPourClassementX = $db->prepare($sql); // Requete sélectionnant le nombre total de personnes à chaque choix $sql = "SELECT idChoix, COUNT(*) as nb_perso_total FROM anciens_choix WHERE annee = :annee GROUP BY idChoix"; // pgSQL /* $sql = 'SELECT anciens_choix."idChoix", COUNT(*) as nb_perso_total FROM anciens_choix WHERE annee = :annee GROUP BY anciens_choix."idChoix"'; */ $reqAnciensChoixNbPostes = $db->prepare($sql); $nbAncienChoixParAn = []; $nbPersChoixAvant = []; // On détermine les années simulées : 2017 à année actuelle - 1, et on récupère les données pour les gens avant ce classement for ($annee = 2017; $annee <= (int) date("Y") - 1 ; $annee++) { // On formate les données pour le nombre de postes avant le classement (pour l'intégrer à tous les postes après) $reqAnciensChoixPourClassementX->execute([ "annee" => $annee, "classement" => $inputClassement ]); $nbChoixAnneeI = $reqAnciensChoixPourClassementX->fetchAll(); foreach ($nbChoixAnneeI as $nbPostesItem) { $nbPersChoixAvant[$annee][$nbPostesItem['idChoix']] = $nbPostesItem['nb_perso_avant']; } // On formate les données pour position dans promo et nombres de postes $reqAnciensChoixNbPostes->execute(["annee" => $annee]); $nbPostesRaw = $reqAnciensChoixNbPostes->fetchAll(); foreach ($nbPostesRaw as $choix) { $nbAncienChoixParAn[$choix["idChoix"]][$annee] = [ "position" => (isset ($nbPersChoixAvant[$annee][$choix['idChoix']])) ? $nbPersChoixAvant[$annee][$choix['idChoix']] + 1 : 1, "nbPostesTotal" => $choix["nb_perso_total"] ]; } } unset($reqAnciensChoixNbPostes, $reqAnciensChoixPourClassementX, $nbPersChoixAvant); // Affichage de la 1ère ligne = Titre des colonnes + infobulles (via BootstrapJS) $html .= ""; foreach ($specialityDatasetAbrev as $speId => $specialityName) { // $html .= ""; $html .= ""; } $html .= ""; // Affichage de la suite du tableau avec le calcul foreach ($cityDataset as $cityId => $cityName) { // On gère la séparation des différentes régions entre elles (représentées dans le csv villes par les lignes XX_:XX) // La notation des lignes de séparation est sous forme XX_x car si on laissait XX, la fonction getCsvToArrayKeyValue // ne retourne la position que pour la 1ère occurence de XX;XX // La manière de fix ça de manière la plus opti et sale, c'est de faire un substr et de tester les 2 premiers charactères // si ils sont égaux à XX, on fait une séparation if (strpos($cityId, "XX") !== FALSE) { $html .= ""; foreach ($specialityDatasetAbrev as $speId => $specialityName) { $html .= ""; } $html .= ""; continue; } $html .= ""; foreach ($specialityDatasetAbrev AS $specialityId => $specialityName) { $idChoice = "0".$cityId.$specialityId; $tooltip = FALSE; $tooltipContent = ""; if (!isset($rangLimites[$idChoice])) { $nbAnneePropose = 0; $nbPossibleAnneePropose = 0; } else { $nbAnneePropose = count($rangLimites[$idChoice]); $nbPossibleAnneePropose = 0; $tooltip = TRUE; // Autorise l'insertion des données de la tooltip foreach ($rangLimites[$idChoice] as $rangLimite) { if ((int) $rangLimite["rangLimite"] >= $inputClassement) { $nbPossibleAnneePropose++; // Gestion du contenu de la tooltip if(isset($nbAncienChoixParAn[$idChoice][$rangLimite["annee"]])) { // Cas où il reste de la place $temp = $nbAncienChoixParAn[$idChoice][$rangLimite["annee"]]; $tooltipContent .= $rangLimite["annee"]." : ".$temp["position"]."/".$temp["nbPostesTotal"] ."
"; } else { // Cas où le choix n'a pas été pourvu (donc y'a personne dans les anciens choix) $tooltipContent .= $rangLimite["annee"]." : Disponible
"; } } else { // Cas où le choix était impossible cette année $tooltipContent .= $rangLimite["annee"]." : Non disponible
"; } } } // Affichage de la cellule $html .= ""; } $html .= ""; } $html .= "
".$specialityName."".$specialityName."
".$specialityName."
".$cityName." $nbPossibleAnneePropose && $nbPossibleAnneePropose === 1): $html .= "last-choice"; break; case ($nbAnneePropose > $nbPossibleAnneePropose && $nbPossibleAnneePropose !== 1): $html .= "half-choices"; break; case ($nbAnneePropose === $nbPossibleAnneePropose): $html .= "all-choices"; break; } $html .= "\" "; $html .= ($tooltip === TRUE) ? "title='".$tooltipContent."'" : ""; $html .= ">"; if ($nbPossibleAnneePropose > 0) { $html .= $nbPossibleAnneePropose; } else if ($nbPossibleAnneePropose === 0 && $nbAnneePropose !== 0) { $html .= "0"; } $html .= "

"; echo $html; ?>
Copyright © 2021 MH2V SAS. Tous droits réservés.