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.
- En rouge : Jamais accessible à ce classement
- En jaune : Accessible sur au moins un an (mais pas toutes les années)
- En vert : Accessible toutes les années jusqu'aux derniers ECNi
⚠ 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"]." : Non poourvu
";
}
} else { // Cas où le choix était impossible cette année
$tooltipContent .= $rangLimite["annee"]." : Impossible.
";
}
}
}
// 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.