'use client'; import React, { useState, useEffect } from 'react'; import { Card } from 'primereact/card'; import { Chart } from 'primereact/chart'; import { Button } from 'primereact/button'; import { Toolbar } from 'primereact/toolbar'; import { DataTable } from 'primereact/datatable'; import { Column } from 'primereact/column'; import { Tag } from 'primereact/tag'; import { Badge } from 'primereact/badge'; import { ProgressBar } from 'primereact/progressbar'; import { useRouter } from 'next/navigation'; import { apiClient } from '../../../../services/api-client'; interface StatistiquesEquipes { totalEquipes: number; equipesActives: number; equipesInactives: number; equipesDisponibles: number; equipesEnMission: number; repartitionParSpecialite: { [key: string]: number }; tauxOccupationMoyen: number; tauxOccupationParSpecialite: { [key: string]: number }; performanceMoyenne: number; performanceParSpecialite: { [key: string]: number }; coutMoyenJournalier: number; coutParSpecialite: { [key: string]: number }; nombreEmployesMoyen: number; repartitionTailleEquipes: { [key: string]: number }; topEquipesPerformantes: Array<{ id: number; nom: string; specialite: string; evaluationPerformance: number; nombreMissions: number; tauxReussite: number; }>; equipesProblematiques: Array<{ id: number; nom: string; specialite: string; problemes: string[]; tauxOccupation: number; }>; evolutionMensuelle: Array<{ mois: string; nombreEquipes: number; tauxOccupation: number; performanceMoyenne: number; }>; } const StatistiquesEquipesPage = () => { const [stats, setStats] = useState(null); const [loading, setLoading] = useState(true); const [chartOptions] = useState({ responsive: true, maintainAspectRatio: false, plugins: { legend: { position: 'bottom' } } }); const router = useRouter(); useEffect(() => { loadStatistiques(); }, []); const loadStatistiques = async () => { try { setLoading(true); console.log('🔄 Chargement des statistiques équipes...'); const response = await apiClient.get('/api/equipes/statistiques'); console.log('✅ Statistiques équipes chargées:', response.data); setStats(response.data); } catch (error) { console.error('❌ Erreur lors du chargement des statistiques:', error); } finally { setLoading(false); } }; const getStatutChartData = () => { if (!stats) return {}; return { labels: ['Actives', 'Disponibles', 'En mission', 'Inactives'], datasets: [{ data: [ stats.equipesActives, stats.equipesDisponibles, stats.equipesEnMission, stats.equipesInactives ], backgroundColor: [ '#4CAF50', '#2196F3', '#FF9800', '#F44336' ], borderWidth: 2 }] }; }; const getSpecialiteChartData = () => { if (!stats) return {}; return { labels: Object.keys(stats.repartitionParSpecialite), datasets: [{ data: Object.values(stats.repartitionParSpecialite), backgroundColor: [ '#FF6384', '#36A2EB', '#FFCE56', '#4BC0C0', '#9966FF', '#FF9F40', '#FF6384', '#C9CBCF' ], borderWidth: 2 }] }; }; const getOccupationChartData = () => { if (!stats) return {}; return { labels: Object.keys(stats.tauxOccupationParSpecialite), datasets: [{ label: 'Taux d\'occupation (%)', data: Object.values(stats.tauxOccupationParSpecialite), backgroundColor: '#36A2EB', borderColor: '#36A2EB', borderWidth: 1 }] }; }; const getEvolutionChartData = () => { if (!stats) return {}; return { labels: stats.evolutionMensuelle.map(e => e.mois), datasets: [ { label: 'Nombre d\'équipes', data: stats.evolutionMensuelle.map(e => e.nombreEquipes), borderColor: '#4CAF50', backgroundColor: 'rgba(76, 175, 80, 0.1)', yAxisID: 'y' }, { label: 'Taux d\'occupation (%)', data: stats.evolutionMensuelle.map(e => e.tauxOccupation), borderColor: '#FF9800', backgroundColor: 'rgba(255, 152, 0, 0.1)', yAxisID: 'y1' } ] }; }; const getEvolutionChartOptions = () => { return { ...chartOptions, scales: { y: { type: 'linear', display: true, position: 'left', }, y1: { type: 'linear', display: true, position: 'right', grid: { drawOnChartArea: false, }, }, } }; }; const performanceBodyTemplate = (rowData: any) => { return (
{[1, 2, 3, 4, 5].map((star) => ( ))}
); }; const tauxReussiteBodyTemplate = (rowData: any) => { const getColor = (taux: number) => { if (taux >= 90) return 'success'; if (taux >= 75) return 'info'; if (taux >= 60) return 'warning'; return 'danger'; }; return (
); }; const problemesBodyTemplate = (rowData: any) => { return (
{rowData.problemes?.slice(0, 2).map((probleme: string, index: number) => ( ))} {rowData.problemes?.length > 2 && ( )}
); }; const actionBodyTemplate = (rowData: any) => { return (