'use client'; import React, { useState, useEffect } from 'react'; import { Card } from 'primereact/card'; import { Button } from 'primereact/button'; import { Tag } from 'primereact/tag'; import { Badge } from 'primereact/badge'; import { Toolbar } from 'primereact/toolbar'; import { TabView, TabPanel } from 'primereact/tabview'; import { DataTable } from 'primereact/datatable'; import { Column } from 'primereact/column'; import { ProgressBar } from 'primereact/progressbar'; import { Timeline } from 'primereact/timeline'; import { useRouter, useParams } from 'next/navigation'; import { apiClient } from '../../../../services/api-client'; interface MaintenanceDetail { id: number; materielId: number; materielNom: string; materielType: string; materielMarque: string; materielModele: 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; technicienSpecialites?: string[]; description: string; problemeSignale?: string; solutionApportee?: string; dureeEstimee: number; dureeReelle?: number; coutEstime?: number; coutReel?: number; piecesUtilisees: Array<{ id: number; nom: string; reference: string; quantite: number; coutUnitaire: number; cout: number; fournisseur: string; }>; outilsUtilises: Array<{ id: number; nom: string; type: string; dureeUtilisation: number; }>; prochaineMaintenance?: string; observations?: string; photos: Array<{ id: number; nom: string; url: string; type: 'AVANT' | 'PENDANT' | 'APRES'; dateAjout: string; }>; historique: Array<{ id: number; action: string; utilisateur: string; date: string; commentaire?: string; }>; evaluationQualite?: number; commentaireQualite?: string; tempsReponse?: number; tempsResolution?: number; causeRacine?: string; actionPreventive?: string; } const MaintenanceDetailPage = () => { const [maintenance, setMaintenance] = useState(null); const [loading, setLoading] = useState(true); const router = useRouter(); const params = useParams(); const maintenanceId = params.id; useEffect(() => { if (maintenanceId) { loadMaintenanceDetail(); } }, [maintenanceId]); const loadMaintenanceDetail = async () => { try { setLoading(true); console.log('🔄 Chargement du détail maintenance...', maintenanceId); const response = await apiClient.get(`/api/maintenances/${maintenanceId}`); console.log('✅ Détail maintenance chargé:', response.data); setMaintenance(response.data); } catch (error) { console.error('❌ Erreur lors du chargement du détail:', error); } finally { setLoading(false); } }; const changerStatutMaintenance = async (nouveauStatut: string) => { if (!maintenance) return; try { await apiClient.post(`/api/maintenances/${maintenance.id}/statut`, { statut: nouveauStatut }); setMaintenance({ ...maintenance, statut: nouveauStatut as any }); console.log(`✅ Statut maintenance changé: ${nouveauStatut}`); } catch (error) { console.error('❌ Erreur lors du changement de statut:', error); } }; 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'; } }; 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'; } }; 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'; } }; const calculerCoutTotal = () => { if (!maintenance) return 0; const coutPieces = maintenance.piecesUtilisees.reduce((total, piece) => total + piece.cout, 0); return (maintenance.coutReel || maintenance.coutEstime || 0) + coutPieces; }; const calculerEfficacite = () => { if (!maintenance || !maintenance.dureeReelle) return null; const efficacite = (maintenance.dureeEstimee / maintenance.dureeReelle) * 100; return Math.round(efficacite); }; const pieceBodyTemplate = (rowData: any) => { return (
{rowData.nom} Réf: {rowData.reference} Fournisseur: {rowData.fournisseur}
); }; const coutPieceBodyTemplate = (rowData: any) => { return (
{rowData.cout.toLocaleString('fr-FR')} € {rowData.quantite} × {rowData.coutUnitaire.toLocaleString('fr-FR')} €
); }; const photoBodyTemplate = (rowData: any) => { return (
{rowData.nom}
{rowData.nom}
); }; const historiqueItemTemplate = (item: any) => { return (
{item.action}
Par {item.utilisateur}
{item.commentaire && (
{item.commentaire}
)}
); }; const leftToolbarTemplate = () => { return (
); }; const rightToolbarTemplate = () => { return (
); }; if (loading) { return (
); } if (!maintenance) { return (

Maintenance non trouvée

); } return (
{/* En-tête maintenance */}

Maintenance #{maintenance.id}

🔧 {maintenance.materielNom} ({maintenance.materielType})

📅 Planifiée: {new Date(maintenance.datePlanifiee).toLocaleDateString('fr-FR')}

{maintenance.technicienNom &&

👤 Technicien: {maintenance.technicienNom}

}
{calculerCoutTotal().toLocaleString('fr-FR')} €
Coût total
{calculerEfficacite() && (
{calculerEfficacite()}%
Efficacité
)}
{/* Onglets de détail */}

Détails de la maintenance

{maintenance.description}

{maintenance.problemeSignale && (

{maintenance.problemeSignale}

)} {maintenance.solutionApportee && (

{maintenance.solutionApportee}

)} {maintenance.observations && (

{maintenance.observations}

)}

Informations matériel

{maintenance.materielNom}

{maintenance.materielType}

{maintenance.materielMarque} {maintenance.materielModele}

{maintenance.prochaineMaintenance && (

{new Date(maintenance.prochaineMaintenance).toLocaleDateString('fr-FR')}

)}

Planification

{new Date(maintenance.dateCreation).toLocaleDateString('fr-FR')}

{new Date(maintenance.datePlanifiee).toLocaleDateString('fr-FR')}

{maintenance.dateDebut && (

{new Date(maintenance.dateDebut).toLocaleDateString('fr-FR')}

)} {maintenance.dateFin && (

{new Date(maintenance.dateFin).toLocaleDateString('fr-FR')}

)}

Durée et coûts

{maintenance.dureeEstimee}h

{maintenance.dureeReelle && (

{maintenance.dureeReelle}h

)}

{maintenance.coutEstime?.toLocaleString('fr-FR') || 0} €

{maintenance.coutReel && (

{maintenance.coutReel.toLocaleString('fr-FR')} €

)} {calculerEfficacite() && (
{calculerEfficacite()}%
)}

Pièces utilisées

Outils utilisés

new Date(rowData.dateAjout).toLocaleDateString('fr-FR')} /> new Date(item.date).toLocaleDateString('fr-FR')} />

Évaluation qualité

{maintenance.evaluationQualite ? (
{maintenance.evaluationQualite}/5
{[1, 2, 3, 4, 5].map((star) => ( ))}
{maintenance.commentaireQualite && (

{maintenance.commentaireQualite}

)}
) : (

Évaluation en attente

)}

Analyse

{maintenance.causeRacine && (

{maintenance.causeRacine}

)} {maintenance.actionPreventive && (

{maintenance.actionPreventive}

)} {maintenance.tempsReponse && (

{maintenance.tempsReponse} minutes

)} {maintenance.tempsResolution && (

{maintenance.tempsResolution} minutes

)}
); }; export default MaintenanceDetailPage;