import React, { useState, useEffect } from 'react'; import { useAuth } from '../context/AuthContext'; import Sidebar from '../components/Sidebar'; import { Users, CheckCircle, XCircle, Clock, Calendar, FileText, Menu, Eye, MessageSquare } from 'lucide-react'; const Collaborateur = () => { const { user } = useAuth(); const [sidebarOpen, setSidebarOpen] = useState(false); const isEmployee = user?.role === 'Collaborateur'; const [teamMembers, setTeamMembers] = useState([]); const [pendingRequests, setPendingRequests] = useState([]); const [allRequests, setAllRequests] = useState([]); const [isLoading, setIsLoading] = useState(true); const [selectedRequest, setSelectedRequest] = useState(null); const [showValidationModal, setShowValidationModal] = useState(false); const [validationComment, setValidationComment] = useState(''); const [validationAction, setValidationAction] = useState(''); useEffect(() => { if (user?.id) { fetchTeamData(); } }, [user]); const fetchTeamData = async () => { try { setIsLoading(true); // Récupérer les membres de l'équipe await fetchTeamMembers(); // Récupérer les demandes en attente await fetchPendingRequests(); // Récupérer toutes les demandes de l'équipe await fetchAllTeamRequests(); } catch (error) { console.error('Erreur lors de la récupération des données équipe:', error); } finally { setIsLoading(false); } }; const fetchTeamMembers = async () => { try { const response = await fetch(`http://localhost/GTA/project/public/php/getTeamMembers.php?manager_id=${user.id}`); const text = await response.text(); console.log('Réponse équipe:', text); const data = JSON.parse(text); if (data.success) { setTeamMembers(data.team_members || []); } } catch (error) { console.error('Erreur récupération équipe:', error); setTeamMembers([]); } }; const fetchPendingRequests = async () => { try { const response = await fetch(`http://localhost/GTA/project/public/php/getPendingRequests.php?manager_id=${user.id}`); const text = await response.text(); console.log('Réponse demandes en attente:', text); const data = JSON.parse(text); if (data.success) { setPendingRequests(data.requests || []); } } catch (error) { console.error('Erreur récupération demandes en attente:', error); setPendingRequests([]); } }; const fetchAllTeamRequests = async () => { try { const response = await fetch(`http://localhost/GTA/project/public/php/getAllTeamRequests.php?SuperieurId=${user.id}`); const text = await response.text(); console.log('Réponse toutes demandes équipe:', text); const data = JSON.parse(text); if (data.success) { setAllRequests(data.requests || []); } } catch (error) { console.error('Erreur récupération toutes demandes:', error); console.log('Réponse brute:', text); setAllRequests([]); } }; const handleValidateRequest = async (requestId, action, comment = '') => { try { const response = await fetch('http://localhost/GTA/project/public/php/validateRequest.php', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ request_id: requestId, action: action, // 'approve' ou 'reject' comment: comment, validator_id: user.id }), }); const text = await response.text(); console.log('Réponse validation:', text); const data = JSON.parse(text); if (data.success) { // Rafraîchir les données await fetchTeamData(); setShowValidationModal(false); setSelectedRequest(null); setValidationComment(''); alert(`Demande ${action === 'approve' ? 'approuvée' : 'refusée'} avec succès !`); } else { alert(`Erreur: ${data.message}`); } } catch (error) { console.error('Erreur validation:', error); alert('Erreur lors de la validation'); } }; const openValidationModal = (request, action) => { setSelectedRequest(request); setValidationAction(action); setValidationComment(''); setShowValidationModal(true); }; const getStatusColor = (status) => { switch (status) { case 'En attente': return 'bg-yellow-100 text-yellow-800'; case 'Validée': case 'Approuvé': return 'bg-green-100 text-green-800'; case 'Refusée': return 'bg-red-100 text-red-800'; default: return 'bg-gray-100 text-gray-800'; } }; const getTypeColor = (type) => { switch (type) { case 'Congés payés': case 'Congé payé': return 'bg-blue-100 text-blue-800'; case 'RTT': return 'bg-green-100 text-green-800'; case 'Congé maladie': return 'bg-red-100 text-red-800'; default: return 'bg-gray-100 text-gray-800'; } }; if (isLoading) { return (
setSidebarOpen(!sidebarOpen)} />

Chargement des données équipe...

); } return (
setSidebarOpen(!sidebarOpen)} />
{/* Mobile menu button */}
{/* Header */}

{isEmployee ? 'Mon équipe 👥' : 'Gestion d\'équipe 👥'}

{isEmployee ? 'Consultez les congés de votre équipe' : 'Gérez les demandes de congés de votre équipe'}

{/* Stats Cards */}

Équipe

{teamMembers.length}

membres

En attente

{pendingRequests.length}

demandes

Approuvées

{allRequests.filter(r => r.status === 'Validée' || r.status === 'Approuvé').length}

demandes

Refusées

{allRequests.filter(r => r.status === 'Refusée').length}

demandes

{/* Main Content */}
{/* Demandes en attente */} {!isEmployee && (

Demandes en attente ({pendingRequests.length})

{pendingRequests.length === 0 ? (

Aucune demande en attente

) : (
{pendingRequests.map((request) => (

{request.employee_name}

{request.type}

{request.date_display}

Soumis le {request.submitted_display}

{request.days}j

{request.reason && (
Motif: {request.reason}
)}
))}
)}
)} {/* Équipe */}

Mon équipe ({teamMembers.length})

{teamMembers.length === 0 ? (

Aucun membre d'équipe

) : (
{teamMembers.map((member) => (
{member.prenom?.charAt(0)}{member.nom?.charAt(0)}

{member.prenom} {member.nom}

{member.email}

{!isEmployee && (

{allRequests.filter(r => r.employee_id === member.id && r.status === 'En attente').length} en attente

{allRequests.filter(r => r.employee_id === member.id).length} total

)}
))}
)}
{/* Historique des demandes */} {!isEmployee && (

Historique des demandes ({allRequests.length})

{allRequests.length === 0 ? (

Aucune demande

) : (
{allRequests.map((request) => (

{request.employee_name}

{request.type} {request.status}

{request.date_display}

Soumis le {request.submitted_display}

{request.reason && (

Motif : {request.reason}

)} {request.file && (

Document joint

Voir le fichier
)}

{request.days}j

))}
)}
)}
{/* Modal de validation */} {showValidationModal && selectedRequest && (
{/* Header */}

{validationAction === 'approve' ? 'Approuver' : 'Refuser'} la demande

{/* Corps du contenu */}

{selectedRequest.employee_name}

{selectedRequest.type} - {selectedRequest.date_display}

{selectedRequest.days} jour(s)

{selectedRequest.reason && (

Motif: {selectedRequest.reason}

)} {selectedRequest.file && (

Document joint

Voir le fichier
)}
{/* Champ commentaire */}