'use client'; import React, { useState, useEffect, useRef } from 'react'; import { useParams, useRouter } from 'next/navigation'; import { Card } from 'primereact/card'; import { Button } from 'primereact/button'; import { Tag } from 'primereact/tag'; import { Divider } from 'primereact/divider'; import { Toast } from 'primereact/toast'; import { ProgressSpinner } from 'primereact/progressspinner'; import { DataTable } from 'primereact/datatable'; import { Column } from 'primereact/column'; import { Timeline } from 'primereact/timeline'; import { Badge } from 'primereact/badge'; import { Toolbar } from 'primereact/toolbar'; import { Menu } from 'primereact/menu'; import { devisService } from '../../../../services/api'; import { formatDate, formatCurrency } from '../../../../utils/formatters'; import type { Devis } from '../../../../types/btp'; const DevisDetailPage = () => { const params = useParams(); const router = useRouter(); const toast = useRef(null); const menuRef = useRef(null); const [devis, setDevis] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const devisId = params.id as string; useEffect(() => { loadDevis(); }, [devisId]); const loadDevis = async () => { try { setLoading(true); const devisData = await devisService.getById(devisId); setDevis(devisData); } catch (error) { console.error('Erreur lors du chargement du devis:', error); setError('Impossible de charger le devis'); toast.current?.show({ severity: 'error', summary: 'Erreur', detail: 'Impossible de charger le devis' }); } finally { setLoading(false); } }; const getStatutSeverity = (statut: string) => { switch (statut) { case 'ACCEPTE': return 'success'; case 'REFUSE': return 'danger'; case 'EXPIRE': return 'warning'; case 'EN_ATTENTE': return 'info'; case 'BROUILLON': return 'secondary'; default: return 'info'; } }; const menuItems = [ { label: 'Modifier', icon: 'pi pi-pencil', command: () => router.push(`/devis/${devisId}/edit`) }, { label: 'Dupliquer', icon: 'pi pi-copy', command: () => router.push(`/devis/${devisId}/duplicate`) }, { label: 'Convertir en facture', icon: 'pi pi-arrow-right', command: () => router.push(`/devis/${devisId}/convert`) }, { separator: true }, { label: 'Imprimer', icon: 'pi pi-print', command: () => window.print() }, { label: 'Télécharger PDF', icon: 'pi pi-download', command: () => handleDownloadPDF() }, { separator: true }, { label: 'Supprimer', icon: 'pi pi-trash', className: 'text-red-500', command: () => handleDelete() } ]; const handleDownloadPDF = async () => { try { // TODO: Implémenter le téléchargement PDF toast.current?.show({ severity: 'info', summary: 'Info', detail: 'Téléchargement PDF en cours de développement' }); } catch (error) { toast.current?.show({ severity: 'error', summary: 'Erreur', detail: 'Erreur lors du téléchargement' }); } }; const handleDelete = async () => { try { await devisService.delete(devisId); toast.current?.show({ severity: 'success', summary: 'Succès', detail: 'Devis supprimé avec succès' }); router.push('/devis'); } catch (error) { toast.current?.show({ severity: 'error', summary: 'Erreur', detail: 'Erreur lors de la suppression' }); } }; const handleAccept = async () => { try { await devisService.update(devisId, { statut: 'ACCEPTE' as any }); loadDevis(); toast.current?.show({ severity: 'success', summary: 'Succès', detail: 'Devis accepté' }); } catch (error) { toast.current?.show({ severity: 'error', summary: 'Erreur', detail: 'Erreur lors de l\'acceptation' }); } }; const handleReject = async () => { try { await devisService.update(devisId, { statut: 'REFUSE' as any }); loadDevis(); toast.current?.show({ severity: 'success', summary: 'Succès', detail: 'Devis refusé' }); } catch (error) { toast.current?.show({ severity: 'error', summary: 'Erreur', detail: 'Erreur lors du refus' }); } }; const toolbarStartTemplate = () => (
); const toolbarEndTemplate = () => (
{devis?.statut === 'ENVOYE' && ( <>
); if (loading) { return (
); } if (error || !devis) { return (

Devis introuvable

{error || 'Le devis demandé n\'existe pas'}

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

Devis #{devis.numero}

{devis.objet}

{formatCurrency(devis.montantTTC)}
HT: {formatCurrency(devis.montantHT)}
Informations générales

{formatDate(devis.dateEmission)}

{formatDate(devis.dateValidite)}

{typeof devis.client === 'string' ? devis.client : devis.client?.nom}

Détails financiers

{formatCurrency(devis.montantHT)}

{formatCurrency(devis.montantTTC - devis.montantHT)}

{formatCurrency(devis.montantTTC)}

{devis.description && ( <>
Description

{devis.description}

)}
{/* Lignes du devis */} {devis.lignes && devis.lignes.length > 0 && (
rowData.quantite?.toLocaleString('fr-FR')} /> formatCurrency(rowData.prixUnitaire)} /> formatCurrency(rowData.montantHT)} />
)} {/* Historique */}
formatDate(item.date)} content={(item) => (
)} />
); }; export default DevisDetailPage;