Ajoutez des fichiers projet.
This commit is contained in:
BIN
project/public/assets/ImageEnsup.png
Normal file
BIN
project/public/assets/ImageEnsup.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.4 MiB |
BIN
project/public/assets/Logo.png
Normal file
BIN
project/public/assets/Logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.8 KiB |
BIN
project/public/assets/Logo_Ensitech.png
Normal file
BIN
project/public/assets/Logo_Ensitech.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 28 KiB |
BIN
project/public/assets/utilisateur.png
Normal file
BIN
project/public/assets/utilisateur.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 11 KiB |
156
project/public/getAllTeamRequests.php
Normal file
156
project/public/getAllTeamRequests.php
Normal file
@@ -0,0 +1,156 @@
|
||||
<?php
|
||||
// Récupération des demandes en attente pour un manager
|
||||
header("Access-Control-Allow-Origin: *");
|
||||
header("Access-Control-Allow-Methods: GET, 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 getPendingRequests: " . $conn->connect_error);
|
||||
echo json_encode(["success" => false, "message" => "Erreur de connexion à la base de données"]);
|
||||
exit();
|
||||
}
|
||||
|
||||
$managerId = $_GET['manager_id'] ?? null;
|
||||
|
||||
if ($managerId === null) {
|
||||
echo json_encode(["success" => false, "message" => "ID manager manquant"]);
|
||||
exit();
|
||||
}
|
||||
|
||||
error_log("getPendingRequests - Manager ID: $managerId");
|
||||
|
||||
// Fonction pour calculer les jours ouvrés
|
||||
function getWorkingDays($startDate, $endDate) {
|
||||
$workingDays = 0;
|
||||
$current = new DateTime($startDate);
|
||||
$end = new DateTime($endDate);
|
||||
|
||||
while ($current <= $end) {
|
||||
$dayOfWeek = (int)$current->format('N');
|
||||
if ($dayOfWeek < 6) {
|
||||
$workingDays++;
|
||||
}
|
||||
$current->modify('+1 day');
|
||||
}
|
||||
return $workingDays;
|
||||
}
|
||||
|
||||
try {
|
||||
// D'abord, récupérer le service du manager
|
||||
$queryManagerService = "SELECT ServiceId FROM Users WHERE ID = ?";
|
||||
$stmtManager = $conn->prepare($queryManagerService);
|
||||
$stmtManager->bind_param("i", $managerId);
|
||||
$stmtManager->execute();
|
||||
$resultManager = $stmtManager->get_result();
|
||||
|
||||
if ($managerRow = $resultManager->fetch_assoc()) {
|
||||
$serviceId = $managerRow['ServiceId'];
|
||||
error_log("getPendingRequests - Service ID du manager: $serviceId");
|
||||
|
||||
// Récupérer les demandes en attente de l'équipe
|
||||
$queryRequests = "
|
||||
SELECT
|
||||
dc.Id,
|
||||
dc.DateDebut,
|
||||
dc.DateFin,
|
||||
dc.Statut,
|
||||
dc.DateDemande,
|
||||
dc.Commentaire,
|
||||
dc.EmployeeId,
|
||||
CONCAT(u.Prenom, ' ', u.Nom) as employee_name,
|
||||
u.Email as employee_email,
|
||||
tc.Nom as type
|
||||
FROM DemandeConge dc
|
||||
JOIN Users u ON dc.EmployeeId = u.ID
|
||||
JOIN TypeConge tc ON dc.TypeCongeId = tc.Id
|
||||
WHERE u.ServiceId = ?
|
||||
AND dc.Statut = 'En attente'
|
||||
AND u.ID != ?
|
||||
ORDER BY dc.DateDemande ASC
|
||||
";
|
||||
|
||||
$stmtRequests = $conn->prepare($queryRequests);
|
||||
$stmtRequests->bind_param("ii", $serviceId, $managerId);
|
||||
$stmtRequests->execute();
|
||||
$resultRequests = $stmtRequests->get_result();
|
||||
|
||||
$requests = [];
|
||||
while ($row = $resultRequests->fetch_assoc()) {
|
||||
$workingDays = getWorkingDays($row['DateDebut'], $row['DateFin']);
|
||||
|
||||
$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');
|
||||
}
|
||||
|
||||
$requests[] = [
|
||||
'id' => (int)$row['Id'],
|
||||
'employee_id' => (int)$row['EmployeeId'],
|
||||
'employee_name' => $row['employee_name'],
|
||||
'employee_email' => $row['employee_email'],
|
||||
'type' => $row['type'],
|
||||
'start_date' => $row['DateDebut'],
|
||||
'end_date' => $row['DateFin'],
|
||||
'date_display' => $dateDisplay,
|
||||
'days' => $workingDays,
|
||||
'status' => $row['Statut'],
|
||||
'reason' => $row['Commentaire'] ?: '',
|
||||
'submitted_at' => $row['DateDemande'],
|
||||
'submitted_display' => $submittedDate->format('d/m/Y')
|
||||
];
|
||||
}
|
||||
|
||||
error_log("getPendingRequests - Demandes en attente trouvées: " . count($requests));
|
||||
|
||||
echo json_encode([
|
||||
"success" => true,
|
||||
"message" => "Demandes en attente récupérées avec succès",
|
||||
"requests" => $requests,
|
||||
"service_id" => $serviceId
|
||||
]);
|
||||
|
||||
$stmtRequests->close();
|
||||
} else {
|
||||
error_log("getPendingRequests - Manager non trouvé: $managerId");
|
||||
echo json_encode([
|
||||
"success" => false,
|
||||
"message" => "Manager non trouvé"
|
||||
]);
|
||||
}
|
||||
|
||||
$stmtManager->close();
|
||||
|
||||
} catch (Exception $e) {
|
||||
error_log("Erreur getPendingRequests: " . $e->getMessage());
|
||||
echo json_encode([
|
||||
"success" => false,
|
||||
"message" => "Erreur lors de la récupération des demandes: " . $e->getMessage()
|
||||
]);
|
||||
}
|
||||
|
||||
$conn->close();
|
||||
?>
|
||||
278
project/public/getLeaveCounters.php
Normal file
278
project/public/getLeaveCounters.php
Normal file
@@ -0,0 +1,278 @@
|
||||
<?php
|
||||
// Récupération des compteurs de congés avec gestion des exercices
|
||||
// Exercice CP: 01/06 au 31/05 | Exercice RTT: 01/01 au 31/12
|
||||
|
||||
header("Access-Control-Allow-Origin: *");
|
||||
header("Access-Control-Allow-Methods: GET, 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();
|
||||
}
|
||||
|
||||
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_";
|
||||
|
||||
// IMPORTANT: Changer ces paramètres pour votre configuration locale
|
||||
// $host = "localhost";
|
||||
// $username = "root";
|
||||
// $password = "";
|
||||
|
||||
// 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) {
|
||||
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();
|
||||
}
|
||||
|
||||
// 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
|
||||
$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++;
|
||||
}
|
||||
$current->modify('+1 day');
|
||||
}
|
||||
return $workingDays;
|
||||
}
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
|
||||
// --- 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'];
|
||||
}
|
||||
$stmtCPSolde->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'];
|
||||
}
|
||||
$stmtRTTSolde->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();
|
||||
}
|
||||
|
||||
|
||||
// --- 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
|
||||
]
|
||||
]);
|
||||
|
||||
$conn->close();
|
||||
?>
|
||||
156
project/public/getPendingRequests.php
Normal file
156
project/public/getPendingRequests.php
Normal file
@@ -0,0 +1,156 @@
|
||||
<?php
|
||||
// Récupération des demandes en attente pour un manager
|
||||
header("Access-Control-Allow-Origin: *");
|
||||
header("Access-Control-Allow-Methods: GET, 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 getPendingRequests: " . $conn->connect_error);
|
||||
echo json_encode(["success" => false, "message" => "Erreur de connexion à la base de données"]);
|
||||
exit();
|
||||
}
|
||||
|
||||
$managerId = $_GET['manager_id'] ?? null;
|
||||
|
||||
if ($managerId === null) {
|
||||
echo json_encode(["success" => false, "message" => "ID manager manquant"]);
|
||||
exit();
|
||||
}
|
||||
|
||||
error_log("getPendingRequests - Manager ID: $managerId");
|
||||
|
||||
// Fonction pour calculer les jours ouvrés
|
||||
function getWorkingDays($startDate, $endDate) {
|
||||
$workingDays = 0;
|
||||
$current = new DateTime($startDate);
|
||||
$end = new DateTime($endDate);
|
||||
|
||||
while ($current <= $end) {
|
||||
$dayOfWeek = (int)$current->format('N');
|
||||
if ($dayOfWeek < 6) {
|
||||
$workingDays++;
|
||||
}
|
||||
$current->modify('+1 day');
|
||||
}
|
||||
return $workingDays;
|
||||
}
|
||||
|
||||
try {
|
||||
// D'abord, récupérer le service du manager
|
||||
$queryManagerService = "SELECT ServiceId FROM Users WHERE ID = ?";
|
||||
$stmtManager = $conn->prepare($queryManagerService);
|
||||
$stmtManager->bind_param("i", $managerId);
|
||||
$stmtManager->execute();
|
||||
$resultManager = $stmtManager->get_result();
|
||||
|
||||
if ($managerRow = $resultManager->fetch_assoc()) {
|
||||
$serviceId = $managerRow['ServiceId'];
|
||||
error_log("getPendingRequests - Service ID du manager: $serviceId");
|
||||
|
||||
// Récupérer les demandes en attente de l'équipe
|
||||
$queryRequests = "
|
||||
SELECT
|
||||
dc.Id,
|
||||
dc.DateDebut,
|
||||
dc.DateFin,
|
||||
dc.Statut,
|
||||
dc.DateDemande,
|
||||
dc.Commentaire,
|
||||
dc.EmployeeId,
|
||||
CONCAT(u.Prenom, ' ', u.Nom) as employee_name,
|
||||
u.Email as employee_email,
|
||||
tc.Nom as type
|
||||
FROM DemandeConge dc
|
||||
JOIN Users u ON dc.EmployeeId = u.ID
|
||||
JOIN TypeConge tc ON dc.TypeCongeId = tc.Id
|
||||
WHERE u.ServiceId = ?
|
||||
AND dc.Statut = 'En attente'
|
||||
AND u.ID != ?
|
||||
ORDER BY dc.DateDemande ASC
|
||||
";
|
||||
|
||||
$stmtRequests = $conn->prepare($queryRequests);
|
||||
$stmtRequests->bind_param("ii", $serviceId, $managerId);
|
||||
$stmtRequests->execute();
|
||||
$resultRequests = $stmtRequests->get_result();
|
||||
|
||||
$requests = [];
|
||||
while ($row = $resultRequests->fetch_assoc()) {
|
||||
$workingDays = getWorkingDays($row['DateDebut'], $row['DateFin']);
|
||||
|
||||
$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');
|
||||
}
|
||||
|
||||
$requests[] = [
|
||||
'id' => (int)$row['Id'],
|
||||
'employee_id' => (int)$row['EmployeeId'],
|
||||
'employee_name' => $row['employee_name'],
|
||||
'employee_email' => $row['employee_email'],
|
||||
'type' => $row['type'],
|
||||
'start_date' => $row['DateDebut'],
|
||||
'end_date' => $row['DateFin'],
|
||||
'date_display' => $dateDisplay,
|
||||
'days' => $workingDays,
|
||||
'status' => $row['Statut'],
|
||||
'reason' => $row['Commentaire'] ?: '',
|
||||
'submitted_at' => $row['DateDemande'],
|
||||
'submitted_display' => $submittedDate->format('d/m/Y')
|
||||
];
|
||||
}
|
||||
|
||||
error_log("getPendingRequests - Demandes en attente trouvées: " . count($requests));
|
||||
|
||||
echo json_encode([
|
||||
"success" => true,
|
||||
"message" => "Demandes en attente récupérées avec succès",
|
||||
"requests" => $requests,
|
||||
"service_id" => $serviceId
|
||||
]);
|
||||
|
||||
$stmtRequests->close();
|
||||
} else {
|
||||
error_log("getPendingRequests - Manager non trouvé: $managerId");
|
||||
echo json_encode([
|
||||
"success" => false,
|
||||
"message" => "Manager non trouvé"
|
||||
]);
|
||||
}
|
||||
|
||||
$stmtManager->close();
|
||||
|
||||
} catch (Exception $e) {
|
||||
error_log("Erreur getPendingRequests: " . $e->getMessage());
|
||||
echo json_encode([
|
||||
"success" => false,
|
||||
"message" => "Erreur lors de la récupération des demandes: " . $e->getMessage()
|
||||
]);
|
||||
}
|
||||
|
||||
$conn->close();
|
||||
?>
|
||||
195
project/public/getRequests.php
Normal file
195
project/public/getRequests.php
Normal file
@@ -0,0 +1,195 @@
|
||||
<?php
|
||||
// Récupération des demandes de congés avec gestion des exercices
|
||||
header("Access-Control-Allow-Origin: *");
|
||||
header("Access-Control-Allow-Methods: GET, 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();
|
||||
}
|
||||
|
||||
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_";
|
||||
|
||||
// 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) {
|
||||
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]);
|
||||
exit();
|
||||
}
|
||||
|
||||
// Récupère l'ID utilisateur depuis les paramètres de requête GET
|
||||
$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."]);
|
||||
exit();
|
||||
}
|
||||
|
||||
error_log("getRequests - Récupération pour user_id: $userId (type: " . gettype($userId) . ")");
|
||||
|
||||
// Vérifier si l'utilisateur existe
|
||||
$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 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 (Lundi) à 7 (Dimanche)
|
||||
if ($dayOfWeek < 6) { // Si ce n'est ni Samedi (6) ni Dimanche (7)
|
||||
$workingDays++;
|
||||
}
|
||||
$current->modify('+1 day');
|
||||
}
|
||||
return $workingDays;
|
||||
}
|
||||
|
||||
try {
|
||||
// Requête pour récupérer les demandes de l'utilisateur avec les informations du type de congé
|
||||
$query = "
|
||||
SELECT
|
||||
dc.Id,
|
||||
dc.DateDebut,
|
||||
dc.DateFin,
|
||||
dc.Statut,
|
||||
dc.DateDemande,
|
||||
dc.Commentaire,
|
||||
dc.Validateur,
|
||||
tc.Nom as TypeConge
|
||||
FROM DemandeConge dc
|
||||
JOIN TypeConge tc ON dc.TypeCongeId = tc.Id
|
||||
WHERE dc.EmployeeId = ?
|
||||
ORDER BY dc.DateDemande DESC
|
||||
";
|
||||
|
||||
error_log("getRequests - Requête SQL: $query");
|
||||
|
||||
$stmt = $conn->prepare($query);
|
||||
if ($stmt === false) {
|
||||
throw new Exception("Erreur de préparation de la requête : " . $conn->error);
|
||||
}
|
||||
|
||||
$stmt->bind_param("i", $userId);
|
||||
$stmt->execute();
|
||||
$result = $stmt->get_result();
|
||||
|
||||
error_log("getRequests - Nombre de résultats trouvés: " . $result->num_rows);
|
||||
|
||||
// Debug: Afficher toutes les demandes de la table pour cet utilisateur
|
||||
$debugQuery = "SELECT COUNT(*) as total FROM DemandeConge WHERE EmployeeId = ?";
|
||||
$debugStmt = $conn->prepare($debugQuery);
|
||||
if ($debugStmt) {
|
||||
$debugStmt->bind_param("i", $userId);
|
||||
$debugStmt->execute();
|
||||
$debugResult = $debugStmt->get_result();
|
||||
$debugRow = $debugResult->fetch_assoc();
|
||||
error_log("getRequests - Total demandes en DB pour user $userId: " . $debugRow['total']);
|
||||
$debugStmt->close();
|
||||
}
|
||||
|
||||
$requests = [];
|
||||
|
||||
while ($row = $result->fetch_assoc()) {
|
||||
error_log("getRequests - Traitement demande ID: " . $row['Id']);
|
||||
|
||||
// Calcul des jours ouvrés
|
||||
$workingDays = getWorkingDays($row['DateDebut'], $row['DateFin']);
|
||||
|
||||
// Mapping des types de congés pour l'affichage
|
||||
$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;
|
||||
}
|
||||
|
||||
// Formatage des dates pour l'affichage
|
||||
$startDate = new DateTime($row['DateDebut']);
|
||||
$endDate = new DateTime($row['DateFin']);
|
||||
$submittedDate = new DateTime($row['DateDemande']);
|
||||
|
||||
// Format d'affichage des dates
|
||||
if ($row['DateDebut'] === $row['DateFin']) {
|
||||
$dateDisplay = $startDate->format('d/m/Y');
|
||||
} else {
|
||||
$dateDisplay = $startDate->format('d/m/Y') . ' - ' . $endDate->format('d/m/Y');
|
||||
}
|
||||
|
||||
$requests[] = [
|
||||
'id' => (int)$row['Id'],
|
||||
'type' => $displayType,
|
||||
'startDate' => $row['DateDebut'],
|
||||
'endDate' => $row['DateFin'],
|
||||
'dateDisplay' => $dateDisplay,
|
||||
'days' => $workingDays,
|
||||
'status' => $row['Statut'],
|
||||
'reason' => $row['Commentaire'] ?: 'Aucun commentaire',
|
||||
'submittedAt' => $row['DateDemande'],
|
||||
'submittedDisplay' => $submittedDate->format('d/m/Y'),
|
||||
'validator' => $row['Validateur'] ?: null
|
||||
];
|
||||
}
|
||||
|
||||
$stmt->close();
|
||||
|
||||
error_log("getRequests - Demandes formatées: " . count($requests));
|
||||
error_log("getRequests - Détail des demandes: " . print_r($requests, true));
|
||||
error_log("=== FIN getRequests.php ===");
|
||||
|
||||
echo json_encode([
|
||||
"success" => true,
|
||||
"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()
|
||||
]);
|
||||
}
|
||||
|
||||
$conn->close();
|
||||
?>
|
||||
115
project/public/getTeamLeaves.php
Normal file
115
project/public/getTeamLeaves.php
Normal file
@@ -0,0 +1,115 @@
|
||||
<?php
|
||||
// Récupération des congés de l'équipe pour affichage dans le calendrier
|
||||
header("Access-Control-Allow-Origin: *");
|
||||
header("Access-Control-Allow-Methods: GET, 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 getTeamLeaves: " . $conn->connect_error);
|
||||
echo json_encode(["success" => false, "message" => "Erreur de connexion à la base de données"]);
|
||||
exit();
|
||||
}
|
||||
|
||||
$userId = $_GET['user_id'] ?? null;
|
||||
|
||||
if ($userId === null) {
|
||||
echo json_encode(["success" => false, "message" => "ID utilisateur manquant"]);
|
||||
exit();
|
||||
}
|
||||
|
||||
error_log("getTeamLeaves - User ID: $userId");
|
||||
|
||||
try {
|
||||
// Récupérer le service de l'utilisateur
|
||||
$queryUserService = "SELECT ServiceId FROM Users WHERE ID = ?";
|
||||
$stmtUser = $conn->prepare($queryUserService);
|
||||
$stmtUser->bind_param("i", $userId);
|
||||
$stmtUser->execute();
|
||||
$resultUser = $stmtUser->get_result();
|
||||
|
||||
if ($userRow = $resultUser->fetch_assoc()) {
|
||||
$serviceId = $userRow['ServiceId'];
|
||||
error_log("getTeamLeaves - Service ID: $serviceId");
|
||||
|
||||
// Récupérer les congés validés de l'équipe (même service)
|
||||
$queryLeaves = "
|
||||
SELECT
|
||||
dc.DateDebut as start_date,
|
||||
dc.DateFin as end_date,
|
||||
CONCAT(u.Prenom, ' ', u.Nom) as employee_name,
|
||||
tc.Nom as type,
|
||||
tc.CouleurHex as color
|
||||
FROM DemandeConge dc
|
||||
JOIN Users u ON dc.EmployeeId = u.ID
|
||||
JOIN TypeConge tc ON dc.TypeCongeId = tc.Id
|
||||
WHERE u.ServiceId = ?
|
||||
AND dc.Statut = 'Validée'
|
||||
AND dc.DateFin >= CURDATE() - INTERVAL 30 DAY
|
||||
ORDER BY dc.DateDebut ASC
|
||||
";
|
||||
|
||||
$stmtLeaves = $conn->prepare($queryLeaves);
|
||||
$stmtLeaves->bind_param("i", $serviceId);
|
||||
$stmtLeaves->execute();
|
||||
$resultLeaves = $stmtLeaves->get_result();
|
||||
|
||||
$leaves = [];
|
||||
while ($row = $resultLeaves->fetch_assoc()) {
|
||||
$leaves[] = [
|
||||
'start_date' => $row['start_date'],
|
||||
'end_date' => $row['end_date'],
|
||||
'employee_name' => $row['employee_name'],
|
||||
'type' => $row['type'],
|
||||
'color' => $row['color'] ?? '#3B82F6'
|
||||
];
|
||||
}
|
||||
|
||||
error_log("getTeamLeaves - Congés trouvés: " . count($leaves));
|
||||
|
||||
echo json_encode([
|
||||
"success" => true,
|
||||
"message" => "Congés de l'équipe récupérés avec succès",
|
||||
"leaves" => $leaves,
|
||||
"service_id" => $serviceId
|
||||
]);
|
||||
|
||||
$stmtLeaves->close();
|
||||
} else {
|
||||
error_log("getTeamLeaves - Utilisateur non trouvé: $userId");
|
||||
echo json_encode([
|
||||
"success" => false,
|
||||
"message" => "Utilisateur non trouvé"
|
||||
]);
|
||||
}
|
||||
|
||||
$stmtUser->close();
|
||||
|
||||
} catch (Exception $e) {
|
||||
error_log("Erreur getTeamLeaves: " . $e->getMessage());
|
||||
echo json_encode([
|
||||
"success" => false,
|
||||
"message" => "Erreur lors de la récupération des congés: " . $e->getMessage()
|
||||
]);
|
||||
}
|
||||
|
||||
$conn->close();
|
||||
?>
|
||||
116
project/public/getTeamMembers.php
Normal file
116
project/public/getTeamMembers.php
Normal file
@@ -0,0 +1,116 @@
|
||||
<?php
|
||||
// Récupération des membres de l'équipe pour un manager
|
||||
header("Access-Control-Allow-Origin: *");
|
||||
header("Access-Control-Allow-Methods: GET, 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 getTeamMembers: " . $conn->connect_error);
|
||||
echo json_encode(["success" => false, "message" => "Erreur de connexion à la base de données"]);
|
||||
exit();
|
||||
}
|
||||
|
||||
$managerId = $_GET['manager_id'] ?? null;
|
||||
|
||||
if ($managerId === null) {
|
||||
echo json_encode(["success" => false, "message" => "ID manager manquant"]);
|
||||
exit();
|
||||
}
|
||||
|
||||
error_log("getTeamMembers - Manager ID: $managerId");
|
||||
|
||||
try {
|
||||
// D'abord, récupérer le service du manager
|
||||
$queryManagerService = "SELECT ServiceId FROM Users WHERE ID = ?";
|
||||
$stmtManager = $conn->prepare($queryManagerService);
|
||||
$stmtManager->bind_param("i", $managerId);
|
||||
$stmtManager->execute();
|
||||
$resultManager = $stmtManager->get_result();
|
||||
|
||||
if ($managerRow = $resultManager->fetch_assoc()) {
|
||||
$serviceId = $managerRow['ServiceId'];
|
||||
error_log("getTeamMembers - Service ID du manager: $serviceId");
|
||||
|
||||
// Récupérer tous les membres du même service (sauf le manager lui-même)
|
||||
$queryTeam = "
|
||||
SELECT
|
||||
u.ID as id,
|
||||
u.Nom as nom,
|
||||
u.Prenom as prenom,
|
||||
u.Email as email,
|
||||
u.Role as role,
|
||||
u.DateEmbauche as date_embauche,
|
||||
s.Nom as service_name
|
||||
FROM Users u
|
||||
JOIN Services s ON u.ServiceId = s.Id
|
||||
WHERE u.ServiceId = ? AND u.ID != ? AND u.Actif = 1
|
||||
ORDER BY u.Prenom, u.Nom
|
||||
";
|
||||
|
||||
$stmtTeam = $conn->prepare($queryTeam);
|
||||
$stmtTeam->bind_param("ii", $serviceId, $managerId);
|
||||
$stmtTeam->execute();
|
||||
$resultTeam = $stmtTeam->get_result();
|
||||
|
||||
$teamMembers = [];
|
||||
while ($row = $resultTeam->fetch_assoc()) {
|
||||
$teamMembers[] = [
|
||||
'id' => (int)$row['id'],
|
||||
'nom' => $row['nom'],
|
||||
'prenom' => $row['prenom'],
|
||||
'email' => $row['email'],
|
||||
'role' => $row['role'],
|
||||
'date_embauche' => $row['date_embauche'],
|
||||
'service_name' => $row['service_name']
|
||||
];
|
||||
}
|
||||
|
||||
error_log("getTeamMembers - Membres trouvés: " . count($teamMembers));
|
||||
|
||||
echo json_encode([
|
||||
"success" => true,
|
||||
"message" => "Équipe récupérée avec succès",
|
||||
"team_members" => $teamMembers,
|
||||
"service_id" => $serviceId
|
||||
]);
|
||||
|
||||
$stmtTeam->close();
|
||||
} else {
|
||||
error_log("getTeamMembers - Manager non trouvé: $managerId");
|
||||
echo json_encode([
|
||||
"success" => false,
|
||||
"message" => "Manager non trouvé"
|
||||
]);
|
||||
}
|
||||
|
||||
$stmtManager->close();
|
||||
|
||||
} catch (Exception $e) {
|
||||
error_log("Erreur getTeamMembers: " . $e->getMessage());
|
||||
echo json_encode([
|
||||
"success" => false,
|
||||
"message" => "Erreur lors de la récupération de l'équipe: " . $e->getMessage()
|
||||
]);
|
||||
}
|
||||
|
||||
$conn->close();
|
||||
?>
|
||||
74
project/public/login.php
Normal file
74
project/public/login.php
Normal file
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
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();
|
||||
}
|
||||
|
||||
header("Content-Type: application/json");
|
||||
|
||||
$host = "192.168.0.4";
|
||||
$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 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.",
|
||||
"user" => [
|
||||
"id" => $user['ID'],
|
||||
"prenom" => $user['Prenom'],
|
||||
"nom" => $user['Nom'],
|
||||
"email" => $user['Email'],
|
||||
"role" => $user['Role']
|
||||
]
|
||||
]);
|
||||
} 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();
|
||||
?>
|
||||
116
project/public/manualResetCounters.php
Normal file
116
project/public/manualResetCounters.php
Normal file
@@ -0,0 +1,116 @@
|
||||
<?php
|
||||
// Script manuel pour réinitialiser les compteurs
|
||||
// Accès direct via navigateur pour les administrateurs
|
||||
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Réinitialisation des Compteurs</title>
|
||||
<style>
|
||||
body { font-family: Arial, sans-serif; max-width: 800px; margin: 50px auto; padding: 20px; }
|
||||
.container { background: #f5f5f5; padding: 30px; border-radius: 10px; }
|
||||
.warning { background: #fff3cd; border: 1px solid #ffeaa7; padding: 15px; border-radius: 5px; margin: 20px 0; }
|
||||
.success { background: #d4edda; border: 1px solid #c3e6cb; padding: 15px; border-radius: 5px; margin: 20px 0; }
|
||||
.error { background: #f8d7da; border: 1px solid #f5c6cb; padding: 15px; border-radius: 5px; margin: 20px 0; }
|
||||
button { background: #007bff; color: white; padding: 12px 24px; border: none; border-radius: 5px; cursor: pointer; font-size: 16px; }
|
||||
button:hover { background: #0056b3; }
|
||||
.danger { background: #dc3545; }
|
||||
.danger:hover { background: #c82333; }
|
||||
pre { background: #f8f9fa; padding: 15px; border-radius: 5px; overflow-x: auto; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1>🔄 Réinitialisation des Compteurs de Congés</h1>
|
||||
|
||||
<div class="warning">
|
||||
<h3>⚠️ ATTENTION</h3>
|
||||
<p>Cette opération va réinitialiser TOUS les compteurs de congés selon les règles suivantes :</p>
|
||||
<ul>
|
||||
<li><strong>Congés Payés :</strong> 25 jours (exercice du 01/06 au 31/05)</li>
|
||||
<li><strong>RTT :</strong> 10 jours pour 2025 (exercice du 01/01 au 31/12)</li>
|
||||
<li><strong>Congés Maladie :</strong> 0 jours (remise à zéro)</li>
|
||||
</ul>
|
||||
<p><strong>Cette action est irréversible !</strong></p>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['confirm_reset'])) {
|
||||
// Appel du script de réinitialisation
|
||||
$resetUrl = 'http://localhost/project/public/resetLeaveCounters.php';
|
||||
|
||||
$context = stream_context_create([
|
||||
'http' => [
|
||||
'method' => 'POST',
|
||||
'header' => 'Content-Type: application/json',
|
||||
'content' => json_encode(['manual_reset' => true])
|
||||
]
|
||||
]);
|
||||
|
||||
$result = file_get_contents($resetUrl, false, $context);
|
||||
$data = json_decode($result, true);
|
||||
|
||||
if ($data && $data['success']) {
|
||||
echo '<div class="success">';
|
||||
echo '<h3>✅ Réinitialisation réussie !</h3>';
|
||||
echo '<p>Employés mis à jour : ' . $data['details']['employees_updated'] . '</p>';
|
||||
echo '<p>Exercice CP : ' . $data['details']['leave_year'] . '</p>';
|
||||
echo '<p>Année RTT : ' . $data['details']['rtt_year'] . '</p>';
|
||||
echo '<p>Date de réinitialisation : ' . $data['details']['reset_date'] . '</p>';
|
||||
|
||||
if (!empty($data['log'])) {
|
||||
echo '<details><summary>Voir le détail</summary><pre>';
|
||||
foreach ($data['log'] as $logLine) {
|
||||
echo htmlspecialchars($logLine) . "\n";
|
||||
}
|
||||
echo '</pre></details>';
|
||||
}
|
||||
echo '</div>';
|
||||
} else {
|
||||
echo '<div class="error">';
|
||||
echo '<h3>❌ Erreur lors de la réinitialisation</h3>';
|
||||
echo '<p>' . ($data['message'] ?? 'Erreur inconnue') . '</p>';
|
||||
echo '</div>';
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
||||
<form method="POST" onsubmit="return confirm('Êtes-vous sûr de vouloir réinitialiser TOUS les compteurs ? Cette action est irréversible.');">
|
||||
<p>
|
||||
<label>
|
||||
<input type="checkbox" name="confirm_reset" value="1" required>
|
||||
Je confirme vouloir réinitialiser tous les compteurs de congés
|
||||
</label>
|
||||
</p>
|
||||
<button type="submit" class="danger">🔄 RÉINITIALISER LES COMPTEURS</button>
|
||||
</form>
|
||||
|
||||
<hr style="margin: 40px 0;">
|
||||
|
||||
<h3>📋 Informations sur les exercices</h3>
|
||||
<?php
|
||||
$currentDate = new DateTime();
|
||||
$currentYear = (int)$currentDate->format('Y');
|
||||
$currentMonth = (int)$currentDate->format('m');
|
||||
|
||||
// Calcul exercice CP
|
||||
$leaveYear = ($currentMonth < 6) ? $currentYear - 1 : $currentYear;
|
||||
$leaveYearEnd = $leaveYear + 1;
|
||||
|
||||
echo "<p><strong>Exercice Congés Payés actuel :</strong> du 01/06/$leaveYear au 31/05/$leaveYearEnd</p>";
|
||||
echo "<p><strong>Exercice RTT actuel :</strong> du 01/01/$currentYear au 31/12/$currentYear</p>";
|
||||
echo "<p><strong>Date actuelle :</strong> " . $currentDate->format('d/m/Y H:i:s') . "</p>";
|
||||
?>
|
||||
|
||||
<h3>🔗 Actions rapides</h3>
|
||||
<p>
|
||||
<a href="getLeaveCounters.php?user_id=1" target="_blank">
|
||||
<button type="button">Voir les compteurs (User ID 1)</button>
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
228
project/public/resetLeaveCounters.php
Normal file
228
project/public/resetLeaveCounters.php
Normal file
@@ -0,0 +1,228 @@
|
||||
<?php
|
||||
// Script de réinitialisation des compteurs de congés
|
||||
// À exécuter manuellement ou via cron job
|
||||
|
||||
header("Access-Control-Allow-Origin: *");
|
||||
header("Access-Control-Allow-Methods: POST, OPTIONS");
|
||||
header("Access-Control-Allow-Headers: Content-Type");
|
||||
header("Content-Type: application/json");
|
||||
|
||||
// Gère la requête OPTIONS (pré-vol CORS)
|
||||
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
|
||||
http_response_code(200);
|
||||
exit();
|
||||
}
|
||||
|
||||
// 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_";
|
||||
|
||||
// Connexion à la base de données
|
||||
$conn = new mysqli($host, $username, $password, $dbname);
|
||||
|
||||
if ($conn->connect_error) {
|
||||
error_log("Erreur connexion DB reset: " . $conn->connect_error);
|
||||
echo json_encode([
|
||||
"success" => false,
|
||||
"message" => "Erreur de connexion à la base de données : " . $conn->connect_error
|
||||
]);
|
||||
exit();
|
||||
}
|
||||
|
||||
// Log de debug
|
||||
error_log("Reset counters - Début du script");
|
||||
|
||||
// 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');
|
||||
}
|
||||
|
||||
try {
|
||||
$conn->begin_transaction();
|
||||
|
||||
$currentDate = new DateTime();
|
||||
$leaveYear = getLeaveYear();
|
||||
$rttYear = getRTTYear();
|
||||
|
||||
error_log("Reset counters - Exercice CP: $leaveYear, RTT: $rttYear");
|
||||
|
||||
$resetLog = [];
|
||||
|
||||
// 1. Récupérer tous les employés depuis la table Users
|
||||
$queryEmployees = "SELECT ID FROM Users";
|
||||
$resultEmployees = $conn->query($queryEmployees);
|
||||
|
||||
if (!$resultEmployees) {
|
||||
throw new Exception("Erreur lors de la récupération des employés : " . $conn->error);
|
||||
}
|
||||
|
||||
error_log("Reset counters - Nombre d'employés trouvés: " . $resultEmployees->num_rows);
|
||||
|
||||
// 2. Récupérer les IDs des types de congés
|
||||
$queryTypes = "SELECT Id, Nom FROM TypeConge WHERE Nom IN ('Congé payé', 'RTT', 'Congé maladie')";
|
||||
$resultTypes = $conn->query($queryTypes);
|
||||
|
||||
$typeIds = [];
|
||||
while ($row = $resultTypes->fetch_assoc()) {
|
||||
$typeIds[$row['Nom']] = $row['Id'];
|
||||
}
|
||||
|
||||
error_log("Reset counters - Types trouvés: " . print_r($typeIds, true));
|
||||
|
||||
if (count($typeIds) < 3) {
|
||||
throw new Exception("Types de congés manquants dans la base de données");
|
||||
}
|
||||
|
||||
// 3. Pour chaque employé, réinitialiser les compteurs
|
||||
$employeesUpdated = 0;
|
||||
while ($employee = $resultEmployees->fetch_assoc()) {
|
||||
$employeeId = $employee['ID'];
|
||||
|
||||
error_log("Reset counters - Traitement employé: $employeeId");
|
||||
|
||||
// CONGÉS PAYÉS - Exercice du 01/06 au 31/05 (25 jours)
|
||||
$queryUpdateCP = "
|
||||
INSERT INTO CompteurConges (EmployeeId, TypeCongeId, Annee, Solde, Total)
|
||||
VALUES (?, ?, ?, 25, 25)
|
||||
ON DUPLICATE KEY UPDATE
|
||||
Solde = 25,
|
||||
Total = 25
|
||||
";
|
||||
$stmtCP = $conn->prepare($queryUpdateCP);
|
||||
if (!$stmtCP) {
|
||||
throw new Exception("Erreur préparation CP: " . $conn->error);
|
||||
}
|
||||
$stmtCP->bind_param("iii", $employeeId, $typeIds['Congé payé'], $leaveYear);
|
||||
|
||||
if (!$stmtCP->execute()) {
|
||||
throw new Exception("Erreur lors de la mise à jour des CP pour l'employé $employeeId : " . $stmtCP->error);
|
||||
}
|
||||
$stmtCP->close();
|
||||
|
||||
// RTT - Année civile du 01/01 au 31/12
|
||||
// Calcul du nombre de RTT selon l'année
|
||||
$rttCount = 10; // Par défaut 10 pour 2025
|
||||
if ($rttYear == 2024) {
|
||||
$rttCount = 8; // Exemple pour 2024
|
||||
} elseif ($rttYear >= 2025) {
|
||||
$rttCount = 10; // 10 pour 2025 et après
|
||||
}
|
||||
|
||||
$queryUpdateRTT = "
|
||||
INSERT INTO CompteurConges (EmployeeId, TypeCongeId, Annee, Solde, Total)
|
||||
VALUES (?, ?, ?, ?, ?)
|
||||
ON DUPLICATE KEY UPDATE
|
||||
Solde = ?,
|
||||
Total = ?
|
||||
";
|
||||
$stmtRTT = $conn->prepare($queryUpdateRTT);
|
||||
if (!$stmtRTT) {
|
||||
throw new Exception("Erreur préparation RTT: " . $conn->error);
|
||||
}
|
||||
$stmtRTT->bind_param("iiiiiii", $employeeId, $typeIds['RTT'], $rttYear, $rttCount, $rttCount, $rttCount, $rttCount);
|
||||
|
||||
if (!$stmtRTT->execute()) {
|
||||
throw new Exception("Erreur lors de la mise à jour des RTT pour l'employé $employeeId : " . $stmtRTT->error);
|
||||
}
|
||||
$stmtRTT->close();
|
||||
|
||||
// CONGÉ MALADIE - Réinitialiser à 0 (pas de limite)
|
||||
$queryUpdateABS = "
|
||||
INSERT INTO CompteurConges (EmployeeId, TypeCongeId, Annee, Solde, Total)
|
||||
VALUES (?, ?, ?, 0, 0)
|
||||
ON DUPLICATE KEY UPDATE
|
||||
Solde = 0,
|
||||
Total = 0
|
||||
";
|
||||
$stmtABS = $conn->prepare($queryUpdateABS);
|
||||
if (!$stmtABS) {
|
||||
throw new Exception("Erreur préparation ABS: " . $conn->error);
|
||||
}
|
||||
$stmtABS->bind_param("iii", $employeeId, $typeIds['Congé maladie'], $rttYear);
|
||||
|
||||
if (!$stmtABS->execute()) {
|
||||
throw new Exception("Erreur lors de la mise à jour des ABS pour l'employé $employeeId : " . $stmtABS->error);
|
||||
}
|
||||
$stmtABS->close();
|
||||
|
||||
$resetLog[] = "Employé $employeeId : CP=$leaveYear (25j), RTT=$rttYear ({$rttCount}j), ABS=$rttYear (0j)";
|
||||
$employeesUpdated++;
|
||||
}
|
||||
|
||||
error_log("Reset counters - Employés mis à jour: $employeesUpdated");
|
||||
|
||||
// 4. Log de la réinitialisation
|
||||
$logEntry = "
|
||||
=== RÉINITIALISATION DES COMPTEURS ===
|
||||
Date: " . $currentDate->format('Y-m-d H:i:s') . "
|
||||
Exercice CP: $leaveYear (01/06/$leaveYear au 31/05/" . ($leaveYear + 1) . ")
|
||||
Année RTT: $rttYear (01/01/$rttYear au 31/12/$rttYear)
|
||||
Employés traités: $employeesUpdated
|
||||
|
||||
Détails:
|
||||
" . implode("\n ", $resetLog) . "
|
||||
";
|
||||
|
||||
// Sauvegarder le log (optionnel - créer une table de logs si nécessaire)
|
||||
error_log($logEntry, 3, "reset_counters.log");
|
||||
|
||||
$conn->commit();
|
||||
error_log("Reset counters - Transaction commitée avec succès");
|
||||
|
||||
echo json_encode([
|
||||
"success" => true,
|
||||
"message" => "Compteurs réinitialisés avec succès",
|
||||
"details" => [
|
||||
"employees_updated" => $employeesUpdated,
|
||||
"leave_year" => $leaveYear,
|
||||
"rtt_year" => $rttYear,
|
||||
"cp_days" => 25,
|
||||
"rtt_days" => $rttCount,
|
||||
"reset_date" => $currentDate->format('Y-m-d H:i:s')
|
||||
],
|
||||
"log" => $resetLog
|
||||
]);
|
||||
|
||||
} catch (Exception $e) {
|
||||
$conn->rollback();
|
||||
error_log("Erreur réinitialisation compteurs : " . $e->getMessage());
|
||||
|
||||
echo json_encode([
|
||||
"success" => false,
|
||||
"message" => "Erreur lors de la réinitialisation : " . $e->getMessage()
|
||||
]);
|
||||
}
|
||||
|
||||
$conn->close();
|
||||
?>
|
||||
181
project/public/submitLeaveRequest.php
Normal file
181
project/public/submitLeaveRequest.php
Normal file
@@ -0,0 +1,181 @@
|
||||
<?php
|
||||
// Active l'affichage des erreurs pour le dev
|
||||
ini_set('display_errors', 1);
|
||||
ini_set('display_startup_errors', 1);
|
||||
error_reporting(E_ALL);
|
||||
|
||||
header("Access-Control-Allow-Origin: *");
|
||||
header("Access-Control-Allow-Methods: POST, OPTIONS");
|
||||
header("Access-Control-Allow-Headers: Content-Type");
|
||||
|
||||
// Gère le pré-vol CORS
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
|
||||
http_response_code(200);
|
||||
exit();
|
||||
}
|
||||
|
||||
header("Content-Type: application/json");
|
||||
|
||||
// --- Paramètres de connexion ---
|
||||
$host = "192.168.0.4";
|
||||
$dbname = "DemandeConge";
|
||||
$username = "wpuser";
|
||||
$password = "-2b/)ru5/Bi8P[7_";
|
||||
|
||||
// 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 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();
|
||||
}
|
||||
|
||||
// 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");
|
||||
|
||||
$statut = 'En attente';
|
||||
$validateur = null;
|
||||
$currentDate= date('Y-m-d H:i:s'); // date complète pour DateDemande
|
||||
|
||||
// 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();
|
||||
}
|
||||
|
||||
error_log("submitLeaveRequest - Type DB mappé: $dbTypeCongeName");
|
||||
|
||||
// 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();
|
||||
}
|
||||
|
||||
$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();
|
||||
$conn->close();
|
||||
|
||||
error_log("submitLeaveRequest - Script terminé");
|
||||
|
||||
?>
|
||||
14
project/public/test_db.php
Normal file
14
project/public/test_db.php
Normal file
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
$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) {
|
||||
die("❌ Connexion échouée : " . $conn->connect_error);
|
||||
}
|
||||
echo "✅ Connexion réussie à la base de données !";
|
||||
|
||||
?>
|
||||
197
project/public/validateRequest.php
Normal file
197
project/public/validateRequest.php
Normal 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();
|
||||
?>
|
||||
Reference in New Issue
Block a user