'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 { Calendar } from 'primereact/calendar'; import { Dropdown } from 'primereact/dropdown'; import { Dialog } from 'primereact/dialog'; import { InputTextarea } from 'primereact/inputtextarea'; import { useRouter } from 'next/navigation'; import { apiClient } from '../../../../services/api-client'; interface MaintenanceCorrective { id: number; materielId: number; materielNom: string; materielType: string; typeMaintenance: 'CORRECTIVE'; 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; dureeEstimee: number; dureeReelle?: number; coutEstime?: number; coutReel?: number; piecesUtilisees: Array<{ nom: string; quantite: number; cout: number; }>; gravite: 'MINEURE' | 'MODEREE' | 'MAJEURE' | 'CRITIQUE'; impactProduction: 'AUCUN' | 'FAIBLE' | 'MOYEN' | 'ELEVE'; causeRacine?: string; actionPreventive?: string; } const MaintenanceCorrectivePage = () => { const [maintenances, setMaintenances] = useState([]); const [loading, setLoading] = useState(true); const [globalFilter, setGlobalFilter] = useState(''); const [filterStatut, setFilterStatut] = useState(null); const [filterGravite, setFilterGravite] = useState(null); const [filterImpact, setFilterImpact] = useState(null); const [dateDebut, setDateDebut] = useState(null); const [dateFin, setDateFin] = useState(null); const [diagnosticDialog, setDiagnosticDialog] = useState(false); const [selectedMaintenance, setSelectedMaintenance] = useState(null); const [diagnostic, setDiagnostic] = useState({ solutionApportee: '', causeRacine: '', actionPreventive: '' }); 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' }, { label: 'En attente', value: 'EN_ATTENTE' } ]; const graviteOptions = [ { label: 'Toutes', value: null }, { label: 'Mineure', value: 'MINEURE' }, { label: 'Modérée', value: 'MODEREE' }, { label: 'Majeure', value: 'MAJEURE' }, { label: 'Critique', value: 'CRITIQUE' } ]; const impactOptions = [ { label: 'Tous', value: null }, { label: 'Aucun', value: 'AUCUN' }, { label: 'Faible', value: 'FAIBLE' }, { label: 'Moyen', value: 'MOYEN' }, { label: 'Élevé', value: 'ELEVE' } ]; useEffect(() => { loadMaintenancesCorrectives(); }, [filterStatut, filterGravite, filterImpact, dateDebut, dateFin]); const loadMaintenancesCorrectives = async () => { try { setLoading(true); console.log('🔄 Chargement des maintenances correctives...'); const params = new URLSearchParams(); params.append('type', 'CORRECTIVE'); if (filterStatut) params.append('statut', filterStatut); if (filterGravite) params.append('gravite', filterGravite); if (filterImpact) params.append('impact', filterImpact); if (dateDebut) params.append('dateDebut', dateDebut.toISOString().split('T')[0]); if (dateFin) params.append('dateFin', dateFin.toISOString().split('T')[0]); const response = await apiClient.get(`/api/maintenances/correctives?${params.toString()}`); console.log('✅ Maintenances correctives chargées:', response.data); setMaintenances(response.data || []); } catch (error) { console.error('❌ Erreur lors du chargement:', error); setMaintenances([]); } finally { setLoading(false); } }; const demarrerMaintenance = async (maintenanceId: number) => { try { await apiClient.post(`/api/maintenances/${maintenanceId}/demarrer`); console.log('✅ Maintenance démarrée'); loadMaintenancesCorrectives(); } catch (error) { console.error('❌ Erreur lors du démarrage:', error); } }; const ouvrirDiagnostic = (maintenance: MaintenanceCorrective) => { setSelectedMaintenance(maintenance); setDiagnostic({ solutionApportee: maintenance.solutionApportee || '', causeRacine: maintenance.causeRacine || '', actionPreventive: maintenance.actionPreventive || '' }); setDiagnosticDialog(true); }; const sauvegarderDiagnostic = async () => { if (!selectedMaintenance) return; try { await apiClient.put(`/api/maintenances/${selectedMaintenance.id}/diagnostic`, diagnostic); console.log('✅ Diagnostic sauvegardé'); setDiagnosticDialog(false); loadMaintenancesCorrectives(); } catch (error) { console.error('❌ Erreur lors de la sauvegarde:', error); } }; const terminerMaintenance = async (maintenanceId: number) => { try { await apiClient.post(`/api/maintenances/${maintenanceId}/terminer`); console.log('✅ Maintenance terminée'); loadMaintenancesCorrectives(); } catch (error) { console.error('❌ Erreur lors de la finalisation:', error); } }; const statutBodyTemplate = (rowData: MaintenanceCorrective) => { 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 graviteBodyTemplate = (rowData: MaintenanceCorrective) => { const getGraviteSeverity = (gravite: string) => { switch (gravite) { case 'MINEURE': return 'info'; case 'MODEREE': return 'warning'; case 'MAJEURE': return 'danger'; case 'CRITIQUE': return 'danger'; default: return 'secondary'; } }; return ; }; const impactBodyTemplate = (rowData: MaintenanceCorrective) => { const getImpactSeverity = (impact: string) => { switch (impact) { case 'AUCUN': return 'success'; case 'FAIBLE': return 'info'; case 'MOYEN': return 'warning'; case 'ELEVE': return 'danger'; default: return 'secondary'; } }; return ; }; const materielBodyTemplate = (rowData: MaintenanceCorrective) => { return (
{rowData.materielNom} {rowData.materielType}
); }; const problemeBodyTemplate = (rowData: MaintenanceCorrective) => { return (

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

); }; const solutionBodyTemplate = (rowData: MaintenanceCorrective) => { if (rowData.solutionApportee) { return (

{rowData.solutionApportee.length > 80 ? `${rowData.solutionApportee.substring(0, 80)}...` : rowData.solutionApportee }

); } return En attente de diagnostic; }; const dateBodyTemplate = (rowData: MaintenanceCorrective) => { const dateCreation = new Date(rowData.dateCreation); const datePlanifiee = new Date(rowData.datePlanifiee); const delai = Math.ceil((datePlanifiee.getTime() - dateCreation.getTime()) / (1000 * 3600 * 24)); return (
Signalé: {dateCreation.toLocaleDateString('fr-FR')} Planifié: {datePlanifiee.toLocaleDateString('fr-FR')} 3 ? 'text-red-500' : 'text-green-500'}`}> Délai: {delai} jour{delai > 1 ? 's' : ''}
); }; const technicienBodyTemplate = (rowData: MaintenanceCorrective) => { if (rowData.technicienNom) { return (
{rowData.technicienNom}
); } return (