'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 { Steps } from 'primereact/steps'; import { Timeline } from 'primereact/timeline'; import { Tag } from 'primereact/tag'; import { Badge } from 'primereact/badge'; import { Toast } from 'primereact/toast'; import { ProgressSpinner } from 'primereact/progressspinner'; import { Toolbar } from 'primereact/toolbar'; import { Dialog } from 'primereact/dialog'; import { InputTextarea } from 'primereact/inputtextarea'; import { Dropdown } from 'primereact/dropdown'; import { Calendar } from 'primereact/calendar'; import { DataTable } from 'primereact/datatable'; import { Column } from 'primereact/column'; import { devisService } from '../../../../../services/api'; import { formatDate, formatCurrency } from '../../../../../utils/formatters'; import type { Devis } from '../../../../../types/btp'; interface WorkflowStep { id: string; nom: string; description: string; statut: 'EN_ATTENTE' | 'EN_COURS' | 'TERMINE' | 'BLOQUE'; dateDebut?: Date; dateFin?: Date; responsable?: string; commentaires?: string; documents?: string[]; } interface WorkflowEvent { date: Date; type: 'CREATION' | 'MODIFICATION' | 'VALIDATION' | 'REFUS' | 'COMMENTAIRE' | 'DOCUMENT'; description: string; utilisateur: string; details?: any; } const DevisWorkflowPage = () => { const params = useParams(); const router = useRouter(); const toast = useRef(null); const [devis, setDevis] = useState(null); const [workflowSteps, setWorkflowSteps] = useState([]); const [workflowEvents, setWorkflowEvents] = useState([]); const [loading, setLoading] = useState(true); const [activeStep, setActiveStep] = useState(0); const [showActionDialog, setShowActionDialog] = useState(false); const [actionType, setActionType] = useState(''); const [actionComment, setActionComment] = useState(''); const [actionDate, setActionDate] = useState(new Date()); const devisId = params.id as string; const actionOptions = [ { label: 'Valider l\'étape', value: 'VALIDER' }, { label: 'Rejeter', value: 'REJETER' }, { label: 'Demander modification', value: 'MODIFIER' }, { label: 'Mettre en attente', value: 'ATTENDRE' }, { label: 'Ajouter commentaire', value: 'COMMENTER' } ]; useEffect(() => { loadWorkflowData(); }, [devisId]); const loadWorkflowData = async () => { try { setLoading(true); // Charger le devis const devisResponse = await devisService.getById(devisId); setDevis(devisResponse.data); // TODO: Charger les données de workflow depuis l'API // const workflowResponse = await devisService.getWorkflow(devisId); // Données simulées pour la démonstration const mockSteps: WorkflowStep[] = [ { id: '1', nom: 'Création du devis', description: 'Rédaction initiale du devis avec toutes les prestations', statut: 'TERMINE', dateDebut: new Date('2024-01-15'), dateFin: new Date('2024-01-16'), responsable: 'Jean Dupont', commentaires: 'Devis créé selon les spécifications client' }, { id: '2', nom: 'Validation technique', description: 'Vérification de la faisabilité technique et des quantités', statut: 'TERMINE', dateDebut: new Date('2024-01-16'), dateFin: new Date('2024-01-17'), responsable: 'Marie Martin', commentaires: 'Validation technique OK, ajustement des quantités' }, { id: '3', nom: 'Validation commerciale', description: 'Vérification des prix et des conditions commerciales', statut: 'EN_COURS', dateDebut: new Date('2024-01-17'), responsable: 'Pierre Durand' }, { id: '4', nom: 'Envoi au client', description: 'Transmission du devis au client pour validation', statut: 'EN_ATTENTE', responsable: 'Sophie Bernard' }, { id: '5', nom: 'Suivi client', description: 'Relance et négociation avec le client', statut: 'EN_ATTENTE' } ]; const mockEvents: WorkflowEvent[] = [ { date: new Date('2024-01-15T09:00:00'), type: 'CREATION', description: 'Création du devis #DEV-2024-001', utilisateur: 'Jean Dupont' }, { date: new Date('2024-01-16T14:30:00'), type: 'VALIDATION', description: 'Validation de l\'étape "Création du devis"', utilisateur: 'Jean Dupont' }, { date: new Date('2024-01-16T15:00:00'), type: 'MODIFICATION', description: 'Ajustement des quantités de carrelage', utilisateur: 'Marie Martin' }, { date: new Date('2024-01-17T10:15:00'), type: 'VALIDATION', description: 'Validation technique approuvée', utilisateur: 'Marie Martin' }, { date: new Date('2024-01-17T11:00:00'), type: 'COMMENTAIRE', description: 'Demande de révision des prix pour être plus compétitif', utilisateur: 'Pierre Durand' } ]; setWorkflowSteps(mockSteps); setWorkflowEvents(mockEvents); // Déterminer l'étape active const currentStepIndex = mockSteps.findIndex(step => step.statut === 'EN_COURS'); setActiveStep(currentStepIndex >= 0 ? currentStepIndex : mockSteps.findIndex(step => step.statut === 'EN_ATTENTE')); } catch (error) { console.error('Erreur lors du chargement du workflow:', error); toast.current?.show({ severity: 'error', summary: 'Erreur', detail: 'Impossible de charger les données du workflow' }); } finally { setLoading(false); } }; const handleAction = async () => { try { if (!actionType || !actionComment.trim()) { toast.current?.show({ severity: 'warn', summary: 'Attention', detail: 'Veuillez sélectionner une action et ajouter un commentaire' }); return; } // TODO: Appel API pour exécuter l'action // await devisService.executeWorkflowAction(devisId, { // type: actionType, // commentaire: actionComment, // date: actionDate // }); toast.current?.show({ severity: 'success', summary: 'Succès', detail: 'Action exécutée avec succès' }); setShowActionDialog(false); setActionComment(''); loadWorkflowData(); } catch (error) { console.error('Erreur lors de l\'exécution de l\'action:', error); toast.current?.show({ severity: 'error', summary: 'Erreur', detail: 'Erreur lors de l\'exécution de l\'action' }); } }; const getStepStatus = (step: WorkflowStep, index: number) => { if (step.statut === 'TERMINE') return 'success'; if (step.statut === 'EN_COURS') return 'info'; if (step.statut === 'BLOQUE') return 'danger'; return 'secondary'; }; const getEventIcon = (type: string) => { switch (type) { case 'CREATION': return 'pi pi-plus'; case 'MODIFICATION': return 'pi pi-pencil'; case 'VALIDATION': return 'pi pi-check'; case 'REFUS': return 'pi pi-times'; case 'COMMENTAIRE': return 'pi pi-comment'; case 'DOCUMENT': return 'pi pi-file'; default: return 'pi pi-circle'; } }; const getEventColor = (type: string) => { switch (type) { case 'CREATION': return '#3B82F6'; case 'MODIFICATION': return '#F59E0B'; case 'VALIDATION': return '#10B981'; case 'REFUS': return '#EF4444'; case 'COMMENTAIRE': return '#8B5CF6'; case 'DOCUMENT': return '#6B7280'; default: return '#6B7280'; } }; const toolbarStartTemplate = () => (
); const toolbarEndTemplate = () => (
); if (loading) { return (
); } if (!devis) { return (

Devis introuvable

Le devis demandé n'existe pas

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

Workflow - Devis #{devis.numero}

{devis.objet}

{formatCurrency(devis.montantTTC)}
Client: {typeof devis.client === 'string' ? devis.client : devis.client?.nom}
{/* Étapes du workflow */}
({ label: step.nom, command: () => setActiveStep(index) }))} activeIndex={activeStep} className="mb-4" /> {workflowSteps[activeStep] && (
{workflowSteps[activeStep].nom}

{workflowSteps[activeStep].description}

{workflowSteps[activeStep].responsable && (

{workflowSteps[activeStep].responsable}

)} {workflowSteps[activeStep].dateDebut && (

{formatDate(workflowSteps[activeStep].dateDebut!)}

)} {workflowSteps[activeStep].dateFin && (

{formatDate(workflowSteps[activeStep].dateFin!)}

)} {workflowSteps[activeStep].commentaires && (

{workflowSteps[activeStep].commentaires}

)}
)}
{/* Historique des événements */}
(
{formatDate(item.date)}
{item.utilisateur}
)} content={(item) => (
{item.description}
{item.details && (
{item.details}
)}
)} marker={(item) => ( )} />
{/* Résumé des étapes */}
(
{rowData.nom}
)} /> ( )} />
{/* Dialog d'action */} setShowActionDialog(false)} style={{ width: '600px' }} footer={
} >
setActionType(e.value)} className="w-full" placeholder="Sélectionner une action" />
setActionDate(e.value || new Date())} className="w-full" dateFormat="dd/mm/yy" showTime />
setActionComment(e.target.value)} className="w-full" rows={4} placeholder="Décrivez l'action effectuée ou la raison de cette action..." />
); }; export default DevisWorkflowPage;