2
0

salaries.class.php 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020
  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. // Récupérer la date de sortie existante pour ne pas l'écraser
  590. $existingSalarie = self::getSalarieByidLocal($salaries["idLocal"]);
  591. $dateJourSortie = (!empty($existingSalarie["jourSortie"])) ? $existingSalarie["jourSortie"] : $jourSortie;
  592. db::query("UPDATE " . DB_T_SALARIES . " SET "
  593. . "jourSortie = :jourSortie, "
  594. . "maj = CURRENT_TIMESTAMP(), "
  595. . "actif = :actif "
  596. . "WHERE idLocal = :idLocal");
  597. db::bind(':jourSortie', $dateJourSortie);
  598. db::bind(':actif', 0);
  599. db::bind(':idLocal', $salaries["idLocal"]);
  600. try {
  601. db::execute();
  602. $cp["DISABLE"]["SUCCESS"]++;
  603. } catch (Exception $ex) {
  604. $cp["DISABLE"]["ERROR"]++;
  605. }
  606. $forSFTP["action"] = "disabled";
  607. $forSFTP["idLocal"] = $salaries["idLocal"];
  608. $forSFTP["loginId"] = $salaries["loginId"];
  609. $forSFTP["contrat"] = $salaries["contrat"];
  610. $forSFTP["jourEntree"] = $salaries["jourEntree"];
  611. $forSFTP["jourSortie"] = $dateJourSortie;
  612. $forSFTP["repriseContrat"] = NULL;
  613. $forSFTP["actif"] = 0;
  614. $SFTP[$cp["forSFTP"]++] = $forSFTP;
  615. } else {
  616. $forSFTP["action"] = "update";
  617. $forSFTP["idLocal"] = $salaries["idLocal"];
  618. $forSFTP["loginId"] = $salaries["loginId"];
  619. $forSFTP["contrat"] = $salaries["contrat"];
  620. if (is_array($updateContrat) and array_key_exists($salaries["idLocal"], $updateContrat)) {
  621. if ($updateContrat[$salaries["idLocal"]] == "start") {
  622. $forSFTP["jourEntree"] = $dateReprise;
  623. $forSFTP["jourSortie"] = NULL;
  624. $forSFTP["repriseContrat"] = $dateReprise;
  625. $forSFTP["actif"] = 1;
  626. $reprise = $dateReprise;
  627. } elseif ($updateContrat[$salaries["idLocal"]] == "end") {
  628. // Arrêt de contrat temporaire (suspension) : on ne définit PAS jourSortie
  629. // car ce n'est pas une sortie définitive de l'entreprise
  630. $forSFTP["jourEntree"] = $salaries["jourEntree"];
  631. $forSFTP["jourSortie"] = NULL; // Pas de date de sortie pour une suspension
  632. $forSFTP["repriseContrat"] = NULL;
  633. $forSFTP["actif"] = 1; // Reste actif dans le système, juste contrat suspendu
  634. }
  635. } else {
  636. $forSFTP["jourEntree"] = $salaries["jourEntree"];
  637. $forSFTP["jourSortie"] = NULL;
  638. $forSFTP["repriseContrat"] = NULL;
  639. $forSFTP["actif"] = $salaries["actif"];
  640. }
  641. $SFTP[$cp["forSFTP"]++] = $forSFTP;
  642. db::query("UPDATE " . DB_T_SALARIES . " SET "
  643. . "loginId = :loginId, "
  644. . "contrat = :contrat, "
  645. . "lieu = :lieu, "
  646. . "repriseContrat = :repriseContrat, "
  647. . "jourSortie = :jourSortie, "
  648. . "maj = CURRENT_TIMESTAMP(), "
  649. . "actif = :actif "
  650. . "WHERE idLocal = :idLocal");
  651. db::bind(':loginId', $salaries["loginId"]);
  652. db::bind(':contrat', $salaries["contrat"]);
  653. db::bind(':lieu', $salaries["lieu"]);
  654. db::bind(':repriseContrat', $reprise);
  655. db::bind(':jourSortie', NULL);
  656. db::bind(':actif', $salaries["actif"]);
  657. db::bind(':idLocal', $salaries["idLocal"]);
  658. try {
  659. db::execute();
  660. $cp["UPDATE"]["SUCCESS"]++;
  661. } catch (Exception $ex) {
  662. $cp["UPDATE"]["ERROR"]++;
  663. }
  664. }
  665. }
  666. if ($cp["INSERT"]["SUCCESS"] == 1) {
  667. alert::recSuccess("SUCCESS : " . $cp["INSERT"]["SUCCESS"] . " salarié traité.");
  668. } elseif ($cp["INSERT"]["SUCCESS"] > 1) {
  669. alert::recSuccess("SUCCESS : " . $cp["INSERT"]["SUCCESS"] . " salariés traités.");
  670. }
  671. if ($cp["DISABLE"]["SUCCESS"] == 1) {
  672. alert::recSuccess("DISABLE : " . $cp["DISABLE"]["SUCCESS"] . " salarié traité.");
  673. } elseif ($cp["DISABLE"]["SUCCESS"] > 1) {
  674. alert::recSuccess("DISABLE : " . $cp["DISABLE"]["SUCCESS"] . " salariés traités.");
  675. }
  676. if ($cp["UPDATE"]["SUCCESS"] == 1) {
  677. alert::recSuccess("UPDATE : " . $cp["UPDATE"]["SUCCESS"] . " salarié traité.");
  678. } elseif ($cp["UPDATE"]["SUCCESS"] > 1) {
  679. alert::recSuccess("UPDATE : " . $cp["UPDATE"]["SUCCESS"] . " salariés traités.");
  680. }
  681. if ($cp["INSERT"]["ERROR"] == 1) {
  682. alert::recSuccess("SUCCESS : " . $cp["INSERT"]["SUCCESS"] . " salarié non traité.");
  683. } elseif ($cp["INSERT"]["ERROR"] > 1) {
  684. alert::recSuccess("SUCCESS : " . $cp["INSERT"]["SUCCESS"] . " salariés non traités.");
  685. }
  686. if ($cp["DISABLE"]["ERROR"] == 1) {
  687. alert::recSuccess("DISABLE : " . $cp["DISABLE"]["SUCCESS"] . " salarié non traité.");
  688. } elseif ($cp["DISABLE"]["ERROR"] > 1) {
  689. alert::recSuccess("DISABLE : " . $cp["DISABLE"]["SUCCESS"] . " salariés non traités.");
  690. }
  691. if ($cp["UPDATE"]["ERROR"] == 1) {
  692. alert::recSuccess("UPDATE : " . $cp["UPDATE"]["SUCCESS"] . " salarié non traité.");
  693. } elseif ($cp["UPDATE"]["ERROR"] > 1) {
  694. alert::recSuccess("UPDATE : " . $cp["UPDATE"]["SUCCESS"] . " salariés non traités.");
  695. }
  696. (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");
  697. }
  698. }
  699. /**
  700. * Enregistre les données pour le SFTP.
  701. *
  702. * @param array $_array Données à enregistrer.
  703. * @param int $_idExcel Identifiant du fichier Excel.
  704. * @return bool TRUE si l'enregistrement a réussi, FALSE sinon.
  705. */
  706. private static function recForSFTP(array $_array, int $_idExcel)
  707. {
  708. $json = json_encode($_array);
  709. db::query("UPDATE " . DB_T_EXCEL . " SET "
  710. . "forSFTP = :forSFTP ,"
  711. . "md5forSFTP = :md5forSFTP "
  712. . "WHERE id = :id");
  713. db::bind(':forSFTP', $json);
  714. db::bind(':md5forSFTP', md5($json));
  715. db::bind(':id', $_idExcel);
  716. try {
  717. db::execute();
  718. return TRUE;
  719. } catch (Exception $e) {
  720. return FALSE;
  721. }
  722. }
  723. /**
  724. * Crée un rapport des modifications des salariés à partir de la table temporaire.
  725. *
  726. * Cette méthode interroge la table temporaire des salariés pour récupérer les enregistrements
  727. * ayant un champ 'log' non nul, indiquant une modification (INSERT, DISABLE ou UPDATE).
  728. * Elle construit un tableau contenant les détails de chaque modification, puis encode ce tableau en JSON.
  729. *
  730. * - Pour une action "INSERT", toutes les informations du salarié sont ajoutées.
  731. * - Pour une action "DISABLE", toutes les informations du salarié sont ajoutées.
  732. * - Pour une action "UPDATE", seules les informations modifiées sont ajoutées selon le contenu du champ 'log'.
  733. *
  734. * @return array|null Un tableau associatif contenant :
  735. * - 'json' : la liste des modifications encodée en JSON ou NULL si aucune modification.
  736. * - 'excel' : le nom du fichier Excel associé ou NULL si aucune modification.
  737. */
  738. public static function createRapport()
  739. {
  740. $log = NULL;
  741. db::query("SELECT idLocal, loginId, nom, prenom, contrat, jourEntree, lieu, excel, log FROM " . DB_T_TEMP_SALARIES . " WHERE log IS NOT NULL");
  742. $row = db::resultset();
  743. if ($row != NULL) {
  744. foreach ($row as $key => $salaries) {
  745. if ($salaries["log"] == "INSERT") {
  746. $log["json"][] = array(
  747. "action" => "INSERT",
  748. "excel" => $salaries["excel"],
  749. "idLocal" => $salaries["idLocal"],
  750. "loginId" => $salaries["loginId"],
  751. "nom" => $salaries["nom"],
  752. "prenom" => $salaries["prenom"],
  753. "jourEntree" => $salaries["jourEntree"],
  754. "contrat" => $salaries["contrat"],
  755. "lieu" => $salaries["lieu"]
  756. );
  757. } elseif ($salaries["log"] == "DISABLE") {
  758. $log["json"][] = array(
  759. "action" => "DISABLE",
  760. "excel" => $salaries["excel"],
  761. "idLocal" => $salaries["idLocal"],
  762. "loginId" => $salaries["loginId"],
  763. "nom" => $salaries["nom"],
  764. "prenom" => $salaries["prenom"],
  765. "jourEntree" => $salaries["jourEntree"],
  766. "contrat" => $salaries["contrat"],
  767. "lieu" => $salaries["lieu"]
  768. );
  769. } else {
  770. $tmp_log = array("action" => "UPDATE", "excel" => $salaries["excel"], "nom" => $salaries["nom"], "prenom" => $salaries["prenom"]);
  771. $tmp = explode(" ", $salaries["log"]);
  772. foreach ($tmp as $key => $value) {
  773. if ($key > 0) {
  774. switch ($value) {
  775. case "loginId":
  776. $tmp_log["loginId"] = $salaries["loginId"];
  777. break;
  778. case "contrat":
  779. $tmp_log["contrat"] = $salaries["contrat"];
  780. break;
  781. case "lieu":
  782. $tmp_log["lieu"] = $salaries["lieu"];
  783. break;
  784. }
  785. }
  786. }
  787. $log["json"][] = $tmp_log;
  788. }
  789. }
  790. $log["json"] = json_encode($log["json"]);
  791. $log["excel"] = $salaries["excel"];
  792. } else {
  793. $log["json"] = NULL;
  794. $log["excel"] = NULL;
  795. }
  796. return $log;
  797. }
  798. /**
  799. * Compte le nombre de salariés temporaires dans la base de données.
  800. *
  801. * Exécute une requête SQL pour compter tous les enregistrements dans la table temporaire des salariés
  802. * et retourne le nombre sous forme d'entier.
  803. *
  804. * @return int Nombre de salariés temporaires.
  805. */
  806. public static function countTmpSalaries()
  807. {
  808. db::query("SELECT COUNT(*) AS nb FROM " . DB_T_TEMP_SALARIES);
  809. return db::single()["nb"];
  810. }
  811. /**
  812. * Génère un fichier CSV pour l'export SFTP contenant les identifiants de connexion et les dates de sortie des salariés.
  813. *
  814. * Cette méthode effectue les étapes suivantes :
  815. * 1. Récupère le dernier fichier Excel destiné à l'export SFTP.
  816. * 2. Extrait et décode les données JSON du fichier Excel.
  817. * 3. Crée un fichier CSV nommé avec la date du jour et écrit l'en-tête.
  818. * 4. Parcourt chaque enregistrement salarié, traite et écrit ses données dans le CSV.
  819. * 5. Enregistre la date d'export pour le suivi SFTP.
  820. *
  821. * @throws Exception Si les données JSON pour le SFTP sont invalides.
  822. */
  823. public static function dataForSFTP()
  824. {
  825. $lastExcel = self::lastExcelForSFTP();
  826. $forSFTP = self::getExcelJsonForSFTP($lastExcel);
  827. $csv = "OD_" . date("d-m-Y") . ".csv";
  828. $tmpSFTP = fopen(SFTP_LOCAL . $csv, "w");
  829. fputcsv($tmpSFTP, array("loginId", "jourSortie"), ";");
  830. $decodedData = json_decode($forSFTP["forSFTP"], TRUE);
  831. if (is_array($decodedData)) {
  832. foreach ($decodedData as $salarie) {
  833. self::processSalarie($salarie, $tmpSFTP);
  834. }
  835. } else {
  836. throw new Exception("Données JSON invalides pour SFTP.");
  837. }
  838. self::recDateForSFTP($lastExcel);
  839. }
  840. /**
  841. * Traite un enregistrement salarié et écrit les champs sélectionnés dans un fichier CSV.
  842. *
  843. * Cette méthode vérifie si le tableau du salarié contient un 'loginId' non vide,
  844. * un champ 'jourSortie' défini, ET une action 'disabled' (sortie définitive).
  845. * Les arrêts de contrat temporaires (action = 'update' avec contrat = 0) ne sont pas
  846. * considérés comme des sorties et ne sont pas inclus dans le CSV.
  847. *
  848. * @param array $salarie Tableau des données du salarié contenant au moins 'loginId', 'jourSortie' et 'action'.
  849. * @param resource $tmpSFTP Ressource du fichier où écrire la ligne CSV.
  850. *
  851. * @return void
  852. */
  853. private static function processSalarie($salarie, $tmpSFTP)
  854. {
  855. // On n'exporte que les salariés avec l'action "disabled" (sortie définitive)
  856. // Les arrêts de contrat temporaires (action "update" avec jourSortie) ne sont pas des sorties
  857. if (
  858. isset($salarie["loginId"]) && $salarie["loginId"] != ""
  859. && isset($salarie["jourSortie"]) && $salarie["jourSortie"] != NULL
  860. && isset($salarie["action"]) && $salarie["action"] == "disabled"
  861. ) {
  862. $tmpSalarie = [
  863. "loginId" => $salarie["loginId"],
  864. "jourSortie" => $salarie["jourSortie"]
  865. ];
  866. fputcsv($tmpSFTP, $tmpSalarie, ";");
  867. }
  868. }
  869. /**
  870. * Met à jour le champ 'createForSFTP' avec la date et l'heure actuelles pour un enregistrement Excel donné.
  871. *
  872. * Cette méthode définit la colonne 'createForSFTP' à la date et l'heure courantes dans la base de données
  873. * pour l'enregistrement identifié par l'ID Excel fourni. Retourne TRUE en cas de succès, FALSE sinon.
  874. *
  875. * @param int $_idExcel L'identifiant de l'enregistrement Excel à mettre à jour.
  876. * @return bool TRUE si la mise à jour a réussi, FALSE sinon.
  877. */
  878. private static function recDateForSFTP(int $_idExcel)
  879. {
  880. db::query("UPDATE " . DB_T_EXCEL . " SET "
  881. . "createForSFTP = CURRENT_TIMESTAMP() "
  882. . "WHERE id = :id");
  883. db::bind(':id', $_idExcel);
  884. try {
  885. db::execute();
  886. return TRUE;
  887. } catch (Exception $e) {
  888. return FALSE;
  889. }
  890. }
  891. /**
  892. * Vérifie si le dernier fichier Excel pour le SFTP a été soumis.
  893. *
  894. * @return bool TRUE si le dernier fichier Excel pour le SFTP est prêt à être soumis, FALSE sinon.
  895. */
  896. public static function ifSubmitLastForSFTP()
  897. {
  898. $lastExcel = self::lastExcel();
  899. $forSFTP = self::getExcelJsonForSFTP($lastExcel);
  900. return (@$forSFTP["md5forSFTP"] != NULL and @$forSFTP["createForSFTP"] == NULL) ? TRUE : FALSE;
  901. }
  902. /**
  903. * Vérifie un salarié par son matricule.
  904. *
  905. * @param string $_string Matricule du salarié à vérifier.
  906. * @return array Résultat de la vérification contenant des messages d'erreur ou de succès.
  907. */
  908. public static function checkSalarieByMatricule(string $_string)
  909. {
  910. db::query("SELECT "
  911. . "id, "
  912. . "nom, "
  913. . "prenom, "
  914. . "contrat, "
  915. . "actif "
  916. . "FROM " . DB_T_SALARIES . " "
  917. . "WHERE idLocal = :idLocal");
  918. db::bind(':idLocal', intval($_string));
  919. $salarie = db::single();
  920. if (isset($salarie["id"])) {
  921. if ($salarie["actif"] == 0) {
  922. $return["error"] = "<div>Ce matricule n'est plus sous contrat Capgemini Consulting.</div>";
  923. $return["class"] = "danger";
  924. } elseif ($salarie["contrat"] == 0) {
  925. $return["error"] = "<div>Ce matricule est en suspension de contrat chez Capgemini Consulting mais peut-être pris en charge par le CSE.</div>";
  926. $return["class"] = "success";
  927. } else {
  928. $return["success"] = "<div>Ce matricule est sous contrat Capgemini Consulting.</div>";
  929. $return["class"] = "success";
  930. }
  931. $return["identity"] = $salarie["prenom"] . " " . $salarie["nom"];
  932. } else {
  933. $return["error"] = "<div>Ce matricule n'est pas ou plus rattaché à Capgemini Consulting.</div>";
  934. $return["class"] = "danger";
  935. }
  936. return $return;
  937. }
  938. }