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.
- En rouge, les postes n'ayant jamais été accessible.
- En jaune, les postes ayant été accessible sur au moins une fois, mais pas tous les ans.
- En vert, les postes ayant été accessible tous les ans.
- En remplissage bleu marine, les postes n'ayant jamais été proposés.
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.
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 .= "".$specialityName." | ";
$html .= "".$specialityName." | ";
}
$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 .= "".$specialityName." | ";
}
$html .= "";
continue;
}
$html .= "
|---|
| ".$cityName." | ";
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 .= " $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 .= " | ";
}
$html .= "
";
}
$html .= "
Copyright © 2021 MH2V SAS. Tous droits réservés.