'use client'; export const dynamic = 'force-dynamic'; import React, { useState, useEffect } from 'react'; import { Card } from 'primereact/card'; import { DataTable } from 'primereact/datatable'; import { Column } from 'primereact/column'; import { InputText } from 'primereact/inputtext'; import { Calendar } from 'primereact/calendar'; import { Tag } from 'primereact/tag'; import { Button } from 'primereact/button'; import { Dropdown } from 'primereact/dropdown'; import { Divider } from 'primereact/divider'; import clientService from '../../../../services/clientService'; /** * Page Historique Clients - BTP Express * Suivi complet de l'activité clients avec métriques BTP */ const HistoriqueClientsPage = () => { const [activites, setActivites] = useState([]); const [loading, setLoading] = useState(true); const [globalFilter, setGlobalFilter] = useState(''); const [selectedClient, setSelectedClient] = useState(null); const [dateDebut, setDateDebut] = useState(null); const [dateFin, setDateFin] = useState(null); const [typeActivite, setTypeActivite] = useState(''); const [metriques, setMetriques] = useState({ nouveauxClients: 0, chantiersTermines: 0, caTotal: 0, relancesEnvoyees: 0 }); const typesActivite = [ { label: 'Toutes', value: '' }, { label: 'Création client', value: 'CLIENT_CREATION' }, { label: 'Modification client', value: 'CLIENT_UPDATE' }, { label: 'Nouveau chantier', value: 'CHANTIER_CREATION' }, { label: 'Chantier terminé', value: 'CHANTIER_TERMINE' }, { label: 'Devis envoyé', value: 'DEVIS_ENVOYE' }, { label: 'Devis accepté', value: 'DEVIS_ACCEPTE' }, { label: 'Facture émise', value: 'FACTURE_EMISE' }, { label: 'Paiement reçu', value: 'PAIEMENT_RECU' }, { label: 'Relance envoyée', value: 'RELANCE_ENVOYEE' } ]; useEffect(() => { loadHistorique(); loadMetriques(); }, [selectedClient, dateDebut, dateFin, typeActivite]); const loadHistorique = async () => { try { setLoading(true); // Simulation données historique BTP const mockActivites = [ { id: '1', date: new Date('2025-01-30'), type: 'CHANTIER_CREATION', client: { nom: 'Dupont', prenom: 'Jean', entreprise: 'Maçonnerie Dupont' }, description: 'Nouveau chantier: Rénovation villa 150m²', montant: 45000, statut: 'EN_COURS', utilisateur: 'M. Laurent (Chef de projet)' }, { id: '2', date: new Date('2025-01-29'), type: 'DEVIS_ACCEPTE', client: { nom: 'Martin', prenom: 'Sophie', entreprise: 'Construction Martin' }, description: 'Devis DEV-2025-001 accepté - Extension maison', montant: 28500, statut: 'ACCEPTE', utilisateur: 'Mme Petit (Commerciale)' }, { id: '3', date: new Date('2025-01-28'), type: 'FACTURE_EMISE', client: { nom: 'Bernard', prenom: 'Michel', entreprise: null }, description: 'Facture FAC-2025-012 émise - Acompte 30%', montant: 15600, statut: 'ENVOYEE', utilisateur: 'Mme Durand (Comptabilité)' }, { id: '4', date: new Date('2025-01-27'), type: 'CHANTIER_TERMINE', client: { nom: 'Rousseau', prenom: 'Claire', entreprise: 'Pharmacie Rousseau' }, description: 'Chantier terminé: Aménagement officine 80m²', montant: 32000, statut: 'TERMINE', utilisateur: 'M. Thomas (Chef équipe)' }, { id: '5', date: new Date('2025-01-26'), type: 'CLIENT_CREATION', client: { nom: 'Leroy', prenom: 'Antoine', entreprise: 'Boulangerie Leroy' }, description: 'Nouveau client créé - Secteur alimentaire', montant: 0, statut: 'ACTIF', utilisateur: 'Mme Petit (Commerciale)' }, { id: '6', date: new Date('2025-01-25'), type: 'PAIEMENT_RECU', client: { nom: 'Garcia', prenom: 'Maria', entreprise: 'Restaurant Garcia' }, description: 'Paiement reçu - Solde chantier cuisine pro', montant: 18750, statut: 'PAYE', utilisateur: 'Système (Automatique)' } ]; setActivites(mockActivites); } catch (error) { console.error('Erreur chargement historique:', error); } finally { setLoading(false); } }; const loadMetriques = () => { // Simulation métriques période setMetriques({ nouveauxClients: 8, chantiersTermines: 12, caTotal: 185600, relancesEnvoyees: 3 }); }; const typeActiviteBodyTemplate = (rowData: any) => { const getConfig = (type: string) => { switch (type) { case 'CLIENT_CREATION': return { label: 'Nouveau client', severity: 'info', icon: 'pi-user-plus' }; case 'CLIENT_UPDATE': return { label: 'Client modifié', severity: 'warning', icon: 'pi-user-edit' }; case 'CHANTIER_CREATION': return { label: 'Nouveau chantier', severity: 'success', icon: 'pi-map' }; case 'CHANTIER_TERMINE': return { label: 'Chantier terminé', severity: 'success', icon: 'pi-check-circle' }; case 'DEVIS_ENVOYE': return { label: 'Devis envoyé', severity: 'info', icon: 'pi-send' }; case 'DEVIS_ACCEPTE': return { label: 'Devis accepté', severity: 'success', icon: 'pi-thumbs-up' }; case 'FACTURE_EMISE': return { label: 'Facture émise', severity: 'warning', icon: 'pi-file-excel' }; case 'PAIEMENT_RECU': return { label: 'Paiement reçu', severity: 'success', icon: 'pi-euro' }; case 'RELANCE_ENVOYEE': return { label: 'Relance envoyée', severity: 'danger', icon: 'pi-exclamation-triangle' }; default: return { label: type, severity: 'secondary', icon: 'pi-info-circle' }; } }; const config = getConfig(rowData.type); return (
); }; const clientBodyTemplate = (rowData: any) => { return (
{`${rowData.client.prenom} ${rowData.client.nom}`} {rowData.client.entreprise && ( {rowData.client.entreprise} )}
); }; const montantBodyTemplate = (rowData: any) => { if (rowData.montant === 0) return -; return ( 0 ? 'text-green-500 font-medium' : 'text-red-500 font-medium'}> {new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR' }).format(rowData.montant)} ); }; const dateBodyTemplate = (rowData: any) => { return (
{rowData.date.toLocaleDateString('fr-FR')} {rowData.date.toLocaleTimeString('fr-FR', { hour: '2-digit', minute: '2-digit' })}
); }; const utilisateurBodyTemplate = (rowData: any) => { return (
{rowData.utilisateur}
); }; const header = (
Historique d'Activité Clients
setGlobalFilter(e.currentTarget.value)} style={{ width: '250px' }} /> setDateDebut(e.value || null)} dateFormat="dd/mm/yy" showIcon style={{ width: '150px' }} /> setDateFin(e.value || null)} dateFormat="dd/mm/yy" showIcon style={{ width: '150px' }} /> setTypeActivite(e.value)} placeholder="Type d'activité" style={{ width: '180px' }} />
); return (
{/* Métriques de la période */}
{metriques.nouveauxClients}
Nouveaux clients
{metriques.chantiersTermines}
Chantiers terminés
{new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', notation: 'compact' }).format(metriques.caTotal)}
CA généré
{metriques.relancesEnvoyees}
Relances envoyées
{/* Tableau historique */}
); }; export default HistoriqueClientsPage;