diff --git a/project/public/getAllTeamRequests.php b/project/public/getAllTeamRequests.php index 001ff29..efaf6dc 100644 --- a/project/public/getAllTeamRequests.php +++ b/project/public/getAllTeamRequests.php @@ -60,7 +60,7 @@ $stmt = $conn->prepare($sql); $stmt->bind_param("i", $managerId); $stmt->execute(); -// ✅ Manquant dans ton code +// Manquant dans ton code $result = $stmt->get_result(); $requests = []; diff --git a/project/public/getLeaveCounters.php b/project/public/getLeaveCounters.php index 4818ac3..61bc93b 100644 --- a/project/public/getLeaveCounters.php +++ b/project/public/getLeaveCounters.php @@ -1,278 +1,148 @@ connect_error) { echo json_encode(["success"=>false,"message"=>"Erreur DB: ".$conn->connect_error]); exit(); } -$host = "192.168.0.4"; -$dbname = "DemandeConge"; -$username = "wpuser"; -$password = "-2b/)ru5/Bi8P[7_"; +$userId = isset($_GET['user_id']) ? (int)$_GET['user_id'] : null; +if (!$userId) { echo json_encode(["success"=>false,"message"=>"user_id manquant"]); $conn->close(); exit(); } -// IMPORTANT: Changer ces paramètres pour votre configuration locale -// $host = "localhost"; -// $username = "root"; -// $password = ""; +function getLeaveYear($date=null){ $d=$date?new DateTime($date):new DateTime(); $y=(int)$d->format('Y'); return ((int)$d->format('m')<6)?$y-1:$y;} +function getRTTYear($date=null){ $d=$date?new DateTime($date):new DateTime(); return (int)$d->format('Y');} +function getWorkingDays($start,$end){ $c=new DateTime($start); $e=new DateTime($end); $days=0; while($c<=$e){ $n=(int)$c->format('N'); if($n<6) $days++; $c->modify('+1 day'); } return $days;} -// Crée une nouvelle connexion à la base de données -$conn = new mysqli($host, $username, $password, $dbname); +// Récupérer les typeIds utiles +function getTypeId($conn,$name){ $s=$conn->prepare("SELECT Id FROM TypeConge WHERE Nom=?"); $s->bind_param("s",$name); $s->execute(); $res=$s->get_result(); $id=null; if($r=$res->fetch_assoc()) $id=(int)$r['Id']; $s->close(); return $id; } +$cpTypeId = getTypeId($conn,'Congé payé'); +$rttTypeId = getTypeId($conn,'RTT'); +$absTypeId = getTypeId($conn,'Congé maladie'); -// Vérifie la connexion -if ($conn->connect_error) { - error_log("Erreur connexion DB getLeaveCounters: " . $conn->connect_error); - echo json_encode(["success" => false, "message" => "Erreur de connexion à la base de données : " . $conn->connect_error]); - exit(); +$leaveYear = getLeaveYear(); +$rttYear = getRTTYear(); +$currentDate = date('Y-m-d'); + +// --- Soldes initiaux (CompteurConges) restent inchangés --- +$cpSolde = 0; $rttSolde = 0; $absSolde = 0; +if ($cpTypeId !== null) { + $q="SELECT Solde FROM CompteurConges WHERE EmployeeId=? AND TypeCongeId=? AND Annee=?"; + $s=$conn->prepare($q); $s->bind_param("iii",$userId,$cpTypeId,$leaveYear); $s->execute(); $res=$s->get_result(); if($r=$res->fetch_assoc()) $cpSolde=$r['Solde']; $s->close(); +} +if ($rttTypeId !== null) { + $q="SELECT Solde FROM CompteurConges WHERE EmployeeId=? AND TypeCongeId=? AND Annee=?"; + $s=$conn->prepare($q); $s->bind_param("iii",$userId,$rttTypeId,$rttYear); $s->execute(); $res=$s->get_result(); if($r=$res->fetch_assoc()) $rttSolde=$r['Solde']; $s->close(); +} +if ($absTypeId !== null) { + $q="SELECT Solde FROM CompteurConges WHERE EmployeeId=? AND TypeCongeId=? AND Annee=?"; + $s=$conn->prepare($q); $s->bind_param("iii",$userId,$absTypeId,$rttYear); $s->execute(); $res=$s->get_result(); if($r=$res->fetch_assoc()) $absSolde=$r['Solde']; $s->close(); } -// Récupère l'ID utilisateur depuis les paramètres de requête GET -$userId = $_GET['user_id'] ?? null; - -error_log("=== DEBUT getLeaveCounters.php ==="); -error_log("getLeaveCounters - user_id reçu: " . ($userId ?? 'NULL')); -error_log("getLeaveCounters - Toutes les variables GET: " . print_r($_GET, true)); - -if ($userId === null) { - error_log("getLeaveCounters - user_id manquant"); - echo json_encode(["success" => false, "message" => "ID utilisateur manquant."]); - exit(); -} -// Fonction pour déterminer l'exercice des congés payés (01/06 au 31/05) -function getLeaveYear($date = null) { - if ($date === null) { - $date = new DateTime(); - } else { - $date = new DateTime($date); - } - - $currentYear = (int)$date->format('Y'); - $currentMonth = (int)$date->format('m'); - - // Si on est avant le 1er juin, l'exercice a commencé l'année précédente - if ($currentMonth < 6) { - return $currentYear - 1; - } - // Si on est le 1er juin ou après, l'exercice a commencé cette année - return $currentYear; -} - -// Fonction pour déterminer l'année RTT (01/01 au 31/12) -function getRTTYear($date = null) { - if ($date === null) { - $date = new DateTime(); - } else { - $date = new DateTime($date); - } - - return (int)$date->format('Y'); -} - -// Récupère l'ID utilisateur depuis les paramètres de requête GET -$userId = $_GET['user_id'] ?? null; - -if ($userId === null) { - echo json_encode(["success" => false, "message" => "ID utilisateur manquant."]); - exit(); -} - -// Calcul des exercices selon les règles de gestion -$leaveYear = getLeaveYear(); // Exercice CP (01/06 au 31/05) -$rttYear = getRTTYear(); // Exercice RTT (01/01 au 31/12) -$currentDate = date('Y-m-d'); // Date actuelle pour les filtres de demandes - -// Variables pour les soldes disponibles -$cpSolde = 0; -$rttSolde = 0; -$absSolde = 0; - -// Variables pour les demandes en cours/validées +// --- Calcul CP in process : priorité DemandeCongeType, fallback = working days on DemandeConge --- $cpInProcess = 0; -$rttInProcess = 0; -$absenteism = 0; - -// --- FONCTION UTILITAIRE POUR CALCULER LES JOURS OUVRÉS (hors week-ends) --- -function getWorkingDays($startDate, $endDate) { - $workingDays = 0; - $current = new DateTime($startDate); - $end = new DateTime($endDate); - - while ($current <= $end) { - $dayOfWeek = (int)$current->format('N'); // 1 (pour Lundi) à 7 (pour Dimanche) - if ($dayOfWeek < 6) { // Si ce n'est ni Samedi (6) ni Dimanche (7) - $workingDays++; +if ($cpTypeId !== null) { + $sql = " + SELECT dc.Id, dc.DateDebut, dc.DateFin, dct.NombreJours + FROM DemandeConge dc + LEFT JOIN DemandeCongeType dct + ON dct.DemandeCongeId = dc.Id AND dct.TypeCongeId = ? + WHERE dc.EmployeeId = ? + AND dc.Statut IN ('En attente','Validée') + AND dc.DateFin >= ? + AND (dct.NombreJours IS NOT NULL OR FIND_IN_SET(?, dc.TypeCongeId)) + "; + $s = $conn->prepare($sql); + $s->bind_param("iiss", $cpTypeId, $userId, $currentDate, $cpTypeId); + $s->execute(); + $res = $s->get_result(); + while ($r = $res->fetch_assoc()) { + if ($r['NombreJours'] !== null) { + $cpInProcess += (float)$r['NombreJours']; + } else { + $cpInProcess += getWorkingDays($r['DateDebut'], $r['DateFin']); } - $current->modify('+1 day'); } - return $workingDays; + $s->close(); } -// ------------------------------------------------------------------------- - -// --- Récupération du Solde de Congé Payé (CP) --- -$queryCPSolde = "SELECT cc.Solde FROM CompteurConges cc - JOIN TypeConge tc ON cc.TypeCongeId = tc.Id - WHERE cc.EmployeeId = ? AND tc.Nom = 'Congé payé' AND cc.Annee = ?"; -$stmtCPSolde = $conn->prepare($queryCPSolde); -if ($stmtCPSolde === false) { - error_log("Erreur de préparation de la requête CP Solde : " . $conn->error); -} else { - $stmtCPSolde->bind_param("ii", $userId, $leaveYear); - $stmtCPSolde->execute(); - $resultCPSolde = $stmtCPSolde->get_result(); - if ($rowCPSolde = $resultCPSolde->fetch_assoc()) { - $cpSolde = $rowCPSolde['Solde']; +// --- Calcul RTT in process (même logique) --- +$rttInProcess = 0; +if ($rttTypeId !== null) { + $sql = " + SELECT dc.Id, dc.DateDebut, dc.DateFin, dct.NombreJours + FROM DemandeConge dc + LEFT JOIN DemandeCongeType dct + ON dct.DemandeCongeId = dc.Id AND dct.TypeCongeId = ? + WHERE dc.EmployeeId = ? + AND dc.Statut IN ('En attente','Validée') + AND dc.DateFin >= ? + AND (dct.NombreJours IS NOT NULL OR FIND_IN_SET(?, dc.TypeCongeId)) + "; + $s = $conn->prepare($sql); + $s->bind_param("iiss", $rttTypeId, $userId, $currentDate, $rttTypeId); + $s->execute(); + $res = $s->get_result(); + while ($r = $res->fetch_assoc()) { + if ($r['NombreJours'] !== null) { + $rttInProcess += (float)$r['NombreJours']; + } else { + $rttInProcess += getWorkingDays($r['DateDebut'], $r['DateFin']); + } } - $stmtCPSolde->close(); + $s->close(); } -// --- Récupération du Solde de RTT --- -$queryRTTSolde = "SELECT cc.Solde FROM CompteurConges cc - JOIN TypeConge tc ON tc.Id = cc.TypeCongeId - WHERE cc.EmployeeId = ? AND tc.Nom = 'RTT' AND cc.Annee = ?"; -$stmtRTTSolde = $conn->prepare($queryRTTSolde); -if ($stmtRTTSolde === false) { - error_log("Erreur de préparation de la requête RTT Solde : " . $conn->error); -} else { - $stmtRTTSolde->bind_param("ii", $userId, $rttYear); - $stmtRTTSolde->execute(); - $resultRTTSolde = $stmtRTTSolde->get_result(); - if ($rowRTTSolde = $resultRTTSolde->fetch_assoc()) { - $rttSolde = $rowRTTSolde['Solde']; +// --- Calcul absenteisme (validation) : priorité DemandeCongeType, fallback = DATEDIFF+1 --- +$absenteism = 0; +if ($absTypeId !== null) { + $sql = " + SELECT dc.DateDebut, dc.DateFin, dct.NombreJours + FROM DemandeConge dc + LEFT JOIN DemandeCongeType dct + ON dct.DemandeCongeId = dc.Id AND dct.TypeCongeId = ? + WHERE dc.EmployeeId = ? + AND dc.Statut = 'Validée' + AND (dct.NombreJours IS NOT NULL OR FIND_IN_SET(?, dc.TypeCongeId)) + "; + $s = $conn->prepare($sql); + $s->bind_param("iii", $absTypeId, $userId, $absTypeId); + $s->execute(); + $res = $s->get_result(); + while ($r = $res->fetch_assoc()) { + if ($r['NombreJours'] !== null) { + $absenteism += (float)$r['NombreJours']; + } else { + // fallback : DATEDIFF + 1 + $d1 = new DateTime($r['DateDebut']); $d2 = new DateTime($r['DateFin']); + $absenteism += ($d2->diff($d1)->days + 1); + } } - $stmtRTTSolde->close(); + $s->close(); } -// --- Récupération du Solde de Congé Maladie (ABS) --- -$queryABSSolde = "SELECT cc.Solde FROM CompteurConges cc - JOIN TypeConge tc ON tc.Id = cc.TypeCongeId - WHERE cc.EmployeeId = ? AND tc.Nom = 'Congé maladie' AND cc.Annee = ?"; -$stmtABSSolde = $conn->prepare($queryABSSolde); -if ($stmtABSSolde === false) { - error_log("Erreur de préparation de la requête ABS Solde : " . $conn->error); -} else { - $stmtABSSolde->bind_param("ii", $userId, $rttYear); - $stmtABSSolde->execute(); - $resultABSSolde = $stmtABSSolde->get_result(); - if ($rowABSSolde = $resultABSSolde->fetch_assoc()) { - $absSolde = $rowABSSolde['Solde']; - } - $stmtABSSolde->close(); -} +$availableCPCalculated = max(0, $cpSolde - $cpInProcess); +$availableRTTCalculated = max(0, $rttSolde - $rttInProcess); - -// --- Calcul des Congés Payés (CP) en cours (demandes 'En attente' ou 'Validée' dont la fin est >= date actuelle) --- -// Cette requête sélectionne les dates pour le calcul en PHP -$queryCPInProcessDates = "SELECT dc.DateDebut, dc.DateFin FROM DemandeConge dc - JOIN TypeConge tc ON dc.TypeCongeId = tc.Id - WHERE dc.EmployeeId = ? - AND tc.Nom = 'Congé payé' - AND dc.Statut IN ('En attente', 'Validée') - AND dc.DateFin >= ?"; -$stmtCPInProcessDates = $conn->prepare($queryCPInProcessDates); -if ($stmtCPInProcessDates === false) { - error_log("Erreur de préparation de la requête CP en cours dates : " . $conn->error); -} else { - $stmtCPInProcessDates->bind_param("is", $userId, $currentDate); - $stmtCPInProcessDates->execute(); - $resultCPInProcessDates = $stmtCPInProcessDates->get_result(); - while ($row = $resultCPInProcessDates->fetch_assoc()) { - $cpInProcess += getWorkingDays($row['DateDebut'], $row['DateFin']); - } - $stmtCPInProcessDates->close(); -} - -// --- Calcul des RTT en cours (mêmes critères que CP, mais pour RTT) --- -$queryRTTInProcessDates = "SELECT dc.DateDebut, dc.DateFin FROM DemandeConge dc - JOIN TypeConge tc ON dc.TypeCongeId = tc.Id - WHERE dc.EmployeeId = ? - AND tc.Nom = 'RTT' - AND dc.Statut IN ('En attente', 'Validée') - AND dc.DateFin >= ?"; -$stmtRTTInProcessDates = $conn->prepare($queryRTTInProcessDates); -if ($stmtRTTInProcessDates === false) { - error_log("Erreur de préparation de la requête RTT en cours dates : " . $conn->error); -} else { - $stmtRTTInProcessDates->bind_param("is", $userId, $currentDate); - $stmtRTTInProcessDates->execute(); - $resultRTTInProcessDates = $stmtRTTInProcessDates->get_result(); - while ($row = $resultRTTInProcessDates->fetch_assoc()) { - $rttInProcess += getWorkingDays($row['DateDebut'], $row['DateFin']); - } - $stmtRTTInProcessDates->close(); -} - - -// --- Calcul des jours d'absence (ABS) (somme des jours DATEDIFF à partir de DemandeConge) --- -// Note: Ici, on ne modifie pas le calcul, car l'absentéisme maladie est souvent compté sur tous les jours, y compris week-ends, pour le suivi global. -// Si vous devez exclure les week-ends pour les ABS, appliquez getWorkingDays ici aussi. -$queryABSInProcess = "SELECT SUM(DATEDIFF(dc.DateFin, dc.DateDebut) + 1) AS total_abs FROM DemandeConge dc - JOIN TypeConge tc ON dc.TypeCongeId = tc.Id - WHERE dc.EmployeeId = ? - AND tc.Nom = 'Congé maladie' - AND dc.Statut = 'Validée'"; -$stmtABSInProcess = $conn->prepare($queryABSInProcess); -if ($stmtABSInProcess === false) { - error_log("Erreur de préparation de la requête ABS en cours : " . $conn->error); -} else { - $stmtABSInProcess->bind_param("i", $userId); - $stmtABSInProcess->execute(); - $resultABSInProcess = $stmtABSInProcess->get_result(); - if ($rowABSInProcess = $resultABSInProcess->fetch_assoc()) { - $absenteism = $rowABSInProcess['total_abs'] ?? 0; - } - $stmtABSInProcess->close(); -} - -// --- Calcul des soldes disponibles réels (déduction "douce" pour l'affichage/validation frontend) --- -$availableCPCalculated = $cpSolde - $cpInProcess; -if ($availableCPCalculated < 0) { - $availableCPCalculated = 0; -} - -$availableRTTCalculated = $rttSolde - $rttInProcess; -if ($availableRTTCalculated < 0) { - $availableRTTCalculated = 0; -} - - -// Renvoie les compteurs sous format JSON echo json_encode([ - "success" => true, - "message" => "Compteurs récupérés avec succès.", - "counters" => [ - "availableCP" => (int)$availableCPCalculated, // CP: Solde brut - jours ouvrés en cours/validés futurs - "availableRTT" => (int)$availableRTTCalculated, // RTT: Solde brut - jours ouvrés en cours/validés futurs - "availableABS" => (int)$absSolde, // ABS: Solde brut (sans déduction des jours en cours) - "rttInProcess" => (int)$rttInProcess, // RTT: Jours ouvrés en attente/validés futurs (pour information) - "absenteism" => (int)$absenteism // ABS: Jours d'absence maladie validés/pris (pour information) - ], - "debug_values" => [ - "initial_cp_solde" => (int)$cpSolde, - "cp_en_cours" => (int)$cpInProcess, - "calculated_available_cp" => (int)$availableCPCalculated, - "initial_rtt_solde" => (int)$rttSolde, - "rtt_en_cours" => (int)$rttInProcess, - "calculated_available_rtt" => (int)$availableRTTCalculated, - "leave_year" => $leaveYear, - "rtt_year" => $rttYear, - "current_date_php" => $currentDate, - "user_id_php" => (int)$userId - ] + "success" => true, + "message" => "Compteurs récupérés avec succès.", + "counters" => [ + "availableCP" => (int)$availableCPCalculated, + "availableRTT" => (int)$availableRTTCalculated, + "availableABS" => (int)$absSolde, + "rttInProcess" => (int)$rttInProcess, + "absenteism" => (int)$absenteism + ], + "debug" => [ + "cpSolde"=>$cpSolde,"cpInProcess"=>$cpInProcess, + "rttSolde"=>$rttSolde,"rttInProcess"=>$rttInProcess, + "absSolde"=>$absSolde,"absenteism"=>$absenteism + ] ]); $conn->close(); -?> \ No newline at end of file +?> diff --git a/project/public/getRequests.php b/project/public/getRequests.php index 5f26ada..79fdf10 100644 --- a/project/public/getRequests.php +++ b/project/public/getRequests.php @@ -1,5 +1,5 @@ connect_error) { - error_log("Erreur connexion DB getRequests: " . $conn->connect_error); - echo json_encode(["success" => false, "message" => "Erreur de connexion à la base de données : " . $conn->connect_error]); + echo json_encode(["success" => false, "message" => "Erreur connexion DB: " . $conn->connect_error]); exit(); } +// Récup paramètre $userId = $_GET['user_id'] ?? null; - -error_log("=== DEBUT getRequests.php ==="); -error_log("getRequests - user_id reçu: " . ($userId ?? 'NULL')); -error_log("getRequests - Toutes les variables GET: " . print_r($_GET, true)); - -if ($userId === null) { - error_log("getRequests - user_id manquant"); - echo json_encode(["success" => false, "message" => "ID utilisateur manquant."]); +if (!$userId) { + echo json_encode(["success" => false, "message" => "ID utilisateur manquant"]); exit(); } -$checkUserQuery = "SELECT ID, Nom, Prenom FROM Users WHERE ID = ?"; -$checkUserStmt = $conn->prepare($checkUserQuery); -if ($checkUserStmt) { - $checkUserStmt->bind_param("i", $userId); - $checkUserStmt->execute(); - $userResult = $checkUserStmt->get_result(); - if ($userRow = $userResult->fetch_assoc()) { - error_log("getRequests - Utilisateur trouvé: " . $userRow['Prenom'] . " " . $userRow['Nom']); - } else { - error_log("getRequests - ATTENTION: Utilisateur ID $userId non trouvé dans la table Users"); - } - $checkUserStmt->close(); -} - +// Fonction jours ouvrés function getWorkingDays($startDate, $endDate) { $workingDays = 0; $current = new DateTime($startDate); @@ -69,6 +51,7 @@ function getWorkingDays($startDate, $endDate) { } try { + // Requête multi-types $query = " SELECT dc.Id, @@ -78,17 +61,20 @@ try { dc.DateDemande, dc.Commentaire, dc.Validateur, - dc.DocumentJoint, -- 👈 CHAMP AJOUTÉ ICI - tc.Nom as TypeConge + dc.DocumentJoint, + GROUP_CONCAT(tc.Nom ORDER BY tc.Nom SEPARATOR ', ') AS TypeConges FROM DemandeConge dc - JOIN TypeConge tc ON dc.TypeCongeId = tc.Id + JOIN TypeConge tc ON FIND_IN_SET(tc.Id, dc.TypeCongeId) WHERE dc.EmployeeId = ? + GROUP BY + dc.Id, dc.DateDebut, dc.DateFin, dc.Statut, dc.DateDemande, + dc.Commentaire, dc.Validateur, dc.DocumentJoint ORDER BY dc.DateDemande DESC "; $stmt = $conn->prepare($query); - if ($stmt === false) { - throw new Exception("Erreur de préparation de la requête : " . $conn->error); + if (!$stmt) { + throw new Exception("Erreur préparation SQL : " . $conn->error); } $stmt->bind_param("i", $userId); @@ -96,43 +82,27 @@ try { $result = $stmt->get_result(); $requests = []; - while ($row = $result->fetch_assoc()) { $workingDays = getWorkingDays($row['DateDebut'], $row['DateFin']); - $displayType = $row['TypeConge']; - switch ($row['TypeConge']) { - case 'Congé payé': - $displayType = 'Congés payés'; - break; - case 'RTT': - $displayType = 'RTT'; - break; - case 'Congé maladie': - $displayType = 'Congé maladie'; - break; - } - + // Format dates $startDate = new DateTime($row['DateDebut']); $endDate = new DateTime($row['DateFin']); $submittedDate = new DateTime($row['DateDemande']); - if ($row['DateDebut'] === $row['DateFin']) { - $dateDisplay = $startDate->format('d/m/Y'); - } else { - $dateDisplay = $startDate->format('d/m/Y') . ' - ' . $endDate->format('d/m/Y'); - } + $dateDisplay = ($row['DateDebut'] === $row['DateFin']) + ? $startDate->format('d/m/Y') + : $startDate->format('d/m/Y') . ' - ' . $endDate->format('d/m/Y'); - // 👇 GÉNÉRATION DU LIEN VERS LE FICHIER + // Lien fichier si congé maladie $fileUrl = null; - if ($row['TypeConge'] === 'Congé maladie' && !empty($row['DocumentJoint'])) { - $fileName = basename($row['DocumentJoint']); - $fileUrl = 'http://localhost/GTA/project/uploads/'. $fileName; + if (strpos($row['TypeConges'], 'Congé maladie') !== false && !empty($row['DocumentJoint'])) { + $fileUrl = 'http://localhost/GTA/project/uploads/' . basename($row['DocumentJoint']); } $requests[] = [ 'id' => (int)$row['Id'], - 'type' => $displayType, + 'type' => $row['TypeConges'], // ex: "Congé payé, RTT" 'startDate' => $row['DateDebut'], 'endDate' => $row['DateFin'], 'dateDisplay' => $dateDisplay, @@ -142,26 +112,22 @@ try { 'submittedAt' => $row['DateDemande'], 'submittedDisplay' => $submittedDate->format('d/m/Y'), 'validator' => $row['Validateur'] ?: null, - 'fileUrl' => $fileUrl + 'fileUrl' => $fileUrl ]; } - $stmt->close(); - echo json_encode([ "success" => true, - "message" => "Demandes récupérées avec succès.", + "message" => "Demandes récupérées avec succès", "requests" => $requests, "total" => count($requests) ]); } catch (Exception $e) { - error_log("Erreur récupération demandes : " . $e->getMessage()); echo json_encode([ "success" => false, - "message" => "Erreur lors de la récupération des demandes : " . $e->getMessage() + "message" => "Erreur: " . $e->getMessage() ]); } $conn->close(); -?> diff --git a/project/public/login.php b/project/public/login.php index 2db287c..af75631 100644 --- a/project/public/login.php +++ b/project/public/login.php @@ -3,7 +3,6 @@ header("Access-Control-Allow-Origin: *"); header("Access-Control-Allow-Methods: POST, OPTIONS"); header("Access-Control-Allow-Headers: Content-Type"); -// Gère la requête OPTIONS (pré-vol CORS) if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { http_response_code(200); exit(); @@ -16,42 +15,44 @@ $dbname = "DemandeConge"; $username = "wpuser"; $password = "-2b/)ru5/Bi8P[7_"; -// Crée une nouvelle connexion à la base de données $conn = new mysqli($host, $username, $password, $dbname); -// Vérifie la connexion if ($conn->connect_error) { - // En cas d'erreur de connexion, renvoie un JSON d'échec die(json_encode(["success" => false, "message" => "Erreur de connexion à la base de données : " . $conn->connect_error])); } -// Récupère les données JSON envoyées via la requête POST $data = json_decode(file_get_contents('php://input'), true); $email = $data['email'] ?? ''; $mot_de_passe = $data['mot_de_passe'] ?? ''; +$query = " + SELECT + u.ID, + u.Prenom, + u.Nom, + u.Email, + u.Role, + u.ServiceId, + s.Nom AS ServiceNom + FROM Users u + LEFT JOIN Services s ON u.ServiceId = s.Id + WHERE u.Email = ? AND u.MDP = ? +"; -$query = "SELECT ID, Prenom, Nom, Email, Role FROM Users WHERE Email = ? AND MDP = ?"; $stmt = $conn->prepare($query); -// Vérifie si la préparation de la requête a réussi if ($stmt === false) { die(json_encode(["success" => false, "message" => "Erreur de préparation de la requête : " . $conn->error])); } -// Lie les paramètres (ss = string, string pour email et mot_de_passe) $stmt->bind_param("ss", $email, $mot_de_passe); $stmt->execute(); -// Récupère le résultat de la requête $result = $stmt->get_result(); -// Vérifie si un utilisateur correspondant a été trouvé if ($result->num_rows === 1) { - // Récupère la ligne de l'utilisateur sous forme de tableau associatif $user = $result->fetch_assoc(); - // Renvoie une réponse JSON de succès avec les données de l'utilisateur echo json_encode([ "success" => true, "message" => "Connexion réussie.", @@ -60,15 +61,14 @@ if ($result->num_rows === 1) { "prenom" => $user['Prenom'], "nom" => $user['Nom'], "email" => $user['Email'], - "role" => $user['Role'] + "role" => $user['Role'], + "service" => $user['ServiceNom'] ?? 'Non défini' ] ]); } else { - // Renvoie une réponse JSON d'échec si les identifiants sont incorrects echo json_encode(["success" => false, "message" => "Identifiants incorrects."]); } -// Ferme la connexion à la base de données $stmt->close(); $conn->close(); -?> \ No newline at end of file +?> diff --git a/project/public/submitLeaveRequest.php b/project/public/submitLeaveRequest.php index bcb819c..1a30e18 100644 --- a/project/public/submitLeaveRequest.php +++ b/project/public/submitLeaveRequest.php @@ -1,181 +1,100 @@ connect_error) { echo json_encode(["success"=>false,"message"=>"Erreur DB: ".$conn->connect_error]); exit(); } -// Connexion -$conn = new mysqli($host, $username, $password, $dbname); -if ($conn->connect_error) { - error_log("Erreur connexion DB submitLeaveRequest: " . $conn->connect_error); - echo json_encode([ - "success" => false, - "message" => "Erreur de connexion DB : " . $conn->connect_error - ]); - exit(); +// Lecture JSON (support FormData via $_POST['data']) +if (isset($_POST['data'])) { + $data = json_decode($_POST['data'], true); +} else { + $input = file_get_contents('php://input'); + $data = json_decode($input, true); +} +if ($data === null) { + echo json_encode(["success"=>false,"message"=>"JSON invalide"]); $conn->close(); exit(); } -// Lecture du JSON envoyé -$input = file_get_contents('php://input'); -error_log("submitLeaveRequest - Input reçu: " . $input); - -$data = json_decode($input, true); - -if (!isset( - $data['EmployeeId'], - $data['TypeConge'], - $data['DateDebut'], - $data['DateFin'], - $data['NumDays'] -)) { - error_log("submitLeaveRequest - Données manquantes: " . print_r($data, true)); - echo json_encode([ - "success" => false, - "message" => "Données manquantes pour la demande de congé." - ]); - exit(); +// Vérifs minimales +if (!isset($data['EmployeeId'],$data['DateDebut'],$data['DateFin'],$data['Repartition'],$data['NombreJours'])) { + echo json_encode(["success"=>false,"message"=>"Données manquantes"]); $conn->close(); exit(); } -// Récupération des champs -$employeeId = (int) $data['EmployeeId']; -$typeCongeNom= $data['TypeConge']; -$dateDebut = $data['DateDebut']; -$dateFin = $data['DateFin']; -$commentaire = $data['Commentaire'] ?? ''; -$numDays = (int) $data['NumDays']; - -error_log("submitLeaveRequest - Données parsées: EmployeeId=$employeeId, Type=$typeCongeNom, Début=$dateDebut, Fin=$dateFin"); - +$employeeId = (int)$data['EmployeeId']; +$dateDebut = $data['DateDebut']; +$dateFin = $data['DateFin']; +$commentaire= $data['Commentaire'] ?? ''; +$numDays = (float)$data['NombreJours']; $statut = 'En attente'; -$validateur = null; -$currentDate= date('Y-m-d H:i:s'); // date complète pour DateDemande +$currentDate= date('Y-m-d H:i:s'); -// Mapping frontend → DB -switch ($typeCongeNom) { - case 'CP': $dbTypeCongeName = 'Congé payé'; break; - case 'RTT': $dbTypeCongeName = 'RTT'; break; - case 'ABS': $dbTypeCongeName = 'Congé maladie'; break; - default: - error_log("submitLeaveRequest - Type de congé inconnu: $typeCongeNom"); - echo json_encode([ - "success" => false, - "message" => "Type de congé inconnu." - ]); - $conn->close(); - exit(); +// 1) Construire la liste d'IDs pour TypeCongeId (CSV) (compatibilité) +$typeIds = []; +foreach ($data['Repartition'] as $rep) { + $code = $rep['TypeConge']; // CP, RTT, ABS ou texte libre + switch ($code) { + case 'CP': $name = 'Congé payé'; break; + case 'RTT': $name = 'RTT'; break; + case 'ABS': $name = 'Congé maladie'; break; + default: $name = $code; break; + } + $s = $conn->prepare("SELECT Id FROM TypeConge WHERE Nom = ?"); + $s->bind_param("s", $name); + $s->execute(); + $res = $s->get_result(); + if ($r = $res->fetch_assoc()) $typeIds[] = $r['Id']; + $s->close(); +} +if (empty($typeIds)) { echo json_encode(["success"=>false,"message"=>"Aucun type valide"]); $conn->close(); exit(); } +$typeCongeIdCsv = implode(',', $typeIds); + +// 2) Insertion unique dans DemandeConge +$insert = $conn->prepare("INSERT INTO DemandeConge (EmployeeId, DateDebut, DateFin, TypeCongeId, Statut, DateDemande, Commentaire, Validateur, NombreJours) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"); +$validParam = ''; +$insert->bind_param("isssssssd", $employeeId, $dateDebut, $dateFin, $typeCongeIdCsv, $statut, $currentDate, $commentaire, $validParam, $numDays); +if (!$insert->execute()) { + echo json_encode(["success"=>false,"message"=>"Erreur insert DemandeConge: ".$insert->error]); + $insert->close(); $conn->close(); exit(); +} +$demandeId = $conn->insert_id; +$insert->close(); + +// 3) INSÉRER la répartition réelle dans DemandeCongeType (une ligne par type) +$insertType = $conn->prepare("INSERT INTO DemandeCongeType (DemandeCongeId, TypeCongeId, NombreJours) VALUES (?, ?, ?)"); +if (!$insertType) { + echo json_encode(["success"=>false,"message"=>"Erreur préparation DemandeCongeType: ".$conn->error]); $conn->close(); exit(); } -error_log("submitLeaveRequest - Type DB mappé: $dbTypeCongeName"); +foreach ($data['Repartition'] as $rep) { + $code = $rep['TypeConge']; + $jours = (float)$rep['NombreJours']; -// Récupération de l'ID du type de congé -$stmt = $conn->prepare("SELECT Id FROM TypeConge WHERE Nom = ?"); -if (!$stmt) { - error_log("submitLeaveRequest - Erreur préparation requête TypeConge: " . $conn->error); - echo json_encode([ - "success" => false, - "message" => "Erreur préparation requête TypeConge" - ]); - $conn->close(); - exit(); + switch ($code) { + case 'CP': $name = 'Congé payé'; break; + case 'RTT': $name = 'RTT'; break; + case 'ABS': $name = 'Congé maladie'; break; + default: $name = $code; break; + } + $s = $conn->prepare("SELECT Id FROM TypeConge WHERE Nom = ?"); + $s->bind_param("s", $name); + $s->execute(); + $res = $s->get_result(); + if ($r = $res->fetch_assoc()) { + $typeId = (int)$r['Id']; + $insertType->bind_param("iid", $demandeId, $typeId, $jours); // i,i,d + $insertType->execute(); + } + $s->close(); } +$insertType->close(); -$stmt->bind_param("s", $dbTypeCongeName); -$stmt->execute(); -$res = $stmt->get_result(); -if ($row = $res->fetch_assoc()) { - $typeCongeId = (int) $row['Id']; - error_log("submitLeaveRequest - TypeCongeId trouvé: $typeCongeId"); -} else { - error_log("submitLeaveRequest - Type de congé non trouvé en DB: $dbTypeCongeName"); - echo json_encode([ - "success" => false, - "message" => "Type de congé non trouvé en DB : $dbTypeCongeName" - ]); - $stmt->close(); - $conn->close(); - exit(); -} -$stmt->close(); - -// Requête d'insertion dans DemandeConge -$query = " - INSERT INTO DemandeConge - (EmployeeId, DateDebut, DateFin, TypeCongeId, Statut, DateDemande, Commentaire, Validateur, NombreJours) - VALUES - (?, ?, ?, ?, ?, ?, ?, ?, ?) -"; - -error_log("submitLeaveRequest - Requête d'insertion: $query"); - -// Préparation de la requête -$stmt = $conn->prepare($query); -if (!$stmt) { - error_log("Erreur prepare insert : " . $conn->error); - echo json_encode([ - "success" => false, - "message" => "Erreur interne lors de la préparation de la requête." - ]); - $conn->close(); - exit(); -} - -// Pour la colonne Validateur, on passe '' si null -$validParam = $validateur ?? ''; - -error_log("submitLeaveRequest - Paramètres bind: $employeeId, $dateDebut, $dateFin, $typeCongeId, $statut, $currentDate, $commentaire, $validParam, $numDays"); - -// Bind des paramètres (types : i=integer, s=string, d=decimal) -$stmt->bind_param( - "ississssi", - $employeeId, // i - $dateDebut, // s - $dateFin, // s - $typeCongeId, // i - $statut, // s - $currentDate, // s - DateDemande - $commentaire, // s - $validParam, // s - $numDays // i - NombreJours -); - -// Exécution -if ($stmt->execute()) { - $insertId = $conn->insert_id; - error_log("submitLeaveRequest - Insertion réussie, ID: $insertId"); - echo json_encode([ - "success" => true, - "message" => "Demande de congé soumise avec succès.", - "request_id" => $insertId - ]); -} else { - error_log("Erreur execute insert : " . $stmt->error); - echo json_encode([ - "success" => false, - "message" => "Erreur lors de l'enregistrement : " . $stmt->error - ]); -} - -$stmt->close(); +echo json_encode(["success"=>true,"message"=>"Demande soumise", "request_id"=>$demandeId]); $conn->close(); - -error_log("submitLeaveRequest - Script terminé"); - ?> diff --git a/project/src/components/Sidebar.jsx b/project/src/components/Sidebar.jsx index 568d92f..dabd958 100644 --- a/project/src/components/Sidebar.jsx +++ b/project/src/components/Sidebar.jsx @@ -1,6 +1,6 @@ import React from 'react'; import { Link, useLocation } from 'react-router-dom'; -import { LogOut, Calendar, Home, FileText, Building2, Menu, X, Users } from 'lucide-react'; +import { LogOut, Calendar, Home, FileText, Building2, X, Users } from 'lucide-react'; import { useAuth } from '../context/AuthContext'; const Sidebar = ({ isOpen, onToggle }) => { @@ -9,9 +9,19 @@ const Sidebar = ({ isOpen, onToggle }) => { const isActive = (path) => location.pathname === path; + const getRoleBadgeClass = (role) => { + switch (role) { + case 'Admin': + return 'bg-red-100 text-red-800'; + case 'Manager': + return 'bg-green-100 text-green-800'; + default: + return 'bg-blue-100 text-blue-800'; + } + }; + return ( <> - {/* Mobile overlay */} {isOpen && (
{user?.name || "Utilisateur"}
-{user?.department || "Service"}
- - Employé - ++ {user?.name || "Utilisateur"} +
++ {user?.service || "Service non défini"} +
+ {user?.role && ( + + {user.role} + + )}Gérez toutes vos demandes de congés
+Gérez toutes vos demandes de congés
+| Type | -Dates | -Jours | -Statut | -Soumis | -Actions | -||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {request.type} | -{request.dateDisplay} | -{request.days} | -
-
+ <>
+ {/* Desktop table */}
+
+
+
+ {/* Mobile cards */}
+
+ {currentRequests.map(request => (
+
+
+
+
+
+ {request.type.split(',').map((t, i) => (
+
+ {t.trim()}
+
+ ))}
+
+ {request.dateDisplay} +{request.days} jour{request.days > 1 ? 's' : ''} +
+
{request.status}
- |
- {request.submittedDisplay} | -
- |
-
Type
-{selectedRequest.type}
-Dates
-{selectedRequest.dateDisplay}
-Nombre de jours
-{selectedRequest.days}
-Statut
- - {selectedRequest.status} - -Motif
-{selectedRequest.reason}
+Type
+{selectedRequest.type}
Nombre de jours
+{selectedRequest.days}
+Statut
+ + {selectedRequest.status} + +Motif
+{selectedRequest.reason}
+Arrêt maladie
+ +Type
+{selectedRequest.type}
+Dates
+{selectedRequest.dateDisplay}
+Nombre de jours
+{selectedRequest.days}
+Statut
+ + {selectedRequest.status} + +Motif
+{selectedRequest.reason}
+Arrêt maladie
+ +