diff --git a/client/src/components/SalesHistory.tsx b/client/src/components/SalesHistory.tsx
index fb5cf7f..9ccc0ca 100644
--- a/client/src/components/SalesHistory.tsx
+++ b/client/src/components/SalesHistory.tsx
@@ -111,7 +111,7 @@ export default function SalesHistory({ canDelete = false }: SalesHistoryProps) {
doc.setFont('helvetica');
doc.setFontSize(16);
- doc.text('Historique des Ventes de Feux d\'Artifice', 20, 20);
+ doc.text('Registre Détaillé des Ventes de Feux d\'Artifice', 20, 20);
doc.setFontSize(10);
doc.text(`Généré le ${new Date().toLocaleDateString('fr-FR')} à ${new Date().toLocaleTimeString('fr-FR')}`, 20, 30);
@@ -121,53 +121,116 @@ export default function SalesHistory({ canDelete = false }: SalesHistoryProps) {
doc.text(period, 20, 35);
}
- // Créer une ligne pour chaque produit de chaque vente
- const tableData: string[][] = [];
-
- filteredSales.forEach(sale => {
+ let currentY = startDate || endDate ? 50 : 45;
+
+ // Pour chaque vente, créer une section complète
+ filteredSales.forEach((sale, saleIndex) => {
+ // Vérifier si on a assez de place, sinon nouvelle page
+ if (currentY > 250) {
+ doc.addPage();
+ currentY = 20;
+ }
+
+ // Titre de la vente
+ doc.setFontSize(12);
+ doc.setFont('helvetica', 'bold');
+ doc.text(`VENTE #${sale.id} - ${new Date(sale.timestamp).toLocaleDateString('fr-FR')} ${new Date(sale.timestamp).toLocaleTimeString('fr-FR')}`, 20, currentY);
+ currentY += 10;
+
+ // Informations vendeur
+ doc.setFontSize(10);
+ doc.setFont('helvetica', 'normal');
+ doc.text(`Vendeur: ${sale.vendeur}`, 20, currentY);
+ currentY += 8;
+
+ // Informations client
+ doc.setFont('helvetica', 'bold');
+ doc.text('INFORMATIONS CLIENT:', 20, currentY);
+ currentY += 6;
+ doc.setFont('helvetica', 'normal');
+ doc.text(`Nom: ${sale.nom} ${sale.prenom}`, 25, currentY);
+ currentY += 5;
+ doc.text(`Date de naissance: ${sale.dateNaissance || 'Non spécifiée'}`, 25, currentY);
+ currentY += 5;
+ doc.text(`Lieu de naissance: ${sale.lieuNaissance || 'Non spécifié'}`, 25, currentY);
+ currentY += 5;
+ doc.text(`Mode de paiement: ${sale.modePaiement || 'Non spécifié'}`, 25, currentY);
+ currentY += 8;
+
+ // Informations identité
+ doc.setFont('helvetica', 'bold');
+ doc.text('PIÈCE D\'IDENTITÉ:', 20, currentY);
+ currentY += 6;
+ doc.setFont('helvetica', 'normal');
+ doc.text(`Type: ${sale.typeIdentite || 'Non spécifié'}`, 25, currentY);
+ currentY += 5;
+ doc.text(`Numéro: ${sale.numeroIdentite || 'Non spécifié'}`, 25, currentY);
+ currentY += 5;
+ doc.text(`Autorité de délivrance: ${sale.autoriteDelivrance || 'Non spécifiée'}`, 25, currentY);
+ currentY += 5;
+ doc.text(`Date de délivrance: ${sale.dateDelivrance || 'Non spécifiée'}`, 25, currentY);
+ currentY += 8;
+
+ // Produits
+ doc.setFont('helvetica', 'bold');
+ doc.text('PRODUITS VENDUS:', 20, currentY);
+ currentY += 6;
+
if (sale.products && sale.products.length > 0) {
- // Pour chaque produit, créer une ligne avec les infos de la vente
- sale.products.forEach(product => {
- tableData.push([
- new Date(sale.timestamp).toLocaleDateString('fr-FR'),
- sale.vendeur,
- `${sale.nom} ${sale.prenom}`,
- product.typeArticle,
- product.categorie,
- product.quantite.toString(),
- sale.modePaiement,
- product.gencode || ''
- ]);
+ sale.products.forEach((product, productIndex) => {
+ doc.setFont('helvetica', 'normal');
+ doc.text(`Produit ${productIndex + 1}:`, 25, currentY);
+ currentY += 5;
+ doc.text(` • Type: ${product.typeArticle}`, 30, currentY);
+ currentY += 4;
+ doc.text(` • Catégorie: ${product.categorie}`, 30, currentY);
+ currentY += 4;
+ doc.text(` • Quantité: ${product.quantite}`, 30, currentY);
+ currentY += 4;
+ doc.text(` • Code: ${product.gencode || 'Non spécifié'}`, 30, currentY);
+ currentY += 6;
});
} else {
- // Fallback pour les ventes sans produits (anciennes données)
- tableData.push([
- new Date(sale.timestamp).toLocaleDateString('fr-FR'),
- sale.vendeur,
- `${sale.nom} ${sale.prenom}`,
- 'N/A',
- 'N/A',
- '0',
- sale.modePaiement,
- ''
- ]);
+ doc.setFont('helvetica', 'normal');
+ doc.text('Aucun produit enregistré', 25, currentY);
+ currentY += 6;
+ }
+
+ // Photos
+ if (sale.photoRecto || sale.photoVerso || sale.photoTicket) {
+ doc.setFont('helvetica', 'bold');
+ doc.text('DOCUMENTS PHOTOGRAPHIÉS:', 20, currentY);
+ currentY += 6;
+ doc.setFont('helvetica', 'normal');
+
+ if (sale.photoRecto) {
+ doc.text('✓ Photo recto pièce d\'identité', 25, currentY);
+ currentY += 5;
+ }
+ if (sale.photoVerso) {
+ doc.text('✓ Photo verso pièce d\'identité', 25, currentY);
+ currentY += 5;
+ }
+ if (sale.photoTicket) {
+ doc.text('✓ Photo ticket/reçu', 25, currentY);
+ currentY += 5;
+ }
+ currentY += 5;
+ }
+
+ // Ligne de séparation si pas la dernière vente
+ if (saleIndex < filteredSales.length - 1) {
+ doc.setLineWidth(0.5);
+ doc.line(20, currentY, 190, currentY);
+ currentY += 15;
}
});
- autoTable(doc, {
- head: [['Date', 'Vendeur', 'Client', 'Article', 'Cat.', 'Qty', 'Paiement', 'Code']],
- body: tableData,
- startY: startDate || endDate ? 45 : 40,
- styles: { fontSize: 8 },
- headStyles: { fillColor: [64, 64, 64] },
- margin: { top: 40, left: 20, right: 20 },
- });
-
- doc.save(`ventes-feux-artifice-${new Date().toISOString().split('T')[0]}.pdf`);
+ doc.save(`registre-detaille-feux-artifice-${new Date().toISOString().split('T')[0]}.pdf`);
toast({
title: "Export réussi",
- description: "Le fichier PDF a été téléchargé",
+ description: "Le registre détaillé PDF a été téléchargé",
variant: "success",
});
} catch (error) {
@@ -358,7 +421,7 @@ export default function SalesHistory({ canDelete = false }: SalesHistoryProps) {
className="modern-button modern-button-secondary"
>
- Export PDF
+ Registre PDF Détaillé