revert affichage du bloc détails de la demande
This commit is contained in:
2025-08-11 14:55:59 +02:00
parent 4a3cded08c
commit f5ee031efc
4 changed files with 535 additions and 4 deletions

View File

@@ -0,0 +1,197 @@
<?php
// Validation/Refus d'une demande de congé par un manager
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: POST, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type");
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
http_response_code(200);
exit();
}
header("Content-Type: application/json");
// Log des erreurs pour debug
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$host = "192.168.0.4";
$dbname = "DemandeConge";
$username = "wpuser";
$password = "-2b/)ru5/Bi8P[7_";
$conn = new mysqli($host, $username, $password, $dbname);
if ($conn->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();
?>