changement au niveau de requetes adaptés aux collaborateurs AD

This commit is contained in:
2025-08-27 09:40:17 +02:00
parent 9fb0c0a27f
commit ed4a7c02ca
29 changed files with 1741 additions and 548 deletions

View File

@@ -1,14 +1,21 @@
import React, { useState, useEffect } from 'react';
import { X, Calendar, Clock, AlertCircle, RotateCcw } from 'lucide-react';
import { useMsal } from "@azure/msal-react";
import { loginRequest } from "../AuthConfig";
const NewLeaveRequestModal = ({
onClose,
availableLeaveCounters,
userId,
userEmail,
userName,
accessToken,
onRequestSubmitted,
preselectedStartDate = null,
preselectedEndDate = null,
preselectedType = null
preselectedType = null,
}) => {
const [formData, setFormData] = useState({
types: preselectedType ? [preselectedType] : [],
@@ -18,6 +25,7 @@ const NewLeaveRequestModal = ({
medicalDocuments: []
});
const [typeDistribution, setTypeDistribution] = useState({});
const [isSubmitting, setIsSubmitting] = useState(false);
@@ -27,6 +35,25 @@ const NewLeaveRequestModal = ({
const [isOtherChecked, setIsOtherChecked] = useState(false);
const [otherLeaveType, setOtherLeaveType] = useState('');
const { instance, accounts } = useMsal();
// --- Helper pour garantir un token Graph valide
const ensureGraphToken = async () => {
if (!accounts[0]) throw new Error("Aucun utilisateur connecté");
const request = { ...loginRequest, account: accounts[0] };
try {
const response = await instance.acquireTokenSilent(request);
return response.accessToken;
} catch (err) {
console.warn("⚠️ Silent token failed, trying popup:", err);
const response = await instance.acquireTokenPopup(request);
return response.accessToken;
}
};
// Vérifier si des valeurs sont pré-sélectionnées
useEffect(() => {
if (preselectedStartDate || preselectedEndDate || preselectedType) {
@@ -273,55 +300,50 @@ const NewLeaveRequestModal = ({
}));
const requestData = {
EmployeeId: userId,
DateDebut: formData.startDate,
DateFin: formData.endDate,
Commentaire: formData.reason,
NombreJours: calculatedDays,
Repartition: repartition
Repartition: repartition,
Email: userEmail,
Nom: userName
};
console.log("Payload envoyé au backend :", JSON.stringify(requestData, null, 2));
const formDataToSend = new FormData();
formDataToSend.append('data', JSON.stringify(requestData));
// Ajouter les fichiers
formData.medicalDocuments.forEach((file, index) => {
formDataToSend.append(`medicalDocuments[]`, file);
});
console.log("📤 Payload envoyé au backend :", JSON.stringify(requestData, null, 2));
const response = await fetch('http://localhost/GTA/project/public/php/submitLeaveRequest.php', {
method: 'POST',
body: formDataToSend
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(requestData)
});
const result = await response.json();
console.log("📥 Réponse backend :", result);
const text = await response.text();
let result;
try {
result = JSON.parse(text);
} catch (err) {
console.error("Réponse non JSON:", text);
setError("Erreur serveur : réponse invalide.");
if (!result.success) {
setError(result.message || "Erreur lors de l'enregistrement");
return;
}
if (result.success) {
onRequestSubmitted?.();
onClose();
} else {
setError(result.message || 'Erreur lors de la soumission');
}
console.log("✅ Demande enregistrée (et mails envoyés côté PHP)");
// Fermer modal et rafraîchir
onRequestSubmitted?.();
onClose();
} catch (error) {
console.error('Erreur:', error);
setError('Erreur de connexion au serveur');
console.error('Erreur handleSubmit:', error);
setError("Erreur de connexion au serveur");
} finally {
setIsSubmitting(false);
}
};
const getTypeLabel = (type) => {
switch (type) {
case 'CP': return 'Congés payés';

View File

@@ -13,7 +13,7 @@ const Sidebar = ({ isOpen, onToggle }) => {
switch (role) {
case 'Admin':
return 'bg-red-100 text-red-800';
case 'Manager':
case 'Validateur':
return 'bg-green-100 text-green-800';
default:
return 'bg-blue-100 text-blue-800';
@@ -109,7 +109,7 @@ const Sidebar = ({ isOpen, onToggle }) => {
<span className="font-medium">Calendrier</span>
</Link>
{(user?.role === 'Manager' || user?.role === 'Admin' || user?.role === 'Employe') && (
{(user?.role === 'Validateur' || user?.role === 'Admin' || user?.role === 'Collaborateur') && (
<Link
to="/manager"
onClick={() => window.innerWidth < 1024 && onToggle()}
@@ -118,7 +118,7 @@ const Sidebar = ({ isOpen, onToggle }) => {
>
<Users className="w-5 h-5" />
<span className="font-medium">
{user?.role === 'Employe' ? 'Mon équipe' : 'Équipe'}
{user?.role === 'Collaborateur' ? 'Mon équipe' : 'Équipe'}
</span>
</Link>
)}