Files
demat-facturation/todo.md
2026-08-30 08:56:27 +00:00

46 KiB
Raw Permalink Blame History

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

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 signatures dans 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 serviceSignatures dans 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.loginLocal pour accepter un username libre
  • Modifier la page Login.tsx pour remplacer le champ email par un champ "Identifiant"
  • Créer le compte admin adminItinova avec mot de passe Itinova69! en base de données locale
  • Créer le compte admin adminItinova sur 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 recipientName dans la table invoices (schéma DB + migration)
  • Ajouter colonne recipientKeywords dans la table userSettings (schéma DB + migration)
  • Mettre à jour le prompt LLM pour extraire le destinataire
  • Mettre à jour l'interface ExtractedInvoiceData dans invoiceExtractor.ts
  • Mettre à jour les mots-clés personnalisés dans invoiceExtractor.ts
  • Mettre à jour la route settings.upsert dans routers.ts
  • Mettre à jour la route invoices.update dans 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 sftpRecipientFilter dans 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)

Améliorations SharePoint

  • Log SharePoint dans l'historique BAP (colonnes sharepointUploadStatus + sharepointUploadPath)
  • Bouton "Tester la connexion" Azure AD dans les paramètres
  • Champ date d'expiration du secret Azure AD + alerte dans les paramètres

OAuth2 IMAP pour Office 365

  • Créer server/office365OAuth.ts avec getOffice365ImapToken et buildXOAuth2String
  • Ajouter champ emailImportAuthMode (basic/oauth2) dans le schéma DB importSettings
  • Appliquer migration DB (pnpm db:push)
  • Modifier emailImportService.ts pour supporter OAuth2 XOAUTH2 via Azure AD
  • Ajouter fonction testImapConnection dans emailImportService.ts
  • Ajouter procédure testEmailConnection dans routers.ts
  • Ajouter emailImportAuthMode dans le schéma Zod de importSettings.update
  • Ajouter sélecteur mode auth (basic/oauth2) dans ImportSettings.tsx
  • Ajouter bouton "Tester la connexion IMAP" dans ImportSettings.tsx
  • Déployer sur recette (git push + docker compose up --build)
  • Appliquer migration emailImportAuthMode sur recette (colonne ajoutée en DB)
  • Déployer sur production (en attente de validation recette)

Module Ventilation FreePro

  • Schéma DB : tables freeproImports et freeproVentilationLines
  • Migration DB appliquée (pnpm db:push)
  • Service freeproService.ts : transformation Excel → ventilation (script/TTC/type)
  • Helpers DB dans db.ts : createFreeproImport, getFreeproImportsByUser, getFreeproImportWithLines, deleteFreeproImport
  • Procédures tRPC : freepro.import, freepro.list, freepro.getById, freepro.delete
  • Page VentilationFreePro.tsx : import drag&drop, tableau de ventilation, historique, export PDF
  • Menu "Ventilations > FreePro" ajouté dans DashboardLayout
  • Route /ventilation-freepro ajoutée dans App.tsx
  • Déploiement sur recette (git pull + migrations DB + docker compose up --build)

Module Ventilation FreePro - Onglet Paramétrage (connexion automatique web FreePro)

  • Schéma DB : ajouter table freeproSettings (URL portail, login, password, fréquence, date antériorité, dernière récupération)
  • Migration DB : pnpm db:push
  • Helper DB : getFreeproSettings, upsertFreeproSettings
  • Service freeproAutoImport.ts : connexion portail FreePro web, téléchargement CSV, pipeline processFreeproExcel + createFreeproImport
  • Procédures tRPC : freepro.getSettings, freepro.saveSettings, freepro.forceImport
  • Job cron WebDev : vérification périodique selon fréquence configurée (setInterval en mémoire)
  • Frontend VentilationFreePro.tsx : wrapper Tabs (onglet 1 = import manuel, onglet 2 = paramétrage)
  • Onglet Paramétrage : formulaire credentials FreePro web, fréquence, date antériorité, bouton "Forcer récupération", statut dernière récupération

Colonne Source import dans l'historique des imports

  • Ajouter colonne importSource (file/folder/email) dans la table importLogs (schéma + migration)
  • Enregistrer importSource="file" lors d'un import manuel (routers.ts)
  • Enregistrer importSource="email" lors d'un import par email (emailImportService.ts)
  • Enregistrer importSource="folder" lors d'un import par dossier (folderImportService.ts)
  • Afficher la colonne "Source" avec badge coloré dans le tableau History.tsx (Email=bleu, Dossier=violet, Fichier=gris)
  • Afficher la source dans le dialog de détails de l'import

Listes globales partagées entre tous les utilisateurs

  • Modifier getAccountingAllocationsByUser → retourner toutes les ventilations (sans filtre userId)
  • Modifier getAutomationRulesByUser → retourner tous les automatismes (sans filtre userId)
  • Modifier getDepartmentsByUser → retourner tous les services (sans filtre userId)
  • Modifier getSignaturesByUser → retourner toutes les signatures (sans filtre userId)
  • Modifier getServiceSignaturesByUser → retourner toutes les signatures de service (sans filtre userId)
  • Migrer les données en production : dédoublonner les listes fusionnées
  • Déployer en production

Connecteurs web (scraping login/mdp)

  • Table webImportSources dans le schéma DB
  • Procédures tRPC CRUD pour webImportSources
  • Interface de gestion des sources web dans les paramètres
  • Endpoint API sécurisé pour déclencher l'import et recevoir les PDFs
  • Script cron externe Node.js + Playwright pour SFR
  • Framework connecteur générique extensible

Audit technique et robustesse

  • Inventorier les artefacts, scripts et dépendances inutilisés
  • Supprimer les artefacts de développement et le code mort confirmés
  • Charger les pages à la demande pour réduire le JavaScript initial
  • Consolider le mécanisme de sauvegarde de base de données et ses validations
  • Renforcer les contrôles daccès et la gestion derreur des endpoints critiques
  • Documenter les modules métier, les invariants et les décisions techniques critiques
  • Ajouter des tests de non-régression ciblés et vérifier build, types et tests
  • Normaliser les valeurs OAuth de loginMethod avant écriture en base

Incident production — erreur HTTP 404

  • Reproduire la 404 et contrôler le domaine, Traefik et les conteneurs
  • Identifier et corriger la cause racine sans modifier les données
  • Vérifier le retour HTTP 200 et la santé des conteneurs

Audit production — 674 factures affichées

  • Compter les factures par utilisateur, source et statut
  • Identifier les groupes de doublons selon plusieurs clés métier
  • Vérifier les références de stockage et les effets de la fusion précédente
  • Préparer une correction réversible sans suppression immédiate
  • Sauvegarder la base et le volume puis suspendre les imports email
  • Bloquer les réimports par empreinte PDF et fiabiliser le traitement IMAP
  • Déployer le correctif anti-réimport et migrer la base de production
  • Appliquer la correction confirmée et vérifier le comptage final

Audit authentification IMAP Microsoft 365

  • Vérifier la génération du jeton Azure et le format XOAUTH2 envoyé à IMAP
  • Comparer les scopes, permissions et méthode dauthentification aux exigences Microsoft 365
  • Tester la configuration active de production sans exposer les secrets
  • Documenter la cause du refus IMAP et le correctif requis

Migration import email vers ImapFlow

  • Remplacer la dépendance imap par imapflow
  • Réécrire la connexion OAuth2, la recherche UNSEEN et la lecture des messages
  • Conserver le traitement séquentiel, le verrou anti-concurrence et le marquage Seen après succès
  • Adapter le test de connexion IMAP et les messages derreur
  • Ajouter des tests de non-régression du flux ImapFlow
  • Vérifier TypeScript, tests, build et authentification OAuth2 réelle

Déploiement ImapFlow — recette et production

  • Pousser la version ImapFlow vers le dépôt Gitea de recette
  • Réduire limage runtime Docker pour fiabiliser le build sur le serveur de recette
  • Charger Vite uniquement en développement pour lexclure de limage runtime
  • Déployer et valider HTTP et conteneurs ImapFlow en recette (aucune source OAuth2 active à tester)
  • Corriger les règles Docker orphelines qui bloquaient MySQL en recette
  • Pousser la version validée vers le dépôt Gitea de production
  • Déployer et valider HTTP, conteneurs et OAuth2 ImapFlow en production

Navigation depuis lédition des factures BAP

  • Reproduire et identifier la perte du contexte de navigation depuis Factures BAP
  • Restaurer la page dorigine après fermeture de lédition
  • Conserver les filtres et tris sélectionnés sur Factures BAP
  • Ajouter des tests de non-régression du retour contextuel
  • Vérifier TypeScript, tests, build et parcours en sandbox
  • Pousser le correctif vers Gitea recette et redéployer
  • Vérifier le parcours et la santé de la recette

Automatisation de lindicateur Abonnement

  • Analyser le modèle, le formulaire et lexécution actuelle des automatismes
  • Ajouter loption Abonnement : Oui, Non ou Ne pas modifier aux règles
  • Appliquer loption Abonnement lors du traitement automatique des factures
  • Ajouter des tests de non-régression des règles dabonnement
  • Valider les deux correctifs en sandbox

Déploiement recette — navigation BAP et abonnement

  • Pousser les deux correctifs vers Gitea recette
  • Déployer, vérifier HTTP et valider le parcours de retour en recette

Correctif recette — dialogue dautomatisme

  • Vérifier le commit et localiser lemplacement absent de loption Abonnement
  • Corriger le dialogue dédition et le valider en recette
  • Arrêter le processus non applicatif autorisé qui bloque le build Docker

Déploiement production — dialogue Abonnement

  • Pousser le correctif vers Gitea production
  • Construire et redémarrer uniquement le conteneur applicatif
  • Vérifier le commit, la santé, HTTP et le bundle de production

Filtre par action des automatismes

  • Identifier les types daction disponibles et leurs règles de détection
  • Ajouter un filtre daction dans la liste des automatismes
  • Permettre disoler les règles Abonnement, Oui ou Non
  • Ajouter les tests et valider TypeScript, tests et build

Déploiement — filtre par action des automatismes

  • Pousser le filtre par action vers Gitea recette
  • Déployer et vérifier le filtre par action en recette
  • Pousser la version validée vers Gitea production
  • Déployer et vérifier le filtre par action en production

Seuil déligibilité BAP à 90 %

  • Identifier les validations BAP fondées sur le score de qualité
  • Abaisser le seuil de 100 % à 90 % pour les opérations BAP
  • Ajouter les tests de seuil et valider TypeScript, tests et build

Déploiement — seuil BAP à 90 %

  • Pousser le correctif vers Gitea recette
  • Déployer et vérifier le seuil BAP à 90 % en recette
  • Pousser la version validée vers Gitea production
  • Déployer et vérifier le seuil BAP à 90 % en production

Rétablissement du serveur de recette

  • Redémarrer le serveur de recette autorisé par lutilisateur
  • Rétablir le conteneur applicatif et terminer le déploiement BAP à 90 %

Factures abonnements et filtres de période

  • Analyser les listes Factures, Factures BAP et le menu Facturation
  • Ajouter les filtres Année et Mois à la page Factures
  • Créer la page Factures abonnements affichant uniquement les abonnements
  • Reprendre les recherches, filtres et actions de la page Factures
  • Ajouter lentrée Factures abonnements après Factures BAP dans le menu
  • Ajouter les tests et valider TypeScript, build et affichage en sandbox
  • Déployer et vérifier le correctif en recette
  • Déployer et vérifier le correctif en production

Synthèse annuelle du tableau de bord

  • Analyser les données et le tableau de bord existant
  • Calculer par année les volumes et montants BAP et abonnements
  • Afficher le nombre de factures et les montants par type, puis le total
  • Ajouter les tests et valider TypeScript, build et affichage en sandbox

Budget réel par fournisseur

  • Définir lagrégation des montants par fournisseur et statut Abonnement
  • Ajouter les filtres Année et Mois à lécran Budget réel
  • Créer lécran Budget réel à la fin du menu Facturation
  • Afficher par fournisseur les montants Abonnement, Hors abonnement et le total
  • Ajouter les tests et valider TypeScript, build et affichage en sandbox

Améliorations Budget réel et tableau de bord

  • Confirmer le tri décroissant par montant total dans le budget
  • Ajouter un graphique annuel BAP versus abonnements au tableau de bord
  • Ajouter les tests et valider TypeScript, build et rendu sandbox