'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 { Dialog } from 'primereact/dialog'; import { Toast } from 'primereact/toast'; import { ConfirmDialog } from 'primereact/confirmdialog'; import { Calendar } from 'primereact/calendar'; import { Dropdown } from 'primereact/dropdown'; import { useRouter } from 'next/navigation'; import { apiClient } from '../../../services/api-client'; interface Maintenance { id: number; materielId: number; materielNom: string; materielType: string; typeMaintenance: 'PREVENTIVE' | 'CORRECTIVE' | 'PLANIFIEE' | 'URGENTE'; statut: 'PLANIFIEE' | 'EN_COURS' | 'TERMINEE' | 'ANNULEE' | 'EN_ATTENTE'; priorite: 'BASSE' | 'NORMALE' | 'HAUTE' | 'CRITIQUE'; dateCreation: string; datePlanifiee: string; dateDebut?: string; dateFin?: string; technicienId?: number; technicienNom?: string; description: string; problemeSignale?: string; solutionApportee?: string; coutEstime?: number; coutReel?: number; piecesUtilisees: Array<{ nom: string; quantite: number; cout: number; }>; dureeEstimee: number; // en heures dureeReelle?: number; // en heures prochaineMaintenance?: string; observations?: string; } const MaintenancePage = () => { const [maintenances, setMaintenances] = useState([]); const [loading, setLoading] = useState(true); const [globalFilter, setGlobalFilter] = useState(''); const [selectedMaintenances, setSelectedMaintenances] = useState([]); const [deleteDialog, setDeleteDialog] = useState(false); const [maintenanceToDelete, setMaintenanceToDelete] = useState(null); const [filterType, setFilterType] = useState(null); const [filterStatut, setFilterStatut] = useState(null); const [filterPriorite, setFilterPriorite] = useState(null); const router = useRouter(); const typeOptions = [ { label: 'Tous', value: null }, { label: 'Préventive', value: 'PREVENTIVE' }, { label: 'Corrective', value: 'CORRECTIVE' }, { label: 'Planifiée', value: 'PLANIFIEE' }, { label: 'Urgente', value: 'URGENTE' } ]; const statutOptions = [ { label: 'Tous', value: null }, { label: 'Planifiée', value: 'PLANIFIEE' }, { label: 'En cours', value: 'EN_COURS' }, { label: 'Terminée', value: 'TERMINEE' }, { label: 'Annulée', value: 'ANNULEE' }, { label: 'En attente', value: 'EN_ATTENTE' } ]; const prioriteOptions = [ { label: 'Toutes', value: null }, { label: 'Basse', value: 'BASSE' }, { label: 'Normale', value: 'NORMALE' }, { label: 'Haute', value: 'HAUTE' }, { label: 'Critique', value: 'CRITIQUE' } ]; useEffect(() => { loadMaintenances(); }, [filterType, filterStatut, filterPriorite]); const loadMaintenances = async () => { try { setLoading(true); console.log('🔄 Chargement des maintenances...'); const params = new URLSearchParams(); if (filterType) params.append('type', filterType); if (filterStatut) params.append('statut', filterStatut); if (filterPriorite) params.append('priorite', filterPriorite); const response = await apiClient.get(`/api/maintenances?${params.toString()}`); console.log('✅ Maintenances chargées:', response.data); setMaintenances(response.data || []); } catch (error) { console.error('❌ Erreur lors du chargement des maintenances:', error); setMaintenances([]); } finally { setLoading(false); } }; const confirmDeleteMaintenance = (maintenance: Maintenance) => { setMaintenanceToDelete(maintenance); setDeleteDialog(true); }; const deleteMaintenance = async () => { if (maintenanceToDelete) { try { await apiClient.delete(`/api/maintenances/${maintenanceToDelete.id}`); setMaintenances(maintenances.filter(m => m.id !== maintenanceToDelete.id)); setDeleteDialog(false); setMaintenanceToDelete(null); console.log('✅ Maintenance supprimée avec succès'); } catch (error) { console.error('❌ Erreur lors de la suppression:', error); } } }; const changerStatutMaintenance = async (maintenance: Maintenance, nouveauStatut: string) => { try { await apiClient.post(`/api/maintenances/${maintenance.id}/statut`, { statut: nouveauStatut }); setMaintenances(maintenances.map(m => m.id === maintenance.id ? { ...m, statut: nouveauStatut as any } : m )); console.log(`✅ Statut maintenance changé: ${nouveauStatut}`); } catch (error) { console.error('❌ Erreur lors du changement de statut:', error); } }; const typeBodyTemplate = (rowData: Maintenance) => { const getTypeSeverity = (type: string) => { switch (type) { case 'PREVENTIVE': return 'info'; case 'CORRECTIVE': return 'warning'; case 'PLANIFIEE': return 'success'; case 'URGENTE': return 'danger'; default: return 'secondary'; } }; return ; }; const statutBodyTemplate = (rowData: Maintenance) => { const getStatutSeverity = (statut: string) => { switch (statut) { case 'PLANIFIEE': return 'info'; case 'EN_COURS': return 'warning'; case 'TERMINEE': return 'success'; case 'ANNULEE': return 'danger'; case 'EN_ATTENTE': return 'secondary'; default: return 'secondary'; } }; return ; }; const prioriteBodyTemplate = (rowData: Maintenance) => { const getPrioriteSeverity = (priorite: string) => { switch (priorite) { case 'BASSE': return 'info'; case 'NORMALE': return 'success'; case 'HAUTE': return 'warning'; case 'CRITIQUE': return 'danger'; default: return 'secondary'; } }; return ; }; const materielBodyTemplate = (rowData: Maintenance) => { return (
{rowData.materielNom} {rowData.materielType}
); }; const technicienBodyTemplate = (rowData: Maintenance) => { if (rowData.technicienNom) { return (
{rowData.technicienNom}
); } return Non assigné; }; const dateBodyTemplate = (rowData: Maintenance) => { const datePlanifiee = new Date(rowData.datePlanifiee); const isUrgent = rowData.typeMaintenance === 'URGENTE'; const isRetard = datePlanifiee < new Date() && rowData.statut !== 'TERMINEE'; return (
{datePlanifiee.toLocaleDateString('fr-FR')} {isUrgent && } {isRetard && }
); }; const coutBodyTemplate = (rowData: Maintenance) => { const coutAffiche = rowData.coutReel || rowData.coutEstime; const isReel = !!rowData.coutReel; return (
{coutAffiche && ( {coutAffiche.toLocaleString('fr-FR')} € )} {isReel ? 'Coût réel' : 'Coût estimé'}
); }; const dureeBodyTemplate = (rowData: Maintenance) => { const dureeAffichee = rowData.dureeReelle || rowData.dureeEstimee; const isReelle = !!rowData.dureeReelle; return (
{dureeAffichee}h {isReelle ? 'Durée réelle' : 'Durée estimée'}
); }; const actionBodyTemplate = (rowData: Maintenance) => { return (
); }; const leftToolbarTemplate = () => { return (
); }; const rightToolbarTemplate = () => { return (
setGlobalFilter(e.target.value)} />
); }; const header = (

Gestion de la Maintenance

m.statut === 'EN_COURS').length} severity="warning" /> En cours m.typeMaintenance === 'URGENTE').length} severity="danger" /> Urgentes new Date(m.datePlanifiee) < new Date() && m.statut !== 'TERMINEE').length} severity="danger" /> En retard
); return (
{/* Filtres */}
setFilterType(e.value)} placeholder="Tous les types" />
setFilterStatut(e.value)} placeholder="Tous les statuts" />
setFilterPriorite(e.value)} placeholder="Toutes les priorités" />
setSelectedMaintenances(e.value)} selectionMode="checkbox" responsiveLayout="scroll" >
setDeleteDialog(false)} message={`Êtes-vous sûr de vouloir supprimer cette maintenance ?`} header="Confirmation de suppression" icon="pi pi-exclamation-triangle" accept={deleteMaintenance} reject={() => setDeleteDialog(false)} acceptLabel="Oui" rejectLabel="Non" acceptClassName="p-button-danger" />
); }; export default MaintenancePage;