'use client'; 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 { InputTextarea } from 'primereact/inputtextarea'; import { Dropdown } from 'primereact/dropdown'; import { Calendar } from 'primereact/calendar'; import { useRouter } from 'next/navigation'; import { apiClient } from '../../../../services/api-client'; interface MaintenanceUrgente { id: number; materielId: number; materielNom: string; materielType: string; typeMaintenance: 'URGENTE'; statut: 'PLANIFIEE' | 'EN_COURS' | 'TERMINEE' | 'ANNULEE'; priorite: 'CRITIQUE'; dateCreation: string; datePlanifiee: string; dateDebut?: string; dateFin?: string; technicienId?: number; technicienNom?: string; description: string; problemeSignale: string; solutionApportee?: string; dureeEstimee: number; dureeReelle?: number; coutEstime?: number; coutReel?: number; impactProduction: 'AUCUN' | 'FAIBLE' | 'MOYEN' | 'ELEVE' | 'ARRET_TOTAL'; tempsReponse: number; // en minutes tempsResolution?: number; // en minutes escalade: boolean; personneSignalement: string; chantierImpacte?: string; mesuresTemporaires?: string; } const MaintenanceUrgentePage = () => { const [maintenances, setMaintenances] = useState([]); const [loading, setLoading] = useState(true); const [globalFilter, setGlobalFilter] = useState(''); const [filterStatut, setFilterStatut] = useState(null); const [filterImpact, setFilterImpact] = useState(null); const [interventionDialog, setInterventionDialog] = useState(false); const [selectedMaintenance, setSelectedMaintenance] = useState(null); const [intervention, setIntervention] = useState({ mesuresTemporaires: '', technicienId: 0, dateIntervention: new Date() }); const [techniciens, setTechniciens] = useState([]); const router = useRouter(); 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' } ]; const impactOptions = [ { label: 'Tous', value: null }, { label: 'Aucun', value: 'AUCUN' }, { label: 'Faible', value: 'FAIBLE' }, { label: 'Moyen', value: 'MOYEN' }, { label: 'Élevé', value: 'ELEVE' }, { label: 'Arrêt total', value: 'ARRET_TOTAL' } ]; useEffect(() => { loadMaintenancesUrgentes(); loadTechniciens(); }, [filterStatut, filterImpact]); const loadMaintenancesUrgentes = async () => { try { setLoading(true); console.log('🔄 Chargement des maintenances urgentes...'); const params = new URLSearchParams(); params.append('type', 'URGENTE'); if (filterStatut) params.append('statut', filterStatut); if (filterImpact) params.append('impact', filterImpact); const response = await apiClient.get(`/api/maintenances/urgentes?${params.toString()}`); console.log('✅ Maintenances urgentes chargées:', response.data); setMaintenances(response.data || []); } catch (error) { console.error('❌ Erreur lors du chargement:', error); setMaintenances([]); } finally { setLoading(false); } }; const loadTechniciens = async () => { try { const response = await apiClient.get('/api/employes/techniciens/disponibles'); setTechniciens(response.data || []); } catch (error) { console.error('❌ Erreur lors du chargement des techniciens:', error); } }; const escaladerMaintenance = async (maintenanceId: number) => { try { await apiClient.post(`/api/maintenances/${maintenanceId}/escalader`); console.log('✅ Maintenance escaladée'); loadMaintenancesUrgentes(); } catch (error) { console.error('❌ Erreur lors de l\'escalade:', error); } }; const ouvrirIntervention = (maintenance: MaintenanceUrgente) => { setSelectedMaintenance(maintenance); setIntervention({ mesuresTemporaires: maintenance.mesuresTemporaires || '', technicienId: maintenance.technicienId || 0, dateIntervention: new Date() }); setInterventionDialog(true); }; const planifierIntervention = async () => { if (!selectedMaintenance) return; try { await apiClient.post(`/api/maintenances/${selectedMaintenance.id}/intervention-urgente`, intervention); console.log('✅ Intervention urgente planifiée'); setInterventionDialog(false); loadMaintenancesUrgentes(); } catch (error) { console.error('❌ Erreur lors de la planification:', error); } }; const demarrerMaintenance = async (maintenanceId: number) => { try { await apiClient.post(`/api/maintenances/${maintenanceId}/demarrer`); console.log('✅ Maintenance démarrée'); loadMaintenancesUrgentes(); } catch (error) { console.error('❌ Erreur lors du démarrage:', error); } }; const terminerMaintenance = async (maintenanceId: number) => { try { await apiClient.post(`/api/maintenances/${maintenanceId}/terminer`); console.log('✅ Maintenance terminée'); loadMaintenancesUrgentes(); } catch (error) { console.error('❌ Erreur lors de la finalisation:', error); } }; const statutBodyTemplate = (rowData: MaintenanceUrgente) => { const getStatutSeverity = (statut: string) => { switch (statut) { case 'PLANIFIEE': return 'danger'; // Urgent = rouge même planifié case 'EN_COURS': return 'warning'; case 'TERMINEE': return 'success'; case 'ANNULEE': return 'secondary'; default: return 'secondary'; } }; return ; }; const impactBodyTemplate = (rowData: MaintenanceUrgente) => { const getImpactSeverity = (impact: string) => { switch (impact) { case 'AUCUN': return 'success'; case 'FAIBLE': return 'info'; case 'MOYEN': return 'warning'; case 'ELEVE': return 'danger'; case 'ARRET_TOTAL': return 'danger'; default: return 'secondary'; } }; return ; }; const materielBodyTemplate = (rowData: MaintenanceUrgente) => { return (
{rowData.materielNom} {rowData.materielType} {rowData.chantierImpacte && ( Chantier: {rowData.chantierImpacte} )}
); }; const problemeBodyTemplate = (rowData: MaintenanceUrgente) => { return (

{rowData.problemeSignale.length > 100 ? `${rowData.problemeSignale.substring(0, 100)}...` : rowData.problemeSignale }

Signalé par: {rowData.personneSignalement}
); }; const tempsBodyTemplate = (rowData: MaintenanceUrgente) => { const tempsEcoule = Math.floor((new Date().getTime() - new Date(rowData.dateCreation).getTime()) / (1000 * 60)); const heures = Math.floor(tempsEcoule / 60); const minutes = tempsEcoule % 60; const couleur = tempsEcoule > 120 ? 'text-red-500' : tempsEcoule > 60 ? 'text-orange-500' : 'text-green-500'; return (
{heures > 0 ? `${heures}h ${minutes}min` : `${minutes}min`} Depuis signalement {rowData.tempsResolution && ( Résolu en {Math.floor(rowData.tempsResolution / 60)}h{rowData.tempsResolution % 60}min )}
); }; const escaladeBodyTemplate = (rowData: MaintenanceUrgente) => { if (rowData.escalade) { return ; } const tempsEcoule = Math.floor((new Date().getTime() - new Date(rowData.dateCreation).getTime()) / (1000 * 60)); if (tempsEcoule > 120 && rowData.statut !== 'TERMINEE') { return (