salaries.class.php 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007
  1. <?php
  2. /**
  3. * Classe de gestion des salariés.
  4. *
  5. * Cette classe fournit des méthodes pour gérer les données des salariés,
  6. * y compris les opérations sur les fichiers Excel et les interactions avec la base de données.
  7. */
  8. class salaries
  9. {
  10. /**
  11. * Nettoie la table temporaire des salariés.
  12. */
  13. public static function cleanTmp()
  14. {
  15. // Nettoyage de la table temporaire des salairés
  16. db::query("TRUNCATE " . DB_T_TEMP_SALARIES);
  17. db::execute();
  18. }
  19. /**
  20. * Récupère un salarié par son identifiant local.
  21. *
  22. * @param int $_idLocal Identifiant local du salarié.
  23. * @return array|null Les données du salarié ou NULL si non trouvé.
  24. */
  25. public static function getSalarieByidLocal(int $_idLocal)
  26. {
  27. // Récupération des données de l'excel au format Json
  28. db::query("SELECT * FROM " . DB_T_SALARIES . " WHERE idLocal = :idLocal");
  29. db::bind(':idLocal', $_idLocal);
  30. return db::single();
  31. }
  32. /**
  33. * Récupère un salarié par son identifiant de connexion.
  34. *
  35. * @param string $_loginId Identifiant de connexion du salarié.
  36. * @return array|null Les données du salarié ou NULL si non trouvé.
  37. */
  38. public static function getSalarieByLoginId(string $_loginId)
  39. {
  40. // Récupération des données de l'excel au format Json
  41. db::query("SELECT * FROM " . DB_T_SALARIES . " WHERE loginId = :loginId");
  42. db::bind(':loginId', $_loginId);
  43. return db::single();
  44. }
  45. /**
  46. * Récupère un salarié par son identifiant unique.
  47. *
  48. * @param int $_id Identifiant unique du salarié.
  49. * @return array|null Les données du salarié ou NULL si non trouvé.
  50. */
  51. public static function getSalarieById(int $_id)
  52. {
  53. // Récupération des données de l'excel au format Json
  54. db::query("SELECT * FROM " . DB_T_SALARIES . " WHERE id = :id");
  55. db::bind(':id', $_id);
  56. return db::single();
  57. }
  58. /**
  59. * Récupère la liste de tous les salariés.
  60. *
  61. * @return array La liste des salariés.
  62. */
  63. public static function getSalaries()
  64. {
  65. db::query("SELECT "
  66. . "idLocal, "
  67. . "loginId, "
  68. . "nom, "
  69. . "prenom, "
  70. . "sexe, "
  71. . "contrat, "
  72. . "IF(contrat = 1, 'Actif', 'Désactivé') AS texteContrat, "
  73. . "DATE_FORMAT(jourEntree, '%Y-%m-%d') AS jourEntree, "
  74. . "DATE_FORMAT(repriseContrat, '%Y-%m-%d') AS repriseContrat, "
  75. . "DATE_FORMAT(jourSortie, '%Y-%m-%d') AS jourSortie, "
  76. . "sel, "
  77. . "lieu, "
  78. . "cree, "
  79. . "maj, "
  80. . "IF(actif = 1, 'Actif', 'Désactivé') AS texteActif, "
  81. . "actif "
  82. . "FROM " . DB_T_SALARIES);
  83. return db::resultset();
  84. }
  85. /**
  86. * Récupère l'identifiant du dernier fichier Excel.
  87. *
  88. * @return int Identifiant du dernier fichier Excel.
  89. */
  90. public static function lastExcel()
  91. {
  92. db::query("SELECT MAX(id) AS id FROM " . DB_T_EXCEL);
  93. return db::single()["id"];
  94. }
  95. /**
  96. * Récupère l'identifiant du dernier fichier Excel destiné au SFTP.
  97. *
  98. * @return int Identifiant du dernier fichier Excel pour le SFTP.
  99. */
  100. public static function lastExcelForSFTP()
  101. {
  102. db::query("SELECT MAX(id) AS id FROM " . DB_T_EXCEL . " WHERE forSFTP IS NOT NULL");
  103. return db::single()["id"];
  104. }
  105. /**
  106. * Récupère le hash MD5 d'un fichier Excel par son identifiant.
  107. *
  108. * @param int $_id Identifiant du fichier Excel.
  109. * @return string Le hash MD5 du fichier Excel.
  110. */
  111. public static function getExcelMd5(int $_id)
  112. {
  113. // Récupération des données de l'excel au format Json
  114. db::query("SELECT md5 FROM " . DB_T_EXCEL . " WHERE id = :id");
  115. db::bind(':id', $_id);
  116. return db::single()["md5"];
  117. }
  118. /**
  119. * Insère un fichier Excel dans la base de données.
  120. *
  121. * @param array $_data Données du fichier Excel à insérer.
  122. * @return bool TRUE si l'insertion a réussi, FALSE sinon.
  123. */
  124. public static function insertExcel(array $_data)
  125. {
  126. db::query("INSERT INTO " . DB_T_EXCEL . " (nbSalaries, md5, json, dateData, id_user) VALUES (:nbSalaries, :md5, :json, :dateData, :id_user)");
  127. db::bind(':nbSalaries', $_data["nbSalaries"]);
  128. db::bind(':dateData', $_data["date"]);
  129. db::bind(':md5', $_data["md5File"]);
  130. db::bind(':json', base64_encode($_data["json"]));
  131. db::bind(':id_user', session::getId());
  132. try {
  133. db::execute();
  134. return TRUE;
  135. } catch (Exception $ex) {
  136. return FALSE;
  137. }
  138. }
  139. /**
  140. * Récupère les données JSON d'un fichier Excel pour le SFTP.
  141. *
  142. * @param int $_id Identifiant du fichier Excel.
  143. * @return array Les données JSON du fichier Excel.
  144. */
  145. public static function getExcelJsonForSFTP(int $_id)
  146. {
  147. // Récupération des données de l'excel au format Json
  148. db::query("SELECT forSFTP, md5forSFTP, createForSFTP, contratForSFTP FROM " . DB_T_EXCEL . " WHERE id = :id");
  149. db::bind(':id', $_id);
  150. return db::single();
  151. }
  152. /**
  153. * Supprime les données JSON d'un fichier Excel pour le SFTP.
  154. *
  155. * @param int $_id Identifiant du fichier Excel.
  156. * @return bool TRUE si la suppression a réussi, FALSE sinon.
  157. */
  158. public static function deleteExcelJsonForSFTP(int $_id)
  159. {
  160. db::query("UPDATE " . DB_T_EXCEL . " SET "
  161. . "createForSFTP = NULL "
  162. . "WHERE id = :id");
  163. db::bind(':id', $_id);
  164. try {
  165. db::execute();
  166. return TRUE;
  167. } catch (Exception $e) {
  168. return FALSE;
  169. }
  170. }
  171. /**
  172. * Récupère les données de transfert JSON d'un fichier Excel pour le SFTP.
  173. *
  174. * @param string $_md5 Hash MD5 du fichier Excel.
  175. * @return string Les données de transfert JSON.
  176. */
  177. public static function getExcelJsonTransferForSFTP(string $_md5)
  178. {
  179. // Récupération des données de l'excel au format Json
  180. db::query("SELECT transfertForSFTP FROM " . DB_T_EXCEL . " WHERE md5forSFTP = :md5forSFTP");
  181. db::bind(':md5forSFTP', $_md5);
  182. return db::single()["transfertForSFTP"];
  183. }
  184. /**
  185. * Récupère les données JSON d'un fichier Excel par son identifiant.
  186. *
  187. * @param int $_id Identifiant du fichier Excel.
  188. * @return string Les données JSON décodées.
  189. */
  190. public static function getExcelJson(int $_id)
  191. {
  192. // Récupération des données de l'excel au format Json
  193. db::query("SELECT json FROM " . DB_T_EXCEL . " WHERE id = :id");
  194. db::bind(':id', $_id);
  195. return base64_decode(db::single()["json"]);
  196. }
  197. /**
  198. * Récupère le nom d'un fichier Excel par son identifiant.
  199. *
  200. * @param int $_id Identifiant du fichier Excel.
  201. * @return string Le nom du fichier Excel.
  202. */
  203. public static function getExcelName(int $_id)
  204. {
  205. // Récupération des données de l'excel au format Json
  206. db::query("SELECT
  207. " . DB_T_EXCEL . ".md5,
  208. " . DB_T_FILES . ".name
  209. FROM " . DB_T_EXCEL . "
  210. INNER JOIN " . DB_T_FILES . " ON " . DB_T_EXCEL . ".md5 = " . DB_T_FILES . ".id
  211. WHERE " . DB_T_EXCEL . ".id = :id");
  212. db::bind(':id', $_id);
  213. return db::single()["name"];
  214. }
  215. /**
  216. * Met à jour l'état "en cours" d'un fichier Excel.
  217. *
  218. * @param int $_id Identifiant du fichier Excel.
  219. * @param int $_action Action à effectuer (1 pour activer, 0 pour désactiver).
  220. * @return bool TRUE si la mise à jour a réussi, FALSE sinon.
  221. */
  222. public static function excelUpdateInProgress(int $_id, int $_action = 1)
  223. {
  224. db::query("UPDATE
  225. " . DB_T_EXCEL . "
  226. SET inProgress = :inProgress
  227. WHERE id = :id");
  228. db::bind(':inProgress', $_action);
  229. db::bind(':id', $_id);
  230. try {
  231. db::execute();
  232. return TRUE;
  233. } catch (Exception $e) {
  234. return FALSE;
  235. }
  236. }
  237. /**
  238. * Supprime un fichier Excel par son identifiant.
  239. *
  240. * @param int $_id Identifiant du fichier Excel.
  241. * @return bool TRUE si la suppression a réussi, FALSE sinon.
  242. */
  243. public static function delete_excel(int $_id)
  244. {
  245. db::query("DELETE FROM " . DB_T_EXCEL . " WHERE id = :id");
  246. db::bind(':id', $_id);
  247. try {
  248. db::execute();
  249. return TRUE;
  250. } catch (Exception $e) {
  251. return FALSE;
  252. }
  253. }
  254. /**
  255. * Récupère les informations du fichier Excel actuellement en cours de traitement.
  256. *
  257. * @return array|null Les informations du fichier Excel en cours ou NULL si aucun.
  258. */
  259. public static function excelGetInProgress()
  260. {
  261. db::query("SELECT
  262. " . DB_T_EXCEL . ".id,
  263. " . DB_T_EXCEL . ".md5,
  264. " . DB_T_FILES . ".name
  265. FROM " . DB_T_EXCEL . "
  266. INNER JOIN " . DB_T_FILES . " ON " . DB_T_EXCEL . ".md5 = " . DB_T_FILES . ".id
  267. WHERE " . DB_T_EXCEL . ".inProgress = 1");
  268. return db::single();
  269. }
  270. /**
  271. * Récupère les données JSON d'un fichier Excel par son identifiant sous forme de tableau.
  272. *
  273. * @param int $_id Identifiant du fichier Excel.
  274. * @return array Les données JSON décodées sous forme de tableau.
  275. */
  276. public static function getExcelArray(int $_id)
  277. {
  278. return json_decode(self::getExcelJson($_id));
  279. }
  280. /**
  281. * Convertit une ligne de données Excel en un format compatible avec la base de données MySQL.
  282. * @param array $_value Ligne de données Excel.
  283. * @return array Données formatées pour MySQL.
  284. */
  285. public static function excelToMysql(array $_value)
  286. {
  287. if ($_value[4] == "Actif") {
  288. $_value[4] = 1;
  289. } else {
  290. $_value[4] = 0;
  291. }
  292. return array(
  293. "idLocal" => $_value[0],
  294. "loginId" => $_value[7],
  295. "nom" => core::cleanAccent($_value[1]),
  296. "prenom" => core::cleanAccent($_value[2]),
  297. "sexe" => $_value[3],
  298. "contrat" => $_value[4],
  299. "jourEntree" => $_value[5],
  300. "lieu" => core::cleanAccent($_value[6]),
  301. "actif" => 1
  302. );
  303. }
  304. /**
  305. * Insère les données des salariés temporaires dans la table temporaire.
  306. *
  307. * @param string $_excel Identifiant du fichier Excel associé.
  308. */
  309. public static function createTmp(string $_excel)
  310. {
  311. db::query("SELECT idLocal, loginId, nom, prenom, sexe, contrat, jourEntree, lieu, actif FROM " . DB_T_SALARIES);
  312. $row = db::resultset();
  313. if (!empty($row)) {
  314. foreach ($row as $salaries) {
  315. db::query("INSERT INTO " . DB_T_TEMP_SALARIES . " (idLocal, loginId, nom, prenom, sexe, contrat, jourEntree, lieu, actif, new, excel) "
  316. . "VALUES (:idLocal, :loginId, :nom, :prenom, :sexe, :contrat, :jourEntree, :lieu, :actif, :new, :excel)");
  317. db::bind(':idLocal', $salaries["idLocal"]);
  318. db::bind(':loginId', $salaries["loginId"]);
  319. db::bind(':nom', $salaries["nom"]);
  320. db::bind(':prenom', $salaries["prenom"]);
  321. db::bind(':sexe', $salaries["sexe"]);
  322. db::bind(':contrat', $salaries["contrat"]);
  323. db::bind(':jourEntree', $salaries["jourEntree"]);
  324. db::bind(':lieu', $salaries["lieu"]);
  325. db::bind(':actif', 0);
  326. db::bind(':new', 0);
  327. db::bind(':excel', $_excel);
  328. db::execute();
  329. }
  330. }
  331. }
  332. /**
  333. * Met à jour les salariés inactifs dans la table temporaire.
  334. *
  335. * @return bool TRUE si la mise à jour a réussi, FALSE sinon.
  336. */
  337. public static function updateInactiveTempSalarie()
  338. {
  339. db::query("UPDATE " . DB_T_TEMP_SALARIES . " SET "
  340. . "log = :log "
  341. . "WHERE actif = :actif");
  342. db::bind(':log', "DISABLE");
  343. db::bind(':actif', 0);
  344. try {
  345. db::execute();
  346. return TRUE;
  347. } catch (Exception $e) {
  348. return FALSE;
  349. }
  350. }
  351. /**
  352. * Met à jour les données JSON d'un fichier Excel.
  353. *
  354. * @param array $_json Données JSON à mettre à jour.
  355. * @return bool TRUE si la mise à jour a réussi, FALSE sinon.
  356. */
  357. public static function updateJsonExcel(array $_json)
  358. {
  359. db::query("UPDATE " . DB_T_EXCEL . " SET "
  360. . "goMysql = current_timestamp(), "
  361. . "log = :log "
  362. . "WHERE id = :id");
  363. db::bind(':log', $_json["json"]);
  364. db::bind(':id', $_json["excel"]);
  365. try {
  366. db::execute();
  367. return TRUE;
  368. } catch (Exception $e) {
  369. return FALSE;
  370. }
  371. }
  372. /**
  373. * Met à jour les données temporaires des salariés.
  374. *
  375. * @param array $_new_salaries Les nouvelles données des salariés.
  376. * @param string $_excel Identifiant du fichier Excel associé.
  377. * @return bool TRUE si la mise à jour a réussi, FALSE sinon.
  378. */
  379. public static function update_temp_salaries(array $_new_salaries, string $_excel)
  380. {
  381. $cp["INSERT"]["SUCCESS"] = 0;
  382. $cp["INSERT"]["ERROR"] = 0;
  383. $cp["UPDATE"]["SUCCESS"] = 0;
  384. $cp["UPDATE"]["ERROR"] = 0;
  385. $changeStatutContrat = NULL;
  386. foreach ($_new_salaries as $key => $value) {
  387. $sql = $change = NULL;
  388. if ($key > 0) {
  389. $tmp = self::excelToMysql($value);
  390. if (!is_int($tmp["idLocal"])) {
  391. alert::recError("Une valeur dans le fichier n'est pas conforme à l'attendu (Ligne " . $key . ")");
  392. self::cleanTmp();
  393. self::excelUpdateInProgress(self::lastExcel(), 0);
  394. return FALSE;
  395. }
  396. $salarieByidLocal = self::getSalarieByidLocal($tmp["idLocal"]);
  397. if (isset($salarieByidLocal["idLocal"])) {
  398. $tmp_sql = "";
  399. if ($tmp["loginId"] != $salarieByidLocal["loginId"]) {
  400. $tmp_sql .= "loginId = :loginId, ";
  401. $change = 1;
  402. }
  403. if ($tmp["contrat"] != $salarieByidLocal["contrat"]) {
  404. $tmp_sql .= "contrat = :contrat, ";
  405. $change = 1;
  406. // Indentifier les cas d'arrêt ou de reprise de contrat
  407. if ($tmp["contrat"] == 0 and $salarieByidLocal["contrat"] == 1) {
  408. $changeStatutContrat[$salarieByidLocal["idLocal"]] = "end";
  409. } else {
  410. $changeStatutContrat[$salarieByidLocal["idLocal"]] = "start";
  411. }
  412. // Indentifier les cas d'arrêt ou de reprise de contrat
  413. }
  414. if ($tmp["lieu"] != $salarieByidLocal["lieu"]) {
  415. $tmp_sql .= "lieu = :lieu, ";
  416. $change = 1;
  417. }
  418. if ($tmp["actif"] != $salarieByidLocal["actif"]) {
  419. $change = 1;
  420. } else {
  421. $forSFTP["actif"] = NULL;
  422. }
  423. $tmp_sql .= "actif = :actif, ";
  424. if ($change == 1) {
  425. db::query($sql = "UPDATE " . DB_T_TEMP_SALARIES . " SET " . $tmp_sql . " log = :log WHERE idLocal = :idLocal");
  426. $log = NULL;
  427. if ($tmp["loginId"] != $salarieByidLocal["loginId"]) {
  428. db::bind(':loginId', $tmp["loginId"]);
  429. if ($log == "") {
  430. $log .= "UPDATE ";
  431. }
  432. $log .= "loginId ";
  433. }
  434. if ($tmp["contrat"] != $salarieByidLocal["contrat"]) {
  435. db::bind(':contrat', $tmp["contrat"]);
  436. if ($log == "") {
  437. $log .= "UPDATE ";
  438. }
  439. $log .= "contrat ";
  440. }
  441. if ($tmp["lieu"] != $salarieByidLocal["lieu"]) {
  442. db::bind(':lieu', $tmp["lieu"]);
  443. if ($log == "") {
  444. $log .= "UPDATE ";
  445. }
  446. $log .= "lieu ";
  447. }
  448. if ($tmp["actif"] != $salarieByidLocal["actif"]) {
  449. if ($log == "") {
  450. $log .= "UPDATE ";
  451. }
  452. $log .= "actif ";
  453. }
  454. db::bind(':actif', 1);
  455. if ($change == 1) {
  456. db::bind(':log', $log);
  457. } else {
  458. db::bind(':log', NULL);
  459. }
  460. db::bind(':idLocal', $tmp["idLocal"]);
  461. try {
  462. db::execute();
  463. $cp["UPDATE"]["SUCCESS"]++;
  464. } catch (Exception $ex) {
  465. $cp["UPDATE"]["ERROR"]++;
  466. }
  467. } else {
  468. db::query("UPDATE " . DB_T_TEMP_SALARIES . " SET actif = :actif WHERE idLocal = :idLocal");
  469. db::bind(':actif', 1);
  470. db::bind(':idLocal', $tmp["idLocal"]);
  471. db::execute();
  472. }
  473. } else {
  474. db::query("INSERT INTO " . DB_T_TEMP_SALARIES . " (idLocal, loginId, nom, prenom, sexe, contrat, jourEntree, lieu, actif, new, excel, log) "
  475. . "VALUES (:idLocal, :loginId, :nom, :prenom, :sexe, :contrat, :jourEntree, :lieu, :actif, :new, :excel, :log)");
  476. db::bind(':idLocal', $tmp["idLocal"]);
  477. db::bind(':loginId', $tmp["loginId"]);
  478. db::bind(':nom', $tmp["nom"]);
  479. db::bind(':prenom', $tmp["prenom"]);
  480. db::bind(':sexe', $tmp["sexe"]);
  481. db::bind(':contrat', $tmp["contrat"]);
  482. db::bind(':jourEntree', $tmp["jourEntree"]);
  483. db::bind(':lieu', $tmp["lieu"]);
  484. db::bind(':actif', 1);
  485. db::bind(':new', 1);
  486. db::bind(':excel', $_excel);
  487. db::bind(':log', "INSERT");
  488. try {
  489. db::execute();
  490. $cp["INSERT"]["SUCCESS"]++;
  491. } catch (Exception $ex) {
  492. $cp["INSERT"]["ERROR"]++;
  493. }
  494. }
  495. }
  496. }
  497. ($changeStatutContrat != NULL) ? self::recContratForSFTP($_excel, $changeStatutContrat) : "";
  498. if ($cp["INSERT"]["ERROR"] != 0 or $cp["INSERT"]["ERROR"] != 0) {
  499. alert::recError("Une erreur s'est produite lors de la mise en cache.");
  500. return TRUE;
  501. } else {
  502. alert::recSuccess("La mise en cache a été réalisée avec succès.");
  503. return TRUE;
  504. }
  505. }
  506. /**
  507. * Enregistre les changements de contrat pour le SFTP.
  508. *
  509. * @param int $_idExcel Identifiant du fichier Excel.
  510. * @param array|null $_data Données des changements de contrat.
  511. * @return bool TRUE si l'enregistrement a réussi, FALSE sinon.
  512. */
  513. private static function recContratForSFTP(int $_idExcel, ?array $_data)
  514. {
  515. db::query("UPDATE " . DB_T_EXCEL . " SET "
  516. . "contratForSFTP = :contratForSFTP "
  517. . "WHERE id = :id");
  518. db::bind(':contratForSFTP', json_encode($_data));
  519. db::bind(':id', $_idExcel);
  520. try {
  521. db::execute();
  522. return TRUE;
  523. } catch (Exception $e) {
  524. return FALSE;
  525. }
  526. }
  527. /**
  528. * Met à jour les données des salariés à partir d'un fichier Excel.
  529. *
  530. * @param int $_excel Identifiant du fichier Excel.
  531. */
  532. public static function updateSalaries(int $_excel)
  533. {
  534. $cp["INSERT"]["SUCCESS"] = 0;
  535. $cp["INSERT"]["ERROR"] = 0;
  536. $cp["DISABLE"]["SUCCESS"] = 0;
  537. $cp["DISABLE"]["ERROR"] = 0;
  538. $cp["UPDATE"]["SUCCESS"] = 0;
  539. $cp["UPDATE"]["ERROR"] = 0;
  540. $cp["forSFTP"] = 0;
  541. $updateContrat = json_decode(self::getExcelJsonForSFTP($_excel)["contratForSFTP"], TRUE);
  542. $jourSortie = date("Y-m-d 00:00:00");
  543. $dateReprise = date("Y-m-d 00:00:00");
  544. db::query("SELECT idLocal, loginId, nom, prenom, sexe, contrat, jourEntree, lieu, actif, new, log FROM " . DB_T_TEMP_SALARIES);
  545. $row = db::resultset();
  546. if (!empty($row)) {
  547. foreach ($row as $key => $salaries) {
  548. $forSFTP = $reprise = NULL;
  549. if ($salaries["log"] == NULL) {
  550. $forSFTP["action"] = "valide";
  551. $forSFTP["idLocal"] = $salaries["idLocal"];
  552. $forSFTP["loginId"] = $salaries["loginId"];
  553. $forSFTP["contrat"] = $salaries["contrat"];
  554. $forSFTP["jourEntree"] = $salaries["jourEntree"];
  555. $forSFTP["jourSortie"] = NULL;
  556. $forSFTP["repriseContrat"] = NULL;
  557. $forSFTP["actif"] = 1;
  558. $SFTP[$cp["forSFTP"]++] = $forSFTP;
  559. } elseif ($salaries["log"] == "INSERT") {
  560. db::query("INSERT INTO " . DB_T_SALARIES . " (idLocal, loginId, nom, prenom, sexe, contrat, jourEntree, jourSortie, sel, lieu, actif) "
  561. . "VALUES (:idLocal, :loginId, :nom, :prenom, :sexe, :contrat, :jourEntree, :jourSortie, :sel, :lieu, :actif)");
  562. db::bind(':idLocal', $salaries["idLocal"]);
  563. db::bind(':loginId', $salaries["loginId"]);
  564. db::bind(':nom', $salaries["nom"]);
  565. db::bind(':prenom', $salaries["prenom"]);
  566. db::bind(':sexe', $salaries["sexe"]);
  567. db::bind(':contrat', $salaries["contrat"]);
  568. db::bind(':jourEntree', $salaries["jourEntree"]);
  569. db::bind(':jourSortie', NULL);
  570. db::bind(':sel', md5($salaries["idLocal"] . time() . rand(100000000000, 999999999999)));
  571. db::bind(':lieu', $salaries["lieu"]);
  572. db::bind(':actif', $salaries["actif"]);
  573. try {
  574. db::execute();
  575. $cp["INSERT"]["SUCCESS"]++;
  576. } catch (Exception $ex) {
  577. $cp["INSERT"]["ERROR"]++;
  578. }
  579. $forSFTP["action"] = "insert";
  580. $forSFTP["idLocal"] = $salaries["idLocal"];
  581. $forSFTP["loginId"] = $salaries["loginId"];
  582. $forSFTP["contrat"] = $salaries["contrat"];
  583. $forSFTP["jourEntree"] = $salaries["jourEntree"];
  584. $forSFTP["jourSortie"] = NULL;
  585. $forSFTP["repriseContrat"] = NULL;
  586. $forSFTP["actif"] = 1;
  587. $SFTP[$cp["forSFTP"]++] = $forSFTP;
  588. } elseif ($salaries["log"] == "DISABLE") {
  589. db::query("UPDATE " . DB_T_SALARIES . " SET "
  590. . "jourSortie = :jourSortie, "
  591. . "maj = CURRENT_TIMESTAMP(), "
  592. . "actif = :actif "
  593. . "WHERE idLocal = :idLocal");
  594. db::bind(':jourSortie', $jourSortie);
  595. db::bind(':actif', 0);
  596. db::bind(':idLocal', $salaries["idLocal"]);
  597. try {
  598. db::execute();
  599. $cp["DISABLE"]["SUCCESS"]++;
  600. } catch (Exception $ex) {
  601. $cp["DISABLE"]["ERROR"]++;
  602. }
  603. $forSFTP["action"] = "disabled";
  604. $forSFTP["idLocal"] = $salaries["idLocal"];
  605. $forSFTP["loginId"] = $salaries["loginId"];
  606. $forSFTP["contrat"] = $salaries["contrat"];
  607. $forSFTP["jourEntree"] = $salaries["jourEntree"];
  608. $forSFTP["jourSortie"] = $jourSortie;
  609. $forSFTP["repriseContrat"] = NULL;
  610. $forSFTP["actif"] = 0;
  611. $SFTP[$cp["forSFTP"]++] = $forSFTP;
  612. } else {
  613. $forSFTP["action"] = "update";
  614. $forSFTP["idLocal"] = $salaries["idLocal"];
  615. $forSFTP["loginId"] = $salaries["loginId"];
  616. $forSFTP["contrat"] = $salaries["contrat"];
  617. if (is_array($updateContrat) and array_key_exists($salaries["idLocal"], $updateContrat)) {
  618. if ($updateContrat[$salaries["idLocal"]] == "start") {
  619. $forSFTP["jourEntree"] = $dateReprise;
  620. $forSFTP["jourSortie"] = NULL;
  621. $forSFTP["repriseContrat"] = $dateReprise;
  622. $forSFTP["actif"] = 1;
  623. $reprise = $dateReprise;
  624. } elseif ($updateContrat[$salaries["idLocal"]] == "end") {
  625. $forSFTP["jourEntree"] = $salaries["jourEntree"];
  626. $forSFTP["jourSortie"] = $jourSortie;
  627. $forSFTP["repriseContrat"] = NULL;
  628. $forSFTP["actif"] = 0;
  629. }
  630. } else {
  631. $forSFTP["jourEntree"] = $salaries["jourEntree"];
  632. $forSFTP["jourSortie"] = NULL;
  633. $forSFTP["repriseContrat"] = NULL;
  634. $forSFTP["actif"] = $salaries["actif"];
  635. }
  636. $SFTP[$cp["forSFTP"]++] = $forSFTP;
  637. db::query("UPDATE " . DB_T_SALARIES . " SET "
  638. . "loginId = :loginId, "
  639. . "contrat = :contrat, "
  640. . "lieu = :lieu, "
  641. . "repriseContrat = :repriseContrat, "
  642. . "jourSortie = :jourSortie, "
  643. . "maj = CURRENT_TIMESTAMP(), "
  644. . "actif = :actif "
  645. . "WHERE idLocal = :idLocal");
  646. db::bind(':loginId', $salaries["loginId"]);
  647. db::bind(':contrat', $salaries["contrat"]);
  648. db::bind(':lieu', $salaries["lieu"]);
  649. db::bind(':repriseContrat', $reprise);
  650. db::bind(':jourSortie', NULL);
  651. db::bind(':actif', $salaries["actif"]);
  652. db::bind(':idLocal', $salaries["idLocal"]);
  653. try {
  654. db::execute();
  655. $cp["UPDATE"]["SUCCESS"]++;
  656. } catch (Exception $ex) {
  657. $cp["UPDATE"]["ERROR"]++;
  658. }
  659. }
  660. }
  661. if ($cp["INSERT"]["SUCCESS"] == 1) {
  662. alert::recSuccess("SUCCESS : " . $cp["INSERT"]["SUCCESS"] . " salarié traité.");
  663. } elseif ($cp["INSERT"]["SUCCESS"] > 1) {
  664. alert::recSuccess("SUCCESS : " . $cp["INSERT"]["SUCCESS"] . " salariés traités.");
  665. }
  666. if ($cp["DISABLE"]["SUCCESS"] == 1) {
  667. alert::recSuccess("DISABLE : " . $cp["DISABLE"]["SUCCESS"] . " salarié traité.");
  668. } elseif ($cp["DISABLE"]["SUCCESS"] > 1) {
  669. alert::recSuccess("DISABLE : " . $cp["DISABLE"]["SUCCESS"] . " salariés traités.");
  670. }
  671. if ($cp["UPDATE"]["SUCCESS"] == 1) {
  672. alert::recSuccess("UPDATE : " . $cp["UPDATE"]["SUCCESS"] . " salarié traité.");
  673. } elseif ($cp["UPDATE"]["SUCCESS"] > 1) {
  674. alert::recSuccess("UPDATE : " . $cp["UPDATE"]["SUCCESS"] . " salariés traités.");
  675. }
  676. if ($cp["INSERT"]["ERROR"] == 1) {
  677. alert::recSuccess("SUCCESS : " . $cp["INSERT"]["SUCCESS"] . " salarié non traité.");
  678. } elseif ($cp["INSERT"]["ERROR"] > 1) {
  679. alert::recSuccess("SUCCESS : " . $cp["INSERT"]["SUCCESS"] . " salariés non traités.");
  680. }
  681. if ($cp["DISABLE"]["ERROR"] == 1) {
  682. alert::recSuccess("DISABLE : " . $cp["DISABLE"]["SUCCESS"] . " salarié non traité.");
  683. } elseif ($cp["DISABLE"]["ERROR"] > 1) {
  684. alert::recSuccess("DISABLE : " . $cp["DISABLE"]["SUCCESS"] . " salariés non traités.");
  685. }
  686. if ($cp["UPDATE"]["ERROR"] == 1) {
  687. alert::recSuccess("UPDATE : " . $cp["UPDATE"]["SUCCESS"] . " salarié non traité.");
  688. } elseif ($cp["UPDATE"]["ERROR"] > 1) {
  689. alert::recSuccess("UPDATE : " . $cp["UPDATE"]["SUCCESS"] . " salariés non traités.");
  690. }
  691. (self::recForSFTP($SFTP, $_excel)) ? alert::recSuccess("Les données d'exportation pour ProWeb ont été enregistrées") : alert::recError("Les données d'exportation pour ProWeb n'ont pas pu être enregistrées");
  692. }
  693. }
  694. /**
  695. * Enregistre les données pour le SFTP.
  696. *
  697. * @param array $_array Données à enregistrer.
  698. * @param int $_idExcel Identifiant du fichier Excel.
  699. * @return bool TRUE si l'enregistrement a réussi, FALSE sinon.
  700. */
  701. private static function recForSFTP(array $_array, int $_idExcel)
  702. {
  703. $json = json_encode($_array);
  704. db::query("UPDATE " . DB_T_EXCEL . " SET "
  705. . "forSFTP = :forSFTP ,"
  706. . "md5forSFTP = :md5forSFTP "
  707. . "WHERE id = :id");
  708. db::bind(':forSFTP', $json);
  709. db::bind(':md5forSFTP', md5($json));
  710. db::bind(':id', $_idExcel);
  711. try {
  712. db::execute();
  713. return TRUE;
  714. } catch (Exception $e) {
  715. return FALSE;
  716. }
  717. }
  718. /**
  719. * Crée un rapport des modifications des salariés à partir de la table temporaire.
  720. *
  721. * Cette méthode interroge la table temporaire des salariés pour récupérer les enregistrements
  722. * ayant un champ 'log' non nul, indiquant une modification (INSERT, DISABLE ou UPDATE).
  723. * Elle construit un tableau contenant les détails de chaque modification, puis encode ce tableau en JSON.
  724. *
  725. * - Pour une action "INSERT", toutes les informations du salarié sont ajoutées.
  726. * - Pour une action "DISABLE", toutes les informations du salarié sont ajoutées.
  727. * - Pour une action "UPDATE", seules les informations modifiées sont ajoutées selon le contenu du champ 'log'.
  728. *
  729. * @return array|null Un tableau associatif contenant :
  730. * - 'json' : la liste des modifications encodée en JSON ou NULL si aucune modification.
  731. * - 'excel' : le nom du fichier Excel associé ou NULL si aucune modification.
  732. */
  733. public static function createRapport()
  734. {
  735. $log = NULL;
  736. db::query("SELECT idLocal, loginId, nom, prenom, contrat, jourEntree, lieu, excel, log FROM " . DB_T_TEMP_SALARIES . " WHERE log IS NOT NULL");
  737. $row = db::resultset();
  738. if ($row != NULL) {
  739. foreach ($row as $key => $salaries) {
  740. if ($salaries["log"] == "INSERT") {
  741. $log["json"][] = array(
  742. "action" => "INSERT",
  743. "excel" => $salaries["excel"],
  744. "idLocal" => $salaries["idLocal"],
  745. "loginId" => $salaries["loginId"],
  746. "nom" => $salaries["nom"],
  747. "prenom" => $salaries["prenom"],
  748. "jourEntree" => $salaries["jourEntree"],
  749. "contrat" => $salaries["contrat"],
  750. "lieu" => $salaries["lieu"]
  751. );
  752. } elseif ($salaries["log"] == "DISABLE") {
  753. $log["json"][] = array(
  754. "action" => "DISABLE",
  755. "excel" => $salaries["excel"],
  756. "idLocal" => $salaries["idLocal"],
  757. "loginId" => $salaries["loginId"],
  758. "nom" => $salaries["nom"],
  759. "prenom" => $salaries["prenom"],
  760. "jourEntree" => $salaries["jourEntree"],
  761. "contrat" => $salaries["contrat"],
  762. "lieu" => $salaries["lieu"]
  763. );
  764. } else {
  765. $tmp_log = array("action" => "UPDATE", "excel" => $salaries["excel"], "nom" => $salaries["nom"], "prenom" => $salaries["prenom"]);
  766. $tmp = explode(" ", $salaries["log"]);
  767. foreach ($tmp as $key => $value) {
  768. if ($key > 0) {
  769. switch ($value) {
  770. case "loginId":
  771. $tmp_log["loginId"] = $salaries["loginId"];
  772. break;
  773. case "contrat":
  774. $tmp_log["contrat"] = $salaries["contrat"];
  775. break;
  776. case "lieu":
  777. $tmp_log["lieu"] = $salaries["lieu"];
  778. break;
  779. }
  780. }
  781. }
  782. $log["json"][] = $tmp_log;
  783. }
  784. }
  785. $log["json"] = json_encode($log["json"]);
  786. $log["excel"] = $salaries["excel"];
  787. } else {
  788. $log["json"] = NULL;
  789. $log["excel"] = NULL;
  790. }
  791. return $log;
  792. }
  793. /**
  794. * Compte le nombre de salariés temporaires dans la base de données.
  795. *
  796. * Exécute une requête SQL pour compter tous les enregistrements dans la table temporaire des salariés
  797. * et retourne le nombre sous forme d'entier.
  798. *
  799. * @return int Nombre de salariés temporaires.
  800. */
  801. public static function countTmpSalaries()
  802. {
  803. db::query("SELECT COUNT(*) AS nb FROM " . DB_T_TEMP_SALARIES);
  804. return db::single()["nb"];
  805. }
  806. /**
  807. * Génère un fichier CSV pour l'export SFTP contenant les identifiants de connexion et les dates de sortie des salariés.
  808. *
  809. * Cette méthode effectue les étapes suivantes :
  810. * 1. Récupère le dernier fichier Excel destiné à l'export SFTP.
  811. * 2. Extrait et décode les données JSON du fichier Excel.
  812. * 3. Crée un fichier CSV nommé avec la date du jour et écrit l'en-tête.
  813. * 4. Parcourt chaque enregistrement salarié, traite et écrit ses données dans le CSV.
  814. * 5. Enregistre la date d'export pour le suivi SFTP.
  815. *
  816. * @throws Exception Si les données JSON pour le SFTP sont invalides.
  817. */
  818. public static function dataForSFTP()
  819. {
  820. $lastExcel = self::lastExcelForSFTP();
  821. $forSFTP = self::getExcelJsonForSFTP($lastExcel);
  822. $csv = "OD_" . date("d-m-Y") . ".csv";
  823. $tmpSFTP = fopen(SFTP_LOCAL . $csv, "w");
  824. fputcsv($tmpSFTP, array("loginId", "jourSortie"), ";");
  825. $decodedData = json_decode($forSFTP["forSFTP"], TRUE);
  826. if (is_array($decodedData)) {
  827. foreach ($decodedData as $salarie) {
  828. self::processSalarie($salarie, $tmpSFTP);
  829. }
  830. } else {
  831. throw new Exception("Données JSON invalides pour SFTP.");
  832. }
  833. self::recDateForSFTP($lastExcel);
  834. }
  835. /**
  836. * Traite un enregistrement salarié et écrit les champs sélectionnés dans un fichier CSV.
  837. *
  838. * Cette méthode vérifie si le tableau du salarié contient un 'loginId' non vide
  839. * et un champ 'jourSortie'. Si c'est le cas, elle écrit ces champs dans le fichier CSV
  840. * spécifié, en utilisant le point-virgule comme séparateur.
  841. *
  842. * @param array $salarie Tableau des données du salarié contenant au moins 'loginId' et 'jourSortie'.
  843. * @param resource $tmpSFTP Ressource du fichier où écrire la ligne CSV.
  844. *
  845. * @return void
  846. */
  847. private static function processSalarie($salarie, $tmpSFTP)
  848. {
  849. if (isset($salarie["loginId"]) && $salarie["loginId"] != "" && isset($salarie["jourSortie"])) {
  850. $tmpSalarie = [
  851. "loginId" => $salarie["loginId"],
  852. "jourSortie" => $salarie["jourSortie"]
  853. ];
  854. fputcsv($tmpSFTP, $tmpSalarie, ";");
  855. }
  856. }
  857. /**
  858. * Met à jour le champ 'createForSFTP' avec la date et l'heure actuelles pour un enregistrement Excel donné.
  859. *
  860. * Cette méthode définit la colonne 'createForSFTP' à la date et l'heure courantes dans la base de données
  861. * pour l'enregistrement identifié par l'ID Excel fourni. Retourne TRUE en cas de succès, FALSE sinon.
  862. *
  863. * @param int $_idExcel L'identifiant de l'enregistrement Excel à mettre à jour.
  864. * @return bool TRUE si la mise à jour a réussi, FALSE sinon.
  865. */
  866. private static function recDateForSFTP(int $_idExcel)
  867. {
  868. db::query("UPDATE " . DB_T_EXCEL . " SET "
  869. . "createForSFTP = CURRENT_TIMESTAMP() "
  870. . "WHERE id = :id");
  871. db::bind(':id', $_idExcel);
  872. try {
  873. db::execute();
  874. return TRUE;
  875. } catch (Exception $e) {
  876. return FALSE;
  877. }
  878. }
  879. /**
  880. * Vérifie si le dernier fichier Excel pour le SFTP a été soumis.
  881. *
  882. * @return bool TRUE si le dernier fichier Excel pour le SFTP est prêt à être soumis, FALSE sinon.
  883. */
  884. public static function ifSubmitLastForSFTP()
  885. {
  886. $lastExcel = self::lastExcel();
  887. $forSFTP = self::getExcelJsonForSFTP($lastExcel);
  888. return (@$forSFTP["md5forSFTP"] != NULL and @$forSFTP["createForSFTP"] == NULL) ? TRUE : FALSE;
  889. }
  890. /**
  891. * Vérifie un salarié par son matricule.
  892. *
  893. * @param string $_string Matricule du salarié à vérifier.
  894. * @return array Résultat de la vérification contenant des messages d'erreur ou de succès.
  895. */
  896. public static function checkSalarieByMatricule(string $_string)
  897. {
  898. db::query("SELECT "
  899. . "id, "
  900. . "nom, "
  901. . "prenom, "
  902. . "contrat, "
  903. . "actif "
  904. . "FROM " . DB_T_SALARIES . " "
  905. . "WHERE idLocal = :idLocal");
  906. db::bind(':idLocal', intval($_string));
  907. $salarie = db::single();
  908. if (isset($salarie["id"])) {
  909. if ($salarie["actif"] == 0) {
  910. $return["error"] = "<div>Ce matricule n'est plus sous contrat Capgemini Consulting.</div>";
  911. $return["class"] = "danger";
  912. } elseif ($salarie["contrat"] == 0) {
  913. $return["error"] = "<div>Ce matricule est en suspension de contrat chez Capgemini Consulting mais peut-être pris en charge par le CSE.</div>";
  914. $return["class"] = "success";
  915. } else {
  916. $return["success"] = "<div>Ce matricule est sous contrat Capgemini Consulting.</div>";
  917. $return["class"] = "success";
  918. }
  919. $return["identity"] = $salarie["prenom"] . " " . $salarie["nom"];
  920. } else {
  921. $return["error"] = "<div>Ce matricule n'est pas ou plus rattaché à Capgemini Consulting.</div>";
  922. $return["class"] = "danger";
  923. }
  924. return $return;
  925. }
  926. }