connect_error) { error_log("Erreur connexion DB validateRequest: " . $conn->connect_error); echo json_encode(["success" => false, "message" => "Erreur de connexion à la base de données"]); exit(); } // Lecture du JSON envoyé $input = file_get_contents('php://input'); error_log("validateRequest - Input reçu: " . $input); $data = json_decode($input, true); if (!isset($data['request_id'], $data['action'], $data['validator_id'])) { error_log("validateRequest - Données manquantes: " . print_r($data, true)); echo json_encode([ "success" => false, "message" => "Données manquantes pour la validation" ]); exit(); } $requestId = (int)$data['request_id']; $action = $data['action']; // 'approve' ou 'reject' $validatorId = (int)$data['validator_id']; $comment = $data['comment'] ?? ''; error_log("validateRequest - Request ID: $requestId, Action: $action, Validator: $validatorId"); try { $conn->begin_transaction(); // Vérifier que la demande existe et est en attente $queryCheck = " SELECT dc.Id, dc.EmployeeId, dc.TypeCongeId, dc.DateDebut, dc.DateFin, dc.NombreJours, u.Nom, u.Prenom, tc.Nom as TypeNom FROM DemandeConge dc JOIN Users u ON dc.EmployeeId = u.ID JOIN TypeConge tc ON dc.TypeCongeId = tc.Id WHERE dc.Id = ? AND dc.Statut = 'En attente' "; $stmtCheck = $conn->prepare($queryCheck); $stmtCheck->bind_param("i", $requestId); $stmtCheck->execute(); $resultCheck = $stmtCheck->get_result(); if ($requestRow = $resultCheck->fetch_assoc()) { $employeeId = $requestRow['EmployeeId']; $typeCongeId = $requestRow['TypeCongeId']; $nombreJours = $requestRow['NombreJours']; $employeeName = $requestRow['Prenom'] . ' ' . $requestRow['Nom']; $typeNom = $requestRow['TypeNom']; error_log("validateRequest - Demande trouvée: $employeeName, Type: $typeNom, Jours: $nombreJours"); // Déterminer le nouveau statut $newStatus = ($action === 'approve') ? 'Validée' : 'Refusée'; // Mettre à jour la demande $queryUpdate = " UPDATE DemandeConge SET Statut = ?, ValidateurId = ?, DateValidation = NOW(), CommentaireValidation = ? WHERE Id = ? "; $stmtUpdate = $conn->prepare($queryUpdate); $stmtUpdate->bind_param("sisi", $newStatus, $validatorId, $comment, $requestId); if ($stmtUpdate->execute()) { error_log("validateRequest - Demande mise à jour avec succès"); // Si approuvée, déduire du solde (sauf pour congé maladie) if ($action === 'approve' && $typeNom !== 'Congé maladie') { // Déterminer l'année selon le type de congé $currentDate = new DateTime(); if ($typeNom === 'Congé payé') { // Exercice CP: 01/06 au 31/05 $year = ($currentDate->format('m') < 6) ? $currentDate->format('Y') - 1 : $currentDate->format('Y'); } else { // RTT: année civile $year = $currentDate->format('Y'); } error_log("validateRequest - Déduction solde: Type=$typeNom, Année=$year, Jours=$nombreJours"); // Déduire du solde $queryDeduct = " UPDATE CompteurConges SET Solde = GREATEST(0, Solde - ?) WHERE EmployeeId = ? AND TypeCongeId = ? AND Annee = ? "; $stmtDeduct = $conn->prepare($queryDeduct); $stmtDeduct->bind_param("diii", $nombreJours, $employeeId, $typeCongeId, $year); if ($stmtDeduct->execute()) { error_log("validateRequest - Solde déduit avec succès"); } else { error_log("validateRequest - Erreur déduction solde: " . $stmtDeduct->error); } $stmtDeduct->close(); } // Créer une notification pour l'employé $notificationTitle = ($action === 'approve') ? 'Demande approuvée' : 'Demande refusée'; $notificationMessage = "Votre demande de $typeNom a été " . (($action === 'approve') ? 'approuvée' : 'refusée'); if ($comment) { $notificationMessage .= ". Commentaire: $comment"; } $queryNotif = " INSERT INTO Notifications (UserId, Titre, Message, Type, DemandeCongeId) VALUES (?, ?, ?, ?, ?) "; $notifType = ($action === 'approve') ? 'Success' : 'Error'; $stmtNotif = $conn->prepare($queryNotif); $stmtNotif->bind_param("isssi", $employeeId, $notificationTitle, $notificationMessage, $notifType, $requestId); $stmtNotif->execute(); $stmtNotif->close(); // Log dans l'historique $actionText = ($action === 'approve') ? 'Validation congé' : 'Refus congé'; $actionDetails = "$actionText $employeeName ($typeNom)"; if ($comment) { $actionDetails .= " - $comment"; } $queryHistory = " INSERT INTO HistoriqueActions (UserId, Action, Details, DemandeCongeId) VALUES (?, ?, ?, ?) "; $stmtHistory = $conn->prepare($queryHistory); $stmtHistory->bind_param("issi", $validatorId, $actionText, $actionDetails, $requestId); $stmtHistory->execute(); $stmtHistory->close(); $conn->commit(); echo json_encode([ "success" => true, "message" => "Demande " . (($action === 'approve') ? 'approuvée' : 'refusée') . " avec succès", "new_status" => $newStatus ]); } else { throw new Exception("Erreur lors de la mise à jour: " . $stmtUpdate->error); } $stmtUpdate->close(); } else { throw new Exception("Demande non trouvée ou déjà traitée"); } $stmtCheck->close(); } catch (Exception $e) { $conn->rollback(); error_log("Erreur validateRequest: " . $e->getMessage()); echo json_encode([ "success" => false, "message" => "Erreur lors de la validation: " . $e->getMessage() ]); } $conn->close(); ?>