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 jusqu'aux derniers ECNi). Il ne réalise pas d'ajustements pour le nombre total d'étudiants au niveau national, qui augmente légèrement chaque année.
Sur un seul tableau, qu'il est possible de restreindre à certains DES et/ou certaines villes, est affiché, dans chaque case, le nombre d'années où le poste aurait été accessible.

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"]." : Non poourvu
"; } } else { // Cas où le choix était impossible cette année $tooltipContent .= $rangLimite["annee"]." : Impossible.
"; } } } // 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.