'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 { InputNumber } from 'primereact/inputnumber'; 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 { materielService, maintenanceService } from '../../../../services/api'; import { Materiel, MaintenanceMateriel, TypeMateriel, TypeMaintenance } from '../../../../types/btp'; import { formatDate } from '../../../../utils/formatters'; const MaintenancePrevuePage = () => { const [materiels, setMateriels] = useState([]); const [selectedMateriels, setSelectedMateriels] = useState([]); const [loading, setLoading] = useState(true); const [globalFilter, setGlobalFilter] = useState(''); const [jours, setJours] = useState(30); const toast = useRef(null); const dt = useRef>(null); useEffect(() => { loadMaterielsMaintenancePrevue(); }, [jours]); const loadMaterielsMaintenancePrevue = async () => { try { setLoading(true); const data = await materielService.getMaintenancePrevue(jours); setMateriels(data); } catch (error) { console.error('Erreur lors du chargement:', error); toast.current?.show({ severity: 'error', summary: 'Erreur', detail: 'Impossible de charger les matériels nécessitant une maintenance', life: 3000 }); } finally { setLoading(false); } }; const programmerMaintenance = async (materiel: Materiel) => { try { const maintenanceData: Partial = { materiel: materiel, type: TypeMaintenance.PREVENTIVE, description: `Maintenance préventive programmée pour ${materiel.nom}`, datePrevue: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString() // Dans 7 jours }; await maintenanceService.create(maintenanceData); toast.current?.show({ severity: 'success', summary: 'Succès', detail: `Maintenance programmée pour ${materiel.nom}`, life: 3000 }); // Recharger la liste loadMaterielsMaintenancePrevue(); } catch (error: any) { toast.current?.show({ severity: 'error', summary: 'Erreur', detail: error?.userMessage || 'Erreur lors de la programmation', life: 3000 }); } }; const exportCSV = () => { dt.current?.exportCSV(); }; // Templates pour les colonnes const typeBodyTemplate = (rowData: Materiel) => { return ( ); }; const urgenceBodyTemplate = (rowData: Materiel) => { // Logique pour déterminer l'urgence basée sur les maintenances const derniereMaintenance = rowData.maintenances?.[0]; if (!derniereMaintenance) { return ; } const daysSinceLastMaintenance = Math.floor( (Date.now() - new Date(derniereMaintenance.dateRealisee || derniereMaintenance.datePrevue).getTime()) / (1000 * 60 * 60 * 24) ); if (daysSinceLastMaintenance > 90) { return ; } else if (daysSinceLastMaintenance > 60) { return ; } else { return ; } }; const derniereMaintenanceBodyTemplate = (rowData: Materiel) => { const derniereMaintenance = rowData.maintenances?.[0]; if (!derniereMaintenance) { return Aucune; } return formatDate(derniereMaintenance.dateRealisee || derniereMaintenance.datePrevue); }; const actionBodyTemplate = (rowData: Materiel) => { return (
); }; const signalerPanne = async (materiel: Materiel) => { try { const maintenanceData: Partial = { materiel: materiel, type: TypeMaintenance.CORRECTIVE, description: `Panne signalée sur ${materiel.nom}`, datePrevue: new Date().toISOString() // Immédiatement }; await maintenanceService.create(maintenanceData); toast.current?.show({ severity: 'success', summary: 'Succès', detail: `Panne signalée pour ${materiel.nom}`, life: 3000 }); } catch (error: any) { toast.current?.show({ severity: 'error', summary: 'Erreur', detail: error?.userMessage || 'Erreur lors du signalement', life: 3000 }); } }; const getTypeSeverity = (type?: TypeMateriel) => { switch (type) { case TypeMateriel.ENGIN_CHANTIER: return 'danger'; case TypeMateriel.OUTIL_ELECTRIQUE: case TypeMateriel.OUTIL_MANUEL: return 'warning'; case TypeMateriel.EQUIPEMENT_SECURITE: return 'success'; case TypeMateriel.VEHICULE: return 'info'; case TypeMateriel.GRUE: case TypeMateriel.BETONIERE: return 'danger'; default: return 'secondary'; } }; const leftToolbarTemplate = () => { return (

Maintenance Prévue

({materiels.length} matériels)
); }; const rightToolbarTemplate = () => { return (