apiTableauFromClassement.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  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. * GENERATION DES CLASSEMENTS
  17. **************************/
  18. $isClassementValid = isset($_GET["classement"]) && (int) $_GET["classement"] !== 0;
  19. if ($isClassementValid) {
  20. $rangMoyen = (int) $_GET["classement"];
  21. // HTML renvoyé au site
  22. $html = <<<EOF
  23. <!doctype html>
  24. <html lang="fr">
  25. <head>
  26. <meta charset="UTF-8">
  27. <meta name="viewport"
  28. content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  29. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  30. <title>RangLimier</title>
  31. <link rel="stylesheet" href="assets/bootstrap.min.css">
  32. <link rel="stylesheet" href="assets/divers.css">
  33. </head>
  34. <body>
  35. <h1>RangLimier</h1>
  36. <p>Cet outil permet, en entrant un classement (réel ou supposé), de voir les choix disponibles à ce classement. <br>
  37. <i>Attention : Cet outil est à but purement indicatif, les variations entre chaque année sont imprévisibles. Cela vous sert à avoir une vision globale des choix possible</i>
  38. </p>
  39. <style>
  40. /* Tableau */
  41. table {
  42. font-size: 13px;
  43. text-align: center;
  44. border-collapse: collapse;
  45. white-space: nowrap;
  46. overflow: auto;
  47. }
  48. th, td {
  49. padding: 2px;
  50. border: 1px solid black;
  51. --text-color: lightgrey;
  52. }
  53. .all-choices {
  54. background-color: #28a745;
  55. /* color: #8fd19e; */
  56. color: white;
  57. }
  58. .half-choices {
  59. background-color: #8fd19e;
  60. color: black;
  61. }
  62. .last-choice {
  63. background-color: #ffdf7e;
  64. color: grey;
  65. }
  66. .no-choice {
  67. background-color: #ed969e;
  68. }
  69. .never-available {
  70. background-color: lightgrey;
  71. }
  72. </style>
  73. <h2>Tableau de classement pour le rang {$rangMoyen}</h2>
  74. <!--
  75. <h3>Légende</h3>
  76. <table>
  77. <thead>
  78. <th colspan="5">Légende (sur toutes les années)</th>
  79. </thead>
  80. <tbody>
  81. <tr>
  82. <td>Jamais proposé</td>
  83. <td class="no-choice">Aucun choix</td>
  84. <td class="last-choice">Une seule année</td>
  85. <td class="half-choices">Plusieurs choix</td>
  86. <td class="all-choices">Tous les choix</td>
  87. </tr>
  88. </tbody>
  89. </table> -->
  90. <p>
  91. Chaque nombre dans chaque case correspond au nombre d'années où ce choix était dispo au classement rentré <br>
  92. </p>
  93. EOF;
  94. $html .= "<h3>Résultats</h3>";
  95. // On va récupérer tous les rangs limited dispo triés par idChoix
  96. $reqRL = $db->query('SELECT dataset."idChoix", dataset.annee, dataset."rangLimite" FROM dataset;');
  97. $rangLimites = $reqRL->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC);
  98. // Récupération des datasets
  99. $specialityDatasetAbrev = getCsvToArrayKeyValue($_SETTINGS["datasetFolder"]."/liste_specialites_abrev.csv");
  100. $specialityDataset = getCsvToArrayKeyValue($_SETTINGS["datasetFolder"]."/liste_specialites.csv");
  101. $cityDataset = getCsvToArrayKeyValue($_SETTINGS["datasetFolder"]."/liste_villes.csv");
  102. $inputClassement = $rangMoyen;
  103. // Calcul et affichage des données
  104. // Affichage de la 1ère ligne = Titre des colonnes
  105. $html .= "<table><thead><tr><th></th>";
  106. foreach ($specialityDatasetAbrev as $specialityName) {
  107. $html .= "<th scope='col'>".$specialityName."</th>";
  108. }
  109. $html .= "</tr></thead><tbody>";
  110. // Affichage de la suite du tableau avec le calcul
  111. foreach ($cityDataset as $cityId => $cityName) {
  112. // 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)
  113. // La notation des lignes de séparation est sous forme XX_x car si on laissait XX, la fonction getCsvToArrayKeyValue
  114. // ne retourne la position que pour la 1ère occurence de XX;XX
  115. // 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
  116. // si ils sont égaux à XX, on fait une séparation
  117. // TODO : Faire un parseur csv qui prend en compte chaque ligne du csv dans l'ordre du fichier
  118. if (strpos($cityId, "XX") !== FALSE) {
  119. $html .= "<tr><th></th>";
  120. foreach ($specialityDatasetAbrev as $specialityName) {
  121. $html .= "<th scope='col'>".$specialityName."</th>";
  122. }
  123. $html .= "</th>";
  124. continue;
  125. }
  126. $html .= "<tr><th scope='row'>".$cityName."</th>";
  127. foreach ($specialityDatasetAbrev AS $specialityId => $specialityName) {
  128. $idChoice = "0".$cityId.$specialityId;
  129. if (!isset($rangLimites[$idChoice])) {
  130. $nbAnneePropose = 0;
  131. $nbPossibleAnneePropose = 0;
  132. } else {
  133. $nbAnneePropose = count($rangLimites[$idChoice]);
  134. $nbPossibleAnneePropose = 0;
  135. foreach ($rangLimites[$idChoice] as $rangLimite) {
  136. if ((int) $rangLimite["rangLimite"] >= $inputClassement) {$nbPossibleAnneePropose++;}
  137. }
  138. }
  139. // Affichage de la cellule
  140. $html .= "<td class=\"";
  141. switch (TRUE) {
  142. case ($nbPossibleAnneePropose === 0 && $nbAnneePropose === 0):
  143. $html .= "never-available";
  144. break;
  145. case ($nbPossibleAnneePropose === 0):
  146. $html .= "no-choice";
  147. break;
  148. case ($nbAnneePropose > $nbPossibleAnneePropose && $nbPossibleAnneePropose === 1):
  149. $html .= "last-choice";
  150. break;
  151. case ($nbAnneePropose > $nbPossibleAnneePropose && $nbPossibleAnneePropose !== 1):
  152. $html .= "half-choices";
  153. break;
  154. case ($nbAnneePropose === $nbPossibleAnneePropose):
  155. $html .= "all-choices";
  156. break;
  157. }
  158. $html .= "\">";
  159. if ($nbPossibleAnneePropose > 0) {
  160. $html .= $nbPossibleAnneePropose;
  161. } else if ($nbPossibleAnneePropose === 0 && $nbAnneePropose !== 0) {
  162. $html .= "0";
  163. }
  164. $html .= "</td>";
  165. }
  166. $html .= "</tr>";
  167. }
  168. $html .= "</tbody></table><br></body>";
  169. // Affichage du HTML demandé
  170. echo $html;
  171. } else {
  172. echo "Classement entré incorrect.";
  173. }