# Invoice Analyzer - TODO ## Phase 1: Base de données et schéma - [x] Créer table users avec support authentification locale + Azure AD - [x] Créer table sourceFiles pour fichiers PDF uploadés - [x] Créer table invoices pour factures extraites - [x] Créer table userSettings pour paramètres utilisateur - [x] Créer table importLogs pour historique des imports - [x] Créer table llmLogs pour logs des appels LLM - [x] Pousser les migrations avec pnpm db:push ## Phase 2: Authentification - [x] Implémenter authentification locale (email/password avec bcrypt) - [x] Implémenter authentification Azure AD avec MSAL - [x] Créer helpers de génération de tokens JWT - [x] Créer middleware de vérification des rôles (user/admin) ## Phase 3: Stockage et extraction IA - [x] Créer helper de stockage local avec préfixe YYYY-MM - [x] Implémenter extraction PDF avec Mistral OCR - [x] Implémenter extraction de métadonnées avec Mistral LLM - [x] Créer système de scoring de qualité (0-100) - [x] Implémenter détection de doublons - [x] Créer helper de génération de fichiers JSON de métadonnées - [x] Implémenter logger LLM pour debug ## Phase 4: Export SFTP - [x] Créer helper de connexion SFTP - [x] Implémenter export manuel de factures - [x] Implémenter export automatique de factures - [x] Créer test de connexion SFTP ## Phase 5: Routes tRPC - [x] Routes auth (me, loginLocal, getAzureLoginUrl, logout) - [x] Routes invoices (upload, list, getById, update, delete, search, getStats) - [x] Routes sourceFiles (getByIds pour polling) - [x] Routes settings (get, upsert) - [x] Routes admin (createUser, getAllUsers, updatePassword, toggleActive, deleteUser) - [x] Routes sftp (testConnection, exportInvoices) - [x] Routes importLogs (getByUser) - [x] Routes llmLogs (getBySourceFile, getByInvoice) ## Phase 6: Pages Frontend - [x] Page Login avec formulaire local + bouton Azure AD - [x] Page Dashboard avec statistiques et graphiques - [x] Page Upload avec drag-and-drop et suivi temps réel - [x] Page Invoices avec liste, recherche, filtres, pagination - [x] Page Settings avec configuration LLM, keywords, SFTP - [x] Page History avec logs et détails - [x] Page Users (admin) pour gestion des utilisateurs - [x] Layout avec navigation adaptée (DashboardLayout) - [x] Configuration des routes dans App.tsx ## Phase 7: Tests et finalisation - [x] Tests unitaires d'authentification (hashPassword, verifyPassword, JWT) - [x] Tests de logout avec cookies multiples - [x] Vérification du build et de la compilation TypeScript - [x] Vérification du serveur de développement - [x] Créer le checkpoint final ## Corrections et améliorations - [x] Créer un utilisateur administrateur avec login adminServFacturation - [x] Tester la connexion locale avec le nouvel utilisateur - [x] Modifier l'email de l'administrateur de adminServFacturation à o.pareige@itinova.org - [x] Diagnostiquer le problème de connexion locale avec o.pareige@itinova.org - [x] Corriger l'authentification locale (ajout support cookie auth_token) ## Amélioration du Dashboard - [x] Créer route tRPC pour statistiques détaillées (factures par semaine, top fournisseurs) - [x] Créer cartes de statistiques (Factures traitées, Montant total, Score moyen, Dernière activité) - [x] Créer graphique en barres des factures par semaine (Recharts) - [x] Créer graphique circulaire du top 10 fournisseurs (Recharts) - [x] Créer liste détaillée des fournisseurs avec nombre de factures - [x] Ajouter bouton "Voir les statistiques détaillées" ## Modification page Factures - Export PDF - [x] Ajouter champ exportStatus dans le schéma invoices (exported/not_exported/export_error) - [x] Ajouter champ exportedAt dans le schéma invoices (déjà existant) - [x] Créer route tRPC pour exporter les factures en PDF - [x] Créer route tRPC pour mettre à jour le statut d'export - [x] Ajouter cases à cocher pour sélection multiple dans la page Factures - [x] Ajouter case "Tout sélectionner" - [x] Modifier l'affichage des statuts (Exporté/Non exporté/Erreur export) - [x] Ajouter bouton "Exporter" (actif uniquement pour score 100%) - [x] Implémenter le téléchargement de PDF pour les factures sélectionnées - [x] Valider que seules les factures avec score 100% peuvent être exportées ## Nouvelles fonctionnalités - [x] Ajouter des boutons de filtre par statut d'export (Tous/Exportés/Non exportés/Erreurs) - [x] Créer route tRPC pour export Excel - [x] Créer page InvoiceDetail avec visualisation des métadonnées - [x] Ajouter formulaire d'édition manuelle des champs - [x] Implémenter la mise à jour des métadonnées - [x] Recalculer le score de qualité après édition manuelle - [x] Ajouter bouton "Export Excel" dans la page Factures - [x] Générer fichier Excel avec toutes les métadonnées ## Correction export PDF - [x] Diagnostiquer le problème d'export PDF (URLs non accessibles) - [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 ## Correction bouton Supprimer - [x] Permettre la sélection de toutes les factures pour suppression (pas seulement celles à 100%) - [x] Séparer la logique de sélection pour export et suppression - [x] Supprimer les restrictions disabled sur les checkboxes - [x] Ajouter validation pour export PDF (seulement score 100%) ## Diagnostic problème 404 persistant - [ ] Vérifier si les fichiers sont stockés dans le dossier storage - [ ] Vérifier les URLs générées dans la base de données - [ ] Vérifier la configuration Express pour servir les fichiers statiques - [ ] Corriger le chemin d'accès aux fichiers PDF ## Correction formulaire d'édition - [x] Pré-remplir les valeurs existantes dans le formulaire d'édition de facture - [x] Utiliser useEffect pour initialiser les valeurs du formulaire ## Amélioration visuelle formulaire d'édition - [x] Ajouter un bord rouge sur les champs vides du formulaire d'édition - [x] Identifier visuellement les données manquantes non extraites par l'IA ## Correction stockage PDF - [x] Diagnostiquer pourquoi localStoragePut ne sauvegarde pas les fichiers - [x] Vérifier si les données PDF sont bien reçues dans la route upload - [x] Identifier le bug: l'URL de localStoragePut était écrasée par une URL locale - [x] Corriger la route upload pour utiliser l'URL retournée par localStoragePut - [ ] Tester le stockage avec un upload réel ## Paramètres de réception - [x] Créer table importSettings dans le schéma de base de données - [x] Ajouter routes tRPC pour gérer les paramètres de réception (get, update) - [x] Créer page Paramètres de réception avec configuration import manuel/automatique/email - [x] Implémenter activation/désactivation import manuel - [x] Implémenter activation/désactivation import automatique avec dossier source et fréquence - [x] Implémenter activation/désactivation import par email avec compte mail et mot de passe - [x] Tester la sauvegarde et récupération des paramètres