'use client'; import React, { useState, useEffect } from 'react'; import { Card } from 'primereact/card'; import { Button } from 'primereact/button'; import { Tag } from 'primereact/tag'; import { Badge } from 'primereact/badge'; import { Toolbar } from 'primereact/toolbar'; import { TabView, TabPanel } from 'primereact/tabview'; import { DataTable } from 'primereact/datatable'; import { Column } from 'primereact/column'; import { ProgressBar } from 'primereact/progressbar'; import { Chart } from 'primereact/chart'; import { useRouter, useParams } from 'next/navigation'; import { apiClient } from '../../../../services/api-client'; interface EquipeDetail { id: number; nom: string; description: string; specialite: string; statut: string; dateCreation: string; chefEquipeId?: number; chefEquipeNom?: string; nombreEmployes: number; competencesEquipe: string[]; tauxOccupation: number; evaluationPerformance: number; coutJournalier: number; localisation: string; chantierActuel?: { id: number; nom: string; dateDebut: string; dateFin: string; statut: string; }; employes: Array<{ id: number; nom: string; prenom: string; metier: string; statut: string; niveauExperience: string; competences: string[]; dateAffectation: string; }>; historiqueMissions: Array<{ id: number; chantierNom: string; dateDebut: string; dateFin: string; statut: string; evaluation: number; role: string; }>; statistiques: { nombreMissionsTerminees: number; tauxReussite: number; dureeMovenneMission: number; evaluationMoyenne: number; evolutionPerformance: Array<{ mois: string; evaluation: number; nombreMissions: number; }>; }; planning: Array<{ id: number; chantierNom: string; dateDebut: string; dateFin: string; statut: string; role: string; }>; } const EquipeDetailPage = () => { const [equipe, setEquipe] = useState(null); const [loading, setLoading] = useState(true); const router = useRouter(); const params = useParams(); const equipeId = params.id; useEffect(() => { if (equipeId) { loadEquipeDetail(); } }, [equipeId]); const loadEquipeDetail = async () => { try { setLoading(true); console.log('🔄 Chargement du détail équipe...', equipeId); const response = await apiClient.get(`/api/equipes/${equipeId}`); console.log('✅ Détail équipe chargé:', response.data); setEquipe(response.data); } catch (error) { console.error('❌ Erreur lors du chargement du détail:', error); } finally { setLoading(false); } }; const toggleStatutEquipe = async () => { if (!equipe) return; try { const newStatut = equipe.statut === 'ACTIVE' ? 'INACTIVE' : 'ACTIVE'; const endpoint = newStatut === 'ACTIVE' ? 'activer' : 'desactiver'; await apiClient.post(`/api/equipes/${equipe.id}/${endpoint}`); setEquipe({ ...equipe, statut: newStatut }); console.log(`✅ Statut équipe ${newStatut.toLowerCase()}`); } catch (error) { console.error('❌ Erreur lors du changement de statut:', error); } }; const getStatutSeverity = (statut: string) => { switch (statut) { case 'ACTIVE': return 'success'; case 'INACTIVE': return 'danger'; case 'EN_MISSION': return 'warning'; case 'DISPONIBLE': return 'info'; default: return 'secondary'; } }; const getSpecialiteColor = (specialite: string) => { const colors: { [key: string]: string } = { 'GROS_OEUVRE': 'danger', 'SECOND_OEUVRE': 'warning', 'FINITIONS': 'success', 'ELECTRICITE': 'info', 'PLOMBERIE': 'primary', 'CHARPENTE': 'help', 'COUVERTURE': 'secondary', 'TERRASSEMENT': 'contrast' }; return colors[specialite] || 'secondary'; }; const getMetierColor = (metier: string) => { const colors: { [key: string]: string } = { 'MACON': 'info', 'ELECTRICIEN': 'warning', 'PLOMBIER': 'primary', 'CHARPENTIER': 'success', 'PEINTRE': 'secondary', 'CHEF_EQUIPE': 'danger', 'CONDUCTEUR': 'help' }; return colors[metier] || 'secondary'; }; const getPerformanceChartData = () => { if (!equipe?.statistiques.evolutionPerformance) return {}; return { labels: equipe.statistiques.evolutionPerformance.map(e => e.mois), datasets: [{ label: 'Évaluation', data: equipe.statistiques.evolutionPerformance.map(e => e.evaluation), borderColor: '#4CAF50', backgroundColor: 'rgba(76, 175, 80, 0.1)', tension: 0.4 }] }; }; const metierBodyTemplate = (rowData: any) => { return ; }; const statutEmployeBodyTemplate = (rowData: any) => { return ; }; const competencesBodyTemplate = (rowData: any) => { return (
{rowData.competences?.slice(0, 2).map((comp: string, index: number) => ( ))} {rowData.competences?.length > 2 && ( )}
); }; const evaluationBodyTemplate = (rowData: any) => { return (
{[1, 2, 3, 4, 5].map((star) => ( ))}
); }; const actionEmployeBodyTemplate = (rowData: any) => { return (
); }; const leftToolbarTemplate = () => { return (
); }; const rightToolbarTemplate = () => { return (
); }; if (loading) { return (
); } if (!equipe) { return (

Équipe non trouvée

); } return (
{/* En-tête équipe */}

{equipe.nom}

📍 {equipe.localisation}

💰 {equipe.coutJournalier.toLocaleString('fr-FR')} €/jour

{equipe.chefEquipeNom &&

👤 Chef: {equipe.chefEquipeNom}

} {equipe.chantierActuel &&

🏗️ Chantier actuel: {equipe.chantierActuel.nom}

}
{equipe.evaluationPerformance}/5
Performance
{[1, 2, 3, 4, 5].map((star) => ( ))}
{/* Onglets de détail */}

Informations de base

{equipe.nom}

{equipe.description || 'Aucune description'}

{new Date(equipe.dateCreation).toLocaleDateString('fr-FR')}

{equipe.localisation}

Métriques

{equipe.tauxOccupation}%

{equipe.coutJournalier.toLocaleString('fr-FR')} €

{equipe.evaluationPerformance}/5

Compétences de l'équipe

{equipe.competencesEquipe && equipe.competencesEquipe.length > 0 ? (
{equipe.competencesEquipe.map((comp, index) => ( ))}
) : (

Aucune compétence renseignée

)}
`${rowData.prenom} ${rowData.nom}`} /> new Date(rowData.dateAffectation).toLocaleDateString('fr-FR')} /> new Date(rowData.dateDebut).toLocaleDateString('fr-FR')} /> new Date(rowData.dateFin).toLocaleDateString('fr-FR')} /> } /> new Date(rowData.dateDebut).toLocaleDateString('fr-FR')} /> new Date(rowData.dateFin).toLocaleDateString('fr-FR')} />

Métriques de performance

{equipe.statistiques?.tauxReussite || 0}%

{equipe.statistiques?.dureeMovenneMission || 0} jours

{equipe.statistiques?.evaluationMoyenne || 0}/5

Évolution des performances

); }; export default EquipeDetailPage;