'use client'; export const dynamic = 'force-dynamic'; import React, { useState, useEffect, useRef } from 'react'; import { DataTable } from 'primereact/datatable'; import { Column } from 'primereact/column'; import { Button } from 'primereact/button'; import { InputText } from 'primereact/inputtext'; import { Card } from 'primereact/card'; import { Dialog } from 'primereact/dialog'; import { Toast } from 'primereact/toast'; import { Toolbar } from 'primereact/toolbar'; import { Tag } from 'primereact/tag'; import { InputNumber } from 'primereact/inputnumber'; import { Dropdown } from 'primereact/dropdown'; import { Calendar } from 'primereact/calendar'; import { InputTextarea } from 'primereact/inputtextarea'; import { confirmDialog } from 'primereact/confirmdialog'; import { ConfirmDialog } from 'primereact/confirmdialog'; interface OrderItem { id: string; reference: string; nom: string; quantiteCommandee: number; quantiteRecue: number; prixUnitaire: number; total: number; unite: string; } interface Order { id: string; numero: string; fournisseur: string; dateCommande: Date; dateLivraison?: Date; statut: 'BROUILLON' | 'ENVOYEE' | 'CONFIRMEE' | 'PARTIELLE' | 'LIVREE' | 'ANNULEE'; priorite: 'NORMALE' | 'URGENTE' | 'CRITIQUE'; montantTotal: number; items: OrderItem[]; commentaires: string; adresseLivraison: string; responsable: string; } const CommandesPage = () => { const [orders, setOrders] = useState([]); const [selectedOrders, setSelectedOrders] = useState([]); const [loading, setLoading] = useState(true); const [globalFilter, setGlobalFilter] = useState(''); const [orderDialog, setOrderDialog] = useState(false); const [itemDialog, setItemDialog] = useState(false); const [deleteOrderDialog, setDeleteOrderDialog] = useState(false); const [order, setOrder] = useState({ id: '', numero: '', fournisseur: '', dateCommande: new Date(), statut: 'BROUILLON', priorite: 'NORMALE', montantTotal: 0, items: [], commentaires: '', adresseLivraison: '', responsable: '' }); const [currentItem, setCurrentItem] = useState({ id: '', reference: '', nom: '', quantiteCommandee: 0, quantiteRecue: 0, prixUnitaire: 0, total: 0, unite: 'unité' }); const [submitted, setSubmitted] = useState(false); const toast = useRef(null); const dt = useRef>(null); const fournisseurs = [ { label: 'Lafarge', value: 'lafarge' }, { label: 'Bosch', value: 'bosch' }, { label: 'Protecta', value: 'protecta' }, { label: 'Leroy Merlin', value: 'leroy-merlin' }, { label: 'Castorama', value: 'castorama' } ]; const priorites = [ { label: 'Normale', value: 'NORMALE' }, { label: 'Urgente', value: 'URGENTE' }, { label: 'Critique', value: 'CRITIQUE' } ]; const statuts = [ { label: 'Brouillon', value: 'BROUILLON' }, { label: 'Envoyée', value: 'ENVOYEE' }, { label: 'Confirmée', value: 'CONFIRMEE' }, { label: 'Partielle', value: 'PARTIELLE' }, { label: 'Livrée', value: 'LIVREE' }, { label: 'Annulée', value: 'ANNULEE' } ]; const unites = [ { label: 'Unité', value: 'unité' }, { label: 'Mètre', value: 'm' }, { label: 'Mètre carré', value: 'm²' }, { label: 'Kilogramme', value: 'kg' }, { label: 'Litre', value: 'l' }, { label: 'Sac', value: 'sac' }, { label: 'Palette', value: 'palette' } ]; useEffect(() => { loadOrders(); }, []); useEffect(() => { // Recalculer le total de la commande quand les items changent const total = order.items.reduce((sum, item) => sum + item.total, 0); setOrder(prev => ({ ...prev, montantTotal: total })); }, [order.items]); const loadOrders = async () => { try { setLoading(true); // Données mockées const mockOrders: Order[] = [ { id: '1', numero: 'CMD-2024-001', fournisseur: 'lafarge', dateCommande: new Date('2024-01-15'), dateLivraison: new Date('2024-01-22'), statut: 'LIVREE', priorite: 'NORMALE', montantTotal: 1275.00, items: [ { id: '1', reference: 'CIM-001', nom: 'Ciment Portland', quantiteCommandee: 150, quantiteRecue: 150, prixUnitaire: 8.50, total: 1275.00, unite: 'sac' } ], commentaires: 'Livraison urgente pour chantier Dupont', adresseLivraison: '123 Rue du Chantier, 75001 Paris', responsable: 'Jean Martin' }, { id: '2', numero: 'CMD-2024-002', fournisseur: 'bosch', dateCommande: new Date('2024-01-20'), statut: 'CONFIRMEE', priorite: 'URGENTE', montantTotal: 600.00, items: [ { id: '2', reference: 'OUT-002', nom: 'Perceuse électrique', quantiteCommandee: 5, quantiteRecue: 0, prixUnitaire: 120.00, total: 600.00, unite: 'unité' } ], commentaires: 'Renouvellement outillage équipe', adresseLivraison: 'Entrepôt A, Zone Industrielle', responsable: 'Marie Dubois' }, { id: '3', numero: 'CMD-2024-003', fournisseur: 'protecta', dateCommande: new Date(), statut: 'BROUILLON', priorite: 'CRITIQUE', montantTotal: 500.00, items: [ { id: '3', reference: 'SEC-003', nom: 'Casque de sécurité', quantiteCommandee: 20, quantiteRecue: 0, prixUnitaire: 25.00, total: 500.00, unite: 'unité' } ], commentaires: 'Commande urgente EPI', adresseLivraison: 'Bureau central', responsable: 'Pierre Durand' } ]; setOrders(mockOrders); } catch (error) { console.error('Erreur lors du chargement:', error); toast.current?.show({ severity: 'error', summary: 'Erreur', detail: 'Impossible de charger les commandes', life: 3000 }); } finally { setLoading(false); } }; const openNew = () => { setOrder({ id: '', numero: '', fournisseur: '', dateCommande: new Date(), statut: 'BROUILLON', priorite: 'NORMALE', montantTotal: 0, items: [], commentaires: '', adresseLivraison: '', responsable: '' }); setSubmitted(false); setOrderDialog(true); }; const hideDialog = () => { setSubmitted(false); setOrderDialog(false); }; const hideItemDialog = () => { setSubmitted(false); setItemDialog(false); }; const hideDeleteOrderDialog = () => { setDeleteOrderDialog(false); }; const saveOrder = () => { setSubmitted(true); if (order.fournisseur && order.responsable && order.items.length > 0) { let updatedOrders = [...orders]; if (order.id) { // Mise à jour const index = orders.findIndex(o => o.id === order.id); updatedOrders[index] = order; toast.current?.show({ severity: 'success', summary: 'Succès', detail: 'Commande mise à jour', life: 3000 }); } else { // Création const newOrder = { ...order, id: Date.now().toString(), numero: `CMD-${new Date().getFullYear()}-${String(orders.length + 1).padStart(3, '0')}` }; updatedOrders.push(newOrder); toast.current?.show({ severity: 'success', summary: 'Succès', detail: 'Commande créée', life: 3000 }); } setOrders(updatedOrders); setOrderDialog(false); } }; const editOrder = (order: Order) => { setOrder({ ...order }); setOrderDialog(true); }; const confirmDeleteOrder = (order: Order) => { setOrder(order); setDeleteOrderDialog(true); }; const deleteOrder = () => { const updatedOrders = orders.filter(o => o.id !== order.id); setOrders(updatedOrders); setDeleteOrderDialog(false); toast.current?.show({ severity: 'success', summary: 'Succès', detail: 'Commande supprimée', life: 3000 }); }; const sendOrder = (order: Order) => { const updatedOrders = orders.map(o => o.id === order.id ? { ...o, statut: 'ENVOYEE' as const } : o ); setOrders(updatedOrders); toast.current?.show({ severity: 'info', summary: 'Commande envoyée', detail: `Commande ${order.numero} envoyée au fournisseur`, life: 3000 }); }; const receiveOrder = (order: Order) => { const updatedOrders = orders.map(o => o.id === order.id ? { ...o, statut: 'LIVREE' as const, dateLivraison: new Date(), items: o.items.map(item => ({ ...item, quantiteRecue: item.quantiteCommandee })) } : o ); setOrders(updatedOrders); toast.current?.show({ severity: 'success', summary: 'Commande réceptionnée', detail: `Commande ${order.numero} réceptionnée`, life: 3000 }); }; const addItem = () => { setCurrentItem({ id: '', reference: '', nom: '', quantiteCommandee: 0, quantiteRecue: 0, prixUnitaire: 0, total: 0, unite: 'unité' }); setSubmitted(false); setItemDialog(true); }; const saveItem = () => { setSubmitted(true); if (currentItem.nom && currentItem.quantiteCommandee > 0 && currentItem.prixUnitaire > 0) { const item = { ...currentItem, id: currentItem.id || Date.now().toString(), total: currentItem.quantiteCommandee * currentItem.prixUnitaire }; let updatedItems = [...order.items]; if (currentItem.id) { // Mise à jour const index = order.items.findIndex(i => i.id === currentItem.id); updatedItems[index] = item; } else { // Ajout updatedItems.push(item); } setOrder({ ...order, items: updatedItems }); setItemDialog(false); } }; const editItem = (item: OrderItem) => { setCurrentItem({ ...item }); setItemDialog(true); }; const deleteItem = (itemId: string) => { const updatedItems = order.items.filter(i => i.id !== itemId); setOrder({ ...order, items: updatedItems }); }; const exportCSV = () => { dt.current?.exportCSV(); }; const leftToolbarTemplate = () => { return (
); }; const rightToolbarTemplate = () => { return (