'use client'; export const dynamic = 'force-dynamic'; import React, { useState, useRef } from 'react'; import { Card } from 'primereact/card'; import { Button } from 'primereact/button'; import { InputText } from 'primereact/inputtext'; import { DataTable } from 'primereact/datatable'; import { Column } from 'primereact/column'; import { Toast } from 'primereact/toast'; import { Divider } from 'primereact/divider'; import { Tag } from 'primereact/tag'; import { Dropdown } from 'primereact/dropdown'; import { ProgressSpinner } from 'primereact/progressspinner'; import { clientService } from '../../../../services/api'; import { formatPhoneNumber, formatAddress } from '../../../../utils/formatters'; import type { Client } from '../../../../types/btp'; const RechercheClientPage = () => { const toast = useRef(null); const [loading, setLoading] = useState(false); const [clients, setClients] = useState([]); const [hasSearched, setHasSearched] = useState(false); const [searchCriteria, setSearchCriteria] = useState({ nom: '', entreprise: '', ville: '', email: '', telephone: '', codePostal: '', siret: '', numeroTVA: '' }); const [searchType, setSearchType] = useState<'simple' | 'advanced'>('simple'); const searchTypes = [ { label: 'Recherche simple', value: 'simple' }, { label: 'Recherche avancée', value: 'advanced' } ]; const handleInputChange = (e: React.ChangeEvent, field: string) => { setSearchCriteria(prev => ({ ...prev, [field]: e.target.value })); }; const handleSearch = async () => { // Vérifier qu'au moins un critère est rempli const hasSearchCriteria = Object.values(searchCriteria).some(value => value.trim() !== ''); if (!hasSearchCriteria) { toast.current?.show({ severity: 'warn', summary: 'Attention', detail: 'Veuillez saisir au moins un critère de recherche', life: 3000 }); return; } setLoading(true); try { // Pour la démonstration, nous utilisons une recherche simple // En production, vous pourriez avoir des endpoints spécifiques pour chaque type de recherche let results: Client[] = []; if (searchCriteria.nom) { results = await clientService.searchByNom(searchCriteria.nom); } else if (searchCriteria.entreprise) { results = await clientService.searchByEntreprise(searchCriteria.entreprise); } else if (searchCriteria.ville) { results = await clientService.searchByVille(searchCriteria.ville); } else if (searchCriteria.email) { results = await clientService.searchByEmail(searchCriteria.email); } else { // Recherche générale results = await clientService.getAll(); // Filtrer les résultats côté client pour les critères non supportés par l'API results = results.filter(client => { return ( (!searchCriteria.telephone || client.telephone?.includes(searchCriteria.telephone)) && (!searchCriteria.codePostal || client.codePostal?.includes(searchCriteria.codePostal)) && (!searchCriteria.siret || client.siret?.includes(searchCriteria.siret)) && (!searchCriteria.numeroTVA || client.numeroTVA?.includes(searchCriteria.numeroTVA)) ); }); } setClients(results); setHasSearched(true); toast.current?.show({ severity: 'success', summary: 'Recherche terminée', detail: `${results.length} client(s) trouvé(s)`, life: 3000 }); } catch (error) { console.error('Erreur lors de la recherche:', error); toast.current?.show({ severity: 'error', summary: 'Erreur', detail: 'Impossible d\'effectuer la recherche', life: 3000 }); } finally { setLoading(false); } }; const handleReset = () => { setSearchCriteria({ nom: '', entreprise: '', ville: '', email: '', telephone: '', codePostal: '', siret: '', numeroTVA: '' }); setClients([]); setHasSearched(false); }; const exportResults = () => { if (clients.length === 0) { toast.current?.show({ severity: 'warn', summary: 'Attention', detail: 'Aucun résultat à exporter', life: 3000 }); return; } // Créer un CSV simple const headers = ['Nom', 'Prénom', 'Entreprise', 'Email', 'Téléphone', 'Ville', 'Code Postal']; const csvContent = [ headers.join(','), ...clients.map(client => [ client.nom, client.prenom, client.entreprise || '', client.email || '', client.telephone || '', client.ville || '', client.codePostal || '' ].join(',')) ].join('\n'); const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' }); const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = `recherche_clients_${new Date().toISOString().split('T')[0]}.csv`; link.click(); toast.current?.show({ severity: 'success', summary: 'Export réussi', detail: 'Les résultats ont été exportés', life: 3000 }); }; const statusBodyTemplate = (rowData: Client) => { return ( ); }; const phoneBodyTemplate = (rowData: Client) => { return rowData.telephone ? formatPhoneNumber(rowData.telephone) : ''; }; const addressBodyTemplate = (rowData: Client) => { return formatAddress(rowData.adresse, rowData.codePostal, rowData.ville); }; const actionBodyTemplate = (rowData: Client) => { return (
); }; return (

Recherche de Clients

{/* Critères de recherche */}
setSearchType(e.value)} placeholder="Sélectionnez le type de recherche" />
{/* Recherche simple */} {searchType === 'simple' && ( <>
handleInputChange(e, 'nom')} placeholder="Rechercher par nom ou prénom" />
handleInputChange(e, 'entreprise')} placeholder="Nom de l'entreprise" />
handleInputChange(e, 'ville')} placeholder="Ville" />
handleInputChange(e, 'email')} placeholder="Adresse email" />
)} {/* Recherche avancée */} {searchType === 'advanced' && ( <>
handleInputChange(e, 'nom')} placeholder="Nom ou prénom" />
handleInputChange(e, 'entreprise')} placeholder="Nom de l'entreprise" />
handleInputChange(e, 'email')} placeholder="Adresse email" />
handleInputChange(e, 'telephone')} placeholder="Numéro de téléphone" />
handleInputChange(e, 'ville')} placeholder="Ville" />
handleInputChange(e, 'codePostal')} placeholder="Code postal" />
handleInputChange(e, 'siret')} placeholder="Numéro SIRET" />
handleInputChange(e, 'numeroTVA')} placeholder="Numéro TVA" />
)}
{/* Résultats */} {loading && (
)} {hasSearched && !loading && ( <>

Résultats de la recherche

{clients.length} client(s) trouvé(s)
`${rowData.prenom} ${rowData.nom}`} headerStyle={{ minWidth: '12rem' }} /> )}
); }; export default RechercheClientPage;