Checkpoint: Checkpoint saved: Améliorations majeures de l'export des factures BAP
Deux nouvelles fonctionnalités implémentées : ✅ **Indicateur visuel d'exportabilité** - Icône verte ✓ (CheckCircle) dans la colonne Score pour identifier visuellement les factures exportables - L'icône apparaît uniquement pour les factures qui remplissent tous les critères : * Score de qualité = 100% * Type d'achat rempli (CAPEX ou OPEX) * Service concerné rempli * Ventilation comptable remplie - Tooltip "Facture exportable" au survol de l'icône ✅ **Export automatique vers le dossier configuré** - Les PDFs sont maintenant copiés automatiquement vers le dossier configuré dans les paramètres (exportFolder) - Création automatique du dossier d'export s'il n'existe pas - Gestion des erreurs de copie avec messages détaillés - Notification de succès affichant le nombre de factures exportées et le chemin du dossier - Mise à jour du statut d'export (exported/export_error) pour chaque facture - Validation préalable : le dossier d'export doit être configuré avant l'export Modifications techniques : - client/src/pages/InvoicesBAP.tsx : Ajout de l'icône CheckCircle dans la colonne Score - client/src/pages/InvoicesBAP.tsx : Modification du callback onSuccess pour afficher le dossier d'export - client/src/pages/Invoices.tsx : Mise à jour du callback onSuccess (même modification) - server/routers.ts : Refonte complète de la route exportToPdf : * Récupération du paramètre exportFolder depuis importSettings * Validation que exportFolder est configuré * Création du dossier d'export avec fs.mkdir (recursive) * Copie des PDFs avec fs.copyFile depuis storage vers exportFolder * Gestion des erreurs individuelles par facture * Retour des informations : exportFolder, copiedCount, liste des factures Bénéfices utilisateur : - **Visibilité** : Identification immédiate des factures prêtes à l'export grâce à l'icône verte - **Automatisation** : Plus besoin d'ouvrir manuellement les PDFs dans le navigateur - **Organisation** : Les PDFs sont automatiquement copiés dans le dossier de destination - **Traçabilité** : Notification claire avec le chemin du dossier et le nombre de factures exportées - **Fiabilité** : Gestion des erreurs avec mise à jour du statut pour chaque facture Cette amélioration transforme l'export en un processus entièrement automatisé et transparent pour l'utilisateur.
This commit is contained in:
@@ -32,7 +32,7 @@ import {
|
||||
TableRow,
|
||||
} from "@/components/ui/table";
|
||||
import { trpc } from "@/lib/trpc";
|
||||
import { Search, FileText, Download, FileSpreadsheet, Trash2, Edit, Trash } from "lucide-react";
|
||||
import { Search, FileText, Download, FileSpreadsheet, Trash2, Edit, Trash, CheckCircle } from "lucide-react";
|
||||
import * as XLSX from 'xlsx';
|
||||
import { toast } from "sonner";
|
||||
import { useLocation } from "wouter";
|
||||
@@ -106,15 +106,10 @@ export default function InvoicesBAP() {
|
||||
|
||||
const exportMutation = trpc.sftp.exportToPdf.useMutation({
|
||||
onSuccess: (data) => {
|
||||
toast.success(`${data.invoices.length} facture(s) exportée(s) avec succès`);
|
||||
|
||||
// Open PDFs in new tabs
|
||||
data.invoices.forEach((inv, index) => {
|
||||
// Add a small delay between each window to avoid popup blocking
|
||||
setTimeout(() => {
|
||||
window.open(inv.fileUrl, '_blank');
|
||||
}, index * 100);
|
||||
});
|
||||
toast.success(
|
||||
`${data.copiedCount} facture(s) exportée(s) avec succès vers:\n${data.exportFolder}`,
|
||||
{ duration: 5000 }
|
||||
);
|
||||
|
||||
setSelectedIds([]);
|
||||
utils.invoices.list.invalidate();
|
||||
@@ -576,7 +571,16 @@ export default function InvoicesBAP() {
|
||||
<option value="OUI">OUI</option>
|
||||
</select>
|
||||
</TableCell>
|
||||
<TableCell>{getQualityBadge(invoice.qualityScore)}</TableCell>
|
||||
<TableCell>
|
||||
<div className="flex items-center gap-2">
|
||||
{getQualityBadge(invoice.qualityScore)}
|
||||
{isEligibleForExport(invoice) && (
|
||||
<div title="Facture exportable">
|
||||
<CheckCircle className="h-4 w-4 text-green-600" />
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</TableCell>
|
||||
<TableCell>{getExportStatusBadge(invoice.exportStatus || "not_exported")}</TableCell>
|
||||
<TableCell>
|
||||
<div className="flex gap-2">
|
||||
|
||||
Reference in New Issue
Block a user