'use client'; export const dynamic = 'force-dynamic'; import React, { useState, useEffect } from 'react'; import { DataTable } from 'primereact/datatable'; import { Column } from 'primereact/column'; import { Button } from 'primereact/button'; import { InputText } from 'primereact/inputtext'; import { Tag } from 'primereact/tag'; import { Card } from 'primereact/card'; import { Toolbar } from 'primereact/toolbar'; import { Badge } from 'primereact/badge'; import { Calendar } from 'primereact/calendar'; import { Dropdown } from 'primereact/dropdown'; import { useRouter } from 'next/navigation'; import { apiClient } from '../../../../services/api-client'; interface EquipeDisponible { id: number; nom: string; specialite: string; nombreEmployes: number; chefEquipeNom?: string; competencesEquipe: string[]; prochaineDispo: string; dureeDisponibilite: number; // en jours tauxOccupation: number; dernierChantier?: string; evaluationPerformance: number; // sur 5 coutJournalier: number; localisation: string; } const EquipesDisponiblesPage = () => { const [equipes, setEquipes] = useState([]); const [loading, setLoading] = useState(true); const [globalFilter, setGlobalFilter] = useState(''); const [dateRecherche, setDateRecherche] = useState(null); const [specialiteFilter, setSpecialiteFilter] = useState(null); const [dureeMinimale, setDureeMinimale] = useState(null); const router = useRouter(); const specialiteOptions = [ { label: 'Toutes', value: null }, { label: 'Gros œuvre', value: 'GROS_OEUVRE' }, { label: 'Second œuvre', value: 'SECOND_OEUVRE' }, { label: 'Finitions', value: 'FINITIONS' }, { label: 'Électricité', value: 'ELECTRICITE' }, { label: 'Plomberie', value: 'PLOMBERIE' }, { label: 'Charpente', value: 'CHARPENTE' }, { label: 'Couverture', value: 'COUVERTURE' }, { label: 'Terrassement', value: 'TERRASSEMENT' } ]; const dureeOptions = [ { label: 'Toutes durées', value: null }, { label: '1 semaine minimum', value: 7 }, { label: '2 semaines minimum', value: 14 }, { label: '1 mois minimum', value: 30 }, { label: '2 mois minimum', value: 60 }, { label: '3 mois minimum', value: 90 } ]; useEffect(() => { loadEquipesDisponibles(); }, [dateRecherche, specialiteFilter, dureeMinimale]); const loadEquipesDisponibles = async () => { try { setLoading(true); console.log('🔄 Chargement des équipes disponibles...'); const params = new URLSearchParams(); if (dateRecherche) { params.append('date', dateRecherche.toISOString().split('T')[0]); } if (specialiteFilter) { params.append('specialite', specialiteFilter); } if (dureeMinimale) { params.append('dureeMin', dureeMinimale.toString()); } const response = await apiClient.get(`/api/equipes/disponibles?${params.toString()}`); console.log('✅ Équipes disponibles chargées:', response.data); setEquipes(response.data || []); } catch (error) { console.error('❌ Erreur lors du chargement:', error); setEquipes([]); } finally { setLoading(false); } }; const assignerEquipe = async (equipe: EquipeDisponible) => { // Rediriger vers la page d'assignation avec l'ID de l'équipe router.push(`/planning/assigner?equipeId=${equipe.id}`); }; const specialiteBodyTemplate = (rowData: EquipeDisponible) => { 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'; }; return ; }; const chefEquipeBodyTemplate = (rowData: EquipeDisponible) => { if (rowData.chefEquipeNom) { return (
{rowData.chefEquipeNom}
); } return Non assigné; }; const disponibiliteBodyTemplate = (rowData: EquipeDisponible) => { const dateProchaine = new Date(rowData.prochaineDispo); const isDispoMaintenant = dateProchaine <= new Date(); return (
{isDispoMaintenant ? 'Disponible maintenant' : dateProchaine.toLocaleDateString('fr-FR')}
Durée: {rowData.dureeDisponibilite} jours
); }; const performanceBodyTemplate = (rowData: EquipeDisponible) => { const getPerformanceColor = (note: number) => { if (note >= 4.5) return 'success'; if (note >= 3.5) return 'warning'; if (note >= 2.5) return 'info'; return 'danger'; }; return (
{[1, 2, 3, 4, 5].map((star) => ( ))}
); }; const competencesBodyTemplate = (rowData: EquipeDisponible) => { return (
{rowData.competencesEquipe?.slice(0, 3).map((comp, index) => ( ))} {rowData.competencesEquipe?.length > 3 && ( )}
); }; const coutBodyTemplate = (rowData: EquipeDisponible) => { return (
{rowData.coutJournalier.toLocaleString('fr-FR')} €/jour {rowData.nombreEmployes} employés
); }; const localisationBodyTemplate = (rowData: EquipeDisponible) => { return (
{rowData.localisation}
); }; const actionBodyTemplate = (rowData: EquipeDisponible) => { return (
); }; const leftToolbarTemplate = () => { return (
); }; const rightToolbarTemplate = () => { return (
setGlobalFilter(e.target.value)} />
); }; const header = (

Équipes Disponibles

équipes disponibles
); return (
{/* Filtres */}
setDateRecherche(e.value as Date)} placeholder="Sélectionner une date" showIcon dateFormat="dd/mm/yy" showButtonBar />
setSpecialiteFilter(e.value)} placeholder="Toutes spécialités" />
setDureeMinimale(e.value)} placeholder="Toutes durées" />
); }; export default EquipesDisponiblesPage;