tableauFromNote.php 6.8 KB

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