apiTableauFromNote.php 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. <?php
  2. require_once "libs/fnMain.php";
  3. /**************************
  4. * Contrôle du token JWT
  5. **************************/
  6. if (!isset($_GET["jwt"], $_SETTINGS["jwt_secret"])) {
  7. echo "Manque d'arguments";
  8. die();
  9. }
  10. verifyJWTtoken($_GET["jwt"], $_SETTINGS["jwt_secret"]);
  11. /**************************
  12. * Contrôle du statut premium de l'utilisateur
  13. **************************/
  14. verifyUserPremium($_GET["jwt"]);
  15. /**************************
  16. * Calcul des notes
  17. **************************/
  18. $isNoteValid = isset($_GET["note"]) && (float) $_GET["note"] !== 0;
  19. $isAnneeValid = isset($_GET["annee"]) && (int) $_GET["annee"] !== 0;
  20. if ($isNoteValid && $isAnneeValid) {
  21. // On exclut le cas où les années entrées ne sont pas les bonnes
  22. // TIPS : Modifier les années au besoin
  23. if ((int) $_GET["annee"] > 2020 || (int) $_GET["annee"] < 2016) {
  24. echo "L'année entrée n'est pas valide";
  25. die();
  26. }
  27. $rangMoyen = 0; // Variable donnant le rang utilisé pour calculer le tableau des choix, et servant aussi au classement affiché
  28. $sqlLimiteBasse = "SELECT * FROM notes_rang
  29. WHERE annee = :annee AND note >= :note
  30. ORDER BY classement DESC
  31. LIMIT 1";
  32. $sqlLimiteHaute = "SELECT * FROM notes_rang
  33. WHERE annee = :annee AND note <= :note
  34. ORDER BY classement
  35. LIMIT 1";
  36. $reqLimBasse = $db->prepare($sqlLimiteBasse);
  37. $reqLimBasse->execute([
  38. "annee" => $_GET["annee"],
  39. "note" => $_GET["note"]
  40. ]);
  41. if ($reqLimBasse->rowCount() === 0) {
  42. // Pas de note au dessus de la note entrée => Forcément 1er
  43. $rangMoyen = 1;
  44. } else {
  45. $reqLimiteHaute = $db->prepare($sqlLimiteHaute);
  46. $reqLimiteHaute->execute([
  47. "annee" => $_GET["annee"],
  48. "note" => $_GET["note"]
  49. ]);
  50. $rangBasArray = $reqLimBasse->fetch(PDO::FETCH_ASSOC);
  51. if ($reqLimiteHaute->rowCount() === 0) {
  52. // Pas de note en dessous => Forcément dernier
  53. $rangMoyen = $rangBasArray["classement"] + 10;
  54. } else {
  55. // Note entre 2 classements connus de la DB
  56. $rangHautArray = $reqLimiteHaute->fetch(PDO::FETCH_ASSOC);
  57. // Ligne non utilisée car révèle les points utilisés (entre xxx et yyy) sont connus
  58. // $rangText = "Entre ".$rangBasArray["classement"]." et ".$rangHautArray["classement"];
  59. $rangMoyen = ((int) $rangBasArray["classement"] + (int) $rangHautArray["classement"]) / 2;
  60. $rangMoyen = (int) $rangMoyen;
  61. }
  62. }
  63. /********************************
  64. * CALCUL DU TABLEAU DES CHOIX
  65. ********************************/
  66. // HTML renvoyé au site
  67. $html = <<<EOF
  68. <!doctype html>
  69. <html lang="fr">
  70. <head>
  71. <meta charset="UTF-8">
  72. <meta name="viewport"
  73. content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  74. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  75. <title>RangLimier</title>
  76. <link rel="stylesheet" href="assets/bootstrap.min.css">
  77. <link rel="stylesheet" href="assets/divers.css">
  78. </head>
  79. <body>
  80. <h1>RangLimier</h1>
  81. <p>Cet outil permet, en entrant une note et une année d'ECN, de voir le rang le plus proche associé.<br>
  82. <i>Attention : Cet outil est à but purement indicatif !</i>
  83. </p>
  84. <style>
  85. /* Tableau */
  86. table {
  87. font-size: 13px;
  88. text-align: center;
  89. border-collapse: collapse;
  90. white-space: nowrap;
  91. overflow: auto;
  92. }
  93. th, td {
  94. padding: 2px;
  95. border: 1px solid black;
  96. --text-color: lightgrey;
  97. }
  98. .all-choices {
  99. background-color: #28a745;
  100. /* color: #8fd19e; */
  101. color: white;
  102. }
  103. .half-choices {
  104. background-color: #8fd19e;
  105. color: black;
  106. }
  107. .last-choice {
  108. background-color: #ffdf7e;
  109. color: grey;
  110. }
  111. .no-choice {
  112. background-color: #ed969e;
  113. }
  114. .never-available {
  115. background-color: lightgrey;
  116. }
  117. </style>
  118. <h2>Tableau de classement pour le rang {$rangMoyen}</h2>
  119. <p>Rang estimé pour la note {$_GET["note"]}/10800 : {$rangMoyen}</p>
  120. <!-- <h3>Légende</h3>
  121. <table>
  122. <thead>
  123. <th colspan="5">Légende (sur toutes les années)</th>
  124. </thead>
  125. <tbody>
  126. <tr>
  127. <td>Jamais proposé</td>
  128. <td class="no-choice">Aucun choix</td>
  129. <td class="last-choice">Une seule année</td>
  130. <td class="half-choices">Plusieurs choix</td>
  131. <td class="all-choices">Tous les choix</td>
  132. </tr>
  133. </tbody>
  134. </table> -->
  135. <p>
  136. Chaque nombre dans chaque case correspond au nombre d'années où ce choix était dispo au classement rentré <br>
  137. </p>
  138. EOF;
  139. $html .= "<h3>Résultats</h3>";
  140. // On va récupérer tous les rangs limited dispo triés par idChoix
  141. $reqRL = $db->query('SELECT dataset."idChoix", dataset.annee, dataset."rangLimite" FROM dataset;');
  142. $rangLimites = $reqRL->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC);
  143. // Récupération des datasets
  144. $specialityDatasetAbrev = getCsvToArrayKeyValue($_SETTINGS["datasetFolder"]."/liste_specialites_abrev.csv");
  145. $specialityDataset = getCsvToArrayKeyValue($_SETTINGS["datasetFolder"]."/liste_specialites.csv");
  146. $cityDataset = getCsvToArrayKeyValue($_SETTINGS["datasetFolder"]."/liste_villes.csv");
  147. $inputClassement = $rangMoyen;
  148. // Calcul et affichage des données
  149. // Affichage de la 1ère ligne = Titre des colonnes
  150. $html .= "<table><thead><tr><th></th>";
  151. foreach ($specialityDatasetAbrev as $specialityName) {
  152. $html .= "<th scope='col'>".$specialityName."</th>";
  153. }
  154. $html .= "</tr></thead><tbody>";
  155. // Affichage de la suite du tableau avec le calcul
  156. foreach ($cityDataset as $cityId => $cityName) {
  157. // 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)
  158. // La notation des lignes de séparation est sous forme XX_x car si on laissait XX, la fonction getCsvToArrayKeyValue
  159. // ne retourne la position que pour la 1ère occurence de XX;XX
  160. // 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
  161. // si ils sont égaux à XX, on fait une séparation
  162. // TODO : Faire un parseur csv qui prend en compte chaque ligne du csv dans l'ordre du fichier
  163. if (strpos($cityId, "XX") !== FALSE) {
  164. $html .= "<tr><th></th>";
  165. foreach ($specialityDatasetAbrev as $specialityName) {
  166. $html .= "<th scope='col'>".$specialityName."</th>";
  167. }
  168. $html .= "</th>";
  169. continue;
  170. }
  171. $html .= "<tr><th scope='row'>".$cityName."</th>";
  172. foreach ($specialityDatasetAbrev AS $specialityId => $specialityName) {
  173. $idChoice = "0".$cityId.$specialityId;
  174. if (!isset($rangLimites[$idChoice])) {
  175. $nbAnneePropose = 0;
  176. $nbPossibleAnneePropose = 0;
  177. } else {
  178. $nbAnneePropose = count($rangLimites[$idChoice]);
  179. $nbPossibleAnneePropose = 0;
  180. foreach ($rangLimites[$idChoice] as $rangLimite) {
  181. if ((int) $rangLimite["rangLimite"] >= $inputClassement) {$nbPossibleAnneePropose++;}
  182. }
  183. }
  184. // Affichage de la cellule
  185. $html .= "<td class=\"";
  186. switch (TRUE) {
  187. case ($nbPossibleAnneePropose === 0 && $nbAnneePropose === 0):
  188. $html .= "never-available";
  189. break;
  190. case ($nbPossibleAnneePropose === 0):
  191. $html .= "no-choice";
  192. break;
  193. case ($nbAnneePropose > $nbPossibleAnneePropose && $nbPossibleAnneePropose === 1):
  194. $html .= "last-choice";
  195. break;
  196. case ($nbAnneePropose > $nbPossibleAnneePropose && $nbPossibleAnneePropose !== 1):
  197. $html .= "half-choices";
  198. break;
  199. case ($nbAnneePropose === $nbPossibleAnneePropose):
  200. $html .= "all-choices";
  201. break;
  202. }
  203. $html .= "\">";
  204. if ($nbPossibleAnneePropose > 0) {
  205. $html .= $nbPossibleAnneePropose;
  206. } else if ($nbPossibleAnneePropose === 0 && $nbAnneePropose !== 0) {
  207. $html .= "0";
  208. }
  209. $html .= "</td>";
  210. }
  211. $html .= "</tr>";
  212. }
  213. $html .= "</tbody></table><br>";
  214. // Affichage du tableau des légendes
  215. $html .= "<table><thead><th scope='col'>Abréviation</th><th scope='col'>Nom de spécialité</th></thead>";
  216. foreach ($specialityDatasetAbrev as $speId => $speAbrev) {
  217. $html .= "<tr><td>".$speAbrev."</td><td>".$specialityDataset[$speId]."</td></tr>";
  218. }
  219. $html .= "</table></body>";
  220. // Affichage du HTML demandé
  221. echo $html;
  222. } else {
  223. echo "Valeurs d'année et/ou note incorrecte.";
  224. }