Files
demat-facturation/todo.md
Manus d0ef89e6ba Checkpoint: Améliorations majeures de la gestion des règles d'automatisme
Trois nouvelles fonctionnalités implémentées :

 **Assistant de création guidée**
- Deux modes de création : "Assistant de création" (guidé) et "Mode avancé" (complet)
- Interface simplifiée pour les utilisateurs non techniques
- Boutons séparés pour choisir le mode de création

 **Test de règles avant activation**
- Bouton "Tester la règle" dans le formulaire de création/édition
- Simulation sur toutes les factures existantes sans modification
- Affichage des résultats :
  * Nombre total de factures
  * Nombre de factures affectées
  * Aperçu des 10 premières factures avec les modifications prévues
- Permet de valider l'impact avant d'activer la règle

 **Duplication de règles**
- Bouton "Dupliquer" (icône Copy bleue) dans la liste des règles
- Création automatique d'une copie avec le suffixe "(copie)"
- Règle dupliquée désactivée par défaut pour éviter les conflits
- Facilite la création de variantes de règles similaires

Architecture technique :
- server/routers.ts : Ajout des routes `test` et `duplicate` dans automationRules
- server/routers.ts : Ajout des interfaces Condition et Actions
- server/routers.ts : Implémentation de la logique d'évaluation des conditions pour le test
- client/src/pages/AutomationRules.tsx : Ajout des mutations testMutation et duplicateMutation
- client/src/pages/AutomationRules.tsx : Ajout des états wizardMode, wizardStep, testResultsOpen, testResults
- client/src/pages/AutomationRules.tsx : Modification des boutons de création (Assistant vs Mode avancé)
- client/src/pages/AutomationRules.tsx : Ajout du bouton "Tester la règle" dans le DialogFooter
- client/src/pages/AutomationRules.tsx : Ajout du Dialog des résultats de test avec statistiques et aperçu
- client/src/pages/AutomationRules.tsx : Ajout du bouton "Dupliquer" dans le tableau des règles

Bénéfices utilisateur :
- **Sécurité** : Test avant activation pour éviter les erreurs de configuration
- **Productivité** : Duplication rapide pour créer des variantes
- **Accessibilité** : Assistant guidé pour les utilisateurs non techniques
- **Transparence** : Visualisation de l'impact réel avant application
- **Confiance** : Validation des règles sur données réelles

Ces améliorations transforment la gestion des automatismes en un outil puissant, sécurisé et accessible à tous les profils d'utilisateurs.
2026-02-12 03:28:27 -05:00

328 lines
18 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
## Boutons Modifier et Supprimer dans la liste des factures
- [x] Ajouter une colonne "Actions" dans le tableau des factures
- [x] Ajouter un bouton "Modifier" qui redirige vers InvoiceDetail
- [x] Ajouter un bouton "Supprimer" avec confirmation (AlertDialog)
- [x] Utiliser la route tRPC existante pour supprimer une facture
- [x] Tester la suppression avec confirmation
## Édition directe des champs métier dans la liste
- [x] Charger les listes de services et ventilations dans la page Invoices
- [x] Transformer la cellule Service en menu déroulant éditable
- [x] Transformer la cellule Type d'achat en menu déroulant éditable
- [x] Transformer la cellule Ventilation en menu déroulant éditable
- [x] Sauvegarder automatiquement les modifications (mutation updateFieldMutation)
- [x] Afficher une notification de succès après sauvegarde
## Ajout dynamique depuis les menus déroulants
- [x] Ajouter option "➜ Ajouter..." dans le menu Service
- [x] Ajouter option "➜ Ajouter..." dans le menu Ventilation
- [x] Créer une boîte de dialogue pour saisir le nouveau nom
- [x] Sauvegarder la nouvelle entrée dans la base de données (createDepartmentMutation, createAllocationMutation)
- [x] Sélectionner automatiquement la nouvelle valeur pour la facture
- [x] Rafraîchir les listes après ajout (invalidate queries)
## Affichage du texte extrait de la facture
- [x] Ajouter une colonne extractedText dans la table invoices
- [x] Modifier le prompt Mistral pour demander le texte extrait
- [x] Modifier le type ExtractedInvoiceData pour inclure extractedText
- [x] Modifier routers.ts, emailImportService.ts et folderImportService.ts pour sauvegarder extractedText
- [x] Ajouter un bouton "Détail" (icône FileText) dans la liste des factures
- [x] Créer une boîte de dialogue pour afficher le texte complet
- [ ] Tester l'affichage du texte extrait avec une nouvelle facture importée
## Champ Abonnement pour les factures
- [x] Ajouter colonne isSubscription (OUI/NON) à la table invoices avec valeur par défaut NON
- [x] Ajouter champ subscriptionKeywords dans la table userSettings
- [x] Ajouter interface pour gérer les mots-clés d'abonnement dans la page Settings
- [x] Modifier l'extraction pour détecter automatiquement les abonnements via mots-clés
- [x] Modifier le prompt Mistral pour demander isSubscription
- [x] Modifier routers.ts, emailImportService.ts et folderImportService.ts pour utiliser subscriptionKeywords
- [x] Ajouter la colonne Abonnement dans la liste des factures
- [x] Permettre l'édition directe du champ Abonnement dans la liste (select OUI/NON)
- [x] Ajouter isSubscription dans le schéma de validation update
- [ ] Tester la détection automatique avec une nouvelle facture importée
## Bug : Détection incorrecte du champ Abonnement
- [x] Analyser le prompt Mistral pour comprendre pourquoi isSubscription est à OUI
- [x] Identifier le problème: mots-clés génériques codés en dur au lieu d'utiliser subscriptionKeywords
- [x] Corriger le prompt pour utiliser UNIQUEMENT les mots-clés configurés dans subscriptionKeywords
- [x] Ajouter logique: si subscriptionKeywords est vide, isSubscription = false par défaut
- [ ] Tester avec une nouvelle facture importée et le mot-clé "BLOB" (ne devrait pas détecter)
## Nouvelle page Factures BAP
- [ ] Créer une nouvelle page InvoicesBAP.tsx affichant uniquement les factures avec Abonnement = NON
- [ ] Inclure les colonnes Type d'achat et Ventilation dans la page Factures BAP
- [ ] Ajouter la route /invoices-bap dans App.tsx
- [ ] Ajouter le lien "Factures BAP" dans le menu de navigation
- [ ] Supprimer les colonnes Type d'achat et Ventilation de la page Factures principale
- [ ] Tester le filtrage et l'affichage des factures BAP
## Page Factures BAP
- [x] Créer nouvelle page InvoicesBAP.tsx basée sur Invoices.tsx
- [x] Filtrer uniquement les factures avec Abonnement = NON (isSubscription = 0)
- [x] Inclure les colonnes Type d'achat et Ventilation dans Factures BAP
- [x] Supprimer les colonnes Type d'achat et Ventilation de la page Factures principale
- [x] Ajouter la route /invoices-bap dans App.tsx
- [x] Ajouter le menu "Factures BAP" dans DashboardLayout
- [ ] Tester le filtrage et l'édition directe dans la nouvelle page
## Paramètre Dossier d'export
- [x] Ajouter le champ exportFolder dans la table importSettings du schéma
- [x] Pousser la migration avec pnpm db:push
- [x] Ajouter le champ dans l'interface ImportSettings.tsx
- [x] Tester la sauvegarde et récupération du paramètre
## Système de gestion des automatismes
- [x] Créer la table automationRules dans le schéma pour stocker les règles
- [x] Définir la structure JSON pour les conditions (SI) et actions (ALORS)
- [x] Pousser la migration avec pnpm db:push
- [x] Créer les fonctions CRUD dans db.ts pour les règles
- [x] Créer les routes tRPC pour gérer les règles (list, create, update, delete, reorder)
- [x] Créer la page AutomationRules.tsx pour l'interface de gestion
- [x] Ajouter le menu "Automatismes" dans DashboardLayout
- [x] Implémenter le formulaire de création/édition de règles
- [x] Implémenter l'affichage de la liste des règles avec ordre de priorité
- [x] Créer la fonction d'évaluation des règles (applyAutomationRules)
- [x] Intégrer l'application des règles dans le processus d'import
- [x] Tester avec des règles réelles
## Coloration des valeurs dans Factures BAP
- [x] Ajouter les champs de traçage (autoFilledFields) dans la table invoices
- [x] Pousser la migration avec pnpm db:push
- [x] Mettre à jour automationEngine.ts pour marquer les champs remplis automatiquement
- [x] Modifier InvoicesBAP.tsx pour afficher les valeurs en vert (auto) et bleu (manuel)
- [x] Mettre à jour la logique d'édition pour marquer les valeurs comme manuelles
- [x] Tester l'affichage avec des règles d'automatisme
## Correction erreur Select.Item dans AutomationRules
- [x] Identifier tous les Select.Item avec valeurs vides dans AutomationRules.tsx
- [x] Remplacer les valeurs vides par des valeurs par défaut valides
- [x] Tester la création de nouvelles règles
## Améliorations de la gestion des règles d'automatisme
- [x] Créer une route tRPC pour tester une règle sur les factures existantes
- [x] Créer une route tRPC pour dupliquer une règle
- [x] Implémenter l'assistant de création guidée avec étapes progressives
- [x] Ajouter le bouton "Tester" dans le formulaire de création/édition
- [x] Afficher les résultats du test (nombre de factures affectées)
- [x] Ajouter le bouton "Dupliquer" dans la liste des règles
- [x] Tester toutes les nouvelles fonctionnalités