'use client'; import React, { useState, useEffect, useRef } from 'react'; import { DataTable } from 'primereact/datatable'; import { Column } from 'primereact/column'; import { Button } from 'primereact/button'; import { InputText } from 'primereact/inputtext'; import { Card } from 'primereact/card'; import { Toast } from 'primereact/toast'; import { Toolbar } from 'primereact/toolbar'; import { Tag } from 'primereact/tag'; import { ProgressBar } from 'primereact/progressbar'; import { Dialog } from 'primereact/dialog'; import { Calendar } from 'primereact/calendar'; import { InputNumber } from 'primereact/inputnumber'; import { chantierService } from '../../../../services/api'; import { formatDate, formatCurrency } from '../../../../utils/formatters'; import type { Chantier, StatutChantier } from '../../../../types/btp'; const ChantiersEnCoursPage = () => { const [chantiers, setChantiers] = useState([]); const [loading, setLoading] = useState(true); const [globalFilter, setGlobalFilter] = useState(''); const [selectedChantiers, setSelectedChantiers] = useState([]); const [updateDialog, setUpdateDialog] = useState(false); const [selectedChantier, setSelectedChantier] = useState(null); const [updateData, setUpdateData] = useState({ dateFinReelle: null, montantReel: 0 }); const toast = useRef(null); const dt = useRef>(null); useEffect(() => { loadChantiers(); }, []); const loadChantiers = async () => { try { setLoading(true); const data = await chantierService.getAll(); // Filtrer seulement les chantiers en cours const chantiersEnCours = data.filter(chantier => chantier.statut === 'EN_COURS'); setChantiers(chantiersEnCours); } catch (error) { console.error('Erreur lors du chargement des chantiers:', error); toast.current?.show({ severity: 'error', summary: 'Erreur', detail: 'Impossible de charger les chantiers en cours', life: 3000 }); } finally { setLoading(false); } }; const calculateProgress = (chantier: Chantier) => { if (!chantier.dateDebut || !chantier.dateFinPrevue) return 0; const now = new Date(); const start = new Date(chantier.dateDebut); const end = new Date(chantier.dateFinPrevue); const totalDays = (end.getTime() - start.getTime()) / (1000 * 60 * 60 * 24); const elapsedDays = (now.getTime() - start.getTime()) / (1000 * 60 * 60 * 24); return Math.min(Math.max((elapsedDays / totalDays) * 100, 0), 100); }; const isLate = (chantier: Chantier) => { if (!chantier.dateFinPrevue) return false; const today = new Date(); const endDate = new Date(chantier.dateFinPrevue); return today > endDate; }; const markAsCompleted = (chantier: Chantier) => { setSelectedChantier(chantier); setUpdateData({ dateFinReelle: new Date(), montantReel: chantier.montantReel || chantier.montantPrevu || 0 }); setUpdateDialog(true); }; const handleCompleteChantier = async () => { if (!selectedChantier) return; try { const updatedChantier = { ...selectedChantier, statut: 'TERMINE' as StatutChantier, dateFinReelle: updateData.dateFinReelle, montantReel: updateData.montantReel }; await chantierService.update(selectedChantier.id, updatedChantier); // Retirer le chantier de la liste car il n'est plus "en cours" setChantiers(prev => prev.filter(c => c.id !== selectedChantier.id)); setUpdateDialog(false); toast.current?.show({ severity: 'success', summary: 'Succès', detail: 'Chantier marqué comme terminé', life: 3000 }); } catch (error) { console.error('Erreur lors de la mise à jour:', error); toast.current?.show({ severity: 'error', summary: 'Erreur', detail: 'Impossible de mettre à jour le chantier', life: 3000 }); } }; const exportCSV = () => { dt.current?.exportCSV(); }; const leftToolbarTemplate = () => { return (
Chantiers en cours ({chantiers.length})
); }; const rightToolbarTemplate = () => { return (