'use client'; export const dynamic = 'force-dynamic'; import React, { useState, useEffect } from 'react'; import { Card } from 'primereact/card'; import { Button } from 'primereact/button'; import { DataTable } from 'primereact/datatable'; import { Column } from 'primereact/column'; import { Dialog } from 'primereact/dialog'; import { InputText } from 'primereact/inputtext'; import { InputTextarea } from 'primereact/inputtextarea'; import { Dropdown } from 'primereact/dropdown'; import { Toast } from 'primereact/toast'; import { ConfirmDialog } from 'primereact/confirmdialog'; import { Tag } from 'primereact/tag'; import { Toolbar } from 'primereact/toolbar'; import { useRef } from 'react'; import { fournisseurService } from '@/services/fournisseurService'; interface Fournisseur { id: string; nom: string; contact: string; telephone: string; email: string; adresse: string; ville: string; codePostal: string; pays: string; siret?: string; tva?: string; conditionsPaiement: string; delaiLivraison: number; note?: string; actif: boolean; dateCreation: string; dateModification: string; } interface FournisseurFormData { nom: string; contact: string; telephone: string; email: string; adresse: string; ville: string; codePostal: string; pays: string; siret: string; tva: string; conditionsPaiement: string; delaiLivraison: number; note: string; } const FournisseursPage = () => { const [fournisseurs, setFournisseurs] = useState([]); const [loading, setLoading] = useState(true); const [showDialog, setShowDialog] = useState(false); const [editingFournisseur, setEditingFournisseur] = useState(null); const [isSubmitting, setIsSubmitting] = useState(false); const [globalFilter, setGlobalFilter] = useState(''); const [selectedFournisseurs, setSelectedFournisseurs] = useState([]); const toast = useRef(null); const [formData, setFormData] = useState({ nom: '', contact: '', telephone: '', email: '', adresse: '', ville: '', codePostal: '', pays: 'France', siret: '', tva: '', conditionsPaiement: '30 jours', delaiLivraison: 7, note: '' }); const conditionsPaiementOptions = [ { label: 'Comptant', value: 'Comptant' }, { label: '30 jours', value: '30 jours' }, { label: '45 jours', value: '45 jours' }, { label: '60 jours', value: '60 jours' }, { label: '90 jours', value: '90 jours' } ]; const paysOptions = [ { label: 'France', value: 'France' }, { label: 'Belgique', value: 'Belgique' }, { label: 'Suisse', value: 'Suisse' }, { label: 'Allemagne', value: 'Allemagne' }, { label: 'Espagne', value: 'Espagne' }, { label: 'Italie', value: 'Italie' } ]; useEffect(() => { loadFournisseurs(); }, []); const loadFournisseurs = async () => { try { setLoading(true); const data = await fournisseurService.getAllFournisseurs(); setFournisseurs(data); } catch (error) { console.error('Erreur lors du chargement des fournisseurs:', error); toast.current?.show({ severity: 'error', summary: 'Erreur', detail: 'Impossible de charger les fournisseurs' }); } finally { setLoading(false); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); try { setIsSubmitting(true); // Validation des champs obligatoires if (!formData.nom || !formData.contact || !formData.email) { toast.current?.show({ severity: 'warn', summary: 'Validation', detail: 'Veuillez remplir tous les champs obligatoires' }); return; } // Conversion des données du formulaire vers le format API const apiData = { nom: formData.nom, contact: formData.contact, telephone: formData.telephone, email: formData.email, adresse: formData.adresse, ville: formData.ville, codePostal: formData.codePostal, pays: formData.pays, siret: formData.siret, tva: formData.tva, conditionsPaiement: formData.conditionsPaiement, delaiLivraison: formData.delaiLivraison, note: formData.note }; if (editingFournisseur) { await fournisseurService.updateFournisseur(editingFournisseur.id, apiData); toast.current?.show({ severity: 'success', summary: 'Succès', detail: 'Fournisseur mis à jour avec succès' }); } else { await fournisseurService.createFournisseur(apiData); toast.current?.show({ severity: 'success', summary: 'Succès', detail: 'Fournisseur créé avec succès' }); } await loadFournisseurs(); setShowDialog(false); resetForm(); } catch (error) { console.error('Erreur lors de la sauvegarde:', error); toast.current?.show({ severity: 'error', summary: 'Erreur', detail: 'Erreur lors de la sauvegarde du fournisseur' }); } finally { setIsSubmitting(false); } }; const resetForm = () => { setFormData({ nom: '', contact: '', telephone: '', email: '', adresse: '', ville: '', codePostal: '', pays: 'France', siret: '', tva: '', conditionsPaiement: '30 jours', delaiLivraison: 7, note: '' }); setEditingFournisseur(null); }; const openDialog = (fournisseur?: Fournisseur) => { if (fournisseur) { setEditingFournisseur(fournisseur); setFormData({ nom: fournisseur.nom, contact: fournisseur.contact, telephone: fournisseur.telephone, email: fournisseur.email, adresse: fournisseur.adresse, ville: fournisseur.ville, codePostal: fournisseur.codePostal, pays: fournisseur.pays, siret: fournisseur.siret || '', tva: fournisseur.tva || '', conditionsPaiement: fournisseur.conditionsPaiement, delaiLivraison: fournisseur.delaiLivraison, note: fournisseur.note || '' }); } else { resetForm(); } setShowDialog(true); }; const handleDelete = async (fournisseur: Fournisseur) => { try { await fournisseurService.deleteFournisseur(fournisseur.id); toast.current?.show({ severity: 'success', summary: 'Succès', detail: 'Fournisseur supprimé avec succès' }); await loadFournisseurs(); } catch (error) { console.error('Erreur lors de la suppression:', error); toast.current?.show({ severity: 'error', summary: 'Erreur', detail: 'Erreur lors de la suppression du fournisseur' }); } }; const handleDeleteSelected = async () => { try { for (const fournisseur of selectedFournisseurs) { await fournisseurService.deleteFournisseur(fournisseur.id); } toast.current?.show({ severity: 'success', summary: 'Succès', detail: `${selectedFournisseurs.length} fournisseur(s) supprimé(s) avec succès` }); setSelectedFournisseurs([]); await loadFournisseurs(); } catch (error) { console.error('Erreur lors de la suppression:', error); toast.current?.show({ severity: 'error', summary: 'Erreur', detail: 'Erreur lors de la suppression des fournisseurs' }); } }; const statusBodyTemplate = (fournisseur: Fournisseur) => { return ( ); }; const actionBodyTemplate = (fournisseur: Fournisseur) => { return (
); }; const leftToolbarTemplate = () => { return (
); }; const rightToolbarTemplate = () => { return (
setGlobalFilter(e.target.value)} placeholder="Rechercher..." />
); }; return (
setSelectedFournisseurs(e.value)} dataKey="id" emptyMessage="Aucun fournisseur trouvé" className="p-datatable-sm" >
setShowDialog(false)} >
setFormData({ ...formData, nom: e.target.value })} required />
setFormData({ ...formData, contact: e.target.value })} required />
setFormData({ ...formData, telephone: e.target.value })} />
setFormData({ ...formData, email: e.target.value })} required />
setFormData({ ...formData, adresse: e.target.value })} rows={2} />
setFormData({ ...formData, ville: e.target.value })} />
setFormData({ ...formData, codePostal: e.target.value })} />
setFormData({ ...formData, pays: e.value })} />
setFormData({ ...formData, siret: e.target.value })} />
setFormData({ ...formData, tva: e.target.value })} />
setFormData({ ...formData, conditionsPaiement: e.value })} />
setFormData({ ...formData, delaiLivraison: parseInt(e.target.value) || 0 })} />
setFormData({ ...formData, note: e.target.value })} rows={3} />
); }; export default FournisseursPage;