'use client'; export const dynamic = 'force-dynamic'; import React, { useState, useEffect, useRef } from 'react'; import { useRouter } from 'next/navigation'; import { Card } from 'primereact/card'; import { Button } from 'primereact/button'; import { InputNumber } from 'primereact/inputnumber'; import { Dropdown } from 'primereact/dropdown'; import { Calendar } from 'primereact/calendar'; import { InputTextarea } from 'primereact/inputtextarea'; import { Toast } from 'primereact/toast'; import { maintenanceService, materielService } from '../../../../services/api'; import { Materiel, TypeMaintenance, StatutMaintenance } from '../../../../types/btp'; const NouvelleMaintenancePage = () => { const router = useRouter(); const [maintenance, setMaintenance] = useState({ materiel: null as Materiel | null, type: TypeMaintenance.PREVENTIVE, statut: StatutMaintenance.PLANIFIEE, description: '', datePrevue: new Date(), dateRealisee: null as Date | null, cout: 0, notes: '' }); const [materiels, setMateriels] = useState([]); const [submitted, setSubmitted] = useState(false); const [saving, setSaving] = useState(false); const toast = useRef(null); const typeOptions = Object.values(TypeMaintenance).map(type => ({ label: type.replace('_', ' '), value: type })); const statutOptions = Object.values(StatutMaintenance).map(statut => ({ label: statut.replace('_', ' '), value: statut })); useEffect(() => { loadMateriels(); }, []); const loadMateriels = async () => { try { const data = await materielService.getAll(); setMateriels(data); } catch (error) { console.error('Erreur lors du chargement des matériels:', error); } }; const onInputChange = (e: React.ChangeEvent, name: string) => { const val = (e.target && e.target.value) || ''; setMaintenance(prev => ({ ...prev, [name]: val })); }; const onInputNumberChange = (value: number | null, name: string) => { setMaintenance(prev => ({ ...prev, [name]: value || 0 })); }; const onDropdownChange = (e: any, name: string) => { setMaintenance(prev => ({ ...prev, [name]: e.value })); }; const onDateChange = (e: any, name: string) => { setMaintenance(prev => ({ ...prev, [name]: e.value })); }; const saveMaintenance = async () => { setSubmitted(true); if (maintenance.description?.trim() && maintenance.materiel) { try { setSaving(true); const maintenanceData = { ...maintenance, datePrevue: maintenance.datePrevue.toISOString(), dateRealisee: maintenance.dateRealisee?.toISOString() || null }; const savedMaintenance = await maintenanceService.create(maintenanceData); toast.current?.show({ severity: 'success', summary: 'Succès', detail: 'Maintenance créée avec succès', life: 3000 }); // Rediriger vers la liste après 2 secondes setTimeout(() => { router.push('/maintenances'); }, 2000); } catch (error: any) { toast.current?.show({ severity: 'error', summary: 'Erreur', detail: error?.userMessage || 'Erreur lors de la création', life: 3000 }); } finally { setSaving(false); } } }; const annuler = () => { router.back(); }; const materielOptions = materiels.map(materiel => ({ label: `${materiel.nom} - ${materiel.marque} ${materiel.modele}`, value: materiel })); // Templates prédéfinis selon le type const onTypeChange = (newType: TypeMaintenance) => { let description = ''; let cout = 0; switch (newType) { case TypeMaintenance.PREVENTIVE: description = 'Maintenance préventive programmée selon planning'; cout = 100; break; case TypeMaintenance.CORRECTIVE: description = 'Réparation suite à dysfonctionnement'; cout = 300; break; case TypeMaintenance.REVISION: description = 'Révision complète du matériel'; cout = 200; break; case TypeMaintenance.CONTROLE_TECHNIQUE: description = 'Contrôle technique réglementaire'; cout = 150; break; case TypeMaintenance.NETTOYAGE: description = 'Nettoyage et entretien courant'; cout = 50; break; } setMaintenance(prev => ({ ...prev, type: newType, description, cout })); }; return (

Nouvelle Maintenance

onDropdownChange(e, 'materiel')} options={materielOptions} placeholder="Sélectionner un matériel" filter className={submitted && !maintenance.materiel ? 'p-invalid' : ''} /> {submitted && !maintenance.materiel && Le matériel est obligatoire.}
onTypeChange(e.value)} options={typeOptions} placeholder="Sélectionner un type" />
onDropdownChange(e, 'statut')} options={statutOptions} placeholder="Sélectionner un statut" />
onDateChange(e, 'datePrevue')} dateFormat="dd/mm/yy" showIcon showTime hourFormat="24" />
onDateChange(e, 'dateRealisee')} dateFormat="dd/mm/yy" showIcon showTime hourFormat="24" />
onInputNumberChange(e.value, 'cout')} mode="currency" currency="EUR" locale="fr-FR" min={0} />
onInputChange(e, 'description')} rows={3} cols={20} placeholder="Description détaillée de la maintenance..." className={submitted && !maintenance.description ? 'p-invalid' : ''} /> {submitted && !maintenance.description && La description est obligatoire.}
onInputChange(e, 'notes')} rows={2} cols={20} placeholder="Notes et observations..." />
Informations sur le matériel sélectionné
{maintenance.materiel ? (
Nom: {maintenance.materiel.nom}
Marque: {maintenance.materiel.marque}
Modèle: {maintenance.materiel.modele}
Statut: {maintenance.materiel.statut?.replace('_', ' ')}
Localisation: {maintenance.materiel.localisation}
Dernière maintenance: {maintenance.materiel.maintenances?.length ? new Date(maintenance.materiel.maintenances[0].dateRealisee || maintenance.materiel.maintenances[0].datePrevue).toLocaleDateString('fr-FR') : 'Aucune' }
) : (

Sélectionnez un matériel pour voir ses informations

)}
); }; export default NouvelleMaintenancePage;