'use client'; import React, { useState, useEffect } from 'react'; import { Card } from 'primereact/card'; import { DataTable } from 'primereact/datatable'; import { Column } from 'primereact/column'; import { Tag } from 'primereact/tag'; import { Button } from 'primereact/button'; import { ProgressBar } from 'primereact/progressbar'; import { Chart } from 'primereact/chart'; import type { Client, Chantier } from '../../../../types/btp'; import type { User } from '../../../../types/auth'; import clientService from '../../../../services/clientService'; import chantierService from '../../../../services/chantierService'; import { useAuth } from '../../../../contexts/AuthContext'; interface GestionnaireStats { clientsAttribues: number; chantiersEnCours: number; chantiersTermines: number; chiffreAffairesTotal: number; chiffreAffairesMois: number; } const GestionnaireDashboard = () => { const [stats, setStats] = useState({ clientsAttribues: 0, chantiersEnCours: 0, chantiersTermines: 0, chiffreAffairesTotal: 0, chiffreAffairesMois: 0 }); const [clientsAttribues, setClientsAttribues] = useState([]); const [chantiersRecents, setChantiersRecents] = useState([]); const [loading, setLoading] = useState(true); const { user: currentUser } = useAuth(); // Vérifier que l'utilisateur est connecté et est un gestionnaire if (!currentUser || currentUser.role !== 'GESTIONNAIRE_PROJET') { return (

Accès non autorisé

Vous devez être connecté en tant que gestionnaire de projet.

); } useEffect(() => { loadDashboardData(); }, []); const loadDashboardData = async () => { try { setLoading(true); // Charger tous les clients pour filtrer ceux attribués const allClients = await clientService.getAll(); const myClients = allClients.filter(client => client.gestionnairePrincipalId === currentUser.id || client.gestionnairesSecondaires?.includes(currentUser.id) ); setClientsAttribues(myClients); // Charger tous les chantiers pour filtrer ceux des clients attribués const allChantiers = await chantierService.getAll(); const myChantiers = allChantiers.filter(chantier => myClients.some(client => client.id === chantier.client?.id) ); // Prendre les 5 chantiers les plus récents const recentChantiers = myChantiers .sort((a, b) => new Date(b.dateCreation).getTime() - new Date(a.dateCreation).getTime()) .slice(0, 5); setChantiersRecents(recentChantiers); // Calculer les statistiques const chantiersEnCours = myChantiers.filter(c => c.statut === 'EN_COURS').length; const chantiersTermines = myChantiers.filter(c => c.statut === 'TERMINE').length; const chiffreAffairesTotal = myChantiers.reduce((sum, c) => sum + (c.montantPrevu || 0), 0); // CA du mois en cours const currentMonth = new Date().getMonth(); const currentYear = new Date().getFullYear(); const chiffreAffairesMois = myChantiers .filter(c => { const dateDebut = new Date(c.dateDebut); return dateDebut.getMonth() === currentMonth && dateDebut.getFullYear() === currentYear; }) .reduce((sum, c) => sum + (c.montantPrevu || 0), 0); setStats({ clientsAttribues: myClients.length, chantiersEnCours, chantiersTermines, chiffreAffairesTotal, chiffreAffairesMois }); } catch (error) { console.error('Erreur lors du chargement du dashboard gestionnaire:', error); } finally { setLoading(false); } }; const clientBodyTemplate = (rowData: Client) => { return (
{`${rowData.prenom} ${rowData.nom}`} {rowData.entreprise && ( {rowData.entreprise} )}
); }; const contactBodyTemplate = (rowData: Client) => { return (
{rowData.email && (
{rowData.email}
)} {rowData.telephone && (
{rowData.telephone}
)}
); }; const chantierStatutBodyTemplate = (rowData: Chantier) => { return ( ); }; const montantBodyTemplate = (rowData: Chantier) => { return new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR' }).format(rowData.montantPrevu || 0); }; const avancementBodyTemplate = (rowData: Chantier) => { const avancement = chantierService.calculateAvancement(rowData); return (
{Math.round(avancement)}%
); }; // Données pour le graphique des chantiers par statut const chartData = { labels: ['En cours', 'Terminés', 'Planifiés'], datasets: [ { data: [stats.chantiersEnCours, stats.chantiersTermines, 0], backgroundColor: ['#42A5F5', '#66BB6A', '#FFA726'], borderWidth: 0 } ] }; const chartOptions = { plugins: { legend: { position: 'bottom' as const } }, responsive: true, maintainAspectRatio: false }; return (
{/* Header */}

Dashboard Gestionnaire

Bienvenue {currentUser.prenom} {currentUser.nom}

{/* Statistiques principales */}
{stats.clientsAttribues}
Clients attribués
{stats.chantiersEnCours}
Chantiers en cours
{stats.chantiersTermines}
Chantiers terminés
{new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', notation: 'compact' }).format(stats.chiffreAffairesTotal)}
CA Total
{/* Graphique et clients */}
(
{/* Chantiers récents */}
rowData.client ? `${rowData.client.prenom} ${rowData.client.nom}` : '' } style={{ minWidth: '12rem' }} /> new Date(rowData.dateDebut).toLocaleDateString('fr-FR')} style={{ minWidth: '10rem' }} /> (
)} style={{ minWidth: '8rem' }} />
); }; export default GestionnaireDashboard;