Checkpoint: Ajout du bouton Supprimer pour faciliter la réimportation des factures.
Modification apportée : - Ajout d'un bouton "Supprimer" dans la page Factures permettant de supprimer les factures sélectionnées - Confirmation avant suppression pour éviter les suppressions accidentelles - Message de succès après suppression avec compteur - Création du dossier storage pour le stockage local des fichiers PDF Prochaine étape recommandée : 1. Sélectionner toutes les factures actuelles (qui n'ont pas de fichiers PDF stockés) 2. Cliquer sur "Supprimer" pour les supprimer 3. Ré-importer le fichier "FACTURES FOURNISSEURS.pdf" via la page "Importer" 4. Cette fois, les fichiers PDF seront correctement stockés dans le dossier storage et l'export PDF fonctionnera
This commit is contained in:
45
.manus/db/db-query-1767954409077.json
Normal file
45
.manus/db/db-query-1767954409077.json
Normal file
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"query": "SELECT id, supplierName, invoiceNumber, fileUrl, qualityScore FROM invoices LIMIT 5;",
|
||||
"command": "mysql --batch --raw --column-names --default-character-set=utf8mb4 --host gateway02.us-east-1.prod.aws.tidbcloud.com --port 4000 --user 4CrrYuB5tme73Qo.bd4328423008 --database fo4DRyBgjsuiigFAgNLuWm --execute SELECT id, supplierName, invoiceNumber, fileUrl, qualityScore FROM invoices LIMIT 5;",
|
||||
"rows": [
|
||||
{
|
||||
"id": "1",
|
||||
"supplierName": "Baxter S.A.S.",
|
||||
"invoiceNumber": "25076822",
|
||||
"fileUrl": "/storage/2026-01/1-FSrFmQSC-FACTURES FOURNISSEURS.pdf",
|
||||
"qualityScore": "100"
|
||||
},
|
||||
{
|
||||
"id": "2",
|
||||
"supplierName": "Boehringer Ingelheim France",
|
||||
"invoiceNumber": "5061124527",
|
||||
"fileUrl": "/storage/2026-01/1-FSrFmQSC-FACTURES FOURNISSEURS.pdf",
|
||||
"qualityScore": "100"
|
||||
},
|
||||
{
|
||||
"id": "3",
|
||||
"supplierName": "Baxter S.A.S.",
|
||||
"invoiceNumber": "25075432",
|
||||
"fileUrl": "/storage/2026-01/1-FSrFmQSC-FACTURES FOURNISSEURS.pdf",
|
||||
"qualityScore": "100"
|
||||
},
|
||||
{
|
||||
"id": "4",
|
||||
"supplierName": "LABORATOIRES BOUCHARA - RECORDATI",
|
||||
"invoiceNumber": "1294153",
|
||||
"fileUrl": "/storage/2026-01/1-FSrFmQSC-FACTURES FOURNISSEURS.pdf",
|
||||
"qualityScore": "95"
|
||||
},
|
||||
{
|
||||
"id": "5",
|
||||
"supplierName": "Bristol Myers Squibb",
|
||||
"invoiceNumber": "2900929593",
|
||||
"fileUrl": "/storage/2026-01/1-FSrFmQSC-FACTURES FOURNISSEURS.pdf",
|
||||
"qualityScore": "100"
|
||||
}
|
||||
],
|
||||
"messages": [],
|
||||
"stdout": "id\tsupplierName\tinvoiceNumber\tfileUrl\tqualityScore\n1\tBaxter S.A.S.\t25076822\t/storage/2026-01/1-FSrFmQSC-FACTURES FOURNISSEURS.pdf\t100\n2\tBoehringer Ingelheim France\t5061124527\t/storage/2026-01/1-FSrFmQSC-FACTURES FOURNISSEURS.pdf\t100\n3\tBaxter S.A.S.\t25075432\t/storage/2026-01/1-FSrFmQSC-FACTURES FOURNISSEURS.pdf\t100\n4\tLABORATOIRES BOUCHARA - RECORDATI\t1294153\t/storage/2026-01/1-FSrFmQSC-FACTURES FOURNISSEURS.pdf\t95\n5\tBristol Myers Squibb\t2900929593\t/storage/2026-01/1-FSrFmQSC-FACTURES FOURNISSEURS.pdf\t100\n",
|
||||
"stderr": "",
|
||||
"execution_time_ms": 109
|
||||
}
|
||||
@@ -14,7 +14,7 @@ import {
|
||||
TableRow,
|
||||
} from "@/components/ui/table";
|
||||
import { trpc } from "@/lib/trpc";
|
||||
import { Search, FileText, Download, FileSpreadsheet } from "lucide-react";
|
||||
import { Search, FileText, Download, FileSpreadsheet, Trash2 } from "lucide-react";
|
||||
import * as XLSX from 'xlsx';
|
||||
import { toast } from "sonner";
|
||||
import { useLocation } from "wouter";
|
||||
@@ -204,6 +204,27 @@ export default function Invoices() {
|
||||
<Download className="w-4 h-4 mr-2" />
|
||||
PDF ({selectedIds.length})
|
||||
</Button>
|
||||
<Button
|
||||
onClick={async () => {
|
||||
if (confirm(`Voulez-vous vraiment supprimer ${selectedIds.length} facture(s) ?`)) {
|
||||
try {
|
||||
for (const id of selectedIds) {
|
||||
await utils.client.invoices.delete.mutate({ id });
|
||||
}
|
||||
toast.success(`${selectedIds.length} facture(s) supprimée(s)`);
|
||||
setSelectedIds([]);
|
||||
utils.invoices.list.invalidate();
|
||||
} catch (error: any) {
|
||||
toast.error(error.message || "Erreur lors de la suppression");
|
||||
}
|
||||
}
|
||||
}}
|
||||
disabled={selectedIds.length === 0}
|
||||
variant="destructive"
|
||||
>
|
||||
<Trash2 className="w-4 h-4 mr-2" />
|
||||
Supprimer ({selectedIds.length})
|
||||
</Button>
|
||||
<Button onClick={() => setLocation("/upload")}>
|
||||
<FileText className="w-4 h-4 mr-2" />
|
||||
Importer
|
||||
|
||||
7
todo.md
7
todo.md
@@ -102,3 +102,10 @@
|
||||
- [x] Corriger la route exportToPdf pour retourner les bonnes URLs
|
||||
- [x] Modifier le code client pour ouvrir les PDFs dans de nouveaux onglets
|
||||
- [x] Ajouter un délai entre chaque ouverture pour éviter le blocage des popups
|
||||
|
||||
## Correction erreur 404 PDF
|
||||
- [x] Vérifier la configuration Express pour servir les fichiers statiques
|
||||
- [x] Vérifier les URLs générées pour les fichiers PDF
|
||||
- [x] Identifier que les fichiers n'ont pas été stockés lors de l'import initial
|
||||
- [x] Ajouter bouton "Supprimer" pour supprimer les factures sélectionnées
|
||||
- [x] Créer le dossier storage pour le stockage local
|
||||
|
||||
Reference in New Issue
Block a user