AI Invoice Digitization for Odoo
Il y a un moment où l’on cesse d’accepter les compromis. J’utilise Odoo en production depuis quelques temps, et la fonction de reconnaissance de factures native — réservée à la version Enterprise et propulsée par un OCR générique — m’a toujours semblé être une case cochée plutôt qu’un outil réellement utile. Taux de reconnaissance médiocre sur les PDF textuels, aucune mémoire des corrections, aucun apprentissage, aucune logique comptable : il fallait quand même tout vérifier à la main.
Alors j’ai construit ce que je cherchais.
account-invoice-digitize-ai est un module Odoo open source qui remplace entièrement la chaîne de traitement des factures fournisseurs par un pipeline IA. Il fonctionne sur Odoo 16, 17, 18 et 19, Community et Enterprise, en auto-hébergement ou sur Odoo.sh. Il est disponible sur GitHub, sous licence AGPL-3.
Le problème que ça résout
Recevoir une facture PDF et la saisir dans Odoo, c’est une tâche qui semble anodine. Mais faites-le 200 fois par mois sur des fournisseurs variés — certains avec des PDF textuels bien structurés, d’autres avec des scans de qualité douteuse, d’autres encore avec des factures allemandes en format ZUGFeRD — et vous comprenez vite que l’OCR seul ne suffit pas.
Le vrai problème n’est pas la reconnaissance du texte. C’est le raisonnement comptable qui suit : trouver le bon fournisseur parmi vos contacts Odoo (par IBAN, TVA ou nom), associer les lignes aux bons comptes de charges selon votre plan comptable, appliquer les bons taux de TVA, détecter que c’est un avoir et non une facture, vérifier que les totaux sont cohérents, alerter si c’est un doublon. Autant de choses qu’un OCR ne fait pas, et qu’un LLM peut faire — à condition de lui donner le bon contexte.
Ce que fait le module
Un pipeline structuré, pas un simple appel API
L’architecture est découpée en étapes distinctes. Quand vous cliquez sur « Numériser avec l’IA » sur une facture fournisseur :
- Analyse du document : détection du type de fichier, extraction du texte natif si disponible (PDF textuel), décodage des QR codes (QR-bill suisse, EPC), détection d’un éventuel fichier Factur-X / ZUGFeRD embarqué.
- Court-circuit Factur-X : si le PDF contient du XML CII structuré (Factur-X, ZUGFeRD), les données sont extraites directement depuis le XML — sans appel IA, donc à coût zéro.
- Pré-traitement optionnel : si vous avez configuré Azure Document Intelligence ou AWS Textract, le document leur est envoyé en premier pour une pré-reconnaissance structurée.
- Extraction IA : le document (texte ou image selon le mode) est envoyé au fournisseur IA configuré avec un prompt qui inclut le contexte fiscal de votre instance : plan comptable, taux de TVA disponibles, historique du fournisseur, mémoire des corrections passées.
- Cross-validation mathématique : les montants extraits sont vérifiés (totaux, calculs de TVA, somme des lignes). Si la validation échoue deux fois en mode texte, le module bascule automatiquement en mode vision (pages du PDF converties en images) et relance l’extraction.
- Mapping vers Odoo : les données validées sont mappées vers les champs Odoo avec des indicateurs de confiance (vert / orange / rouge) sur chaque champ rempli par l’IA.
- Prévisualisation : une fenêtre de dialogue vous présente les résultats avant application — fournisseur, référence, date, montant, lignes, avertissements. Vous appliquez ou vous abandonnez.
Six fournisseurs IA, un seul module
Le module ne dépend d’aucun fournisseur en particulier. L’abstraction AIProvider permet de brancher indifféremment :
- Anthropic (Claude) — fournisseur par défaut, utilise l’API
tool_usepour des sorties JSON garanties sans parsing fragile - OpenAI (GPT-4o) — function calling en mode strict
- Google (Gemini 2.x) — functionDeclarations, vision inlineData
- xAI (Grok) — API compatible OpenAI
- DeepSeek — API compatible OpenAI, très économique
- Mistral AI — API compatible OpenAI
Le choix du fournisseur et du modèle se fait dans les paramètres Odoo. La liste des modèles se met à jour automatiquement selon le fournisseur sélectionné.
Trois modes d’extraction
Selon votre organisation comptable, vous choisissez le niveau de contexte transmis à l’IA :
- Guidé (défaut) : contexte fiscal complet — plan de comptes, taux de TVA, historique fournisseur, mémoire des corrections. L’IA propose des imputations comptables. Idéal si votre comptabilité est tenue dans Odoo.
- Simplifié : seulement les taux de TVA dans le prompt, matching partenaire et taxes. Les comptes sont affectés manuellement par le comptable.
- Libre : extraction brute sans contexte Odoo, validation arithmétique uniquement. Pour des cas d’import vers des outils tiers.
Apprentissage réel, pas cosmétique
C’est la fonctionnalité qui distingue réellement le module d’un simple wrapper API. Chaque correction que vous apportez après une extraction est mémorisée dans ai.vendor.memory :
- Vous corrigez le compte de charges associé à une ligne « Frais de transport » pour le fournisseur X → la prochaine facture de X avec une ligne similaire recevra automatiquement ce compte, en priorité sur toute autre logique de matching.
- Le module calcule un score de fiabilité par fournisseur (
ai.vendor.score) : nombre d’extractions, taux de succès. Quand ce score est suffisamment élevé et que tous les indicateurs de confiance sont au vert, les extractions peuvent s’appliquer automatiquement sans prévisualisation — le mode auto-apply.
La mémoire fournisseur est exportable et importable en JSON pour migrer les données d’apprentissage entre instances Odoo.
Sécurités et garde-fous
Avant d’appliquer quoi que ce soit, le module passe une série de contrôles :
- Qualification du document : détection de proforma, devis, mentions « PAYÉ » — pour ne pas traiter autre chose qu’une vraie facture.
- Vérification acheteur : contrôle que la facture est bien adressée à votre société Odoo.
- Détection de doublon : alerte si une facture du même fournisseur, avec la même référence et le même montant, existe déjà.
- Détection d’anomalie de montant : comparaison avec l’historique du fournisseur, alerte si le montant s’écarte significativement.
- Validation IBAN : vérification du checksum mod-97 sur les coordonnées bancaires extraites.
- Correction d’arrondi TTC→HT : quand les factures affichent des prix TTC (fréquent sur les tickets de caisse), la conversion par ligne accumule des écarts d’arrondi. Le module les détecte et les compense automatiquement.
Architecture technique
Le module est découpé en une cinquantaine de fichiers Python organisés par responsabilité. Quelques choix d’architecture qui méritent d’être mentionnés :
Zéro dépendance externe obligatoire. Le module utilise uniquement requests, déjà présent dans l’environnement Odoo standard. La signature AWS SigV4 est implémentée en Python pur (stdlib hmac / hashlib), sans boto3. Les dépendances optionnelles (pdfplumber pour l’extraction de tableaux, pyzbar pour les QR codes, facturx pour la détection Factur-X) sont détectées à l’exécution et le module dégrade proprement si elles sont absentes.
Cache fiscal avec TTL journalier. Le contexte fiscal (comptes de charges, taux de TVA) est coûteux à reconstruire depuis la base Odoo à chaque extraction. Il est mis en cache en mémoire par société avec un TTL de 24h, et invalidé automatiquement à chaque modification du plan comptable ou des taxes.
Cache du résultat d’extraction. Si l’utilisateur abandonne la prévisualisation puis reclique sur « Numériser » avec la même pièce jointe, le dernier résultat est réutilisé sans rappel API. Le bouton « Ré-extraire » force un nouvel appel.
Extraction asynchrone. Un mode optionnel place les extractions dans une file traitée par cron toutes les 30 secondes. Un widget OWL (AiExtractionStatusWidget) surveille l’état de l’extraction en polling et ouvre automatiquement la prévisualisation quand le traitement est terminé.
Isolation multi-société. Mémoire fournisseur, scores de fiabilité, détection de doublons et détection d’anomalies sont tous scopés par société. Les clés API sont partagées globalement.
Un seul codebase pour Odoo 16 à 19. Les changements incompatibles entre versions (notamment les breaking changes d’Odoo 19 : company_id→company_ids, deprecated→active, contraintes journal_id) sont gérés par détection de champs à l’exécution, sans branches séparées.
Installation
cd /path/to/odoo/addons
git clone https://github.com/PaulArgoud/account-invoice-digitize-ai.git account_invoice_digitize_ai
sudo systemctl restart odoo
Langage du code : PHP (php)
Puis dans Odoo : Mises à jour des applications → installer « AI Invoice Digitization ».
La configuration se fait dans Comptabilité → Configuration → Paramètres, section « AI Invoice Digitization ». Quatre modes de test sont disponibles (pipeline complet, extraction texte seule, prévisualisation du prompt, pré-traitement documentaire) pour valider la configuration sans consommer de crédit API sur des vraies factures.
Ce que ce n’est pas
Le module tourne côté serveur uniquement — les appels API partent de votre instance Odoo, pas du navigateur. Odoo Online (SaaS) n’est pas supporté en v1 (les modules personnalisés n’y sont pas autorisés). Le support SaaS est prévu pour une v2.
Les données de vos factures transitent par l’API du fournisseur IA que vous choisissez. Consultez la politique de confidentialité du fournisseur concerné avant de l’activer sur des données sensibles. Les clés API sont stockées chiffrées dans les paramètres système Odoo, accessibles uniquement aux administrateurs.
Disponibilité
Le module est publié sous licence AGPL-3 et disponible sur GitHub :