$_value[0], "loginId" => $_value[7], "nom" => core::cleanAccent($_value[1]), "prenom" => core::cleanAccent($_value[2]), "sexe" => $_value[3], "contrat" => $_value[4], "jourEntree" => $_value[5], "lieu" => core::cleanAccent($_value[6]), "actif" => 1 ); } /** * Insère les données des salariés temporaires dans la table temporaire. * * @param string $_excel Identifiant du fichier Excel associé. */ public static function createTmp(string $_excel) { db::query("SELECT idLocal, loginId, nom, prenom, sexe, contrat, jourEntree, lieu, actif FROM " . DB_T_SALARIES); $row = db::resultset(); if (!empty($row)) { foreach ($row as $salaries) { db::query("INSERT INTO " . DB_T_TEMP_SALARIES . " (idLocal, loginId, nom, prenom, sexe, contrat, jourEntree, lieu, actif, new, excel) " . "VALUES (:idLocal, :loginId, :nom, :prenom, :sexe, :contrat, :jourEntree, :lieu, :actif, :new, :excel)"); db::bind(':idLocal', $salaries["idLocal"]); db::bind(':loginId', $salaries["loginId"]); db::bind(':nom', $salaries["nom"]); db::bind(':prenom', $salaries["prenom"]); db::bind(':sexe', $salaries["sexe"]); db::bind(':contrat', $salaries["contrat"]); db::bind(':jourEntree', $salaries["jourEntree"]); db::bind(':lieu', $salaries["lieu"]); db::bind(':actif', 0); db::bind(':new', 0); db::bind(':excel', $_excel); db::execute(); } } } /** * Met à jour les salariés inactifs dans la table temporaire. * * @return bool TRUE si la mise à jour a réussi, FALSE sinon. */ public static function updateInactiveTempSalarie() { db::query("UPDATE " . DB_T_TEMP_SALARIES . " SET " . "log = :log " . "WHERE actif = :actif"); db::bind(':log', "DISABLE"); db::bind(':actif', 0); try { db::execute(); return TRUE; } catch (Exception $e) { return FALSE; } } /** * Met à jour les données JSON d'un fichier Excel. * * @param array $_json Données JSON à mettre à jour. * @return bool TRUE si la mise à jour a réussi, FALSE sinon. */ public static function updateJsonExcel(array $_json) { db::query("UPDATE " . DB_T_EXCEL . " SET " . "goMysql = current_timestamp(), " . "log = :log " . "WHERE id = :id"); db::bind(':log', $_json["json"]); db::bind(':id', $_json["excel"]); try { db::execute(); return TRUE; } catch (Exception $e) { return FALSE; } } /** * Met à jour les données temporaires des salariés. * * @param array $_new_salaries Les nouvelles données des salariés. * @param string $_excel Identifiant du fichier Excel associé. * @return bool TRUE si la mise à jour a réussi, FALSE sinon. */ public static function update_temp_salaries(array $_new_salaries, string $_excel) { $cp["INSERT"]["SUCCESS"] = 0; $cp["INSERT"]["ERROR"] = 0; $cp["UPDATE"]["SUCCESS"] = 0; $cp["UPDATE"]["ERROR"] = 0; $changeStatutContrat = NULL; foreach ($_new_salaries as $key => $value) { $sql = $change = NULL; if ($key > 0) { $tmp = self::excelToMysql($value); if(!is_int($tmp["idLocal"])) { alert::recError("Une valeur dans le fichie n'est pas conforme à l'attendu (Ligne " . $key . ")"); self::cleanTmp(); self::excelUpdateInProgress(self::lastExcel(), 0); return FALSE; } $salarieByidLocal = self::getSalarieByidLocal($tmp["idLocal"]); if (isset($salarieByidLocal["idLocal"])) { $tmp_sql = ""; if ($tmp["loginId"] != $salarieByidLocal["loginId"]) { $tmp_sql .= "loginId = :loginId, "; $change = 1; } if ($tmp["contrat"] != $salarieByidLocal["contrat"]) { $tmp_sql .= "contrat = :contrat, "; $change = 1; // Indentifier les cas d'arrêt ou de reprise de contrat if ($tmp["contrat"] == 0 and $salarieByidLocal["contrat"] == 1) { $changeStatutContrat[$salarieByidLocal["idLocal"]] = "end"; } else { $changeStatutContrat[$salarieByidLocal["idLocal"]] = "start"; } // Indentifier les cas d'arrêt ou de reprise de contrat } if ($tmp["lieu"] != $salarieByidLocal["lieu"]) { $tmp_sql .= "lieu = :lieu, "; $change = 1; } if ($tmp["actif"] != $salarieByidLocal["actif"]) { $change = 1; } else { $forSFTP["actif"] = NULL; } $tmp_sql .= "actif = :actif, "; if ($change == 1) { db::query($sql = "UPDATE " . DB_T_TEMP_SALARIES . " SET " . $tmp_sql . " log = :log WHERE idLocal = :idLocal"); $log = NULL; if ($tmp["loginId"] != $salarieByidLocal["loginId"]) { db::bind(':loginId', $tmp["loginId"]); if ($log == "") { $log .= "UPDATE "; } $log .= "loginId "; } if ($tmp["contrat"] != $salarieByidLocal["contrat"]) { db::bind(':contrat', $tmp["contrat"]); if ($log == "") { $log .= "UPDATE "; } $log .= "contrat "; } if ($tmp["lieu"] != $salarieByidLocal["lieu"]) { db::bind(':lieu', $tmp["lieu"]); if ($log == "") { $log .= "UPDATE "; } $log .= "lieu "; } if ($tmp["actif"] != $salarieByidLocal["actif"]) { if ($log == "") { $log .= "UPDATE "; } $log .= "actif "; } db::bind(':actif', 1); if ($change == 1) { db::bind(':log', $log); } else { db::bind(':log', NULL); } db::bind(':idLocal', $tmp["idLocal"]); try { db::execute(); $cp["UPDATE"]["SUCCESS"]++; } catch (Exception $ex) { $cp["UPDATE"]["ERROR"]++; } } else { db::query("UPDATE " . DB_T_TEMP_SALARIES . " SET actif = :actif WHERE idLocal = :idLocal"); db::bind(':actif', 1); db::bind(':idLocal', $tmp["idLocal"]); db::execute(); } } else { db::query("INSERT INTO " . DB_T_TEMP_SALARIES . " (idLocal, loginId, nom, prenom, sexe, contrat, jourEntree, lieu, actif, new, excel, log) " . "VALUES (:idLocal, :loginId, :nom, :prenom, :sexe, :contrat, :jourEntree, :lieu, :actif, :new, :excel, :log)"); db::bind(':idLocal', $tmp["idLocal"]); db::bind(':loginId', $tmp["loginId"]); db::bind(':nom', $tmp["nom"]); db::bind(':prenom', $tmp["prenom"]); db::bind(':sexe', $tmp["sexe"]); db::bind(':contrat', $tmp["contrat"]); db::bind(':jourEntree', $tmp["jourEntree"]); db::bind(':lieu', $tmp["lieu"]); db::bind(':actif', 1); db::bind(':new', 1); db::bind(':excel', $_excel); db::bind(':log', "INSERT"); try { db::execute(); $cp["INSERT"]["SUCCESS"]++; } catch (Exception $ex) { $cp["INSERT"]["ERROR"]++; } } } } ($changeStatutContrat != NULL) ? self::recContratForSFTP($_excel, $changeStatutContrat) : ""; if ($cp["INSERT"]["ERROR"] != 0 or $cp["INSERT"]["ERROR"] != 0) { alert::recError("Une erreur s'est produite lors de la mise en cache."); return TRUE; } else { alert::recSuccess("La mise en cache a été réalisée avec succès."); return TRUE; } } /** * Enregistre les changements de contrat pour le SFTP. * * @param int $_idExcel Identifiant du fichier Excel. * @param array|null $_data Données des changements de contrat. * @return bool TRUE si l'enregistrement a réussi, FALSE sinon. */ private static function recContratForSFTP(int $_idExcel, ?array $_data) { db::query("UPDATE " . DB_T_EXCEL . " SET " . "contratForSFTP = :contratForSFTP " . "WHERE id = :id"); db::bind(':contratForSFTP', json_encode($_data)); db::bind(':id', $_idExcel); try { db::execute(); return TRUE; } catch (Exception $e) { return FALSE; } } /** * Met à jour les données des salariés à partir d'un fichier Excel. * * @param int $_excel Identifiant du fichier Excel. */ public static function updateSalaries(int $_excel) { $cp["INSERT"]["SUCCESS"] = 0; $cp["INSERT"]["ERROR"] = 0; $cp["DISABLE"]["SUCCESS"] = 0; $cp["DISABLE"]["ERROR"] = 0; $cp["UPDATE"]["SUCCESS"] = 0; $cp["UPDATE"]["ERROR"] = 0; $cp["forSFTP"] = 0; $updateContrat = json_decode(self::getExcelJsonForSFTP($_excel)["contratForSFTP"], TRUE); $jourSortie = date("Y-m-d 00:00:00"); $dateReprise = date("Y-m-d 00:00:00"); db::query("SELECT idLocal, loginId, nom, prenom, sexe, contrat, jourEntree, lieu, actif, new, log FROM " . DB_T_TEMP_SALARIES); $row = db::resultset(); if (!empty($row)) { foreach ($row as $key => $salaries) { $forSFTP = $reprise = NULL; if ($salaries["log"] == NULL) { $forSFTP["action"] = "valide"; $forSFTP["idLocal"] = $salaries["idLocal"]; $forSFTP["loginId"] = $salaries["loginId"]; $forSFTP["contrat"] = $salaries["contrat"]; $forSFTP["jourEntree"] = $salaries["jourEntree"]; $forSFTP["jourSortie"] = NULL; $forSFTP["repriseContrat"] = NULL; $forSFTP["actif"] = 1; $SFTP[$cp["forSFTP"]++] = $forSFTP; } elseif ($salaries["log"] == "INSERT") { db::query("INSERT INTO " . DB_T_SALARIES . " (idLocal, loginId, nom, prenom, sexe, contrat, jourEntree, jourSortie, sel, lieu, actif) " . "VALUES (:idLocal, :loginId, :nom, :prenom, :sexe, :contrat, :jourEntree, :jourSortie, :sel, :lieu, :actif)"); db::bind(':idLocal', $salaries["idLocal"]); db::bind(':loginId', $salaries["loginId"]); db::bind(':nom', $salaries["nom"]); db::bind(':prenom', $salaries["prenom"]); db::bind(':sexe', $salaries["sexe"]); db::bind(':contrat', $salaries["contrat"]); db::bind(':jourEntree', $salaries["jourEntree"]); db::bind(':jourSortie', NULL); db::bind(':sel', md5($salaries["idLocal"] . time() . rand(100000000000, 999999999999))); db::bind(':lieu', $salaries["lieu"]); db::bind(':actif', $salaries["actif"]); try { db::execute(); $cp["INSERT"]["SUCCESS"]++; } catch (Exception $ex) { $cp["INSERT"]["ERROR"]++; } $forSFTP["action"] = "insert"; $forSFTP["idLocal"] = $salaries["idLocal"]; $forSFTP["loginId"] = $salaries["loginId"]; $forSFTP["contrat"] = $salaries["contrat"]; $forSFTP["jourEntree"] = $salaries["jourEntree"]; $forSFTP["jourSortie"] = NULL; $forSFTP["repriseContrat"] = NULL; $forSFTP["actif"] = 1; $SFTP[$cp["forSFTP"]++] = $forSFTP; } elseif ($salaries["log"] == "DISABLE") { db::query("UPDATE " . DB_T_SALARIES . " SET " . "jourSortie = :jourSortie, " . "maj = CURRENT_TIMESTAMP(), " . "actif = :actif " . "WHERE idLocal = :idLocal"); db::bind(':jourSortie', $jourSortie); db::bind(':actif', 0); db::bind(':idLocal', $salaries["idLocal"]); try { db::execute(); $cp["DISABLE"]["SUCCESS"]++; } catch (Exception $ex) { $cp["DISABLE"]["ERROR"]++; } $forSFTP["action"] = "disabled"; $forSFTP["idLocal"] = $salaries["idLocal"]; $forSFTP["loginId"] = $salaries["loginId"]; $forSFTP["contrat"] = $salaries["contrat"]; $forSFTP["jourEntree"] = $salaries["jourEntree"]; $forSFTP["jourSortie"] = $jourSortie; $forSFTP["repriseContrat"] = NULL; $forSFTP["actif"] = 0; $SFTP[$cp["forSFTP"]++] = $forSFTP; } else { $forSFTP["action"] = "update"; $forSFTP["idLocal"] = $salaries["idLocal"]; $forSFTP["loginId"] = $salaries["loginId"]; $forSFTP["contrat"] = $salaries["contrat"]; if (is_array($updateContrat) and array_key_exists($salaries["idLocal"], $updateContrat)) { if ($updateContrat[$salaries["idLocal"]] == "start") { $forSFTP["jourEntree"] = $dateReprise; $forSFTP["jourSortie"] = NULL; $forSFTP["repriseContrat"] = $dateReprise; $forSFTP["actif"] = 1; $reprise = $dateReprise; } elseif ($updateContrat[$salaries["idLocal"]] == "end") { $forSFTP["jourEntree"] = $salaries["jourEntree"]; $forSFTP["jourSortie"] = $jourSortie; $forSFTP["repriseContrat"] = NULL; $forSFTP["actif"] = 0; } } else { $forSFTP["jourEntree"] = $salaries["jourEntree"]; $forSFTP["jourSortie"] = NULL; $forSFTP["repriseContrat"] = NULL; $forSFTP["actif"] = $salaries["actif"]; } $SFTP[$cp["forSFTP"]++] = $forSFTP; db::query("UPDATE " . DB_T_SALARIES . " SET " . "loginId = :loginId, " . "contrat = :contrat, " . "lieu = :lieu, " . "repriseContrat = :repriseContrat, " . "jourSortie = :jourSortie, " . "maj = CURRENT_TIMESTAMP(), " . "actif = :actif " . "WHERE idLocal = :idLocal"); db::bind(':loginId', $salaries["loginId"]); db::bind(':contrat', $salaries["contrat"]); db::bind(':lieu', $salaries["lieu"]); db::bind(':repriseContrat', $reprise); db::bind(':jourSortie', NULL); db::bind(':actif', $salaries["actif"]); db::bind(':idLocal', $salaries["idLocal"]); try { db::execute(); $cp["UPDATE"]["SUCCESS"]++; } catch (Exception $ex) { $cp["UPDATE"]["ERROR"]++; } } } if ($cp["INSERT"]["SUCCESS"] == 1) { alert::recSuccess("SUCCESS : " . $cp["INSERT"]["SUCCESS"] . " salarié traité."); } elseif ($cp["INSERT"]["SUCCESS"] > 1) { alert::recSuccess("SUCCESS : " . $cp["INSERT"]["SUCCESS"] . " salariés traités."); } if ($cp["DISABLE"]["SUCCESS"] == 1) { alert::recSuccess("DISABLE : " . $cp["DISABLE"]["SUCCESS"] . " salarié traité."); } elseif ($cp["DISABLE"]["SUCCESS"] > 1) { alert::recSuccess("DISABLE : " . $cp["DISABLE"]["SUCCESS"] . " salariés traités."); } if ($cp["UPDATE"]["SUCCESS"] == 1) { alert::recSuccess("UPDATE : " . $cp["UPDATE"]["SUCCESS"] . " salarié traité."); } elseif ($cp["UPDATE"]["SUCCESS"] > 1) { alert::recSuccess("UPDATE : " . $cp["UPDATE"]["SUCCESS"] . " salariés traités."); } if ($cp["INSERT"]["ERROR"] == 1) { alert::recSuccess("SUCCESS : " . $cp["INSERT"]["SUCCESS"] . " salarié non traité."); } elseif ($cp["INSERT"]["ERROR"] > 1) { alert::recSuccess("SUCCESS : " . $cp["INSERT"]["SUCCESS"] . " salariés non traités."); } if ($cp["DISABLE"]["ERROR"] == 1) { alert::recSuccess("DISABLE : " . $cp["DISABLE"]["SUCCESS"] . " salarié non traité."); } elseif ($cp["DISABLE"]["ERROR"] > 1) { alert::recSuccess("DISABLE : " . $cp["DISABLE"]["SUCCESS"] . " salariés non traités."); } if ($cp["UPDATE"]["ERROR"] == 1) { alert::recSuccess("UPDATE : " . $cp["UPDATE"]["SUCCESS"] . " salarié non traité."); } elseif ($cp["UPDATE"]["ERROR"] > 1) { alert::recSuccess("UPDATE : " . $cp["UPDATE"]["SUCCESS"] . " salariés non traités."); } (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"); } } /** * Enregistre les données pour le SFTP. * * @param array $_array Données à enregistrer. * @param int $_idExcel Identifiant du fichier Excel. * @return bool TRUE si l'enregistrement a réussi, FALSE sinon. */ private static function recForSFTP(array $_array, int $_idExcel) { $json = json_encode($_array); db::query("UPDATE " . DB_T_EXCEL . " SET " . "forSFTP = :forSFTP ," . "md5forSFTP = :md5forSFTP " . "WHERE id = :id"); db::bind(':forSFTP', $json); db::bind(':md5forSFTP', md5($json)); db::bind(':id', $_idExcel); try { db::execute(); return TRUE; } catch (Exception $e) { return FALSE; } } /** * Crée un rapport des modifications des salariés à partir de la table temporaire. * * Cette méthode interroge la table temporaire des salariés pour récupérer les enregistrements * ayant un champ 'log' non nul, indiquant une modification (INSERT, DISABLE ou UPDATE). * Elle construit un tableau contenant les détails de chaque modification, puis encode ce tableau en JSON. * * - Pour une action "INSERT", toutes les informations du salarié sont ajoutées. * - Pour une action "DISABLE", toutes les informations du salarié sont ajoutées. * - Pour une action "UPDATE", seules les informations modifiées sont ajoutées selon le contenu du champ 'log'. * * @return array|null Un tableau associatif contenant : * - 'json' : la liste des modifications encodée en JSON ou NULL si aucune modification. * - 'excel' : le nom du fichier Excel associé ou NULL si aucune modification. */ public static function createRapport() { $log = NULL; db::query("SELECT idLocal, loginId, nom, prenom, contrat, jourEntree, lieu, excel, log FROM " . DB_T_TEMP_SALARIES . " WHERE log IS NOT NULL"); $row = db::resultset(); if ($row != NULL) { foreach ($row as $key => $salaries) { if ($salaries["log"] == "INSERT") { $log["json"][] = array( "action" => "INSERT", "excel" => $salaries["excel"], "idLocal" => $salaries["idLocal"], "loginId" => $salaries["loginId"], "nom" => $salaries["nom"], "prenom" => $salaries["prenom"], "jourEntree" => $salaries["jourEntree"], "contrat" => $salaries["contrat"], "lieu" => $salaries["lieu"] ); } elseif ($salaries["log"] == "DISABLE") { $log["json"][] = array( "action" => "DISABLE", "excel" => $salaries["excel"], "idLocal" => $salaries["idLocal"], "loginId" => $salaries["loginId"], "nom" => $salaries["nom"], "prenom" => $salaries["prenom"], "jourEntree" => $salaries["jourEntree"], "contrat" => $salaries["contrat"], "lieu" => $salaries["lieu"] ); } else { $tmp_log = array("action" => "UPDATE", "excel" => $salaries["excel"], "nom" => $salaries["nom"], "prenom" => $salaries["prenom"]); $tmp = explode(" ", $salaries["log"]); foreach ($tmp as $key => $value) { if ($key > 0) { switch ($value) { case "loginId": $tmp_log["loginId"] = $salaries["loginId"]; break; case "contrat": $tmp_log["contrat"] = $salaries["contrat"]; break; case "lieu": $tmp_log["lieu"] = $salaries["lieu"]; break; } } } $log["json"][] = $tmp_log; } } $log["json"] = json_encode($log["json"]); $log["excel"] = $salaries["excel"]; } else { $log["json"] = NULL; $log["excel"] = NULL; } return $log; } /** * Compte le nombre de salariés temporaires dans la base de données. * * Exécute une requête SQL pour compter tous les enregistrements dans la table temporaire des salariés * et retourne le nombre sous forme d'entier. * * @return int Nombre de salariés temporaires. */ public static function countTmpSalaries() { db::query("SELECT COUNT(*) AS nb FROM " . DB_T_TEMP_SALARIES); return db::single()["nb"]; } /** * Génère un fichier CSV pour l'export SFTP contenant les identifiants de connexion et les dates de sortie des salariés. * * Cette méthode effectue les étapes suivantes : * 1. Récupère le dernier fichier Excel destiné à l'export SFTP. * 2. Extrait et décode les données JSON du fichier Excel. * 3. Crée un fichier CSV nommé avec la date du jour et écrit l'en-tête. * 4. Parcourt chaque enregistrement salarié, traite et écrit ses données dans le CSV. * 5. Enregistre la date d'export pour le suivi SFTP. * * @throws Exception Si les données JSON pour le SFTP sont invalides. */ public static function dataForSFTP() { $lastExcel = self::lastExcelForSFTP(); $forSFTP = self::getExcelJsonForSFTP($lastExcel); $csv = "OD_" . date("d-m-Y") . ".csv"; $tmpSFTP = fopen(SFTP_LOCAL . $csv, "w"); fputcsv($tmpSFTP, array("loginId", "jourSortie"), ";"); $decodedData = json_decode($forSFTP["forSFTP"], TRUE); if (is_array($decodedData)) { foreach ($decodedData as $salarie) { self::processSalarie($salarie, $tmpSFTP); } } else { throw new Exception("Données JSON invalides pour SFTP."); } self::recDateForSFTP($lastExcel); } /** * Traite un enregistrement salarié et écrit les champs sélectionnés dans un fichier CSV. * * Cette méthode vérifie si le tableau du salarié contient un 'loginId' non vide * et un champ 'jourSortie'. Si c'est le cas, elle écrit ces champs dans le fichier CSV * spécifié, en utilisant le point-virgule comme séparateur. * * @param array $salarie Tableau des données du salarié contenant au moins 'loginId' et 'jourSortie'. * @param resource $tmpSFTP Ressource du fichier où écrire la ligne CSV. * * @return void */ private static function processSalarie($salarie, $tmpSFTP) { if (isset($salarie["loginId"]) && $salarie["loginId"] != "" && isset($salarie["jourSortie"])) { $tmpSalarie = [ "loginId" => $salarie["loginId"], "jourSortie" => $salarie["jourSortie"] ]; fputcsv($tmpSFTP, $tmpSalarie, ";"); } } /** * Met à jour le champ 'createForSFTP' avec la date et l'heure actuelles pour un enregistrement Excel donné. * * Cette méthode définit la colonne 'createForSFTP' à la date et l'heure courantes dans la base de données * pour l'enregistrement identifié par l'ID Excel fourni. Retourne TRUE en cas de succès, FALSE sinon. * * @param int $_idExcel L'identifiant de l'enregistrement Excel à mettre à jour. * @return bool TRUE si la mise à jour a réussi, FALSE sinon. */ private static function recDateForSFTP(int $_idExcel) { db::query("UPDATE " . DB_T_EXCEL . " SET " . "createForSFTP = CURRENT_TIMESTAMP() " . "WHERE id = :id"); db::bind(':id', $_idExcel); try { db::execute(); return TRUE; } catch (Exception $e) { return FALSE; } } /** * Vérifie si le dernier fichier Excel pour le SFTP a été soumis. * * @return bool TRUE si le dernier fichier Excel pour le SFTP est prêt à être soumis, FALSE sinon. */ public static function ifSubmitLastForSFTP() { $lastExcel = self::lastExcel(); $forSFTP = self::getExcelJsonForSFTP($lastExcel); return (@$forSFTP["md5forSFTP"] != NULL and @$forSFTP["createForSFTP"] == NULL) ? TRUE : FALSE; } /** * Vérifie un salarié par son matricule. * * @param string $_string Matricule du salarié à vérifier. * @return array Résultat de la vérification contenant des messages d'erreur ou de succès. */ public static function checkSalarieByMatricule(string $_string) { db::query("SELECT " . "id, " . "nom, " . "prenom, " . "contrat, " . "actif " . "FROM " . DB_T_SALARIES . " " . "WHERE idLocal = :idLocal"); db::bind(':idLocal', intval($_string)); $salarie = db::single(); if (isset($salarie["id"])) { if ($salarie["actif"] == 0) { $return["error"] = "