V1_Sans_Congé_Anticipéfemini collaboratrice
This commit is contained in:
@@ -2,146 +2,162 @@
|
||||
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(); }
|
||||
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);
|
||||
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";
|
||||
$username = "wpuser";
|
||||
$password = "-2b/)ru5/Bi8P[7_";
|
||||
$dbname = "DemandeConge";
|
||||
|
||||
$userId = isset($_GET['user_id']) ? (int)$_GET['user_id'] : null;
|
||||
if (!$userId) { echo json_encode(["success"=>false,"message"=>"user_id manquant"]); $conn->close(); exit(); }
|
||||
|
||||
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;}
|
||||
|
||||
// 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');
|
||||
|
||||
$leaveYear = getLeaveYear();
|
||||
$rttYear = getRTTYear();
|
||||
$currentDate = date('Y-m-d');
|
||||
|
||||
// --- Soldes initiaux (CompteurConges pour CollaborateurAD) ---
|
||||
$cpSolde = 0; $rttSolde = 0; $absSolde = 0;
|
||||
if ($cpTypeId !== null) {
|
||||
$q="SELECT Solde FROM CompteurConges WHERE CollaborateurADId=? 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 CollaborateurADId=? 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 CollaborateurADId=? 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();
|
||||
$conn = new mysqli($host, $username, $password, $dbname);
|
||||
if ($conn->connect_error) {
|
||||
error_log("Erreur DB: " . $conn->connect_error);
|
||||
echo json_encode(['success' => false, 'message' => 'Erreur de connexion à la base de données']);
|
||||
exit;
|
||||
}
|
||||
|
||||
// --- Calcul CP en cours ---
|
||||
$cpInProcess = 0;
|
||||
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.CollaborateurADId = ?
|
||||
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("iisi", $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']);
|
||||
}
|
||||
$today = new DateTime();
|
||||
$yearCurrent = (int)$today->format('Y');
|
||||
$yearNMinus1 = $yearCurrent - 1;
|
||||
|
||||
function getTypeId($conn, $nom) {
|
||||
$stmt = $conn->prepare("SELECT Id FROM TypeConge WHERE Nom=?");
|
||||
$stmt->bind_param("s", $nom);
|
||||
$stmt->execute();
|
||||
$result = $stmt->get_result();
|
||||
$id = null;
|
||||
if ($row = $result->fetch_assoc()) {
|
||||
$id = (int)$row['Id'];
|
||||
}
|
||||
$s->close();
|
||||
$stmt->close();
|
||||
error_log("TypeConge '$nom' => Id $id");
|
||||
return $id;
|
||||
}
|
||||
|
||||
// --- Calcul RTT en cours ---
|
||||
$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.CollaborateurADId = ?
|
||||
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("iisi", $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']);
|
||||
$cpTypeId = getTypeId($conn, 'Congé payé');
|
||||
$rttTypeId = getTypeId($conn, 'RTT');
|
||||
|
||||
$soldeReportInitial_CP = 0.0;
|
||||
$soldeReportInitial_RTT = 0.0;
|
||||
|
||||
$collaborateursResult = $conn->query("SELECT id FROM CollaborateurAD");
|
||||
if (!$collaborateursResult) {
|
||||
error_log("Erreur récupération collaborateurs : ".$conn->error);
|
||||
echo json_encode(['success' => false, 'message' => 'Erreur récupération collaborateurs']);
|
||||
exit;
|
||||
}
|
||||
|
||||
while ($collab = $collaborateursResult->fetch_assoc()) {
|
||||
$collabId = (int)$collab['id'];
|
||||
|
||||
if ($cpTypeId !== null) {
|
||||
$existsStmt = $conn->prepare("SELECT Id FROM CompteurConges WHERE CollaborateurADId=? AND TypeCongeId=? AND Annee=?");
|
||||
$existsStmt->bind_param("iii", $collabId, $cpTypeId, $yearNMinus1);
|
||||
$existsStmt->execute();
|
||||
$existsStmt->store_result();
|
||||
if ($existsStmt->num_rows === 0) {
|
||||
$insertStmt = $conn->prepare("INSERT INTO CompteurConges (CollaborateurADId, TypeCongeId, Annee, Solde, Total, SoldeReporte) VALUES (?, ?, ?, ?, ?, ?)");
|
||||
$insertStmt->bind_param("iiiddd", $collabId, $cpTypeId, $yearNMinus1, $soldeReportInitial_CP, $soldeReportInitial_CP, $soldeReportInitial_CP);
|
||||
if (!$insertStmt->execute()) {
|
||||
error_log("Erreur insertion CP N-1 collaborateur $collabId : ".$insertStmt->error);
|
||||
}
|
||||
$insertStmt->close();
|
||||
}
|
||||
$existsStmt->close();
|
||||
}
|
||||
$s->close();
|
||||
}
|
||||
|
||||
// --- Calcul absenteisme validé ---
|
||||
$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.CollaborateurADId = ?
|
||||
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 {
|
||||
$d1 = new DateTime($r['DateDebut']); $d2 = new DateTime($r['DateFin']);
|
||||
$absenteism += ($d2->diff($d1)->days + 1);
|
||||
if ($rttTypeId !== null) {
|
||||
$existsStmt = $conn->prepare("SELECT Id FROM CompteurConges WHERE CollaborateurADId=? AND TypeCongeId=? AND Annee=?");
|
||||
$existsStmt->bind_param("iii", $collabId, $rttTypeId, $yearNMinus1);
|
||||
$existsStmt->execute();
|
||||
$existsStmt->store_result();
|
||||
if ($existsStmt->num_rows === 0) {
|
||||
$insertStmt = $conn->prepare("INSERT INTO CompteurConges (CollaborateurADId, TypeCongeId, Annee, Solde, Total, SoldeReporte) VALUES (?, ?, ?, ?, ?, ?)");
|
||||
$insertStmt->bind_param("iiiddd", $collabId, $rttTypeId, $yearNMinus1, $soldeReportInitial_RTT, $soldeReportInitial_RTT, $soldeReportInitial_RTT);
|
||||
if (!$insertStmt->execute()) {
|
||||
error_log("Erreur insertion RTT N-1 collaborateur $collabId : ".$insertStmt->error);
|
||||
}
|
||||
$insertStmt->close();
|
||||
}
|
||||
$existsStmt->close();
|
||||
}
|
||||
$s->close();
|
||||
}
|
||||
|
||||
$availableCPCalculated = max(0, $cpSolde - $cpInProcess);
|
||||
$availableRTTCalculated = max(0, $rttSolde - $rttInProcess);
|
||||
$cpStart = new DateTime("$yearCurrent-06-01");
|
||||
$cpEnd = new DateTime(($yearCurrent + 1) . "-05-31");
|
||||
$rttStart = new DateTime("$yearCurrent-01-01");
|
||||
$rttEnd = new DateTime("$yearCurrent-12-31");
|
||||
|
||||
echo json_encode([
|
||||
"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
|
||||
]
|
||||
]);
|
||||
$cpAnnualDays = 25;
|
||||
$rttAnnualDays = 10;
|
||||
|
||||
$cpPeriodDays = $cpEnd->diff($cpStart)->days + 1;
|
||||
$rttPeriodDays = $rttEnd->diff($rttStart)->days + 1;
|
||||
|
||||
$cpDailyIncrement = $cpAnnualDays / $cpPeriodDays;
|
||||
$rttDailyIncrement = $rttAnnualDays / $rttPeriodDays;
|
||||
|
||||
error_log("Incrément CP jour : $cpDailyIncrement");
|
||||
error_log("Incrément RTT jour : $rttDailyIncrement");
|
||||
|
||||
if ($today >= $cpStart && $today <= $cpEnd && $cpTypeId !== null) {
|
||||
$exerciseYear = (int)$cpStart->format('Y');
|
||||
$stmt = $conn->prepare("UPDATE CompteurConges SET Solde = Solde + ? WHERE TypeCongeId = ? AND Annee = ?");
|
||||
$stmt->bind_param("dii", $cpDailyIncrement, $cpTypeId, $exerciseYear);
|
||||
if (!$stmt->execute()) {
|
||||
error_log("Erreur incrément CP N : ".$stmt->error);
|
||||
}
|
||||
$stmt->close();
|
||||
}
|
||||
|
||||
if ($today >= $rttStart && $today <= $rttEnd && $rttTypeId !== null) {
|
||||
$exerciseYear = $yearCurrent;
|
||||
$stmt = $conn->prepare("UPDATE CompteurConges SET Solde = Solde + ? WHERE TypeCongeId = ? AND Annee = ?");
|
||||
$stmt->bind_param("dii", $rttDailyIncrement, $rttTypeId, $exerciseYear);
|
||||
if (!$stmt->execute()) {
|
||||
error_log("Erreur incrément RTT N : ".$stmt->error);
|
||||
}
|
||||
$stmt->close();
|
||||
}
|
||||
|
||||
// Récupérer les compteurs actuels de l'utilisateur demandé en GET
|
||||
$userId = isset($_GET['user_id']) ? (int)$_GET['user_id'] : 0;
|
||||
$data = [];
|
||||
|
||||
if ($userId > 0) {
|
||||
$stmt = $conn->prepare(
|
||||
"SELECT tc.Nom, cc.Annee, cc.Solde, cc.Total, cc.SoldeReporte
|
||||
FROM CompteurConges cc
|
||||
JOIN TypeConge tc ON cc.TypeCongeId = tc.Id
|
||||
WHERE cc.CollaborateurADId = ?"
|
||||
);
|
||||
$stmt->bind_param("i", $userId);
|
||||
$stmt->execute();
|
||||
$result = $stmt->get_result();
|
||||
|
||||
while ($row = $result->fetch_assoc()) {
|
||||
$data[$row['Nom']] = [
|
||||
'Annee' => $row['Annee'],
|
||||
'Solde' => (float)$row['Solde'],
|
||||
'Total' => (float)$row['Total'],
|
||||
'SoldeReporte' => (float)$row['SoldeReporte'],
|
||||
];
|
||||
}
|
||||
$stmt->close();
|
||||
}
|
||||
|
||||
$conn->close();
|
||||
?>
|
||||
|
||||
echo json_encode([
|
||||
'success' => true,
|
||||
'message' => 'Compteurs mis à jour',
|
||||
'counters' => $data,
|
||||
]);
|
||||
exit;
|
||||
|
||||
Reference in New Issue
Block a user