'use client'; export const dynamic = 'force-dynamic'; 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 { Dialog } from 'primereact/dialog'; import { Rating } from 'primereact/rating'; import { InputTextarea } from 'primereact/inputtextarea'; import { chantierService } from '../../../../services/api'; import { formatDate, formatCurrency } from '../../../../utils/formatters'; import type { Chantier } from '../../../../types/btp'; const ChantiersTerminesPage = () => { const [chantiers, setChantiers] = useState([]); const [loading, setLoading] = useState(true); const [globalFilter, setGlobalFilter] = useState(''); const [selectedChantiers, setSelectedChantiers] = useState([]); const [detailDialog, setDetailDialog] = useState(false); const [selectedChantier, setSelectedChantier] = useState(null); const [satisfaction, setSatisfaction] = useState(5); const [notes, setNotes] = useState(''); 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 terminés const chantiersTermines = data.filter(chantier => chantier.statut === 'TERMINE'); setChantiers(chantiersTermines); } catch (error) { console.error('Erreur lors du chargement des chantiers:', error); toast.current?.show({ severity: 'error', summary: 'Erreur', detail: 'Impossible de charger les chantiers terminés', life: 3000 }); } finally { setLoading(false); } }; const calculateDuration = (dateDebut: string | Date, dateFinReelle: string | Date) => { const start = new Date(dateDebut); const end = new Date(dateFinReelle); const diffTime = end.getTime() - start.getTime(); const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); return diffDays; }; const calculateDelay = (dateFinPrevue: string | Date, dateFinReelle: string | Date) => { const planned = new Date(dateFinPrevue); const actual = new Date(dateFinReelle); const diffTime = actual.getTime() - planned.getTime(); const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); return diffDays; }; const isOnTime = (dateFinPrevue: string | Date, dateFinReelle: string | Date) => { const delay = calculateDelay(dateFinPrevue, dateFinReelle); return delay <= 0; }; const isOnBudget = (montantPrevu: number, montantReel: number) => { return montantReel <= montantPrevu; }; const getBudgetVariance = (montantPrevu: number, montantReel: number) => { return ((montantReel - montantPrevu) / montantPrevu) * 100; }; const viewDetails = (chantier: Chantier) => { setSelectedChantier(chantier); setSatisfaction(5); setNotes(''); setDetailDialog(true); }; const exportCSV = () => { dt.current?.exportCSV(); }; const generateReport = () => { const totalProjects = chantiers.length; const onTimeProjects = chantiers.filter(c => c.dateFinReelle && isOnTime(c.dateFinPrevue, c.dateFinReelle) ).length; const onBudgetProjects = chantiers.filter(c => isOnBudget(c.montantPrevu || 0, c.montantReel || 0) ).length; const totalBudget = chantiers.reduce((sum, c) => sum + (c.montantPrevu || 0), 0); const totalCost = chantiers.reduce((sum, c) => sum + (c.montantReel || 0), 0); const report = ` === RAPPORT CHANTIERS TERMINÉS === Nombre total de chantiers: ${totalProjects} Chantiers dans les délais: ${onTimeProjects} (${Math.round(onTimeProjects/totalProjects*100)}%) Chantiers dans le budget: ${onBudgetProjects} (${Math.round(onBudgetProjects/totalProjects*100)}%) Budget total prévu: ${formatCurrency(totalBudget)} Coût total réel: ${formatCurrency(totalCost)} Variance budgétaire: ${formatCurrency(totalCost - totalBudget)} (${Math.round(((totalCost - totalBudget)/totalBudget)*100)}%) `; const blob = new Blob([report], { type: 'text/plain;charset=utf-8;' }); const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = `rapport_chantiers_termines_${new Date().toISOString().split('T')[0]}.txt`; link.click(); toast.current?.show({ severity: 'success', summary: 'Rapport généré', detail: 'Le rapport a été téléchargé', life: 3000 }); }; const leftToolbarTemplate = () => { return (
Chantiers terminés ({chantiers.length})
); }; const rightToolbarTemplate = () => { return (