mirror of
https://github.com/R0m1k3/Regisflow.git
synced 2026-10-23 23:28:18 +02:00
Improve sales data exports by fixing library import and error handling
Updates SalesHistory component to correctly import jsPDF and jspdf-autotable libraries, and handles potential import errors. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 91318273-c764-4fd4-be04-bdc12c38af32 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/0715008c-7244-40f4-befc-26c014852236/3388939c-1563-4ac9-b69d-87f52be7cd1f.jpg
This commit is contained in:
1 parent
0a84dec87a
commit
f64493d9bb
2 files changed
+91
-82
No files matched your search
Binary file not shown.
|
After Width: | Height: | Size: 53 KiB |
@@ -85,90 +85,99 @@ export default function SalesHistory({ canDelete = false }: SalesHistoryProps) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const { default: jsPDF } = await import('jspdf');
|
try {
|
||||||
await import('jspdf-autotable');
|
const { default: jsPDF } = await import('jspdf');
|
||||||
|
const { default: autoTable } = await import('jspdf-autotable');
|
||||||
|
|
||||||
const doc = new jsPDF() as any;
|
const doc = new jsPDF();
|
||||||
|
|
||||||
// Configuration du document
|
// Configuration du document
|
||||||
doc.setFont('helvetica');
|
doc.setFont('helvetica');
|
||||||
|
|
||||||
// Titre du document
|
// Titre du document
|
||||||
doc.setFontSize(16);
|
doc.setFontSize(16);
|
||||||
doc.text('Historique des Ventes de Feux d\'Artifice', 20, 20);
|
doc.text('Historique des Ventes de Feux d\'Artifice', 20, 20);
|
||||||
|
|
||||||
// Informations générales
|
// Informations générales
|
||||||
doc.setFontSize(10);
|
doc.setFontSize(10);
|
||||||
doc.text(`Date d'export: ${new Date().toLocaleDateString('fr-FR')}`, 20, 30);
|
doc.text(`Date d'export: ${new Date().toLocaleDateString('fr-FR')}`, 20, 30);
|
||||||
doc.text(`Nombre de ventes: ${sales.length}`, 20, 35);
|
doc.text(`Nombre de ventes: ${sales.length}`, 20, 35);
|
||||||
|
|
||||||
if (startDate || endDate) {
|
if (startDate || endDate) {
|
||||||
let periodText = 'Période: ';
|
let periodText = 'Période: ';
|
||||||
if (startDate) periodText += `du ${new Date(startDate).toLocaleDateString('fr-FR')} `;
|
if (startDate) periodText += `du ${new Date(startDate).toLocaleDateString('fr-FR')} `;
|
||||||
if (endDate) periodText += `au ${new Date(endDate).toLocaleDateString('fr-FR')}`;
|
if (endDate) periodText += `au ${new Date(endDate).toLocaleDateString('fr-FR')}`;
|
||||||
doc.text(periodText, 20, 40);
|
doc.text(periodText, 20, 40);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Données du tableau
|
||||||
|
const tableData = sales.map(sale => [
|
||||||
|
new Date(sale.timestamp!).toLocaleDateString('fr-FR'),
|
||||||
|
sale.vendeur,
|
||||||
|
sale.typeArticle,
|
||||||
|
sale.categorie,
|
||||||
|
sale.quantite.toString(),
|
||||||
|
sale.nom + ' ' + sale.prenom,
|
||||||
|
sale.modePaiement || 'Espèce',
|
||||||
|
sale.typeIdentite,
|
||||||
|
sale.numeroIdentite
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Configuration du tableau
|
||||||
|
autoTable(doc, {
|
||||||
|
head: [['Date', 'Vendeur', 'Article', 'Cat.', 'Qté', 'Client', 'Paiement', 'ID Type', 'N° ID']],
|
||||||
|
body: tableData,
|
||||||
|
startY: startDate || endDate ? 50 : 45,
|
||||||
|
styles: {
|
||||||
|
fontSize: 8,
|
||||||
|
cellPadding: 2,
|
||||||
|
},
|
||||||
|
headStyles: {
|
||||||
|
fillColor: [59, 130, 246],
|
||||||
|
textColor: 255,
|
||||||
|
fontSize: 9,
|
||||||
|
},
|
||||||
|
alternateRowStyles: {
|
||||||
|
fillColor: [248, 250, 252],
|
||||||
|
},
|
||||||
|
columnStyles: {
|
||||||
|
0: { cellWidth: 18 }, // Date
|
||||||
|
1: { cellWidth: 25 }, // Vendeur
|
||||||
|
2: { cellWidth: 35 }, // Article
|
||||||
|
3: { cellWidth: 12 }, // Catégorie
|
||||||
|
4: { cellWidth: 12 }, // Quantité
|
||||||
|
5: { cellWidth: 30 }, // Client
|
||||||
|
6: { cellWidth: 20 }, // Paiement
|
||||||
|
7: { cellWidth: 15 }, // ID Type
|
||||||
|
8: { cellWidth: 25 }, // N° ID
|
||||||
|
},
|
||||||
|
margin: { left: 10, right: 10 },
|
||||||
|
});
|
||||||
|
|
||||||
|
// Pied de page
|
||||||
|
const pageCount = doc.internal.getNumberOfPages();
|
||||||
|
for (let i = 1; i <= pageCount; i++) {
|
||||||
|
doc.setPage(i);
|
||||||
|
doc.setFontSize(8);
|
||||||
|
doc.text(`Page ${i} sur ${pageCount}`, doc.internal.pageSize.width - 30, doc.internal.pageSize.height - 10);
|
||||||
|
doc.text('RegisFlow - Registre des ventes de feux d\'artifice', 20, doc.internal.pageSize.height - 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Téléchargement
|
||||||
|
doc.save(`historique_ventes_${new Date().toISOString().split('T')[0]}.pdf`);
|
||||||
|
|
||||||
|
toast({
|
||||||
|
title: "Export PDF réussi",
|
||||||
|
description: `${sales.length} ventes exportées en PDF`,
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Erreur lors de l\'export PDF:', error);
|
||||||
|
toast({
|
||||||
|
title: "Erreur d'export",
|
||||||
|
description: "Impossible de générer le fichier PDF",
|
||||||
|
variant: "destructive",
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Données du tableau
|
|
||||||
const tableData = sales.map(sale => [
|
|
||||||
new Date(sale.timestamp!).toLocaleDateString('fr-FR'),
|
|
||||||
sale.vendeur,
|
|
||||||
sale.typeArticle,
|
|
||||||
sale.categorie,
|
|
||||||
sale.quantite.toString(),
|
|
||||||
sale.nom + ' ' + sale.prenom,
|
|
||||||
sale.modePaiement || 'Espèce',
|
|
||||||
sale.typeIdentite,
|
|
||||||
sale.numeroIdentite
|
|
||||||
]);
|
|
||||||
|
|
||||||
// Configuration du tableau
|
|
||||||
doc.autoTable({
|
|
||||||
head: [['Date', 'Vendeur', 'Article', 'Cat.', 'Qté', 'Client', 'Paiement', 'ID Type', 'N° ID']],
|
|
||||||
body: tableData,
|
|
||||||
startY: startDate || endDate ? 50 : 45,
|
|
||||||
styles: {
|
|
||||||
fontSize: 8,
|
|
||||||
cellPadding: 2,
|
|
||||||
},
|
|
||||||
headStyles: {
|
|
||||||
fillColor: [59, 130, 246],
|
|
||||||
textColor: 255,
|
|
||||||
fontSize: 9,
|
|
||||||
},
|
|
||||||
alternateRowStyles: {
|
|
||||||
fillColor: [248, 250, 252],
|
|
||||||
},
|
|
||||||
columnStyles: {
|
|
||||||
0: { cellWidth: 18 }, // Date
|
|
||||||
1: { cellWidth: 25 }, // Vendeur
|
|
||||||
2: { cellWidth: 35 }, // Article
|
|
||||||
3: { cellWidth: 12 }, // Catégorie
|
|
||||||
4: { cellWidth: 12 }, // Quantité
|
|
||||||
5: { cellWidth: 30 }, // Client
|
|
||||||
6: { cellWidth: 20 }, // Paiement
|
|
||||||
7: { cellWidth: 15 }, // ID Type
|
|
||||||
8: { cellWidth: 25 }, // N° ID
|
|
||||||
},
|
|
||||||
margin: { left: 10, right: 10 },
|
|
||||||
});
|
|
||||||
|
|
||||||
// Pied de page
|
|
||||||
const pageCount = doc.internal.getNumberOfPages();
|
|
||||||
for (let i = 1; i <= pageCount; i++) {
|
|
||||||
doc.setPage(i);
|
|
||||||
doc.setFontSize(8);
|
|
||||||
doc.text(`Page ${i} sur ${pageCount}`, doc.internal.pageSize.width - 30, doc.internal.pageSize.height - 10);
|
|
||||||
doc.text('RegisFlow - Registre des ventes de feux d\'artifice', 20, doc.internal.pageSize.height - 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Téléchargement
|
|
||||||
doc.save(`historique_ventes_${new Date().toISOString().split('T')[0]}.pdf`);
|
|
||||||
|
|
||||||
toast({
|
|
||||||
title: "Export PDF réussi",
|
|
||||||
description: `${sales.length} ventes exportées en PDF`,
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const exportToCSV = () => {
|
const exportToCSV = () => {
|
||||||
|
|||||||
Reference in new issue
Block a user