'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 { Tag } from 'primereact/tag'; import { useRouter } from 'next/navigation'; import { apiClient } from '../../../../services/api-client'; interface NouvelleMaintenance { materielId: number; typeMaintenance: 'PREVENTIVE' | 'CORRECTIVE' | 'PLANIFIEE' | 'URGENTE'; priorite: 'BASSE' | 'NORMALE' | 'HAUTE' | 'CRITIQUE'; datePlanifiee: Date | null; technicienId?: number; description: string; problemeSignale?: string; coutEstime?: number; dureeEstimee: number; observations?: string; } interface Materiel { id: number; nom: string; type: string; marque: string; modele: string; statut: string; derniereMaintenance?: string; prochaineMaintenance?: string; } interface Technicien { id: number; nom: string; prenom: string; specialites: string[]; disponible: boolean; } const NouvellMaintenancePage = () => { const [maintenance, setMaintenance] = useState({ materielId: 0, typeMaintenance: 'PREVENTIVE', priorite: 'NORMALE', datePlanifiee: null, description: '', dureeEstimee: 2 }); const [materiels, setMateriels] = useState([]); const [techniciens, setTechniciens] = useState([]); const [loading, setLoading] = useState(false); const [errors, setErrors] = useState<{ [key: string]: string }>({}); const router = useRouter(); 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(() => { loadMateriels(); loadTechniciens(); }, []); const loadMateriels = async () => { try { console.log('🔄 Chargement des matériels...'); const response = await apiClient.get('/api/materiels'); console.log('✅ Matériels chargés:', response.data); setMateriels(response.data || []); } catch (error) { console.error('❌ Erreur lors du chargement des matériels:', error); } }; const loadTechniciens = async () => { try { console.log('🔄 Chargement des techniciens...'); const response = await apiClient.get('/api/employes/techniciens'); console.log('✅ Techniciens chargés:', response.data); setTechniciens(response.data || []); } catch (error) { console.error('❌ Erreur lors du chargement des techniciens:', error); } }; const validateForm = () => { const newErrors: { [key: string]: string } = {}; if (!maintenance.materielId) { newErrors.materielId = 'Le matériel est requis'; } 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('🔄 Création de la maintenance...', maintenance); const maintenanceData = { ...maintenance, datePlanifiee: maintenance.datePlanifiee?.toISOString().split('T')[0] }; const response = await apiClient.post('/api/maintenances', maintenanceData); console.log('✅ Maintenance créée avec succès:', response.data); router.push('/maintenance'); } catch (error) { console.error('❌ Erreur lors de la création:', error); } finally { setLoading(false); } }; const materielOptionTemplate = (option: Materiel) => { return (
{option.nom}
{option.type} - {option.marque} {option.modele}
); }; const technicienOptionTemplate = (option: Technicien) => { return (
{option.prenom} {option.nom}
{option.specialites?.join(', ')} {option.disponible ? ( ) : ( )}
); }; const getStatutColor = (statut: string) => { switch (statut) { case 'DISPONIBLE': return 'success'; case 'EN_UTILISATION': return 'warning'; case 'EN_MAINTENANCE': return 'danger'; case 'HORS_SERVICE': return 'danger'; default: return 'secondary'; } }; const statutBodyTemplate = (rowData: Materiel) => { return ; }; const maintenanceBodyTemplate = (rowData: Materiel) => { return (
{rowData.derniereMaintenance && ( Dernière: {new Date(rowData.derniereMaintenance).toLocaleDateString('fr-FR')} )} {rowData.prochaineMaintenance && ( Prochaine: {new Date(rowData.prochaineMaintenance).toLocaleDateString('fr-FR')} )}
); }; const leftToolbarTemplate = () => { return (
); }; const rightToolbarTemplate = () => { return (
); }; return (
setMaintenance({ ...maintenance, materielId: e.value })} optionLabel="nom" optionValue="id" placeholder="Sélectionner un matériel" itemTemplate={materielOptionTemplate} className={errors.materielId ? 'p-invalid' : ''} filter /> {errors.materielId && {errors.materielId}}
setMaintenance({ ...maintenance, technicienId: e.value })} optionLabel="nom" optionValue="id" placeholder="Sélectionner un technicien" itemTemplate={technicienOptionTemplate} filter showClear />
setMaintenance({ ...maintenance, typeMaintenance: e.value })} placeholder="Sélectionner le type" />
setMaintenance({ ...maintenance, priorite: e.value })} placeholder="Sélectionner la priorité" />
setMaintenance({ ...maintenance, datePlanifiee: e.value as Date })} showIcon dateFormat="dd/mm/yy" placeholder="Sélectionner une date" className={errors.datePlanifiee ? 'p-invalid' : ''} minDate={new Date()} /> {errors.datePlanifiee && {errors.datePlanifiee}}
setMaintenance({ ...maintenance, description: e.target.value })} rows={3} placeholder="Description détaillée de la maintenance à effectuer..." className={errors.description ? 'p-invalid' : ''} /> {errors.description && {errors.description}}
{maintenance.typeMaintenance === 'CORRECTIVE' && (
setMaintenance({ ...maintenance, problemeSignale: e.target.value })} rows={2} placeholder="Description du problème rencontré..." className={errors.problemeSignale ? 'p-invalid' : ''} /> {errors.problemeSignale && {errors.problemeSignale}}
)}
setMaintenance({ ...maintenance, dureeEstimee: e.value || 0 })} min={0.5} max={100} step={0.5} suffix=" h" className={errors.dureeEstimee ? 'p-invalid' : ''} /> {errors.dureeEstimee && {errors.dureeEstimee}}
setMaintenance({ ...maintenance, coutEstime: e.value || undefined })} min={0} mode="currency" currency="EUR" locale="fr-FR" />
setMaintenance({ ...maintenance, observations: e.target.value })} rows={2} placeholder="Observations particulières..." />
m.statut !== 'HORS_SERVICE')} responsiveLayout="scroll" paginator rows={5} emptyMessage="Aucun matériel disponible" >

Planifiez les maintenances préventives en avance.

Les maintenances urgentes ont la priorité absolue.

Assignez un technicien qualifié pour le type de matériel.

Estimez le coût pour le suivi budgétaire.

); }; export default NouvellMaintenancePage;