import React, { useState, useRef } from 'react'; import { useNavigate } from 'react-router-dom'; import { invoiceAPI } from '../services/api'; import toast from 'react-hot-toast'; export default function InvoiceUpload() { const [files, setFiles] = useState([]); const [source, setSource] = useState('upload'); const [uploading, setUploading] = useState(false); const [progress, setProgress] = useState>({}); const fileInputRef = useRef(null); const navigate = useNavigate(); const handleDrop = (e: React.DragEvent) => { e.preventDefault(); const droppedFiles = Array.from(e.dataTransfer.files).filter(f => f.type === 'application/pdf' || f.type.startsWith('image/') ); setFiles(prev => [...prev, ...droppedFiles]); }; const handleFileSelect = (e: React.ChangeEvent) => { if (e.target.files) { const selectedFiles = Array.from(e.target.files); setFiles(prev => [...prev, ...selectedFiles]); } }; const removeFile = (index: number) => { setFiles(prev => prev.filter((_, i) => i !== index)); }; const handleUpload = async () => { if (files.length === 0) { toast.error('Veuillez sélectionner au moins un fichier'); return; } setUploading(true); const newProgress: Record = {}; files.forEach(f => { newProgress[f.name] = 'pending'; }); setProgress(newProgress); let successCount = 0; for (const file of files) { setProgress(prev => ({ ...prev, [file.name]: 'uploading' })); try { const formData = new FormData(); formData.append('file', file); formData.append('source', source); await invoiceAPI.upload(formData); setProgress(prev => ({ ...prev, [file.name]: 'done' })); successCount++; } catch (error: any) { setProgress(prev => ({ ...prev, [file.name]: 'error' })); toast.error(`Erreur pour ${file.name}: ${error.response?.data?.error || 'Erreur inconnue'}`); } } setUploading(false); if (successCount > 0) { toast.success(`${successCount} facture${successCount > 1 ? 's' : ''} importée${successCount > 1 ? 's' : ''} avec succès`); setTimeout(() => navigate('/invoices'), 1500); } }; const formatFileSize = (bytes: number) => { if (bytes < 1024) return `${bytes} o`; if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} Ko`; return `${(bytes / (1024 * 1024)).toFixed(1)} Mo`; }; return (

Importer des factures

{/* Source selection */}
{[ { value: 'upload', label: 'Upload manuel', icon: '📄' }, { value: 'scan', label: 'Scan papier', icon: '📷' }, { value: 'email', label: 'Email', icon: '📧' }, { value: 'portail', label: 'Portail fournisseur', icon: '🌐' }, ].map(s => ( ))}
{/* Drop zone */}
e.preventDefault()} onClick={() => fileInputRef.current?.click()} className="card border-2 border-dashed border-gray-300 hover:border-santinova-400 cursor-pointer transition-colors text-center py-12" >

Glissez-déposez vos fichiers ici

ou cliquez pour sélectionner

PDF, JPEG, PNG, TIFF - Max 20 Mo par fichier

{/* File list */} {files.length > 0 && (

Fichiers sélectionnés ({files.length})

{files.map((file, index) => (
{file.name.split('.').pop()?.toUpperCase()}

{file.name}

{formatFileSize(file.size)}

{progress[file.name] === 'uploading' && ( )} {progress[file.name] === 'done' && ( )} {progress[file.name] === 'error' && ( )} {!uploading && ( )}
))}
{!uploading && ( )}
)} {/* Info box */}

Extraction automatique par IA

Après l'import, l'IA analysera automatiquement vos documents pour extraire les informations clés : fournisseur, numéro de facture, dates, montants et lignes de détail. Vous pourrez ensuite vérifier et corriger les données extraites.

); }