'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 { Calendar } from 'primereact/calendar'; import { Dropdown } from 'primereact/dropdown'; import { Toast } from 'primereact/toast'; import { Toolbar } from 'primereact/toolbar'; import { Tag } from 'primereact/tag'; import { Card } from 'primereact/card'; import { FilterMatchMode } from 'primereact/api'; import { Timeline } from 'primereact/timeline'; import { maintenanceService } from '../../../../services/api'; import { MaintenanceMateriel, TypeMaintenance, StatutMaintenance } from '../../../../types/btp'; import { formatDate } from '../../../../utils/formatters'; const MaintenancesPlanifieesPage = () => { const [maintenances, setMaintenances] = useState([]); const [selectedMaintenances, setSelectedMaintenances] = useState([]); const [loading, setLoading] = useState(true); const [globalFilter, setGlobalFilter] = useState(''); const [dateDebut, setDateDebut] = useState(new Date()); const [dateFin, setDateFin] = useState(new Date(Date.now() + 30 * 24 * 60 * 60 * 1000)); // +30 jours const toast = useRef(null); const dt = useRef>(null); useEffect(() => { loadMaintenancesPlanifiees(); }, [dateDebut, dateFin]); const loadMaintenancesPlanifiees = async () => { try { setLoading(true); const data = await maintenanceService.getAll(); // Filtrer les maintenances planifiées const planifiees = data.filter(m => m.statut === StatutMaintenance.PLANIFIEE && new Date(m.datePrevue) >= (dateDebut || new Date()) && new Date(m.datePrevue) <= (dateFin || new Date(Date.now() + 30 * 24 * 60 * 60 * 1000)) ); setMaintenances(planifiees); } catch (error) { console.error('Erreur lors du chargement:', error); toast.current?.show({ severity: 'error', summary: 'Erreur', detail: 'Impossible de charger les maintenances planifiées', life: 3000 }); } finally { setLoading(false); } }; const demarrerMaintenance = async (maintenance: MaintenanceMateriel) => { try { const updatedMaintenance = { ...maintenance, statut: StatutMaintenance.EN_COURS, dateRealisee: new Date().toISOString() }; await maintenanceService.update(maintenance.id, updatedMaintenance); toast.current?.show({ severity: 'success', summary: 'Succès', detail: 'Maintenance démarrée', life: 3000 }); loadMaintenancesPlanifiees(); } catch (error: any) { toast.current?.show({ severity: 'error', summary: 'Erreur', detail: error?.userMessage || 'Erreur lors du démarrage', life: 3000 }); } }; const reporterMaintenance = async (maintenance: MaintenanceMateriel, nouveauJours: number = 7) => { try { const nouvelleDate = new Date(); nouvelleDate.setDate(nouvelleDate.getDate() + nouveauJours); const updatedMaintenance = { ...maintenance, datePrevue: nouvelleDate.toISOString(), notes: `${maintenance.notes || ''}\nReportée le ${formatDate(new Date())}` }; await maintenanceService.update(maintenance.id, updatedMaintenance); toast.current?.show({ severity: 'info', summary: 'Maintenance reportée', detail: `Nouvelle date: ${formatDate(nouvelleDate)}`, life: 3000 }); loadMaintenancesPlanifiees(); } catch (error: any) { toast.current?.show({ severity: 'error', summary: 'Erreur', detail: error?.userMessage || 'Erreur lors du report', life: 3000 }); } }; const exportCSV = () => { dt.current?.exportCSV(); }; // Templates pour les colonnes const materielBodyTemplate = (rowData: MaintenanceMateriel) => { return (
{rowData.materiel?.nom}
{rowData.materiel?.marque} {rowData.materiel?.modele}
); }; const typeBodyTemplate = (rowData: MaintenanceMateriel) => { return ( ); }; const prioriteBodyTemplate = (rowData: MaintenanceMateriel) => { const daysDiff = Math.ceil((new Date(rowData.datePrevue).getTime() - Date.now()) / (1000 * 60 * 60 * 24)); let severity; let label; if (daysDiff < 0) { severity = 'danger'; label = 'EN RETARD'; } else if (daysDiff <= 3) { severity = 'warning'; label = 'URGENT'; } else if (daysDiff <= 7) { severity = 'info'; label = 'PRIORITAIRE'; } else { severity = 'success'; label = 'NORMAL'; } return ; }; const dateBodyTemplate = (rowData: MaintenanceMateriel) => { const date = new Date(rowData.datePrevue); const today = new Date(); const daysDiff = Math.ceil((date.getTime() - today.getTime()) / (1000 * 60 * 60 * 24)); return (
{formatDate(rowData.datePrevue)}
{daysDiff < 0 ? `${Math.abs(daysDiff)} jour(s) de retard` : daysDiff === 0 ? 'Aujourd\'hui' : `Dans ${daysDiff} jour(s)`}
); }; const actionBodyTemplate = (rowData: MaintenanceMateriel) => { return (
); }; const getTypeSeverity = (type?: TypeMaintenance) => { switch (type) { case TypeMaintenance.PREVENTIVE: return 'success'; case TypeMaintenance.CORRECTIVE: return 'danger'; case TypeMaintenance.REVISION: return 'info'; case TypeMaintenance.CONTROLE_TECHNIQUE: return 'warning'; case TypeMaintenance.NETTOYAGE: return 'secondary'; default: return undefined; } }; const leftToolbarTemplate = () => { return (

Maintenances Planifiées

({maintenances.length} maintenances)
); }; const rightToolbarTemplate = () => { return (