'use client'; 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 { Dropdown } from 'primereact/dropdown'; import { InputTextarea } from 'primereact/inputtextarea'; import { Checkbox } from 'primereact/checkbox'; import { Badge } from 'primereact/badge'; import { Panel } from 'primereact/panel'; import { Rating } from 'primereact/rating'; import fournisseurService from '../../../../services/fournisseurService'; import type { Fournisseur } from '../../../../types/btp-extended'; import { ActionButtonGroup, ViewButton, EditButton, DeleteButton, ActionButton } from '../../../../components/ui/ActionButton'; interface FournisseurFormData { id?: number; nom: string; contact?: string; telephone?: string; email?: string; adresse?: string; ville?: string; codePostal?: string; pays?: string; typeFournisseur: 'MATERIAU' | 'EQUIPEMENT' | 'SERVICE' | 'SOUS_TRAITANT'; specialites?: string; numeroTVA?: string; siret?: string; delaiLivraison?: number; conditionsPaiement?: string; evaluationQualite?: number; actif: boolean; notes?: string; } const FournisseursPage = () => { const [fournisseurs, setFournisseurs] = useState([]); const [loading, setLoading] = useState(true); const [globalFilter, setGlobalFilter] = useState(''); const [selectedFournisseurs, setSelectedFournisseurs] = useState([]); const [fournisseurDialog, setFournisseurDialog] = useState(false); const [deleteFournisseurDialog, setDeleteFournisseurDialog] = useState(false); const [commandesDialog, setCommandesDialog] = useState(false); const [selectedFournisseurCommandes, setSelectedFournisseurCommandes] = useState([]); const [currentFournisseur, setCurrentFournisseur] = useState(null); const [fournisseur, setFournisseur] = useState({ nom: '', contact: '', telephone: '', email: '', adresse: '', ville: '', codePostal: '', pays: 'France', typeFournisseur: 'MATERIAU', specialites: '', numeroTVA: '', siret: '', delaiLivraison: 7, conditionsPaiement: '', evaluationQualite: 5, actif: true, notes: '' }); const [submitted, setSubmitted] = useState(false); const toast = useRef(null); const dt = useRef>(null); const typesFournisseur = [ { label: 'Matériaux', value: 'MATERIAU' }, { label: 'Équipement', value: 'EQUIPEMENT' }, { label: 'Service', value: 'SERVICE' }, { label: 'Sous-traitant', value: 'SOUS_TRAITANT' } ]; const delaisLivraison = [ { label: '1-3 jours', value: 3 }, { label: '1 semaine', value: 7 }, { label: '2 semaines', value: 14 }, { label: '1 mois', value: 30 }, { label: 'Sur mesure', value: 0 } ]; useEffect(() => { loadFournisseurs(); }, []); const loadFournisseurs = async () => { try { setLoading(true); const data = await fournisseurService.getAll(); 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', life: 3000 }); } finally { setLoading(false); } }; const openNew = () => { setFournisseur({ nom: '', contact: '', telephone: '', email: '', adresse: '', ville: '', codePostal: '', pays: 'France', typeFournisseur: 'MATERIAU', specialites: '', numeroTVA: '', siret: '', delaiLivraison: 7, conditionsPaiement: '', evaluationQualite: 5, actif: true, notes: '' }); setSubmitted(false); setFournisseurDialog(true); }; const hideDialog = () => { setSubmitted(false); setFournisseurDialog(false); }; const hideDeleteFournisseurDialog = () => { setDeleteFournisseurDialog(false); }; const saveFournisseur = async () => { setSubmitted(true); if (fournisseur.nom.trim()) { try { let updatedFournisseurs = [...fournisseurs]; if (fournisseur.id) { // Mise à jour const updatedFournisseur = await fournisseurService.update(fournisseur.id, fournisseur); const index = fournisseurs.findIndex(f => f.id === fournisseur.id); updatedFournisseurs[index] = updatedFournisseur; toast.current?.show({ severity: 'success', summary: 'Succès', detail: 'Fournisseur mis à jour', life: 3000 }); } else { // Création const newFournisseur = await fournisseurService.create(fournisseur); updatedFournisseurs.push(newFournisseur); toast.current?.show({ severity: 'success', summary: 'Succès', detail: 'Fournisseur créé', life: 3000 }); } setFournisseurs(updatedFournisseurs); setFournisseurDialog(false); setFournisseur({ nom: '', contact: '', telephone: '', email: '', adresse: '', ville: '', codePostal: '', pays: 'France', typeFournisseur: 'MATERIAU', specialites: '', numeroTVA: '', siret: '', delaiLivraison: 7, conditionsPaiement: '', evaluationQualite: 5, actif: true, notes: '' }); } catch (error: any) { console.error('Erreur lors de la sauvegarde:', error); toast.current?.show({ severity: 'error', summary: 'Erreur', detail: 'Impossible de sauvegarder le fournisseur', life: 3000 }); } } }; const editFournisseur = (fournisseur: Fournisseur) => { setFournisseur({ id: fournisseur.id, nom: fournisseur.nom, contact: fournisseur.contact || '', telephone: fournisseur.telephone || '', email: fournisseur.email || '', adresse: fournisseur.adresse || '', ville: fournisseur.ville || '', codePostal: fournisseur.codePostal || '', pays: fournisseur.pays || 'France', typeFournisseur: fournisseur.typeFournisseur || 'MATERIAU', specialites: fournisseur.specialites || '', numeroTVA: fournisseur.numeroTVA || '', siret: fournisseur.siret || '', delaiLivraison: fournisseur.delaiLivraison || 7, conditionsPaiement: fournisseur.conditionsPaiement || '', evaluationQualite: fournisseur.evaluationQualite || 5, actif: fournisseur.actif !== undefined ? fournisseur.actif : true, notes: fournisseur.notes || '' }); setFournisseurDialog(true); }; const confirmDeleteFournisseur = (fournisseur: Fournisseur) => { setFournisseur(fournisseur as FournisseurFormData); setDeleteFournisseurDialog(true); }; const deleteFournisseur = async () => { try { if (fournisseur.id) { await fournisseurService.delete(fournisseur.id); let updatedFournisseurs = fournisseurs.filter(f => f.id !== fournisseur.id); setFournisseurs(updatedFournisseurs); setDeleteFournisseurDialog(false); toast.current?.show({ severity: 'success', summary: 'Succès', detail: 'Fournisseur supprimé', life: 3000 }); } } catch (error) { console.error('Erreur lors de la suppression:', error); toast.current?.show({ severity: 'error', summary: 'Erreur', detail: 'Impossible de supprimer le fournisseur', life: 3000 }); } }; const voirCommandesFournisseur = async (fournisseur: Fournisseur) => { try { setCurrentFournisseur(fournisseur); const commandes = await fournisseurService.getCommandes(fournisseur.id!); setSelectedFournisseurCommandes(commandes || []); setCommandesDialog(true); } catch (error) { console.error('Erreur lors du chargement des commandes:', error); toast.current?.show({ severity: 'error', summary: 'Erreur', detail: 'Impossible de charger les commandes du fournisseur', life: 3000 }); } }; const exportCSV = () => { dt.current?.exportCSV(); }; const onInputChange = (e: React.ChangeEvent, name: string) => { const val = (e.target && e.target.value) || ''; let _fournisseur = { ...fournisseur }; (_fournisseur as any)[name] = val; setFournisseur(_fournisseur); }; const onDropdownChange = (e: any, name: string) => { let _fournisseur = { ...fournisseur }; (_fournisseur as any)[name] = e.value; setFournisseur(_fournisseur); }; const onNumberChange = (e: any, name: string) => { let _fournisseur = { ...fournisseur }; (_fournisseur as any)[name] = e.value; setFournisseur(_fournisseur); }; const onCheckboxChange = (e: any, name: string) => { let _fournisseur = { ...fournisseur }; (_fournisseur as any)[name] = e.checked; setFournisseur(_fournisseur); }; const leftToolbarTemplate = () => { return (
); }; const rightToolbarTemplate = () => { return (