'use client'; import React, { useState, useEffect } from 'react'; import { Card } from 'primereact/card'; import { InputText } from 'primereact/inputtext'; import { InputTextarea } from 'primereact/inputtextarea'; import { Dropdown } from 'primereact/dropdown'; import { Calendar } from 'primereact/calendar'; import { InputNumber } from 'primereact/inputnumber'; import { Button } from 'primereact/button'; import { Toolbar } from 'primereact/toolbar'; import { Message } from 'primereact/message'; import { DataTable } from 'primereact/datatable'; import { Column } from 'primereact/column'; import { Dialog } from 'primereact/dialog'; import { useRouter, useParams } from 'next/navigation'; import { apiClient } from '../../../../../services/api-client'; interface MaintenanceEdit { typeMaintenance: 'PREVENTIVE' | 'CORRECTIVE' | 'PLANIFIEE' | 'URGENTE'; priorite: 'BASSE' | 'NORMALE' | 'HAUTE' | 'CRITIQUE'; datePlanifiee: Date | null; technicienId?: number; description: string; problemeSignale?: string; solutionApportee?: string; coutEstime?: number; coutReel?: number; dureeEstimee: number; dureeReelle?: number; observations?: string; evaluationQualite?: number; commentaireQualite?: string; causeRacine?: string; actionPreventive?: string; } interface Piece { id: number; nom: string; reference: string; quantite: number; coutUnitaire: number; cout: number; fournisseur: string; } const EditMaintenancePage = () => { const [maintenance, setMaintenance] = useState({ typeMaintenance: 'PREVENTIVE', priorite: 'NORMALE', datePlanifiee: null, description: '', dureeEstimee: 2 }); const [maintenanceOriginale, setMaintenanceOriginale] = useState(null); const [techniciens, setTechniciens] = useState([]); const [pieces, setPieces] = useState([]); const [pieceDialog, setPieceDialog] = useState(false); const [nouvellePiece, setNouvellePiece] = useState({ id: 0, nom: '', reference: '', quantite: 1, coutUnitaire: 0, cout: 0, fournisseur: '' }); const [loading, setLoading] = useState(false); const [loadingData, setLoadingData] = useState(true); const [errors, setErrors] = useState<{ [key: string]: string }>({}); const router = useRouter(); const params = useParams(); const maintenanceId = params.id; const typeOptions = [ { label: 'Préventive', value: 'PREVENTIVE' }, { label: 'Corrective', value: 'CORRECTIVE' }, { label: 'Planifiée', value: 'PLANIFIEE' }, { label: 'Urgente', value: 'URGENTE' } ]; const prioriteOptions = [ { label: 'Basse', value: 'BASSE' }, { label: 'Normale', value: 'NORMALE' }, { label: 'Haute', value: 'HAUTE' }, { label: 'Critique', value: 'CRITIQUE' } ]; useEffect(() => { if (maintenanceId) { loadMaintenanceData(); loadTechniciens(); } }, [maintenanceId]); const loadMaintenanceData = async () => { try { console.log('🔄 Chargement des données maintenance...', maintenanceId); const response = await apiClient.get(`/api/maintenances/${maintenanceId}`); const maintenanceData = response.data; console.log('✅ Données maintenance chargées:', maintenanceData); setMaintenanceOriginale(maintenanceData); setMaintenance({ typeMaintenance: maintenanceData.typeMaintenance, priorite: maintenanceData.priorite, datePlanifiee: new Date(maintenanceData.datePlanifiee), technicienId: maintenanceData.technicienId, description: maintenanceData.description, problemeSignale: maintenanceData.problemeSignale || '', solutionApportee: maintenanceData.solutionApportee || '', coutEstime: maintenanceData.coutEstime, coutReel: maintenanceData.coutReel, dureeEstimee: maintenanceData.dureeEstimee, dureeReelle: maintenanceData.dureeReelle, observations: maintenanceData.observations || '', evaluationQualite: maintenanceData.evaluationQualite, commentaireQualite: maintenanceData.commentaireQualite || '', causeRacine: maintenanceData.causeRacine || '', actionPreventive: maintenanceData.actionPreventive || '' }); setPieces(maintenanceData.piecesUtilisees || []); } catch (error) { console.error('❌ Erreur lors du chargement:', error); } finally { setLoadingData(false); } }; const loadTechniciens = async () => { try { const response = await apiClient.get('/api/employes/techniciens'); setTechniciens(response.data || []); } catch (error) { console.error('❌ Erreur lors du chargement des techniciens:', error); } }; const validateForm = () => { const newErrors: { [key: string]: string } = {}; if (!maintenance.description.trim()) { newErrors.description = 'La description est requise'; } if (!maintenance.datePlanifiee) { newErrors.datePlanifiee = 'La date planifiée est requise'; } if (maintenance.dureeEstimee <= 0) { newErrors.dureeEstimee = 'La durée estimée doit être positive'; } if (maintenance.typeMaintenance === 'CORRECTIVE' && !maintenance.problemeSignale?.trim()) { newErrors.problemeSignale = 'Le problème signalé est requis pour une maintenance corrective'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!validateForm()) { return; } try { setLoading(true); console.log('🔄 Mise à jour de la maintenance...', maintenance); const maintenanceData = { ...maintenance, datePlanifiee: maintenance.datePlanifiee?.toISOString().split('T')[0], piecesUtilisees: pieces }; const response = await apiClient.put(`/api/maintenances/${maintenanceId}`, maintenanceData); console.log('✅ Maintenance mise à jour avec succès:', response.data); router.push(`/maintenance/${maintenanceId}`); } catch (error) { console.error('❌ Erreur lors de la mise à jour:', error); } finally { setLoading(false); } }; const ajouterPiece = () => { if (nouvellePiece.nom && nouvellePiece.quantite > 0) { const piece = { ...nouvellePiece, id: Date.now(), // ID temporaire cout: nouvellePiece.quantite * nouvellePiece.coutUnitaire }; setPieces([...pieces, piece]); setNouvellePiece({ id: 0, nom: '', reference: '', quantite: 1, coutUnitaire: 0, cout: 0, fournisseur: '' }); setPieceDialog(false); } }; const supprimerPiece = (pieceId: number) => { setPieces(pieces.filter(p => p.id !== pieceId)); }; const technicienOptionTemplate = (option: any) => { return (
{option.prenom} {option.nom}
{option.specialites?.join(', ')}
); }; const pieceBodyTemplate = (rowData: Piece) => { return (
{rowData.nom} Réf: {rowData.reference}
); }; const coutPieceBodyTemplate = (rowData: Piece) => { return (
{rowData.cout.toLocaleString('fr-FR')} € {rowData.quantite} × {rowData.coutUnitaire.toLocaleString('fr-FR')} €
); }; const actionPieceBodyTemplate = (rowData: Piece) => { return (