34 KiB
34 KiB
Invoice Analyzer - TODO
Phase 1: Base de données et schéma
- Créer table users avec support authentification locale + Azure AD
- Créer table sourceFiles pour fichiers PDF uploadés
- Créer table invoices pour factures extraites
- Créer table userSettings pour paramètres utilisateur
- Créer table importLogs pour historique des imports
- Créer table llmLogs pour logs des appels LLM
- Pousser les migrations avec pnpm db:push
Phase 2: Authentification
- Implémenter authentification locale (email/password avec bcrypt)
- Implémenter authentification Azure AD avec MSAL
- Créer helpers de génération de tokens JWT
- Créer middleware de vérification des rôles (user/admin)
Phase 3: Stockage et extraction IA
- Créer helper de stockage local avec préfixe YYYY-MM
- Implémenter extraction PDF avec Mistral OCR
- Implémenter extraction de métadonnées avec Mistral LLM
- Créer système de scoring de qualité (0-100)
- Implémenter détection de doublons
- Créer helper de génération de fichiers JSON de métadonnées
- Implémenter logger LLM pour debug
Phase 4: Export SFTP
- Créer helper de connexion SFTP
- Implémenter export manuel de factures
- Implémenter export automatique de factures
- Créer test de connexion SFTP
Phase 5: Routes tRPC
- Routes auth (me, loginLocal, getAzureLoginUrl, logout)
- Routes invoices (upload, list, getById, update, delete, search, getStats)
- Routes sourceFiles (getByIds pour polling)
- Routes settings (get, upsert)
- Routes admin (createUser, getAllUsers, updatePassword, toggleActive, deleteUser)
- Routes sftp (testConnection, exportInvoices)
- Routes importLogs (getByUser)
- Routes llmLogs (getBySourceFile, getByInvoice)
Phase 6: Pages Frontend
- Page Login avec formulaire local + bouton Azure AD
- Page Dashboard avec statistiques et graphiques
- Page Upload avec drag-and-drop et suivi temps réel
- Page Invoices avec liste, recherche, filtres, pagination
- Page Settings avec configuration LLM, keywords, SFTP
- Page History avec logs et détails
- Page Users (admin) pour gestion des utilisateurs
- Layout avec navigation adaptée (DashboardLayout)
- Configuration des routes dans App.tsx
Phase 7: Tests et finalisation
- Tests unitaires d'authentification (hashPassword, verifyPassword, JWT)
- Tests de logout avec cookies multiples
- Vérification du build et de la compilation TypeScript
- Vérification du serveur de développement
- Créer le checkpoint final
Corrections et améliorations
-
Créer un utilisateur administrateur avec login adminServFacturation
-
Tester la connexion locale avec le nouvel utilisateur
-
Modifier l'email de l'administrateur de adminServFacturation à o.pareige@itinova.org
-
Diagnostiquer le problème de connexion locale avec o.pareige@itinova.org
-
Corriger l'authentification locale (ajout support cookie auth_token)
Amélioration du Dashboard
- Créer route tRPC pour statistiques détaillées (factures par semaine, top fournisseurs)
- Créer cartes de statistiques (Factures traitées, Montant total, Score moyen, Dernière activité)
- Créer graphique en barres des factures par semaine (Recharts)
- Créer graphique circulaire du top 10 fournisseurs (Recharts)
- Créer liste détaillée des fournisseurs avec nombre de factures
- Ajouter bouton "Voir les statistiques détaillées"
Modification page Factures - Export PDF
- Ajouter champ exportStatus dans le schéma invoices (exported/not_exported/export_error)
- Ajouter champ exportedAt dans le schéma invoices (déjà existant)
- Créer route tRPC pour exporter les factures en PDF
- Créer route tRPC pour mettre à jour le statut d'export
- Ajouter cases à cocher pour sélection multiple dans la page Factures
- Ajouter case "Tout sélectionner"
- Modifier l'affichage des statuts (Exporté/Non exporté/Erreur export)
- Ajouter bouton "Exporter" (actif uniquement pour score 100%)
- Implémenter le téléchargement de PDF pour les factures sélectionnées
- Valider que seules les factures avec score 100% peuvent être exportées
Nouvelles fonctionnalités
- Ajouter des boutons de filtre par statut d'export (Tous/Exportés/Non exportés/Erreurs)
- Créer route tRPC pour export Excel
- Créer page InvoiceDetail avec visualisation des métadonnées
- Ajouter formulaire d'édition manuelle des champs
- Implémenter la mise à jour des métadonnées
- Recalculer le score de qualité après édition manuelle
- Ajouter bouton "Export Excel" dans la page Factures
- Générer fichier Excel avec toutes les métadonnées
Correction export PDF
- Diagnostiquer le problème d'export PDF (URLs non accessibles)
- Corriger la route exportToPdf pour retourner les bonnes URLs
- Modifier le code client pour ouvrir les PDFs dans de nouveaux onglets
- Ajouter un délai entre chaque ouverture pour éviter le blocage des popups
Correction erreur 404 PDF
- Vérifier la configuration Express pour servir les fichiers statiques
- Vérifier les URLs générées pour les fichiers PDF
- Identifier que les fichiers n'ont pas été stockés lors de l'import initial
- Ajouter bouton "Supprimer" pour supprimer les factures sélectionnées
- Créer le dossier storage pour le stockage local
Correction bouton Supprimer
- Permettre la sélection de toutes les factures pour suppression (pas seulement celles à 100%)
- Séparer la logique de sélection pour export et suppression
- Supprimer les restrictions disabled sur les checkboxes
- 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
- Pré-remplir les valeurs existantes dans le formulaire d'édition de facture
- Utiliser useEffect pour initialiser les valeurs du formulaire
Amélioration visuelle formulaire d'édition
- Ajouter un bord rouge sur les champs vides du formulaire d'édition
- Identifier visuellement les données manquantes non extraites par l'IA
Correction stockage PDF
- Diagnostiquer pourquoi localStoragePut ne sauvegarde pas les fichiers
- Vérifier si les données PDF sont bien reçues dans la route upload
- Identifier le bug: l'URL de localStoragePut était écrasée par une URL locale
- 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
- Créer table importSettings dans le schéma de base de données
- Ajouter routes tRPC pour gérer les paramètres de réception (get, update)
- Créer page Paramètres de réception avec configuration import manuel/automatique/email
- Implémenter activation/désactivation import manuel
- Implémenter activation/désactivation import automatique avec dossier source et fréquence
- Implémenter activation/désactivation import par email avec compte mail et mot de passe
- Tester la sauvegarde et récupération des paramètres
Correction page Paramètres de réception
- Ajouter DashboardLayout à la page ImportSettings pour afficher le menu latéral
Import automatique par email
- Installer les dépendances npm pour IMAP (imap et mailparser)
- Créer le service emailImportService.ts pour se connecter à IMAP
- Implémenter la détection des nouveaux emails non lus avec pièces jointes PDF
- Implémenter le téléchargement et traitement des pièces jointes
- Implémenter le marquage des emails comme lus après traitement
- Créer un scheduler pour exécuter le service selon la fréquence configurée
- Ajouter des routes tRPC pour démarrer/arrêter le service
- 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
- Installer la dépendance chokidar pour surveiller les dossiers
- Créer le service folderImportService.ts pour surveiller un dossier
- Implémenter la détection des nouveaux fichiers PDF dans le dossier
- Implémenter le traitement des fichiers détectés
- Implémenter le déplacement des fichiers traités vers un sous-dossier "processed"
- Créer un scheduler pour vérifier le dossier selon la fréquence configurée
- Ajouter des routes tRPC pour démarrer/arrêter le service
- Ajouter des boutons de contrôle dans la page Paramètres de réception
Système de notifications
- Créer le service notificationService.ts pour gérer les notifications
- Implémenter l'envoi de notifications après import automatique email
- Implémenter l'envoi de notifications après import automatique dossier
- 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
- Ajouter fonction deleteAllImportLogs dans db.ts
- Ajouter route tRPC importLogs.deleteAll
- Ajouter bouton "Effacer les logs" dans la page History
- Ajouter confirmation avant suppression (AlertDialog)
- Tester la fonctionnalité
Bug : Import automatique par email ne fonctionne pas
- Vérifier la configuration IMAP dans la base de données
- Vérifier si le service d'import email est démarré
- Ajouter un bouton "Vérifier maintenant" pour forcer une vérification immédiate
- Ajouter fonction triggerEmailCheck dans emailImportService
- Ajouter route tRPC emailImportService.checkNow
- Tester avec un email réel et diagnostiquer les erreurs IMAP
Bugs interface ImportSettings
- Corriger l'encodage Unicode du bouton "Vérifier maintenant"
- Ajouter rafraîchissement automatique du statut du service après démarrage/arrêt (email et dossier)
Champs métier pour les factures
- Ajouter colonnes service_concerne, type_achat, ventilation_comptable à la table invoices
- Créer table departmentList pour gérer la liste "Service concerné"
- Créer table accountingAllocationList pour gérer la liste "Ventilation comptable"
- Ajouter routes tRPC pour CRUD des listes enrichissables
- Créer page d'administration pour gérer les listes (ListsAdmin.tsx)
- Ajouter les champs dans le formulaire d'édition de facture (InvoiceDetail.tsx)
- Ajouter les colonnes dans la liste des factures (Invoices.tsx)
- Initialiser les valeurs par défaut dans les tables (initializeDefaultLists)
- Ajouter le lien "Administration des listes" dans le menu de navigation
Bug : Erreur lors de l'ajout d'un service
- Corriger la fonction initializeDefaultLists pour éviter les erreurs de duplication
- Vérifier que l'ajout de services et ventilations fonctionne correctement
Chargement dynamique des listes dans le formulaire
- Modifier InvoiceDetail.tsx pour charger les listes depuis la base de données
- Remplacer les valeurs codées en dur par des appels tRPC
- Tester que les valeurs personnalisées apparaissent dans les menus déroulants
Boutons Modifier et Supprimer dans la liste des factures
- Ajouter une colonne "Actions" dans le tableau des factures
- Ajouter un bouton "Modifier" qui redirige vers InvoiceDetail
- Ajouter un bouton "Supprimer" avec confirmation (AlertDialog)
- Utiliser la route tRPC existante pour supprimer une facture
- Tester la suppression avec confirmation
Édition directe des champs métier dans la liste
- Charger les listes de services et ventilations dans la page Invoices
- Transformer la cellule Service en menu déroulant éditable
- Transformer la cellule Type d'achat en menu déroulant éditable
- Transformer la cellule Ventilation en menu déroulant éditable
- Sauvegarder automatiquement les modifications (mutation updateFieldMutation)
- Afficher une notification de succès après sauvegarde
Ajout dynamique depuis les menus déroulants
- Ajouter option "➜ Ajouter..." dans le menu Service
- Ajouter option "➜ Ajouter..." dans le menu Ventilation
- Créer une boîte de dialogue pour saisir le nouveau nom
- Sauvegarder la nouvelle entrée dans la base de données (createDepartmentMutation, createAllocationMutation)
- Sélectionner automatiquement la nouvelle valeur pour la facture
- Rafraîchir les listes après ajout (invalidate queries)
Affichage du texte extrait de la facture
- Ajouter une colonne extractedText dans la table invoices
- Modifier le prompt Mistral pour demander le texte extrait
- Modifier le type ExtractedInvoiceData pour inclure extractedText
- Modifier routers.ts, emailImportService.ts et folderImportService.ts pour sauvegarder extractedText
- Ajouter un bouton "Détail" (icône FileText) dans la liste des factures
- 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
- Ajouter colonne isSubscription (OUI/NON) à la table invoices avec valeur par défaut NON
- Ajouter champ subscriptionKeywords dans la table userSettings
- Ajouter interface pour gérer les mots-clés d'abonnement dans la page Settings
- Modifier l'extraction pour détecter automatiquement les abonnements via mots-clés
- Modifier le prompt Mistral pour demander isSubscription
- Modifier routers.ts, emailImportService.ts et folderImportService.ts pour utiliser subscriptionKeywords
- Ajouter la colonne Abonnement dans la liste des factures
- Permettre l'édition directe du champ Abonnement dans la liste (select OUI/NON)
- 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
- Analyser le prompt Mistral pour comprendre pourquoi isSubscription est à OUI
- Identifier le problème: mots-clés génériques codés en dur au lieu d'utiliser subscriptionKeywords
- Corriger le prompt pour utiliser UNIQUEMENT les mots-clés configurés dans subscriptionKeywords
- 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
- Créer nouvelle page InvoicesBAP.tsx basée sur Invoices.tsx
- Filtrer uniquement les factures avec Abonnement = NON (isSubscription = 0)
- Inclure les colonnes Type d'achat et Ventilation dans Factures BAP
- Supprimer les colonnes Type d'achat et Ventilation de la page Factures principale
- Ajouter la route /invoices-bap dans App.tsx
- Ajouter le menu "Factures BAP" dans DashboardLayout
- Tester le filtrage et l'édition directe dans la nouvelle page
Paramètre Dossier d'export
- Ajouter le champ exportFolder dans la table importSettings du schéma
- Pousser la migration avec pnpm db:push
- Ajouter le champ dans l'interface ImportSettings.tsx
- Tester la sauvegarde et récupération du paramètre
Système de gestion des automatismes
- Créer la table automationRules dans le schéma pour stocker les règles
- Définir la structure JSON pour les conditions (SI) et actions (ALORS)
- Pousser la migration avec pnpm db:push
- Créer les fonctions CRUD dans db.ts pour les règles
- Créer les routes tRPC pour gérer les règles (list, create, update, delete, reorder)
- Créer la page AutomationRules.tsx pour l'interface de gestion
- Ajouter le menu "Automatismes" dans DashboardLayout
- Implémenter le formulaire de création/édition de règles
- Implémenter l'affichage de la liste des règles avec ordre de priorité
- Créer la fonction d'évaluation des règles (applyAutomationRules)
- Intégrer l'application des règles dans le processus d'import
- Tester avec des règles réelles
Coloration des valeurs dans Factures BAP
- Ajouter les champs de traçage (autoFilledFields) dans la table invoices
- Pousser la migration avec pnpm db:push
- Mettre à jour automationEngine.ts pour marquer les champs remplis automatiquement
- Modifier InvoicesBAP.tsx pour afficher les valeurs en vert (auto) et bleu (manuel)
- Mettre à jour la logique d'édition pour marquer les valeurs comme manuelles
- Tester l'affichage avec des règles d'automatisme
Correction erreur Select.Item dans AutomationRules
- Identifier tous les Select.Item avec valeurs vides dans AutomationRules.tsx
- Remplacer les valeurs vides par des valeurs par défaut valides
- Tester la création de nouvelles règles
Améliorations de la gestion des règles d'automatisme
- Créer une route tRPC pour tester une règle sur les factures existantes
- Créer une route tRPC pour dupliquer une règle
- Implémenter l'assistant de création guidée avec étapes progressives
- Ajouter le bouton "Tester" dans le formulaire de création/édition
- Afficher les résultats du test (nombre de factures affectées)
- Ajouter le bouton "Dupliquer" dans la liste des règles
- Tester toutes les nouvelles fonctionnalités
Assistant de création guidée (interface différenciée)
- Créer l'interface de l'assistant avec navigation par étapes (1/2/3)
- Implémenter l'étape 1 : Questions simples pour les conditions
- Implémenter l'étape 2 : Sélection des actions à appliquer
- Implémenter l'étape 3 : Récapitulatif et validation
- Ajouter la navigation Précédent/Suivant entre les étapes
- Tester le parcours complet de l'assistant
Ré-application automatique des règles sur factures BAP
- Créer une route tRPC pour ré-appliquer toutes les règles actives sur les factures BAP
- Intégrer l'appel automatique après création d'une règle
- Intégrer l'appel automatique après modification d'une règle
- Intégrer l'appel automatique après activation d'une règle
- Ajouter une notification avec le nombre de factures mises à jour
- Tester avec différents scénarios (création, modification, activation)
Création utilisateur admin local sur VPS
- Créer l'utilisateur admin dans la base de données MySQL
- Hacher le mot de passe avec bcrypt
- Vérifier la création de l'utilisateur
Mise à jour email admin
- Mettre à jour l'email de admin@local à o.pareige@itinova.org
Bug connexion locale VPS
- Vérifier les logs PM2 pour identifier l'erreur
- Diagnostiquer le problème d'authentification
- Corriger le bug et tester la connexion
Bug ajout service
- Identifier le problème (contrainte d'unicité)
- Améliorer la gestion des erreurs pour afficher un message convivial
- Tester l'ajout de service
- Déployer la correction sur le VPS
Configuration clé API Mistral sur VPS
- Ajouter MISTRAL_API_KEY dans le fichier .env du VPS
- Modifier le code pour utiliser Mistral API directement
- Redémarrer l'application PM2
- Tester l'extraction de factures
Bug extraction PDF qui ne se termine pas sur VPS
- Vérifier les logs PM2 pour identifier l'erreur
- Diagnostiquer le problème (Data too long for column 'processingProgress')
- Modifier le code pour stocker les PDF dans un dossier local
- Configurer Nginx pour servir les fichiers PDF
- Tester et redéployer sur le VPS
Configuration des champs obligatoires pour le score LLM
- Créer table llmFieldsConfig pour stocker la configuration des champs (nom, obligatoire/optionnel)
- Ajouter routes tRPC pour gérer la configuration des champs (get, update)
- Créer interface utilisateur dans les paramètres LLM pour afficher tous les champs
- Ajouter cases à cocher pour marquer chaque champ comme obligatoire ou optionnel
- Modifier le code d'extraction (invoiceExtractor.ts) pour utiliser la configuration
- Adapter le calcul du qualityScore selon les champs obligatoires configurés
- Initialiser les valeurs par défaut (supplierName, invoiceNumber, invoiceDate, totalAmount obligatoires)
- Tester la configuration et vérifier le calcul du score
- Déployer sur le VPS
Modernisation de la page Paramètres
- Analyser la structure actuelle et identifier les améliorations UX
- Remplacer le layout par un système de Tabs pour organiser les sections
- Utiliser des Cards modernes avec ombres et bordures pour chaque section
- Améliorer la typographie (titres, descriptions, espacements)
- Ajouter des icônes plus grandes et colorées pour chaque section
- Implémenter des animations de transition fluides
- Améliorer le responsive design pour mobile
- Ajouter des badges de statut (Actif/Inactif) avec couleurs
- Tester localement l'interface modernisée
- Déployer sur le VPS
Modernisation des pages Administration et Import
- Identifier les pages Administration des listes et Paramètres d'import
- Analyser la structure actuelle de ces pages
- Moderniser la page Administration des listes avec Tabs, icônes colorées, cards
- Moderniser la page Paramètres d'import avec le même style
- Appliquer les badges de statut et animations
- Améliorer la typographie et les espacements
- Tester localement les interfaces modernisées
- Déployer sur le VPS
Menu latéral accordéon
- Modifier DashboardLayout pour ajouter un menu accordéon
- Créer la structure avec 4 sections : Tableau de bord, Facturation, Configuration, Traçabilité
- Implémenter l'accordéon pour les sections Facturation, Configuration, Traçabilité
- Ajouter les icônes pour chaque section et sous-menu
- Configurer "Tableau de bord" comme section ouverte par défaut
- Créer les pages manquantes (Factures BAP, Automatismes, Utilisateurs, Historiques)
- Mettre à jour App.tsx avec les nouvelles routes
- Tester la navigation et le comportement de l'accordéon
- Déployer sur le VPS
Amélioration du menu accordéon
- Modifier le comportement pour qu'un seul accordéon soit ouvert à la fois (exclusif)
- Ajouter des dégradés de couleurs distinctifs pour chaque section
- Agrandir les icônes et améliorer leur visibilité
- Ajouter des animations fluides pour l'ouverture/fermeture
- Améliorer les effets hover et les transitions
- Optimiser les espacements et la typographie
- Tester le comportement exclusif
- Déployer sur le VPS
Correction bug accordéon
- Empêcher la fermeture de l'accordéon lors du clic sur un sous-menu
- Tester le comportement après correction
- Déployer sur le VPS
Configuration HTTPS sur le VPS
- Générer un certificat SSL auto-signé sur le VPS
- Créer le répertoire /etc/nginx/ssl pour stocker les certificats
- Configurer Nginx pour écouter sur le port 443 (HTTPS)
- Ajouter la redirection HTTP vers HTTPS
- Configurer les en-têtes de sécurité SSL
- Redémarrer Nginx
- Tester l'accès HTTPS via https://20.56.92.59
- Vérifier la redirection HTTP vers HTTPS
Configuration sécurité VPS (UFW + Fail2Ban)
- Vérifier l'état actuel du pare-feu UFW
- Configurer UFW pour autoriser SSH (port 22)
- Configurer UFW pour autoriser HTTP (port 80)
- Configurer UFW pour autoriser HTTPS (port 443)
- Activer le pare-feu UFW
- Installer Fail2Ban
- Configurer Fail2Ban pour SSH (maxretry=3, bantime=3600)
- Créer une liste blanche d'IPs de confiance
- Démarrer et activer Fail2Ban
- Tester la configuration et vérifier les logs
Ajout des IPs de confiance à la liste blanche Fail2Ban
- Mettre à jour /etc/fail2ban/jail.local avec les IPs 185.61.190.35 et 197.221.123.242
- Redémarrer Fail2Ban pour appliquer les modifications
- Vérifier que les IPs sont bien dans la liste blanche
Configuration Let's Encrypt pour facturation.itinova.org
- Vérifier la configuration DNS (facturation.itinova.org → 20.56.92.59)
- Installer Certbot (client Let's Encrypt)
- Obtenir le certificat SSL pour facturation.itinova.org
- Configurer Nginx pour utiliser le certificat Let's Encrypt
- Tester l'accès HTTPS via https://facturation.itinova.org
- Configurer le renouvellement automatique du certificat
- Vérifier que la redirection HTTP → HTTPS fonctionne
Correction configuration Nginx pour facturation.itinova.org
- Vérifier la configuration Nginx actuelle
- Identifier pourquoi facturation.itinova.org affiche la page par défaut
- Créer une configuration Nginx spécifique pour facturation.itinova.org pointant vers l'application Node.js
- Tester la configuration Nginx
- Redémarrer Nginx
- Vérifier que https://facturation.itinova.org affiche l'application
Export des factures BAP
- Définir les critères d'exportabilité : Score 100% + Type d'achat rempli + Service rempli + Ventilation remplie
- Ajouter fonction isExportable dans InvoicesBAP.tsx
- Ajouter colonne avec cases à cocher pour sélection des factures exportables
- Ajouter case à cocher générale qui sélectionne toutes les factures exportables
- Désactiver les cases à cocher pour les factures non exportables
- Ajouter bouton "Exporter" qui s'active si au moins une facture est cochée
- Utiliser la route tRPC existante pour exporter les factures sélectionnées
- Implémenter la génération de fichiers d'export (PDF)
- Tester la sélection et l'export des factures BAP
Améliorations export factures BAP
- Ajouter icône verte ✓ dans la colonne Score pour les factures exportables
- Modifier la fonction getQualityBadge pour afficher l'indicateur d'exportabilité
- Modifier la route tRPC exportToPdf pour copier les PDFs vers exportFolder
- Ajouter la logique de copie de fichiers avec fs.copyFile
- Récupérer le paramètre exportFolder depuis importSettings
- Créer le dossier exportFolder s'il n'existe pas
- Gérer les erreurs de copie de fichiers
- Afficher une notification de succès avec le chemin du dossier d'export
- Tester l'export vers le dossier configuré
Bouton Validation BAP
- Analyser la structure de la page InvoicesBAP.tsx
- Créer la route tRPC validateBAP dans routers.ts (mise à jour du statut en "validated")
- Ajouter la colonne "Actions" en fin de chaque ligne du tableau
- Ajouter le bouton "Validation BAP" avec icône CheckCircle2
- Implémenter la logique d'activation : Score 100% + non exportée + isSubscription=0 + service + typeAchat + ventilation remplis
- Désactiver le bouton avec tooltip explicatif pour les factures non éligibles
- Afficher un toast de confirmation après validation
- Rafraîchir la liste après validation
Onglet Signatures dans Paramètres
- Créer la table
signaturesdans drizzle/schema.ts (id, userId, firstName, lastName, imageKey, imageUrl, createdAt) - Appliquer la migration DB (pnpm db:push)
- Créer les routes tRPC : signatures.list, signatures.upload, signatures.create, signatures.delete
- Ajouter la route d'upload d'image de signature (stockage local base64)
- Ajouter l'onglet "Signatures" dans la page Settings.tsx
- Créer le formulaire d'ajout de signature (prénom, nom, upload image)
- Afficher la liste des signatures avec aperçu de l'image en grille
- Ajouter le bouton de suppression par signature (hover)
- Tester l'upload et l'affichage des signatures sur le VPS
Canvas de signature à la souris (onglet Signatures)
- Ajouter un sélecteur de mode : "Importer un fichier" / "Dessiner la signature"
- Créer un composant canvas interactif pour dessiner la signature à la souris
- Gérer les événements souris (mousedown, mousemove, mouseup) et tactile (touch)
- Ajouter un bouton "Effacer" pour réinitialiser le canvas
- Exporter le canvas en PNG base64 pour l'upload
- Tester le dessin à la souris et l'enregistrement
Correction affichage canvas signature
- Corriger le problème d'initialisation du canvas (fond blanc non affiché)
- S'assurer que le canvas est visible et fonctionnel dans l'onglet Signatures
Association Service → Signature et export PDF avec signature
- Créer la table
serviceSignaturesdans drizzle/schema.ts (serviceName → signatureId) - Appliquer la migration DB (pnpm db:push)
- Créer les routes tRPC : serviceSignatures.list, serviceSignatures.upsert, serviceSignatures.delete
- Ajouter une section "Association Service → Signature" dans l'onglet Signatures des Paramètres
- Afficher la liste des services disponibles avec un sélecteur de signature pour chacun
- Modifier la route exportToPdf pour récupérer la signature associée au service de la facture
- Apposer la signature sur le PDF exporté (image en bas à droite + nom du signataire)
- Tester l'export PDF avec signature automatique
Modification page de connexion
- Arriver directement sur la connexion locale (supprimer l'écran de choix)
- Afficher le logo Itinova au-dessus du formulaire de connexion
- Afficher "powered by" + logo Santinova en dessous du formulaire
- Renommer l'application "Invoice Analyzer" en "Gestion facturation"
- Appliquer le même comportement en cas de déconnexion
Connexion locale avec identifiant libre
- Analyser le schéma DB et les routes d'auth locale
- Modifier la validation Zod pour accepter un identifiant libre (non-email)
- Modifier la route tRPC
auth.loginLocalpour accepter un username libre - Modifier la page Login.tsx pour remplacer le champ email par un champ "Identifiant"
- Créer le compte admin
adminItinovaavec mot de passeItinova69!en base de données locale - Créer le compte admin
adminItinovasur le VPS - Déployer sur le VPS
Correction connexion adminItinova VPS
- Diagnostiquer le problème d'authentification (hash bcrypt Python vs Node.js)
- Corriger le hash du mot de passe sur le VPS (généré avec Node.js bcrypt)
- Vérifier que la connexion fonctionne (API tRPC répond 200 avec user)
Ajout du champ Destinataire
- Ajouter colonne
recipientNamedans la tableinvoices(schéma DB + migration) - Ajouter colonne
recipientKeywordsdans la tableuserSettings(schéma DB + migration) - Mettre à jour le prompt LLM pour extraire le destinataire
- Mettre à jour l'interface
ExtractedInvoiceDatadans invoiceExtractor.ts - Mettre à jour les mots-clés personnalisés dans invoiceExtractor.ts
- Mettre à jour la route
settings.upsertdans routers.ts - Mettre à jour la route
invoices.updatedans routers.ts - Ajouter le champ destinataire dans InvoiceDetail.tsx
- Ajouter le champ mots-clés destinataire dans Settings.tsx (onglet Mots-clés)
- Ajouter destinataire dans AutomationRules.tsx (conditions)
- Ajouter recipientName dans les champs LLM par défaut (db.ts)
- Ajouter colonne Destinataire dans la liste des factures (Invoices.tsx)
- Ajouter Destinataire dans l'export Excel
- Déployer sur le VPS
Filtre destinataire + Top destinataires + Filtre SFTP
- Ajouter filtre par destinataire dans Invoices.tsx (dropdown + recherche)
- Ajouter colonne
sftpRecipientFilterdans userSettings (schéma DB + migration) - Ajouter topRecipients et recipientsList dans getInvoiceStats (db.ts)
- Ajouter graphique Top destinataires dans Dashboard.tsx
- Ajouter filtre destinataire dans la section SFTP de Settings.tsx
- Mettre à jour la route settings.upsert pour sftpRecipientFilter
Améliorations Factures BAP + Export PDF annoté + Historique BAP
- Supprimer la colonne "Abonnement" de la fenêtre Factures BAP
- Ajouter le choix du mode d'export dans les paramètres (dossier local ou ouverture navigateur)
- Ajouter colonne bapExportMode dans importSettings (schéma DB + migration)
- Générer PDF annoté lors du clic BAP : zone blanche avec CAPEX/OPEX, BAP, destinataire, signature du service
- Exporter ou ouvrir le PDF selon le mode d'export configuré
- Créer la page Historique BAP dans le menu Traçabilité
- Ajouter table bapHistory en base de données (schéma + migration)
- Enregistrer chaque validation BAP dans l'historique
- Ajouter la route dans App.tsx et le lien dans le menu Traçabilité
Correction génération PDF BAP (fallback URL)
- Corriger la lecture du PDF source dans validateBAP (fallback URL si fichier local absent)
- Corriger la lecture de l'image de signature dans validateBAP (fallback URL)
- Corriger la lecture du PDF source dans exportToPdf (fallback URL)
- Corriger la lecture de l'image de signature dans exportToPdf (fallback URL)
Correction table signatures VPS
- Corriger noms de colonnes dans signatures et service_signatures sur le VPS (snake_case -> camelCase)
Correction affectation signature à service (serviceSignatures)
- Corriger l'upsert serviceSignatures (renommage table service_signatures -> serviceSignatures sur le VPS)
Correction PDF BAP non affiché sur VPS
- Diagnostiquer et corriger la génération du PDF annoté lors de la validation BAP sur le VPS
Validation BAP en masse
- Ajouter la route validateBAPBulk côté serveur (traitement séquentiel de toutes les factures éligibles)
- Ajouter le bouton "Valider tout en BAP" dans InvoicesBAP.tsx avec barre de progression
- Déployer sur le VPS
Visibilité admin - toutes les factures
- Ajouter getAllInvoices() dans db.ts (sans filtre userId)
- Ajouter getAllImportLogs() dans db.ts (sans filtre userId)
- Ajouter getAllBapHistory() dans db.ts (sans filtre userId)
- Modifier invoices.list : les admins voient toutes les factures, les users voient les leurs
- Modifier importLogs.getByUser : les admins voient tous les logs
- Modifier bapHistory.getAll : les admins voient tout l'historique BAP
- Ajouter colonne "Utilisateur" dans Invoices.tsx (visible uniquement pour les admins)