modification concernant l'affichage de type de congés dans la pagedemande+Affichage du service du collabrateur et son rôle+ version mobile de la page demande

This commit is contained in:
2025-08-11 17:19:49 +02:00
parent f5ee031efc
commit 871f166457
8 changed files with 558 additions and 764 deletions

View File

@@ -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 = [];

View File

@@ -1,278 +1,148 @@
<?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();
}
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { http_response_code(200); exit(); }
header("Content-Type: application/json");
ini_set('display_errors',1); ini_set('display_startup_errors',1); error_reporting(E_ALL);
// 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) { 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();
?>
?>

View File

@@ -1,5 +1,5 @@
<?php
// Récupération des demandes de congés avec gestion des exercices
// En-têtes CORS et JSON
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type");
@@ -9,51 +9,33 @@ if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
exit();
}
header("Content-Type: application/json");
header("Content-Type: application/json; charset=utf-8");
// Affichage des erreurs PHP (utile en dev)
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
// Connexion BDD
$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 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();
?>

View File

@@ -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();
?>
?>

View File

@@ -1,181 +1,100 @@
<?php
// Active l'affichage des erreurs pour le dev
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
// (headers, connexion, lecture FormData ou JSON — pareil que précédemment)
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();
}
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_";
$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) { 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é");
?>