218 lines
11 KiB
Markdown
218 lines
11 KiB
Markdown
# 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
|
|
|
|
## Correction page Paramètres de réception
|
|
- [x] Ajouter DashboardLayout à la page ImportSettings pour afficher le menu latéral
|
|
|
|
## Import automatique par email
|
|
- [x] Installer les dépendances npm pour IMAP (imap et mailparser)
|
|
- [x] Créer le service emailImportService.ts pour se connecter à IMAP
|
|
- [x] Implémenter la détection des nouveaux emails non lus avec pièces jointes PDF
|
|
- [x] Implémenter le téléchargement et traitement des pièces jointes
|
|
- [x] Implémenter le marquage des emails comme lus après traitement
|
|
- [x] Créer un scheduler pour exécuter le service selon la fréquence configurée
|
|
- [x] Ajouter des routes tRPC pour démarrer/arrêter le service
|
|
- [x] Ajouter des boutons de contrôle du service dans la page Paramètres de réception
|
|
- [ ] Tester l'import automatique par email avec un vrai compte
|
|
|
|
## Import automatique depuis dossier
|
|
- [x] Installer la dépendance chokidar pour surveiller les dossiers
|
|
- [x] Créer le service folderImportService.ts pour surveiller un dossier
|
|
- [x] Implémenter la détection des nouveaux fichiers PDF dans le dossier
|
|
- [x] Implémenter le traitement des fichiers détectés
|
|
- [x] Implémenter le déplacement des fichiers traités vers un sous-dossier "processed"
|
|
- [x] Créer un scheduler pour vérifier le dossier selon la fréquence configurée
|
|
- [x] Ajouter des routes tRPC pour démarrer/arrêter le service
|
|
- [x] Ajouter des boutons de contrôle dans la page Paramètres de réception
|
|
|
|
## Système de notifications
|
|
- [x] Créer le service notificationService.ts pour gérer les notifications
|
|
- [x] Implémenter l'envoi de notifications après import automatique email
|
|
- [x] Implémenter l'envoi de notifications après import automatique dossier
|
|
- [x] Inclure le résumé : nombre de factures importées, doublons ignorés, erreurs
|
|
- [ ] Tester les fonctionnalités avec des données réelles
|
|
|
|
## Bouton effacer les logs d'import
|
|
- [x] Ajouter fonction deleteAllImportLogs dans db.ts
|
|
- [x] Ajouter route tRPC importLogs.deleteAll
|
|
- [x] Ajouter bouton "Effacer les logs" dans la page History
|
|
- [x] Ajouter confirmation avant suppression (AlertDialog)
|
|
- [x] Tester la fonctionnalité
|
|
|
|
## Bug : Import automatique par email ne fonctionne pas
|
|
- [x] Vérifier la configuration IMAP dans la base de données
|
|
- [x] Vérifier si le service d'import email est démarré
|
|
- [x] Ajouter un bouton "Vérifier maintenant" pour forcer une vérification immédiate
|
|
- [x] Ajouter fonction triggerEmailCheck dans emailImportService
|
|
- [x] Ajouter route tRPC emailImportService.checkNow
|
|
- [ ] Tester avec un email réel et diagnostiquer les erreurs IMAP
|
|
|
|
## Bugs interface ImportSettings
|
|
- [x] Corriger l'encodage Unicode du bouton "Vérifier maintenant"
|
|
- [x] Ajouter rafraîchissement automatique du statut du service après démarrage/arrêt (email et dossier)
|
|
|
|
## Champs métier pour les factures
|
|
- [x] Ajouter colonnes service_concerne, type_achat, ventilation_comptable à la table invoices
|
|
- [x] Créer table departmentList pour gérer la liste "Service concerné"
|
|
- [x] Créer table accountingAllocationList pour gérer la liste "Ventilation comptable"
|
|
- [x] Ajouter routes tRPC pour CRUD des listes enrichissables
|
|
- [x] Créer page d'administration pour gérer les listes (ListsAdmin.tsx)
|
|
- [x] Ajouter les champs dans le formulaire d'édition de facture (InvoiceDetail.tsx)
|
|
- [x] Ajouter les colonnes dans la liste des factures (Invoices.tsx)
|
|
- [x] Initialiser les valeurs par défaut dans les tables (initializeDefaultLists)
|
|
- [x] Ajouter le lien "Administration des listes" dans le menu de navigation
|
|
|
|
## Bug : Erreur lors de l'ajout d'un service
|
|
- [x] Corriger la fonction initializeDefaultLists pour éviter les erreurs de duplication
|
|
- [x] Vérifier que l'ajout de services et ventilations fonctionne correctement
|
|
|
|
## Chargement dynamique des listes dans le formulaire
|
|
- [x] Modifier InvoiceDetail.tsx pour charger les listes depuis la base de données
|
|
- [x] Remplacer les valeurs codées en dur par des appels tRPC
|
|
- [x] Tester que les valeurs personnalisées apparaissent dans les menus déroulants
|