PageRenderTime 55ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/Application/routes/import.php

https://gitlab.com/Erdrix/overviewCompanies
PHP | 233 lines | 145 code | 41 blank | 47 comment | 21 complexity | f853178594f2283f76a8b520e70d0566 MD5 | raw file
  1. <?php
  2. /**
  3. * Configuration du router
  4. * @template : Template à utiliser lors des rendus
  5. */
  6. Router::config([
  7. 'template' => 'global',
  8. 'middleware' => ['authorization'],
  9. ]);
  10. /**
  11. * Interface d'upload de csv Polypro
  12. * @route : get:import/polypro
  13. */
  14. Router::respond('GET', '/polypro', function () {
  15. return View::make('import.polypro');
  16. });
  17. /**
  18. * Interface de choix de fichier CSV
  19. * @route : get:import/csv
  20. */
  21. Router::respond('GET', '/csv', function () {
  22. $params = [
  23. 'title' => 'Importation de CSV',
  24. 'tables' => ['companies', 'students', 'internships', 'taxes'],
  25. ];
  26. return View::make('import.csv', $params);
  27. });
  28. /**
  29. * Lecture du fichier polypro
  30. * @route : post:import/polypro/read
  31. */
  32. Router::respond('POST', '/polypro/read', function () {
  33. if (empty($_FILES['file'])) {
  34. Flash::set('polypro', 'Veuillez envoyer un fichier...', 'danger');
  35. return Redirect::make('import/polypro');
  36. }
  37. // Verification de l'extension
  38. $extension = strrchr($_FILES['file']['name'], '.');
  39. if ('.csv' != $extension) {
  40. Flash::set('polypro', 'Veuillez envoyer un fichier de type CSV', 'danger');
  41. return Redirect::make('import/polypro');
  42. }
  43. // Ouverture du fichier temporaire
  44. if (!($handle = fopen($_FILES['file']['tmp_name'], 'r'))) {
  45. Flash::set('polypro', 'Erreur : Impossible d\'ouvrir le fichier...', 'danger');
  46. return Redirect::make('import/polypro');
  47. }
  48. $students = Personne::names();
  49. $stages = Stage::convention();
  50. $entreprise = Entreprise::names();
  51. // Enleve les en-tête
  52. fgetcsv($handle, 1024, ',');
  53. // Lecture du fichier csv
  54. $total = 0;
  55. $nb_per = 0;
  56. $nb_ent = 0;
  57. while ($data = array_map('utf8_encode', fgetcsv($handle, 1024, ','))) {
  58. // Si le stage existe déja
  59. if (isset($stages[$data[0]])) {
  60. continue;
  61. }
  62. // Si la personne n'existe pas encore
  63. if (!isset($students[$data[1]])) {
  64. $name = explode(' ', $data[1]);
  65. $students[$data[1]] = Personne::create([
  66. 'name' => strtoupper($name[0]),
  67. 'firstName' => ucwords($name[1]),
  68. 'idCity' => 1
  69. ]);
  70. $nb_per++;
  71. }
  72. $ent = trim(ucwords(strtolower(explode('-', $data[5])[0])));
  73. if (!isset($entreprise[$ent])) {
  74. $entreprise[$ent] = Entreprise::create([
  75. 'name' => $ent,
  76. 'idCity' => 1,
  77. 'idSector' => 1
  78. ]);
  79. $nb_ent++;
  80. }
  81. $year = explode('année ', $data[2]);
  82. $year = isset($year[1]) ? $year[1] : false;
  83. // Création du stage
  84. Stage::create([
  85. 'idCompany' => $entreprise[$ent],
  86. 'idStudent' => $students[$data[1]],
  87. 'study' => $year !== false ? ($year . 'A') : '?',
  88. 'convention' => $data[0],
  89. 'english' => $data[3] === 'NON' ? 0 : 1,
  90. 'startAt' => strftime("%Y-%m-%d", strtotime(str_replace('/', '-', $data[21]))),
  91. 'endAt' => strftime("%Y-%m-%d", strtotime(str_replace('/', '-', $data[22])))
  92. ]);
  93. $total++;
  94. }
  95. // Fermeture du fichier
  96. fclose($handle);
  97. Flash::set('polypro',
  98. 'Importation de ' . $total . ' stage(s), ' . $nb_per . ' personne(s) et ' . $nb_ent . ' entreprise(s)',
  99. 'success');
  100. return Redirect::make('import/polypro');
  101. });
  102. /**
  103. * Interface de lecture du fichier CSV
  104. * @route : post:import/csv/read
  105. */
  106. Router::respond('POST', '/csv/read', function () {
  107. if (empty($_FILES['file'])) {
  108. return Redirect::make();
  109. }
  110. // Verification de l'extension
  111. $extension = strrchr($_FILES['file']['name'], '.');
  112. if ('.csv' != $extension) {
  113. return Redirect::make();
  114. }
  115. // Extraction du nom des tables
  116. if ($handle = fopen($_FILES['file']['tmp_name'], 'r')) {
  117. $data = array_map('utf8_encode', fgetcsv($handle, 1024, ','));
  118. fclose($handle);
  119. } else {
  120. return Redirect::make();
  121. }
  122. // Mise en session du nom de la table à utiliser
  123. $_SESSION['import_table'] = $_POST['table'];
  124. $_SESSION['import_file'] = getTemporary('files') . hash('md2', $_SERVER['REMOTE_ADDR']);
  125. // Sauvegarde du fichier
  126. move_uploaded_file($_FILES['file']['tmp_name'], $_SESSION['import_file']);
  127. // Récupération du nom des champs dans la base de donnée
  128. $query = Container::get('Database')->describ($_POST['table']);
  129. $tables = [];
  130. foreach ($query as $key => $value) {
  131. $tables[] = $value['Field'];
  132. }
  133. unset($query);
  134. // Envois des parametres
  135. $params = [
  136. 'title' => 'Importation de CSV',
  137. 'data' => $data,
  138. 'tables' => $tables,
  139. ];
  140. return View::make('import.csv', $params);
  141. });
  142. /**
  143. * Ajouts des elements dans la base de donnée CSV
  144. * @route : post:import/csv/post
  145. */
  146. Router::respond('POST', '/csv/post', function () {
  147. if (empty($_POST['primary']) || !isset($_SESSION['import_table'])) {
  148. return Redirect::make();
  149. }
  150. // Récupération du champs de redondance
  151. $primary = empty($_POST['primary']) ? false : $_POST['primary'];
  152. unset($_POST['primary']);
  153. // Création de l'instance
  154. $database = Container::get('Database');
  155. // Récupération de la liste des doublons
  156. $doublon = $database->search($_SESSION['import_table'], [], $primary);
  157. // Ouverture du fichier temporaire
  158. if (!($handle = fopen($_SESSION['import_file'], 'r'))) {
  159. return Redirect::make();
  160. }
  161. // Création du tableau d'association
  162. $data = array_map('utf8_encode', fgetcsv($handle, 1024, ','));
  163. $link = [];
  164. foreach ($data as $data_key => $data_value) {
  165. foreach ($_POST as $post_key => $post_value) {
  166. if ($post_value == $data_value) {
  167. $link[$post_key] = $data_key;
  168. }
  169. }
  170. }
  171. // Si le champs d'identification des doublons n'est pas valide
  172. if (!isset($link[$primary])) {
  173. return Redirect::make();
  174. }
  175. // Lecture du fichier csv
  176. $temp = [];
  177. while ($data = fgetcsv($handle, 1024, ',')) {
  178. foreach ($link as $key => $value) {
  179. $temp[$key] = $data[$value];
  180. }
  181. if (!in_array($link[$primary], $doublon)) {
  182. $database->insert($_SESSION['import_table'], $temp);
  183. }
  184. }
  185. // Fermeture et suppression du fichier
  186. fclose($handle);
  187. unlink($_SESSION['import_file']);
  188. // Suppresion des données en session
  189. unset($_SESSION['import_table']);
  190. unset($_SESSION['import_file']);
  191. return Redirect::make('import/csv');
  192. });