import { useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger, DialogFooter, DialogDescription } from '@/components/ui/dialog'; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger } from '@/components/ui/alert-dialog'; import { useToast } from '@/hooks/use-toast'; import { useStoreContext } from '@/hooks/useStoreContext'; import { useAuth } from '@/hooks/useAuth'; import { apiRequest } from '@/lib/queryClient'; import type { Sale } from '@shared/schema'; import { History, Download, Trash2, Eye, Filter } from 'lucide-react'; interface SalesHistoryProps { canDelete?: boolean; } export default function SalesHistory({ canDelete = false }: SalesHistoryProps) { const { toast } = useToast(); const queryClient = useQueryClient(); const { user } = useAuth(); const { selectedStoreId } = useStoreContext(); const [selectedSale, setSelectedSale] = useState(null); const [startDate, setStartDate] = useState(''); const [endDate, setEndDate] = useState(''); // Query for sales const { data: salesData, isLoading } = useQuery({ queryKey: ['/api/sales', startDate, endDate, selectedStoreId], queryFn: async () => { const params = new URLSearchParams(); if (startDate) params.append('startDate', startDate); if (endDate) params.append('endDate', endDate); // Always add storeId for queries if (selectedStoreId) { params.append('storeId', selectedStoreId.toString()); } const queryString = params.toString(); const response = await apiRequest(`/api/sales${queryString ? `?${queryString}` : ''}`); return response.json(); }, enabled: !!selectedStoreId && !!user, // Only run query when store is selected and user is loaded refetchOnMount: true, // Always refetch when component mounts refetchOnWindowFocus: false, // Don't refetch on window focus }); const sales = Array.isArray(salesData) ? salesData : []; // Delete mutation const deleteSaleMutation = useMutation({ mutationFn: (saleId: number) => apiRequest(`/api/sales/${saleId}`, { method: 'DELETE' }), onSuccess: () => { // Invalidate all sales queries to refresh the history queryClient.invalidateQueries({ queryKey: ['/api/sales'], exact: false }); toast({ title: "Vente supprimée", description: "La vente a été supprimée avec succès", }); }, onError: () => { toast({ title: "Erreur", description: "Impossible de supprimer la vente", variant: "destructive", }); }, }); const handleDeleteSale = (sale: Sale) => { deleteSaleMutation.mutate(sale.id); }; const exportToCSV = () => { if (sales.length === 0) { toast({ title: "Aucune donnée", description: "Aucune vente à exporter", variant: "destructive", }); return; } const csvHeader = [ 'Date/Heure', 'Vendeur', 'Date de vente', 'Type d\'article', 'Catégorie', 'Quantité', 'Gencode', 'Nom client', 'Prénom client', 'Date de naissance', 'Lieu de naissance', 'Type identité', 'Numéro identité', 'Autorité délivrance', 'Date délivrance' ].join(','); const csvData = sales.map(sale => [ new Date(sale.timestamp!).toLocaleString('fr-FR'), sale.vendeur, sale.dateVente, sale.typeArticle, sale.categorie, sale.quantite, sale.gencode, sale.nom, sale.prenom, sale.dateNaissance, sale.lieuNaissance || '', sale.typeIdentite, sale.numeroIdentite, sale.autoriteDelivrance, sale.dateDelivrance ].map(field => `"${field}"`).join(',')).join('\n'); const csvContent = csvHeader + '\n' + csvData; const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' }); const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = `ventes_fireworks_${new Date().toISOString().split('T')[0]}.csv`; link.click(); toast({ title: "Export réussi", description: `${sales.length} ventes exportées`, }); }; const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString('fr-FR'); }; const formatDateTime = (dateString: string) => { return new Date(dateString).toLocaleString('fr-FR'); }; return ( Historique des Ventes {/* Filters */}
setStartDate(e.target.value)} />
setEndDate(e.target.value)} />
{/* Sales Table */} {isLoading ? (
) : sales.length === 0 ? (
Aucune vente trouvée
) : (
Date/Heure Vendeur Client Article Quantité Gencode Actions {sales.map((sale) => ( {formatDateTime(sale.timestamp!)} {sale.vendeur}

{sale.nom} {sale.prenom}

{formatDate(sale.dateNaissance)}

{sale.typeArticle}

{sale.categorie}
{sale.quantite} {sale.gencode}
Détails de la vente {selectedSale && (

Informations générales

Date/Heure : {formatDateTime(selectedSale.timestamp!)}

Vendeur : {selectedSale.vendeur}

Date de vente : {formatDate(selectedSale.dateVente)}

Produit

Type : {selectedSale.typeArticle}

Catégorie : {selectedSale.categorie}

Quantité : {selectedSale.quantite}

Gencode : {selectedSale.gencode}

Client

Nom : {selectedSale.nom}

Prénom : {selectedSale.prenom}

Date de naissance : {formatDate(selectedSale.dateNaissance)}

{selectedSale.lieuNaissance && (

Lieu de naissance : {selectedSale.lieuNaissance}

)}

Pièce d'identité

Type : {selectedSale.typeIdentite}

Numéro : {selectedSale.numeroIdentite}

Autorité : {selectedSale.autoriteDelivrance}

Date délivrance : {formatDate(selectedSale.dateDelivrance)}

)}
{canDelete && ( Confirmer la suppression Êtes-vous sûr de vouloir supprimer cette vente ? Cette action est irréversible.

Client : {sale.nom} {sale.prenom}
Article : {sale.typeArticle}
Date : {formatDateTime(sale.timestamp!)}
Annuler handleDeleteSale(sale)} className="bg-red-600 hover:bg-red-700" > Supprimer
)}
))}
)}
); }