'use client'; export const dynamic = 'force-dynamic'; 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 { DataTable } from 'primereact/datatable'; import { Column } from 'primereact/column'; import { TabView, TabPanel } from 'primereact/tabview'; import { ProgressBar } from 'primereact/progressbar'; import { useRouter } from 'next/navigation'; import { apiClient } from '../../../../services/api-client'; interface EquipeParSpecialite { specialite: string; nombreEquipes: number; equipesActives: number; equipesDisponibles: number; equipesEnMission: number; tauxOccupationMoyen: number; competencesPrincipales: string[]; equipes: Array<{ id: number; nom: string; statut: string; nombreEmployes: number; chefEquipeNom?: string; chantierActuel?: string; tauxOccupation: number; evaluationPerformance: number; }>; } const EquipesSpecialitesPage = () => { const [specialites, setSpecialites] = useState([]); const [loading, setLoading] = useState(true); const [activeIndex, setActiveIndex] = useState(0); const router = useRouter(); const specialiteLabels: { [key: string]: string } = { 'GROS_OEUVRE': 'Gros Œuvre', 'SECOND_OEUVRE': 'Second Œuvre', 'FINITIONS': 'Finitions', 'ELECTRICITE': 'Électricité', 'PLOMBERIE': 'Plomberie', 'CHARPENTE': 'Charpente', 'COUVERTURE': 'Couverture', 'TERRASSEMENT': 'Terrassement' }; const specialiteColors: { [key: string]: string } = { 'GROS_OEUVRE': 'danger', 'SECOND_OEUVRE': 'warning', 'FINITIONS': 'success', 'ELECTRICITE': 'info', 'PLOMBERIE': 'primary', 'CHARPENTE': 'help', 'COUVERTURE': 'secondary', 'TERRASSEMENT': 'contrast' }; useEffect(() => { loadEquipesParSpecialite(); }, []); const loadEquipesParSpecialite = async () => { try { setLoading(true); console.log('🔄 Chargement des équipes par spécialité...'); const response = await apiClient.get('/api/equipes/par-specialite'); console.log('✅ Équipes par spécialité chargées:', response.data); setSpecialites(response.data || []); } catch (error) { console.error('❌ Erreur lors du chargement:', error); setSpecialites([]); } finally { setLoading(false); } }; 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 getOccupationColor = (taux: number) => { if (taux >= 90) return 'danger'; if (taux >= 70) return 'warning'; if (taux >= 40) return 'success'; return 'info'; }; const statutBodyTemplate = (rowData: any) => { return ; }; const chefEquipeBodyTemplate = (rowData: any) => { if (rowData.chefEquipeNom) { return (
{rowData.chefEquipeNom}
); } return Non assigné; }; const occupationBodyTemplate = (rowData: any) => { return (
{rowData.chantierActuel && ( {rowData.chantierActuel} )}
); }; const performanceBodyTemplate = (rowData: any) => { return (
{[1, 2, 3, 4, 5].map((star) => ( ))}
); }; const actionBodyTemplate = (rowData: any) => { return (
); }; const renderSpecialiteCard = (specialiteData: EquipeParSpecialite) => { return (
équipes
{/* Métriques */}
{specialiteData.equipesActives}
Actives
{specialiteData.equipesDisponibles}
Disponibles
{specialiteData.equipesEnMission}
En mission
{specialiteData.tauxOccupationMoyen}%
Occupation
{/* Compétences principales */}

Compétences principales

{specialiteData.competencesPrincipales?.map((comp, index) => ( ))}
{/* Liste des équipes */}
); }; const leftToolbarTemplate = () => { return (
); }; const rightToolbarTemplate = () => { return (
); }; if (loading) { return (
); } return (

Équipes par Spécialité

spécialités acc + s.nombreEquipes, 0)} severity="success" /> équipes total
setActiveIndex(e.index)}>
{specialites.map((specialiteData) => (
{renderSpecialiteCard(specialiteData)}
))}
{specialites.map((specialiteData) => (
{specialiteData.nombreEquipes}
équipes
{specialiteData.equipesActives}
Actives
{specialiteData.equipesDisponibles}
Disponibles
))}
); }; export default EquipesSpecialitesPage;